Files
x-ui/web/service/setting.go
2021-05-27 23:04:39 +08:00

113 lines
2.5 KiB
Go

package service
import (
_ "embed"
"strconv"
"strings"
"x-ui/database"
"x-ui/database/model"
"x-ui/logger"
"x-ui/util/random"
)
//go:embed config.json
var xrayTemplateConfig string
type SettingService struct {
}
func (s *SettingService) ClearSetting() error {
db := database.GetDB()
return db.Delete(model.Setting{}).Error
}
func (s *SettingService) getSetting(key string) (*model.Setting, error) {
db := database.GetDB()
setting := &model.Setting{}
err := db.Model(model.Setting{}).Where("key = ?", key).First(setting).Error
if err != nil {
return nil, err
}
return setting, nil
}
func (s *SettingService) saveSetting(key string, value string) error {
setting, err := s.getSetting(key)
db := database.GetDB()
if database.IsNotFound(err) {
return db.Create(&model.Setting{
Key: key,
Value: value,
}).Error
} else if err != nil {
return err
}
setting.Key = key
setting.Value = value
return db.Save(setting).Error
}
func (s *SettingService) getString(key string, defaultValue string) (string, error) {
setting, err := s.getSetting(key)
if database.IsNotFound(err) {
return defaultValue, nil
} else if err != nil {
return "", err
}
return setting.Value, nil
}
func (s *SettingService) getInt(key string, defaultValue int) (int, error) {
str, err := s.getString(key, strconv.Itoa(defaultValue))
if err != nil {
return 0, err
}
return strconv.Atoi(str)
}
func (s *SettingService) GetXrayConfigTemplate() (string, error) {
return s.getString("xray_template_config", xrayTemplateConfig)
}
func (s *SettingService) GetListen() (string, error) {
return s.getString("web_listen", "")
}
func (s *SettingService) GetPort() (int, error) {
return s.getInt("web_port", 65432)
}
func (s *SettingService) GetCertFile() (string, error) {
return s.getString("web_cert_file", "")
}
func (s *SettingService) GetKeyFile() (string, error) {
return s.getString("web_key_file", "")
}
func (s *SettingService) GetSecret() ([]byte, error) {
seq := random.Seq(32)
secret, err := s.getString("secret", seq)
if secret == seq {
err := s.saveSetting("secret", secret)
if err != nil {
logger.Warning("save secret failed:", err)
}
}
return []byte(secret), err
}
func (s *SettingService) GetBasePath() (string, error) {
basePath, err := s.getString("web_base_path", "/")
if err != nil {
return "", err
}
if !strings.HasPrefix(basePath, "/") {
basePath = "/" + basePath
}
if !strings.HasSuffix(basePath, "/") {
basePath += "/"
}
return basePath, nil
}