func main() { loggerconfig.Use() if len(os.Args) != 2 { logger.Fatalf("Usage: %v PATH", os.Args[0]) return } weakrand.Seed(time.Now().UTC().UnixNano()) path := os.Args[1] infoDict, err := bittorrent.GenerateTorrentMetaInfo(bittorrent.CreationOptions{ Path: path, PieceLength: PieceLength, ForceMultiFile: false, }) if err != nil { logger.Fatalf("Error generating torrent: %v", err) return } infoData, err := bencoding.Encode(infoDict) if err != nil { logger.Fatalf("Error encoding torrent infodict (for hashing): %v", err) return } torrentDict := bencoding.Dict{ "info": infoDict, "nodes": bencoding.List{ bencoding.List{ bencoding.String("127.0.0.1"), bencoding.Int(6881), }, }, } torrentData, err := bencoding.Encode(torrentDict) if err != nil { logger.Fatalf("Error encoding torrent data: %v", err) return } hasher := sha1.New() hasher.Write(infoData) hash := hasher.Sum(nil) infoHash := bittorrent.BTID(hash) logger.Info("Generated torrent btih=%v.", infoHash) os.Stdout.Write(torrentData) os.Stdout.Sync() }
func main() { loggerconfig.Use() if len(os.Args) != 2 { logger.Fatalf("Usage: %v INFOHASH < INFOHASH.peers", os.Args[0]) return } weakrand.Seed(time.Now().UTC().UnixNano()) infoHash, err := bittorrent.BTIDFromHex(os.Args[1]) if err != nil { logger.Fatalf("Specified string was not a valid hex infohash [%v].", err) return } peers := make([]net.TCPAddr, 0) dec := json.NewDecoder(os.Stdin) dec.Decode(&peers) logger.Info("Loaded peers: %v", peers) client := bittorrent.OpenClient() swarm := client.Swarm(infoHash) for _, peer := range peers { swarm.AddPeer(peer) } logger.Info("getting info") info := swarm.Info() logger.Info("got info: %v", info) torrentFileData, err := bencoding.Encode(bencoding.Dict{ "info": info, "announce-list": bencoding.List{}, "nodes": bencoding.List{}, }) if err != nil { logger.Fatalf("error encoding torrent file: %v:", err) } os.Stdout.Write(torrentFileData) }
func main() { loggerconfig.Use() if len(os.Args) != 2 { logger.Fatalf("Usage: %v INFOHASH", os.Args[0]) return } weakrand.Seed(time.Now().UTC().UnixNano()) infoHash, err := bittorrent.BTIDFromHex(os.Args[1]) if err != nil { logger.Fatalf("Specified string was not a valid hex infohash [%v].", err) return } dhtClient, err := dht.OpenClient(".dht-peer", true) if err != nil { logger.Fatalf("Unable to open .dht-peer: %v", err) return } defer dhtClient.Close() search := dhtClient.GetPeers(infoHash) peers, err := search.AllPeers() if err != nil { logger.Fatalf("Unable to find peers: %v", err) } logger.Info("Found peers for %v:", infoHash) peerData, err := json.Marshal(peers) if err != nil { logger.Fatalf("?!?: %v", err) } os.Stdout.Write(peerData) }
func main() { loggerconfig.Use() if len(os.Args) == 0 { logger.Fatalf("Usage: %v", os.Args[0]) return } weakrand.Seed(time.Now().UTC().UnixNano()) dc, err := dht.OpenClient(".dht-peer", false) if err != nil { logger.Fatalf("Unable to open DHT client: %v", err) return } bc := bittorrent.OpenClient() wc, err := webclient.New(dc, bc) if err != nil { logger.Fatalf("Unable to create web interface: %v", err) return } err = wc.ListenAndServe() if err != nil { logger.Fatalf("Unable to serve web interface: %v", err) return } defer dc.Close() for { time.Sleep(60 * time.Second) } }
func main() { loggerconfig.Use() if len(os.Args) == 1 { logger.Fatalf("Usage: %v from-bencoding|to-bencoding", os.Args[0]) return } weakrand.Seed(time.Now().UTC().UnixNano()) subcommand := os.Args[1] subcommandArgs := os.Args[2:] switch subcommand { case "from-bencoding": cmdJsonFromBencoding(subcommandArgs) case "to-bencoding": cmdJsonToBencoding(subcommandArgs) default: logger.Fatalf("Unknown torrent subcommand: %v", subcommand) return } }