2021-03-28 06:40:59 +08:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
2021-03-28 15:58:54 +08:00
|
|
|
|
2021-03-28 17:32:41 +08:00
|
|
|
"github.com/bakito/adguardhome-sync/pkg/log"
|
|
|
|
|
2021-03-28 15:58:54 +08:00
|
|
|
"github.com/bakito/adguardhome-sync/pkg/client"
|
2021-03-28 06:40:59 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
envOriginApiURL = "ORIGIN_API_URL"
|
|
|
|
envOriginUsername = "ORIGIN_USERNAME"
|
|
|
|
envOriginPassword = "ORIGIN_PASSWORD"
|
|
|
|
envReplicaApiURL = "REPLICA_API_URL"
|
|
|
|
envReplicaUsername = "REPLICA_USERNAME"
|
|
|
|
envOReplicaPassword = "REPLICA_PASSWORD"
|
|
|
|
)
|
|
|
|
|
2021-03-28 17:32:41 +08:00
|
|
|
var (
|
|
|
|
l = log.GetLogger("main")
|
|
|
|
)
|
|
|
|
|
2021-03-28 06:40:59 +08:00
|
|
|
func main() {
|
|
|
|
|
|
|
|
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 17:32:41 +08:00
|
|
|
logger := l.With("from", origin.Host(), "to", replica.Host())
|
|
|
|
|
|
|
|
logger.Info("Start sync")
|
|
|
|
defer func() { logger.Info("Sync done") }()
|
|
|
|
|
2021-03-28 15:58:54 +08:00
|
|
|
os, err := origin.Status()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
rs, err := replica.Status()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if os.Version != rs.Version {
|
|
|
|
panic("Versions do not match")
|
|
|
|
}
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
2021-03-28 15:58:54 +08:00
|
|
|
err = syncClients(origin, replica)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-03-28 06:40:59 +08:00
|
|
|
}
|
|
|
|
|
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
|
|
|
}
|
2021-03-28 15:58:54 +08:00
|
|
|
|
|
|
|
func syncClients(origin client.Client, replica client.Client) error {
|
|
|
|
oc, err := origin.Clients()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
rc, err := replica.Clients()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
a, u, r := rc.Merge(oc)
|
|
|
|
|
|
|
|
if err = replica.AddClients(a...); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if err = replica.UpdateClients(u...); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if err = replica.DeleteClients(r...); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|