macos.go 3.3 KB

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