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