main.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package main
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "net/http"
  8. "os"
  9. "strconv"
  10. "time"
  11. "github.com/kardianos/service"
  12. "hnyfkj.com.cn/rtu/linux/baseapp"
  13. netmgrd "hnyfkj.com.cn/rtu/linux/netmgrd"
  14. "hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
  15. )
  16. var (
  17. Version = "0.0.0.1"
  18. BuildTime = ""
  19. )
  20. type program struct {
  21. name string
  22. core_server *jsonrpc2.RPCServer
  23. rpc_methods jsonrpc2.MethodMap
  24. http_server *http.Server
  25. }
  26. // Start should not block. Do the actual work async.
  27. func (p *program) Start(s service.Service) error {
  28. baseapp.InitPath()
  29. if err := EnsureDefaultConfig(); err != nil {
  30. return err
  31. }
  32. baseapp.InitLogger("")
  33. baseapp.Logger.Infof("App Version: %s, Build Time: %s", Version, BuildTime)
  34. if !netmgrd.ModemInit() {
  35. return errors.New("modem init failed")
  36. }
  37. netmgrd.SetTimeSyncEnabled(false) // 关闭时间同步, 由"timesyncd.service"完成
  38. netmgrd.ModuleInit()
  39. var err error
  40. p.core_server, err = jsonrpc2.NewRPCServer(p.name, baseapp.Logger)
  41. if err != nil {
  42. return err
  43. }
  44. p.rpc_methods = make(jsonrpc2.MethodMap)
  45. //////////////////////////////////////////////////////////////////
  46. p.rpc_methods["basic.getBuildVer"] = p.getBuildVer /// 获取软件版本
  47. p.rpc_methods["basic.getLogLevel"] = p.getLogLevel /// 获取日志级别
  48. p.rpc_methods["basic.setLogLevel"] = p.setLogLevel /// 设置日志级别
  49. p.rpc_methods["basic.saveLogConf"] = p.saveLogConf /// 保存日志设置
  50. //////////////////////////////////////////////////////////////////
  51. p.rpc_methods["core.getModemInfo"] = p.getModemInfo // IMEI、ICCID
  52. p.rpc_methods["core.getNetStatus"] = p.getNetStatus // 联网状态信息
  53. //////////////////////////////////////////////////////////////////
  54. err = p.core_server.RegisterMethods(p.rpc_methods)
  55. if err != nil {
  56. return err
  57. }
  58. mux := http.NewServeMux()
  59. mux.Handle("/rpc", p.core_server)
  60. p.http_server = &http.Server{
  61. Addr: "127.0.0.1:7000",
  62. Handler: mux,
  63. }
  64. go p.run()
  65. return nil
  66. }
  67. // Do work here
  68. func (p *program) run() {
  69. err := p.http_server.ListenAndServe() // 同步阻塞
  70. if err != nil && !errors.Is(err, http.ErrServerClosed) {
  71. baseapp.Logger.Errorf("[%s] start http server error: %v", p.name, err)
  72. return
  73. }
  74. }
  75. // Stop should not block. Return with a few seconds.
  76. func (p *program) Stop(s service.Service) error {
  77. if p.core_server != nil {
  78. p.core_server.Stop()
  79. }
  80. if p.http_server != nil {
  81. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  82. defer cancel()
  83. _ = p.http_server.Shutdown(ctx)
  84. }
  85. netmgrd.ModemExit()
  86. baseapp.ExitLogger()
  87. return nil
  88. }
  89. func (p *program) getBuildVer(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  90. result := map[string]string{
  91. "version": Version,
  92. "build_time": BuildTime,
  93. }
  94. return jsonrpc2.BuildResponse(req, result, nil)
  95. }
  96. func (p *program) getLogLevel(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  97. level, _ := baseapp.GetLogLevel()
  98. result := map[string]string{
  99. "log_level": level,
  100. }
  101. return jsonrpc2.BuildResponse(req, result, nil)
  102. }
  103. func (p *program) setLogLevel(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  104. var params map[string]string
  105. if err := json.Unmarshal(req.Params, &params); err != nil {
  106. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, err.Error())
  107. }
  108. level, ok := params["log_level"]
  109. if !ok || level == "" {
  110. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'log_level' parameter")
  111. }
  112. err := baseapp.UpdateLogLevel(level)
  113. if err != nil {
  114. return jsonrpc2.BuildError(req, jsonrpc2.ErrInternal, err.Error())
  115. }
  116. return jsonrpc2.BuildResponse(req, "success", nil)
  117. }
  118. func (p *program) saveLogConf(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  119. err := baseapp.SaveLogConfig()
  120. if err != nil {
  121. return jsonrpc2.BuildError(req, jsonrpc2.ErrInternal, err.Error())
  122. }
  123. return jsonrpc2.BuildResponse(req, "success", nil)
  124. }
  125. func (p *program) getModemInfo(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  126. result := map[string]string{
  127. "imei": netmgrd.GetIMEI(),
  128. "iccid": netmgrd.GetSimICCID(),
  129. "rssi": netmgrd.GetRSSI(),
  130. }
  131. return jsonrpc2.BuildResponse(req, result, nil)
  132. }
  133. func (p *program) getNetStatus(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  134. result := map[string]string{
  135. "net_available": strconv.FormatBool(netmgrd.IsInetAvailable()),
  136. "net_type": netmgrd.GetCurrentNetType().String(),
  137. }
  138. return jsonrpc2.BuildResponse(req, result, nil)
  139. }
  140. func main() {
  141. if baseapp.IsArgsParam("-h") {
  142. help()
  143. return
  144. }
  145. if baseapp.IsArgsParam("-v") {
  146. fmt.Printf("Version: %s, Build Time: %s\n", Version, BuildTime)
  147. return
  148. }
  149. svcConfig := &service.Config{
  150. Name: "yfkj-networkd",
  151. DisplayName: "yfkj-networkd",
  152. Description: "Network connectivity management",
  153. Option: map[string]any{
  154. "Restart": "always", // 无条件重启
  155. },
  156. }
  157. if baseapp.IsArgsParam("-n") {
  158. fmt.Println(svcConfig.Name + ".service")
  159. return
  160. }
  161. prg := &program{
  162. name: svcConfig.Name,
  163. }
  164. svc, err := service.New(prg, svcConfig)
  165. if err != nil {
  166. fmt.Printf("%s.service creation failed: %v\n",
  167. svcConfig.Name, err)
  168. os.Exit(1)
  169. }
  170. if err := svc.Run(); err != nil {
  171. fmt.Printf("%s.service run failed: %v\n",
  172. svcConfig.Name, err)
  173. os.Exit(1)
  174. }
  175. }
  176. func help() {
  177. h := `
  178. -h 显示帮助提示
  179. -n 显示服务名称
  180. -v 当前程序版本
  181. `
  182. fmt.Println(h)
  183. }