123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package client
- import (
- "backup-x/entity"
- "backup-x/util"
- "log"
- "os"
- "time"
- )
- // DeleteOldBackup for client
- func DeleteOldBackup() {
- for {
- delay := util.GetDelaySeconds(2)
- log.Printf("删除过期的备份文件将在 %.1f 小时后运行\n", delay.Hours())
- time.Sleep(delay)
- conf, err := entity.GetConfigCache()
- if err != nil {
- return
- }
- for _, backupConf := range conf.BackupConfig {
- // empty project and disabeld
- if !backupConf.NotEmptyProject() || backupConf.Enabled == 1 {
- continue
- }
- // 删除本地的过时文件
- deleteLocalOlderFiles(backupConf)
- // 删除对象存储中的过时文件
- deleteS3OlderFiles(conf.S3Config, backupConf)
- }
- }
- }
- // deleteLocalOlderFiles 删除本地的过时文件
- func deleteLocalOlderFiles(backupConf entity.BackupConfig) {
- backupFiles, err := os.ReadDir(backupConf.GetProjectPath())
- if err != nil {
- log.Printf("读取项目 %s 的本地目录失败! ERR: %s\n", backupConf.ProjectName, err)
- }
- if backupConf.SaveDays <= 0 {
- log.Printf("项目 %s 的本地保存(天)设置不正确", backupConf.ProjectName)
- return
- }
- backupFileNames := make([]string, len(backupFiles))
- for _, backupFile := range backupFiles {
- if !backupFile.IsDir() {
- info, err := backupFile.Info()
- if err == nil {
- if info.Size() >= minFileSize {
- backupFileNames = append(backupFileNames, backupFile.Name())
- } else {
- if util.IsFileNameDate(backupFile.Name()) {
- log.Printf("备份后的大小为 %d 字节,小于最低值 %d,将删除备份文件: %s", info.Size(), minFileSize, backupConf.GetProjectPath()+string(os.PathSeparator)+backupFile.Name())
- os.Remove(backupConf.GetProjectPath() + string(os.PathSeparator) + backupFile.Name())
- }
- }
- }
- }
- }
- tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDays, backupFileNames, backupConf.ProjectName)
- for i := 0; i < len(tobeDeleteFiles); i++ {
- err := os.Remove(backupConf.GetProjectPath() + string(os.PathSeparator) + tobeDeleteFiles[i])
- if err == nil {
- log.Printf("删除过期的文件(本地) %s 成功", backupConf.ProjectName+string(os.PathSeparator)+tobeDeleteFiles[i])
- } else {
- log.Printf("删除过期的文件(本地) %s 失败: %s", backupConf.ProjectName+string(os.PathSeparator)+tobeDeleteFiles[i], err)
- }
- }
- }
- // deleteS3OlderFiles 删除对象存储的过时文件
- func deleteS3OlderFiles(s3Conf entity.S3Config, backupConf entity.BackupConfig) {
- if !s3Conf.CheckNotEmpty() {
- return
- }
- if backupConf.SaveDaysS3 <= 0 {
- log.Printf("项目 %s 的对象存储保存(天)设置不正确", backupConf.ProjectName)
- return
- }
- fileNames, err := s3Conf.ListFiles(backupConf.GetProjectPath())
- if err != nil {
- log.Printf("读取项目 %s 的对象存储目录失败! ERR: %s\n", backupConf.ProjectName, err)
- }
- tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDaysS3, fileNames, backupConf.ProjectName)
- for i := 0; i < len(tobeDeleteFiles); i++ {
- err := s3Conf.DeleteFile(tobeDeleteFiles[i])
- if err == nil {
- log.Printf("删除过期的文件(对象存储) %s 成功", tobeDeleteFiles[i])
- } else {
- log.Printf("删除过期的文件(对象存储) %s 失败: %s", tobeDeleteFiles[i], err)
- }
- }
- }
|