From 569c9428fb7924fb693605385f745e4bf524dc20 Mon Sep 17 00:00:00 2001 From: Hamidreza <70919649+hamid-gh98@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:24:41 +0330 Subject: [PATCH] [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 --- web/job/check_client_ip_job.go | 35 +++++++++++++++++++++------------- web/service/setting.go | 16 +++------------- xray/process.go | 12 ++++++------ 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/web/job/check_client_ip_job.go b/web/job/check_client_ip_job.go index 4b799ab18..c5e8fc0d4 100644 --- a/web/job/check_client_ip_job.go +++ b/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 diff --git a/web/service/setting.go b/web/service/setting.go index 4a293dc04..9e7400590 100644 --- a/web/service/setting.go +++ b/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 { diff --git a/xray/process.go b/xray/process.go index fcbe6f783..3203d7cd9 100644 --- a/xray/process.go +++ b/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) }