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 }