diff --git a/.toolbox.mk b/.toolbox.mk index 88d7e8fd..ac899713 100644 --- a/.toolbox.mk +++ b/.toolbox.mk @@ -11,7 +11,9 @@ $(TB_LOCALBIN): ## Tool Binaries TB_DEEPCOPY_GEN ?= $(TB_LOCALBIN)/deepcopy-gen TB_GINKGO ?= $(TB_LOCALBIN)/ginkgo +TB_GOFUMPT ?= $(TB_LOCALBIN)/gofumpt TB_GOLANGCI_LINT ?= $(TB_LOCALBIN)/golangci-lint +TB_GOLINES ?= $(TB_LOCALBIN)/golines TB_GORELEASER ?= $(TB_LOCALBIN)/goreleaser TB_MOCKGEN ?= $(TB_LOCALBIN)/mockgen TB_OAPI_CODEGEN ?= $(TB_LOCALBIN)/oapi-codegen @@ -20,8 +22,12 @@ TB_SEMVER ?= $(TB_LOCALBIN)/semver ## Tool Versions # renovate: packageName=k8s.io/code-generator/cmd/deepcopy-gen TB_DEEPCOPY_GEN_VERSION ?= v0.32.0 +# renovate: packageName=mvdan.cc/gofumpt +TB_GOFUMPT_VERSION ?= v0.7.0 # renovate: packageName=github.com/golangci/golangci-lint/cmd/golangci-lint TB_GOLANGCI_LINT_VERSION ?= v1.62.2 +# renovate: packageName=github.com/segmentio/golines +TB_GOLINES_VERSION ?= v0.12.2 # renovate: packageName=github.com/goreleaser/goreleaser/v2 TB_GORELEASER_VERSION ?= v2.5.0 # renovate: packageName=go.uber.org/mock/mockgen @@ -40,10 +46,18 @@ $(TB_DEEPCOPY_GEN): $(TB_LOCALBIN) tb.ginkgo: $(TB_GINKGO) ## Download ginkgo locally if necessary. $(TB_GINKGO): $(TB_LOCALBIN) test -s $(TB_LOCALBIN)/ginkgo || GOBIN=$(TB_LOCALBIN) go install github.com/onsi/ginkgo/v2/ginkgo +.PHONY: tb.gofumpt +tb.gofumpt: $(TB_GOFUMPT) ## Download gofumpt locally if necessary. +$(TB_GOFUMPT): $(TB_LOCALBIN) + test -s $(TB_LOCALBIN)/gofumpt || GOBIN=$(TB_LOCALBIN) go install mvdan.cc/gofumpt@$(TB_GOFUMPT_VERSION) .PHONY: tb.golangci-lint tb.golangci-lint: $(TB_GOLANGCI_LINT) ## Download golangci-lint locally if necessary. $(TB_GOLANGCI_LINT): $(TB_LOCALBIN) test -s $(TB_LOCALBIN)/golangci-lint || GOBIN=$(TB_LOCALBIN) go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(TB_GOLANGCI_LINT_VERSION) +.PHONY: tb.golines +tb.golines: $(TB_GOLINES) ## Download golines locally if necessary. +$(TB_GOLINES): $(TB_LOCALBIN) + test -s $(TB_LOCALBIN)/golines || GOBIN=$(TB_LOCALBIN) go install github.com/segmentio/golines@$(TB_GOLINES_VERSION) .PHONY: tb.goreleaser tb.goreleaser: $(TB_GORELEASER) ## Download goreleaser locally if necessary. $(TB_GORELEASER): $(TB_LOCALBIN) @@ -67,7 +81,9 @@ tb.reset: @rm -f \ $(TB_LOCALBIN)/deepcopy-gen \ $(TB_LOCALBIN)/ginkgo \ + $(TB_LOCALBIN)/gofumpt \ $(TB_LOCALBIN)/golangci-lint \ + $(TB_LOCALBIN)/golines \ $(TB_LOCALBIN)/goreleaser \ $(TB_LOCALBIN)/mockgen \ $(TB_LOCALBIN)/oapi-codegen \ @@ -78,7 +94,9 @@ tb.reset: tb.update: tb.reset toolbox makefile --renovate -f $(TB_LOCALDIR)/Makefile \ k8s.io/code-generator/cmd/deepcopy-gen@github.com/kubernetes/code-generator \ + mvdan.cc/gofumpt@github.com/mvdan/gofumpt \ github.com/golangci/golangci-lint/cmd/golangci-lint \ + github.com/segmentio/golines \ github.com/goreleaser/goreleaser/v2 \ go.uber.org/mock/mockgen@github.com/uber-go/mock \ github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen \ diff --git a/Makefile b/Makefile index 91068b0f..9c42ee28 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,9 @@ generate: tb.deepcopy-gen @touch ./tmp/deepcopy-gen-boilerplate.go.txt $(TB_DEEPCOPY_GEN) --go-header-file ./tmp/deepcopy-gen-boilerplate.go.txt --bounding-dirs ./pkg/types +fmt: tb.golines tb.gofumpt + $(TB_GOLINES) --base-formatter="$(TB_GOFUMPT)" --max-len=120 --write-output . + # Run tests test: generate lint test-ci diff --git a/cmd/run.go b/cmd/run.go index bba67edf..a379edcd 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -50,7 +50,8 @@ func init() { doCmd.PersistentFlags().Bool(config.FlagContinueOnError, false, "If enabled, the synchronisation task "+ "will not fail on single errors, but will log the errors and continue.") - doCmd.PersistentFlags().Int(config.FlagApiPort, 8080, "Sync API Port, the API endpoint will be started to enable remote triggering; if 0 port API is disabled.") + doCmd.PersistentFlags(). + Int(config.FlagApiPort, 8080, "Sync API Port, the API endpoint will be started to enable remote triggering; if 0 port API is disabled.") doCmd.PersistentFlags().String(config.FlagApiUsername, "", "Sync API username") doCmd.PersistentFlags().String(config.FlagApiPassword, "", "Sync API password") doCmd.PersistentFlags().String(config.FlagApiDarkMode, "", "API UI in dark mode") @@ -70,7 +71,8 @@ func init() { doCmd.PersistentFlags().Bool(config.FlagFeatureFilters, true, "Enable filters sync feature") doCmd.PersistentFlags().String(config.FlagOriginURL, "", "Origin instance url") - doCmd.PersistentFlags().String(config.FlagOriginWebURL, "", "Origin instance web url used in the web interface (default: )") + doCmd.PersistentFlags(). + String(config.FlagOriginWebURL, "", "Origin instance web url used in the web interface (default: )") doCmd.PersistentFlags().String(config.FlagOriginApiPath, "/control", "Origin instance API path") doCmd.PersistentFlags().String(config.FlagOriginUsername, "", "Origin instance username") doCmd.PersistentFlags().String(config.FlagOriginPassword, "", "Origin instance password") @@ -78,12 +80,15 @@ func init() { doCmd.PersistentFlags().Bool(config.FlagOriginISV, false, "Enable Origin instance InsecureSkipVerify") doCmd.PersistentFlags().String(config.FlagReplicaURL, "", "Replica instance url") - doCmd.PersistentFlags().String(config.FlagReplicaWebURL, "", "Replica instance web url used in the web interface (default: )") + doCmd.PersistentFlags(). + String(config.FlagReplicaWebURL, "", "Replica instance web url used in the web interface (default: )") doCmd.PersistentFlags().String(config.FlagReplicaApiPath, "/control", "Replica instance API path") doCmd.PersistentFlags().String(config.FlagReplicaUsername, "", "Replica instance username") doCmd.PersistentFlags().String(config.FlagReplicaPassword, "", "Replica instance password") doCmd.PersistentFlags().String(config.FlagReplicaCookie, "", "If Set, uses a cookie for authentication") doCmd.PersistentFlags().Bool(config.FlagReplicaISV, false, "Enable Replica instance InsecureSkipVerify") - doCmd.PersistentFlags().Bool(config.FlagReplicaAutoSetup, false, "Enable automatic setup of new AdguardHome instances. This replaces the setup wizard.") - doCmd.PersistentFlags().String(config.FlagReplicaInterfaceName, "", "Optional change the interface name of the replica if it differs from the master") + doCmd.PersistentFlags(). + Bool(config.FlagReplicaAutoSetup, false, "Enable automatic setup of new AdguardHome instances. This replaces the setup wizard.") + doCmd.PersistentFlags(). + String(config.FlagReplicaInterfaceName, "", "Optional change the interface name of the replica if it differs from the master") } diff --git a/openapi/main.go b/openapi/main.go index 57a96215..4ccd0b4a 100644 --- a/openapi/main.go +++ b/openapi/main.go @@ -20,7 +20,9 @@ func main() { } log.Printf("Patching schema version %s\n", version) - resp, err := http.Get(fmt.Sprintf("https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/%s/openapi/openapi.yaml", version)) + resp, err := http.Get( + fmt.Sprintf("https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/%s/openapi/openapi.yaml", version), + ) if err != nil { log.Fatalln(err) } diff --git a/pkg/client/client.go b/pkg/client/client.go index 718a87a9..008c2131 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -166,7 +166,10 @@ func (cl *client) Stats() (*model.Stats, error) { func (cl *client) QueryLog(limit int) (*model.QueryLog, error) { ql := &model.QueryLog{} - err := cl.doGet(cl.client.R().EnableTrace().SetResult(ql), fmt.Sprintf(`querylog?limit=%d&response_status="all"`, limit)) + err := cl.doGet( + cl.client.R().EnableTrace().SetResult(ql), + fmt.Sprintf(`querylog?limit=%d&response_status="all"`, limit), + ) return ql, err } @@ -260,7 +263,10 @@ func (cl *client) UpdateFilter(whitelist bool, f model.Filter) error { func (cl *client) RefreshFilters(whitelist bool) error { cl.log.With("whitelist", whitelist).Info("Refresh filter") - return cl.doPost(cl.client.R().EnableTrace().SetBody(&model.FilterRefreshRequest{Whitelist: utils.Ptr(whitelist)}), "/filtering/refresh") + return cl.doPost( + cl.client.R().EnableTrace().SetBody(&model.FilterRefreshRequest{Whitelist: utils.Ptr(whitelist)}), + "/filtering/refresh", + ) } func (cl *client) ToggleProtection(enable bool) error { @@ -309,7 +315,10 @@ func (cl *client) AddClient(client *model.Client) error { func (cl *client) UpdateClient(client *model.Client) error { cl.log.With("name", *client.Name).Info("Update client settings") - return cl.doPost(cl.client.R().EnableTrace().SetBody(&model.ClientUpdate{Name: client.Name, Data: client}), "/clients/update") + return cl.doPost( + cl.client.R().EnableTrace().SetBody(&model.ClientUpdate{Name: client.Name, Data: client}), + "/clients/update", + ) } func (cl *client) DeleteClient(client *model.Client) error { @@ -324,7 +333,8 @@ func (cl *client) QueryLogConfig() (*model.QueryLogConfigWithIgnored, error) { } func (cl *client) SetQueryLogConfig(qlc *model.QueryLogConfigWithIgnored) error { - cl.log.With("enabled", *qlc.Enabled, "interval", *qlc.Interval, "anonymizeClientIP", *qlc.AnonymizeClientIp).Info("Set query log config") + cl.log.With("enabled", *qlc.Enabled, "interval", *qlc.Interval, "anonymizeClientIP", *qlc.AnonymizeClientIp). + Info("Set query log config") return cl.doPut(cl.client.R().EnableTrace().SetBody(qlc), "/querylog/config/update") } diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go index 3235b616..cf48cdb9 100644 --- a/pkg/client/client_test.go +++ b/pkg/client/client_test.go @@ -137,7 +137,14 @@ var _ = Describe("Client", func() { Context("Setup", func() { It("should add setup the instance", func() { - ts, cl = ClientPost("/install/configure", fmt.Sprintf(`{"web":{"ip":"0.0.0.0","port":3000,"status":"","can_autofix":false},"dns":{"ip":"0.0.0.0","port":53,"status":"","can_autofix":false},"username":"%s","password":"%s"}`, username, password)) + ts, cl = ClientPost( + "/install/configure", + fmt.Sprintf( + `{"web":{"ip":"0.0.0.0","port":3000,"status":"","can_autofix":false},"dns":{"ip":"0.0.0.0","port":53,"status":"","can_autofix":false},"username":"%s","password":"%s"}`, + username, + password, + ), + ) err := cl.Setup() Ω(err).ShouldNot(HaveOccurred()) }) @@ -303,7 +310,10 @@ var _ = Describe("Client", func() { Ω(*qlc.Interval).Should(Equal(model.QueryLogConfigInterval(90))) }) It("should set QueryLogConfig", func() { - ts, cl = ClientPut("/querylog/config/update", `{"anonymize_client_ip":true,"enabled":true,"interval":123,"ignored":["foo.bar"]}`) + ts, cl = ClientPut( + "/querylog/config/update", + `{"anonymize_client_ip":true,"enabled":true,"interval":123,"ignored":["foo.bar"]}`, + ) var interval model.QueryLogConfigInterval = 123 err := cl.SetQueryLogConfig(&model.QueryLogConfigWithIgnored{ diff --git a/pkg/client/model/model-functions.go b/pkg/client/model/model-functions.go index 3160c7ea..9a705335 100644 --- a/pkg/client/model/model-functions.go +++ b/pkg/client/model/model-functions.go @@ -442,7 +442,9 @@ func (c *DNSConfig) Sanitize(l *zap.SugaredLogger) { // https://github.com/AdguardTeam/AdGuardHome/issues/6820 if c.UsePrivatePtrResolvers != nil && *c.UsePrivatePtrResolvers && (c.LocalPtrUpstreams == nil || len(*c.LocalPtrUpstreams) == 0) { - l.Warn("disabling replica 'Use private reverse DNS resolvers' as no 'Private reverse DNS servers' are configured on origin") + l.Warn( + "disabling replica 'Use private reverse DNS resolvers' as no 'Private reverse DNS servers' are configured on origin", + ) c.UsePrivatePtrResolvers = utils.Ptr(false) } } diff --git a/pkg/client/model/model_test.go b/pkg/client/model/model_test.go index 325461f3..95bdd3db 100644 --- a/pkg/client/model/model_test.go +++ b/pkg/client/model/model_test.go @@ -242,7 +242,10 @@ var _ = Describe("Types", func() { }) It("should return 3 one replicas if urls are different", func() { cfg.Replica = &types.AdGuardInstance{URL: url, APIPath: apiPath} - cfg.Replicas = []types.AdGuardInstance{{URL: url + "1", APIPath: apiPath}, {URL: url, APIPath: apiPath + "1"}} + cfg.Replicas = []types.AdGuardInstance{ + {URL: url + "1", APIPath: apiPath}, + {URL: url, APIPath: apiPath + "1"}, + } r := cfg.UniqueReplicas() Ω(r).Should(HaveLen(3)) }) @@ -311,8 +314,14 @@ var _ = Describe("Types", func() { cl2 *model.Client ) BeforeEach(func() { - cl1 = &model.Client{Name: utils.Ptr("foo"), BlockedServicesSchedule: &model.Schedule{TimeZone: utils.Ptr("UTC")}} - cl2 = &model.Client{Name: utils.Ptr("foo"), BlockedServicesSchedule: &model.Schedule{TimeZone: utils.Ptr("Local")}} + cl1 = &model.Client{ + Name: utils.Ptr("foo"), + BlockedServicesSchedule: &model.Schedule{TimeZone: utils.Ptr("UTC")}, + } + cl2 = &model.Client{ + Name: utils.Ptr("foo"), + BlockedServicesSchedule: &model.Schedule{TimeZone: utils.Ptr("Local")}, + } }) It("should equal if only timezone differs on empty blocked service schedule", func() { diff --git a/pkg/sync/action-general.go b/pkg/sync/action-general.go index f3ca5d8d..1b7a8228 100644 --- a/pkg/sync/action-general.go +++ b/pkg/sync/action-general.go @@ -105,7 +105,8 @@ var ( return ac.client.SetCustomRules(ac.origin.filters.UserRules) } - if !utils.PtrEquals(ac.origin.filters.Enabled, rf.Enabled) || !utils.PtrEquals(ac.origin.filters.Interval, rf.Interval) { + if !utils.PtrEquals(ac.origin.filters.Enabled, rf.Enabled) || + !utils.PtrEquals(ac.origin.filters.Interval, rf.Interval) { return ac.client.ToggleFiltering(*ac.origin.filters.Enabled, *ac.origin.filters.Interval) } return nil @@ -236,7 +237,14 @@ var ( } ) -func syncFilterType(rl *zap.SugaredLogger, of *[]model.Filter, rFilters *[]model.Filter, whitelist bool, replica client.Client, continueOnError bool) error { +func syncFilterType( + rl *zap.SugaredLogger, + of *[]model.Filter, + rFilters *[]model.Filter, + whitelist bool, + replica client.Client, + continueOnError bool, +) error { fa, fu, fd := model.MergeFilters(rFilters, of) for _, f := range fd { diff --git a/pkg/sync/http.go b/pkg/sync/http.go index 65c39ea1..7a67ef7e 100644 --- a/pkg/sync/http.go +++ b/pkg/sync/http.go @@ -42,14 +42,23 @@ func (w *worker) handleRoot(c *gin.Context) { "Build": version.Build, "SyncStatus": w.status(), "Stats": map[string]interface{}{ - "Labels": getLast24Hours(), - "DNS": dns, - "Blocked": blocked, - "BlockedPercentage": fmt.Sprintf("%.2f", (float64(*total.NumBlockedFiltering)*100.0)/float64(*total.NumDnsQueries)), - "Malware": malware, - "MalwarePercentage": fmt.Sprintf("%.2f", (float64(*total.NumReplacedSafebrowsing)*100.0)/float64(*total.NumDnsQueries)), - "Adult": adult, - "AdultPercentage": fmt.Sprintf("%.2f", (float64(*total.NumReplacedParental)*100.0)/float64(*total.NumDnsQueries)), + "Labels": getLast24Hours(), + "DNS": dns, + "Blocked": blocked, + "BlockedPercentage": fmt.Sprintf( + "%.2f", + (float64(*total.NumBlockedFiltering)*100.0)/float64(*total.NumDnsQueries), + ), + "Malware": malware, + "MalwarePercentage": fmt.Sprintf( + "%.2f", + (float64(*total.NumReplacedSafebrowsing)*100.0)/float64(*total.NumDnsQueries), + ), + "Adult": adult, + "AdultPercentage": fmt.Sprintf( + "%.2f", + (float64(*total.NumReplacedParental)*100.0)/float64(*total.NumDnsQueries), + ), "TotalDNS": total.NumDnsQueries, "TotalBlocked": total.NumBlockedFiltering, diff --git a/pkg/sync/stats.go b/pkg/sync/stats.go index 0402bf24..d652c645 100644 --- a/pkg/sync/stats.go +++ b/pkg/sync/stats.go @@ -72,7 +72,13 @@ func safeStats(stats *[]int) []int { return *stats } -func graphLines(t *model.Stats, s metrics.OverallStats, baseColor []int, altColors [][]int, dataCB func(s *model.Stats) []int) []line { +func graphLines( + t *model.Stats, + s metrics.OverallStats, + baseColor []int, + altColors [][]int, + dataCB func(s *model.Stats) []int, +) []line { g := &graph{ total: line{ Fill: true, diff --git a/pkg/sync/sync.go b/pkg/sync/sync.go index b28bea63..1ca189ec 100644 --- a/pkg/sync/sync.go +++ b/pkg/sync/sync.go @@ -172,7 +172,8 @@ func (w *worker) sync() { } if versions.IsNewerThan(versions.MinAgh, o.status.Version) { - sl.With("error", err, "version", o.status.Version).Errorf("Origin AdGuard Home version must be >= %s", versions.MinAgh) + sl.With("error", err, "version", o.status.Version). + Errorf("Origin AdGuard Home version must be >= %s", versions.MinAgh) return } @@ -280,12 +281,14 @@ func (w *worker) syncTo(l *zap.SugaredLogger, o *origin, replica types.AdGuardIn rl.With("version", replicaStatus.Version).Info("Connected to replica") if versions.IsNewerThan(versions.MinAgh, replicaStatus.Version) { - rl.With("error", err, "version", replicaStatus.Version).Errorf("Replica AdGuard Home version must be >= %s", versions.MinAgh) + rl.With("error", err, "version", replicaStatus.Version). + Errorf("Replica AdGuard Home version must be >= %s", versions.MinAgh) return } if o.status.Version != replicaStatus.Version { - rl.With("originVersion", o.status.Version, "replicaVersion", replicaStatus.Version).Warn("Versions do not match") + rl.With("originVersion", o.status.Version, "replicaVersion", replicaStatus.Version). + Warn("Versions do not match") } ac := &actionContext{ @@ -308,7 +311,11 @@ func (w *worker) syncTo(l *zap.SugaredLogger, o *origin, replica types.AdGuardIn rl.Info("Sync done") } -func (w *worker) statusWithSetup(rl *zap.SugaredLogger, replica types.AdGuardInstance, rc client.Client) (*model.ServerStatus, error) { +func (w *worker) statusWithSetup( + rl *zap.SugaredLogger, + replica types.AdGuardInstance, + rc client.Client, +) (*model.ServerStatus, error) { rs, err := rc.Status() if err != nil { if replica.AutoSetup && errors.Is(err, client.ErrSetupNeeded) { diff --git a/pkg/sync/sync_test.go b/pkg/sync/sync_test.go index dc8f204c..468e3eda 100644 --- a/pkg/sync/sync_test.go +++ b/pkg/sync/sync_test.go @@ -273,14 +273,18 @@ var _ = Describe("Sync", func() { }) It("should not sync profileInfo if language is not set", func() { ac.origin.profileInfo.Language = "" - cl.EXPECT().ProfileInfo().Return(&model.ProfileInfo{Name: "replica", Language: "en", Theme: "auto"}, nil) + cl.EXPECT(). + ProfileInfo(). + Return(&model.ProfileInfo{Name: "replica", Language: "en", Theme: "auto"}, nil) cl.EXPECT().SetProfileInfo(ac.origin.profileInfo).Times(0) err := actionProfileInfo(ac) Ω(err).ShouldNot(HaveOccurred()) }) It("should not sync profileInfo if theme is not set", func() { ac.origin.profileInfo.Theme = "" - cl.EXPECT().ProfileInfo().Return(&model.ProfileInfo{Name: "replica", Language: "en", Theme: "auto"}, nil) + cl.EXPECT(). + ProfileInfo(). + Return(&model.ProfileInfo{Name: "replica", Language: "en", Theme: "auto"}, nil) cl.EXPECT().SetProfileInfo(ac.origin.profileInfo).Times(0) err := actionProfileInfo(ac) Ω(err).ShouldNot(HaveOccurred()) @@ -315,7 +319,8 @@ var _ = Describe("Sync", func() { var interval model.QueryLogConfigInterval = 123 ac.origin.queryLogConfig.Interval = &interval cl.EXPECT().QueryLogConfig().Return(qlc, nil) - cl.EXPECT().SetQueryLogConfig(&model.QueryLogConfigWithIgnored{QueryLogConfig: model.QueryLogConfig{AnonymizeClientIp: nil, Interval: &interval, Enabled: nil}}) + cl.EXPECT(). + SetQueryLogConfig(&model.QueryLogConfigWithIgnored{QueryLogConfig: model.QueryLogConfig{AnonymizeClientIp: nil, Interval: &interval, Enabled: nil}}) err := actionQueryLogConfig(ac) Ω(err).ShouldNot(HaveOccurred()) }) @@ -434,7 +439,9 @@ var _ = Describe("Sync", func() { Ω(err).ShouldNot(HaveOccurred()) }) It("should update a filter", func() { - ac.origin.filters.Filters = utils.Ptr([]model.Filter{{Name: "foo", Url: "https://foo.bar", Enabled: true}}) + ac.origin.filters.Filters = utils.Ptr( + []model.Filter{{Name: "foo", Url: "https://foo.bar", Enabled: true}}, + ) rf.Filters = utils.Ptr([]model.Filter{{Name: "foo", Url: "https://foo.bar"}}) cl.EXPECT().Filtering().Return(rf, nil) cl.EXPECT().UpdateFilter(false, model.Filter{Name: "foo", Url: "https://foo.bar", Enabled: true}) @@ -447,16 +454,22 @@ var _ = Describe("Sync", func() { ac.cfg.ContinueOnError = false ac.origin.filters.Filters = utils.Ptr([]model.Filter{{Name: "foo", Url: "https://foo.bar"}}) cl.EXPECT().Filtering().Return(rf, nil) - cl.EXPECT().AddFilter(false, model.Filter{Name: "foo", Url: "https://foo.bar"}).Return(errors.New("test failure")) + cl.EXPECT(). + AddFilter(false, model.Filter{Name: "foo", Url: "https://foo.bar"}). + Return(errors.New("test failure")) err := actionFilters(ac) Ω(err).Should(HaveOccurred()) }) It("should continue after failed added filter", func() { ac.cfg.ContinueOnError = true - ac.origin.filters.Filters = utils.Ptr([]model.Filter{{Name: "foo", Url: "https://foo.bar"}, {Name: "bar", Url: "https://bar.foo"}}) + ac.origin.filters.Filters = utils.Ptr( + []model.Filter{{Name: "foo", Url: "https://foo.bar"}, {Name: "bar", Url: "https://bar.foo"}}, + ) cl.EXPECT().Filtering().Return(rf, nil) - cl.EXPECT().AddFilter(false, model.Filter{Name: "foo", Url: "https://foo.bar"}).Return(errors.New("test failure")) + cl.EXPECT(). + AddFilter(false, model.Filter{Name: "foo", Url: "https://foo.bar"}). + Return(errors.New("test failure")) cl.EXPECT().AddFilter(false, model.Filter{Name: "bar", Url: "https://bar.foo"}) cl.EXPECT().RefreshFilters(gm.Any()) err := actionFilters(ac) diff --git a/pkg/types/features.go b/pkg/types/features.go index 43cee08f..ed09f060 100644 --- a/pkg/types/features.go +++ b/pkg/types/features.go @@ -27,15 +27,15 @@ func NewFeatures(enabled bool) Features { // Features feature flags type Features struct { - DNS DNS `json:"dns" yaml:"dns"` - DHCP DHCP `json:"dhcp" yaml:"dhcp"` + DNS DNS `json:"dns" yaml:"dns"` + DHCP DHCP `json:"dhcp" yaml:"dhcp"` GeneralSettings bool `json:"generalSettings" yaml:"generalSettings" env:"FEATURES_GENERAL_SETTINGS"` - QueryLogConfig bool `json:"queryLogConfig" yaml:"queryLogConfig" env:"FEATURES_QUERY_LOG_CONFIG"` - StatsConfig bool `json:"statsConfig" yaml:"statsConfig" env:"FEATURES_STATS_CONFIG"` - ClientSettings bool `json:"clientSettings" yaml:"clientSettings" env:"FEATURES_CLIENT_SETTINGS"` - Services bool `json:"services" yaml:"services" env:"FEATURES_SERVICES"` - Filters bool `json:"filters" yaml:"filters" env:"FEATURES_FILTERS"` - Theme bool `json:"theme" yaml:"theme" env:"FEATURES_THEME"` + QueryLogConfig bool `json:"queryLogConfig" yaml:"queryLogConfig" env:"FEATURES_QUERY_LOG_CONFIG"` + StatsConfig bool `json:"statsConfig" yaml:"statsConfig" env:"FEATURES_STATS_CONFIG"` + ClientSettings bool `json:"clientSettings" yaml:"clientSettings" env:"FEATURES_CLIENT_SETTINGS"` + Services bool `json:"services" yaml:"services" env:"FEATURES_SERVICES"` + Filters bool `json:"filters" yaml:"filters" env:"FEATURES_FILTERS"` + Theme bool `json:"theme" yaml:"theme" env:"FEATURES_THEME"` } // DHCP features @@ -46,9 +46,9 @@ type DHCP struct { // DNS features type DNS struct { - AccessLists bool `json:"accessLists" yaml:"accessLists" env:"FEATURES_DNS_ACCESS_LISTS"` + AccessLists bool `json:"accessLists" yaml:"accessLists" env:"FEATURES_DNS_ACCESS_LISTS"` ServerConfig bool `json:"serverConfig" yaml:"serverConfig" env:"FEATURES_DNS_SERVER_CONFIG"` - Rewrites bool `json:"rewrites" yaml:"rewrites" env:"FEATURES_DNS_REWRITES"` + Rewrites bool `json:"rewrites" yaml:"rewrites" env:"FEATURES_DNS_REWRITES"` } // LogDisabled log all disabled features diff --git a/pkg/types/types.go b/pkg/types/types.go index 4c7d90bd..2fd90053 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -18,39 +18,39 @@ const ( // Config application configuration struct // +k8s:deepcopy-gen=true type Config struct { - Origin AdGuardInstance `json:"origin" yaml:"origin" env:"ORIGIN"` - Replica *AdGuardInstance `json:"replica,omitempty" yaml:"replica,omitempty" env:"REPLICA"` - Replicas []AdGuardInstance `json:"replicas,omitempty" yaml:"replicas,omitempty"` - Cron string `json:"cron,omitempty" yaml:"cron,omitempty" env:"CRON"` - RunOnStart bool `json:"runOnStart,omitempty" yaml:"runOnStart,omitempty" env:"RUN_ON_START"` + Origin AdGuardInstance `json:"origin" yaml:"origin" env:"ORIGIN"` + Replica *AdGuardInstance `json:"replica,omitempty" yaml:"replica,omitempty" env:"REPLICA"` + Replicas []AdGuardInstance `json:"replicas,omitempty" yaml:"replicas,omitempty"` + Cron string `json:"cron,omitempty" yaml:"cron,omitempty" env:"CRON"` + RunOnStart bool `json:"runOnStart,omitempty" yaml:"runOnStart,omitempty" env:"RUN_ON_START"` PrintConfigOnly bool `json:"printConfigOnly,omitempty" yaml:"printConfigOnly,omitempty" env:"PRINT_CONFIG_ONLY"` ContinueOnError bool `json:"continueOnError,omitempty" yaml:"continueOnError,omitempty" env:"CONTINUE_ON_ERROR"` - API API `json:"api,omitempty" yaml:"api,omitempty" env:"API"` - Features Features `json:"features,omitempty" yaml:"features,omitempty" env:"FEATURES_"` + API API `json:"api,omitempty" yaml:"api,omitempty" env:"API"` + Features Features `json:"features,omitempty" yaml:"features,omitempty" env:"FEATURES_"` } // API configuration type API struct { - Port int `json:"port,omitempty" yaml:"port,omitempty" env:"API_PORT"` + Port int `json:"port,omitempty" yaml:"port,omitempty" env:"API_PORT"` Username string `json:"username,omitempty" yaml:"username,omitempty" env:"API_USERNAME"` Password string `json:"password,omitempty" yaml:"password,omitempty" env:"API_PASSWORD"` DarkMode bool `json:"darkMode,omitempty" yaml:"darkMode,omitempty" env:"API_DARK_MODE"` - Metrics Metrics `json:"metrics,omitempty" yaml:"metrics,omitempty" env:"API_METRICS"` - TLS TLS `json:"tls,omitempty" yaml:"tls,omitempty" env:"API_TLS"` + Metrics Metrics `json:"metrics,omitempty" yaml:"metrics,omitempty" env:"API_METRICS"` + TLS TLS `json:"tls,omitempty" yaml:"tls,omitempty" env:"API_TLS"` } // Metrics configuration type Metrics struct { - Enabled bool `json:"enabled,omitempty" yaml:"enabled,omitempty" env:"API_METRICS_ENABLED"` + Enabled bool `json:"enabled,omitempty" yaml:"enabled,omitempty" env:"API_METRICS_ENABLED"` ScrapeInterval time.Duration `json:"scrapeInterval,omitempty" yaml:"scrapeInterval,omitempty" env:"API_METRICS_SCRAPE_INTERVAL"` - QueryLogLimit int `json:"queryLogLimit,omitempty" yaml:"queryLogLimit,omitempty" env:"API_METRICS_QUERY_LOG_LIMIT"` + QueryLogLimit int `json:"queryLogLimit,omitempty" yaml:"queryLogLimit,omitempty" env:"API_METRICS_QUERY_LOG_LIMIT"` } // TLS configuration type TLS struct { - CertDir string `json:"certDir,omitempty" yaml:"certDir,omitempty" env:"API_TLS_CERT_DIR"` + CertDir string `json:"certDir,omitempty" yaml:"certDir,omitempty" env:"API_TLS_CERT_DIR"` CertName string `json:"certName,omitempty" yaml:"certName,omitempty" env:"API_TLS_CERT_NAME"` - KeyName string `json:"keyName,omitempty" yaml:"keyName,omitempty" env:"API_TLS_KEY_NAME"` + KeyName string `json:"keyName,omitempty" yaml:"keyName,omitempty" env:"API_TLS_KEY_NAME"` } func (t TLS) Enabled() bool { @@ -140,15 +140,15 @@ func (cfg *Config) Init() error { // AdGuardInstance AdguardHome config instance // +k8s:deepcopy-gen=true type AdGuardInstance struct { - URL string `json:"url" yaml:"url" env:"URL"` - WebURL string `json:"webURL" yaml:"webURL" env:"WEB_URL"` - APIPath string `json:"apiPath,omitempty" yaml:"apiPath,omitempty" env:"API_PATH"` - Username string `json:"username,omitempty" yaml:"username,omitempty" env:"USERNAME"` - Password string `json:"password,omitempty" yaml:"password,omitempty" env:"PASSWORD"` - Cookie string `json:"cookie,omitempty" yaml:"cookie,omitempty" env:"COOKIE"` - InsecureSkipVerify bool `json:"insecureSkipVerify" yaml:"insecureSkipVerify" env:"INSECURE_SKIP_VERIFY"` - AutoSetup bool `json:"autoSetup" yaml:"autoSetup" env:"AUTO_SETUP"` - InterfaceName string `json:"interfaceName,omitempty" yaml:"interfaceName,omitempty" env:"INTERFACE_NAME"` + URL string `json:"url" yaml:"url" env:"URL"` + WebURL string `json:"webURL" yaml:"webURL" env:"WEB_URL"` + APIPath string `json:"apiPath,omitempty" yaml:"apiPath,omitempty" env:"API_PATH"` + Username string `json:"username,omitempty" yaml:"username,omitempty" env:"USERNAME"` + Password string `json:"password,omitempty" yaml:"password,omitempty" env:"PASSWORD"` + Cookie string `json:"cookie,omitempty" yaml:"cookie,omitempty" env:"COOKIE"` + InsecureSkipVerify bool `json:"insecureSkipVerify" yaml:"insecureSkipVerify" env:"INSECURE_SKIP_VERIFY"` + AutoSetup bool `json:"autoSetup" yaml:"autoSetup" env:"AUTO_SETUP"` + InterfaceName string `json:"interfaceName,omitempty" yaml:"interfaceName,omitempty" env:"INTERFACE_NAME"` DHCPServerEnabled *bool `json:"dhcpServerEnabled,omitempty" yaml:"dhcpServerEnabled,omitempty" env:"DHCP_SERVER_ENABLED"` Host string `json:"-" yaml:"-"`