package main import ( "fmt" "time" "realdnydns/pkg/changeDetector" "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" "github.com/go-co-op/gocron" ) func main() { configClient := config.Config{} err := configClient.Load("config.yaml") if err != nil { panic(err) } 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) 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: // Use default console notification provider notificationProvider = notificationProviderConsole.New() } changeDetector := changeDetector.New(externalIpProvider, dnsProvider, notificationProvider, configClient.Domains) s := gocron.NewScheduler(time.UTC) s.SingletonMode() job, err := s.CronWithSeconds(configClient.CheckInterval).DoWithJobDetails(func(job gocron.Job) { numberChanged, err := changeDetector.DetectAndApplyChanges() if err != nil { panic(err) } fmt.Printf("Number of changes: %d\n", numberChanged) fmt.Println("Next run:", job.NextRun()) }) if err != nil { panic(err) } fmt.Println("Starting scheduler") fmt.Println("Next run:", job.NextRun()) s.StartBlocking() }