From 82ddd106277420ff80093e6f014cf36c6c57a17b Mon Sep 17 00:00:00 2001 From: mhsanaei Date: Wed, 10 Sep 2025 21:12:37 +0200 Subject: [PATCH] Fixed: update Xray Core on Windows --- config/config.go | 2 +- web/job/check_client_ip_job.go | 15 +++++++++---- web/service/server.go | 40 +++++++++++++++++++++++----------- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/config/config.go b/config/config.go index 32d83055..d5fe65ff 100644 --- a/config/config.go +++ b/config/config.go @@ -95,7 +95,7 @@ func GetLogFolder() string { return logFolderPath } if runtime.GOOS == "windows" { - return getBaseDir() + return filepath.Join(".", "log") } return "/var/log" } diff --git a/web/job/check_client_ip_job.go b/web/job/check_client_ip_job.go index 5a30b616..c839a876 100644 --- a/web/job/check_client_ip_job.go +++ b/web/job/check_client_ip_job.go @@ -8,6 +8,7 @@ import ( "os" "os/exec" "regexp" + "runtime" "sort" "time" @@ -40,11 +41,17 @@ func (j *CheckClientIpJob) Run() { isAccessLogAvailable := j.checkAccessLogAvailable(iplimitActive) if iplimitActive { - if f2bInstalled && isAccessLogAvailable { - shouldClearAccessLog = j.processLogFile() + if runtime.GOOS == "windows" { + if isAccessLogAvailable { + shouldClearAccessLog = j.processLogFile() + } } else { - if !f2bInstalled { - logger.Warning("[LimitIP] Fail2Ban is not installed, Please install Fail2Ban from the x-ui bash menu.") + if f2bInstalled && isAccessLogAvailable { + shouldClearAccessLog = j.processLogFile() + } else { + if !f2bInstalled { + logger.Warning("[LimitIP] Fail2Ban is not installed, Please install Fail2Ban from the x-ui bash menu.") + } } } } diff --git a/web/service/server.go b/web/service/server.go index 5c3268a6..85af5597 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -12,6 +12,7 @@ import ( "net/http" "os" "os/exec" + "path/filepath" "runtime" "strconv" "strings" @@ -376,6 +377,8 @@ func (s *ServerService) downloadXRay(version string) (string, error) { switch osName { case "darwin": osName = "macos" + case "windows": + osName = "windows" } switch arch { @@ -419,19 +422,23 @@ func (s *ServerService) downloadXRay(version string) (string, error) { } func (s *ServerService) UpdateXray(version string) error { + // 1. Stop xray before doing anything + if err := s.StopXrayService(); err != nil { + logger.Warning("failed to stop xray before update:", err) + } + + // 2. Download the zip zipFileName, err := s.downloadXRay(version) if err != nil { return err } + defer os.Remove(zipFileName) zipFile, err := os.Open(zipFileName) if err != nil { return err } - defer func() { - zipFile.Close() - os.Remove(zipFileName) - }() + defer zipFile.Close() stat, err := zipFile.Stat() if err != nil { @@ -442,19 +449,14 @@ func (s *ServerService) UpdateXray(version string) error { return err } - s.xrayService.StopXray() - defer func() { - err := s.xrayService.RestartXray(true) - if err != nil { - logger.Error("start xray failed:", err) - } - }() - + // 3. Helper to extract files copyZipFile := func(zipName string, fileName string) error { zipFile, err := reader.Open(zipName) if err != nil { return err } + defer zipFile.Close() + os.MkdirAll(filepath.Dir(fileName), 0755) os.Remove(fileName) file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR|os.O_TRUNC, fs.ModePerm) if err != nil { @@ -465,11 +467,23 @@ func (s *ServerService) UpdateXray(version string) error { return err } - err = copyZipFile("xray", xray.GetBinaryPath()) + // 4. Extract correct binary + if runtime.GOOS == "windows" { + targetBinary := filepath.Join("bin", "xray-windows-amd64.exe") + err = copyZipFile("xray.exe", targetBinary) + } else { + err = copyZipFile("xray", xray.GetBinaryPath()) + } if err != nil { return err } + // 5. Restart xray + if err := s.xrayService.RestartXray(true); err != nil { + logger.Error("start xray failed:", err) + return err + } + return nil }