package changeDetector import ( "fmt" "realdnydns/pkg/config" "realdnydns/pkg/dnsProvider" "realdnydns/pkg/externalIpProvider" "realdnydns/pkg/notificationProvider" ) type ChangeDetector struct { externalIpProvider externalIpProvider.ExternalIpProvider dnsProvider dnsProvider.DNSProvider notificationProvider notificationProvider.NotificationProvider domains []config.DomainConfig } func New( externalIpProvider externalIpProvider.ExternalIpProvider, dnsProvider dnsProvider.DNSProvider, notificationProvider notificationProvider.NotificationProvider, domains []config.DomainConfig, ) ChangeDetector { return ChangeDetector{ externalIpProvider: externalIpProvider, dnsProvider: dnsProvider, notificationProvider: notificationProvider, domains: domains, } } func (c *ChangeDetector) DetectAndApplyChanges() (int, error) { externalIp, err := c.externalIpProvider.GetExternalIp() if err != nil { return 0, err } var numberUpdated int for _, domain := range c.domains { for _, subdomain := range domain.Subdomains { currentRecord, err := c.dnsProvider.GetRecord(domain.TLD, subdomain) if err != nil { return numberUpdated, err } if currentRecord.IP != externalIp.String() { err = c.notificationProvider.SendNotification( fmt.Sprintf("Update %s.%s", subdomain, domain.TLD), fmt.Sprintf("The IP of %s has changed from %s to %s", domain.TLD, currentRecord.IP, externalIp.String()), ) if err != nil { return numberUpdated, err } _, err = c.dnsProvider.UpdateRecord(domain.TLD, subdomain, externalIp, currentRecord.TTL, currentRecord.Prio, currentRecord.Disabled) numberUpdated++ if err != nil { return numberUpdated, err } } } } return numberUpdated, nil }