Browse Source

Version 1.0

zry 3 years ago
parent
commit
b208caf4ae
1 changed files with 171 additions and 0 deletions
  1. 171 0
      run.go

+ 171 - 0
run.go

@@ -0,0 +1,171 @@
+package zdaemon
+
+import (
+	"fmt"
+	"git.swzry.com/zry/SatorIPC/golang/sipc_conn"
+	"github.com/gin-gonic/gin"
+	"gopkg.in/natefinch/lumberjack.v2"
+	"net/http"
+	"os"
+	"path"
+	"sync"
+	"time"
+)
+
+const TimeFormatLayout = "2006-01-02 15:04:05"
+
+func (zd *ZDaemon) directRun() {
+	if zd.checkRunning() {
+		zd.stop()
+	}
+	logger := &lumberjack.Logger{
+		Filename:   path.Join(zd.zdaemonPath, "local.log"),
+		MaxSize:    1,
+		MaxAge:     30,
+		MaxBackups: 24,
+		LocalTime:  true,
+		Compress:   true,
+	}
+	zd.webserver = gin.Default()
+	zd.webserver.GET("/", zd.webHome)
+	zd.webserver.GET("/check-alive.satori", zd.webCheckAlive)
+	zd.webserver.GET("/stop.satori", zd.webStop)
+	zd.webserver.GET("/status.satori", zd.webStatus)
+	zd.webserver.POST("/other-operation.satori", zd.webOtherOp)
+	zd.cleanIPCUnixSock()
+	zd.makeIPCDir()
+	ipcaddr := sipc_conn.GenerateCustomPath(path.Join(zd.zdaemonPath, "ipc"), sipc_conn.GenerateServerName())
+	var err error
+	zd.ipcserver, err = sipc_conn.NewServer(ipcaddr, false)
+	if err != nil {
+		_, _ = fmt.Fprintln(logger, "Failed create IPC server: ", err.Error())
+		return
+	}
+	zd.daemonProgram = zd.initFunc()
+	zd.daemonProgram.SetLocalLogWriter(logger)
+	zd.ipcserver.SetConnErrorHandler(func(err error) {
+		_, _ = fmt.Fprintln(logger, "Wrong IPC Connection: ", err.Error())
+	})
+	zd.ipclistener, err = zd.ipcserver.GetListenerAndListen()
+	if err != nil {
+		_, _ = fmt.Fprintln(logger, "Failed create IPC server: ", err.Error())
+		return
+	}
+	zd.daemonConfig.IsRunning = true
+	zd.daemonConfig.PID = os.Getpid()
+	zd.daemonConfig.IpcAddr = ipcaddr
+	zd.writeStatus()
+	var wg sync.WaitGroup
+	wg.Add(2)
+	go func() {
+		err := http.Serve(zd.ipclistener, zd.webserver)
+		if err != nil {
+			_, _ = fmt.Fprintln(logger, "Error in IPC server listening: ", err.Error())
+		}
+		wg.Done()
+	}()
+	go func() {
+		err := zd.daemonProgram.Start()
+		if err != nil {
+			_, _ = fmt.Fprintln(logger, "Error in daemon running: ", err.Error())
+		}
+		wg.Done()
+	}()
+	wg.Wait()
+	_, _ = fmt.Fprintln(logger, "Both IPC server and user program end. Daemon program quit.")
+}
+
+func (zd *ZDaemon) webHome(ctx *gin.Context) {
+	ctx.JSON(200, gin.H{
+		"zdaemon_version": "1.0",
+		"daemon_name":     zd.daemonName,
+	})
+}
+
+func (zd *ZDaemon) webCheckAlive(ctx *gin.Context) {
+	al := &IPCJsonDef_CheckAlive{Alive: true}
+	ctx.JSON(200, al)
+}
+
+func (zd *ZDaemon) webStop(ctx *gin.Context) {
+	if zd.daemonProgram == nil {
+		al := &IPCJsonDef_Stop{
+			Success: false,
+			Msg:     "daemon program instance is null pointer.",
+		}
+		ctx.JSON(200, al)
+		return
+	}
+	var al *IPCJsonDef_Stop
+	if zd.daemonProgram != nil {
+		err := zd.daemonProgram.Stop()
+		if err != nil {
+			al = &IPCJsonDef_Stop{
+				Success: false,
+				Msg:     err.Error(),
+			}
+		} else {
+			al = &IPCJsonDef_Stop{
+				Success: true,
+				Msg:     "None",
+			}
+		}
+	} else {
+		al = &IPCJsonDef_Stop{
+			Success: false,
+			Msg:     "daemon program instance is null pointer",
+		}
+	}
+	ctx.JSON(200, al)
+	go func() {
+		time.Sleep(time.Second)
+		if zd.ipclistener != nil {
+			_ = zd.ipclistener.Close()
+		}
+	}()
+}
+
+func (zd *ZDaemon) webStatus(ctx *gin.Context) {
+	if zd.daemonProgram == nil {
+		al := &IPCJsonDef_GetStatus{
+			Status:   "error",
+			HasExtra: false,
+			ExtraInfo: map[string]string{
+				"errmsg": "daemon program instance is null pointer.",
+			},
+		}
+		ctx.JSON(200, al)
+		return
+	}
+	st, he, ex := zd.daemonProgram.GetStatus()
+	al := &IPCJsonDef_GetStatus{
+		Status:    st,
+		HasExtra:  he,
+		ExtraInfo: ex,
+	}
+	ctx.JSON(200, al)
+}
+
+func (zd *ZDaemon) webOtherOp(ctx *gin.Context) {
+	if zd.daemonProgram == nil {
+		al := &IPCJsonDef_OtherOperationResponse{
+			Result: "Error: daemon program instance is null pointer.",
+		}
+		ctx.JSON(200, al)
+		return
+	}
+	var jv IPCJsonDef_OtherOperationRequest
+	err := ctx.BindJSON(&jv)
+	if err != nil {
+		al := &IPCJsonDef_OtherOperationResponse{
+			Result: fmt.Sprint("Error: ", err.Error()),
+		}
+		ctx.JSON(200, al)
+		return
+	}
+	st := zd.daemonProgram.OtherOperation(jv.Operation, jv.Args)
+	al := &IPCJsonDef_OtherOperationResponse{
+		Result: st,
+	}
+	ctx.JSON(200, al)
+}