main.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "os"
  7. "strings"
  8. "github.com/alroyso/clash-for-flutter-service/constant"
  9. "github.com/alroyso/clash-for-flutter-service/server"
  10. "github.com/kardianos/service"
  11. )
  12. var Service service.Service
  13. type program struct{}
  14. var (
  15. port int64
  16. )
  17. func (p *program) Start(s service.Service) error {
  18. go p.run()
  19. fmt.Println("Start success")
  20. return nil
  21. }
  22. func (p *program) run() {
  23. err := server.StartServer(port)
  24. if err != nil {
  25. fmt.Println(err)
  26. if strings.Contains(err.Error(), "http: Server closed") {
  27. return
  28. }
  29. if strings.Contains(err.Error(), "bind: address already in use") {
  30. if os.Args[1] == "service-mode" {
  31. Service.Stop()
  32. } else {
  33. p.Stop(Service)
  34. os.Exit(101)
  35. }
  36. }
  37. }
  38. }
  39. func (p *program) Stop(s service.Service) error {
  40. if server.Server != nil {
  41. server.Server.Shutdown(context.TODO())
  42. }
  43. if server.Cmd != nil {
  44. server.Cmd.Process.Kill()
  45. server.Cmd.Process.Wait()
  46. }
  47. fmt.Println("Stop success")
  48. return nil
  49. }
  50. func main() {
  51. //// 使用 flag 包为全局变量 port 定义命令行参数
  52. flag.Int64Var(&port, "port", 9899, "The port number to listen on")
  53. // 解析命令行参数
  54. flag.Parse()
  55. args := flag.Args()
  56. if len(args) <= 1 {
  57. fmt.Println("Please use command: install, uninstall, status, start, stop, restart, version, service-mode, user-mode")
  58. return
  59. }
  60. svcConfig := &service.Config{
  61. Name: "naiyou-core-service",
  62. DisplayName: "naiyou core Service",
  63. Description: "This is a naiyou core Service.",
  64. Arguments: []string{"service-mode"},
  65. }
  66. prg := &program{}
  67. s, err := service.New(prg, svcConfig)
  68. Service = s
  69. if err != nil {
  70. fmt.Println(err)
  71. return
  72. }
  73. for _, it := range args {
  74. switch it {
  75. case "install":
  76. handleInstall(s)
  77. case "uninstall":
  78. handleUnInstall(s)
  79. case "status":
  80. handleStatus(s)
  81. case "start":
  82. handleStart(s)
  83. case "stop":
  84. handleStop(s)
  85. case "restart":
  86. handleRestart(s)
  87. case "version":
  88. handleVersion(s)
  89. case "service-mode":
  90. handleRun(s)
  91. case "user-mode":
  92. handleRun(s)
  93. default:
  94. fmt.Println("Command does not exist")
  95. }
  96. }
  97. }
  98. func handleInstall(s service.Service) {
  99. err := s.Install()
  100. if err != nil {
  101. fmt.Println(err)
  102. } else {
  103. fmt.Println("Install Service Success")
  104. }
  105. }
  106. func handleUnInstall(s service.Service) {
  107. err := s.Uninstall()
  108. if err != nil {
  109. fmt.Println(err)
  110. } else {
  111. fmt.Println("UnInstall Service Success")
  112. }
  113. }
  114. func handleStatus(s service.Service) {
  115. status, err := s.Status()
  116. if err != nil {
  117. fmt.Println(err)
  118. } else {
  119. switch status {
  120. case service.StatusRunning:
  121. fmt.Println("Service Status is runing")
  122. case service.StatusStopped:
  123. fmt.Println("Service Status is stoped")
  124. default:
  125. fmt.Println("Service Status is unknow")
  126. }
  127. }
  128. }
  129. func handleStart(s service.Service) {
  130. err := s.Start()
  131. if err != nil {
  132. fmt.Println(err)
  133. } else {
  134. fmt.Println("Service Start Success ")
  135. }
  136. }
  137. func handleStop(s service.Service) {
  138. err := s.Stop()
  139. if err != nil {
  140. fmt.Println(err)
  141. } else {
  142. fmt.Println("Service Stop Success")
  143. }
  144. }
  145. func handleRestart(s service.Service) {
  146. err := s.Restart()
  147. if err != nil {
  148. fmt.Println(err)
  149. } else {
  150. fmt.Println("Service Restart Success")
  151. }
  152. }
  153. func handleVersion(s service.Service) {
  154. fmt.Println(constant.Version)
  155. }
  156. func handleRun(s service.Service) {
  157. err := s.Run()
  158. if err != nil {
  159. fmt.Println(err)
  160. }
  161. }