ZeroTierOne/go/cmd/zerotier/zerotier.go

144 lines
3.5 KiB
Go
Raw Normal View History

2019-09-23 15:18:52 -07:00
/*
* Copyright (c)2019 ZeroTier, Inc.
*
* Use of this software is governed by the Business Source License included
* in the LICENSE.TXT file in the project's root directory.
*
* Change Date: 2023-01-01
*
* On the date above, in accordance with the Business Source License, use
* of this software will be governed by version 2.0 of the Apache License.
*/
/****/
package main
import (
2019-09-24 12:19:28 -07:00
"flag"
"fmt"
2019-09-24 16:44:29 -07:00
"io/ioutil"
2019-09-23 15:18:52 -07:00
"os"
2019-09-24 16:44:29 -07:00
"path"
"runtime"
"strings"
2019-09-24 12:19:28 -07:00
"zerotier/cmd/zerotier/cli"
"zerotier/pkg/zerotier"
2019-09-23 15:18:52 -07:00
)
2019-09-24 16:44:29 -07:00
func readAuthToken(basePath string) string {
data, _ := ioutil.ReadFile(path.Join(basePath, "authtoken.secret"))
if len(data) > 0 {
return string(data)
}
userHome, _ := os.UserHomeDir()
if len(userHome) > 0 {
if runtime.GOOS == "darwin" {
data, _ = ioutil.ReadFile(userHome + "/Library/Application Support/ZeroTier/authtoken.secret")
if len(data) > 0 {
return string(data)
}
data, _ = ioutil.ReadFile(userHome + "/Library/Application Support/ZeroTier/One/authtoken.secret")
if len(data) > 0 {
return string(data)
}
}
data, _ = ioutil.ReadFile(path.Join(userHome, ".zerotierauth"))
if len(data) > 0 {
return string(data)
}
data, _ = ioutil.ReadFile(path.Join(userHome, ".zeroTierOneAuthToken"))
if len(data) > 0 {
return string(data)
}
}
return ""
2019-09-23 15:18:52 -07:00
}
2019-09-25 14:16:55 -07:00
func authTokenRequired(authToken string) {
if len(authToken) == 0 {
fmt.Println("FATAL: unable to read API authorization token from service path or user home ('sudo' may be needed)")
os.Exit(1)
}
}
2019-09-23 15:18:52 -07:00
func main() {
2019-09-24 12:19:28 -07:00
globalOpts := flag.NewFlagSet("global", flag.ContinueOnError)
hflag := globalOpts.Bool("h", false, "") // support -h to be canonical with other Unix utilities
2019-09-24 16:44:29 -07:00
jflag := globalOpts.Bool("j", false, "")
pflag := globalOpts.String("p", "", "")
tflag := globalOpts.String("t", "", "")
2019-09-24 12:19:28 -07:00
err := globalOpts.Parse(os.Args[1:])
if err != nil {
2019-09-25 12:36:49 -07:00
cli.Help()
2019-09-24 12:19:28 -07:00
os.Exit(1)
return
}
args := globalOpts.Args()
if len(args) < 1 || *hflag {
2019-09-25 12:36:49 -07:00
cli.Help()
2019-09-24 12:19:28 -07:00
os.Exit(0)
return
}
var cmdArgs []string
if len(args) > 1 {
cmdArgs = args[1:]
}
2019-09-24 16:44:29 -07:00
basePath := zerotier.PlatformDefaultHomePath
if len(*pflag) > 0 {
basePath = *pflag
}
2019-09-25 14:16:55 -07:00
2019-09-24 16:44:29 -07:00
var authToken string
if len(*tflag) > 0 {
authToken = *tflag
} else {
authToken = readAuthToken(basePath)
}
authToken = strings.TrimSpace(authToken)
2019-09-24 12:19:28 -07:00
switch args[0] {
case "help":
2019-09-25 12:36:49 -07:00
cli.Help()
2019-09-24 12:19:28 -07:00
os.Exit(0)
case "version":
fmt.Printf("%d.%d.%d\n", zerotier.CoreVersionMajor, zerotier.CoreVersionMinor, zerotier.CoreVersionRevision)
os.Exit(0)
case "service":
2019-09-24 16:44:29 -07:00
cli.Service(basePath, authToken, cmdArgs)
2019-09-24 12:19:28 -07:00
case "status":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.Status(basePath, authToken, cmdArgs, *jflag)
2019-09-25 14:31:08 -07:00
case "peers", "listpeers":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.Peers(basePath, authToken, cmdArgs)
2019-09-24 12:19:28 -07:00
case "roots":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.Roots(basePath, authToken, cmdArgs)
2019-09-24 12:19:28 -07:00
case "addroot":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.AddRoot(basePath, authToken, cmdArgs)
2019-09-24 12:19:28 -07:00
case "removeroot":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.RemoveRoot(basePath, authToken, cmdArgs)
2019-09-25 14:31:08 -07:00
case "networks", "listnetworks":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.Networks(basePath, authToken, cmdArgs)
2019-09-24 12:19:28 -07:00
case "join":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.Join(basePath, authToken, cmdArgs)
2019-09-24 12:19:28 -07:00
case "leave":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.Leave(basePath, authToken, cmdArgs)
2019-09-24 12:19:28 -07:00
case "show":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.Show(basePath, authToken, cmdArgs)
2019-09-24 12:19:28 -07:00
case "set":
2019-09-25 14:16:55 -07:00
authTokenRequired(authToken)
2019-09-24 16:44:29 -07:00
cli.Set(basePath, authToken, cmdArgs)
2019-09-24 12:19:28 -07:00
}
2019-09-24 12:32:35 -07:00
2019-09-25 12:36:49 -07:00
cli.Help()
2019-09-24 12:32:35 -07:00
os.Exit(1)
2019-09-23 15:18:52 -07:00
}