cleanup.go 3.1 KB

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