mstore server: moving creating listener from service to service

This commit is contained in:
2026-03-25 12:21:58 +02:00
parent 8e7a0fffa7
commit 229a3a97fc
6 changed files with 97 additions and 81 deletions
+75 -18
View File
@@ -14,6 +14,7 @@ import (
"context"
"fmt"
"io/ioutil"
"net"
"os"
"os/signal"
"os/user"
@@ -54,6 +55,9 @@ type Server struct {
cancel context.CancelFunc
wg sync.WaitGroup
logf *os.File
//x509cert []byte
//x509key []byte
listen net.Listener
}
func NewServer() (*Server, error) {
@@ -85,7 +89,7 @@ func (srv *Server) SetDatadir(dir string) {
srv.conf.Datadir = dir
}
func (srv *Server) SetPort(port int64) {
func (srv *Server) SetPort(port uint32) {
srv.conf.Service.Port = port
}
@@ -152,6 +156,21 @@ func (srv *Server) Build() error {
confDump := srv.conf.String()
srv.logg.Infof("Current server configuration is:\n%s\n", confDump)
usr, err := user.Lookup(srv.conf.RunUser)
if err != nil {
return err
}
uid64, err := strconv.ParseInt(usr.Uid, 10, 64)
if err != nil {
return err
}
gid64, err := strconv.ParseInt(usr.Gid, 10, 64)
if err != nil {
return err
}
uid := int(uid64)
gid := int(gid64)
if srv.conf.AsDaemon {
logdir := filepath.Dir(srv.conf.Logpath)
srv.logg.Infof("Creating log directory %s", logdir)
@@ -159,12 +178,20 @@ func (srv *Server) Build() error {
if err != nil {
return err
}
err = os.Chown(logdir, uid, gid)
if err != nil {
return err
}
rundir := filepath.Dir(srv.conf.Runpath)
srv.logg.Infof("Creating run directory %s", rundir)
err = os.MkdirAll(rundir, 0750)
if err != nil {
return err
}
err = os.Chown(rundir, uid, gid)
if err != nil {
return err
}
}
// Creating datadir
@@ -176,6 +203,11 @@ func (srv *Server) Build() error {
return err
}
}
err = os.Chown(datadir, uid, gid)
if err != nil {
return err
}
// Read state file
srv.logg.Infof("Reading server status")
err = srv.ReadStat()
@@ -184,13 +216,45 @@ func (srv *Server) Build() error {
}
// Creating database dir
dbdir := srv.conf.Database.Basepath
//if !auxtool.DirExists(dbdir) {
srv.logg.Infof("Creating database directory %s ", dbdir)
err = os.MkdirAll(dbdir, 0750)
if err != nil {
return err
}
//}
// Creating storage dir
srv.logg.Infof("Creating storage directory")
datadir = srv.conf.Database.Basepath
err = os.MkdirAll(datadir, 0750)
if err != nil {
return err
}
err = os.Chown(datadir, uid, gid)
if err != nil {
return err
}
cert, key := []byte(srv.conf.X509Cert), []byte(srv.conf.X509Key)
addrinfo := fmt.Sprintf("%s:%d", srv.conf.Service.Address, srv.conf.Service.Port)
listener, err := CreateTLSListener(addrinfo, cert, key)
if err != nil {
return err
}
srv.listen = listener
// Change effective user
err = syscall.Setuid(uid)
if err != nil {
return err
}
uidstr := strconv.FormatInt(int64(syscall.Geteuid()), 10)
usr, err = user.LookupId(uidstr)
if err != nil {
return err
}
srv.logg.Warningf("Now run as user: %s", usr.Username)
// Creating database
mdb := maindb.NewDatabase(dbdir)
srv.logg.Infof("Opening main database")
@@ -246,15 +310,7 @@ func (srv *Server) Build() error {
return err
}
}
// Creating storage
srv.logg.Infof("Creating storage directory")
datadir = srv.conf.Database.Basepath
err = os.MkdirAll(datadir, 0750)
if err != nil {
return err
}
srv.logg.Infof("Creating storage")
store := storage.NewStorage(datadir)
srv.stor = store
@@ -289,7 +345,6 @@ func (srv *Server) Build() error {
if err != nil {
return err
}
// Creating handler
srv.logg.Infof("Creating handler")
handlerParams := &handler.HandlerParams{
@@ -305,10 +360,7 @@ func (srv *Server) Build() error {
// Creating service
serviceParams := &service.ServiceParams{
Handler: srv.hand,
X509Cert: srv.conf.X509Cert,
X509Key: srv.conf.X509Key,
Address: srv.conf.Service.Address,
Portnum: srv.conf.Service.Port,
Listener: srv.listen,
}
srv.logg.Infof("Creating service")
srv.svc, err = service.NewService(serviceParams)
@@ -320,7 +372,6 @@ func (srv *Server) Build() error {
if err != nil {
return err
}
return err
}
@@ -331,7 +382,13 @@ func (srv *Server) Run() error {
if err != nil {
return err
}
srv.logg.Infof("Server run as user %s", currUser.Username)
srv.logg.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.logg.Infof("Server run with user: %s", usr.Username)
srv.ctx, srv.cancel = context.WithCancel(context.Background())
svcDone := make(chan error, 1)