macos.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package daemon
  2. import (
  3. "log"
  4. "os"
  5. "time"
  6. "github.com/gravitl/netmaker/logger"
  7. "github.com/gravitl/netmaker/netclient/ncutils"
  8. )
  9. const MAC_SERVICE_NAME = "com.gravitl.netclient"
  10. const MAC_EXEC_DIR = "/usr/local/bin/"
  11. // SetupMacDaemon - Creates a daemon service from the netclient under LaunchAgents for MacOS
  12. func SetupMacDaemon() error {
  13. binarypath, err := os.Executable()
  14. if err != nil {
  15. return err
  16. }
  17. if ncutils.FileExists(MAC_EXEC_DIR + "netclient") {
  18. logger.Log(0, "updating netclient binary in", MAC_EXEC_DIR)
  19. }
  20. err = ncutils.Copy(binarypath, MAC_EXEC_DIR+"netclient")
  21. if err != nil {
  22. logger.Log(0, err.Error())
  23. return err
  24. }
  25. err = CreateMacService(MAC_SERVICE_NAME)
  26. if err != nil {
  27. return err
  28. }
  29. _, err = ncutils.RunCmd("launchctl load /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
  30. return err
  31. }
  32. // CleanupMac - Removes the netclient checkin daemon from LaunchDaemons
  33. func CleanupMac() {
  34. _, err := ncutils.RunCmd("launchctl unload /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
  35. if ncutils.FileExists("/Library/LaunchDaemons/" + MAC_SERVICE_NAME + ".plist") {
  36. err = os.Remove("/Library/LaunchDaemons/" + MAC_SERVICE_NAME + ".plist")
  37. }
  38. if err != nil {
  39. logger.Log(1, err.Error())
  40. }
  41. os.RemoveAll(ncutils.GetNetclientPath())
  42. os.Remove(MAC_EXEC_DIR + "netclient")
  43. }
  44. // RestartLaunchD - restart launch daemon
  45. func RestartLaunchD() {
  46. ncutils.RunCmd("launchctl unload /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
  47. time.Sleep(time.Second >> 2)
  48. ncutils.RunCmd("launchctl load /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
  49. }
  50. // StopLaunchD - stop launch daemon
  51. func StopLaunchD() {
  52. ncutils.RunCmd("launchctl unload /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
  53. }
  54. // CreateMacService - Creates the mac service file for LaunchDaemons
  55. func CreateMacService(servicename string) error {
  56. _, err := os.Stat("/Library/LaunchDaemons")
  57. if os.IsNotExist(err) {
  58. os.Mkdir("/Library/LaunchDaemons", 0755)
  59. } else if err != nil {
  60. log.Println("couldnt find or create /Library/LaunchDaemons")
  61. return err
  62. }
  63. daemonstring := MacDaemonString()
  64. daemonbytes := []byte(daemonstring)
  65. if !ncutils.FileExists("/Library/LaunchDaemons/com.gravitl.netclient.plist") {
  66. err = os.WriteFile("/Library/LaunchDaemons/com.gravitl.netclient.plist", daemonbytes, 0644)
  67. }
  68. return err
  69. }
  70. // MacDaemonString - the file contents for the mac netclient daemon service (launchdaemon)
  71. func MacDaemonString() string {
  72. return `<?xml version='1.0' encoding='UTF-8'?>
  73. <!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\" >
  74. <plist version='1.0'>
  75. <dict>
  76. <key>Label</key><string>com.gravitl.netclient</string>
  77. <key>ProgramArguments</key>
  78. <array>
  79. <string>/usr/local/bin/netclient</string>
  80. <string>daemon</string>
  81. </array>
  82. <key>StandardOutPath</key><string>/var/log/com.gravitl.netclient.log</string>
  83. <key>StandardErrorPath</key><string>/var/log/com.gravitl.netclient.log</string>
  84. <key>RunAtLoad</key>
  85. <true/>
  86. <key>KeepAlive</key>
  87. <true/>
  88. <key>AbandonProcessGroup</key><true/>
  89. <key>EnvironmentVariables</key>
  90. <dict>
  91. <key>PATH</key>
  92. <string>/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  93. </dict>
  94. </dict>
  95. </plist>
  96. `
  97. }
  98. // MacTemplateData - struct to represent the mac service
  99. type MacTemplateData struct {
  100. Label string
  101. Interval string
  102. }