primeiro commit

This commit is contained in:
2026-09-16 00:18:01 -03:00
commit 1a5a446b5c
10 changed files with 472 additions and 0 deletions
+108
View File
@@ -0,0 +1,108 @@
// 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")
}