Browse Source

[iplimit] fix access log path in settings service (#2044)

* [iplimit] fix access log path in settings service

better to avoid hardcoding the access log path to enhance flexibility. not all users prefer the default './access.log'

* [iplimit] fix iplimit
Hamidreza 1 year ago
parent
commit
569c9428fb
3 changed files with 31 additions and 32 deletions
  1. 22 13
      web/job/check_client_ip_job.go
  2. 3 13
      web/service/setting.go
  3. 6 6
      xray/process.go

+ 22 - 13
web/job/check_client_ip_job.go

@@ -44,7 +44,7 @@ func (j *CheckClientIpJob) Run() {
 			shouldClearAccessLog = j.processLogFile()
 		} else {
 			if !f2bInstalled {
-				logger.Warning("fail2ban is not installed. IP limiting may not work properly.")
+				logger.Warning("[iplimit] fail2ban is not installed. IP limiting may not work properly.")
 			}
 		}
 	}
@@ -58,8 +58,11 @@ func (j *CheckClientIpJob) clearAccessLog() {
 	logAccessP, err := os.OpenFile(xray.GetAccessPersistentLogPath(), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644)
 	j.checkError(err)
 
+	// get access log path to open it
+	accessLogPath, err := xray.GetAccessLogPath()
+	j.checkError(err)
+
 	// reopen the access log file for reading
-	accessLogPath := xray.GetAccessLogPath()
 	file, err := os.Open(accessLogPath)
 	j.checkError(err)
 
@@ -106,15 +109,9 @@ func (j *CheckClientIpJob) hasLimitIp() bool {
 	return false
 }
 
-func (j *CheckClientIpJob) checkFail2BanInstalled() bool {
-	cmd := "fail2ban-client"
-	args := []string{"-h"}
-	err := exec.Command(cmd, args...).Run()
-	return err == nil
-}
-
 func (j *CheckClientIpJob) processLogFile() bool {
-	accessLogPath := xray.GetAccessLogPath()
+	accessLogPath, err := xray.GetAccessLogPath()
+	j.checkError(err)
 
 	file, err := os.Open(accessLogPath)
 	j.checkError(err)
@@ -170,10 +167,21 @@ func (j *CheckClientIpJob) processLogFile() bool {
 	return shouldCleanLog
 }
 
-func (j *CheckClientIpJob) checkAccessLogAvailable(doWarning bool) bool {
-	accessLogPath := xray.GetAccessLogPath()
+func (j *CheckClientIpJob) checkFail2BanInstalled() bool {
+	cmd := "fail2ban-client"
+	args := []string{"-h"}
+	err := exec.Command(cmd, args...).Run()
+	return err == nil
+}
+
+func (j *CheckClientIpJob) checkAccessLogAvailable(handleWarning bool) bool {
 	isAvailable := true
 	warningMsg := ""
+	accessLogPath, err := xray.GetAccessLogPath()
+	if err != nil {
+		return false
+	}
+
 	// access log is not available if it is set to 'none' or an empty string
 	switch accessLogPath {
 	case "none":
@@ -183,7 +191,8 @@ func (j *CheckClientIpJob) checkAccessLogAvailable(doWarning bool) bool {
 		warningMsg = "Access log doesn't exist in your Xray Configs"
 		isAvailable = false
 	}
-	if doWarning && warningMsg != "" {
+
+	if handleWarning && warningMsg != "" {
 		logger.Warning(warningMsg)
 	}
 	return isAvailable

+ 3 - 13
web/service/setting.go

@@ -17,6 +17,7 @@ import (
 	"x-ui/util/random"
 	"x-ui/util/reflect_util"
 	"x-ui/web/entity"
+	"x-ui/xray"
 )
 
 //go:embed config.json
@@ -460,22 +461,11 @@ func (s *SettingService) SetWarp(data string) error {
 }
 
 func (s *SettingService) GetIpLimitEnable() (bool, error) {
-	templateConfig, err := s.GetXrayConfigTemplate()
+	accessLogPath, err := xray.GetAccessLogPath()
 	if err != nil {
 		return false, err
 	}
-
-	var xrayConfig map[string]interface{}
-	err = json.Unmarshal([]byte(templateConfig), &xrayConfig)
-	if err != nil {
-		return false, err
-	}
-	if logConfig, ok := xrayConfig["log"].(map[string]interface{}); ok {
-		if accessLogPath, ok := logConfig["access"].(string); ok {
-			return accessLogPath == "./access.log", nil
-		}
-	}
-	return false, nil
+	return (accessLogPath != "none" && accessLogPath != ""), nil
 }
 
 func (s *SettingService) UpdateAllSetting(allSetting *entity.AllSetting) error {

+ 6 - 6
xray/process.go

@@ -57,28 +57,28 @@ func GetAccessPersistentPrevLogPath() string {
 	return config.GetLogFolder() + "/3xipl-ap.prev.log"
 }
 
-func GetAccessLogPath() string {
+func GetAccessLogPath() (string, error) {
 	config, err := os.ReadFile(GetConfigPath())
 	if err != nil {
 		logger.Warningf("Something went wrong: %s", err)
+		return "", err
 	}
 
 	jsonConfig := map[string]interface{}{}
 	err = json.Unmarshal([]byte(config), &jsonConfig)
 	if err != nil {
 		logger.Warningf("Something went wrong: %s", err)
+		return "", err
 	}
 
 	if jsonConfig["log"] != nil {
 		jsonLog := jsonConfig["log"].(map[string]interface{})
 		if jsonLog["access"] != nil {
-
 			accessLogPath := jsonLog["access"].(string)
-
-			return accessLogPath
+			return accessLogPath, nil
 		}
 	}
-	return ""
+	return "", err
 }
 
 func stopProcess(p *Process) {
@@ -203,7 +203,7 @@ func (p *process) Start() (err error) {
 		return common.NewErrorf("Failed to generate xray configuration file: %v", err)
 	}
 
-	err = os.MkdirAll(config.GetLogFolder(), 0770)
+	err = os.MkdirAll(config.GetLogFolder(), 0o770)
 	if err != nil {
 		logger.Warningf("Something went wrong: %s", err)
 	}