From 495e0d261d1e7d5eefce35fc235beda7d2b144d9 Mon Sep 17 00:00:00 2001 From: Marc Brugger Date: Mon, 6 Mar 2023 22:07:34 +0100 Subject: [PATCH] Allow enabling/disabling target dhcp server (#160) * Allow enabling/disabling target dhcp server * add test * extend tests --- Makefile | 6 ++--- README.md | 1 + cmd/root.go | 14 +++++++++++- cmd/root_test.go | 51 +++++++++++++++++++++++++++++++++++++++++++ pkg/sync/sync.go | 5 +++++ pkg/sync/sync_test.go | 10 +++++++++ pkg/types/types.go | 1 + 7 files changed, 84 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 44f2c58..78a08cc 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ mocks: mockgen release: semver goreleaser @version=$$($(LOCALBIN)/semver); \ git tag -s $$version -m"Release $$version" - $(GORELEASER) --rm-dist + $(GORELEASER) --clean test-release: goreleaser $(GORELEASER) --skip-publish --snapshot --rm-dist @@ -92,11 +92,11 @@ update-toolbox-tools: ## toolbox - end start-replica: - docker run --pull always --name adguardhome-replica -p 9091:3000 --rm adguard/adguardhome:v0.107.23 + docker run --pull always --name adguardhome-replica -p 9091:3000 --rm adguard/adguardhome:latest # docker run --pull always --name adguardhome-replica -p 9090:80 -p 9091:3000 --rm adguard/adguardhome:v0.107.13 start-replica2: - docker run --pull always --name adguardhome-replica2 -p 9093:3000 --rm adguard/adguardhome:v0.107.23 + docker run --pull always --name adguardhome-replica2 -p 9093:3000 --rm adguard/adguardhome:latest # docker run --pull always --name adguardhome-replica -p 9090:80 -p 9091:3000 --rm adguard/adguardhome:v0.107.13 check_defined = \ diff --git a/README.md b/README.md index 6d6da48..e329f92 100644 --- a/README.md +++ b/README.md @@ -138,6 +138,7 @@ services: REPLICA1_APIPATH: '/some/path/control' # REPLICA1_AUTOSETUP: true # if true, AdGuardHome is automatically initialized. # REPLICA1_INTERFACENAME: 'ens18' # use custom dhcp interface name + # REPLICA1_DHCPSERVERENABLED: true/false (optional) enables/disables the dhcp server on the replica CRON: '*/10 * * * *' # run every 10 minutes RUNONSTART: true # Configure sync features; by default all features are enabled. diff --git a/cmd/root.go b/cmd/root.go index 14ec3fe..26c97d7 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -58,6 +58,7 @@ const ( envReplicasInterfaceName = "REPLICA%s_INTERFACENAME" // Deprecated: use envReplicasInterfaceName instead envReplicasInterfaceNameDeprecated = "REPLICA%s_INTERFACWENAME" + envDHCPServerEnabled = "REPLICA%s_DHCPSERVERENABLED" ) var ( @@ -152,7 +153,7 @@ func collectEnvReplicas(logger *zap.SugaredLogger) []types.AdGuardInstance { AutoSetup: strings.EqualFold(os.Getenv(fmt.Sprintf(envReplicasAutoSetup, sm[1])), "true"), InterfaceName: os.Getenv(fmt.Sprintf(envReplicasInterfaceName, sm[1])), } - if re.InterfaceName != "" { + if re.InterfaceName == "" { if in, ok := os.LookupEnv(fmt.Sprintf(envReplicasInterfaceNameDeprecated, sm[1])); ok { logger. With("correct", envReplicasInterfaceName, "deprecated", envReplicasInterfaceNameDeprecated). @@ -160,9 +161,20 @@ func collectEnvReplicas(logger *zap.SugaredLogger) []types.AdGuardInstance { re.InterfaceName = in } } + if dhcpEnabled, ok := os.LookupEnv(fmt.Sprintf(envDHCPServerEnabled, sm[1])); ok { + if strings.EqualFold(dhcpEnabled, "true") { + re.DHCPServerEnabled = boolPtr(true) + } else if strings.EqualFold(dhcpEnabled, "false") { + re.DHCPServerEnabled = boolPtr(false) + } + } replicas = append(replicas, re) } } return replicas } + +func boolPtr(b bool) *bool { + return &b +} diff --git a/cmd/root_test.go b/cmd/root_test.go index 0a11a28..df5f12a 100644 --- a/cmd/root_test.go +++ b/cmd/root_test.go @@ -1,6 +1,7 @@ package cmd import ( + "fmt" "os" "github.com/bakito/adguardhome-sync/pkg/log" @@ -22,6 +23,9 @@ var envVars = []string{ "FEATURES_DNS_SERVERCONFIG", "FEATURES_DNS_ACCESSLISTS", "FEATURES_DNS_REWRITES", + "REPLICA1_INTERFACENAME", + "REPLICA1_INTERFACWENAME", + "REPLICA1_DHCPSERVERENABLED", } var _ = Describe("Run", func() { @@ -33,6 +37,11 @@ var _ = Describe("Run", func() { } initConfig() }) + AfterEach(func() { + for _, envVar := range envVars { + Ω(os.Unsetenv(envVar)).ShouldNot(HaveOccurred()) + } + }) Context("getConfig", func() { It("features should be true by default", func() { cfg, err := getConfig(logger) @@ -47,6 +56,48 @@ var _ = Describe("Run", func() { Ω(err).ShouldNot(HaveOccurred()) verifyFeatures(cfg, false) }) + Context("interface name", func() { + It("should set interface name of replica 1", func() { + Ω(os.Setenv("REPLICA1_URL", "https://foo.bar")).ShouldNot(HaveOccurred()) + Ω(os.Setenv(fmt.Sprintf(envReplicasInterfaceName, "1"), "eth0")).ShouldNot(HaveOccurred()) + cfg, err := getConfig(logger) + Ω(err).ShouldNot(HaveOccurred()) + Ω(cfg.Replicas[0].InterfaceName).Should(Equal("eth0")) + }) + It("should set interface name of replica 1 from deprecated env", func() { + Ω(os.Setenv("REPLICA1_URL", "https://foo.bar")).ShouldNot(HaveOccurred()) + Ω(os.Setenv(fmt.Sprintf(envReplicasInterfaceNameDeprecated, "1"), "eth0")).ShouldNot(HaveOccurred()) + cfg, err := getConfig(logger) + Ω(err).ShouldNot(HaveOccurred()) + Ω(cfg.Replicas[0].InterfaceName).Should(Equal("eth0")) + }) + It("deprecated should not overwrite the correct", func() { + Ω(os.Setenv("REPLICA1_URL", "https://foo.bar")).ShouldNot(HaveOccurred()) + Ω(os.Setenv(fmt.Sprintf(envReplicasInterfaceNameDeprecated, "1"), "eth1")).ShouldNot(HaveOccurred()) + Ω(os.Setenv(fmt.Sprintf(envReplicasInterfaceName, "1"), "eth0")).ShouldNot(HaveOccurred()) + cfg, err := getConfig(logger) + Ω(err).ShouldNot(HaveOccurred()) + Ω(cfg.Replicas[0].InterfaceName).Should(Equal("eth0")) + }) + }) + Context("dhcp server", func() { + It("should enable the dhcp server of replica 1", func() { + Ω(os.Setenv("REPLICA1_URL", "https://foo.bar")).ShouldNot(HaveOccurred()) + Ω(os.Setenv(fmt.Sprintf(envDHCPServerEnabled, "1"), "true")).ShouldNot(HaveOccurred()) + cfg, err := getConfig(logger) + Ω(err).ShouldNot(HaveOccurred()) + Ω(cfg.Replicas[0].DHCPServerEnabled).ShouldNot(BeNil()) + Ω(*cfg.Replicas[0].DHCPServerEnabled).Should(BeTrue()) + }) + It("should disable the dhcp server of replica 1", func() { + Ω(os.Setenv("REPLICA1_URL", "https://foo.bar")).ShouldNot(HaveOccurred()) + Ω(os.Setenv(fmt.Sprintf(envDHCPServerEnabled, "1"), "false")).ShouldNot(HaveOccurred()) + cfg, err := getConfig(logger) + Ω(err).ShouldNot(HaveOccurred()) + Ω(cfg.Replicas[0].DHCPServerEnabled).ShouldNot(BeNil()) + Ω(*cfg.Replicas[0].DHCPServerEnabled).Should(BeFalse()) + }) + }) }) }) diff --git a/pkg/sync/sync.go b/pkg/sync/sync.go index df9193b..53bfb27 100644 --- a/pkg/sync/sync.go +++ b/pkg/sync/sync.go @@ -492,6 +492,11 @@ func (w *worker) syncDHCPServer(osc *types.DHCPServerConfig, rc client.Client, r // overwrite interface name origClone.InterfaceName = replica.InterfaceName } + if replica.DHCPServerEnabled != nil { + // overwrite dhcp enabled + origClone.Enabled = *replica.DHCPServerEnabled + } + if !sc.Equals(origClone) { if err = rc.SetDHCPServerConfig(origClone); err != nil { return err diff --git a/pkg/sync/sync_test.go b/pkg/sync/sync_test.go index b5f069e..8ce7281 100644 --- a/pkg/sync/sync_test.go +++ b/pkg/sync/sync_test.go @@ -13,6 +13,8 @@ import ( . "github.com/onsi/gomega" ) +var boolTrue = true + var _ = Describe("Sync", func() { var ( mockCtrl *gm.Controller @@ -455,6 +457,14 @@ var _ = Describe("Sync", func() { err := w.syncDHCPServer(osc, cl, types.AdGuardInstance{InterfaceName: "foo"}) Ω(err).ShouldNot(HaveOccurred()) }) + It("should enable the target dhcp server", func() { + cl.EXPECT().DHCPServerConfig().Return(rsc, nil) + oscClone := osc.Clone() + oscClone.Enabled = true + cl.EXPECT().SetDHCPServerConfig(oscClone) + err := w.syncDHCPServer(osc, cl, types.AdGuardInstance{DHCPServerEnabled: &boolTrue}) + Ω(err).ShouldNot(HaveOccurred()) + }) }) Context("sync", func() { diff --git a/pkg/types/types.go b/pkg/types/types.go index e140382..ae9aa17 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -64,6 +64,7 @@ type AdGuardInstance struct { InsecureSkipVerify bool `json:"insecureSkipVerify" yaml:"insecureSkipVerify"` AutoSetup bool `json:"autoSetup" yaml:"autoSetup"` InterfaceName string `json:"interfaceName" yaml:"interfaceName"` + DHCPServerEnabled *bool `json:"dhcpServerEnabled,omitempty" yaml:"dhcpServerEnabled,omitempty"` } // Key AdGuardInstance key