Implement watching crontab file
This commit is contained in:
@@ -2,4 +2,9 @@ module crontabd
|
|||||||
|
|
||||||
go 1.23.6
|
go 1.23.6
|
||||||
|
|
||||||
require git.site.quack-lab.dev/dave/cylogger v1.2.3
|
require (
|
||||||
|
git.site.quack-lab.dev/dave/cylogger v1.2.3
|
||||||
|
github.com/fsnotify/fsnotify v1.9.0
|
||||||
|
)
|
||||||
|
|
||||||
|
require golang.org/x/sys v0.13.0 // indirect
|
||||||
|
@@ -1,2 +1,6 @@
|
|||||||
git.site.quack-lab.dev/dave/cylogger v1.2.3 h1:g6fwgrd3HvGsxljvKbjcFaMynTO2AZFWjC2ZvCi1raQ=
|
git.site.quack-lab.dev/dave/cylogger v1.2.3 h1:g6fwgrd3HvGsxljvKbjcFaMynTO2AZFWjC2ZvCi1raQ=
|
||||||
git.site.quack-lab.dev/dave/cylogger v1.2.3/go.mod h1:sf16Zs5ZRncn0ySgwxRJShkge1M10CM2RAUkKn8Bel8=
|
git.site.quack-lab.dev/dave/cylogger v1.2.3/go.mod h1:sf16Zs5ZRncn0ySgwxRJShkge1M10CM2RAUkKn8Bel8=
|
||||||
|
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||||
|
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
|
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
||||||
|
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
@@ -2,9 +2,12 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/fsnotify/fsnotify"
|
||||||
|
|
||||||
logger "git.site.quack-lab.dev/dave/cylogger"
|
logger "git.site.quack-lab.dev/dave/cylogger"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,13 +17,65 @@ func main() {
|
|||||||
flag.Parse()
|
flag.Parse()
|
||||||
logger.InitFlag()
|
logger.InitFlag()
|
||||||
|
|
||||||
homeDir, err := os.UserHomeDir()
|
var err error
|
||||||
|
crontabFile, err = resolveCrontabPath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("Failed to get user home directory: %v", err)
|
logger.Error("Failed to resolve crontab file path: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = ensureExists(crontabFile)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("Failed to ensure crontab file exists: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
logger.Info("Crontab file resolved as: %s", crontabFile)
|
||||||
|
|
||||||
|
watcher, err := fsnotify.NewWatcher()
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("Failed to create watcher: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = watcher.Add(crontabFile)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("Failed to add crontab file to watcher: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
logger.Info("Watching crontab file: %s", crontabFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveCrontabPath() (string, error) {
|
||||||
|
// Resolve crontab file location
|
||||||
|
homeDir, err := os.UserHomeDir()
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("failed to get user home directory: %v", err)
|
||||||
|
}
|
||||||
userName := os.Getenv("USERNAME")
|
userName := os.Getenv("USERNAME")
|
||||||
crontabFile = filepath.Join(homeDir, "crontab", userName+".cron")
|
crontabFile = filepath.Join(homeDir, "crontab", userName+".cron")
|
||||||
logger.Info("Crontab file: %s", crontabFile)
|
crontabFile, err = filepath.Abs(crontabFile)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("failed to get absolute path: %v", err)
|
||||||
|
}
|
||||||
|
crontabFile = filepath.Clean(crontabFile)
|
||||||
|
return crontabFile, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ensureExists(path string) error {
|
||||||
|
// Make sure it exists
|
||||||
|
err := os.MkdirAll(filepath.Dir(path), 0755)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to create directory: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
os.WriteFile(path, []byte(""), 0644)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("failed to open crontab file: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user