windows.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package daemon
  2. import (
  3. "fmt"
  4. "io"
  5. "io/ioutil"
  6. "log"
  7. "net/http"
  8. "os"
  9. "strings"
  10. "github.com/gravitl/netmaker/netclient/ncutils"
  11. )
  12. func SetupWindowsDaemon() error {
  13. if !ncutils.FileExists(ncutils.GetNetclientPathSpecific() + "winsw.xml") {
  14. if err := writeServiceConfig(); err != nil {
  15. return err
  16. }
  17. }
  18. if !ncutils.FileExists(ncutils.GetNetclientPathSpecific() + "winsw.exe") {
  19. ncutils.Log("performing first time daemon setup")
  20. if !ncutils.FileExists(".\\winsw.exe") {
  21. err := downloadWinsw()
  22. if err != nil {
  23. return err
  24. }
  25. }
  26. err := copyWinswOver()
  27. if err != nil {
  28. return err
  29. }
  30. ncutils.Log("finished daemon setup")
  31. }
  32. // install daemon, will not overwrite
  33. ncutils.RunCmd(strings.Replace(ncutils.GetNetclientPathSpecific(), `\\`, `\`, -1)+`winsw.exe install`, true)
  34. // start daemon, will not restart or start another
  35. ncutils.RunCmd(strings.Replace(ncutils.GetNetclientPathSpecific(), `\\`, `\`, -1)+`winsw.exe start`, true)
  36. ncutils.Log(strings.Replace(ncutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe start`)
  37. return nil
  38. }
  39. func CleanupWindows() {
  40. if !ncutils.FileExists(ncutils.GetNetclientPathSpecific() + "winsw.xml") {
  41. writeServiceConfig()
  42. }
  43. StopWindowsDaemon()
  44. RemoveWindowsDaemon()
  45. os.RemoveAll(ncutils.GetNetclientPath())
  46. log.Println("Netclient on Windows, uninstalled")
  47. }
  48. func writeServiceConfig() error {
  49. serviceConfigPath := ncutils.GetNetclientPathSpecific() + "winsw.xml"
  50. scriptString := fmt.Sprintf(`<service>
  51. <id>netclient</id>
  52. <name>Netclient</name>
  53. <description>Connects Windows nodes to one or more Netmaker networks.</description>
  54. <executable>%v</executable>
  55. <log mode="roll"></log>
  56. </service>
  57. `, strings.Replace(ncutils.GetNetclientPathSpecific()+"netclient.exe", `\\`, `\`, -1))
  58. if !ncutils.FileExists(serviceConfigPath) {
  59. err := ioutil.WriteFile(serviceConfigPath, []byte(scriptString), 0644)
  60. if err != nil {
  61. return err
  62. }
  63. ncutils.Log("wrote the daemon config file to the Netclient directory")
  64. }
  65. return nil
  66. }
  67. // == Daemon ==
  68. func StopWindowsDaemon() {
  69. ncutils.Log("no networks detected, stopping Windows, Netclient daemon")
  70. // stop daemon, will not overwrite
  71. ncutils.RunCmd(strings.Replace(ncutils.GetNetclientPathSpecific(), `\\`, `\`, -1)+`winsw.exe stop`, true)
  72. }
  73. func RemoveWindowsDaemon() {
  74. // uninstall daemon, will not restart or start another
  75. ncutils.RunCmd(strings.Replace(ncutils.GetNetclientPathSpecific(), `\\`, `\`, -1)+`winsw.exe uninstall`, true)
  76. ncutils.Log("uninstalled Windows, Netclient daemon")
  77. }
  78. func copyWinswOver() error {
  79. input, err := ioutil.ReadFile(".\\winsw.exe")
  80. if err != nil {
  81. ncutils.Log("failed to find winsw.exe")
  82. return err
  83. }
  84. if err = ioutil.WriteFile(ncutils.GetNetclientPathSpecific()+"winsw.exe", input, 0644); err != nil {
  85. ncutils.Log("failed to copy winsw.exe to " + ncutils.GetNetclientPath())
  86. return err
  87. }
  88. if err = os.Remove(".\\winsw.exe"); err != nil {
  89. ncutils.Log("failed to cleanup local winsw.exe, feel free to delete it")
  90. return err
  91. }
  92. ncutils.Log("finished copying winsw.exe")
  93. return nil
  94. }
  95. func downloadWinsw() error {
  96. fullURLFile := "https://github.com/winsw/winsw/releases/download/v2.11.0/WinSW-x64.exe"
  97. fileName := "winsw.exe"
  98. // Create the file
  99. file, err := os.Create(fileName)
  100. if err != nil {
  101. ncutils.Log("could not create file on OS for Winsw")
  102. return err
  103. }
  104. client := http.Client{
  105. CheckRedirect: func(r *http.Request, via []*http.Request) error {
  106. r.URL.Opaque = r.URL.Path
  107. return nil
  108. },
  109. }
  110. // Put content on file
  111. ncutils.Log("downloading service tool...")
  112. resp, err := client.Get(fullURLFile)
  113. if err != nil {
  114. ncutils.Log("could not GET Winsw")
  115. return err
  116. }
  117. defer resp.Body.Close()
  118. _, err = io.Copy(file, resp.Body)
  119. if err != nil {
  120. ncutils.Log("could not mount winsw.exe")
  121. return err
  122. }
  123. defer file.Close()
  124. ncutils.Log("finished downloading Winsw")
  125. return nil
  126. }