diff --git a/fileserver/fileserver.go b/fileserver/fileserver.go index bd41b70..1886a83 100644 --- a/fileserver/fileserver.go +++ b/fileserver/fileserver.go @@ -10,6 +10,7 @@ import ( "net/http" "os" "path/filepath" + "strconv" "strings" _ "github.com/go-sql-driver/mysql" @@ -37,6 +38,14 @@ var seafileDB, ccnetDB *sql.DB // when SQLite is used, user and group db are separated. var userDB, groupDB *sql.DB +// Storage unit. +const ( + KB = 1000 + MB = 1000000 + GB = 1000000000 + TB = 1000000000000 +) + type fileServerOptions struct { host string port uint32 @@ -52,6 +61,7 @@ type fileServerOptions struct { windowsEncoding string // Timeout for fs-id-list requests. fsIDListRequestTimeout uint32 + defaultQuota int64 } var options fileServerOptions @@ -132,8 +142,7 @@ func loadCcnetDB() { } func loadSeafileDB() { - var seafileConfPath string - seafileConfPath = filepath.Join(centralDir, "seafile.conf") + seafileConfPath := filepath.Join(centralDir, "seafile.conf") config, err := ini.Load(seafileConfPath) if err != nil { @@ -203,9 +212,50 @@ func loadSeafileDB() { dbType = dbEngine } +func parseQuota(quotaStr string) int64 { + var quota int64 + var multiplier int64 = GB + if end := strings.Index(quotaStr, "kb"); end > 0 { + multiplier = KB + quotaInt, err := strconv.ParseInt(quotaStr[:end], 10, 0) + if err != nil { + return InfiniteQuota + } + quota = quotaInt * multiplier + } else if end := strings.Index(quotaStr, "mb"); end > 0 { + multiplier = MB + quotaInt, err := strconv.ParseInt(quotaStr[:end], 10, 0) + if err != nil { + return InfiniteQuota + } + quota = quotaInt * multiplier + } else if end := strings.Index(quotaStr, "gb"); end > 0 { + multiplier = GB + quotaInt, err := strconv.ParseInt(quotaStr[:end], 10, 0) + if err != nil { + return InfiniteQuota + } + quota = quotaInt * multiplier + } else if end := strings.Index(quotaStr, "tb"); end > 0 { + multiplier = TB + quotaInt, err := strconv.ParseInt(quotaStr[:end], 10, 0) + if err != nil { + return InfiniteQuota + } + quota = quotaInt * multiplier + } else { + quotaInt, err := strconv.ParseInt(quotaStr, 10, 0) + if err != nil { + return InfiniteQuota + } + quota = quotaInt * multiplier + } + + return quota +} + func loadFileServerOptions() { - var seafileConfPath string - seafileConfPath = filepath.Join(centralDir, "seafile.conf") + seafileConfPath := filepath.Join(centralDir, "seafile.conf") config, err := ini.Load(seafileConfPath) if err != nil { @@ -225,6 +275,13 @@ func loadFileServerOptions() { parseFileServerSection(section) } + if section, err := config.GetSection("quota"); err == nil { + if key, err := section.GetKey("default"); err == nil { + quotaStr := key.String() + options.defaultQuota = parseQuota(quotaStr) + } + } + ccnetConfPath := filepath.Join(centralDir, "ccnet.conf") config, err = ini.Load(ccnetConfPath) if err != nil { @@ -282,6 +339,7 @@ func initDefaultOptions() { options.maxIndexingThreads = 1 options.webTokenExpireTime = 7200 options.clusterSharedTempFileMode = 0600 + options.defaultQuota = InfiniteQuota } func main() { diff --git a/fileserver/quota.go b/fileserver/quota.go index b92313e..9f6f314 100644 --- a/fileserver/quota.go +++ b/fileserver/quota.go @@ -3,11 +3,8 @@ package main import ( "database/sql" "fmt" + "github.com/haiwen/seafile-server/fileserver/repomgr" - "gopkg.in/ini.v1" - "path/filepath" - "strconv" - "strings" ) // InfiniteQuota indicates that the quota is unlimited. @@ -73,83 +70,12 @@ func getUserQuota(user string) (int64, error) { } if quota <= 0 { - quota = getDefaultQuota() + quota = options.defaultQuota } return quota, nil } -// Storage unit. -const ( - KB = 1000 - MB = 1000000 - GB = 1000000000 - TB = 1000000000000 -) - -func getDefaultQuota() int64 { - seafileConfPath := filepath.Join(absDataDir, "seafile.conf") - config, err := ini.Load(seafileConfPath) - if err != nil { - return InfiniteQuota - } - var quota int64 - section, err := config.GetSection("quota") - if err != nil { - return InfiniteQuota - } - key, err := section.GetKey("default") - if err != nil { - return InfiniteQuota - } - quotaStr := key.String() - quota = parseQuota(quotaStr) - - return quota -} - -func parseQuota(quotaStr string) int64 { - var quota int64 - var multiplier int64 = GB - if end := strings.Index(quotaStr, "kb"); end > 0 { - multiplier = KB - quotaInt, err := strconv.ParseInt(quotaStr[:end], 10, 0) - if err != nil { - return InfiniteQuota - } - quota = quotaInt * multiplier - } else if end := strings.Index(quotaStr, "mb"); end > 0 { - multiplier = MB - quotaInt, err := strconv.ParseInt(quotaStr[:end], 10, 0) - if err != nil { - return InfiniteQuota - } - quota = quotaInt * multiplier - } else if end := strings.Index(quotaStr, "gb"); end > 0 { - multiplier = GB - quotaInt, err := strconv.ParseInt(quotaStr[:end], 10, 0) - if err != nil { - return InfiniteQuota - } - quota = quotaInt * multiplier - } else if end := strings.Index(quotaStr, "tb"); end > 0 { - multiplier = TB - quotaInt, err := strconv.ParseInt(quotaStr[:end], 10, 0) - if err != nil { - return InfiniteQuota - } - quota = quotaInt * multiplier - } else { - quotaInt, err := strconv.ParseInt(quotaStr, 10, 0) - if err != nil { - return InfiniteQuota - } - quota = quotaInt * multiplier - } - - return quota -} - func getUserUsage(user string) (int64, error) { var usage sql.NullInt64 sqlStr := "SELECT SUM(size) FROM " +