package peer import ( "encoding/json" "flag" "fmt" "io" "log" "net/http" "os" "runtime/debug" "vppn/m" _ "net/http/pprof" ) func Main() { defer func() { if r := recover(); r != nil { fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) } }() go func() { log.Printf("Serving on localhost:6060...") log.Println(http.ListenAndServe("localhost:6060", nil)) }() var ( netName string initURL string listenIP string port int ) flag.StringVar(&netName, "name", "", "[REQUIRED] The network name.") flag.StringVar(&initURL, "init-url", "", "Initializes peer from the hub URL.") flag.StringVar(&listenIP, "listen-ip", "", "IP address to listen on.") flag.IntVar(&port, "port", 0, "Port to listen on.") flag.Parse() if netName == "" { flag.Usage() os.Exit(1) } if initURL != "" { mainInit(netName, initURL) return } peer, err := NewPeer(netName, listenIP, uint16(port)) if err != nil { log.Fatalf("Failed to create peer: %v", err) } peer.Run() } func mainInit(netName, initURL string) { if _, err := loadPeerConfig(netName); err == nil { log.Fatalf("Network is already initialized.") } resp, err := http.Get(initURL) if err != nil { log.Fatalf("Failed to fetch data from hub: %v", err) } defer resp.Body.Close() data, err := io.ReadAll(resp.Body) if err != nil { log.Fatalf("Failed to read response body: %v", err) } peerConfig := m.PeerConfig{} if err := json.Unmarshal(data, &peerConfig); err != nil { log.Fatalf("Failed to parse configuration: %v", err) } if err := storePeerConfig(netName, peerConfig); err != nil { log.Fatalf("Failed to store configuration: %v", err) } log.Print("Initialization successful.") }