123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- 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()
- os.Exit(0)
- }
- }()
- }
- 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)
- }
|