piframe-go/cmd/inotify/inotify.go

83 lines
1.8 KiB
Go

package main
import (
"log"
"os/exec"
"time"
"github.com/dietsche/rfsnotify"
"git.kemonine.info/PiFrame/config"
"git.kemonine.info/PiFrame/watchdog"
)
const (
CMD_SYSTEMCTL = "/usr/bin/systemctl"
TIMEOUT = 5 * time.Second
)
func main() {
// Load the config file
pfConfig, configFileProvider := config.LoadConfig(false)
// Watch for config changes and re-load config if needed
configFileProvider.Watch(func(event interface{}, err error) {
if err != nil {
log.Printf("Error setting up watch of config : %s", err)
return
}
// Bail on slideshow if there is a config change so it restarts with updated config
log.Fatalf("Config file changed! Exiting!")
})
PATH_PICTURES := pfConfig.String(config.CONFIG_KEY_ALBUMS_ROOT)
// Create watchdog timer that restarts pf-ui.service on timeout
watchdog := watchdog.New(TIMEOUT, func() {
err := exec.Command(CMD_SYSTEMCTL, "restart", "pf-ui.service").Run()
if err != nil {
log.Fatalf("Error running %s : %s", CMD_SYSTEMCTL, err)
}
})
watchdog.DeferredStart()
// Create fswatcher
watcher, err := rfsnotify.NewWatcher()
if err != nil {
log.Fatal("Error setting up rfsnotify")
}
// Ensure we clean stuff up no matter what
defer watcher.Close()
// Setup goroutine and listen for events
done := make(chan bool)
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
// [Re]Start timer to restart slideshow after the fs events die down
watchdog.Kick()
case err, ok := <-watcher.Errors:
if !ok {
return
}
log.Println("Error: ", err)
}
}
}()
// Setup paths to watch
err = watcher.AddRecursive(PATH_PICTURES)
if err != nil {
log.Fatalf("Error setting up recursive watch of %s", PATH_PICTURES)
}
// Drain done channel...
<-done
}