From deb5271cef79baa085e3a24e2178ea9d805c3570 Mon Sep 17 00:00:00 2001 From: Qian Wang Date: Sun, 30 Dec 2018 00:18:50 +0000 Subject: [PATCH] User can now specify the path of db file and backups --- cmd/ck-server/ck-server.go | 2 +- config/ckserver.json | 4 +++- internal/server/state.go | 15 +++++++++------ internal/server/usermanager/userpanel.go | 20 ++++++++++++++------ 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/cmd/ck-server/ck-server.go b/cmd/ck-server/ck-server.go index a344673..ed53139 100644 --- a/cmd/ck-server/ck-server.go +++ b/cmd/ck-server/ck-server.go @@ -242,7 +242,7 @@ func main() { localPort = strings.Split(*localAddr, ":")[1] log.Printf("Starting standalone mode, listening on %v:%v to ss at %v:%v\n", remoteHost, remotePort, localHost, localPort) } - sta, _ := server.InitState(localHost, localPort, remoteHost, remotePort, time.Now, "userinfo.db") + sta, _ := server.InitState(localHost, localPort, remoteHost, remotePort, time.Now) err := sta.ParseConfig(pluginOpts) if err != nil { diff --git a/config/ckserver.json b/config/ckserver.json index dcfcb83..557cf8a 100644 --- a/config/ckserver.json +++ b/config/ckserver.json @@ -1,5 +1,7 @@ { "WebServerAddr":"204.79.197.200:443", "PrivateKey":"EN5aPEpNBO+vw+BtFQY2OnK9bQU7rvEj5qmnmgwEtUc=", - "AdminUID":"ugDmcEmxWf0pKxfkZ/8EoP35Ht+wQnqf3L0xYgyQFlQ=" + "AdminUID":"ugDmcEmxWf0pKxfkZ/8EoP35Ht+wQnqf3L0xYgyQFlQ=", + "DatabasePath":"userinfo.db", + "BackupDirPath":"" } diff --git a/internal/server/state.go b/internal/server/state.go index 1c6a6ff..118e57c 100644 --- a/internal/server/state.go +++ b/internal/server/state.go @@ -17,6 +17,8 @@ type rawConfig struct { WebServerAddr string PrivateKey string AdminUID string + DatabasePath string + BackupDirPath string } type stateManager interface { ParseConfig(string) error @@ -41,18 +43,13 @@ type State struct { WebServerAddr string } -func InitState(localHost, localPort, remoteHost, remotePort string, nowFunc func() time.Time, dbPath string) (*State, error) { - up, err := usermanager.MakeUserpanel(dbPath) - if err != nil { - return nil, err - } +func InitState(localHost, localPort, remoteHost, remotePort string, nowFunc func() time.Time) (*State, error) { ret := &State{ SS_LOCAL_HOST: localHost, SS_LOCAL_PORT: localPort, SS_REMOTE_HOST: remoteHost, SS_REMOTE_PORT: remotePort, Now: nowFunc, - Userpanel: up, } ret.usedRandom = make(map[[32]byte]int) return ret, nil @@ -101,6 +98,12 @@ func (sta *State) ParseConfig(conf string) (err error) { return errors.New("Failed to unmarshal: " + err.Error()) } + up, err := usermanager.MakeUserpanel(preParse.DatabasePath, preParse.BackupDirPath) + if err != nil { + return err + } + sta.Userpanel = up + sta.WebServerAddr = preParse.WebServerAddr pvBytes, err := base64.StdEncoding.DecodeString(preParse.PrivateKey) diff --git a/internal/server/usermanager/userpanel.go b/internal/server/usermanager/userpanel.go index eeb1e8a..d1480c4 100644 --- a/internal/server/usermanager/userpanel.go +++ b/internal/server/usermanager/userpanel.go @@ -1,10 +1,11 @@ package usermanager import ( + "encoding/base64" "encoding/binary" - "encoding/hex" "errors" "os" + "path" "strconv" "sync" "time" @@ -19,19 +20,26 @@ var PutUint32 = binary.BigEndian.PutUint32 var PutUint64 = binary.BigEndian.PutUint64 type Userpanel struct { - db *bolt.DB + db *bolt.DB + bakRoot string activeUsersM sync.RWMutex activeUsers map[[32]byte]*User } -func MakeUserpanel(dbPath string) (*Userpanel, error) { +func MakeUserpanel(dbPath, bakRoot string) (*Userpanel, error) { db, err := bolt.Open(dbPath, 0600, nil) if err != nil { return nil, err } + if bakRoot == "" { + os.Mkdir("db-backup", 0777) + bakRoot = "db-backup" + } + bakRoot = path.Clean(bakRoot) up := &Userpanel{ db: db, + bakRoot: bakRoot, activeUsers: make(map[[32]byte]*User), } go func() { @@ -66,8 +74,8 @@ func (up *Userpanel) updateCredits() { } -// TODO: prefixed backup path -func (up *Userpanel) backupDB(bakPath string) error { +func (up *Userpanel) backupDB(bakFileName string) error { + bakPath := up.bakRoot + "/" + bakFileName _, err := os.Stat(bakPath) if err == nil { return errors.New("Attempting to overwrite a file during backup!") @@ -300,7 +308,7 @@ func (up *Userpanel) addNewUser(uinfo UserInfo) error { } func (up *Userpanel) delUser(UID []byte) error { - err := up.backupDB(strconv.FormatInt(time.Now().Unix(), 10) + "_pre_del_" + hex.EncodeToString(UID) + ".bak") + err := up.backupDB(strconv.FormatInt(time.Now().Unix(), 10) + "_pre_del_" + base64.StdEncoding.EncodeToString(UID) + ".bak") if err != nil { return err }