go-dht/node/admin.go
node/admin.goRaw
1package node
2
3import (
4 "go-dht/config"
5 "go-dht/kademlia"
6 "io/ioutil"
7 "net"
8 "net/http"
9 "net/rpc"
10
11 log "github.com/sirupsen/logrus"
12)
13
14type Admin struct {
15 node Node
16 disc map[kademlia.ID][]kademlia.ListedNode
17}
18
19func NewAdmin(node Node) Admin {
20 return Admin{
21 node: node,
22 }
23}
24
25func (a *Admin) Start() error {
26 // rpc server
27 err := rpc.Register(a)
28 if err != nil {
29 return err
30 }
31 //
32 oldMux := http.DefaultServeMux
33 mux := http.NewServeMux()
34 http.DefaultServeMux = mux
35 //
36 rpc.HandleHTTP()
37 //
38 http.DefaultServeMux = oldMux
39 //
40 listener, err := net.Listen("tcp", ":"+config.C.AdminPort)
41 if err != nil {
42 return err
43 }
44
45 err = http.Serve(listener, nil)
46 if err != nil {
47 return err
48 }
49 return nil
50}
51
52func (a *Admin) Find(id kademlia.ID, lns *[]kademlia.ListedNode) error {
53 log.Info("[admin-rpc] FIND ", id)
54
55 // check if id in current node
56 _, err := ioutil.ReadFile(config.C.Storage + "/" + id.String())
57 if err == nil {
58 *lns = []kademlia.ListedNode{
59 kademlia.ListedNode{
60 ID: a.node.ID(),
61 Addr: config.C.Addr,
62 Port: config.C.Port,
63 },
64 }
65 log.Info("[admin-rpc] FIND found")
66 return nil
67 }
68 log.Info("[admin-rpc] FIND not in local Node, starting NodeLookup")
69
70 rlns, err := a.node.Kademlia().NodeLookup(id)
71 if err != nil {
72 log.Debug("[admin-rpc/FIND] ERROR: ", err)
73 return err
74 }
75 *lns = rlns
76
77 return nil
78}