main.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package main
  2. import (
  3. "context"
  4. "errors"
  5. "flag"
  6. "fmt"
  7. "net/http"
  8. "os"
  9. "rtu_linux_services/servicelib"
  10. "time"
  11. "github.com/kardianos/service"
  12. "hnyfkj.com.cn/rtu/linux/baseapp"
  13. "hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
  14. )
  15. var (
  16. Version = "0.0.0.1"
  17. BuildTime = ""
  18. )
  19. const (
  20. network = "tcp" // http -> tcp
  21. listenAddr = "127.0.0.1:7005"
  22. )
  23. type program struct {
  24. name string
  25. core_server *jsonrpc2.RPCServer
  26. http_server *http.Server
  27. }
  28. // Start should not block. Do the actual work async.
  29. func (p *program) Start(s service.Service) error {
  30. logCfgFile, err := servicelib.EnsureDefaultLogConfig()
  31. if err != nil {
  32. return err
  33. }
  34. baseapp.InitLogger(logCfgFile)
  35. baseapp.Logger.Infof("[%s] 开始运行, 程序版本: %s, 构建时间: %s", p.name, Version, BuildTime)
  36. p.core_server, err = jsonrpc2.NewRPCServer(p.name, baseapp.Logger)
  37. if err != nil {
  38. return err
  39. }
  40. methods := make(jsonrpc2.MethodMap)
  41. //////////////////////////////////////////////////////////
  42. _getBuildVer := servicelib.MakeGetBuildVer(
  43. Version, BuildTime)
  44. methods["basic.getBuildVer"] = _getBuildVer // 获取软件版本
  45. _getLogLevel := servicelib.GetLogLevel
  46. methods["basic.getLogLevel"] = _getLogLevel // 获取日志级别
  47. _setLogLevel := servicelib.SetLogLevel
  48. methods["basic.setLogLevel"] = _setLogLevel // 设置日志级别
  49. _saveLogConf := servicelib.SaveLogConf
  50. methods["basic.saveLogConf"] = _saveLogConf // 保存日志设置
  51. //////////////////////////////////////////////////////////
  52. err = p.core_server.RegisterMethods(methods)
  53. if err != nil {
  54. return err
  55. }
  56. mux := http.NewServeMux()
  57. mux.Handle("/rpc", p.core_server)
  58. p.http_server = &http.Server{
  59. Addr: listenAddr,
  60. Handler: mux,
  61. }
  62. go p.run()
  63. return nil
  64. }
  65. // Do work here
  66. func (p *program) run() {
  67. baseapp.Logger.Infof(
  68. "[%s] Http server starting on %s...",
  69. p.name,
  70. p.http_server.Addr,
  71. )
  72. err := p.http_server.ListenAndServe() // 同步阻塞
  73. if err != nil && !errors.Is(err, http.ErrServerClosed) {
  74. baseapp.Logger.Errorf("[%s] Start http server error: %v!!", p.name, err)
  75. return
  76. }
  77. }
  78. // Stop should not block. Return with a few seconds.
  79. func (p *program) Stop(s service.Service) error {
  80. if p.core_server != nil {
  81. p.core_server.Stop()
  82. }
  83. if p.http_server != nil {
  84. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  85. defer cancel()
  86. _ = p.http_server.Shutdown(ctx)
  87. }
  88. baseapp.Logger.Infof("[%s] 程序退出", p.name)
  89. baseapp.ExitLogger()
  90. return nil
  91. }
  92. func main() {
  93. baseapp.SetOptDirs(true, true, false, false)
  94. baseapp.InitPath()
  95. svcFlag := flag.String("service", "", "Control the yfkj-upgrade service.")
  96. flag.Parse()
  97. svcConfig := &service.Config{
  98. Name: "yfkj-upgrade",
  99. DisplayName: "yfkj-upgrade",
  100. Description: "Yunfei Service Upgrade",
  101. Option: map[string]any{
  102. "Restart": "always", // 无条件重启
  103. },
  104. }
  105. servicelib.WriteVersionFile(baseapp.EXEC_DIR, Version) //-> for 升级
  106. prg := &program{
  107. name: "UpgradeHelper",
  108. }
  109. svc, err := service.New(prg, svcConfig)
  110. if err != nil {
  111. fmt.Printf("%s.service creation failed: %v\n",
  112. svcConfig.Name, err)
  113. os.Exit(1)
  114. }
  115. if len(*svcFlag) != 0 {
  116. err := service.Control(svc, *svcFlag)
  117. if err != nil {
  118. fmt.Printf("%v\n Valid actions: %q\n", err, service.ControlAction)
  119. }
  120. os.Exit(0)
  121. }
  122. if servicelib.IsAddrInUse(network, listenAddr) { // 查询端口占用,避免运行多份实例
  123. fmt.Printf(
  124. "%s.service start failed: listen addr %s already in use\n",
  125. svcConfig.Name, listenAddr,
  126. )
  127. os.Exit(1)
  128. }
  129. if err := svc.Run(); err != nil {
  130. fmt.Printf("%s.service run failed: %v\n",
  131. svcConfig.Name, err)
  132. os.Exit(1)
  133. }
  134. }