Files
crontabd/crontabd/main.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
}