2021-09-04 23:27:39 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
|
2021-09-06 22:46:48 +00:00
|
|
|
"github.com/by-cx/lobby/client"
|
|
|
|
"github.com/by-cx/lobby/server"
|
2021-09-04 23:27:39 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func Usage() {
|
|
|
|
flag.Usage()
|
|
|
|
fmt.Println("")
|
|
|
|
fmt.Println("Commands:")
|
2021-09-20 14:10:52 +00:00
|
|
|
fmt.Println(" resolve label returns list of hostnames with given label")
|
2021-09-05 15:30:21 +00:00
|
|
|
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")
|
2021-09-04 23:27:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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")
|
2021-09-05 19:35:10 +00:00
|
|
|
jsonOutput := flag.Bool("json", false, "set output to JSON, error will be still in plain text")
|
2021-09-04 23:27:39 +00:00
|
|
|
|
|
|
|
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] {
|
2021-09-20 14:10:52 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
2021-09-04 23:27:39 +00:00
|
|
|
case "discoveries":
|
2021-09-05 15:30:21 +00:00
|
|
|
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)
|
|
|
|
}
|
2021-09-04 23:27:39 +00:00
|
|
|
}
|
2021-09-05 15:30:21 +00:00
|
|
|
|
2021-09-05 19:35:10 +00:00
|
|
|
if *jsonOutput {
|
|
|
|
printJSON(discoveries)
|
|
|
|
} else {
|
|
|
|
printDiscoveries(discoveries)
|
|
|
|
}
|
2021-09-04 23:27:39 +00:00
|
|
|
case "discovery":
|
|
|
|
discovery, err := client.GetDiscovery()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
2021-09-05 19:35:10 +00:00
|
|
|
|
|
|
|
if *jsonOutput {
|
|
|
|
printJSON(discovery)
|
|
|
|
} else {
|
|
|
|
printDiscovery(discovery)
|
|
|
|
}
|
2021-09-04 23:27:39 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|