adguardhome-sync/main.go

137 lines
2.7 KiB
Go
Raw Normal View History

2021-03-28 06:40:59 +08:00
package main
import (
"github.com/bakito/adguardhome-sync/pkg/client"
"os"
)
const (
envOriginApiURL = "ORIGIN_API_URL"
envOriginUsername = "ORIGIN_USERNAME"
envOriginPassword = "ORIGIN_PASSWORD"
envReplicaApiURL = "REPLICA_API_URL"
envReplicaUsername = "REPLICA_USERNAME"
envOReplicaPassword = "REPLICA_PASSWORD"
)
func main() {
// Create a Resty Client
origin, err := client.New(os.Getenv(envOriginApiURL), os.Getenv(envOriginUsername), os.Getenv(envOriginPassword))
if err != nil {
panic(err)
}
replica, err := client.New(os.Getenv(envReplicaApiURL), os.Getenv(envReplicaUsername), os.Getenv(envOReplicaPassword))
if err != nil {
panic(err)
}
2021-03-28 15:19:44 +08:00
err = syncRewrites(origin, replica)
2021-03-28 06:40:59 +08:00
if err != nil {
panic(err)
}
2021-03-28 15:19:44 +08:00
err = syncFilters(origin, replica)
if err != nil {
panic(err)
}
err = syncServices(origin, replica)
2021-03-28 06:40:59 +08:00
if err != nil {
panic(err)
}
// POST http://192.168.2.207/control/dns_config {"protection_enabled":false}
}
2021-03-28 15:19:44 +08:00
func syncServices(origin client.Client, replica client.Client) error {
os, err := origin.Services()
if err != nil {
return err
}
rs, err := replica.Services()
if err != nil {
return err
}
if !os.Equals(rs) {
if err := replica.SetServices(os); err != nil {
return err
}
}
return nil
}
func syncFilters(origin client.Client, replica client.Client) error {
2021-03-28 06:40:59 +08:00
of, err := origin.Filtering()
if err != nil {
return err
}
rf, err := replica.Filtering()
if err != nil {
return err
}
fa, fd := rf.Filters.Merge(of.Filters)
2021-03-28 14:59:18 +08:00
if err = replica.AddFilters(false, fa...); err != nil {
2021-03-28 06:40:59 +08:00
return err
}
if len(fa) > 0 {
2021-03-28 14:59:18 +08:00
if err = replica.RefreshFilters(false); err != nil {
2021-03-28 06:40:59 +08:00
return err
}
}
2021-03-28 14:59:18 +08:00
if err = replica.DeleteFilters(false, fd...); err != nil {
2021-03-28 06:40:59 +08:00
return err
}
fa, fd = rf.WhitelistFilters.Merge(of.WhitelistFilters)
2021-03-28 14:59:18 +08:00
if err = replica.AddFilters(true, fa...); err != nil {
2021-03-28 06:40:59 +08:00
return err
}
if len(fa) > 0 {
2021-03-28 14:59:18 +08:00
if err = replica.RefreshFilters(true); err != nil {
2021-03-28 06:40:59 +08:00
return err
}
}
2021-03-28 14:59:18 +08:00
if err = replica.DeleteFilters(true, fd...); err != nil {
2021-03-28 06:40:59 +08:00
return err
}
if of.UserRules.String() != rf.UserRules.String() {
return replica.SetCustomRules(of.UserRules)
}
2021-03-28 14:59:18 +08:00
if of.Enabled != rf.Enabled || of.Interval != rf.Interval {
if err = replica.ToggleFiltering(of.Enabled, of.Interval); err != nil {
return err
}
}
2021-03-28 06:40:59 +08:00
return nil
}
2021-03-28 15:19:44 +08:00
func syncRewrites(origin client.Client, replica client.Client) error {
2021-03-28 06:40:59 +08:00
originRewrites, err := origin.RewriteList()
if err != nil {
return err
}
replicaRewrites, err := replica.RewriteList()
if err != nil {
return err
}
a, r := replicaRewrites.Merge(originRewrites)
2021-03-28 14:59:18 +08:00
if err = replica.AddRewriteEntries(a...); err != nil {
2021-03-28 06:40:59 +08:00
return err
}
2021-03-28 14:59:18 +08:00
if err = replica.DeleteRewriteEntries(r...); err != nil {
2021-03-28 06:40:59 +08:00
return err
}
2021-03-28 14:59:18 +08:00
return nil
2021-03-28 06:40:59 +08:00
}