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