local.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package functions
  2. import (
  3. //"github.com/davecgh/go-spew/spew"
  4. "fmt"
  5. "io/ioutil"
  6. "io"
  7. "log"
  8. "os"
  9. "os/exec"
  10. )
  11. func ConfigureSystemD() error {
  12. path, err := os.Getwd()
  13. if err != nil {
  14. log.Println(err)
  15. return err
  16. }
  17. binarypath := path + "/netclient"
  18. _, err = os.Stat("/etc/netclient")
  19. if os.IsNotExist(err) {
  20. os.Mkdir("/etc/netclient", 744)
  21. } else if err != nil {
  22. fmt.Println("couldnt find or create /etc/netclient")
  23. return err
  24. }
  25. _, err = copy(binarypath, "/usr/local/bin/netclient")
  26. if err != nil {
  27. log.Println(err)
  28. return err
  29. }
  30. _, err = copy(binarypath, "/etc/netclient/netclient")
  31. if err != nil {
  32. log.Println(err)
  33. return err
  34. }
  35. systemservice := `[Unit]
  36. Description=Regularly checks for updates in peers and local config
  37. Wants=netclient.timer
  38. [Service]
  39. Type=oneshot
  40. ExecStart=/etc/netclient/netclient -c checkin
  41. [Install]
  42. WantedBy=multi-user.target
  43. `
  44. systemtimer := `[Unit]
  45. Description=Calls the Netmaker Mesh Client Service
  46. Requires=netclient.service
  47. [Timer]
  48. Unit=netclient.service
  49. OnCalendar=*:*:0/30
  50. [Install]
  51. WantedBy=timers.target
  52. `
  53. servicebytes := []byte(systemservice)
  54. timerbytes := []byte(systemtimer)
  55. err = ioutil.WriteFile("/etc/systemd/system/netclient.service", servicebytes, 0644)
  56. if err != nil {
  57. log.Println(err)
  58. return err
  59. }
  60. err = ioutil.WriteFile("/etc/systemd/system/netclient.timer", timerbytes, 0644)
  61. if err != nil {
  62. log.Println(err)
  63. return err
  64. }
  65. sysExec, err := exec.LookPath("systemctl")
  66. cmdSysEnableService := &exec.Cmd {
  67. Path: sysExec,
  68. Args: []string{ sysExec, "enable", "netclient.service" },
  69. Stdout: os.Stdout,
  70. Stderr: os.Stdout,
  71. }
  72. cmdSysStartService := &exec.Cmd {
  73. Path: sysExec,
  74. Args: []string{ sysExec, "start", "netclient.service"},
  75. Stdout: os.Stdout,
  76. Stderr: os.Stdout,
  77. }
  78. cmdSysDaemonReload := &exec.Cmd {
  79. Path: sysExec,
  80. Args: []string{ sysExec, "daemon-reload"},
  81. Stdout: os.Stdout,
  82. Stderr: os.Stdout,
  83. }
  84. cmdSysEnableTimer := &exec.Cmd {
  85. Path: sysExec,
  86. Args: []string{ sysExec, "enable", "netclient.timer" },
  87. Stdout: os.Stdout,
  88. Stderr: os.Stdout,
  89. }
  90. cmdSysStartTimer := &exec.Cmd {
  91. Path: sysExec,
  92. Args: []string{ sysExec, "start", "netclient.timer"},
  93. Stdout: os.Stdout,
  94. Stderr: os.Stdout,
  95. }
  96. err = cmdSysEnableService.Run()
  97. if err != nil {
  98. fmt.Println("Error enabling netclient.service. Please investigate.")
  99. fmt.Println(err)
  100. }
  101. err = cmdSysStartService.Run()
  102. if err != nil {
  103. fmt.Println("Error starting netclient.service. Please investigate.")
  104. fmt.Println(err)
  105. }
  106. err = cmdSysDaemonReload.Run()
  107. if err != nil {
  108. fmt.Println("Error reloading system daemons. Please investigate.")
  109. fmt.Println(err)
  110. }
  111. err = cmdSysEnableTimer.Run()
  112. if err != nil {
  113. fmt.Println("Error enabling netclient.timer. Please investigate.")
  114. fmt.Println(err)
  115. }
  116. err = cmdSysStartTimer.Run()
  117. if err != nil {
  118. fmt.Println("Error starting netclient.timer. Please investigate.")
  119. fmt.Println(err)
  120. }
  121. return nil
  122. }
  123. func RemoveSystemDServices() error {
  124. sysExec, err := exec.LookPath("systemctl")
  125. cmdSysStopService := &exec.Cmd {
  126. Path: sysExec,
  127. Args: []string{ sysExec, "stop", "netclient.service" },
  128. Stdout: os.Stdout,
  129. Stderr: os.Stdout,
  130. }
  131. cmdSysDisableService := &exec.Cmd {
  132. Path: sysExec,
  133. Args: []string{ sysExec, "disable", "netclient.service"},
  134. Stdout: os.Stdout,
  135. Stderr: os.Stdout,
  136. }
  137. cmdSysDaemonReload := &exec.Cmd {
  138. Path: sysExec,
  139. Args: []string{ sysExec, "daemon-reload"},
  140. Stdout: os.Stdout,
  141. Stderr: os.Stdout,
  142. }
  143. cmdSysResetFailed := &exec.Cmd {
  144. Path: sysExec,
  145. Args: []string{ sysExec, "reset-failed"},
  146. Stdout: os.Stdout,
  147. Stderr: os.Stdout,
  148. }
  149. cmdSysStopTimer := &exec.Cmd {
  150. Path: sysExec,
  151. Args: []string{ sysExec, "stop", "netclient.timer" },
  152. Stdout: os.Stdout,
  153. Stderr: os.Stdout,
  154. }
  155. cmdSysDisableTimer := &exec.Cmd {
  156. Path: sysExec,
  157. Args: []string{ sysExec, "disable", "netclient.timer"},
  158. Stdout: os.Stdout,
  159. Stderr: os.Stdout,
  160. }
  161. err = cmdSysStopService.Run()
  162. if err != nil {
  163. fmt.Println("Error stopping netclient.service. Please investigate.")
  164. fmt.Println(err)
  165. }
  166. err = cmdSysDisableService.Run()
  167. if err != nil {
  168. fmt.Println("Error disabling netclient.service. Please investigate.")
  169. fmt.Println(err)
  170. }
  171. err = cmdSysStopTimer.Run()
  172. if err != nil {
  173. fmt.Println("Error stopping netclient.timer. Please investigate.")
  174. fmt.Println(err)
  175. }
  176. err = cmdSysDisableTimer.Run()
  177. if err != nil {
  178. fmt.Println("Error disabling netclient.timer. Please investigate.")
  179. fmt.Println(err)
  180. }
  181. err = os.Remove("/etc/systemd/system/netclient.service")
  182. err = os.Remove("/etc/systemd/system/netclient.timer")
  183. if err != nil {
  184. fmt.Println("Error removing file. Please investigate.")
  185. fmt.Println(err)
  186. }
  187. err = cmdSysDaemonReload.Run()
  188. if err != nil {
  189. fmt.Println("Error reloading system daemons. Please investigate.")
  190. fmt.Println(err)
  191. }
  192. err = cmdSysResetFailed.Run()
  193. if err != nil {
  194. fmt.Println("Error reseting failed system services. Please investigate.")
  195. fmt.Println(err)
  196. }
  197. return err
  198. }
  199. func copy(src, dst string) (int64, error) {
  200. sourceFileStat, err := os.Stat(src)
  201. if err != nil {
  202. return 0, err
  203. }
  204. if !sourceFileStat.Mode().IsRegular() {
  205. return 0, fmt.Errorf("%s is not a regular file", src)
  206. }
  207. source, err := os.Open(src)
  208. if err != nil {
  209. return 0, err
  210. }
  211. defer source.Close()
  212. destination, err := os.Create(dst)
  213. if err != nil {
  214. return 0, err
  215. }
  216. defer destination.Close()
  217. nBytes, err := io.Copy(destination, source)
  218. err = os.Chmod(dst, 0755)
  219. if err != nil {
  220. log.Println(err)
  221. }
  222. return nBytes, err
  223. }