add admin RPC find call, add kademlia NodeLookup interactive

This commit is contained in:
arnaucube
2019-12-15 17:22:35 +01:00
parent d971d1503a
commit ff0ba3995a
13 changed files with 264 additions and 22 deletions

78
node/admin.go Normal file
View File

@@ -0,0 +1,78 @@
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
}

View File

@@ -44,6 +44,10 @@ func (n Node) ID() kademlia.ID {
return n.kademlia.N.ID
}
func (n Node) Kademlia() kademlia.Kademlia {
return *n.kademlia
}
func (n *Node) Start() error {
// rpc server
err := rpc.Register(n)
@@ -60,11 +64,16 @@ func (n *Node) Start() error {
// TMP in order to print the KBuckets of the node
for {
fmt.Println(n.kademlia)
time.Sleep(5 * time.Second)
time.Sleep(8 * time.Second)
}
}()
go n.pingKnownNodes(config.C.KnownNodes)
go n.kademlia.Update(kademlia.ListedNode{
ID: n.ID(),
Addr: config.C.Addr,
Port: config.C.Port,
})
err = http.Serve(listener, nil)
if err != nil {
@@ -126,11 +135,12 @@ func (n *Node) Store(data []byte, ack *bool) error {
return nil
}
func (n *Node) FindNode(ln kademlia.ListedNode, lns *[]kademlia.ListedNode) error {
func (n *Node) FindNode(id kademlia.ID, lns *[]kademlia.ListedNode) error {
log.Info("[rpc] FIND_NODE")
// k := n.kademlia.KBucket(ln.ID)
k, err := n.kademlia.FindClosestKBucket(ln.ID)
k, err := n.kademlia.GetClosestKBucket(id)
if err != nil {
log.Debug("[rpc] FIND_NODE ERROR: ", err)
*lns = []kademlia.ListedNode{}
return nil
}
@@ -158,7 +168,7 @@ func (n *Node) FindValue(id kademlia.ID, resp *FindValueResp) error {
}
// k := n.kademlia.KBucket(id)
k, err := n.kademlia.FindClosestKBucket(id)
k, err := n.kademlia.GetClosestKBucket(id)
if err != nil {
*resp = FindValueResp{}
return nil