-
-
Notifications
You must be signed in to change notification settings - Fork 614
/
main.go
152 lines (144 loc) · 4.36 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// Downloads torrents from the command-line.
package main
import (
"context"
"encoding/json"
"fmt"
"io"
stdLog "log"
"net/http"
"os"
"time"
"github.com/anacrolix/bargle"
"github.com/anacrolix/envpprof"
"github.com/anacrolix/log"
xprometheus "github.com/anacrolix/missinggo/v2/prometheus"
"github.com/davecgh/go-spew/spew"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/sdk/trace"
"github.com/anacrolix/torrent/bencode"
"github.com/anacrolix/torrent/version"
)
func init() {
prometheus.MustRegister(xprometheus.NewExpvarCollector())
http.Handle("/metrics", promhttp.Handler())
}
func shutdownTracerProvider(ctx context.Context, tp *trace.TracerProvider) {
started := time.Now()
err := tp.Shutdown(ctx)
elapsed := time.Since(started)
log.Levelf(log.Error, "shutting down tracer provider (took %v): %v", elapsed, err)
}
func main() {
defer stdLog.SetFlags(stdLog.Flags() | stdLog.Lshortfile)
ctx := context.Background()
tracingExporter, err := otlptracegrpc.New(ctx)
if err != nil {
log.Fatalf("creating tracing exporter: %v", err)
}
tracerProvider := trace.NewTracerProvider(trace.WithBatcher(tracingExporter))
defer shutdownTracerProvider(ctx, tracerProvider)
otel.SetTracerProvider(tracerProvider)
main := bargle.Main{}
main.Defer(envpprof.Stop)
main.Defer(func() { shutdownTracerProvider(ctx, tracerProvider) })
debug := false
debugFlag := bargle.NewFlag(&debug)
debugFlag.AddLong("debug")
main.Options = append(main.Options, debugFlag.Make())
main.Positionals = append(main.Positionals,
bargle.Subcommand{Name: "metainfo", Command: metainfoCmd()},
bargle.Subcommand{Name: "announce", Command: func() bargle.Command {
var ac AnnounceCmd
cmd := bargle.FromStruct(&ac)
cmd.DefaultAction = func() error {
return announceErr(ac)
}
return cmd
}()},
bargle.Subcommand{Name: "scrape", Command: func() bargle.Command {
var scrapeCfg scrapeCfg
cmd := bargle.FromStruct(&scrapeCfg)
cmd.Desc = "fetch swarm metrics for info-hashes from tracker"
cmd.DefaultAction = func() error {
return scrape(scrapeCfg)
}
return cmd
}()},
bargle.Subcommand{Name: "download", Command: func() bargle.Command {
var dlc DownloadCmd
cmd := bargle.FromStruct(&dlc)
cmd.DefaultAction = func() error {
return downloadErr(downloadFlags{
Debug: debug,
DownloadCmd: dlc,
})
}
return cmd
}()},
bargle.Subcommand{
Name: "bencode",
Command: func() (cmd bargle.Command) {
var print func(interface{}) error
cmd.Positionals = append(cmd.Positionals,
bargle.Subcommand{Name: "json", Command: func() (cmd bargle.Command) {
cmd.DefaultAction = func() error {
je := json.NewEncoder(os.Stdout)
je.SetIndent("", " ")
print = je.Encode
return nil
}
return
}()},
bargle.Subcommand{Name: "spew", Command: func() (cmd bargle.Command) {
cmd.DefaultAction = func() error {
config := spew.NewDefaultConfig()
config.DisableCapacities = true
config.Indent = " "
print = func(v interface{}) error {
config.Dump(v)
return nil
}
return nil
}
return
}()})
d := bencode.NewDecoder(os.Stdin)
cmd.AfterParseFunc = func(ctx bargle.Context) error {
ctx.AfterParse(func() error {
for i := 0; ; i++ {
var v interface{}
err := d.Decode(&v)
if err == io.EOF {
break
}
if err != nil {
return fmt.Errorf("decoding message index %d: %w", i, err)
}
print(v)
}
return nil
})
return nil
}
cmd.Desc = "reads bencoding from stdin into Go native types and spews the result"
return
}(),
},
bargle.Subcommand{Name: "version", Command: bargle.Command{
DefaultAction: func() error {
fmt.Printf("HTTP User-Agent: %q\n", version.DefaultHttpUserAgent)
fmt.Printf("Torrent client version: %q\n", version.DefaultExtendedHandshakeClientVersion)
fmt.Printf("Torrent version prefix: %q\n", version.DefaultBep20Prefix)
return nil
},
Desc: "prints various protocol default version strings",
}},
bargle.Subcommand{Name: "serve", Command: serve()},
bargle.Subcommand{Name: "create", Command: create()},
)
main.Run()
}