Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/web/job
diff options
context:
space:
mode:
authorMHSanaei <ho3ein.sanaei@gmail.com>2024-03-02 20:40:12 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2024-03-02 20:46:28 +0300
commit6563d23f382526b901947f5166aab14f5e9cfcbe (patch)
treeaab37a7284947e980771b0fef545295a2b200550 /web/job
parent3a46c3302be4d44d4d7f742683b6f88d10b1ddbd (diff)
Enhance CheckClientIpJob #1964
Diffstat (limited to 'web/job')
-rw-r--r--web/job/check_client_ip_job.go74
1 files changed, 44 insertions, 30 deletions
diff --git a/web/job/check_client_ip_job.go b/web/job/check_client_ip_job.go
index 0d46249d..c38112f6 100644
--- a/web/job/check_client_ip_job.go
+++ b/web/job/check_client_ip_job.go
@@ -10,11 +10,12 @@ import (
"regexp"
"sort"
"strings"
+ "sync"
"time"
+ "x-ui/config"
"x-ui/database"
"x-ui/database/model"
- "x-ui/config"
"x-ui/logger"
"x-ui/xray"
)
@@ -38,30 +39,43 @@ func NewCheckClientIpJob() *CheckClientIpJob {
}
func (j *CheckClientIpJob) Run() {
+ var wg sync.WaitGroup
- // create files and dirs required for iplimit if not exists
- for i := 0; i < len(ipFiles); i++ {
- err := os.MkdirAll(config.GetLogFolder(), 0770)
- j.checkError(err)
- file, err := os.OpenFile(ipFiles[i], os.O_CREATE|os.O_APPEND|os.O_RDWR, 0644)
- j.checkError(err)
- defer file.Close()
+ if j.checkFail2BanInstalled() {
+ j.openLogFiles(ipFiles)
}
- // check for limit ip
if j.hasLimitIp() {
- j.checkFail2BanInstalled()
- j.processLogFile()
+ if j.checkFail2BanInstalled() && xray.GetAccessLogPath() == "./access.log" {
+ j.processLogFile()
+ } else {
+ if !j.checkFail2BanInstalled() {
+ logger.Warning("fail2ban is not installed. IP limiting may not work properly.")
+ }
+ switch xray.GetAccessLogPath() {
+ case "none":
+ logger.Warning("Access log is set to 'none', check your Xray Configs")
+ case "":
+ logger.Warning("Access log doesn't exist in your Xray Configs")
+ }
+ }
}
- if !j.hasLimitIp() && xray.GetAccessLogPath() == "./access.log" {
- go j.clearLogTime()
+ if !j.checkFail2BanInstalled() && xray.GetAccessLogPath() == "./access.log" {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ j.clearLogTime()
+ }()
+ wg.Wait()
}
}
func (j *CheckClientIpJob) clearLogTime() {
- for {
- time.Sleep(time.Hour)
+ ticker := time.NewTicker(time.Hour)
+ defer ticker.Stop()
+
+ for range ticker.C {
j.clearAccessLog()
}
}
@@ -75,15 +89,18 @@ func (j *CheckClientIpJob) clearAccessLog() {
// reopen the access log file for reading
file, err := os.Open(accessLogPath)
j.checkError(err)
- defer file.Close()
// copy access log content to persistent file
_, err = io.Copy(logAccessP, file)
j.checkError(err)
+ // close the file after copying content
+ file.Close()
+
// clean access log
err = os.Truncate(accessLogPath, 0)
j.checkError(err)
+
}
func (j *CheckClientIpJob) hasLimitIp() bool {
@@ -115,29 +132,26 @@ func (j *CheckClientIpJob) hasLimitIp() bool {
return false
}
-func (j *CheckClientIpJob) checkFail2BanInstalled() {
+func (j *CheckClientIpJob) checkFail2BanInstalled() bool {
cmd := "fail2ban-client"
args := []string{"-h"}
-
err := exec.Command(cmd, args...).Run()
- if err != nil {
- logger.Warning("fail2ban is not installed. IP limiting may not work properly.")
+ return err == nil
+}
+
+func (j *CheckClientIpJob) openLogFiles(ipFiles []string) {
+ for i := 0; i < len(ipFiles); i++ {
+ err := os.MkdirAll(config.GetLogFolder(), 0770)
+ j.checkError(err)
+ file, err := os.OpenFile(ipFiles[i], os.O_CREATE|os.O_APPEND|os.O_RDWR, 0644)
+ j.checkError(err)
+ defer file.Close()
}
}
func (j *CheckClientIpJob) processLogFile() {
accessLogPath := xray.GetAccessLogPath()
- if accessLogPath == "none" {
- logger.Warning("Access log is set to 'none' check your Xray Configs")
- return
- }
-
- if accessLogPath == "" {
- logger.Warning("Access log doesn't exist in your Xray Configs")
- return
- }
-
file, err := os.Open(accessLogPath)
j.checkError(err)
defer file.Close()