1 // Downloads torrents from the command-line.
12 "github.com/davecgh/go-spew/spew"
13 "github.com/prometheus/client_golang/prometheus"
14 "github.com/prometheus/client_golang/prometheus/promhttp"
16 "github.com/anacrolix/bargle"
17 "github.com/anacrolix/envpprof"
18 xprometheus "github.com/anacrolix/missinggo/v2/prometheus"
20 "github.com/anacrolix/torrent/bencode"
21 "github.com/anacrolix/torrent/version"
25 prometheus.MustRegister(xprometheus.NewExpvarCollector())
26 http.Handle("/metrics", promhttp.Handler())
30 defer stdLog.SetFlags(stdLog.Flags() | stdLog.Lshortfile)
32 main.Defer(envpprof.Stop)
34 debugFlag := bargle.NewFlag(&debug)
35 debugFlag.AddLong("debug")
36 main.Options = append(main.Options, debugFlag.Make())
37 main.Positionals = append(main.Positionals,
38 bargle.Subcommand{Name: "metainfo", Command: metainfoCmd()},
39 bargle.Subcommand{Name: "announce", Command: func() bargle.Command {
41 cmd := bargle.FromStruct(&ac)
42 cmd.DefaultAction = func() error {
43 return announceErr(ac)
47 bargle.Subcommand{Name: "scrape", Command: func() bargle.Command {
48 var scrapeCfg scrapeCfg
49 cmd := bargle.FromStruct(&scrapeCfg)
50 cmd.Desc = "fetch swarm metrics for info-hashes from tracker"
51 cmd.DefaultAction = func() error {
52 return scrape(scrapeCfg)
56 bargle.Subcommand{Name: "download", Command: func() bargle.Command {
58 cmd := bargle.FromStruct(&dlc)
59 cmd.DefaultAction = func() error {
60 return downloadErr(downloadFlags{
69 Command: func() (cmd bargle.Command) {
70 var print func(interface{}) error
71 cmd.Positionals = append(cmd.Positionals,
72 bargle.Subcommand{Name: "json", Command: func() (cmd bargle.Command) {
73 cmd.DefaultAction = func() error {
74 je := json.NewEncoder(os.Stdout)
81 bargle.Subcommand{Name: "spew", Command: func() (cmd bargle.Command) {
82 cmd.DefaultAction = func() error {
83 config := spew.NewDefaultConfig()
84 config.DisableCapacities = true
86 print = func(v interface{}) error {
94 d := bencode.NewDecoder(os.Stdin)
95 cmd.AfterParseFunc = func(ctx bargle.Context) error {
96 ctx.AfterParse(func() error {
104 return fmt.Errorf("decoding message index %d: %w", i, err)
112 cmd.Desc = "reads bencoding from stdin into Go native types and spews the result"
116 bargle.Subcommand{Name: "version", Command: bargle.Command{
117 DefaultAction: func() error {
118 fmt.Printf("HTTP User-Agent: %q\n", version.DefaultHttpUserAgent)
119 fmt.Printf("Torrent client version: %q\n", version.DefaultExtendedHandshakeClientVersion)
120 fmt.Printf("Torrent version prefix: %q\n", version.DefaultBep20Prefix)
123 Desc: "prints various protocol default version strings",
125 bargle.Subcommand{Name: "serve", Command: serve()},
126 bargle.Subcommand{Name: "create", Command: create()},