reflector.go/cmd/dht.go

77 lines
2 KiB
Go
Raw Normal View History

package cmd
import (
"net"
"os"
"os/signal"
"strconv"
"syscall"
"time"
2018-07-13 19:31:54 +02:00
"github.com/lbryio/reflector.go/dht"
2018-06-14 17:48:02 +02:00
"github.com/lbryio/reflector.go/dht/bits"
2018-07-13 19:31:54 +02:00
2018-09-20 17:24:36 +02:00
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
2018-08-07 17:00:04 +02:00
var dhtNodeID string
var dhtPort int
2018-08-31 02:20:15 +02:00
var dhtRPCPort int
2018-08-07 17:00:04 +02:00
var dhtSeeds []string
func init() {
var cmd = &cobra.Command{
2018-08-07 17:00:04 +02:00
Use: "dht [connect|bootstrap]",
Short: "Run dht node",
2018-08-07 17:00:04 +02:00
ValidArgs: []string{"connect", "bootstrap"},
Args: argFuncs(cobra.ExactArgs(1), cobra.OnlyValidArgs),
Run: dhtCmd,
}
2018-08-07 17:00:04 +02:00
cmd.PersistentFlags().StringVar(&dhtNodeID, "nodeID", "", "nodeID in hex")
cmd.PersistentFlags().IntVar(&dhtPort, "port", 4567, "Port to start DHT on")
2018-08-31 02:20:15 +02:00
cmd.PersistentFlags().IntVar(&dhtRPCPort, "rpcPort", 0, "Port to listen for rpc commands on")
2018-08-07 17:00:04 +02:00
cmd.PersistentFlags().StringSliceVar(&dhtSeeds, "seeds", []string{}, "Addresses of seed nodes")
rootCmd.AddCommand(cmd)
}
func dhtCmd(cmd *cobra.Command, args []string) {
if args[0] == "bootstrap" {
node := dht.NewBootstrapNode(bits.Rand(), 1*time.Millisecond, 1*time.Minute)
listener, err := net.ListenPacket(dht.Network, "127.0.0.1:"+strconv.Itoa(dhtPort))
checkErr(err)
conn := listener.(*net.UDPConn)
err = node.Connect(conn)
checkErr(err)
interruptChan := make(chan os.Signal, 1)
signal.Notify(interruptChan, os.Interrupt, syscall.SIGTERM)
<-interruptChan
node.Shutdown()
} else {
2018-08-07 17:00:04 +02:00
nodeID := bits.Rand()
if dhtNodeID != "" {
nodeID = bits.FromHexP(dhtNodeID)
}
log.Println(nodeID.String())
2018-08-07 17:00:04 +02:00
dhtConf := dht.NewStandardConfig()
dhtConf.Address = "0.0.0.0:" + strconv.Itoa(dhtPort)
2018-08-31 02:20:15 +02:00
dhtConf.RPCPort = dhtRPCPort
2018-08-07 17:00:04 +02:00
if len(dhtSeeds) > 0 {
dhtConf.SeedNodes = dhtSeeds
}
d := dht.New(dhtConf)
err := d.Start()
if err != nil {
log.Println("error starting dht: " + err.Error())
return
}
2018-08-07 17:00:04 +02:00
interruptChan := make(chan os.Signal, 1)
signal.Notify(interruptChan, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
<-interruptChan
2018-08-07 17:00:04 +02:00
d.Shutdown()
2018-04-25 00:12:17 +02:00
}
}