You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
1.3 KiB

  1. package node
  2. import (
  3. "go-dht/config"
  4. "go-dht/kademlia"
  5. "io/ioutil"
  6. "net"
  7. "net/http"
  8. "net/rpc"
  9. log "github.com/sirupsen/logrus"
  10. )
  11. type Admin struct {
  12. node Node
  13. disc map[kademlia.ID][]kademlia.ListedNode
  14. }
  15. func NewAdmin(node Node) Admin {
  16. return Admin{
  17. node: node,
  18. }
  19. }
  20. func (a *Admin) Start() error {
  21. // rpc server
  22. err := rpc.Register(a)
  23. if err != nil {
  24. return err
  25. }
  26. //
  27. oldMux := http.DefaultServeMux
  28. mux := http.NewServeMux()
  29. http.DefaultServeMux = mux
  30. //
  31. rpc.HandleHTTP()
  32. //
  33. http.DefaultServeMux = oldMux
  34. //
  35. listener, err := net.Listen("tcp", ":"+config.C.AdminPort)
  36. if err != nil {
  37. return err
  38. }
  39. err = http.Serve(listener, nil)
  40. if err != nil {
  41. return err
  42. }
  43. return nil
  44. }
  45. func (a *Admin) Find(id kademlia.ID, lns *[]kademlia.ListedNode) error {
  46. log.Info("[admin-rpc] FIND ", id)
  47. // check if id in current node
  48. _, err := ioutil.ReadFile(config.C.Storage + "/" + id.String())
  49. if err == nil {
  50. *lns = []kademlia.ListedNode{
  51. kademlia.ListedNode{
  52. ID: a.node.ID(),
  53. Addr: config.C.Addr,
  54. Port: config.C.Port,
  55. },
  56. }
  57. log.Info("[admin-rpc] FIND found")
  58. return nil
  59. }
  60. log.Info("[admin-rpc] FIND not in local Node, starting NodeLookup")
  61. rlns, err := a.node.Kademlia().NodeLookup(id)
  62. if err != nil {
  63. log.Debug("[admin-rpc/FIND] ERROR: ", err)
  64. return err
  65. }
  66. *lns = rlns
  67. return nil
  68. }