|  | @@ -3,6 +3,7 @@ package job
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  |  	"io"
 | 
	
		
			
				|  |  |  	"os"
 | 
	
		
			
				|  |  | +	"path/filepath"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"x-ui/logger"
 | 
	
		
			
				|  |  |  	"x-ui/xray"
 | 
	
	
		
			
				|  | @@ -14,28 +15,53 @@ func NewClearLogsJob() *ClearLogsJob {
 | 
	
		
			
				|  |  |  	return new(ClearLogsJob)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// ensureFileExists creates the necessary directories and file if they don't exist
 | 
	
		
			
				|  |  | +func ensureFileExists(path string) error {
 | 
	
		
			
				|  |  | +	dir := filepath.Dir(path)
 | 
	
		
			
				|  |  | +	if err := os.MkdirAll(dir, 0755); err != nil {
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	file, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0644)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	file.Close()
 | 
	
		
			
				|  |  | +	return nil
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // Here Run is an interface method of the Job interface
 | 
	
		
			
				|  |  |  func (j *ClearLogsJob) Run() {
 | 
	
		
			
				|  |  |  	logFiles := []string{xray.GetIPLimitLogPath(), xray.GetIPLimitBannedLogPath(), xray.GetAccessPersistentLogPath()}
 | 
	
		
			
				|  |  |  	logFilesPrev := []string{xray.GetIPLimitBannedPrevLogPath(), xray.GetAccessPersistentPrevLogPath()}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	// clear log files and copy to previous logs
 | 
	
		
			
				|  |  | +	// Ensure all log files and their paths exist
 | 
	
		
			
				|  |  | +	for _, path := range append(logFiles, logFilesPrev...) {
 | 
	
		
			
				|  |  | +		if err := ensureFileExists(path); err != nil {
 | 
	
		
			
				|  |  | +			logger.Warning("Failed to ensure log file exists:", path, "-", err)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Clear log files and copy to previous logs
 | 
	
		
			
				|  |  |  	for i := 0; i < len(logFiles); i++ {
 | 
	
		
			
				|  |  |  		if i > 0 {
 | 
	
		
			
				|  |  | -			// copy to previous logs
 | 
	
		
			
				|  |  | +			// Copy to previous logs
 | 
	
		
			
				|  |  |  			logFilePrev, err := os.OpenFile(logFilesPrev[i-1], os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
 | 
	
		
			
				|  |  |  			if err != nil {
 | 
	
		
			
				|  |  | -				logger.Warning("clear logs job err:", err)
 | 
	
		
			
				|  |  | +				logger.Warning("Failed to open previous log file for writing:", logFilesPrev[i-1], "-", err)
 | 
	
		
			
				|  |  | +				continue
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			logFile, err := os.OpenFile(logFiles[i], os.O_RDONLY, 0644)
 | 
	
		
			
				|  |  | +			if err != nil {
 | 
	
		
			
				|  |  | +				logger.Warning("Failed to open current log file for reading:", logFiles[i], "-", err)
 | 
	
		
			
				|  |  | +				logFilePrev.Close()
 | 
	
		
			
				|  |  | +				continue
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			logFile, err :=  os.OpenFile(logFiles[i], os.O_CREATE|os.O_RDONLY, 0644)
 | 
	
		
			
				|  |  | -			if err == nil {
 | 
	
		
			
				|  |  | -				_, err = io.Copy(logFilePrev, logFile)
 | 
	
		
			
				|  |  | -				if err != nil {
 | 
	
		
			
				|  |  | -					logger.Warning("clear logs job err:", err)
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			} else {
 | 
	
		
			
				|  |  | -				logger.Warning("clear logs job err:", err)
 | 
	
		
			
				|  |  | +			_, err = io.Copy(logFilePrev, logFile)
 | 
	
		
			
				|  |  | +			if err != nil {
 | 
	
		
			
				|  |  | +				logger.Warning("Failed to copy log file:", logFiles[i], "to", logFilesPrev[i-1], "-", err)
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			logFile.Close()
 | 
	
	
		
			
				|  | @@ -44,7 +70,7 @@ func (j *ClearLogsJob) Run() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		err := os.Truncate(logFiles[i], 0)
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  | -			logger.Warning("clear logs job err:", err)
 | 
	
		
			
				|  |  | +			logger.Warning("Failed to truncate log file:", logFiles[i], "-", err)
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 |