gilgetter/inventorytools/client/ahkCleaner.go

93 lines
2.1 KiB
Go

package main
import (
"fmt"
"log"
"os"
"path/filepath"
"strings"
"time"
"github.com/fsnotify/fsnotify"
)
// Watches the downloads directory for autohotkey files and makes sure that only the newest one downloaded exists at a time
func downloadsFileWatcher() {
downloadsWatcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal("NewWatcher failed: ", err)
}
defer downloadsWatcher.Close()
done := make(chan bool)
go func() {
defer close(done)
defer log.Printf("file watcher go routine shutting down!") // could be from returns below?
for {
select {
case event, ok := <-downloadsWatcher.Events:
if !ok {
log.Printf("downloads watcher _event_ NOT OK TERMINATING ARRRGGHGHH: %v", err)
return
}
if event.Op == fsnotify.Create {
if strings.Contains(event.Name, ".ahk") {
err = cleanDownloadsAHK()
if err != nil {
log.Printf("failed to clean downloads: %v", err)
}
}
}
case err, ok := <-downloadsWatcher.Errors:
if !ok {
log.Printf("downloads watcher _error_ NOT OK TERMINATING ARRRGGHGHH: %v", err)
return
}
log.Printf("downloads watcher error: %v", err)
}
}
}()
err = downloadsWatcher.Add(downloadsFolderPath)
if err != nil {
log.Fatal("downloads watcher add down failed:", err)
}
<-done
}
func cleanDownloadsAHK() error {
err := filepath.Walk(downloadsFolderPath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return fmt.Errorf("failed to walk file: %v", err)
}
// ignore files that aren't AHK
if !strings.Contains(info.Name(), ".ahk") {
return nil
}
// ignore files downloaded in the past 5 minutes
if info.ModTime().After(time.Now().Add(time.Minute * -1)) {
return nil
}
log.Printf("removing old .ahk file - %s", info.Name())
err = os.Remove(fmt.Sprintf("%s/%s", downloadsFolderPath, info.Name()))
if err != nil {
return fmt.Errorf("failed to delete old .ahk '%s': %v", info.Name(), err)
}
return nil
})
if err != nil {
return fmt.Errorf("failed to walk downloads directory: %v", err)
}
return nil
}