mstore server: moving creating listener from service to service
This commit is contained in:
@@ -22,7 +22,7 @@ import (
|
||||
|
||||
type Service struct {
|
||||
Address string `json:"address" yaml:"address"`
|
||||
Port int64 `json:"port" yaml:"port"`
|
||||
Port uint32 `json:"port" yaml:"port"`
|
||||
}
|
||||
|
||||
type Database struct {
|
||||
@@ -49,6 +49,7 @@ type Config struct {
|
||||
Hostname string `json:"hostname" yaml:hostname`
|
||||
Hostnames []string `json:"hostnames" yaml:hostnames`
|
||||
LogLimit int64 `json:"logLimit" yaml:logLimit`
|
||||
RunUser string `json:"runUser" yaml:runUser`
|
||||
}
|
||||
|
||||
func NewConfig() *Config {
|
||||
@@ -84,6 +85,7 @@ func NewConfig() *Config {
|
||||
//Keypath: keypath,
|
||||
Hostnames: make([]string, 0),
|
||||
LogLimit: 1024 * 1024 * 10, // 10 Mb
|
||||
RunUser: "daemon",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,6 @@ const (
|
||||
rundir = "/var/run/mstore"
|
||||
logdir = "/var/log/mstore"
|
||||
datadir = "/var/lib/mstore"
|
||||
version = "0.2.3"
|
||||
version = "0.2.4"
|
||||
srvname = "mstored"
|
||||
)
|
||||
|
||||
+75
-18
@@ -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)
|
||||
|
||||
+6
-49
@@ -11,8 +11,6 @@ package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/http"
|
||||
"time"
|
||||
@@ -22,26 +20,15 @@ import (
|
||||
"mstore/app/router"
|
||||
)
|
||||
|
||||
const protocol = "tcp"
|
||||
|
||||
type ServiceParams struct {
|
||||
Handler *handler.Handler
|
||||
X509Cert string
|
||||
X509Key string
|
||||
Portnum int64
|
||||
Address string
|
||||
Listener net.Listener
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
hand *handler.Handler
|
||||
rout *router.Router
|
||||
logg *logger.Logger
|
||||
|
||||
address string
|
||||
portnum int64
|
||||
x509cert []byte
|
||||
x509key []byte
|
||||
|
||||
hand *handler.Handler
|
||||
rout *router.Router
|
||||
logg *logger.Logger
|
||||
listen net.Listener
|
||||
hsrv *http.Server
|
||||
}
|
||||
@@ -49,11 +36,8 @@ type Service struct {
|
||||
func NewService(params *ServiceParams) (*Service, error) {
|
||||
var err error
|
||||
svc := &Service{
|
||||
hand: params.Handler,
|
||||
x509cert: []byte(params.X509Cert),
|
||||
x509key: []byte(params.X509Key),
|
||||
portnum: params.Portnum,
|
||||
address: params.Address,
|
||||
hand: params.Handler,
|
||||
listen: params.Listener,
|
||||
}
|
||||
svc.logg = logger.NewLoggerWithSubject("service")
|
||||
return svc, err
|
||||
@@ -126,33 +110,6 @@ func (svc *Service) Build() error {
|
||||
svc.logg.Infof("%s\t%s", item.Method, item.RawPath)
|
||||
}
|
||||
|
||||
const useTLS = true
|
||||
if useTLS {
|
||||
tlsCert, err := tls.X509KeyPair(svc.x509cert, svc.x509key)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
tlsConfig := tls.Config{
|
||||
Certificates: []tls.Certificate{tlsCert},
|
||||
ClientAuth: tls.NoClientCert,
|
||||
InsecureSkipVerify: true,
|
||||
}
|
||||
|
||||
listenAddress := fmt.Sprintf("%s:%d", svc.address, svc.portnum)
|
||||
svc.listen, err = tls.Listen(protocol, listenAddress, &tlsConfig)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
} else {
|
||||
listenAddress := fmt.Sprintf("%s:%d", svc.address, svc.portnum)
|
||||
svc.listen, err = net.Listen(protocol, listenAddress)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
svc.logg.Infof("Service listening at %v", svc.listen.Addr())
|
||||
svc.hsrv = &http.Server{
|
||||
Handler: svc.rout,
|
||||
|
||||
Reference in New Issue
Block a user