package ganserv import ( "bufio" "fmt" "log" "os" "os/exec" "os/user" "runtime" "strings" ) func TryLoadorAskUserForAuthkey() string { //Check for zt auth token value, exists := os.LookupEnv("ZT_AUTH") if !exists { log.Println("Environment variable ZT_AUTH not defined. Trying to load authtoken from file.") } else { return value } authKey := "" if runtime.GOOS == "windows" { b, err := os.ReadFile("C:\\ProgramData\\ZeroTier\\One\\authtoken.secret") if err == nil { log.Println("Zerotier authkey loaded") authKey = string(b) } else { log.Println("Unable to read authkey at C:\\ProgramData\\ZeroTier\\One\\authtoken.secret: ", err.Error()) } } else if runtime.GOOS == "linux" { if isRoot() { //Try to read from source using sudo ak, err := readAuthTokenAsRoot() if err == nil { log.Println("Zerotier authkey loaded") authKey = strings.TrimSpace(ak) } else { log.Println("Unable to read authkey at /var/lib/zerotier-one/authtoken.secret: ", err.Error()) } } else { //Try read from source b, err := os.ReadFile("/var/lib/zerotier-one/authtoken.secret") if err == nil { log.Println("Zerotier authkey loaded") authKey = string(b) } else { log.Println("Unable to read authkey at /var/lib/zerotier-one/authtoken.secret: ", err.Error()) } } } else if runtime.GOOS == "darwin" { b, err := os.ReadFile("/Library/Application Support/ZeroTier/One/authtoken.secret") if err == nil { log.Println("Zerotier authkey loaded") authKey = string(b) } else { log.Println("Unable to read authkey at /Library/Application Support/ZeroTier/One/authtoken.secret ", err.Error()) } } authKey = strings.TrimSpace(authKey) if authKey == "" { //Ask user for input reader := bufio.NewReader(os.Stdin) fmt.Println("Please enter the Zerotier authtoken manually: ") input, _ := reader.ReadString('\n') return strings.TrimSpace(input) } return "" } //Use sudo to read auth token on linux like systems func readAuthTokenAsRoot() (string, error) { cmd := exec.Command("sudo", "cat", "/var/lib/zerotier-one/authtoken.secret") output, err := cmd.Output() if err != nil { return "", err } fmt.Println("CMDOUTPUT", string(output)) return string(output), nil } //Check if the user is root on linux func isRoot() bool { currentUser, err := user.Current() if err != nil { return false } return currentUser.Username == "root" }