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
|
|
}
|