arnaucube
arnaucube/go-dhtPublic Self-hosted repository
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}