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 13:31:54 -04:00
2019-11-13 19:11:35 -05:00
"github.com/lbryio/lbry.go/v2/dht"
"github.com/lbryio/lbry.go/v2/dht/bits"
2018-07-13 13:31:54 -04:00
2018-09-20 11:24:36 -04:00
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
2018-08-07 11:00:04 -04:00
var dhtNodeID string
var dhtPort int
2018-08-30 20:20:15 -04:00
var dhtRPCPort int
2018-08-07 11:00:04 -04:00
var dhtSeeds []string
func init() {
var cmd = &cobra.Command{
2018-08-07 11:00:04 -04:00
Use: "dht [connect|bootstrap]",
Short: "Run dht node",
2018-08-07 11:00:04 -04:00
ValidArgs: []string{"connect", "bootstrap"},
Args: argFuncs(cobra.ExactArgs(1), cobra.OnlyValidArgs),
Run: dhtCmd,
}
2018-08-07 11:00:04 -04:00
cmd.PersistentFlags().StringVar(&dhtNodeID, "nodeID", "", "nodeID in hex")
cmd.PersistentFlags().IntVar(&dhtPort, "port", 4567, "Port to start DHT on")
2018-08-30 20:20:15 -04:00
cmd.PersistentFlags().IntVar(&dhtRPCPort, "rpcPort", 0, "Port to listen for rpc commands on")
2018-08-07 11:00:04 -04: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 11:00:04 -04:00
nodeID := bits.Rand()
if dhtNodeID != "" {
nodeID = bits.FromHexP(dhtNodeID)
}
log.Println(nodeID.String())
2018-08-07 11:00:04 -04:00
dhtConf := dht.NewStandardConfig()
dhtConf.Address = "0.0.0.0:" + strconv.Itoa(dhtPort)
2018-08-30 20:20:15 -04:00
dhtConf.RPCPort = dhtRPCPort
2018-08-07 11:00:04 -04: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 11:00:04 -04:00
interruptChan := make(chan os.Signal, 1)
signal.Notify(interruptChan, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
<-interruptChan
2018-08-07 11:00:04 -04:00
d.Shutdown()
2018-04-24 18:12:17 -04:00
}
}