delete_old_file.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. backupFileNames = append(backupFileNames, backupFile.Name())
  44. }
  45. tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDays, backupFileNames)
  46. for i := 0; i < len(tobeDeleteFiles); i++ {
  47. err := os.Remove(backupConf.GetProjectPath() + string(os.PathSeparator) + tobeDeleteFiles[i])
  48. if err == nil {
  49. log.Printf("删除过期的文件(本地) %s 成功", backupConf.ProjectName+string(os.PathSeparator)+tobeDeleteFiles[i])
  50. } else {
  51. log.Printf("删除过期的文件(本地) %s 失败: %s", backupConf.ProjectName+string(os.PathSeparator)+tobeDeleteFiles[i], err)
  52. }
  53. }
  54. }
  55. // deleteS3OlderFiles 删除对象存储的过时文件
  56. func deleteS3OlderFiles(s3Conf entity.S3Config, backupConf entity.BackupConfig) {
  57. if !s3Conf.CheckNotEmpty() {
  58. return
  59. }
  60. if backupConf.SaveDaysS3 <= 0 {
  61. log.Printf("项目 %s 的对象存储保存(天)设置不正确", backupConf.ProjectName)
  62. return
  63. }
  64. fileNames, err := s3Conf.ListFiles(backupConf.GetProjectPath())
  65. if err != nil {
  66. log.Printf("读取项目 %s 的对象存储目录失败! ERR: %s\n", backupConf.ProjectName, err)
  67. }
  68. tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDaysS3, fileNames)
  69. for i := 0; i < len(tobeDeleteFiles); i++ {
  70. err := s3Conf.DeleteFile(tobeDeleteFiles[i])
  71. if err == nil {
  72. log.Printf("删除过期的文件(对象存储) %s 成功", tobeDeleteFiles[i])
  73. } else {
  74. log.Printf("删除过期的文件(对象存储) %s 失败: %s", tobeDeleteFiles[i], err)
  75. }
  76. }
  77. }