1 // Downloads torrents from the command-line.
7 "github.com/anacrolix/log"
8 "go.opentelemetry.io/otel"
9 "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
10 "go.opentelemetry.io/otel/sdk/trace"
14 "github.com/anacrolix/bargle"
15 "github.com/anacrolix/envpprof"
16 xprometheus "github.com/anacrolix/missinggo/v2/prometheus"
17 "github.com/anacrolix/torrent/version"
18 "github.com/prometheus/client_golang/prometheus"
19 "github.com/prometheus/client_golang/prometheus/promhttp"
23 prometheus.MustRegister(xprometheus.NewExpvarCollector())
24 http.Handle("/metrics", promhttp.Handler())
28 defer stdLog.SetFlags(stdLog.Flags() | stdLog.Lshortfile)
30 ctx := context.Background()
31 tracingExporter, err := otlptracegrpc.New(ctx)
33 log.Fatalf("creating tracing exporter: %v", err)
35 tracingProvider := trace.NewTracerProvider(trace.WithBatcher(tracingExporter))
36 defer tracingProvider.Shutdown(ctx)
37 otel.SetTracerProvider(tracingProvider)
38 //otel.SetTextMapPropagator(
39 // propagation.NewCompositeTextMapPropagator(
40 // propagation.TraceContext{},
41 // propagation.Baggage{},
46 main.Defer(envpprof.Stop)
47 main.Defer(func() { tracingProvider.Shutdown(ctx) })
49 debugFlag := bargle.NewFlag(&debug)
50 debugFlag.AddLong("debug")
51 main.Options = append(main.Options, debugFlag.Make())
52 main.Positionals = append(main.Positionals,
53 bargle.Subcommand{Name: "metainfo", Command: metainfoCmd()},
54 //bargle.Subcommand{Name: "announce", Command: func() bargle.Command {
55 // var cmd AnnounceCmd
56 // err := p.NewParser().AddParams(
57 // args.Pos("tracker", &cmd.Tracker),
58 // args.Pos("infohash", &cmd.InfoHash)).Parse()
62 // return announceErr(cmd)
64 bargle.Subcommand{Name: "scrape", Command: func() bargle.Command {
65 var scrapeCfg scrapeCfg
66 cmd := bargle.FromStruct(&scrapeCfg)
67 cmd.Desc = "fetch swarm metrics for info-hashes from tracker"
68 cmd.DefaultAction = func() error {
69 return scrape(scrapeCfg)
73 bargle.Subcommand{Name: "download", Command: func() bargle.Command {
75 cmd := bargle.FromStruct(&dlc)
76 cmd.DefaultAction = func() error {
77 return downloadErr(downloadFlags{
84 //bargle.Subcommand{Name:
85 // "bencode", Command: func() bargle.Command {
86 // var print func(interface{}) error
88 // args.Subcommand("json", func(ctx args.SubCmdCtx) (err error) {
90 // je := json.NewEncoder(os.Stdout)
91 // je.SetIndent("", " ")
95 // args.Subcommand("spew", func(ctx args.SubCmdCtx) (err error) {
97 // config := spew.NewDefaultConfig()
98 // config.DisableCapacities = true
99 // config.Indent = " "
100 // print = func(v interface{}) error {
107 // return errors.New("an output type is required")
109 // d := bencode.NewDecoder(os.Stdin)
110 // p.Defer(func() error {
111 // for i := 0; ; i++ {
113 // err := d.Decode(&v)
114 // if err == io.EOF {
118 // return fmt.Errorf("decoding message index %d: %w", i, err)
126 // Desc: "reads bencoding from stdin into Go native types and spews the result",
128 bargle.Subcommand{Name: "version", Command: bargle.Command{
129 DefaultAction: func() error {
130 fmt.Printf("HTTP User-Agent: %q\n", version.DefaultHttpUserAgent)
131 fmt.Printf("Torrent client version: %q\n", version.DefaultExtendedHandshakeClientVersion)
132 fmt.Printf("Torrent version prefix: %q\n", version.DefaultBep20Prefix)
135 Desc: "prints various protocol default version strings",
137 bargle.Subcommand{Name: "serve", Command: serve()},
138 bargle.Subcommand{Name: "create", Command: create()},