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