local.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. package local
  2. import (
  3. //"github.com/davecgh/go-spew/spew"
  4. "errors"
  5. "github.com/gravitl/netmaker/netclient/config"
  6. "log"
  7. "io/ioutil"
  8. "path/filepath"
  9. "io"
  10. "strings"
  11. "os"
  12. "os/exec"
  13. )
  14. func RunCmds(commands []string) error {
  15. var err error
  16. for _, command := range commands {
  17. args := strings.Fields(command)
  18. out, err := exec.Command(args[0], args[1:]...).Output()
  19. if string(out) != "" {
  20. log.Println(string(out))
  21. }
  22. if err != nil {
  23. return err
  24. }
  25. }
  26. return err
  27. }
  28. func FileExists(f string) bool {
  29. info, err := os.Stat(f)
  30. if os.IsNotExist(err) {
  31. return false
  32. }
  33. return !info.IsDir()
  34. }
  35. func ConfigureSystemD(network string) error {
  36. /*
  37. path, err := os.Getwd()
  38. if err != nil {
  39. log.Println(err)
  40. return err
  41. }
  42. */
  43. //binarypath := path + "/netclient"
  44. dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
  45. if err != nil {
  46. return err
  47. }
  48. binarypath := dir + "/netclient"
  49. _, err = os.Stat("/etc/netclient")
  50. if os.IsNotExist(err) {
  51. os.Mkdir("/etc/netclient", 744)
  52. } else if err != nil {
  53. log.Println("couldnt find or create /etc/netclient")
  54. return err
  55. }
  56. if !FileExists("/usr/local/bin/netclient") {
  57. os.Symlink("/etc/netclient/netclient","/usr/local/bin/netclient")
  58. /*
  59. _, err = copy(binarypath, "/usr/local/bin/netclient")
  60. if err != nil {
  61. log.Println(err)
  62. return err
  63. }
  64. */
  65. }
  66. if !FileExists("/etc/netclient/netclient") {
  67. _, err = copy(binarypath, "/etc/netclient/netclient")
  68. if err != nil {
  69. log.Println(err)
  70. return err
  71. }
  72. }
  73. systemservice := `[Unit]
  74. Description=network check for remote peers and local config
  75. Wants=netclient.timer
  76. [Service]
  77. Type=simple
  78. ExecStart=/etc/netclient/netclient checkin -n %i
  79. [Install]
  80. WantedBy=multi-user.target
  81. `
  82. systemtimer := `[Unit]
  83. Description=Calls the Netmaker Mesh Client Service
  84. `
  85. systemtimer = systemtimer + "Requires=netclient@"+network+".service"
  86. systemtimer = systemtimer +
  87. `
  88. [Timer]
  89. `
  90. systemtimer = systemtimer + "Unit=netclient@"+network+".service"
  91. systemtimer = systemtimer +
  92. `
  93. OnCalendar=*:*:0/30
  94. [Install]
  95. WantedBy=timers.target
  96. `
  97. servicebytes := []byte(systemservice)
  98. timerbytes := []byte(systemtimer)
  99. if !FileExists("/etc/systemd/system/[email protected]") {
  100. err = ioutil.WriteFile("/etc/systemd/system/[email protected]", servicebytes, 0644)
  101. if err != nil {
  102. log.Println(err)
  103. return err
  104. }
  105. }
  106. if !FileExists("/etc/systemd/system/netclient-"+network+".timer") {
  107. err = ioutil.WriteFile("/etc/systemd/system/netclient-"+network+".timer", timerbytes, 0644)
  108. if err != nil {
  109. log.Println(err)
  110. return err
  111. }
  112. }
  113. //sysExec, err := exec.LookPath("systemctl")
  114. cmdSysEnableService := exec.Command("systemctl", "enable", "[email protected]")/*&exec.Cmd {
  115. Path: sysExec,
  116. Args: []string{ sysExec, "enable", "[email protected]" },
  117. Stdout: os.Stdout,
  118. Stderr: os.Stdout,
  119. }*/
  120. cmdSysDaemonReload := exec.Command("systemctl", "daemon-reload")/*&exec.Cmd {
  121. Path: sysExec,
  122. Args: []string{ sysExec, "daemon-reload"},
  123. Stdout: os.Stdout,
  124. Stderr: os.Stdout,
  125. }*/
  126. cmdSysEnableTimer := exec.Command("systemctl", "enable", "netclient-"+network+".timer")/*&exec.Cmd {
  127. Path: sysExec,
  128. Args: []string{ sysExec, "enable", "netclient-"+network+".timer" },
  129. Stdout: os.Stdout,
  130. Stderr: os.Stdout,
  131. }*/
  132. cmdSysStartTimer := exec.Command("systemctl", "start", "netclient-"+network+".timer")/*&exec.Cmd {
  133. Path: sysExec,
  134. Args: []string{ sysExec, "start", "netclient-"+network+".timer"},
  135. Stdout: os.Stdout,
  136. Stderr: os.Stdout,
  137. }*/
  138. err = cmdSysEnableService.Run()
  139. if err != nil {
  140. log.Println("Error enabling [email protected]. Please investigate.")
  141. log.Println(err)
  142. }
  143. err = cmdSysDaemonReload.Run()
  144. if err != nil {
  145. log.Println("Error reloading system daemons. Please investigate.")
  146. log.Println(err)
  147. }
  148. err = cmdSysEnableTimer.Run()
  149. if err != nil {
  150. log.Println("Error enabling netclient.timer. Please investigate.")
  151. log.Println(err)
  152. }
  153. err = cmdSysStartTimer.Run()
  154. if err != nil {
  155. log.Println("Error starting netclient-"+network+".timer. Please investigate.")
  156. log.Println(err)
  157. }
  158. return nil
  159. }
  160. func isOnlyService(network string) (bool, error) {
  161. isonly := false
  162. files, err := filepath.Glob("/etc/netclient/netconfig-*")
  163. if err != nil {
  164. return isonly, err
  165. }
  166. count := len(files)
  167. if count == 0 {
  168. isonly = true
  169. }
  170. return isonly, err
  171. }
  172. func RemoveSystemDServices(network string) error {
  173. //sysExec, err := exec.LookPath("systemctl")
  174. fullremove, err := isOnlyService(network)
  175. if err != nil {
  176. log.Println(err)
  177. }
  178. cmdSysDisableService := exec.Command("systemctl","disable","[email protected]")
  179. cmdSysDaemonReload := exec.Command("systemctl","daemon-reload")
  180. cmdSysResetFailed := exec.Command("systemctl","reset-failed")
  181. cmdSysStopTimer := exec.Command("systemctl", "stop", "netclient-"+network+".timer")
  182. cmdSysDisableTimer := exec.Command("systemctl", "disable", "netclient-"+network+".timer")
  183. if err != nil {
  184. log.Println("Error stopping [email protected]. Please investigate.")
  185. log.Println(err)
  186. }
  187. if fullremove {
  188. err = cmdSysDisableService.Run()
  189. if err != nil {
  190. log.Println("Error disabling [email protected]. Please investigate.")
  191. log.Println(err)
  192. }
  193. }
  194. err = cmdSysStopTimer.Run()
  195. if err != nil {
  196. log.Println("Error stopping netclient-"+network+".timer. Please investigate.")
  197. log.Println(err)
  198. }
  199. err = cmdSysDisableTimer.Run()
  200. if err != nil {
  201. log.Println("Error disabling netclient-"+network+".timer. Please investigate.")
  202. log.Println(err)
  203. }
  204. if fullremove {
  205. if FileExists("/etc/systemd/system/[email protected]") {
  206. err = os.Remove("/etc/systemd/system/[email protected]")
  207. }
  208. }
  209. if FileExists("/etc/systemd/system/netclient-"+network+".timer") {
  210. err = os.Remove("/etc/systemd/system/netclient-"+network+".timer")
  211. }
  212. if err != nil {
  213. log.Println("Error removing file. Please investigate.")
  214. log.Println(err)
  215. }
  216. err = cmdSysDaemonReload.Run()
  217. if err != nil {
  218. log.Println("Error reloading system daemons. Please investigate.")
  219. log.Println(err)
  220. }
  221. err = cmdSysResetFailed.Run()
  222. if err != nil {
  223. log.Println("Error reseting failed system services. Please investigate.")
  224. log.Println(err)
  225. }
  226. return err
  227. }
  228. func WipeLocal(network string) error{
  229. cfg, err := config.ReadConfig(network)
  230. if err != nil {
  231. return err
  232. }
  233. nodecfg := cfg.Node
  234. ifacename := nodecfg.Interface
  235. //home, err := homedir.Dir()
  236. home := "/etc/netclient"
  237. if FileExists(home + "/netconfig-" + network) {
  238. _ = os.Remove(home + "/netconfig-" + network)
  239. }
  240. if FileExists(home + "/nettoken-" + network) {
  241. _ = os.Remove(home + "/nettoken-" + network)
  242. }
  243. if FileExists(home + "/wgkey-" + network) {
  244. _ = os.Remove(home + "/wgkey-" + network)
  245. }
  246. ipExec, err := exec.LookPath("ip")
  247. if ifacename != "" {
  248. cmdIPLinkDel := &exec.Cmd {
  249. Path: ipExec,
  250. Args: []string{ ipExec, "link", "del", ifacename },
  251. Stdout: os.Stdout,
  252. Stderr: os.Stdout,
  253. }
  254. err = cmdIPLinkDel.Run()
  255. if err != nil {
  256. log.Println(err)
  257. }
  258. if nodecfg.PostDown != "" {
  259. runcmds := strings.Split(nodecfg.PostDown, "; ")
  260. err = RunCmds(runcmds)
  261. if err != nil {
  262. log.Println("Error encountered running PostDown: " + err.Error())
  263. }
  264. }
  265. }
  266. return err
  267. }
  268. func WipeGRPCClient() error{
  269. home := "/etc/netclient"
  270. _ = os.Remove(home + "/netconfig-global-001")
  271. ipExec, err := exec.LookPath("ip")
  272. cmdIPLinkDel := &exec.Cmd {
  273. Path: ipExec,
  274. Args: []string{ ipExec, "link", "del", "grpc-wg-001" },
  275. Stdout: os.Stdout,
  276. Stderr: os.Stdout,
  277. }
  278. err = cmdIPLinkDel.Run()
  279. return err
  280. }
  281. func HasNetwork(network string) bool{
  282. return FileExists("/etc/systemd/system/netclient-"+network+".timer") ||
  283. FileExists("/etc/netclient/netconfig-"+network)
  284. }
  285. func copy(src, dst string) (int64, error) {
  286. sourceFileStat, err := os.Stat(src)
  287. if err != nil {
  288. return 0, err
  289. }
  290. if !sourceFileStat.Mode().IsRegular() {
  291. return 0, errors.New(src + " is not a regular file")
  292. }
  293. source, err := os.Open(src)
  294. if err != nil {
  295. return 0, err
  296. }
  297. defer source.Close()
  298. destination, err := os.Create(dst)
  299. if err != nil {
  300. return 0, err
  301. }
  302. defer destination.Close()
  303. nBytes, err := io.Copy(destination, source)
  304. err = os.Chmod(dst, 0755)
  305. if err != nil {
  306. log.Println(err)
  307. }
  308. return nBytes, err
  309. }