vppn/peer/main2.go
2025-09-15 04:07:56 +02:00

154 lines
2.7 KiB
Go

package peer
import (
"encoding/json"
"fmt"
"log"
"net"
"net/http"
"os"
"strings"
)
// Usage:
//
// vppn netName run
// vppn netName status
func Main2() {
printUsage := func() {
fmt.Fprintf(os.Stderr, `%s COMMAND [ARGUMENTS...]
Available commands:
run
status
`, os.Args[0])
os.Exit(1)
}
if len(os.Args) < 2 {
printUsage()
}
command := os.Args[1]
switch command {
case "run":
main_run()
case "status":
main_status()
default:
printUsage()
}
}
// ----------------------------------------------------------------------------
type mainArgs struct {
NetName string
HubAddress string
APIKey string
}
func main_run() {
printUsage := func() {
fmt.Fprintf(os.Stderr, `Usage: %s run NETWORK_NAME HUB_ADDRESS API_KEY
NETWORK_NAME
Unique name of the network interface created. The network name
shouldn't change between invocations of the application.
HUB_ADDRESS
The address of the hub server. This should also contain the scheme, for
example https://hub.domain.com/.
API_KEY
The API key assigned to this peer by the hub.
`, os.Args[0])
os.Exit(1)
}
if len(os.Args) != 5 {
printUsage()
}
args := mainArgs{
NetName: os.Args[2],
HubAddress: os.Args[3],
APIKey: os.Args[4],
}
newPeerMain(args).Run()
}
// ----------------------------------------------------------------------------
func main_status() {
printUsage := func() {
fmt.Fprintf(os.Stderr, `Usage: %s status 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]
client := http.Client{
Transport: &http.Transport{
Dial: func(_, _ string) (net.Conn, error) {
return net.Dial("unix", statusSocketPath(netName))
},
},
}
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)
}
b := strings.Builder{}
for _, status := range report.Remotes {
b.WriteString(fmt.Sprintf("%3d ", status.PeerIP))
if status.Up {
b.WriteString("UP ")
} else {
b.WriteString("DOWN ")
}
if status.Relay && status.Direct {
b.WriteString("RELAY ")
} else if status.Server {
b.WriteString("SERVER ")
} else {
b.WriteString("CLIENT ")
}
if status.Direct {
b.WriteString("DIRECT ")
} else {
b.WriteString("RELAYED ")
}
b.WriteString(fmt.Sprintf("%45s ", status.DirectAddr))
b.WriteString(status.Name)
b.WriteString("\n")
}
fmt.Print(b.String())
}