arlo-cleaner/monitor/drive.go

92 lines
1.9 KiB
Go
Executable File

package monitor
import (
"local/logb"
"local/sandbox/arlo-cleaner/arlo"
"local/sandbox/arlo-cleaner/config"
"local/sandbox/arlo-cleaner/rclone"
"path"
"strings"
"time"
)
type Drive struct {
rclone *rclone.RClone
}
func NewDrive() (*Drive, error) {
rclone, err := rclone.New()
return &Drive{
rclone: rclone,
}, err
}
func (d *Drive) Start() <-chan error {
ch := make(chan error)
go d.watch(ch)
return ch
}
func (d *Drive) watch(ch chan<- error) {
if err := d.Clean(); err != nil {
ch <- err
}
ticker := time.NewTicker(config.MonitorInterval)
for _ = range ticker.C {
if err := d.Clean(); err != nil {
ch <- err
}
}
}
func (d *Drive) Clean() error {
videos, err := d.rclone.List(config.RCloneName)
if err != nil {
return err
}
videos = d.filters(videos)
if len(videos) == 0 {
logb.Infof("Drive nothing to clean")
return nil
}
logb.Infof("Drive clean commencing...")
defer logb.Infof("Drive clean done")
return d.deletes(videos)
}
func (d *Drive) filters(videos []string) []string {
filtered := []string{}
for _, video := range videos {
if d.expired(video) {
filtered = append(filtered, video)
}
}
logb.Debugf("drive found %v expired videos from %v", len(filtered), len(videos))
return filtered
}
func (d *Drive) expired(video string) bool {
base := path.Base(video)
timestamp := strings.Split(base, ".")[0]
created, err := time.Parse(arlo.TSFormat, timestamp)
if err != nil {
logb.Errorf("not deleting from archive: cannot parse", timestamp, ":", err)
return false
}
return time.Since(created) > config.ArchiveLength
}
func (d *Drive) deletes(videos []string) error {
for _, video := range videos {
if err := d.delete(video); err != nil {
return err
}
}
return nil
}
func (d *Drive) delete(video string) error {
logb.Infof("deleting drive video %v", video)
return d.rclone.Del(path.Join(config.RCloneName, video))
}