82 lines
1.7 KiB
Go
82 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/fsnotify/fsnotify"
|
|
|
|
logger "git.site.quack-lab.dev/dave/cylogger"
|
|
)
|
|
|
|
var crontabFile string
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
logger.InitFlag()
|
|
|
|
var err error
|
|
crontabFile, err = resolveCrontabPath()
|
|
if err != nil {
|
|
logger.Error("Failed to resolve crontab file path: %v", err)
|
|
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")
|
|
crontabFile = filepath.Join(homeDir, "crontab", userName+".cron")
|
|
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
|
|
}
|