main.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gravitl/netmaker/netclient/functions"
  5. "golang.zx2c4.com/wireguard/wgctrl"
  6. nodepb "github.com/gravitl/netmaker/grpc"
  7. "flag"
  8. "os"
  9. "os/exec"
  10. "strconv"
  11. "strings"
  12. "log"
  13. )
  14. const (
  15. // name of the service
  16. name = "netclient"
  17. description = "Netmaker Daemon Service"
  18. )
  19. var password string
  20. var network string
  21. var server string
  22. var accesskey string
  23. var (
  24. wgclient *wgctrl.Client
  25. )
  26. var (
  27. wcclient nodepb.NodeServiceClient
  28. )
  29. func main() {
  30. tpassword := flag.String("p", "changeme", "This node's password for accessing the server regularly")
  31. taccesskey := flag.String("k", "badkey", "an access key generated by the server and used for one-time access (install only)")
  32. taccesstoken := flag.String("t", "badtoken", "an token generated by the server and used for one-time access (install only)")
  33. tname := flag.String("name", "noname", "give the node a name at runtime")
  34. tserver := flag.String("s", "localhost:50051", "The location (including port) of the remote gRPC server.")
  35. tnetwork := flag.String("n", "nonetwork", "The node network you are attempting to join.")
  36. tdnsoff := flag.Bool("dnsoff", false, "DNS Mode. If true, netclient will not alter system dns. false by default.")
  37. tpublicip := flag.String("ip4", "nopubip", "The node network you are attempting to join.")
  38. tnoauto := flag.Bool("na", false, "No auto mode. If true, netmclient will not be installed as a system service and you will have to retrieve updates manually via checkin command.")
  39. tipforward := flag.String("nf", "on", "No Forward mode. If true, netclient will not check for IP forwarding. This may break functionality")
  40. command := flag.String("c", "required", "The command to run")
  41. flag.Parse()
  42. getID := exec.Command("id", "-u")
  43. out, err := getID.Output()
  44. if err != nil {
  45. log.Fatal(err)
  46. }
  47. id, err := strconv.Atoi(string(out[:len(out)-1]))
  48. if err != nil {
  49. log.Fatal(err)
  50. }
  51. if id != 0 {
  52. log.Fatal("This program must be run with elevated privileges (sudo). This program installs a SystemD service and configures WireGuard and networking rules. Please re-run with sudo/root.")
  53. }
  54. _, err = exec.LookPath("wg")
  55. if err != nil {
  56. log.Println(err)
  57. log.Fatal("WireGuard not installed. Please install WireGuard (wireguard-tools) and try again.")
  58. }
  59. switch *command {
  60. case "getport":
  61. portno, err := functions.GetFreePort(51821)
  62. fmt.Printf("Port Number: %v", portno)
  63. fmt.Println("")
  64. if err != nil {
  65. log.Fatal(err)
  66. }
  67. case "required":
  68. fmt.Println("command flag 'c' is required. Pick one of |install|checkin|update|remove|")
  69. os.Exit(1)
  70. log.Fatal("Exiting")
  71. case "install":
  72. if *taccesstoken == "badtoken" && (*tnetwork == "nonetwork" || *tnetwork == "") {
  73. fmt.Println("Required, '-n'. No network provided. Exiting.")
  74. os.Exit(1)
  75. }
  76. /*
  77. if !*tnoforward {
  78. forward := exec.Command("sysctl", "net.ipv4.ip_forward")
  79. out, err := forward.Output()
  80. if err != nil {
  81. log.Fatal(err)
  82. }
  83. //s := strings.Split(string(out), " ", "\n")
  84. s := strings.Fields(string(out))
  85. if err != nil {
  86. log.Fatal(err)
  87. }
  88. if s[2] != "1" {
  89. log.Fatal("It is recommended to enable IP Forwarding. Current status is: " + s[2] + ", but should be 1. if you would like to run without IP Forwarding, re-run with flag '-nf true'")
  90. }
  91. }
  92. */
  93. fmt.Println("Beginning agent installation.")
  94. err := functions.Install(*taccesskey, *tpassword, *tserver, *tnetwork, *tnoauto, *taccesstoken, *tname, *tpublicip, *tdnsoff, *tipforward)
  95. if err != nil {
  96. fmt.Println("Error encountered while installing.")
  97. if !strings.Contains(err.Error(), "ALREADY_INSTALLED") {
  98. fmt.Println("Error installing: ", err)
  99. fmt.Println("Cleaning up (uninstall)")
  100. err = functions.Remove(*tnetwork)
  101. if err != nil {
  102. fmt.Println("Error uninstalling: ", err)
  103. fmt.Println("Wiping local.")
  104. err = functions.WipeLocal(*tnetwork)
  105. if err != nil {
  106. fmt.Println("Error removing artifacts: ", err)
  107. }
  108. err = functions.RemoveSystemDServices(*tnetwork)
  109. if err != nil {
  110. fmt.Println("Error removing services: ", err)
  111. }
  112. }
  113. os.Exit(1)
  114. } else {
  115. fmt.Println(err.Error())
  116. os.Exit(1)
  117. }
  118. }
  119. /*
  120. case "service-install":
  121. fmt.Println("Beginning service installation.")
  122. err := functions.ConfigureSystemD()
  123. if err != nil {
  124. fmt.Println("Error installing service: ", err)
  125. os.Exit(1)
  126. }
  127. case "service-uninstall":
  128. fmt.Println("Beginning service uninstall.")
  129. err := functions.RemoveSystemDServices()
  130. if err != nil {
  131. fmt.Println("Error installing service: ", err)
  132. os.Exit(1)
  133. }
  134. */
  135. case "checkin":
  136. if *tnetwork == "nonetwork" || *tnetwork == "" {
  137. fmt.Println("Required, '-n'. No network provided. Exiting.")
  138. os.Exit(1)
  139. }
  140. fmt.Println("Beginning node check in for network " + *tnetwork)
  141. err := functions.CheckIn(*tnetwork)
  142. if err != nil {
  143. fmt.Println("Error checking in: ", err)
  144. os.Exit(1)
  145. }
  146. case "remove":
  147. if *tnetwork == "nonetwork" || *tnetwork == "" {
  148. fmt.Println("Required, '-n'. No network provided. Exiting.")
  149. os.Exit(1)
  150. }
  151. fmt.Println("Beginning node cleanup.")
  152. err := functions.Remove(*tnetwork)
  153. if err != nil {
  154. /*
  155. fmt.Println("Error uninstalling: ", err)
  156. fmt.Println("Wiping local.")
  157. err = functions.WipeLocal()
  158. if err != nil {
  159. fmt.Println("Error removing artifacts: ", err)
  160. }
  161. err = functions.RemoveSystemDServices()
  162. if err != nil {
  163. fmt.Println("Error removing services: ", err)
  164. }
  165. */
  166. fmt.Println("Error deleting node: ", err)
  167. os.Exit(1)
  168. }
  169. default:
  170. fmt.Println("You must select from the following commands: install|remove|checkin", err)
  171. os.Exit(1)
  172. }
  173. fmt.Println("Command " + *command + " Executed Successfully")
  174. }