Skip to content

Commit 3395827

Browse files
fix: attachment retention
1 parent bbf8525 commit 3395827

File tree

4 files changed

+35
-26
lines changed

4 files changed

+35
-26
lines changed

README.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ data_directory: smtpbridge_data
6868

6969
# Retention policy for envelopes and attachment files
7070
retention:
71-
# Retention policy for envelopes in database
72-
envelope_count: 0 # (100, 250, ...)
73-
envelope_age: "" # (5m, 5h45m, ...)
71+
# # Retention policy for envelopes in database
72+
# envelope_count: # (0, 100, 250, ...) [optional]
73+
# envelope_age: # (5m, 5h45m, ...) [optional]
7474

75-
# Retention policy for attachment files on disk
76-
attachment_size: "" # (100 MB, 1 GB, ...)
75+
# # Retention policy for attachment files on disk
76+
# attachment_size: # (100 MB, 1 GB, ...) [optional]
7777

7878
# HTTP server
7979
http:

internal/files/files.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"path"
77
"sort"
8+
"time"
89

910
"github.com/ItsNotGoodName/smtpbridge/internal/core"
1011
"github.com/ItsNotGoodName/smtpbridge/internal/envelope"
@@ -47,7 +48,7 @@ func Size(cc *core.Context) (int64, error) {
4748
return dirSize, nil
4849
}
4950

50-
func DeleteFileUntilSize(cc *core.Context, currentSize, maxSize int64) error {
51+
func DeleteFileUntilSize(cc *core.Context, currentSize, maxSize int64, age time.Time) error {
5152
files, err := ioutil.ReadDir(cc.File.Dir)
5253
if err != nil {
5354
return err
@@ -61,6 +62,9 @@ func DeleteFileUntilSize(cc *core.Context, currentSize, maxSize int64) error {
6162
if currentSize < maxSize {
6263
break
6364
}
65+
if files[i].ModTime().After(age) {
66+
continue
67+
}
6468

6569
if err := os.Remove(path.Join(cc.File.Dir, files[i].Name())); err != nil {
6670
return err

internal/models/retention.go

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
package models
22

3-
import "time"
3+
import (
4+
"time"
5+
)
46

57
type RetentionPolicy struct {
68
EnvelopeCount *int
79
EnvelopeAge *time.Duration
810
MinEnvelopeAge time.Duration
911
AttachmentSize *int64
1012
}
13+
14+
func (rp RetentionPolicy) EnvelopeAgeDate() time.Time {
15+
date := time.Now()
16+
if rp.EnvelopeAge != nil && *rp.EnvelopeAge > rp.MinEnvelopeAge {
17+
date = date.Add(-*rp.EnvelopeAge)
18+
} else {
19+
date = date.Add(-rp.MinEnvelopeAge)
20+
}
21+
22+
return date
23+
}

internal/procs/gardener.go

+11-19
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@ package procs
22

33
import (
44
"context"
5-
"fmt"
65
"time"
76

87
"github.com/ItsNotGoodName/smtpbridge/internal/core"
98
"github.com/ItsNotGoodName/smtpbridge/internal/db"
109
"github.com/ItsNotGoodName/smtpbridge/internal/events"
1110
"github.com/ItsNotGoodName/smtpbridge/internal/files"
1211
"github.com/ItsNotGoodName/smtpbridge/internal/models"
13-
"github.com/dustin/go-humanize"
1412
"github.com/rs/zerolog/log"
1513
)
1614

@@ -91,30 +89,28 @@ func gardenerDeleteByAttachmentSize(cc *core.Context, policy models.RetentionPol
9189
attachmentSize := *policy.AttachmentSize
9290

9391
if storage.AttachmentSize > attachmentSize {
94-
count := humanize.Bytes(uint64(storage.AttachmentSize - attachmentSize))
95-
log.Info().Str("count", count).Msg("Deleting attachment files by attachment size retention policy")
96-
97-
err := files.DeleteFileUntilSize(cc, storage.AttachmentSize, attachmentSize)
92+
age := policy.EnvelopeAgeDate()
93+
log.Info().Time("age", age).Msg("Deleting attachment files by attachment size retention policy")
94+
err := files.DeleteFileUntilSize(cc, storage.AttachmentSize, attachmentSize, age)
9895
if err != nil {
9996
log.Err(err).Msg("Failed to delete attachment files by attachment size retention policy")
10097
}
10198
}
10299
}
103100

104101
func gardenerDeleteByEnvelopeCount(cc *core.Context, policy models.RetentionPolicy, storage models.Storage) {
105-
fmt.Println("---------", policy.EnvelopeCount)
106102
if policy.EnvelopeCount == nil {
107103
return
108104
}
109105
envelopeCount := *policy.EnvelopeCount
110106

111107
if storage.EnvelopeCount > envelopeCount {
112-
date := time.Now().Add(-policy.MinEnvelopeAge)
113-
count, err := db.EnvelopeDeleteUntilCount(cc, envelopeCount, date)
108+
age := policy.EnvelopeAgeDate()
109+
count, err := db.EnvelopeDeleteUntilCount(cc, envelopeCount, age)
114110
if err != nil {
115-
log.Err(err).Time("age", date).Int("keep", envelopeCount).Msg("Failed to envelopes by envelope count retention policy")
111+
log.Err(err).Time("age", age).Int("keep", envelopeCount).Msg("Failed to envelopes by envelope count retention policy")
116112
} else {
117-
log.Info().Time("age", date).Int("keep", envelopeCount).Int64("deleted", count).Msg("Deleted envelopes by envelope count retention policy")
113+
log.Info().Time("age", age).Int("keep", envelopeCount).Int64("deleted", count).Msg("Deleted envelopes by envelope count retention policy")
118114
}
119115
}
120116
}
@@ -123,17 +119,13 @@ func gardenerDeleteByAge(cc *core.Context, policy models.RetentionPolicy) {
123119
if policy.EnvelopeAge == nil {
124120
return
125121
}
126-
envelopeAge := *policy.EnvelopeAge
127122

128-
date := time.Now().Add(-envelopeAge)
129-
if policy.MinEnvelopeAge > envelopeAge {
130-
date.Add(-policy.MinEnvelopeAge)
131-
}
132-
count, err := db.EnvelopeDeleteOlderThan(cc, date)
123+
age := policy.EnvelopeAgeDate()
124+
count, err := db.EnvelopeDeleteOlderThan(cc, age)
133125
if err != nil {
134-
log.Err(err).Time("age", date).Msg("Failed to delete envelopes by age retention policy")
126+
log.Err(err).Time("age", age).Msg("Failed to delete envelopes by age retention policy")
135127
} else {
136-
log.Info().Time("age", date).Int64("deleted", count).Msg("Deleted envelopes by age retention policy")
128+
log.Info().Time("age", age).Int64("deleted", count).Msg("Deleted envelopes by age retention policy")
137129
}
138130
}
139131

0 commit comments

Comments
 (0)