From 32a003d789cf78385571195fbd244dde75d533ee Mon Sep 17 00:00:00 2001 From: hexxa Date: Fri, 28 Jan 2022 22:11:27 +0800 Subject: [PATCH] fix(config): add config loading functions and tests, also fix config issues --- README.md | 4 +-- cmd/start/main.go | 57 +++++++------------------------ configs/demo.yml | 2 +- configs/dev.yml | 2 +- configs/docker.yml | 2 +- configs/lan.yml | 2 +- go.mod | 2 +- go.sum | 2 ++ src/db/sitestore/site_store.go | 16 ++++----- src/kvstore/boltdbpvd/provider.go | 3 +- src/server/config.go | 19 ++++++----- 11 files changed, 42 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index 74c254e..5261067 100644 --- a/README.md +++ b/README.md @@ -30,14 +30,14 @@ English | [简体中文](./docs/README_zh-cn.md) - File Management - Support uploading, downloading, creating, deleting and moving files and folders - Resumable uploading and downloading - - Only browser is needed + - Finish operations in browser - Share directories to others, including anonymous - Scan QR codes to visit sharing folders - Upload hundreds of files at once - Steaming uploading: make it work behind CDN or reverse proxy - Files can also be managed from OS - User Management - - Support multiple users + - Support multiple users - Each user has a role (user/admin) - User home directory - Per-user download & upload speed limiting diff --git a/cmd/start/main.go b/cmd/start/main.go index d790fd1..cfe292f 100644 --- a/cmd/start/main.go +++ b/cmd/start/main.go @@ -2,69 +2,36 @@ package main import ( "fmt" - "strings" + "os" - "github.com/ihexxa/gocfg" goflags "github.com/jessevdk/go-flags" - "github.com/ihexxa/quickshare/src/server" + serverPkg "github.com/ihexxa/quickshare/src/server" ) -var opts struct { - Host string `short:"h" long:"host" description:"server hostname"` - Port int `short:"p" long:"port" description:"server port"` - Debug bool `short:"d" long:"debug" description:"debug mode"` - Configs []string `short:"c" description:"config path"` -} +var opts = &serverPkg.Opts{} func main() { - _, err := goflags.Parse(&opts) - if err != nil { - panic(err) - } - defaultCfg, err := server.DefaultConfig() + _, err := goflags.Parse(opts) if err != nil { panic(err) } - cfg, err := gocfg.New(server.NewConfig()).Load(gocfg.JSONStr(defaultCfg)) + cfg, err := serverPkg.LoadCfg(opts) if err != nil { - panic(err) + fmt.Printf("failed to load config: %s", err) + os.Exit(1) } - if len(opts.Configs) > 0 { - for _, configPath := range opts.Configs { - if strings.HasSuffix(configPath, ".yml") || strings.HasSuffix(configPath, ".yaml") { - cfg, err = cfg.Load(gocfg.YAML(configPath)) - } else if strings.HasSuffix(configPath, ".json") { - cfg, err = cfg.Load(gocfg.JSON(configPath)) - } else { - panic(fmt.Sprintf("unknown config file type (.yml .yaml .json are supported): %s", configPath)) - } - - if err != nil { - panic(err) - } - } - } - - if opts.Host != "" { - cfg.SetString("Server.Host", opts.Host) - } - if opts.Port != 0 { - cfg.SetInt("Server.Port", opts.Port) - } - if opts.Debug { - cfg.SetBool("Server.Debug", opts.Debug) - } - - srv, err := server.NewServer(cfg) + srv, err := serverPkg.NewServer(cfg) if err != nil { - panic(err) + fmt.Printf("failed to new server: %s", err) + os.Exit(1) } err = srv.Start() if err != nil { - panic(err) + fmt.Printf("failed to start server: %s", err) + os.Exit(1) } } diff --git a/configs/demo.yml b/configs/demo.yml index 67b7de7..18e1bd1 100644 --- a/configs/demo.yml +++ b/configs/demo.yml @@ -9,7 +9,7 @@ server: host: "0.0.0.0" port: 8686 readTimeout: 2000 - writerTimeout: 86400000 # 1 day + writeTimeout: 86400000 # 1 day maxHeaderBytes: 512 publicPath: "/quickshare/public" users: diff --git a/configs/dev.yml b/configs/dev.yml index be6e847..68d727d 100644 --- a/configs/dev.yml +++ b/configs/dev.yml @@ -9,7 +9,7 @@ server: host: "127.0.0.1" port: 8686 readTimeout: 2000 - writerTimeout: 86400000 # 1 day + writeTimeout: 86400000 # 1 day maxHeaderBytes: 512 publicPath: "public" users: diff --git a/configs/docker.yml b/configs/docker.yml index 83aa247..c07237a 100644 --- a/configs/docker.yml +++ b/configs/docker.yml @@ -9,7 +9,7 @@ server: host: "0.0.0.0" port: 8686 readTimeout: 2000 - writerTimeout: 86400000 # 1 day + writeTimeout: 86400000 # 1 day maxHeaderBytes: 512 publicPath: "/quickshare/public" users: diff --git a/configs/lan.yml b/configs/lan.yml index ff470b0..efe5e19 100644 --- a/configs/lan.yml +++ b/configs/lan.yml @@ -9,7 +9,7 @@ server: host: "0.0.0.0" port: 8686 readTimeout: 2000 - writerTimeout: 86400000 # 1 day + writeTimeout: 86400000 # 1 day maxHeaderBytes: 512 publicPath: "public" users: diff --git a/go.mod b/go.mod index 2805c49..32d21b2 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/gin-gonic/gin v1.7.3 github.com/go-playground/validator/v10 v10.9.0 // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/ihexxa/gocfg v0.0.0-20210914021417-6ba19520f0ff + github.com/ihexxa/gocfg v0.0.0-20220128082538-9e607ebed51b github.com/ihexxa/multipart v0.0.0-20210916083128-8584a3f00d1d 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 5ab65c4..990afb8 100644 --- a/go.sum +++ b/go.sum @@ -50,6 +50,8 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGa github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 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/gocfg v0.0.0-20220128082538-9e607ebed51b h1:pzx3BC3+v38POQg9sJWhfs/a4xFaJfC0Ar4RRVnFIMo= +github.com/ihexxa/gocfg v0.0.0-20220128082538-9e607ebed51b/go.mod h1:oqDTq1ywx4Qi9DdhFwwMHoPCYv6Txrfj2SY5WWcgiJs= github.com/ihexxa/multipart v0.0.0-20210916083128-8584a3f00d1d h1:+v33khYHVDPEuuWO/JE1IzhoIu5uNvEcSs5GmXc5Sjw= github.com/ihexxa/multipart v0.0.0-20210916083128-8584a3f00d1d/go.mod h1:rhOAe/52S/J1fq1VnXvKX8FHuo65I+IcYUozW4M7+wE= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= diff --git a/src/db/sitestore/site_store.go b/src/db/sitestore/site_store.go index 74faebf..3701f43 100644 --- a/src/db/sitestore/site_store.go +++ b/src/db/sitestore/site_store.go @@ -31,20 +31,20 @@ type ISiteStore interface { } type ClientConfig struct { - SiteName string `json:"siteName"` - SiteDesc string `json:"siteDesc"` - Bg *BgConfig `json:"bg"` + SiteName string `json:"siteName" yaml:"siteName"` + SiteDesc string `json:"siteDesc" yaml:"siteDesc"` + Bg *BgConfig `json:"bg" yaml:"bg"` } type BgConfig struct { - Url string `json:"url"` - Repeat string `json:"repeat"` - Position string `json:"position"` - Align string `json:"align"` + Url string `json:"url" yaml:"url"` + Repeat string `json:"repeat" yaml:"repeat"` + Position string `json:"position" yaml:"position"` + Align string `json:"align" yaml:"align"` } type SiteConfig struct { - ClientCfg *ClientConfig `json:"clientCfg"` + ClientCfg *ClientConfig `json:"clientCfg" yaml:"clientCfg"` } type SiteStore struct { diff --git a/src/kvstore/boltdbpvd/provider.go b/src/kvstore/boltdbpvd/provider.go index b19f298..25dbfa9 100644 --- a/src/kvstore/boltdbpvd/provider.go +++ b/src/kvstore/boltdbpvd/provider.go @@ -16,6 +16,7 @@ import ( var ( ErrBucketNotFound = errors.New("bucket not found") + DBName = "quickshare.db" ) type BoltPvd struct { @@ -25,7 +26,7 @@ type BoltPvd struct { } func New(dbPath string, maxStrLen int) *BoltPvd { - boltPath := path.Join(path.Clean(dbPath), "quickshare.db") + boltPath := path.Join(path.Clean(dbPath), DBName) db, err := bolt.Open(boltPath, 0600, &bolt.Options{Timeout: 1 * time.Second}) if err != nil { panic(err) diff --git a/src/server/config.go b/src/server/config.go index e6a76b4..beb6d13 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -67,10 +67,15 @@ func NewConfig() *Config { } func DefaultConfig() (string, error) { - defaultCfg := &Config{ + cfgBytes, err := json.Marshal(DefaultConfigStruct()) + return string(cfgBytes), err +} + +func DefaultConfigStruct() *Config { + return &Config{ Fs: &FSConfig{ Root: "root", - OpensLimit: 128, + OpensLimit: 1024, OpenTTL: 60, // 1 min }, Users: &UsersCfg{ @@ -81,15 +86,16 @@ func DefaultConfig() (string, error) { CookieSecure: false, CookieHttpOnly: true, MinUserNameLen: 4, - MinPwdLen: 6, + MinPwdLen: 8, CaptchaWidth: 256, CaptchaHeight: 60, CaptchaEnabled: true, - UploadSpeedLimit: 100 * 1024, // B - DownloadSpeedLimit: 100 * 1024, // B + UploadSpeedLimit: 1024 * 1024, // B + DownloadSpeedLimit: 1024 * 1024, // B SpaceLimit: 1024 * 1024 * 100, // 100MB LimiterCapacity: 1000, LimiterCyc: 1000, // 1s + PredefinedUsers: []*userstore.UserCfg{}, }, Secrets: &Secrets{ TokenSecret: "", @@ -121,7 +127,4 @@ func DefaultConfig() (string, error) { }, }, } - - cfgBytes, err := json.Marshal(defaultCfg) - return string(cfgBytes), err }