|
|
@@ -4,15 +4,19 @@ import (
|
|
|
"context"
|
|
|
"encoding/json"
|
|
|
"errors"
|
|
|
+ "flag"
|
|
|
"fmt"
|
|
|
"net/http"
|
|
|
"os"
|
|
|
"strconv"
|
|
|
"time"
|
|
|
|
|
|
+ "rtu_linux_services/servicelib"
|
|
|
+
|
|
|
"github.com/kardianos/service"
|
|
|
+
|
|
|
"hnyfkj.com.cn/rtu/linux/baseapp"
|
|
|
- netmgrd "hnyfkj.com.cn/rtu/linux/netmgrd"
|
|
|
+ "hnyfkj.com.cn/rtu/linux/netmgrd"
|
|
|
"hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
|
|
|
)
|
|
|
|
|
|
@@ -24,18 +28,19 @@ var (
|
|
|
type program struct {
|
|
|
name string
|
|
|
core_server *jsonrpc2.RPCServer
|
|
|
- rpc_methods jsonrpc2.MethodMap
|
|
|
http_server *http.Server
|
|
|
+ http_done chan struct{}
|
|
|
}
|
|
|
|
|
|
// Start should not block. Do the actual work async.
|
|
|
func (p *program) Start(s service.Service) error {
|
|
|
baseapp.InitPath()
|
|
|
- if err := EnsureDefaultConfig(); err != nil {
|
|
|
+ logCfgFile, err := servicelib.EnsureDefaultLogConfig()
|
|
|
+ if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- baseapp.InitLogger("")
|
|
|
+ baseapp.InitLogger(logCfgFile)
|
|
|
baseapp.Logger.Infof("App Version: %s, Build Time: %s", Version, BuildTime)
|
|
|
|
|
|
if !netmgrd.ModemInit() {
|
|
|
@@ -45,25 +50,24 @@ func (p *program) Start(s service.Service) error {
|
|
|
netmgrd.SetTimeSyncEnabled(false) // 关闭时间同步, 由"timesyncd.service"完成
|
|
|
netmgrd.ModuleInit()
|
|
|
|
|
|
- var err error
|
|
|
p.core_server, err = jsonrpc2.NewRPCServer(p.name, baseapp.Logger)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- p.rpc_methods = make(jsonrpc2.MethodMap)
|
|
|
+ methods := make(jsonrpc2.MethodMap)
|
|
|
|
|
|
- //////////////////////////////////////////////////////////////////
|
|
|
- p.rpc_methods["basic.getBuildVer"] = p.getBuildVer /// 获取软件版本
|
|
|
- p.rpc_methods["basic.getLogLevel"] = p.getLogLevel /// 获取日志级别
|
|
|
- p.rpc_methods["basic.setLogLevel"] = p.setLogLevel /// 设置日志级别
|
|
|
- p.rpc_methods["basic.saveLogConf"] = p.saveLogConf /// 保存日志设置
|
|
|
- //////////////////////////////////////////////////////////////////
|
|
|
- p.rpc_methods["core.getModemInfo"] = p.getModemInfo // IMEI、ICCID
|
|
|
- p.rpc_methods["core.getNetStatus"] = p.getNetStatus // 联网状态信息
|
|
|
- //////////////////////////////////////////////////////////////////
|
|
|
+ ////////////////////////////////////////////////////////////
|
|
|
+ methods["basic.getBuildVer"] = p.getBuildVer /// 获取软件版本
|
|
|
+ methods["basic.getLogLevel"] = p.getLogLevel /// 获取日志级别
|
|
|
+ methods["basic.setLogLevel"] = p.setLogLevel /// 设置日志级别
|
|
|
+ methods["basic.saveLogConf"] = p.saveLogConf /// 保存日志设置
|
|
|
+ ////////////////////////////////////////////////////////////
|
|
|
+ methods["core.getModemInfo"] = p.getModemInfo // IMEI、ICCID
|
|
|
+ methods["core.getNetStatus"] = p.getNetStatus // 联网状态信息
|
|
|
+ ////////////////////////////////////////////////////////////
|
|
|
|
|
|
- err = p.core_server.RegisterMethods(p.rpc_methods)
|
|
|
+ err = p.core_server.RegisterMethods(methods)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
@@ -76,6 +80,8 @@ func (p *program) Start(s service.Service) error {
|
|
|
Handler: mux,
|
|
|
}
|
|
|
|
|
|
+ p.http_done = make(chan struct{})
|
|
|
+
|
|
|
go p.run()
|
|
|
|
|
|
return nil
|
|
|
@@ -83,7 +89,10 @@ func (p *program) Start(s service.Service) error {
|
|
|
|
|
|
// Do work here
|
|
|
func (p *program) run() {
|
|
|
+ defer close(p.http_done)
|
|
|
+
|
|
|
err := p.http_server.ListenAndServe() // 同步阻塞
|
|
|
+
|
|
|
if err != nil && !errors.Is(err, http.ErrServerClosed) {
|
|
|
baseapp.Logger.Errorf("[%s] start http server error: %v", p.name, err)
|
|
|
return
|
|
|
@@ -103,6 +112,10 @@ func (p *program) Stop(s service.Service) error {
|
|
|
_ = p.http_server.Shutdown(ctx)
|
|
|
}
|
|
|
|
|
|
+ if p.http_done != nil {
|
|
|
+ <-p.http_done
|
|
|
+ }
|
|
|
+
|
|
|
netmgrd.ModemExit()
|
|
|
baseapp.ExitLogger()
|
|
|
return nil
|
|
|
@@ -172,26 +185,30 @@ func (p *program) getNetStatus(ctx context.Context, req *jsonrpc2.Request) *json
|
|
|
func main() {
|
|
|
if baseapp.IsArgsParam("-h") {
|
|
|
help()
|
|
|
- return
|
|
|
+ os.Exit(0)
|
|
|
}
|
|
|
|
|
|
if baseapp.IsArgsParam("-v") {
|
|
|
fmt.Printf("Version: %s, Build Time: %s\n", Version, BuildTime)
|
|
|
- return
|
|
|
+ os.Exit(0)
|
|
|
}
|
|
|
|
|
|
+ svcFlag := flag.String("service", "", "Control the system service.")
|
|
|
+ flag.Parse()
|
|
|
+
|
|
|
svcConfig := &service.Config{
|
|
|
Name: "yfkj-networkd",
|
|
|
DisplayName: "yfkj-networkd",
|
|
|
Description: "Network connectivity management",
|
|
|
Option: map[string]any{
|
|
|
- "Restart": "always", // 无条件重启
|
|
|
+ "Restart": "on-failure",
|
|
|
+ "RestartSec": "3",
|
|
|
},
|
|
|
}
|
|
|
|
|
|
if baseapp.IsArgsParam("-n") {
|
|
|
fmt.Println(svcConfig.Name + ".service")
|
|
|
- return
|
|
|
+ os.Exit(0)
|
|
|
}
|
|
|
|
|
|
prg := &program{
|
|
|
@@ -205,6 +222,14 @@ func main() {
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
|
|
|
+ if len(*svcFlag) != 0 {
|
|
|
+ err := service.Control(svc, *svcFlag)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("%v\n Valid actions: %q\n", err, service.ControlAction)
|
|
|
+ }
|
|
|
+ os.Exit(0)
|
|
|
+ }
|
|
|
+
|
|
|
if err := svc.Run(); err != nil {
|
|
|
fmt.Printf("%s.service run failed: %v\n",
|
|
|
svcConfig.Name, err)
|