macos.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package daemon
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "text/template"
  7. "github.com/gravitl/netmaker/netclient/ncutils"
  8. )
  9. const MAC_SERVICE_NAME = "com.gravitl.netclient"
  10. func SetupMacDaemon() error {
  11. _, errN := os.Stat("~/Library/LaunchAgents")
  12. if os.IsNotExist(errN) {
  13. os.Mkdir("~/Library/LaunchAgents", 0755)
  14. }
  15. err := CreateMacService(MAC_SERVICE_NAME)
  16. if err != nil {
  17. return err
  18. }
  19. _, err = ncutils.RunCmd("launchctl load /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
  20. return err
  21. }
  22. func CleanupMac() {
  23. _, err := ncutils.RunCmd("launchctl unload /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
  24. if ncutils.FileExists("/Library/LaunchDaemons/" + MAC_SERVICE_NAME + ".plist") {
  25. err = os.Remove("/Library/LaunchDaemons/" + MAC_SERVICE_NAME + ".plist")
  26. }
  27. if err != nil {
  28. ncutils.PrintLog(err.Error(), 1)
  29. }
  30. os.RemoveAll(ncutils.GetNetclientPath())
  31. }
  32. func CreateMacService(servicename string) error {
  33. tdata := MacTemplateData{
  34. Label: servicename,
  35. Interval: "15",
  36. }
  37. _, err := os.Stat("/Library/LaunchDaemons")
  38. if os.IsNotExist(err) {
  39. os.Mkdir("/Library/LaunchDaemons", 0755)
  40. } else if err != nil {
  41. log.Println("couldnt find or create /Library/LaunchDaemons")
  42. return err
  43. }
  44. fileLoc := fmt.Sprintf("/Library/LaunchDaemons/%s.plist", tdata.Label)
  45. launchdFile, err := os.Open(fileLoc)
  46. if err != nil {
  47. return err
  48. }
  49. launchdTemplate := template.Must(template.New("launchdTemplate").Parse(MacTemplate()))
  50. return launchdTemplate.Execute(launchdFile, tdata)
  51. }
  52. func MacTemplate() string {
  53. return `
  54. <?xml version='1.0' encoding='UTF-8'?>
  55. <!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\" >
  56. <plist version='1.0'>
  57. <dict>
  58. <key>Label</key><string>{{.Label}}</string>
  59. <key>ProgramArguments</key>
  60. <array>
  61. <string>/etc/netclient/netclient</string>
  62. <string>checkin</string>
  63. <string>-n</string>
  64. <string>all</string>
  65. </array>
  66. <key>StandardOutPath</key><string>/etc/netclient/{{.Label}}.log</string>
  67. <key>StandardErrorPath</key><string>/etc/netclient/{{.Label}}.log</string>
  68. <key>AbandonProcessGroup</key><true/>
  69. <key>StartInterval</key>
  70. <integer>{{.Interval}}</integer>
  71. <key>EnvironmentVariables</key>
  72. <dict>
  73. <key>PATH</key>
  74. <string>/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  75. </dict>
  76. </dict>
  77. </plist>
  78. </plist>
  79. `
  80. }
  81. type MacTemplateData struct {
  82. Label string
  83. Interval string
  84. }