]> Sergey Matveev's repositories - btrtrc.git/blob - cmd/btrtrc/main.go
Hard-code User-Agents
[btrtrc.git] / cmd / btrtrc / main.go
1 package main
2
3 import (
4         "flag"
5         "log"
6         "net"
7         "os"
8         "os/signal"
9         "strings"
10         "syscall"
11
12         "github.com/anacrolix/dht/v2"
13         analog "github.com/anacrolix/log"
14
15         "github.com/anacrolix/torrent"
16         "github.com/anacrolix/torrent/storage"
17 )
18
19 const TorrentExt = ".torrent"
20
21 func main() {
22         log.SetFlags(log.Ldate | log.Ltime)
23         dhtBoot := flag.String("dht", "dht.cypherpunks.ru:8991", "Comma-separated list of DHT bootstrap nodes")
24         addr := flag.String("bind", "[::]:6881", "Address to bind to")
25         pub4 := flag.String("4", "", "External IPv4 address")
26         pub6 := flag.String("6", "", "External IPv6 address")
27         debug := flag.Bool("debug", false, "Enable debug messages")
28         noDHT := flag.Bool("nodht", false, "Disable DHT")
29         verify := flag.Bool("verify", false, "Force verification of provided torrents")
30         flag.Parse()
31
32         dht.DefaultGlobalBootstrapHostPorts = strings.Split(*dhtBoot, ",")
33         cc := torrent.NewDefaultClientConfig()
34         cc.Debug = *debug
35         cc.DisableAcceptRateLimiting = true
36         cc.NoDefaultPortForwarding = true
37         cc.DisableWebtorrent = true
38         cc.Logger = analog.Default.WithNames("main", "client")
39         cc.HTTPUserAgent = "btrtrc/0.1.0"
40         cc.ExtendedHandshakeClientVersion = "btrtrc/0.1.0"
41         cc.DefaultStorage = storage.NewFileWithCompletion(".", NewBFPieceCompletion())
42         if *verify {
43                 doVerify(cc, flag.Args())
44                 return
45         }
46         cc.Seed = true
47         if *pub4 == "" {
48                 cc.DisableIPv4 = true
49         } else {
50                 cc.PublicIp4 = net.ParseIP(*pub4).To4()
51         }
52         if *pub6 == "" {
53                 cc.DisableIPv6 = true
54         } else {
55                 cc.PublicIp6 = net.ParseIP(*pub6).To16()
56         }
57         cc.NoDHT = *noDHT
58         cc.SetListenAddr(*addr)
59         client, err := torrent.NewClient(cc)
60         if err != nil {
61                 log.Fatalln("torrent.NewClient:", err)
62         }
63         defer client.Close()
64
65         needsShutdown := make(chan os.Signal)
66         overallStatusCancel := make(chan struct{})
67         txStatsDumperCancel := make(chan struct{})
68         signal.Notify(needsShutdown, syscall.SIGTERM, syscall.SIGINT)
69         go func() {
70                 <-needsShutdown
71                 overallStatusCancel <- struct{}{}
72                 txStatsDumperCancel <- struct{}{}
73                 client.Close()
74         }()
75
76         fifosPrepare()
77         log.Println("started", client.PublicIPs())
78         go overallStatus(client, overallStatusCancel)
79         go fifoList(client)
80         go fifoDHTList(client)
81         go fifoAdd(client)
82         go fifoDel(client)
83         go txStatsDumper(client, txStatsDumperCancel)
84         <-client.Closed()
85         <-overallStatusCancel
86         <-txStatsDumperCancel
87         fifosCleanup()
88         log.Println("finished")
89 }