aboutsummaryrefslogtreecommitdiff
path: root/src/gnunet/test/gnunet-dhtu/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/gnunet/test/gnunet-dhtu/main.go')
-rw-r--r--src/gnunet/test/gnunet-dhtu/main.go206
1 files changed, 0 insertions, 206 deletions
diff --git a/src/gnunet/test/gnunet-dhtu/main.go b/src/gnunet/test/gnunet-dhtu/main.go
deleted file mode 100644
index 2a49b9c..0000000
--- a/src/gnunet/test/gnunet-dhtu/main.go
+++ /dev/null
@@ -1,206 +0,0 @@
1// This file is part of gnunet-go, a GNUnet-implementation in Golang.
2// Copyright (C) 2022 Bernd Fix >Y<
3//
4// gnunet-go is free software: you can redistribute it and/or modify it
5// under the terms of the GNU Affero General Public License as published
6// by the Free Software Foundation, either version 3 of the License,
7// or (at your option) any later version.
8//
9// gnunet-go is distributed in the hope that it will be useful, but
10// WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// Affero General Public License for more details.
13//
14// You should have received a copy of the GNU Affero General Public License
15// along with this program. If not, see <http://www.gnu.org/licenses/>.
16//
17// SPDX-License-Identifier: AGPL3.0-or-later
18
19package main
20
21import (
22 "context"
23 "flag"
24 "fmt"
25 "gnunet/config"
26 "gnunet/core"
27 "gnunet/message"
28 "gnunet/service"
29 "gnunet/service/dht"
30 "gnunet/transport"
31 "gnunet/util"
32 "log"
33 "net/rpc"
34 "time"
35
36 "github.com/bfix/gospel/logger"
37)
38
39//----------------------------------------------------------------------
40// Test Go node with DHTU GNUnet nodes
41//
42// N.B.: THIS TEST ONLY COVERS THE BASIC MESSAGE EXCHANGE LEVEL; NO
43// MESSAGE PROCESSING EXCEPT FOR HELLO MESSAGES WILL TAKE PLACE.
44//----------------------------------------------------------------------
45
46func main() {
47 // handle command-line arguments
48 var remoteAddr string
49 var cfgFile string
50 flag.StringVar(&cfgFile, "c", "gnunet-config.json", "configuration file")
51 flag.StringVar(&remoteAddr, "a", "", "address of remote node")
52 flag.Parse()
53
54 // read configuration file and set missing arguments.
55 if err := config.ParseConfig(cfgFile); err != nil {
56 logger.Printf(logger.ERROR, "[node] Invalid configuration file: %s\n", err.Error())
57 return
58 }
59
60 // convert arguments
61 var rAddr *util.Address
62 var err error
63 if rAddr, err = util.ParseAddress(remoteAddr); err != nil {
64 logger.Println(logger.ERROR, err.Error())
65 return
66 }
67
68 // setup execution context
69 ctx, cancel := context.WithCancel(context.Background())
70 defer func() {
71 cancel()
72 time.Sleep(time.Second)
73 }()
74
75 // create and run node
76 node, err := NewTestNode(ctx)
77 if err != nil {
78 logger.Println(logger.ERROR, err.Error())
79 return
80 }
81 defer node.Shutdown()
82
83 // show our HELLO URL
84 ep := config.Cfg.Local.Endpoints[0]
85 as := fmt.Sprintf("%s://%s:%d", ep.Network, ep.Address, ep.Port)
86 listen, err := util.ParseAddress(as)
87 if err != nil {
88 logger.Println(logger.ERROR, err.Error())
89 return
90 }
91 aList := []*util.Address{listen}
92 logger.Println(logger.INFO, "[node] --> "+node.HelloURL(aList))
93
94 // send HELLO to bootstrap address
95 if err = node.SendHello(ctx, rAddr); err != nil && err != transport.ErrEndpMaybeSent {
96 logger.Println(logger.ERROR, "[node] failed to send HELLO: "+err.Error())
97 return
98 }
99
100 // run forever
101 var ch chan struct{}
102 <-ch
103}
104
105//----------------------------------------------------------------------
106// create and run a node with given spec
107//----------------------------------------------------------------------
108
109type TestNode struct {
110 id int
111 peer *core.Peer
112 core *core.Core
113 addr *util.Address
114}
115
116func (n *TestNode) Shutdown() {
117 n.core.Shutdown()
118}
119func (n *TestNode) HelloURL(a []*util.Address) string {
120 hd, err := n.peer.HelloData(message.HelloAddressExpiration, a)
121 if err != nil {
122 return ""
123 }
124 return hd.URL()
125}
126
127func (n *TestNode) SendHello(ctx context.Context, addr *util.Address) error {
128 return n.core.SendHello(ctx, addr)
129}
130
131func NewTestNode(ctx context.Context) (node *TestNode, err error) {
132
133 // create test node
134 node = new(TestNode)
135 node.id = util.NextID()
136
137 // create core service
138 if node.core, err = core.NewCore(ctx, config.Cfg.Local); err != nil {
139 return
140 }
141 node.peer = node.core.Peer()
142 logger.Printf(logger.INFO, "[node] Node %s starting", node.peer.GetID())
143
144 // start a new DHT service
145 dht, err := dht.NewService(ctx, node.core)
146 if err != nil {
147 log.Fatal(err)
148 }
149
150 // start JSON-RPC server on request
151 var rpc *rpc.Server
152 if rpc, err = service.StartRPC(ctx, config.Cfg.RPC.Endpoint); err != nil {
153 logger.Printf(logger.ERROR, "[node] RPC failed to start: %s", err.Error())
154 return
155 }
156 dht.InitRPC(rpc)
157
158 // start listening on the network
159 list, err := node.core.Addresses()
160 if err != nil {
161 log.Fatal(err)
162 }
163 for _, addr := range list {
164 s := addr.Network() + "://" + addr.String()
165 if node.addr, err = util.ParseAddress(s); err != nil {
166 continue
167 }
168 logger.Printf(logger.INFO, "[node] Listening on %s", s)
169 }
170
171 // register as event listener
172 incoming := make(chan *core.Event)
173 node.core.Register(config.Cfg.Local.Name, core.NewListener(incoming, nil))
174
175 // heart beat
176 tick := time.NewTicker(5 * time.Minute)
177
178 // run event handler
179 go func() {
180 for {
181 select {
182 // show incoming event
183 case ev := <-incoming:
184 switch ev.ID {
185 case core.EV_CONNECT:
186 logger.Printf(logger.INFO, "[node] <<< Peer %s connected", ev.Peer)
187 case core.EV_DISCONNECT:
188 logger.Printf(logger.INFO, "[node] <<< Peer %s diconnected", ev.Peer)
189 case core.EV_MESSAGE:
190 logger.Printf(logger.INFO, "[node] <<< Msg from %s of type %d", ev.Peer, ev.Msg.Header().MsgType)
191 logger.Printf(logger.INFO, "[node] <<< --> %s", ev.Msg.String())
192 }
193
194 // handle termination signal
195 case <-ctx.Done():
196 logger.Println(logger.INFO, "[node] Shutting down node")
197 return
198
199 // handle heart beat
200 case now := <-tick.C:
201 logger.Printf(logger.INFO, "[node] Heart beat at %s", now.String())
202 }
203 }
204 }()
205 return
206}