mirror of
https://github.com/alireza0/x-ui.git
synced 2026-08-27 03:43:28 +00:00
75 lines
1.8 KiB
Go
75 lines
1.8 KiB
Go
package service
|
|
|
|
import (
|
|
_ "embed"
|
|
"encoding/json"
|
|
"strings"
|
|
|
|
"github.com/alireza0/x-ui/logger"
|
|
"github.com/alireza0/x-ui/util/common"
|
|
"github.com/alireza0/x-ui/util/json_util"
|
|
"github.com/alireza0/x-ui/xray"
|
|
)
|
|
|
|
type XraySettingService struct {
|
|
SettingService
|
|
}
|
|
|
|
func (s *XraySettingService) SaveXraySetting(newXraySettings string) error {
|
|
xrayConfig := &xray.Config{}
|
|
err := json.Unmarshal([]byte(newXraySettings), xrayConfig)
|
|
if err != nil {
|
|
return common.NewError("xray template config invalid:", err)
|
|
}
|
|
return s.ensureLocalLogFile(xrayConfig, true)
|
|
}
|
|
|
|
func (s *XraySettingService) ensureLocalLogFile(xrayConfig *xray.Config, alwaysSave bool) error {
|
|
if len(xrayConfig.LogConfig) == 0 {
|
|
return nil
|
|
}
|
|
var logConfig map[string]interface{}
|
|
if err := json.Unmarshal(xrayConfig.LogConfig, &logConfig); err != nil {
|
|
return err
|
|
}
|
|
|
|
changed := false
|
|
for _, key := range []string{"access", "error"} {
|
|
val, ok := logConfig[key].(string)
|
|
if !ok || val == "" {
|
|
continue
|
|
}
|
|
if sanitized, wasChanged := sanitizeLogPath(val); wasChanged {
|
|
logConfig[key] = sanitized
|
|
changed = true
|
|
}
|
|
}
|
|
|
|
if !changed && !alwaysSave {
|
|
return nil
|
|
}
|
|
|
|
if changed {
|
|
newLogConfig, err := json.Marshal(logConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
xrayConfig.LogConfig = json_util.RawMessage(newLogConfig)
|
|
}
|
|
|
|
updatedTemplate, err := json.MarshalIndent(xrayConfig, "", " ")
|
|
if err != nil {
|
|
logger.Warning("ensureLocalLogFile: failed to marshal template:", err)
|
|
return err
|
|
}
|
|
return s.SettingService.saveSetting("xrayTemplateConfig", string(updatedTemplate))
|
|
}
|
|
|
|
func sanitizeLogPath(p string) (string, bool) {
|
|
check := strings.TrimPrefix(p, "./")
|
|
if !strings.Contains(check, "/") {
|
|
return p, false
|
|
}
|
|
idx := strings.LastIndex(p, "/")
|
|
return "./" + p[idx+1:], true
|
|
}
|