mirror of https://github.com/cbeuw/Cloak
User can now specify the path of db file and backups
This commit is contained in:
parent
652261af81
commit
deb5271cef
|
|
@ -242,7 +242,7 @@ func main() {
|
||||||
localPort = strings.Split(*localAddr, ":")[1]
|
localPort = strings.Split(*localAddr, ":")[1]
|
||||||
log.Printf("Starting standalone mode, listening on %v:%v to ss at %v:%v\n", remoteHost, remotePort, localHost, localPort)
|
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)
|
err := sta.ParseConfig(pluginOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
{
|
{
|
||||||
"WebServerAddr":"204.79.197.200:443",
|
"WebServerAddr":"204.79.197.200:443",
|
||||||
"PrivateKey":"EN5aPEpNBO+vw+BtFQY2OnK9bQU7rvEj5qmnmgwEtUc=",
|
"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
|
WebServerAddr string
|
||||||
PrivateKey string
|
PrivateKey string
|
||||||
AdminUID string
|
AdminUID string
|
||||||
|
DatabasePath string
|
||||||
|
BackupDirPath string
|
||||||
}
|
}
|
||||||
type stateManager interface {
|
type stateManager interface {
|
||||||
ParseConfig(string) error
|
ParseConfig(string) error
|
||||||
|
|
@ -41,18 +43,13 @@ type State struct {
|
||||||
WebServerAddr string
|
WebServerAddr string
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitState(localHost, localPort, remoteHost, remotePort string, nowFunc func() time.Time, dbPath string) (*State, error) {
|
func InitState(localHost, localPort, remoteHost, remotePort string, nowFunc func() time.Time) (*State, error) {
|
||||||
up, err := usermanager.MakeUserpanel(dbPath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
ret := &State{
|
ret := &State{
|
||||||
SS_LOCAL_HOST: localHost,
|
SS_LOCAL_HOST: localHost,
|
||||||
SS_LOCAL_PORT: localPort,
|
SS_LOCAL_PORT: localPort,
|
||||||
SS_REMOTE_HOST: remoteHost,
|
SS_REMOTE_HOST: remoteHost,
|
||||||
SS_REMOTE_PORT: remotePort,
|
SS_REMOTE_PORT: remotePort,
|
||||||
Now: nowFunc,
|
Now: nowFunc,
|
||||||
Userpanel: up,
|
|
||||||
}
|
}
|
||||||
ret.usedRandom = make(map[[32]byte]int)
|
ret.usedRandom = make(map[[32]byte]int)
|
||||||
return ret, nil
|
return ret, nil
|
||||||
|
|
@ -101,6 +98,12 @@ func (sta *State) ParseConfig(conf string) (err error) {
|
||||||
return errors.New("Failed to unmarshal: " + 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
|
sta.WebServerAddr = preParse.WebServerAddr
|
||||||
|
|
||||||
pvBytes, err := base64.StdEncoding.DecodeString(preParse.PrivateKey)
|
pvBytes, err := base64.StdEncoding.DecodeString(preParse.PrivateKey)
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
package usermanager
|
package usermanager
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/base64"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -19,19 +20,26 @@ var PutUint32 = binary.BigEndian.PutUint32
|
||||||
var PutUint64 = binary.BigEndian.PutUint64
|
var PutUint64 = binary.BigEndian.PutUint64
|
||||||
|
|
||||||
type Userpanel struct {
|
type Userpanel struct {
|
||||||
db *bolt.DB
|
db *bolt.DB
|
||||||
|
bakRoot string
|
||||||
|
|
||||||
activeUsersM sync.RWMutex
|
activeUsersM sync.RWMutex
|
||||||
activeUsers map[[32]byte]*User
|
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)
|
db, err := bolt.Open(dbPath, 0600, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if bakRoot == "" {
|
||||||
|
os.Mkdir("db-backup", 0777)
|
||||||
|
bakRoot = "db-backup"
|
||||||
|
}
|
||||||
|
bakRoot = path.Clean(bakRoot)
|
||||||
up := &Userpanel{
|
up := &Userpanel{
|
||||||
db: db,
|
db: db,
|
||||||
|
bakRoot: bakRoot,
|
||||||
activeUsers: make(map[[32]byte]*User),
|
activeUsers: make(map[[32]byte]*User),
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
|
|
@ -66,8 +74,8 @@ func (up *Userpanel) updateCredits() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: prefixed backup path
|
func (up *Userpanel) backupDB(bakFileName string) error {
|
||||||
func (up *Userpanel) backupDB(bakPath string) error {
|
bakPath := up.bakRoot + "/" + bakFileName
|
||||||
_, err := os.Stat(bakPath)
|
_, err := os.Stat(bakPath)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return errors.New("Attempting to overwrite a file during backup!")
|
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 {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue