cleanup.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package cleanup
  2. import (
  3. "context"
  4. "io/ioutil"
  5. "os"
  6. "path"
  7. "time"
  8. "github.com/grafana/grafana/pkg/bus"
  9. "github.com/grafana/grafana/pkg/log"
  10. m "github.com/grafana/grafana/pkg/models"
  11. "github.com/grafana/grafana/pkg/registry"
  12. "github.com/grafana/grafana/pkg/setting"
  13. )
  14. type CleanUpService struct {
  15. log log.Logger
  16. }
  17. func init() {
  18. registry.RegisterService(&CleanUpService{})
  19. }
  20. func (service *CleanUpService) Init() error {
  21. service.log = log.New("cleanup")
  22. return nil
  23. }
  24. func (service *CleanUpService) Run(ctx context.Context) error {
  25. service.cleanUpTmpFiles()
  26. ticker := time.NewTicker(time.Minute * 10)
  27. for {
  28. select {
  29. case <-ticker.C:
  30. service.cleanUpTmpFiles()
  31. service.deleteExpiredSnapshots()
  32. service.deleteExpiredDashboardVersions()
  33. service.deleteOldLoginAttempts()
  34. case <-ctx.Done():
  35. return ctx.Err()
  36. }
  37. }
  38. }
  39. func (service *CleanUpService) cleanUpTmpFiles() {
  40. if _, err := os.Stat(setting.ImagesDir); os.IsNotExist(err) {
  41. return
  42. }
  43. files, err := ioutil.ReadDir(setting.ImagesDir)
  44. if err != nil {
  45. service.log.Error("Problem reading image dir", "error", err)
  46. return
  47. }
  48. var toDelete []os.FileInfo
  49. for _, file := range files {
  50. if file.ModTime().AddDate(0, 0, 1).Before(time.Now()) {
  51. toDelete = append(toDelete, file)
  52. }
  53. }
  54. for _, file := range toDelete {
  55. fullPath := path.Join(setting.ImagesDir, file.Name())
  56. err := os.Remove(fullPath)
  57. if err != nil {
  58. service.log.Error("Failed to delete temp file", "file", file.Name(), "error", err)
  59. }
  60. }
  61. service.log.Debug("Found old rendered image to delete", "deleted", len(toDelete), "keept", len(files))
  62. }
  63. func (service *CleanUpService) deleteExpiredSnapshots() {
  64. cmd := m.DeleteExpiredSnapshotsCommand{}
  65. if err := bus.Dispatch(&cmd); err != nil {
  66. service.log.Error("Failed to delete expired snapshots", "error", err.Error())
  67. } else {
  68. service.log.Debug("Deleted expired snapshots", "rows affected", cmd.DeletedRows)
  69. }
  70. }
  71. func (service *CleanUpService) deleteExpiredDashboardVersions() {
  72. cmd := m.DeleteExpiredVersionsCommand{}
  73. if err := bus.Dispatch(&cmd); err != nil {
  74. service.log.Error("Failed to delete expired dashboard versions", "error", err.Error())
  75. } else {
  76. service.log.Debug("Deleted old/expired dashboard versions", "rows affected", cmd.DeletedRows)
  77. }
  78. }
  79. func (service *CleanUpService) deleteOldLoginAttempts() {
  80. if setting.DisableBruteForceLoginProtection {
  81. return
  82. }
  83. cmd := m.DeleteOldLoginAttemptsCommand{
  84. OlderThan: time.Now().Add(time.Minute * -10),
  85. }
  86. if err := bus.Dispatch(&cmd); err != nil {
  87. service.log.Error("Problem deleting expired login attempts", "error", err.Error())
  88. } else {
  89. service.log.Debug("Deleted expired login attempts", "rows affected", cmd.DeletedRows)
  90. }
  91. }