From f89340550f34111c76da87d330bfc4e4523c7d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=91=D0=BE=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Tue, 9 Jun 2026 21:07:21 +0200 Subject: [PATCH] working commit --- app/server/server.go | 80 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/app/server/server.go b/app/server/server.go index 8699ef7..656be4c 100644 --- a/app/server/server.go +++ b/app/server/server.go @@ -10,6 +10,8 @@ import ( "strconv" "syscall" "time" + "context" + "sync" "mbase/app/config" "mbase/app/maindb" @@ -39,12 +41,16 @@ type Server struct { state descr.Server sfile string logf *os.File + ctx context.Context + cancel context.CancelFunc + wg sync.WaitGroup } func NewServer() (*Server, error) { var err error srv := &Server{} srv.log = logger.NewLogger("server") + srv.ctx, srv.cancel = context.WithCancel(context.Background()) return srv, err } @@ -297,12 +303,42 @@ func (srv *Server) Run() error { } srv.log.Debugf("Server configuration:\n%s\n", yamlConfig) - // Show current user + if srv.conf.AsDaemon { + // Redirect stdin + nullFile, err := os.OpenFile("/dev/null", os.O_RDWR, 0) + if err != nil { + return err + } + err = syscall.Dup2(int(nullFile.Fd()), int(os.Stdin.Fd())) + if err != nil { + return err + } + // Write process ID + pidFile, err := os.OpenFile(srv.conf.RunPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0640) + if err != nil { + return err + } + defer pidFile.Close() + currPid := os.Getpid() + _, err = pidFile.WriteString(strconv.Itoa(currPid)) + if err != nil { + return err + } + // Start log rotator + srv.Rotator() + } + currUser, err := user.Current() if err != nil { return err } - srv.log.Infof("Running server as user %s", currUser.Username) + srv.log.Infof("Server started with user: %s", currUser.Username) + uidstr := strconv.FormatInt(int64(syscall.Geteuid()), 10) + usr, err := user.LookupId(uidstr) + if err != nil { + return err + } + srv.log.Infof("Server run with user: %s", usr.Username) sigs := make(chan os.Signal, 1) done := make(chan error, 1) @@ -421,3 +457,43 @@ func (srv *Server) Daemonize() error { } return err } + + +func (srv *Server) Rotator() { + srv.wg.Add(1) + var counter uint64 + logFunc := func() { + for { + counter += 1 + select { + case <-srv.ctx.Done(): + srv.wg.Done() + srv.log.Infof("Log file rotator done") + return + default: + } + if (counter % 60) == 1 { + stat, err := srv.logf.Stat() + if err == nil && stat.Size() > srv.conf.LogLimit { + srv.log.Infof("Rotate log file") + countFiles := 3 + for i := 1; i < countFiles; i++ { + nextName := fmt.Sprintf("%s.%d", srv.conf.LogPath, i+1) + prevName := fmt.Sprintf("%s.%d", srv.conf.LogPath, i) + os.Rename(prevName, nextName) + } + os.Rename(srv.conf.LogPath, srv.conf.LogPath+".1") + logFile, err := os.OpenFile(srv.conf.LogPath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0640) + if err == nil { + syscall.Dup2(int(logFile.Fd()), int(os.Stdout.Fd())) + syscall.Dup2(int(logFile.Fd()), int(os.Stderr.Fd())) + srv.logf.Close() + srv.logf = logFile + } + } + } + time.Sleep(1 * time.Second) + } + } + go logFunc() +}