mirror of
https://github.com/arnaucube/go-dht.git
synced 2026-02-06 19:06:44 +01:00
add admin RPC find call, add kademlia NodeLookup interactive
This commit is contained in:
78
node/admin.go
Normal file
78
node/admin.go
Normal 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
|
||||
}
|
||||
18
node/node.go
18
node/node.go
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user