diff --git a/peer/main.go b/peer/main.go index f2db699..05a6182 100644 --- a/peer/main.go +++ b/peer/main.go @@ -22,6 +22,7 @@ func Main2() { Available commands: run status + hosts `, os.Args[0]) os.Exit(1) } @@ -37,6 +38,8 @@ Available commands: main_run() case "status": main_status() + case "hosts": + main_hosts() default: printUsage() } @@ -100,26 +103,7 @@ func main_status() { } netName := os.Args[2] - - client := http.Client{ - Transport: &http.Transport{ - Dial: func(_, _ string) (net.Conn, error) { - return net.Dial("unix", statusSocketPath(netName)) - }, - }, - Timeout: 8 * time.Second, - } - - getURL := "http://unix" + statusSocketPath(netName) - resp, err := client.Get(getURL) - if err != nil { - log.Fatalf("Failed to get response: %v", err) - } - - report := StatusReport{} - if err := json.NewDecoder(resp.Body).Decode(&report); err != nil { - log.Fatalf("Failed to decode status report: %v", err) - } + report := fetchStatusReport(netName) fmt.Printf("\n%s Status\n\n", netName) @@ -151,3 +135,68 @@ func main_status() { fmt.Println("") } } + +// ---------------------------------------------------------------------------- + +func main_hosts() { + printUsage := func() { + fmt.Fprintf(os.Stderr, `Usage: %s hosts NETWORK_NAME + + NETWORK_NAME + Unique name of the network interface created. + +`, os.Args[0]) + os.Exit(1) + } + + if len(os.Args) != 3 { + printUsage() + } + + netName := os.Args[2] + state, err := loadNetworkState(netName) + if err != nil { + log.Fatalf("Failed to load network state: %v", err) + } + + config, err := loadPeerConfig(netName) + if err != nil { + log.Fatalf("Failed to load config: %v", err) + } + + nw := config.Network + for _, peer := range state.Peers { + if peer == nil { + continue + } + fmt.Printf("%d.%d.%d.%d %s\n", + nw[0], nw[1], nw[2], peer.PeerIP, peer.Name) + } + fmt.Println("") +} + +// ---------------------------------------------------------------------------- + +func fetchStatusReport(netName string) StatusReport { + client := http.Client{ + Transport: &http.Transport{ + Dial: func(_, _ string) (net.Conn, error) { + return net.Dial("unix", statusSocketPath(netName)) + }, + }, + Timeout: 8 * time.Second, + } + + getURL := "http://unix" + statusSocketPath(netName) + resp, err := client.Get(getURL) + if err != nil { + log.Fatalf("Failed to get response: %v", err) + } + + report := StatusReport{} + if err := json.NewDecoder(resp.Body).Decode(&report); err != nil { + log.Fatalf("Failed to decode status report: %v", err) + } + + return report +}