13 "github.com/anacrolix/dht/v2"
14 analog "github.com/anacrolix/log"
15 "golang.org/x/time/rate"
17 "github.com/anacrolix/torrent"
18 "github.com/anacrolix/torrent/storage"
22 TorrentExt = ".torrent"
23 UserAgent = "btrtrc/0.2.0"
27 Cancel = make(chan struct{})
32 log.SetFlags(log.Ldate | log.Ltime)
33 fifosDir := flag.String("fifos", "fifos", "Path to fifos/")
34 txsDir := flag.String("txs", "txs", "Path to txs/")
35 dhtBoot := flag.String("dht", "dht.cypherpunks.ru:8991",
36 "Comma-separated list of DHT bootstrap nodes")
37 addr := flag.String("bind", "[::]:6881", "Address to bind to")
38 pub4 := flag.String("4", "", "External IPv4 address")
39 pub6 := flag.String("6", "", "External IPv6 address")
40 debug := flag.Bool("debug", false, "Enable debug messages")
41 noDHT := flag.Bool("nodht", false, "Disable DHT")
42 rxRate := flag.Int("rx-rate", 0, "Download rate, piece bytes/sec")
43 txRate := flag.Int("rt-rate", 0, "Upload rate, bytes/sec")
44 verify := flag.Bool("verify", false, "Force verification of provided torrents")
49 os.MkdirAll(TxsDir, 0777)
50 dht.DefaultGlobalBootstrapHostPorts = strings.Split(*dhtBoot, ",")
51 cc := torrent.NewDefaultClientConfig()
53 cc.DisableAcceptRateLimiting = true
54 cc.NoDefaultPortForwarding = true
55 cc.DisableWebtorrent = true
56 cc.Logger = analog.Default.WithNames("main", "client")
57 cc.HTTPUserAgent = UserAgent
58 cc.ExtendedHandshakeClientVersion = UserAgent
59 cc.DefaultStorage = storage.NewFileWithCompletion(".", NewBFPieceCompletion())
61 doVerify(cc, flag.Args())
68 cc.PublicIp4 = net.ParseIP(*pub4).To4()
73 cc.PublicIp6 = net.ParseIP(*pub6).To16()
76 cc.UploadRateLimiter = rate.NewLimiter(rate.Limit(*txRate), 256<<10)
79 cc.DownloadRateLimiter = rate.NewLimiter(rate.Limit(*rxRate), 1<<16)
82 cc.SetListenAddr(*addr)
83 client, err := torrent.NewClient(cc)
85 log.Fatalln("torrent.NewClient:", err)
89 needsShutdown := make(chan os.Signal)
90 signal.Notify(needsShutdown, syscall.SIGTERM, syscall.SIGINT)
98 log.Println("started", client.PublicIPs())
100 go overallStatus(client)
102 go fifoTopSeed(client)
103 go fifoDHTList(client)
107 go txStatsDumper(client)
111 log.Println("finished")