86 lines
1.9 KiB
Go
86 lines
1.9 KiB
Go
package onfileindir
|
|
|
|
import (
|
|
"github.com/OliveTin/OliveTin/internal/acl"
|
|
"github.com/OliveTin/OliveTin/internal/config"
|
|
"github.com/OliveTin/OliveTin/internal/executor"
|
|
"github.com/fsnotify/fsnotify"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func WatchFilesInDirectory(cfg *config.Config, ex *executor.Executor) {
|
|
for _, action := range cfg.Actions {
|
|
for _, dirname := range action.ExecOnFileChangedInDir {
|
|
watch(dirname, action, cfg, ex, fsnotify.Write)
|
|
}
|
|
|
|
for _, dirname := range action.ExecOnFileCreatedInDir {
|
|
watch(dirname, action, cfg, ex, fsnotify.Create)
|
|
}
|
|
}
|
|
}
|
|
|
|
func watch(directory string, action config.Action, cfg *config.Config, ex *executor.Executor, eventType fsnotify.Op) {
|
|
log.WithFields(log.Fields{
|
|
"dir": directory,
|
|
"eventType": eventType,
|
|
}).Infof("Watching dir")
|
|
|
|
watcher, err := fsnotify.NewWatcher()
|
|
|
|
if err != nil {
|
|
log.Errorf("Could not watch for files being created: %v", err)
|
|
return
|
|
}
|
|
|
|
defer watcher.Close()
|
|
|
|
done := make(chan bool)
|
|
|
|
go func() {
|
|
for {
|
|
processEvent(watcher, action, cfg, ex, eventType)
|
|
}
|
|
}()
|
|
|
|
err = watcher.Add("/tmp")
|
|
|
|
if err != nil {
|
|
log.Errorf("Could not create watcher: %v", err)
|
|
}
|
|
|
|
<-done
|
|
}
|
|
|
|
func processEvent(watcher *fsnotify.Watcher, action config.Action, cfg *config.Config, ex *executor.Executor, eventType fsnotify.Op) {
|
|
select {
|
|
case event, ok := <-watcher.Events:
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
checkEvent(&event, action, cfg, ex, eventType)
|
|
case err := <-watcher.Errors:
|
|
log.Errorf("Error in fsnotify: %v", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
func checkEvent(event *fsnotify.Event, action config.Action, cfg *config.Config, ex *executor.Executor, eventType fsnotify.Op) {
|
|
if event.Has(eventType) {
|
|
req := &executor.ExecutionRequest{
|
|
ActionName: action.Title,
|
|
Cfg: cfg,
|
|
Tags: []string{"fileindir"},
|
|
Arguments: map[string]string{
|
|
"filename": event.Name,
|
|
},
|
|
AuthenticatedUser: &acl.AuthenticatedUser{
|
|
Username: "fileindir",
|
|
},
|
|
}
|
|
|
|
ex.ExecRequest(req)
|
|
}
|
|
}
|