package main import ( "fmt" "log/slog" "os" "strings" "realdnydns/pkg/config" "realdnydns/pkg/dnsProvider" ionos "realdnydns/pkg/dnsProvider/ionos" "realdnydns/pkg/externalIpProvider" plainExternalIpProvider "realdnydns/pkg/externalIpProvider/plain" "realdnydns/pkg/notificationProvider" notificationProviderConsole "realdnydns/pkg/notificationProvider/console" gotify "realdnydns/pkg/notificationProvider/gotify" "realdnydns/pkg/realDynDns" ) func main() { logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ Level: slog.LevelInfo, })) configClient := config.Config{} err := configClient.Load("config.yaml") if err != nil { logger.Error("Failed to load config file", slog.String("error", err.Error())) panic(err) } if configClient.LogLevel != "" { logger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ Level: slog.Level(config.LogLevelMap[strings.ToLower(configClient.LogLevel)]), })) } var externalIpProvider externalIpProvider.ExternalIpProvider switch configClient.ExternalIPProvider.Type { case "plain": var plainConfig plainExternalIpProvider.PlainExternalIpProviderConfig err := configClient.ExternalIPProvider.ProviderConfig.Decode(&plainConfig) if err != nil { panic(err) } externalIpProvider, err = plainExternalIpProvider.New(plainConfig) if err != nil { panic(err) } default: panic(fmt.Errorf("unknown external IP provider: %s", configClient.ExternalIPProvider.Type)) } var dnsProvider dnsProvider.DNSProvider switch configClient.DNSProvider.Type { case "ionos": var ionosConfig ionos.IONOSConfig err := configClient.DNSProvider.ProviderConfig.Decode(&ionosConfig) if err != nil { panic(err) } dnsProvider, err = ionos.NewIonos(&ionosConfig) if err != nil { panic(err) } default: panic(fmt.Errorf("unknown DNS provider: %s", configClient.DNSProvider.Type)) } var notificationProvider notificationProvider.NotificationProvider switch configClient.NotificationProvider.Type { case "gotify": var gotifyConfig gotify.NotificationProviderImplGotifyConfig err := configClient.NotificationProvider.ProviderConfig.Decode(&gotifyConfig) if err != nil { panic(err) } notificationProvider, err = gotify.New(gotifyConfig) if err != nil { panic(err) } default: notificationProvider = notificationProviderConsole.New() } rdd := realDynDns.New(externalIpProvider, dnsProvider, notificationProvider, configClient.Domains) switch configClient.Mode { case config.ScheduledMode: schedule, job, err := rdd.RunWithSchedule(configClient.CheckInterval) if err != nil { panic(err) } fmt.Println("Starting scheduler") fmt.Println("Next run:", job.NextRun()) schedule.StartBlocking() case config.RunOnceMode: numberOfChanges, err := rdd.RunOnce() if err != nil { panic(err) } fmt.Println("Number of changes:", numberOfChanges) } }