delete_old_file.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package client
  2. import (
  3. "backup-x/entity"
  4. "backup-x/util"
  5. "log"
  6. "os"
  7. "time"
  8. )
  9. // DeleteOldBackup for client
  10. func DeleteOldBackup() {
  11. for {
  12. delay := util.GetDelaySeconds(2)
  13. log.Printf("删除过期的备份文件将在 %.1f 小时后运行\n", delay.Hours())
  14. time.Sleep(delay)
  15. conf, err := entity.GetConfigCache()
  16. if err != nil {
  17. return
  18. }
  19. for _, backupConf := range conf.BackupConfig {
  20. // empty project and disabeld
  21. if !backupConf.NotEmptyProject() || backupConf.Enabled == 1 {
  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 := os.ReadDir(backupConf.GetProjectPath())
  34. if err != nil {
  35. log.Printf("读取项目 %s 的本地目录失败! ERR: %s\n", backupConf.ProjectName, err)
  36. }
  37. if backupConf.SaveDays <= 0 {
  38. log.Printf("项目 %s 的本地保存(天)设置不正确", backupConf.ProjectName)
  39. return
  40. }
  41. backupFileNames := make([]string, len(backupFiles))
  42. for _, backupFile := range backupFiles {
  43. if !backupFile.IsDir() {
  44. info, err := backupFile.Info()
  45. if err == nil {
  46. if info.Size() >= minFileSize {
  47. backupFileNames = append(backupFileNames, backupFile.Name())
  48. } else {
  49. if util.IsFileNameDate(backupFile.Name()) {
  50. log.Printf("备份后的大小为 %d 字节,小于最低值 %d,将删除备份文件: %s", info.Size(), minFileSize, backupConf.GetProjectPath()+string(os.PathSeparator)+backupFile.Name())
  51. os.Remove(backupConf.GetProjectPath() + string(os.PathSeparator) + backupFile.Name())
  52. }
  53. }
  54. }
  55. }
  56. }
  57. tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDays, backupFileNames, backupConf.ProjectName)
  58. for i := 0; i < len(tobeDeleteFiles); i++ {
  59. err := os.Remove(backupConf.GetProjectPath() + string(os.PathSeparator) + tobeDeleteFiles[i])
  60. if err == nil {
  61. log.Printf("删除过期的文件(本地) %s 成功", backupConf.ProjectName+string(os.PathSeparator)+tobeDeleteFiles[i])
  62. } else {
  63. log.Printf("删除过期的文件(本地) %s 失败: %s", backupConf.ProjectName+string(os.PathSeparator)+tobeDeleteFiles[i], err)
  64. }
  65. }
  66. }
  67. // deleteS3OlderFiles 删除对象存储的过时文件
  68. func deleteS3OlderFiles(s3Conf entity.S3Config, backupConf entity.BackupConfig) {
  69. if !s3Conf.CheckNotEmpty() {
  70. return
  71. }
  72. if backupConf.SaveDaysS3 <= 0 {
  73. log.Printf("项目 %s 的对象存储保存(天)设置不正确", backupConf.ProjectName)
  74. return
  75. }
  76. fileNames, err := s3Conf.ListFiles(backupConf.GetProjectPath())
  77. if err != nil {
  78. log.Printf("读取项目 %s 的对象存储目录失败! ERR: %s\n", backupConf.ProjectName, err)
  79. }
  80. tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDaysS3, fileNames, backupConf.ProjectName)
  81. for i := 0; i < len(tobeDeleteFiles); i++ {
  82. err := s3Conf.DeleteFile(tobeDeleteFiles[i])
  83. if err == nil {
  84. log.Printf("删除过期的文件(对象存储) %s 成功", tobeDeleteFiles[i])
  85. } else {
  86. log.Printf("删除过期的文件(对象存储) %s 失败: %s", tobeDeleteFiles[i], err)
  87. }
  88. }
  89. }