// Command he-dydns updates Hurricane Electric dynamic DNS entries. package main import ( "fmt" "log" "os" "os/signal" "strings" "syscall" "time" "git.aehoo.net/alphard/he-dydns/internal/config" "git.aehoo.net/alphard/he-dydns/internal/updater" ) func main() { log.SetFlags(log.LstdFlags) daemon := false configPath := "" args := os.Args[1:] for i := 0; i < len(args); i++ { arg := args[i] switch { case arg == "daemon": daemon = true case arg == "-h" || arg == "--help" || arg == "help": usage() return case arg == "--config" || arg == "-config": i++ if i >= len(args) { fmt.Fprintf(os.Stderr, "%s requires a path argument\n", arg) usage() os.Exit(2) } configPath = args[i] case strings.HasPrefix(arg, "--config="): configPath = strings.TrimPrefix(arg, "--config=") case strings.HasPrefix(arg, "-config="): configPath = strings.TrimPrefix(arg, "-config=") default: fmt.Fprintf(os.Stderr, "unknown argument: %s\n", arg) usage() os.Exit(2) } } if configPath == "" { var err error configPath, err = config.DefaultPath() if err != nil { log.Fatalf("fatal: %v", err) } } cfg, err := config.Load(configPath) if err != nil { log.Fatalf("fatal: %v", err) } runErr := updater.Run(cfg) if runErr != nil { log.Printf("update pass completed with errors: %v", runErr) } if !daemon { if runErr != nil { os.Exit(1) } return } interval := time.Duration(cfg.IntervalMinutes) * time.Minute log.Printf("entering daemon mode, updating every %d minute(s)", cfg.IntervalMinutes) ticker := time.NewTicker(interval) defer ticker.Stop() sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) for { select { case <-ticker.C: if err := updater.Run(cfg); err != nil { log.Printf("update pass completed with errors: %v", err) } case sig := <-sigCh: log.Printf("received %s, shutting down", sig) return } } } func usage() { defaultPath := "~/.config/he-dydns/config.toml" if p, err := config.DefaultPath(); err == nil { defaultPath = p } fmt.Fprintln(os.Stderr, "usage: he-dydns [--config path] [daemon]") fmt.Fprintf(os.Stderr, " --config path load configuration from path instead of %s\n", defaultPath) fmt.Fprintln(os.Stderr, " (no args) run one update pass and exit") fmt.Fprintln(os.Stderr, " daemon run one update pass, then repeat on the configured interval") }