All checks were successful
Gitea Actions Demo / Run-Python-Script (push) Successful in 7s
87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
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
|
|
}
|