zerotier.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*
  2. * Copyright (c)2019 ZeroTier, Inc.
  3. *
  4. * Use of this software is governed by the Business Source License included
  5. * in the LICENSE.TXT file in the project's root directory.
  6. *
  7. * Change Date: 2023-01-01
  8. *
  9. * On the date above, in accordance with the Business Source License, use
  10. * of this software will be governed by version 2.0 of the Apache License.
  11. */
  12. /****/
  13. package main
  14. import (
  15. "flag"
  16. "fmt"
  17. "io/ioutil"
  18. "os"
  19. "path"
  20. "runtime"
  21. "strings"
  22. "zerotier/cmd/zerotier/cli"
  23. "zerotier/pkg/zerotier"
  24. )
  25. func readAuthToken(basePath string) string {
  26. data, _ := ioutil.ReadFile(path.Join(basePath, "authtoken.secret"))
  27. if len(data) > 0 {
  28. return string(data)
  29. }
  30. userHome, _ := os.UserHomeDir()
  31. if len(userHome) > 0 {
  32. if runtime.GOOS == "darwin" {
  33. data, _ = ioutil.ReadFile(userHome + "/Library/Application Support/ZeroTier/authtoken.secret")
  34. if len(data) > 0 {
  35. return string(data)
  36. }
  37. data, _ = ioutil.ReadFile(userHome + "/Library/Application Support/ZeroTier/One/authtoken.secret")
  38. if len(data) > 0 {
  39. return string(data)
  40. }
  41. }
  42. data, _ = ioutil.ReadFile(path.Join(userHome, ".zerotierauth"))
  43. if len(data) > 0 {
  44. return string(data)
  45. }
  46. data, _ = ioutil.ReadFile(path.Join(userHome, ".zeroTierOneAuthToken"))
  47. if len(data) > 0 {
  48. return string(data)
  49. }
  50. }
  51. return ""
  52. }
  53. func authTokenRequired(authToken string) {
  54. if len(authToken) == 0 {
  55. fmt.Println("FATAL: unable to read API authorization token from service path or user home ('sudo' may be needed)")
  56. os.Exit(1)
  57. }
  58. }
  59. func main() {
  60. globalOpts := flag.NewFlagSet("global", flag.ContinueOnError)
  61. hflag := globalOpts.Bool("h", false, "") // support -h to be canonical with other Unix utilities
  62. jflag := globalOpts.Bool("j", false, "")
  63. pflag := globalOpts.String("p", "", "")
  64. tflag := globalOpts.String("t", "", "")
  65. err := globalOpts.Parse(os.Args[1:])
  66. if err != nil {
  67. cli.Help()
  68. os.Exit(1)
  69. return
  70. }
  71. args := globalOpts.Args()
  72. if len(args) < 1 || *hflag {
  73. cli.Help()
  74. os.Exit(0)
  75. return
  76. }
  77. var cmdArgs []string
  78. if len(args) > 1 {
  79. cmdArgs = args[1:]
  80. }
  81. if *hflag {
  82. cli.Help()
  83. os.Exit(0)
  84. }
  85. basePath := zerotier.PlatformDefaultHomePath
  86. if len(*pflag) > 0 {
  87. basePath = *pflag
  88. }
  89. var authToken string
  90. if len(*tflag) > 0 {
  91. authToken = *tflag
  92. } else {
  93. authToken = readAuthToken(basePath)
  94. }
  95. authToken = strings.TrimSpace(authToken)
  96. switch args[0] {
  97. case "help":
  98. cli.Help()
  99. os.Exit(0)
  100. case "version":
  101. fmt.Printf("%d.%d.%d\n", zerotier.CoreVersionMajor, zerotier.CoreVersionMinor, zerotier.CoreVersionRevision)
  102. os.Exit(0)
  103. case "service":
  104. cli.Service(basePath, authToken, cmdArgs)
  105. case "status":
  106. authTokenRequired(authToken)
  107. cli.Status(basePath, authToken, cmdArgs, *jflag)
  108. case "peers", "listpeers":
  109. authTokenRequired(authToken)
  110. cli.Peers(basePath, authToken, cmdArgs, *jflag)
  111. case "roots", "listroots", "listmoons":
  112. authTokenRequired(authToken)
  113. cli.Roots(basePath, authToken, cmdArgs, *jflag)
  114. case "addroot":
  115. authTokenRequired(authToken)
  116. cli.AddRoot(basePath, authToken, cmdArgs)
  117. case "removeroot":
  118. authTokenRequired(authToken)
  119. cli.RemoveRoot(basePath, authToken, cmdArgs)
  120. case "locator":
  121. cli.Locator(cmdArgs)
  122. case "identity":
  123. cli.Identity(cmdArgs)
  124. case "networks", "listnetworks":
  125. authTokenRequired(authToken)
  126. cli.Networks(basePath, authToken, cmdArgs, *jflag)
  127. case "network":
  128. authTokenRequired(authToken)
  129. cli.Network(basePath, authToken, cmdArgs, *jflag)
  130. case "join":
  131. authTokenRequired(authToken)
  132. cli.Join(basePath, authToken, cmdArgs)
  133. case "leave":
  134. authTokenRequired(authToken)
  135. cli.Leave(basePath, authToken, cmdArgs)
  136. case "set":
  137. authTokenRequired(authToken)
  138. cli.Set(basePath, authToken, cmdArgs)
  139. }
  140. cli.Help()
  141. os.Exit(1)
  142. }