zerotier.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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 "selftest":
  104. cli.SelfTest()
  105. os.Exit(0)
  106. case "service":
  107. cli.Service(basePath, authToken, cmdArgs)
  108. case "status":
  109. authTokenRequired(authToken)
  110. cli.Status(basePath, authToken, cmdArgs, *jflag)
  111. case "peers", "listpeers":
  112. authTokenRequired(authToken)
  113. cli.Peers(basePath, authToken, cmdArgs, *jflag)
  114. case "roots", "listroots", "listmoons":
  115. authTokenRequired(authToken)
  116. cli.Roots(basePath, authToken, cmdArgs, *jflag)
  117. case "addroot":
  118. authTokenRequired(authToken)
  119. cli.AddRoot(basePath, authToken, cmdArgs)
  120. case "removeroot":
  121. authTokenRequired(authToken)
  122. cli.RemoveRoot(basePath, authToken, cmdArgs)
  123. case "identity":
  124. cli.Identity(cmdArgs)
  125. case "networks", "listnetworks":
  126. authTokenRequired(authToken)
  127. cli.Networks(basePath, authToken, cmdArgs, *jflag)
  128. case "network":
  129. authTokenRequired(authToken)
  130. cli.Network(basePath, authToken, cmdArgs, *jflag)
  131. case "join":
  132. authTokenRequired(authToken)
  133. cli.Join(basePath, authToken, cmdArgs)
  134. case "leave":
  135. authTokenRequired(authToken)
  136. cli.Leave(basePath, authToken, cmdArgs)
  137. case "set":
  138. authTokenRequired(authToken)
  139. cli.Set(basePath, authToken, cmdArgs)
  140. }
  141. cli.Help()
  142. os.Exit(1)
  143. }