78 lines
1.7 KiB
Go
78 lines
1.7 KiB
Go
package utils
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func User_input(ctx context.Context, q string) (string, bool) {
|
|
c := make(chan string)
|
|
go func() {
|
|
fmt.Print(q)
|
|
reader := bufio.NewReader(os.Stdin)
|
|
answer, _ := reader.ReadString('\n')
|
|
r, _ := regexp.Compile(`[\n\r]`)
|
|
answer = string(r.ReplaceAll([]byte(answer), []byte("")))
|
|
c <- answer
|
|
}()
|
|
|
|
select {
|
|
case <-ctx.Done():
|
|
return "", true
|
|
case a := <-c:
|
|
return a, false
|
|
}
|
|
}
|
|
|
|
func server_url_to_name(server string) string {
|
|
host, _, err := net.SplitHostPort(server)
|
|
if err != nil {
|
|
logrus.Fatalf("Invalid server: %s", err)
|
|
}
|
|
return host
|
|
}
|
|
|
|
func ServerInput(ctx context.Context, server string) (address, name string, err error) {
|
|
if server == "" { // no arg provided, interactive input
|
|
var cancelled bool
|
|
server, cancelled = User_input(ctx, "Enter Server: ")
|
|
if cancelled {
|
|
return "", "", context.Canceled
|
|
}
|
|
}
|
|
|
|
if strings.HasPrefix(server, "realm:") { // for realms use api to get ip address
|
|
realm_info := strings.Split(server, ":")
|
|
id := ""
|
|
if len(realm_info) == 3 {
|
|
id = realm_info[2]
|
|
}
|
|
name, address, err = get_realm(context.Background(), GetRealmsApi(), realm_info[1], id)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
name = CleanupName(name)
|
|
} else if strings.HasSuffix(server, ".pcap") || strings.HasSuffix(server, ".pcap2") {
|
|
s := strings.Split(server, ".")
|
|
name = strings.Join(s[:len(s)-1], ".")
|
|
address = server
|
|
} else {
|
|
// if an actual server address if given
|
|
// add port if necessary
|
|
address = server
|
|
if len(strings.Split(address, ":")) == 1 {
|
|
address += ":19132"
|
|
}
|
|
name = server_url_to_name(address)
|
|
}
|
|
|
|
return address, name, nil
|
|
}
|