FedP2P/cmd/torrent/main.go

134 lines
3.4 KiB
Go
Raw Normal View History

2015-04-06 21:04:18 +08:00
// Downloads torrents from the command-line.
2013-09-26 17:49:15 +08:00
package main
import (
"encoding/json"
"errors"
"fmt"
"io"
stdLog "log"
2022-04-28 07:45:49 +08:00
"net/http"
"os"
2015-03-25 14:32:42 +08:00
"github.com/anacrolix/args"
2021-05-14 11:39:01 +08:00
"github.com/anacrolix/envpprof"
"github.com/anacrolix/log"
2022-04-28 07:45:49 +08:00
xprometheus "github.com/anacrolix/missinggo/v2/prometheus"
"github.com/anacrolix/torrent/bencode"
"github.com/anacrolix/torrent/version"
"github.com/davecgh/go-spew/spew"
2022-04-28 07:45:49 +08:00
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
2013-09-26 17:49:15 +08:00
)
func main() {
2019-08-22 11:59:04 +08:00
if err := mainErr(); err != nil {
log.Printf("error in main: %v", err)
os.Exit(1)
}
}
2022-04-28 07:45:49 +08:00
func init() {
prometheus.MustRegister(xprometheus.NewExpvarCollector())
http.Handle("/metrics", promhttp.Handler())
}
2019-08-22 11:59:04 +08:00
func mainErr() error {
defer envpprof.Stop()
stdLog.SetFlags(stdLog.Flags() | stdLog.Lshortfile)
debug := args.Flag(args.FlagOpt{Long: "debug"})
return args.ParseMain(
debug,
args.Subcommand("metainfo", metainfoCmd),
args.Subcommand("announce", func(p args.SubCmdCtx) error {
var cmd AnnounceCmd
err := p.NewParser().AddParams(
args.Pos("tracker", &cmd.Tracker),
args.Pos("infohash", &cmd.InfoHash)).Parse()
if err != nil {
return err
}
return announceErr(cmd)
}),
2022-02-20 13:16:57 +08:00
args.Subcommand("scrape", func(p args.SubCmdCtx) error {
var cmd ScrapeCmd
err := p.NewParser().AddParams(
args.Pos("tracker", &cmd.Tracker),
args.Pos("infohash", &cmd.InfoHashes, args.Arity('+'))).Parse()
if err != nil {
return err
}
return scrape(cmd)
}),
args.Subcommand("download", func(p args.SubCmdCtx) error {
2021-10-20 13:41:33 +08:00
var dlc DownloadCmd
err := p.NewParser().AddParams(
2021-10-20 13:41:33 +08:00
append(args.FromStruct(&dlc), debug)...,
).Parse()
if err != nil {
return err
}
2021-10-20 13:41:33 +08:00
dlf := downloadFlags{
Debug: debug.Bool(),
2021-10-20 13:41:33 +08:00
DownloadCmd: dlc,
}
p.Defer(func() error {
return downloadErr(dlf)
})
2021-10-20 13:41:33 +08:00
return nil
}),
args.Subcommand(
"bencode",
func(p args.SubCmdCtx) error {
var print func(interface{}) error
if !p.Parse(
args.Subcommand("json", func(ctx args.SubCmdCtx) (err error) {
ctx.Parse()
je := json.NewEncoder(os.Stdout)
je.SetIndent("", " ")
print = je.Encode
return nil
}),
args.Subcommand("spew", func(ctx args.SubCmdCtx) (err error) {
ctx.Parse()
config := spew.NewDefaultConfig()
config.DisableCapacities = true
config.Indent = " "
print = func(v interface{}) error {
config.Dump(v)
return nil
}
return nil
}),
).RanSubCmd {
return errors.New("an output type is required")
}
d := bencode.NewDecoder(os.Stdin)
p.Defer(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
},
args.Help("reads bencoding from stdin into Go native types and spews the result"),
),
args.Subcommand("version", func(p args.SubCmdCtx) 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
}),
2021-11-04 17:02:55 +08:00
args.Subcommand("serve", serve, args.Help("creates and seeds a torrent from a filepath")),
)
}