diff --git a/go.mod b/go.mod index ae851bd..d850040 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/go-playground/validator/v10 v10.9.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/ihexxa/gocfg v0.0.0-20201206115732-ab537e3b1086 + github.com/ihexxa/gocfg v0.0.0-20210914021417-6ba19520f0ff github.com/ihexxa/multipart v0.0.0-20201207132919-72f6e0e58b25 github.com/jessevdk/go-flags v1.4.0 github.com/json-iterator/go v1.1.11 // indirect diff --git a/go.sum b/go.sum index 8a15f88..d877367 100644 --- a/go.sum +++ b/go.sum @@ -59,6 +59,8 @@ github.com/hashicorp/go-version v1.0.0 h1:21MVWPKDphxa7ineQQTrCU5brh7OuVVAzGOCnn github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/ihexxa/gocfg v0.0.0-20201206115732-ab537e3b1086 h1:1IzU4pzD8NyEHgJGLOS3Iq56b0zlAylRwbJq+08PD9Y= github.com/ihexxa/gocfg v0.0.0-20201206115732-ab537e3b1086/go.mod h1:oqDTq1ywx4Qi9DdhFwwMHoPCYv6Txrfj2SY5WWcgiJs= +github.com/ihexxa/gocfg v0.0.0-20210914021417-6ba19520f0ff h1:rsaVb8KIlg3gd7CEPTV/Qi5cf6i4C12EmbnsRMjGxkY= +github.com/ihexxa/gocfg v0.0.0-20210914021417-6ba19520f0ff/go.mod h1:oqDTq1ywx4Qi9DdhFwwMHoPCYv6Txrfj2SY5WWcgiJs= github.com/ihexxa/multipart v0.0.0-20201207132919-72f6e0e58b25 h1:gQCaP2qoFWCTz17jj9EUhE/plgqJwk3nHbcS4RHQYCw= github.com/ihexxa/multipart v0.0.0-20201207132919-72f6e0e58b25/go.mod h1:rhOAe/52S/J1fq1VnXvKX8FHuo65I+IcYUozW4M7+wE= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= diff --git a/src/server/config.go b/src/server/config.go index 88395e0..355706e 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -34,7 +34,7 @@ type Secrets struct { type ServerCfg struct { Debug bool `json:"debug" yaml:"debug"` Host string `json:"host" yaml:"host"` - Port int `json:"port" yaml:"port"` + Port int `json:"port" yaml:"port" cfg:"env"` ReadTimeout int `json:"readTimeout" yaml:"readTimeout"` WriteTimeout int `json:"writeTimeout" yaml:"writeTimeout"` MaxHeaderBytes int `json:"maxHeaderBytes" yaml:"maxHeaderBytes"` diff --git a/src/server/server.go b/src/server/server.go index 6b346ff..ce4befb 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -10,6 +10,7 @@ import ( "os" "os/signal" "path/filepath" + "strconv" "syscall" "time" @@ -53,11 +54,20 @@ func NewServer(cfg gocfg.ICfg) (*Server, error) { router := gin.Default() router, err := initHandlers(router, cfg, deps) if err != nil { - return nil, err + return nil, fmt.Errorf("init handlers error: %w", err) } + port := cfg.GrabInt("Server.Port") + portStr, ok := cfg.String("ENV.PORT") + if ok { + port, err = strconv.Atoi(portStr) + if err != nil { + panic(fmt.Sprintf("invalid port: %s", portStr)) + } + cfg.SetInt("Server.Port", port) + } srv := &http.Server{ - Addr: fmt.Sprintf("%s:%d", cfg.GrabString("Server.Host"), cfg.GrabInt("Server.Port")), + Addr: fmt.Sprintf("%s:%d", cfg.GrabString("Server.Host"), port), Handler: router, ReadTimeout: time.Duration(cfg.GrabInt("Server.ReadTimeout")) * time.Millisecond, WriteTimeout: time.Duration(cfg.GrabInt("Server.WriteTimeout")) * time.Millisecond, @@ -65,9 +75,9 @@ func NewServer(cfg gocfg.ICfg) (*Server, error) { } return &Server{ - server: srv, - deps: deps, - cfg: cfg, + server: srv, + deps: deps, + cfg: cfg, }, nil } @@ -77,10 +87,10 @@ func mkRoot(rootPath string) { if os.IsNotExist(err) { err = os.MkdirAll(rootPath, 0760) if err != nil { - panic(err) + panic(fmt.Sprintf("mk root path error: %s", err)) } } else { - panic(err) + panic(fmt.Sprintf("stat root Path error: %s", err)) } } else if !info.IsDir() { panic(fmt.Sprintf("can not create %s folder: there is a file with same name", rootPath)) @@ -143,7 +153,7 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E // handlers userHdrs, err := multiusers.NewMultiUsersSvc(cfg, deps) if err != nil { - return nil, err + return nil, fmt.Errorf("new users svc error: %w", err) } if cfg.BoolOr("Users.EnableAuth", true) && !userHdrs.IsInited() { adminName, ok := cfg.String("ENV.DEFAULTADMIN") @@ -157,7 +167,7 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E if adminPwd == "" { adminPwd, err = generatePwd() if err != nil { - return nil, err + return nil, fmt.Errorf("generate pwd error: %w", err) } // only write to stdout fmt.Printf("password is generated: %s, please update it after login\n", adminPwd) @@ -165,10 +175,10 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E pwdHash, err := bcrypt.GenerateFromPassword([]byte(adminPwd), 10) if err != nil { - return nil, err + return nil, fmt.Errorf("generate pwd error: %w", err) } if _, err := userHdrs.Init(adminName, string(pwdHash)); err != nil { - return nil, err + return nil, fmt.Errorf("init admin error: %w", err) } deps.Log().Infof("user (%s) is created\n", adminName) @@ -176,12 +186,12 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E fileHdrs, err := fileshdr.NewFileHandlers(cfg, deps) if err != nil { - return nil, err + return nil, fmt.Errorf("new files service error: %w", err) } settingsSvc, err := settings.NewSettingsSvc(cfg, deps) if err != nil { - return nil, err + return nil, fmt.Errorf("new setting service error: %w", err) } publicPath, ok := cfg.String("Server.PublicPath") @@ -295,7 +305,7 @@ func (s *Server) Start() error { err := s.server.ListenAndServe() if err != http.ErrServerClosed { - return err + return fmt.Errorf("listen error: %w", err) } return nil } @@ -319,7 +329,7 @@ func makeRandToken() string { b := make([]byte, 32) _, err := rand.Read(b) if err != nil { - panic(err) + panic(fmt.Sprintf("make rand token error: %s", err)) } return string(b) } @@ -329,7 +339,7 @@ func generatePwd() (string, error) { buf := make([]byte, size) size, err := rand.Read(buf) if err != nil { - return "", err + return "", fmt.Errorf("generate pwd error: %w", err) } return fmt.Sprintf("%x", sha1.Sum(buf[:size]))[:6], nil