package node import ( "go-dht/config" "go-dht/kademlia" "io/ioutil" "net" "net/http" "net/rpc" log "github.com/sirupsen/logrus" ) type Admin struct { node Node disc map[kademlia.ID][]kademlia.ListedNode } func NewAdmin(node Node) Admin { return Admin{ node: node, } } func (a *Admin) Start() error { // rpc server err := rpc.Register(a) if err != nil { return err } // oldMux := http.DefaultServeMux mux := http.NewServeMux() http.DefaultServeMux = mux // rpc.HandleHTTP() // http.DefaultServeMux = oldMux // listener, err := net.Listen("tcp", ":"+config.C.AdminPort) if err != nil { return err } err = http.Serve(listener, nil) if err != nil { return err } return nil } func (a *Admin) Find(id kademlia.ID, lns *[]kademlia.ListedNode) error { log.Info("[admin-rpc] FIND ", id) // check if id in current node _, err := ioutil.ReadFile(config.C.Storage + "/" + id.String()) if err == nil { *lns = []kademlia.ListedNode{ kademlia.ListedNode{ ID: a.node.ID(), Addr: config.C.Addr, Port: config.C.Port, }, } log.Info("[admin-rpc] FIND found") return nil } log.Info("[admin-rpc] FIND not in local Node, starting NodeLookup") rlns, err := a.node.Kademlia().NodeLookup(id) if err != nil { log.Debug("[admin-rpc/FIND] ERROR: ", err) return err } *lns = rlns return nil }