/
file.go
114 lines (109 loc) · 2.06 KB
/
file.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package reaper
import (
liberr "github.com/jortel/go-utils/error"
"github.com/konveyor/tackle2-hub/model"
"gorm.io/gorm"
"os"
"time"
)
//
// FileReaper file reaper.
type FileReaper struct {
// DB
DB *gorm.DB
}
//
// Run Executes the reaper.
// A file is deleted when it is no longer referenced and the TTL has expired.
func (r *FileReaper) Run() {
Log.V(1).Info("Reaping files.")
list := []model.File{}
err := r.DB.Find(&list).Error
if err != nil {
Log.Error(err, "")
return
}
for _, file := range list {
busy, err := r.busy(&file)
if err != nil {
Log.Error(err, "")
continue
}
if busy {
if file.Expiration != nil {
file.Expiration = nil
err = r.DB.Save(&file).Error
Log.Error(err, "")
}
continue
}
if file.Expiration == nil {
Log.Info("File (orphan) found.", "id", file.ID, "path", file.Path)
mark := time.Now().Add(time.Minute * time.Duration(Settings.File.TTL))
file.Expiration = &mark
err = r.DB.Save(&file).Error
Log.Error(err, "")
continue
}
mark := time.Now()
if mark.After(*file.Expiration) {
err = r.delete(&file)
if err != nil {
Log.Error(err, "")
continue
}
}
}
}
//
// busy determines if anything references the file.
func (r *FileReaper) busy(file *model.File) (busy bool, err error) {
nRef := int64(0)
var n int64
ref := RefCounter{DB: r.DB}
for _, m := range []interface{}{
&model.TaskReport{},
&model.RuleSet{},
&model.Rule{},
&model.Target{},
} {
n, err = ref.Count(m, "file", file.ID)
if err != nil {
Log.Error(err, "")
continue
}
nRef += n
}
busy = nRef > 0
return
}
//
// Delete file.
func (r *FileReaper) delete(file *model.File) (err error) {
err = os.Remove(file.Path)
if err != nil {
if !os.IsNotExist(err) {
err = liberr.Wrap(
err,
"id",
file.ID,
"path",
file.Path)
return
} else {
err = nil
}
}
err = r.DB.Delete(file).Error
if err != nil {
err = liberr.Wrap(
err,
"id",
file.ID,
"path",
file.Path)
return
}
Log.Info("File (orphan) deleted.", "id", file.ID, "path", file.Path)
return
}