User can now specify the path of db file and backups

legacy-v1
Qian Wang 5 years ago
parent 652261af81
commit deb5271cef

@ -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 {

@ -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":""
}

@ -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)

@ -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
}

Loading…
Cancel
Save