lobby/ctl/main.go
Adam Štrauch 6a1ecb80a1
All checks were successful
continuous-integration/drone/push Build is passing
Resolver
Resolve API endpoint and cli command return list of hostnames
base on given label.
2021-09-20 16:10:52 +02:00

181 lines
4.1 KiB
Go

package main
import (
"flag"
"fmt"
"os"
"strings"
"github.com/by-cx/lobby/client"
"github.com/by-cx/lobby/server"
)
func Usage() {
flag.Usage()
fmt.Println("")
fmt.Println("Commands:")
fmt.Println(" resolve label returns list of hostnames with given label")
fmt.Println(" discovery returns discovery packet of the server where the client is connected to")
fmt.Println(" discoveries returns list of all registered discovery packets")
fmt.Println(" discoveries labels [LABEL] ... returns list of all registered discovery packets with given labels (OR)")
fmt.Println(" discoveries search [LABEL] ... returns list of all registered discovery packets with given label prefixes (OR)")
fmt.Println(" labels add LABEL [LABEL] ... adds new runtime labels")
fmt.Println(" labels del LABEL [LABEL] ... deletes runtime labels")
}
func main() {
config := GetConfig()
// Setup flags
proto := flag.String("proto", "", "Select HTTP or HTTPS protocol")
host := flag.String("host", "", "Hostname or IP address of lobby daemon")
port := flag.Uint("port", 0, "Port of lobby daemon")
token := flag.String("token", "", "Token needed to communicate lobby daemon, if empty auth is disabled")
jsonOutput := flag.Bool("json", false, "set output to JSON, error will be still in plain text")
flag.Parse()
// Replace empty values from flags by values from environment variables
if *proto == "" {
proto = &config.Proto
}
if *host == "" {
host = &config.Host
}
if *port == 0 {
port = &config.Port
}
if *token == "" {
token = &config.Token
}
// Validation
if *proto != "http" && *proto != "https" {
fmt.Println("Protocol can be only http or https")
}
// Setup lobby client library
client := client.LobbyClient{
Proto: strings.ToLower(*proto),
Host: *host,
Port: *port,
Token: *token,
}
// Process rest of the arguments
if len(flag.Args()) == 0 {
Usage()
os.Exit(0)
}
switch flag.Args()[0] {
case "resolve":
if len(flag.Args()) == 2 {
hostnames, err := client.Resolve(server.Label(flag.Arg(1)))
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if *jsonOutput {
printJSON(hostnames)
} else {
for _, hostname := range hostnames {
fmt.Println(hostname)
}
}
} else {
Usage()
os.Exit(0)
}
case "discoveries":
var discoveries []server.Discovery
var err error
if len(flag.Args()) > 2 {
if flag.Arg(1) == "labels" {
labels := []server.Label{}
for _, label := range flag.Args()[2:] {
labels = append(labels, server.Label(label))
}
discoveries, err = client.FindByLabels(labels)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
} else if flag.Arg(1) == "search" {
discoveries, err = client.FindByPrefixes(flag.Args()[2:])
if err != nil {
fmt.Println(err)
os.Exit(1)
}
} else {
fmt.Println("ERROR: unknown usage of discoveries arguments")
fmt.Println("")
Usage()
os.Exit(0)
}
} else {
discoveries, err = client.GetDiscoveries()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
if *jsonOutput {
printJSON(discoveries)
} else {
printDiscoveries(discoveries)
}
case "discovery":
discovery, err := client.GetDiscovery()
if err != nil {
fmt.Println(err)
}
if *jsonOutput {
printJSON(discovery)
} else {
printDiscovery(discovery)
}
case "labels":
if len(flag.Args()) < 3 {
fmt.Println("ERROR: not enough arguments for labels command")
fmt.Println("")
Usage()
os.Exit(0)
}
labels := server.Labels{}
labelsString := flag.Args()[2:]
for _, labelString := range labelsString {
labels = append(labels, server.Label(labelString))
}
if flag.Args()[1] == "add" {
err := client.AddLabels(labels)
if err != nil {
fmt.Printf("ERROR: %v\n", err)
os.Exit(2)
}
} else if flag.Args()[1] == "del" {
err := client.DeleteLabels(labels)
if err != nil {
fmt.Printf("ERROR: %v\n", err)
os.Exit(2)
}
} else {
fmt.Printf("ERROR: wrong labels subcommand\n\n")
Usage()
os.Exit(2)
}
default:
Usage()
os.Exit(0)
}
}