Browse Source

修改优化代码

niujiuru 2 months ago
parent
commit
5f23dc05d1
3 changed files with 69 additions and 55 deletions
  1. 9 9
      Makefile
  2. 45 20
      networkd.service/main.go
  3. 15 26
      networkd.service/config.go

+ 9 - 9
Makefile

@@ -22,26 +22,26 @@ RTU_LINUX_MODULES_PATH := $(shell pwd)/../rtu_linux_modules
 
 # 依赖静态库
 S_LIBS0 := -Wl,-Bstatic -L$(RTU_LINUX_MODULES_PATH)/swapi -lswapi
-S_LIBS1 := -L$(RTU_LINUX_MODULES_PATH)/ec200u -lec200u -L$(RTU_LINUX_MODULES_PATH)/air720u -lair720u
-S_LIBS2 := -L$(RTU_LINUX_MODULES_PATH)/hk_takephoto -lhk_takephoto -L$(RTU_LINUX_MODULES_PATH)/dh_takephoto -ldh_takephoto
-S_LIBS3 := -L$(RTU_LINUX_MODULES_PATH)/air530z -lair530z
+S_LIBS1 := -Wl,-Bstatic -L$(RTU_LINUX_MODULES_PATH)/ec200u -lec200u -L$(RTU_LINUX_MODULES_PATH)/air720u -lair720u
+S_LIBS2 := -Wl,-Bstatic -L$(RTU_LINUX_MODULES_PATH)/hk_takephoto -lhk_takephoto -L$(RTU_LINUX_MODULES_PATH)/dh_takephoto -ldh_takephoto
+S_LIBS3 := -Wl,-Bstatic -L$(RTU_LINUX_MODULES_PATH)/air530z -lair530z
 
 # 依赖动态库
 D_LIBS0 := -Wl,-Bdynamic -lc -lm -ldl -lpthread
-D_LIBS2 := -L$(RTU_LINUX_MODULES_PATH)/hk_takephoto/lib/armv7hf/. -lMvCameraControl
+D_LIBS2 := -Wl,-Bdynamic -L$(RTU_LINUX_MODULES_PATH)/hk_takephoto/lib/armv7hf/. -lMvCameraControl
 D_LIBS2 += -L$(RTU_LINUX_MODULES_PATH)/dh_takephoto/lib/armv7hf -lMVSDK -liImageProcessing -lImageConvert -llog4cpp -lMvLSCProcess
 D_LIBS2 += -L$(RTU_LINUX_MODULES_PATH)/dh_takephoto/lib/armv7hf/GenICam/bin -lGCBase_gcc483_v3_0 -lGenApi_gcc483_v3_0 -lLog_gcc483_v3_0 -llog4cpp_gcc483_v3_0 -lMathParser_gcc483_v3_0 -lNodeMapData_gcc483_v3_0 -lXmlParser_gcc483_v3_0
 
 # 编译的目标
-all: yfkj-networkd
+all: networkd
 
 # 可执行程序
 LK_LIBS := $(S_LIBS0) $(S_LIBS1) $(D_LIBS0)
-yfkj-networkd : libswapi.a libair720u.a libec200u.a
+networkd : libswapi.a libair720u.a libec200u.a
 	mkdir -p ./build
 	$(GO) mod tidy
-	$(SETGO_ENV) CGO_LDFLAGS="$(LK_LIBS)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./networkd.service/config.go ./networkd.service/main.go
-	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)
+	$(SETGO_ENV) CGO_LDFLAGS="$(LK_LIBS)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./networkd.service/main.go
+	cp -rf $@ ./build/ && cp -rf $@ ./build/$(basename $@)_$(DATE)$(suffix $@) && rm -rf $@
 
 # 静态库模块
 libswapi.a :
@@ -68,4 +68,4 @@ clean:
 		$(MAKE) -C $(RTU_LINUX_MODULES_PATH)/$$m clean || true; \
 	done
 
-	rm -rf yfkj-networkd build
+	rm -rf build

+ 45 - 20
networkd.service/main.go

@@ -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)

+ 15 - 26
networkd.service/config.go

@@ -1,14 +1,13 @@
-package main
+package servicelib
 
 import (
 	"os"
 	"path/filepath"
-	"sync"
 
 	"hnyfkj.com.cn/rtu/linux/baseapp"
 )
 
-const defaultCfg = `[Log]
+const defaultLogConfig = `[Log]
 ; 日志级别: trace、debug、info、warn、error、fatal、panic
 Level = info
 ; 输出目标: console(控制台)、file(文件)、all(控制台+文件)
@@ -19,20 +18,7 @@ MaxFileSize = 5
 MaxBackupFileCnts = 1
 `
 
-var (
-	initCfgOnce sync.Once
-	initCfgErr  error
-)
-
-func EnsureDefaultConfig() error {
-	initCfgOnce.Do(func() {
-		initCfgErr = ensureDefaultConfig()
-	})
-
-	return initCfgErr
-}
-
-func ensureDefaultConfig() error {
+func EnsureDefaultLogConfig() (string, error) {
 	cfgFile := filepath.Join(
 		baseapp.CFG_DIR,
 		"config.ini",
@@ -42,7 +28,7 @@ func ensureDefaultConfig() error {
 		baseapp.CFG_DIR,
 		0755,
 	); err != nil {
-		return err
+		return "", err
 	}
 
 	f, err := os.OpenFile(
@@ -52,24 +38,27 @@ func ensureDefaultConfig() error {
 	)
 	if err != nil {
 		if os.IsExist(err) {
-			return nil
+			return cfgFile, nil
 		}
-		return err
+		return "", err
 	}
 
-	defer func() {
+	if _, err = f.WriteString(defaultLogConfig); err != nil {
 		_ = f.Close()
-	}()
+		_ = os.Remove(cfgFile)
+		return "", err
+	}
 
-	if _, err = f.WriteString(defaultCfg); err != nil {
+	if err = f.Sync(); err != nil {
+		_ = f.Close()
 		_ = os.Remove(cfgFile)
-		return err
+		return "", err
 	}
 
 	if err = f.Close(); err != nil {
 		_ = os.Remove(cfgFile)
-		return err
+		return "", err
 	}
 
-	return nil
+	return cfgFile, nil
 }