systemd.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package daemon
  2. import (
  3. //"github.com/davecgh/go-spew/spew"
  4. "log"
  5. "os"
  6. "path/filepath"
  7. "time"
  8. "github.com/gravitl/netmaker/logger"
  9. "github.com/gravitl/netmaker/netclient/ncutils"
  10. )
  11. const EXEC_DIR = "/sbin/"
  12. // SetupSystemDDaemon - sets system daemon for supported machines
  13. func SetupSystemDDaemon() error {
  14. if ncutils.IsWindows() {
  15. return nil
  16. }
  17. binarypath, err := os.Executable()
  18. if err != nil {
  19. return err
  20. }
  21. _, err = os.Stat("/etc/netclient/config")
  22. if os.IsNotExist(err) {
  23. os.MkdirAll("/etc/netclient/config", 0744)
  24. } else if err != nil {
  25. log.Println("couldnt find or create /etc/netclient")
  26. return err
  27. }
  28. //install binary
  29. if ncutils.FileExists(EXEC_DIR + "netclient") {
  30. logger.Log(0, "updating netclient binary in", EXEC_DIR)
  31. }
  32. err = ncutils.Copy(binarypath, EXEC_DIR+"netclient")
  33. if err != nil {
  34. logger.Log(0, err.Error())
  35. return err
  36. }
  37. systemservice := `[Unit]
  38. Description=Netclient Daemon
  39. Documentation=https://docs.netmaker.org https://k8s.netmaker.org
  40. After=network-online.target
  41. Wants=network-online.target
  42. [Service]
  43. User=root
  44. Type=simple
  45. ExecStartPre=/bin/sleep 17
  46. ExecStart=/sbin/netclient daemon
  47. Restart=on-failure
  48. RestartSec=15s
  49. [Install]
  50. WantedBy=multi-user.target
  51. `
  52. servicebytes := []byte(systemservice)
  53. if !ncutils.FileExists("/etc/systemd/system/netclient.service") {
  54. err = os.WriteFile("/etc/systemd/system/netclient.service", servicebytes, 0644)
  55. if err != nil {
  56. logger.Log(0, err.Error())
  57. return err
  58. }
  59. }
  60. _, _ = ncutils.RunCmd("systemctl enable netclient.service", true)
  61. _, _ = ncutils.RunCmd("systemctl daemon-reload", true)
  62. _, _ = ncutils.RunCmd("systemctl start netclient.service", true)
  63. return nil
  64. }
  65. // RestartSystemD - restarts systemd service
  66. func RestartSystemD() {
  67. logger.Log(1, "restarting netclient.service")
  68. time.Sleep(time.Second)
  69. _, _ = ncutils.RunCmd("systemctl restart netclient.service", true)
  70. }
  71. // CleanupLinux - cleans up neclient configs
  72. func CleanupLinux() {
  73. if _, err := ncutils.RunCmd("systemctl stop netclient", false); err != nil {
  74. logger.Log(0, "failed to stop netclient service", err.Error())
  75. }
  76. RemoveSystemDServices()
  77. if err := os.RemoveAll(ncutils.GetNetclientPath()); err != nil {
  78. logger.Log(1, "Removing netclient configs: ", err.Error())
  79. }
  80. if err := os.Remove(EXEC_DIR + "netclient"); err != nil {
  81. logger.Log(1, "Removing netclient binary: ", err.Error())
  82. }
  83. }
  84. // StopSystemD - tells system to stop systemd
  85. func StopSystemD() {
  86. ncutils.RunCmd("systemctl stop netclient.service", false)
  87. }
  88. // RemoveSystemDServices - removes the systemd services on a machine
  89. func RemoveSystemDServices() error {
  90. //sysExec, err := exec.LookPath("systemctl")
  91. var err error
  92. if !ncutils.IsWindows() && isOnlyService() {
  93. if err != nil {
  94. logger.Log(0, err.Error())
  95. }
  96. ncutils.RunCmd("systemctl disable netclient.service", false)
  97. ncutils.RunCmd("systemctl disable netclient.timer", false)
  98. if ncutils.FileExists("/etc/systemd/system/netclient.service") {
  99. err = os.Remove("/etc/systemd/system/netclient.service")
  100. if err != nil {
  101. logger.Log(0, "Error removing /etc/systemd/system/netclient.service. Please investigate.")
  102. }
  103. }
  104. if ncutils.FileExists("/etc/systemd/system/netclient.timer") {
  105. err = os.Remove("/etc/systemd/system/netclient.timer")
  106. if err != nil {
  107. logger.Log(0, "Error removing /etc/systemd/system/netclient.timer. Please investigate.")
  108. }
  109. }
  110. ncutils.RunCmd("systemctl daemon-reload", false)
  111. ncutils.RunCmd("systemctl reset-failed", false)
  112. logger.Log(0, "removed systemd remnants if any existed")
  113. }
  114. return nil
  115. }
  116. func isOnlyService() bool {
  117. files, err := filepath.Glob("/etc/netclient/config/netconfig-*")
  118. if err != nil {
  119. return false
  120. }
  121. return len(files) == 0
  122. }