diff --git a/rewrites.go b/rewrites.go new file mode 100644 index 0000000..bd74731 --- /dev/null +++ b/rewrites.go @@ -0,0 +1,86 @@ +package main + +import ( + "fmt" +) + +type Rewrite struct { + Domain string `yaml:"domain" json:"domain"` + Answer string `yaml:"answer" json:"answer"` +} + +func MergeRewrites(existing, desired []Rewrite) []Rewrite { + existingMap := make(map[string]string) + for _, r := range existing { + existingMap[r.Domain] = r.Answer + } + + desiredMap := make(map[string]string) + for _, r := range desired { + desiredMap[r.Domain] = r.Answer + } + + updated := make([]Rewrite, 0) + + // Add or update + for domain, ip := range desiredMap { + if existingIP, found := existingMap[domain]; found { + if existingIP != ip { + fmt.Printf("Ändere %s: %s -> %s\n", domain, existingIP, ip) + } + } else { + fmt.Printf("Füge hinzu: %s -> %s\n", domain, ip) + } + updated = append(updated, Rewrite{Domain: domain, Answer: ip}) + } + + // Delete outdated + for domain, ip := range existingMap { + if _, ok := desiredMap[domain]; !ok { + fmt.Printf("Lösche: %s : %s\n", domain, ip) + } + } + + return updated +} + +func (c *AdGuardClient) ApplyRewrites(desired []Rewrite) error { + existing, err := c.GetRewrites() + if err != nil { + return err + } + + existingMap := make(map[string]string) + for _, r := range existing { + existingMap[r.Domain] = r.Answer + } + + desiredMap := make(map[string]string) + for _, r := range desired { + desiredMap[r.Domain] = r.Answer + } + + for domain, ip := range desiredMap { + if existingIP, ok := existingMap[domain]; ok { + if existingIP != ip { + if err := c.UpdateRewrite(Rewrite{Domain: domain, Answer: existingIP}, Rewrite{Domain: domain, Answer: ip}); err != nil { + return err + } + } + } else { + if err := c.AddRewrite(Rewrite{Domain: domain, Answer: ip}); err != nil { + return err + } + } + } + + for domain, ip := range existingMap { + if _, ok := desiredMap[domain]; !ok { + if err := c.DeleteRewrite(Rewrite{Domain: domain, Answer: ip}); err != nil { + return err + } + } + } + + return nil +}