Mail-Graveyard/main.go
2026-07-05 22:30:32 +02:00

70 lines
1.7 KiB
Go

package main
import (
"embed"
"flag"
"io/fs"
"log"
"net/http"
"os"
"time"
"mail-graveyard/backend"
)
//go:embed frontend-js/dist/*
var frontend embed.FS
func main() {
runOnce := flag.String("run", "", "einen Umzugs-Job einmalig ausfuehren (Konto-Name oder 'all'), ohne Web-UI")
watch := flag.Bool("watch", false, "Delta-Sync in Schleife bis Stop (Cutover-Fenster)")
watchInterval := flag.Duration("watch-interval", 60*time.Second, "Pause zwischen Watch-Durchlaeufen")
seedAccount := flag.String("seed-account", "", "Konto aus lokaler JSON-Datei in die DB schreiben (nur CLI/Test)")
checkAccount := flag.String("check-account", "", "Konto-Logins pruefen und INBOX zaehlen, ohne zu kopieren")
flag.Parse()
if err := backend.LoadConfig("config.json"); err != nil {
log.Fatalf("config: %v", err)
}
if err := backend.ConnectDB(); err != nil {
log.Fatalf("database: %v", err)
}
if err := backend.InitAuth(); err != nil {
log.Fatalf("auth: %v", err)
}
if *seedAccount != "" {
must(backend.SeedAccountFromFile(*seedAccount))
return
}
if *checkAccount != "" {
must(backend.CheckAccount(*checkAccount))
return
}
// CLI-Modus: ohne Web laufen lassen (Cronjob / Cutover).
if *runOnce != "" {
must(backend.RunMigration(*runOnce, *watch, *watchInterval))
return
}
dist, err := fs.Sub(frontend, "frontend-js/dist")
if err != nil {
log.Fatal(err)
}
mux := http.NewServeMux()
mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(dist))))
backend.RegisterRoutes(mux)
addr := backend.Cfg.Bind + ":" + backend.Cfg.Port
log.Printf("Mail-Graveyard listening on %s", addr)
log.Fatal(http.ListenAndServe(addr, backend.AuthMiddleware(mux)))
}
func must(err error) {
if err != nil {
log.Print(err)
os.Exit(1)
}
}