delete_old_file.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package client
  2. import (
  3. "backup-x/entity"
  4. "backup-x/util"
  5. "io/ioutil"
  6. "log"
  7. "os"
  8. "time"
  9. )
  10. // DeleteOldBackup for client
  11. func DeleteOldBackup() {
  12. for {
  13. delay := util.GetDelaySeconds(2)
  14. log.Printf("删除过期的备份文件将在 %.1f 小时后运行\n", delay.Hours())
  15. time.Sleep(delay)
  16. conf, err := entity.GetConfigCache()
  17. if err != nil {
  18. return
  19. }
  20. for _, backupConf := range conf.BackupConfig {
  21. if !backupConf.NotEmptyProject() {
  22. continue
  23. }
  24. // 删除本地的过时文件
  25. deleteLocalOlderFiles(backupConf)
  26. // 删除对象存储中的过时文件
  27. deleteS3OlderFiles(conf.S3Config, backupConf)
  28. }
  29. }
  30. }
  31. // deleteLocalOlderFiles 删除本地的过时文件
  32. func deleteLocalOlderFiles(backupConf entity.BackupConfig) {
  33. backupFiles, err := ioutil.ReadDir(backupConf.GetProjectPath())
  34. if err != nil {
  35. log.Printf("读取项目 %s 的本地目录失败! ERR: %s\n", backupConf.ProjectName, err)
  36. }
  37. backupFileNames := make([]string, len(backupFiles))
  38. for _, backupFile := range backupFiles {
  39. backupFileNames = append(backupFileNames, backupFile.Name())
  40. }
  41. tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDays, backupFileNames)
  42. for i := 0; i < len(tobeDeleteFiles); i++ {
  43. err := os.Remove(backupConf.GetProjectPath() + string(os.PathSeparator) + tobeDeleteFiles[i])
  44. if err == nil {
  45. log.Printf("删除过期的文件(本地) %s 成功", backupConf.ProjectName+string(os.PathSeparator)+tobeDeleteFiles[i])
  46. } else {
  47. log.Printf("删除过期的文件(本地) %s 失败: %s", backupConf.ProjectName+string(os.PathSeparator)+tobeDeleteFiles[i], err)
  48. }
  49. }
  50. }
  51. // deleteS3OlderFiles 删除对象存储的过时文件
  52. func deleteS3OlderFiles(s3Conf entity.S3Config, backupConf entity.BackupConfig) {
  53. if !s3Conf.CheckNotEmpty() {
  54. return
  55. }
  56. fileNames, err := s3Conf.ListFiles(backupConf.GetProjectPath())
  57. if err != nil {
  58. log.Printf("读取项目 %s 的对象存储目录失败! ERR: %s\n", backupConf.ProjectName, err)
  59. }
  60. tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDaysS3, fileNames)
  61. for i := 0; i < len(tobeDeleteFiles); i++ {
  62. err := s3Conf.DeleteFile(tobeDeleteFiles[i])
  63. if err == nil {
  64. log.Printf("删除过期的文件(对象存储) %s 成功", tobeDeleteFiles[i])
  65. } else {
  66. log.Printf("删除过期的文件(对象存储) %s 失败: %s", tobeDeleteFiles[i], err)
  67. }
  68. }
  69. }