Add rewrites.go
All checks were successful
Gitea Actions Demo / Run-Python-Script (push) Successful in 7s
All checks were successful
Gitea Actions Demo / Run-Python-Script (push) Successful in 7s
This commit is contained in:
86
rewrites.go
Normal file
86
rewrites.go
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user