Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3226690d70 | ||
|
|
4d235491f2 | ||
|
|
96b7890404 | ||
|
|
760cc01217 | ||
|
|
c394a05fc1 | ||
|
|
11ab4483e0 | ||
|
|
65747a7f28 | ||
|
|
ca9ddc4222 | ||
|
|
6a2237b513 | ||
|
|
4afccfad8d | ||
|
|
9a32a1d638 | ||
|
|
e091914a06 | ||
|
|
7b584668ac | ||
|
|
30019327da | ||
|
|
fc8eeeaf0a | ||
|
|
11201881c0 | ||
|
|
498dcb8bcb | ||
|
|
5564239bea | ||
|
|
5319c5f53f | ||
|
|
49b9e1ce1f | ||
|
|
82a61aef09 | ||
|
|
3c58a8f091 | ||
|
|
4a62b80e75 | ||
|
|
52c1687d83 | ||
|
|
238a0f46e0 |
6
.github/workflows/e2e.yaml
vendored
6
.github/workflows/e2e.yaml
vendored
@@ -15,7 +15,9 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
build:
|
build:
|
||||||
- mode: env
|
- mode: env
|
||||||
|
protocol: https
|
||||||
- mode: file
|
- mode: file
|
||||||
|
protocol: http
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -32,7 +34,7 @@ jobs:
|
|||||||
- name: Install Helm Chart
|
- name: Install Helm Chart
|
||||||
run: ./testdata/e2e/bin/install-chart.sh ${{ matrix.build.mode }}
|
run: ./testdata/e2e/bin/install-chart.sh ${{ matrix.build.mode }}
|
||||||
- name: Wait for sync to finish
|
- name: Wait for sync to finish
|
||||||
run: ./testdata/e2e/bin/wait-for-sync.sh
|
run: ./testdata/e2e/bin/wait-for-sync.sh ${{ matrix.build.protocol }}
|
||||||
- name: Show origin Logs
|
- name: Show origin Logs
|
||||||
run: ./testdata/e2e/bin/show-origin-logs.sh
|
run: ./testdata/e2e/bin/show-origin-logs.sh
|
||||||
- name: Show Replica Logs
|
- name: Show Replica Logs
|
||||||
@@ -40,6 +42,6 @@ jobs:
|
|||||||
- name: Show Sync Logs
|
- name: Show Sync Logs
|
||||||
run: ./testdata/e2e/bin/show-sync-logs.sh
|
run: ./testdata/e2e/bin/show-sync-logs.sh
|
||||||
- name: Show Sync Metrics
|
- name: Show Sync Metrics
|
||||||
run: ./testdata/e2e/bin/show-sync-metrics.sh
|
run: ./testdata/e2e/bin/show-sync-metrics.sh ${{ matrix.build.protocol }}
|
||||||
- name: Read latest replica config
|
- name: Read latest replica config
|
||||||
run: ./testdata/e2e/bin/read-latest-replica-config.sh
|
run: ./testdata/e2e/bin/read-latest-replica-config.sh
|
||||||
|
|||||||
2
.github/workflows/go.yml
vendored
2
.github/workflows/go.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
go-version-file: "go.mod"
|
go-version-file: "go.mod"
|
||||||
|
|
||||||
- name: golangci-lint
|
- name: golangci-lint
|
||||||
uses: golangci/golangci-lint-action@v4
|
uses: golangci/golangci-lint-action@v6
|
||||||
with:
|
with:
|
||||||
skip-pkg-cache: true
|
skip-pkg-cache: true
|
||||||
|
|
||||||
|
|||||||
38
Makefile
38
Makefile
@@ -9,7 +9,7 @@ tidy:
|
|||||||
generate: deepcopy-gen
|
generate: deepcopy-gen
|
||||||
@mkdir -p ./tmp
|
@mkdir -p ./tmp
|
||||||
@touch ./tmp/deepcopy-gen-boilerplate.go.txt
|
@touch ./tmp/deepcopy-gen-boilerplate.go.txt
|
||||||
$(DEEPCOPY_GEN) -h ./tmp/deepcopy-gen-boilerplate.go.txt -i ./pkg/types
|
$(DEEPCOPY_GEN) --go-header-file ./tmp/deepcopy-gen-boilerplate.go.txt --bounding-dirs ./pkg/types
|
||||||
|
|
||||||
# Run tests
|
# Run tests
|
||||||
test: generate lint test-ci
|
test: generate lint test-ci
|
||||||
@@ -49,35 +49,44 @@ MOCKGEN ?= $(LOCALBIN)/mockgen
|
|||||||
OAPI_CODEGEN ?= $(LOCALBIN)/oapi-codegen
|
OAPI_CODEGEN ?= $(LOCALBIN)/oapi-codegen
|
||||||
SEMVER ?= $(LOCALBIN)/semver
|
SEMVER ?= $(LOCALBIN)/semver
|
||||||
|
|
||||||
|
## Tool Versions
|
||||||
|
DEEPCOPY_GEN_VERSION ?= v0.30.1
|
||||||
|
GINKGO_VERSION ?= v2.19.0
|
||||||
|
GOLANGCI_LINT_VERSION ?= v1.58.2
|
||||||
|
GORELEASER_VERSION ?= v1.26.2
|
||||||
|
MOCKGEN_VERSION ?= v0.4.0
|
||||||
|
OAPI_CODEGEN_VERSION ?= v2.1.0
|
||||||
|
SEMVER_VERSION ?= v1.1.3
|
||||||
|
|
||||||
## Tool Installer
|
## Tool Installer
|
||||||
.PHONY: deepcopy-gen
|
.PHONY: deepcopy-gen
|
||||||
deepcopy-gen: $(DEEPCOPY_GEN) ## Download deepcopy-gen locally if necessary.
|
deepcopy-gen: $(DEEPCOPY_GEN) ## Download deepcopy-gen locally if necessary.
|
||||||
$(DEEPCOPY_GEN): $(LOCALBIN)
|
$(DEEPCOPY_GEN): $(LOCALBIN)
|
||||||
test -s $(LOCALBIN)/deepcopy-gen || GOBIN=$(LOCALBIN) go install k8s.io/code-generator/cmd/deepcopy-gen
|
test -s $(LOCALBIN)/deepcopy-gen || GOBIN=$(LOCALBIN) go install k8s.io/code-generator/cmd/deepcopy-gen@$(DEEPCOPY_GEN_VERSION)
|
||||||
.PHONY: ginkgo
|
.PHONY: ginkgo
|
||||||
ginkgo: $(GINKGO) ## Download ginkgo locally if necessary.
|
ginkgo: $(GINKGO) ## Download ginkgo locally if necessary.
|
||||||
$(GINKGO): $(LOCALBIN)
|
$(GINKGO): $(LOCALBIN)
|
||||||
test -s $(LOCALBIN)/ginkgo || GOBIN=$(LOCALBIN) go install github.com/onsi/ginkgo/v2/ginkgo
|
test -s $(LOCALBIN)/ginkgo || GOBIN=$(LOCALBIN) go install github.com/onsi/ginkgo/v2/ginkgo@$(GINKGO_VERSION)
|
||||||
.PHONY: golangci-lint
|
.PHONY: golangci-lint
|
||||||
golangci-lint: $(GOLANGCI_LINT) ## Download golangci-lint locally if necessary.
|
golangci-lint: $(GOLANGCI_LINT) ## Download golangci-lint locally if necessary.
|
||||||
$(GOLANGCI_LINT): $(LOCALBIN)
|
$(GOLANGCI_LINT): $(LOCALBIN)
|
||||||
test -s $(LOCALBIN)/golangci-lint || GOBIN=$(LOCALBIN) go install github.com/golangci/golangci-lint/cmd/golangci-lint
|
test -s $(LOCALBIN)/golangci-lint || GOBIN=$(LOCALBIN) go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION)
|
||||||
.PHONY: goreleaser
|
.PHONY: goreleaser
|
||||||
goreleaser: $(GORELEASER) ## Download goreleaser locally if necessary.
|
goreleaser: $(GORELEASER) ## Download goreleaser locally if necessary.
|
||||||
$(GORELEASER): $(LOCALBIN)
|
$(GORELEASER): $(LOCALBIN)
|
||||||
test -s $(LOCALBIN)/goreleaser || GOBIN=$(LOCALBIN) go install github.com/goreleaser/goreleaser
|
test -s $(LOCALBIN)/goreleaser || GOBIN=$(LOCALBIN) go install github.com/goreleaser/goreleaser@$(GORELEASER_VERSION)
|
||||||
.PHONY: mockgen
|
.PHONY: mockgen
|
||||||
mockgen: $(MOCKGEN) ## Download mockgen locally if necessary.
|
mockgen: $(MOCKGEN) ## Download mockgen locally if necessary.
|
||||||
$(MOCKGEN): $(LOCALBIN)
|
$(MOCKGEN): $(LOCALBIN)
|
||||||
test -s $(LOCALBIN)/mockgen || GOBIN=$(LOCALBIN) go install go.uber.org/mock/mockgen
|
test -s $(LOCALBIN)/mockgen || GOBIN=$(LOCALBIN) go install go.uber.org/mock/mockgen@$(MOCKGEN_VERSION)
|
||||||
.PHONY: oapi-codegen
|
.PHONY: oapi-codegen
|
||||||
oapi-codegen: $(OAPI_CODEGEN) ## Download oapi-codegen locally if necessary.
|
oapi-codegen: $(OAPI_CODEGEN) ## Download oapi-codegen locally if necessary.
|
||||||
$(OAPI_CODEGEN): $(LOCALBIN)
|
$(OAPI_CODEGEN): $(LOCALBIN)
|
||||||
test -s $(LOCALBIN)/oapi-codegen || GOBIN=$(LOCALBIN) go install github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen
|
test -s $(LOCALBIN)/oapi-codegen || GOBIN=$(LOCALBIN) go install github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@$(OAPI_CODEGEN_VERSION)
|
||||||
.PHONY: semver
|
.PHONY: semver
|
||||||
semver: $(SEMVER) ## Download semver locally if necessary.
|
semver: $(SEMVER) ## Download semver locally if necessary.
|
||||||
$(SEMVER): $(LOCALBIN)
|
$(SEMVER): $(LOCALBIN)
|
||||||
test -s $(LOCALBIN)/semver || GOBIN=$(LOCALBIN) go install github.com/bakito/semver
|
test -s $(LOCALBIN)/semver || GOBIN=$(LOCALBIN) go install github.com/bakito/semver@$(SEMVER_VERSION)
|
||||||
|
|
||||||
## Update Tools
|
## Update Tools
|
||||||
.PHONY: update-toolbox-tools
|
.PHONY: update-toolbox-tools
|
||||||
@@ -90,7 +99,14 @@ update-toolbox-tools:
|
|||||||
$(LOCALBIN)/mockgen \
|
$(LOCALBIN)/mockgen \
|
||||||
$(LOCALBIN)/oapi-codegen \
|
$(LOCALBIN)/oapi-codegen \
|
||||||
$(LOCALBIN)/semver
|
$(LOCALBIN)/semver
|
||||||
toolbox makefile -f $(LOCALDIR)/Makefile
|
toolbox makefile -f $(LOCALDIR)/Makefile \
|
||||||
|
k8s.io/code-generator/cmd/deepcopy-gen@github.com/kubernetes/code-generator \
|
||||||
|
github.com/onsi/ginkgo/v2/ginkgo \
|
||||||
|
github.com/golangci/golangci-lint/cmd/golangci-lint \
|
||||||
|
github.com/goreleaser/goreleaser \
|
||||||
|
go.uber.org/mock/mockgen@github.com/uber-go/mock \
|
||||||
|
github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen \
|
||||||
|
github.com/bakito/semver
|
||||||
## toolbox - end
|
## toolbox - end
|
||||||
|
|
||||||
start-replica:
|
start-replica:
|
||||||
@@ -124,10 +140,10 @@ kind-test:
|
|||||||
|
|
||||||
model: oapi-codegen
|
model: oapi-codegen
|
||||||
@mkdir -p tmp
|
@mkdir -p tmp
|
||||||
go run openapi/main.go v0.107.46
|
go run openapi/main.go v0.107.50
|
||||||
$(OAPI_CODEGEN) -package model -generate types,client -config .oapi-codegen.yaml tmp/schema.yaml > pkg/client/model/model_generated.go
|
$(OAPI_CODEGEN) -package model -generate types,client -config .oapi-codegen.yaml tmp/schema.yaml > pkg/client/model/model_generated.go
|
||||||
|
|
||||||
model-diff:
|
model-diff:
|
||||||
go run openapi/main.go v0.107.46
|
go run openapi/main.go v0.107.50
|
||||||
go run openapi/main.go
|
go run openapi/main.go
|
||||||
diff tmp/schema.yaml tmp/schema-master.yaml
|
diff tmp/schema.yaml tmp/schema-master.yaml
|
||||||
|
|||||||
23
README.md
23
README.md
@@ -71,7 +71,7 @@ export REPLICA1_PASSWORD=password
|
|||||||
adguardhome-sync run
|
adguardhome-sync run
|
||||||
|
|
||||||
# run as daemon
|
# run as daemon
|
||||||
adguardhome-sync run --cron "*/10 * * * *"
|
adguardhome-sync run --cron "0 */2 * * *"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Run Windows
|
## Run Windows
|
||||||
@@ -103,7 +103,7 @@ set FEATURES_DHCP_STATICLEASES=false
|
|||||||
adguardhome-sync run
|
adguardhome-sync run
|
||||||
|
|
||||||
# run as daemon
|
# run as daemon
|
||||||
adguardhome-sync run --cron "*/10 * * * *"
|
adguardhome-sync run --cron "0 */2 * * *"
|
||||||
```
|
```
|
||||||
|
|
||||||
## docker cli
|
## docker cli
|
||||||
@@ -164,7 +164,7 @@ services:
|
|||||||
# REPLICA2_AUTO_SETUP: true # if true, AdGuardHome is automatically initialized.
|
# REPLICA2_AUTO_SETUP: true # if true, AdGuardHome is automatically initialized.
|
||||||
# REPLICA2_INTERFACE_NAME: 'ens18' # use custom dhcp interface name
|
# REPLICA2_INTERFACE_NAME: 'ens18' # use custom dhcp interface name
|
||||||
# REPLICA2_DHCP_SERVER_ENABLED: true/false (optional) enables/disables the dhcp server on the replica
|
# REPLICA2_DHCP_SERVER_ENABLED: true/false (optional) enables/disables the dhcp server on the replica
|
||||||
CRON: "*/10 * * * *" # run every 10 minutes
|
CRON: "0 */2 * * *" # run every 10 minutes
|
||||||
RUNONSTART: true
|
RUNONSTART: true
|
||||||
# CONTINUE_ON_ERROR: false # If enabled, the synchronisation task will not fail on single errors, but will log the errors and continue
|
# CONTINUE_ON_ERROR: false # If enabled, the synchronisation task will not fail on single errors, but will log the errors and continue
|
||||||
|
|
||||||
@@ -173,6 +173,12 @@ services:
|
|||||||
# API_DARK_MODE: true
|
# API_DARK_MODE: true
|
||||||
# API_USERNAME: admin
|
# API_USERNAME: admin
|
||||||
# API_PASSWORD: secret
|
# API_PASSWORD: secret
|
||||||
|
# the directory of the provided tls certs
|
||||||
|
# API_TLS_CERT_DIR: /path/to/certs
|
||||||
|
# the name of the cert file (default: tls.crt)
|
||||||
|
# API_TLS_CERT_NAME: foo.crt
|
||||||
|
# the name of the key file (default: tls.key)
|
||||||
|
# API_TLS_KEY_NAME: bar.key
|
||||||
|
|
||||||
# Configure sync features; by default all features are enabled.
|
# Configure sync features; by default all features are enabled.
|
||||||
# FEATURES_GENERAL_SETTINGS: true
|
# FEATURES_GENERAL_SETTINGS: true
|
||||||
@@ -197,7 +203,7 @@ location: $HOME/.adguardhome-sync.yaml
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# cron expression to run in daemon mode. (default; "" = runs only once)
|
# cron expression to run in daemon mode. (default; "" = runs only once)
|
||||||
cron: "*/10 * * * *"
|
cron: "0 */2 * * *"
|
||||||
|
|
||||||
# runs the synchronisation on startup
|
# runs the synchronisation on startup
|
||||||
runOnStart: true
|
runOnStart: true
|
||||||
@@ -244,6 +250,15 @@ api:
|
|||||||
# scrapeInterval: 30s
|
# scrapeInterval: 30s
|
||||||
# queryLogLimit: 10000
|
# queryLogLimit: 10000
|
||||||
|
|
||||||
|
# enable tls for the api server
|
||||||
|
# tls:
|
||||||
|
# # the directory of the provided tls certs
|
||||||
|
# certDir: /path/to/certs
|
||||||
|
# # the name of the cert file (default: tls.crt)
|
||||||
|
# certName: foo.crt
|
||||||
|
# # the name of the key file (default: tls.key)
|
||||||
|
# keyName: bar.key
|
||||||
|
|
||||||
# Configure sync features; by default all features are enabled.
|
# Configure sync features; by default all features are enabled.
|
||||||
features:
|
features:
|
||||||
generalSettings: true
|
generalSettings: true
|
||||||
|
|||||||
417
go.mod
417
go.mod
@@ -1,438 +1,79 @@
|
|||||||
module github.com/bakito/adguardhome-sync
|
module github.com/bakito/adguardhome-sync
|
||||||
|
|
||||||
go 1.22
|
go 1.22.0
|
||||||
|
|
||||||
|
toolchain go1.22.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/bakito/semver v1.1.3
|
|
||||||
github.com/caarlos0/env/v10 v10.0.0
|
github.com/caarlos0/env/v10 v10.0.0
|
||||||
github.com/deepmap/oapi-codegen/v2 v2.1.0
|
github.com/gin-gonic/gin v1.10.0
|
||||||
github.com/gin-gonic/gin v1.9.1
|
github.com/go-resty/resty/v2 v2.13.1
|
||||||
github.com/go-resty/resty/v2 v2.12.0
|
|
||||||
github.com/golangci/golangci-lint v1.56.2
|
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/goreleaser/goreleaser v1.24.0
|
|
||||||
github.com/jinzhu/copier v0.4.0
|
github.com/jinzhu/copier v0.4.0
|
||||||
github.com/oapi-codegen/runtime v1.1.1
|
github.com/oapi-codegen/runtime v1.1.1
|
||||||
github.com/onsi/ginkgo/v2 v2.16.0
|
github.com/onsi/ginkgo/v2 v2.17.3
|
||||||
github.com/onsi/gomega v1.31.1
|
github.com/onsi/gomega v1.33.1
|
||||||
github.com/prometheus/client_golang v1.19.0
|
github.com/prometheus/client_golang v1.19.1
|
||||||
github.com/robfig/cron/v3 v3.0.1
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
github.com/spf13/cobra v1.8.0
|
github.com/spf13/cobra v1.8.0
|
||||||
go.uber.org/mock v0.4.0
|
go.uber.org/mock v0.4.0
|
||||||
go.uber.org/zap v1.27.0
|
go.uber.org/zap v1.27.0
|
||||||
golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc
|
golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc
|
||||||
golang.org/x/mod v0.16.0
|
golang.org/x/mod v0.17.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
k8s.io/apimachinery v0.29.3
|
k8s.io/apimachinery v0.30.1
|
||||||
k8s.io/code-generator v0.29.3
|
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
4d63.com/gocheckcompilerdirectives v1.2.1 // indirect
|
|
||||||
4d63.com/gochecknoglobals v0.2.1 // indirect
|
|
||||||
cloud.google.com/go v0.110.10 // indirect
|
|
||||||
cloud.google.com/go/compute v1.23.3 // indirect
|
|
||||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
|
||||||
cloud.google.com/go/iam v1.1.5 // indirect
|
|
||||||
cloud.google.com/go/kms v1.15.5 // indirect
|
|
||||||
cloud.google.com/go/storage v1.35.1 // indirect
|
|
||||||
code.gitea.io/sdk/gitea v0.17.1 // indirect
|
|
||||||
dario.cat/mergo v1.0.0 // indirect
|
|
||||||
github.com/4meepo/tagalign v1.3.3 // indirect
|
|
||||||
github.com/Abirdcfly/dupword v0.0.13 // indirect
|
|
||||||
github.com/AlekSi/pointer v1.2.0 // indirect
|
|
||||||
github.com/Antonboom/errname v0.1.12 // indirect
|
|
||||||
github.com/Antonboom/nilnil v0.1.7 // indirect
|
|
||||||
github.com/Antonboom/testifylint v1.1.2 // indirect
|
|
||||||
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 // indirect
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 // indirect
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 // indirect
|
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 // indirect
|
|
||||||
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
|
||||||
github.com/Azure/go-autorest/autorest v0.11.29 // indirect
|
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect
|
|
||||||
github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect
|
|
||||||
github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect
|
|
||||||
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
|
|
||||||
github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect
|
|
||||||
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect
|
|
||||||
github.com/BurntSushi/toml v1.3.2 // indirect
|
|
||||||
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
|
|
||||||
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0 // indirect
|
|
||||||
github.com/Masterminds/goutils v1.1.1 // indirect
|
|
||||||
github.com/Masterminds/semver v1.5.0 // indirect
|
|
||||||
github.com/Masterminds/semver/v3 v3.2.1 // indirect
|
|
||||||
github.com/Masterminds/sprig/v3 v3.2.3 // indirect
|
|
||||||
github.com/Microsoft/go-winio v0.6.1 // indirect
|
|
||||||
github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect
|
|
||||||
github.com/ProtonMail/go-crypto v1.0.0 // indirect
|
|
||||||
github.com/alecthomas/go-check-sumtype v0.1.4 // indirect
|
|
||||||
github.com/alessio/shellescape v1.4.1 // indirect
|
|
||||||
github.com/alexkohler/nakedret/v2 v2.0.2 // indirect
|
|
||||||
github.com/alexkohler/prealloc v1.0.0 // indirect
|
|
||||||
github.com/alingse/asasalint v0.0.11 // indirect
|
|
||||||
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
|
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
|
||||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
|
||||||
github.com/ashanbrown/forbidigo v1.6.0 // indirect
|
|
||||||
github.com/ashanbrown/makezero v1.1.1 // indirect
|
|
||||||
github.com/atc0005/go-teams-notify/v2 v2.9.0 // indirect
|
|
||||||
github.com/aws/aws-sdk-go v1.50.10 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2 v1.24.0 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.26.1 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.16.12 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.7 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/ecr v1.20.2 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/kms v1.27.5 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 // indirect
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.26.5 // indirect
|
|
||||||
github.com/aws/smithy-go v1.19.0 // indirect
|
|
||||||
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect
|
|
||||||
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
|
||||||
github.com/bahlo/generic-list-go v0.2.0 // indirect
|
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/bkielbasa/cyclop v1.2.1 // indirect
|
github.com/bytedance/sonic v1.11.6 // indirect
|
||||||
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb // indirect
|
github.com/bytedance/sonic/loader v0.1.1 // indirect
|
||||||
github.com/blizzy78/varnamelen v0.8.0 // indirect
|
|
||||||
github.com/bombsimon/wsl/v4 v4.2.1 // indirect
|
|
||||||
github.com/breml/bidichk v0.2.7 // indirect
|
|
||||||
github.com/breml/errchkjson v0.3.6 // indirect
|
|
||||||
github.com/buger/jsonparser v1.1.1 // indirect
|
|
||||||
github.com/butuzov/ireturn v0.3.0 // indirect
|
|
||||||
github.com/butuzov/mirror v1.1.0 // indirect
|
|
||||||
github.com/bytedance/sonic v1.10.2 // indirect
|
|
||||||
github.com/caarlos0/ctrlc v1.2.0 // indirect
|
|
||||||
github.com/caarlos0/env/v9 v9.0.0 // indirect
|
|
||||||
github.com/caarlos0/go-reddit/v3 v3.0.1 // indirect
|
|
||||||
github.com/caarlos0/go-shellwords v1.0.12 // indirect
|
|
||||||
github.com/caarlos0/go-version v0.1.1 // indirect
|
|
||||||
github.com/caarlos0/log v0.4.4 // indirect
|
|
||||||
github.com/catenacyber/perfsprint v0.6.0 // indirect
|
|
||||||
github.com/cavaliergopher/cpio v1.0.1 // indirect
|
|
||||||
github.com/ccojocar/zxcvbn-go v1.0.2 // indirect
|
|
||||||
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||||
github.com/charithe/durationcheck v0.0.10 // indirect
|
github.com/cloudwego/base64x v0.1.4 // indirect
|
||||||
github.com/charmbracelet/lipgloss v0.9.1 // indirect
|
github.com/cloudwego/iasm v0.2.0 // indirect
|
||||||
github.com/charmbracelet/x/exp/ordered v0.0.0-20231010190216-1cb11efc897d // indirect
|
|
||||||
github.com/chavacava/garif v0.1.0 // indirect
|
|
||||||
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
|
|
||||||
github.com/chenzhuoyu/iasm v0.9.1 // indirect
|
|
||||||
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect
|
|
||||||
github.com/cloudflare/circl v1.3.7 // indirect
|
|
||||||
github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect
|
|
||||||
github.com/coreos/go-semver v0.3.0 // indirect
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
|
|
||||||
github.com/curioswitch/go-reassign v0.2.0 // indirect
|
|
||||||
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
|
|
||||||
github.com/daixiang0/gci v0.12.1 // indirect
|
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/davidmz/go-pageant v1.0.2 // indirect
|
|
||||||
github.com/denis-tingaikin/go-header v0.4.3 // indirect
|
|
||||||
github.com/dghubble/go-twitter v0.0.0-20211115160449-93a8679adecb // indirect
|
|
||||||
github.com/dghubble/oauth1 v0.7.2 // indirect
|
|
||||||
github.com/dghubble/sling v1.4.0 // indirect
|
|
||||||
github.com/dimchansky/utfbom v1.1.1 // indirect
|
|
||||||
github.com/distribution/reference v0.5.0 // indirect
|
|
||||||
github.com/docker/cli v24.0.7+incompatible // indirect
|
|
||||||
github.com/docker/distribution v2.8.3+incompatible // indirect
|
|
||||||
github.com/docker/docker v24.0.9+incompatible // indirect
|
|
||||||
github.com/docker/docker-credential-helpers v0.8.0 // indirect
|
|
||||||
github.com/docker/go-connections v0.4.0 // indirect
|
|
||||||
github.com/docker/go-units v0.5.0 // indirect
|
|
||||||
github.com/elliotchance/orderedmap/v2 v2.2.0 // indirect
|
|
||||||
github.com/emirpasic/gods v1.18.1 // indirect
|
|
||||||
github.com/esimonov/ifshort v1.0.4 // indirect
|
|
||||||
github.com/ettle/strcase v0.2.0 // indirect
|
|
||||||
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
|
|
||||||
github.com/fatih/color v1.16.0 // indirect
|
|
||||||
github.com/fatih/structtag v1.2.0 // indirect
|
|
||||||
github.com/firefart/nonamedreturns v1.0.4 // indirect
|
|
||||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
|
||||||
github.com/fzipp/gocyclo v0.6.0 // indirect
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
|
||||||
github.com/getkin/kin-openapi v0.122.0 // indirect
|
|
||||||
github.com/ghostiam/protogetter v0.3.4 // indirect
|
|
||||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||||
github.com/go-critic/go-critic v0.11.1 // indirect
|
|
||||||
github.com/go-fed/httpsig v1.1.0 // indirect
|
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
|
||||||
github.com/go-git/go-billy/v5 v5.5.0 // indirect
|
|
||||||
github.com/go-git/go-git/v5 v5.11.0 // indirect
|
|
||||||
github.com/go-logr/logr v1.4.1 // indirect
|
github.com/go-logr/logr v1.4.1 // indirect
|
||||||
github.com/go-openapi/analysis v0.21.4 // indirect
|
|
||||||
github.com/go-openapi/errors v0.20.4 // indirect
|
|
||||||
github.com/go-openapi/jsonpointer v0.20.0 // indirect
|
|
||||||
github.com/go-openapi/jsonreference v0.20.2 // indirect
|
|
||||||
github.com/go-openapi/loads v0.21.2 // indirect
|
|
||||||
github.com/go-openapi/runtime v0.26.0 // indirect
|
|
||||||
github.com/go-openapi/spec v0.20.9 // indirect
|
|
||||||
github.com/go-openapi/strfmt v0.21.7 // indirect
|
|
||||||
github.com/go-openapi/swag v0.22.4 // indirect
|
|
||||||
github.com/go-openapi/validate v0.22.1 // indirect
|
|
||||||
github.com/go-playground/locales v0.14.1 // indirect
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.16.0 // indirect
|
github.com/go-playground/validator/v10 v10.20.0 // indirect
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect
|
|
||||||
github.com/go-toolsmith/astcast v1.1.0 // indirect
|
|
||||||
github.com/go-toolsmith/astcopy v1.1.0 // indirect
|
|
||||||
github.com/go-toolsmith/astequal v1.2.0 // indirect
|
|
||||||
github.com/go-toolsmith/astfmt v1.1.0 // indirect
|
|
||||||
github.com/go-toolsmith/astp v1.1.0 // indirect
|
|
||||||
github.com/go-toolsmith/strparse v1.1.0 // indirect
|
|
||||||
github.com/go-toolsmith/typep v1.1.0 // indirect
|
|
||||||
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect
|
|
||||||
github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect
|
|
||||||
github.com/gobwas/glob v0.2.3 // indirect
|
|
||||||
github.com/goccy/go-json v0.10.2 // indirect
|
github.com/goccy/go-json v0.10.2 // indirect
|
||||||
github.com/gofrs/flock v0.8.1 // indirect
|
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
|
||||||
github.com/golang-jwt/jwt/v5 v5.1.0 // indirect
|
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
|
||||||
github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect
|
|
||||||
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect
|
|
||||||
github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect
|
|
||||||
github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e // indirect
|
|
||||||
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect
|
|
||||||
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect
|
|
||||||
github.com/golangci/misspell v0.4.1 // indirect
|
|
||||||
github.com/golangci/revgrep v0.5.2 // indirect
|
|
||||||
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect
|
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
github.com/google/go-cmp v0.6.0 // indirect
|
||||||
github.com/google/go-containerregistry v0.19.0 // indirect
|
|
||||||
github.com/google/go-github/v57 v57.0.0 // indirect
|
|
||||||
github.com/google/go-querystring v1.1.0 // indirect
|
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
github.com/google/ko v0.15.1 // indirect
|
github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect
|
||||||
github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b // indirect
|
|
||||||
github.com/google/rpmpack v0.5.0 // indirect
|
|
||||||
github.com/google/s2a-go v0.1.7 // indirect
|
|
||||||
github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 // indirect
|
|
||||||
github.com/google/wire v0.5.0 // indirect
|
|
||||||
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
|
|
||||||
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
|
|
||||||
github.com/gordonklaus/ineffassign v0.1.0 // indirect
|
|
||||||
github.com/goreleaser/chglog v0.5.0 // indirect
|
|
||||||
github.com/goreleaser/fileglob v1.3.0 // indirect
|
|
||||||
github.com/goreleaser/nfpm/v2 v2.35.3 // indirect
|
|
||||||
github.com/gorilla/websocket v1.5.1 // indirect
|
|
||||||
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
|
|
||||||
github.com/gostaticanalysis/comment v1.4.2 // indirect
|
|
||||||
github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect
|
|
||||||
github.com/gostaticanalysis/nilerr v0.1.1 // indirect
|
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
|
||||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
|
||||||
github.com/hashicorp/go-retryablehttp v0.7.4 // indirect
|
|
||||||
github.com/hashicorp/go-version v1.6.0 // indirect
|
|
||||||
github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
|
|
||||||
github.com/hexops/gotextdiff v1.0.3 // indirect
|
|
||||||
github.com/huandu/xstrings v1.3.3 // indirect
|
|
||||||
github.com/imdario/mergo v0.3.16 // indirect
|
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/invopop/jsonschema v0.12.0 // indirect
|
|
||||||
github.com/invopop/yaml v0.2.0 // indirect
|
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
|
||||||
github.com/jgautheron/goconst v1.7.0 // indirect
|
|
||||||
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
|
|
||||||
github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect
|
|
||||||
github.com/jjti/go-spancheck v0.5.2 // indirect
|
|
||||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/julz/importas v0.1.0 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
|
||||||
github.com/kevinburke/ssh_config v1.2.0 // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
github.com/kisielk/errcheck v1.7.0 // indirect
|
|
||||||
github.com/kisielk/gotool v1.0.0 // indirect
|
|
||||||
github.com/kkHAIKE/contextcheck v1.1.4 // indirect
|
|
||||||
github.com/klauspost/compress v1.17.5 // indirect
|
|
||||||
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
|
|
||||||
github.com/klauspost/pgzip v1.2.6 // indirect
|
|
||||||
github.com/kulti/thelper v0.6.3 // indirect
|
|
||||||
github.com/kunwardeep/paralleltest v1.0.9 // indirect
|
|
||||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
|
||||||
github.com/kyoh86/exportloopref v0.1.11 // indirect
|
|
||||||
github.com/ldez/gomoddirectives v0.2.3 // indirect
|
|
||||||
github.com/ldez/tagliatelle v0.5.0 // indirect
|
|
||||||
github.com/leodido/go-urn v1.2.4 // indirect
|
|
||||||
github.com/leonklingele/grouper v1.1.1 // indirect
|
|
||||||
github.com/letsencrypt/boulder v0.0.0-20231026200631-000cd05d5491 // indirect
|
|
||||||
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
|
||||||
github.com/lufeee/execinquery v1.2.1 // indirect
|
|
||||||
github.com/macabu/inamedparam v0.1.3 // indirect
|
|
||||||
github.com/magiconair/properties v1.8.7 // indirect
|
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
|
||||||
github.com/maratori/testableexamples v1.0.0 // indirect
|
|
||||||
github.com/maratori/testpackage v1.1.1 // indirect
|
|
||||||
github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect
|
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-mastodon v0.0.6 // indirect
|
|
||||||
github.com/mattn/go-runewidth v0.0.15 // indirect
|
|
||||||
github.com/mbilski/exhaustivestruct v1.2.0 // indirect
|
|
||||||
github.com/mgechev/revive v1.3.7 // indirect
|
|
||||||
github.com/mitchellh/copystructure v1.2.0 // indirect
|
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
|
||||||
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||||
github.com/moricho/tparallel v0.3.1 // indirect
|
|
||||||
github.com/muesli/mango v0.1.0 // indirect
|
|
||||||
github.com/muesli/mango-cobra v1.2.0 // indirect
|
|
||||||
github.com/muesli/mango-pflag v0.1.0 // indirect
|
|
||||||
github.com/muesli/reflow v0.3.0 // indirect
|
|
||||||
github.com/muesli/roff v0.1.0 // indirect
|
|
||||||
github.com/muesli/termenv v0.15.2 // indirect
|
|
||||||
github.com/nakabonne/nestif v0.3.1 // indirect
|
|
||||||
github.com/nishanths/exhaustive v0.12.0 // indirect
|
|
||||||
github.com/nishanths/predeclared v0.2.2 // indirect
|
|
||||||
github.com/nunnatsa/ginkgolinter v0.15.2 // indirect
|
|
||||||
github.com/oklog/ulid v1.3.1 // indirect
|
|
||||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
|
||||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
|
||||||
github.com/opencontainers/image-spec v1.1.0-rc5 // indirect
|
|
||||||
github.com/pelletier/go-toml v1.9.5 // indirect
|
|
||||||
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
|
|
||||||
github.com/perimeterx/marshmallow v1.1.5 // indirect
|
|
||||||
github.com/pjbgf/sha1cd v0.3.0 // indirect
|
|
||||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
|
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/polyfloyd/go-errorlint v1.4.8 // indirect
|
|
||||||
github.com/prometheus/client_model v0.5.0 // indirect
|
github.com/prometheus/client_model v0.5.0 // indirect
|
||||||
github.com/prometheus/common v0.48.0 // indirect
|
github.com/prometheus/common v0.48.0 // indirect
|
||||||
github.com/prometheus/procfs v0.12.0 // indirect
|
github.com/prometheus/procfs v0.12.0 // indirect
|
||||||
github.com/quasilyte/go-ruleguard v0.4.0 // indirect
|
github.com/rogpeppe/go-internal v1.12.0 // indirect
|
||||||
github.com/quasilyte/gogrep v0.5.0 // indirect
|
|
||||||
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
|
|
||||||
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
|
|
||||||
github.com/rivo/uniseg v0.4.2 // indirect
|
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
|
||||||
github.com/ryancurrah/gomodguard v1.3.0 // indirect
|
|
||||||
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
|
|
||||||
github.com/sagikazarmark/locafero v0.3.0 // indirect
|
|
||||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
|
||||||
github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect
|
|
||||||
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
|
|
||||||
github.com/sashamelentyev/usestdlibvars v1.25.0 // indirect
|
|
||||||
github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect
|
|
||||||
github.com/securego/gosec/v2 v2.19.0 // indirect
|
|
||||||
github.com/sergi/go-diff v1.2.0 // indirect
|
|
||||||
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect
|
|
||||||
github.com/shopspring/decimal v1.2.0 // indirect
|
|
||||||
github.com/sigstore/cosign/v2 v2.2.1 // indirect
|
|
||||||
github.com/sigstore/rekor v1.3.3 // indirect
|
|
||||||
github.com/sigstore/sigstore v1.7.5 // indirect
|
|
||||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
|
||||||
github.com/sivchari/containedctx v1.0.3 // indirect
|
|
||||||
github.com/sivchari/nosnakecase v1.7.0 // indirect
|
|
||||||
github.com/sivchari/tenv v1.7.1 // indirect
|
|
||||||
github.com/skeema/knownhosts v1.2.1 // indirect
|
|
||||||
github.com/slack-go/slack v0.12.3 // indirect
|
|
||||||
github.com/sonatard/noctx v0.0.2 // indirect
|
|
||||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
|
||||||
github.com/sourcegraph/go-diff v0.7.0 // indirect
|
|
||||||
github.com/spf13/afero v1.11.0 // indirect
|
|
||||||
github.com/spf13/cast v1.5.1 // indirect
|
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/spf13/viper v1.17.0 // indirect
|
|
||||||
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
|
|
||||||
github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect
|
|
||||||
github.com/stretchr/objx v0.5.0 // indirect
|
|
||||||
github.com/stretchr/testify v1.8.4 // indirect
|
|
||||||
github.com/subosito/gotenv v1.6.0 // indirect
|
|
||||||
github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect
|
|
||||||
github.com/tdakkota/asciicheck v0.2.0 // indirect
|
|
||||||
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
|
|
||||||
github.com/tetafro/godot v1.4.16 // indirect
|
|
||||||
github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect
|
|
||||||
github.com/timonwong/loggercheck v0.9.4 // indirect
|
|
||||||
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect
|
|
||||||
github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect
|
|
||||||
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
|
|
||||||
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect
|
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||||
github.com/ugorji/go/codec v1.2.12 // indirect
|
github.com/ugorji/go/codec v1.2.12 // indirect
|
||||||
github.com/ulikunitz/xz v0.5.11 // indirect
|
|
||||||
github.com/ultraware/funlen v0.1.0 // indirect
|
|
||||||
github.com/ultraware/whitespace v0.1.0 // indirect
|
|
||||||
github.com/uudashr/gocognit v1.1.2 // indirect
|
|
||||||
github.com/vbatts/tar-split v0.11.5 // indirect
|
|
||||||
github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1 // indirect
|
|
||||||
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
|
|
||||||
github.com/xanzy/go-gitlab v0.97.0 // indirect
|
|
||||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
|
||||||
github.com/xen0n/gosmopolitan v1.2.2 // indirect
|
|
||||||
github.com/yagipy/maintidx v1.0.0 // indirect
|
|
||||||
github.com/yeya24/promlinter v0.2.0 // indirect
|
|
||||||
github.com/ykadowak/zerologlint v0.1.5 // indirect
|
|
||||||
gitlab.com/bosi/decorder v0.4.1 // indirect
|
|
||||||
gitlab.com/digitalxero/go-conventional-commit v1.0.7 // indirect
|
|
||||||
go-simpler.org/musttag v0.8.0 // indirect
|
|
||||||
go-simpler.org/sloglint v0.4.0 // indirect
|
|
||||||
go.mongodb.org/mongo-driver v1.12.1 // indirect
|
|
||||||
go.opencensus.io v0.24.0 // indirect
|
|
||||||
go.uber.org/automaxprocs v1.5.3 // indirect
|
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
gocloud.dev v0.36.0 // indirect
|
golang.org/x/arch v0.8.0 // indirect
|
||||||
golang.org/x/arch v0.7.0 // indirect
|
golang.org/x/crypto v0.23.0 // indirect
|
||||||
golang.org/x/crypto v0.21.0 // indirect
|
golang.org/x/net v0.25.0 // indirect
|
||||||
golang.org/x/exp/typeparams v0.0.0-20231219180239-dc181d75b848 // indirect
|
golang.org/x/sys v0.20.0 // indirect
|
||||||
golang.org/x/net v0.22.0 // indirect
|
golang.org/x/text v0.15.0 // indirect
|
||||||
golang.org/x/oauth2 v0.16.0 // indirect
|
golang.org/x/tools v0.20.0 // indirect
|
||||||
golang.org/x/sync v0.6.0 // indirect
|
google.golang.org/protobuf v1.34.1 // indirect
|
||||||
golang.org/x/sys v0.18.0 // indirect
|
|
||||||
golang.org/x/term v0.18.0 // indirect
|
|
||||||
golang.org/x/text v0.14.0 // indirect
|
|
||||||
golang.org/x/time v0.5.0 // indirect
|
|
||||||
golang.org/x/tools v0.18.0 // indirect
|
|
||||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
|
|
||||||
google.golang.org/api v0.152.0 // indirect
|
|
||||||
google.golang.org/appengine v1.6.8 // indirect
|
|
||||||
google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f // indirect
|
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect
|
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect
|
|
||||||
google.golang.org/grpc v1.59.0 // indirect
|
|
||||||
google.golang.org/protobuf v1.33.0 // indirect
|
|
||||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
|
||||||
gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect
|
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
|
||||||
gopkg.in/mail.v2 v2.3.1 // indirect
|
|
||||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
honnef.co/go/tools v0.4.6 // indirect
|
k8s.io/klog/v2 v2.120.1 // indirect
|
||||||
k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect
|
|
||||||
k8s.io/klog/v2 v2.110.1 // indirect
|
|
||||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
|
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
|
||||||
mvdan.cc/gofumpt v0.6.0 // indirect
|
|
||||||
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect
|
|
||||||
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect
|
|
||||||
mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14 // indirect
|
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||||
sigs.k8s.io/kind v0.20.0 // indirect
|
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
||||||
sigs.k8s.io/yaml v1.4.0 // indirect
|
sigs.k8s.io/yaml v1.4.0 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -109,18 +109,16 @@ type Client interface {
|
|||||||
SetSafeSearchConfig(settings *model.SafeSearchConfig) error
|
SetSafeSearchConfig(settings *model.SafeSearchConfig) error
|
||||||
ProfileInfo() (*model.ProfileInfo, error)
|
ProfileInfo() (*model.ProfileInfo, error)
|
||||||
SetProfileInfo(settings *model.ProfileInfo) error
|
SetProfileInfo(settings *model.ProfileInfo) error
|
||||||
BlockedServices() (*model.BlockedServicesArray, error)
|
|
||||||
BlockedServicesSchedule() (*model.BlockedServicesSchedule, error)
|
BlockedServicesSchedule() (*model.BlockedServicesSchedule, error)
|
||||||
SetBlockedServices(services *model.BlockedServicesArray) error
|
|
||||||
SetBlockedServicesSchedule(schedule *model.BlockedServicesSchedule) error
|
SetBlockedServicesSchedule(schedule *model.BlockedServicesSchedule) error
|
||||||
Clients() (*model.Clients, error)
|
Clients() (*model.Clients, error)
|
||||||
AddClient(client *model.Client) error
|
AddClient(client *model.Client) error
|
||||||
UpdateClient(client *model.Client) error
|
UpdateClient(client *model.Client) error
|
||||||
DeleteClient(client *model.Client) error
|
DeleteClient(client *model.Client) error
|
||||||
QueryLogConfig() (*model.QueryLogConfig, error)
|
QueryLogConfig() (*model.QueryLogConfigWithIgnored, error)
|
||||||
SetQueryLogConfig(*model.QueryLogConfig) error
|
SetQueryLogConfig(*model.QueryLogConfigWithIgnored) error
|
||||||
StatsConfig() (*model.StatsConfig, error)
|
StatsConfig() (*model.GetStatsConfigResponse, error)
|
||||||
SetStatsConfig(sc *model.StatsConfig) error
|
SetStatsConfig(sc *model.PutStatsConfigUpdateRequest) error
|
||||||
Setup() error
|
Setup() error
|
||||||
AccessList() (*model.AccessList, error)
|
AccessList() (*model.AccessList, error)
|
||||||
SetAccessList(*model.AccessList) error
|
SetAccessList(*model.AccessList) error
|
||||||
@@ -287,17 +285,6 @@ func (cl *client) ToggleFiltering(enabled bool, interval int) error {
|
|||||||
}), "/filtering/config")
|
}), "/filtering/config")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cl *client) BlockedServices() (*model.BlockedServicesArray, error) {
|
|
||||||
svcs := &model.BlockedServicesArray{}
|
|
||||||
err := cl.doGet(cl.client.R().EnableTrace().SetResult(svcs), "/blocked_services/list")
|
|
||||||
return svcs, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cl *client) SetBlockedServices(services *model.BlockedServicesArray) error {
|
|
||||||
cl.log.With("services", model.ArrayString(services)).Info("Set blocked services")
|
|
||||||
return cl.doPost(cl.client.R().EnableTrace().SetBody(services), "/blocked_services/set")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cl *client) BlockedServicesSchedule() (*model.BlockedServicesSchedule, error) {
|
func (cl *client) BlockedServicesSchedule() (*model.BlockedServicesSchedule, error) {
|
||||||
sched := &model.BlockedServicesSchedule{}
|
sched := &model.BlockedServicesSchedule{}
|
||||||
err := cl.doGet(cl.client.R().EnableTrace().SetResult(sched), "/blocked_services/get")
|
err := cl.doGet(cl.client.R().EnableTrace().SetResult(sched), "/blocked_services/get")
|
||||||
@@ -330,26 +317,26 @@ func (cl *client) DeleteClient(client *model.Client) error {
|
|||||||
return cl.doPost(cl.client.R().EnableTrace().SetBody(client), "/clients/delete")
|
return cl.doPost(cl.client.R().EnableTrace().SetBody(client), "/clients/delete")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cl *client) QueryLogConfig() (*model.QueryLogConfig, error) {
|
func (cl *client) QueryLogConfig() (*model.QueryLogConfigWithIgnored, error) {
|
||||||
qlc := &model.QueryLogConfig{}
|
qlc := &model.QueryLogConfigWithIgnored{}
|
||||||
err := cl.doGet(cl.client.R().EnableTrace().SetResult(qlc), "/querylog_info")
|
err := cl.doGet(cl.client.R().EnableTrace().SetResult(qlc), "/querylog/config")
|
||||||
return qlc, err
|
return qlc, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cl *client) SetQueryLogConfig(qlc *model.QueryLogConfig) 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.doPost(cl.client.R().EnableTrace().SetBody(qlc), "/querylog_config")
|
return cl.doPut(cl.client.R().EnableTrace().SetBody(qlc), "/querylog/config/update")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cl *client) StatsConfig() (*model.StatsConfig, error) {
|
func (cl *client) StatsConfig() (*model.GetStatsConfigResponse, error) {
|
||||||
stats := &model.StatsConfig{}
|
stats := &model.GetStatsConfigResponse{}
|
||||||
err := cl.doGet(cl.client.R().EnableTrace().SetResult(stats), "/stats_info")
|
err := cl.doGet(cl.client.R().EnableTrace().SetResult(stats), "/stats/config")
|
||||||
return stats, err
|
return stats, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cl *client) SetStatsConfig(sc *model.StatsConfig) error {
|
func (cl *client) SetStatsConfig(sc *model.PutStatsConfigUpdateRequest) error {
|
||||||
cl.log.With("interval", *sc.Interval).Info("Set stats config")
|
cl.log.With("interval", sc.Interval).Info("Set stats config")
|
||||||
return cl.doPost(cl.client.R().EnableTrace().SetBody(sc), "/stats_config")
|
return cl.doPut(cl.client.R().EnableTrace().SetBody(sc), "/stats/config/update")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cl *client) Setup() error {
|
func (cl *client) Setup() error {
|
||||||
|
|||||||
@@ -239,20 +239,6 @@ var _ = Describe("Client", func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Context("BlockedServices", func() {
|
|
||||||
It("should read BlockedServices", func() {
|
|
||||||
ts, cl = ClientGet("blockedservices-list.json", "/blocked_services/list")
|
|
||||||
s, err := cl.BlockedServices()
|
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
|
||||||
Ω(*s).Should(HaveLen(2))
|
|
||||||
})
|
|
||||||
It("should set BlockedServices", func() {
|
|
||||||
ts, cl = ClientPost("/blocked_services/set", `["bar","foo"]`)
|
|
||||||
err := cl.SetBlockedServices(&model.BlockedServicesArray{"foo", "bar"})
|
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
Context("BlockedServicesSchedule", func() {
|
Context("BlockedServicesSchedule", func() {
|
||||||
It("should read BlockedServicesSchedule", func() {
|
It("should read BlockedServicesSchedule", func() {
|
||||||
ts, cl = ClientGet("blockedservicesschedule-get.json", "/blocked_services/get")
|
ts, cl = ClientGet("blockedservicesschedule-get.json", "/blocked_services/get")
|
||||||
@@ -308,7 +294,7 @@ var _ = Describe("Client", func() {
|
|||||||
|
|
||||||
Context("QueryLogConfig", func() {
|
Context("QueryLogConfig", func() {
|
||||||
It("should read QueryLogConfig", func() {
|
It("should read QueryLogConfig", func() {
|
||||||
ts, cl = ClientGet("querylog_info.json", "/querylog_info")
|
ts, cl = ClientGet("querylog_config.json", "/querylog/config")
|
||||||
qlc, err := cl.QueryLogConfig()
|
qlc, err := cl.QueryLogConfig()
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
Ω(qlc.Enabled).ShouldNot(BeNil())
|
Ω(qlc.Enabled).ShouldNot(BeNil())
|
||||||
@@ -317,26 +303,33 @@ var _ = Describe("Client", func() {
|
|||||||
Ω(*qlc.Interval).Should(Equal(model.QueryLogConfigInterval(90)))
|
Ω(*qlc.Interval).Should(Equal(model.QueryLogConfigInterval(90)))
|
||||||
})
|
})
|
||||||
It("should set QueryLogConfig", func() {
|
It("should set QueryLogConfig", func() {
|
||||||
ts, cl = ClientPost("/querylog_config", `{"anonymize_client_ip":true,"enabled":true,"interval":123}`)
|
ts, cl = ClientPut("/querylog/config/update", `{"anonymize_client_ip":true,"enabled":true,"interval":123,"ignored":["foo.bar"]}`)
|
||||||
|
|
||||||
var interval model.QueryLogConfigInterval = 123
|
var interval model.QueryLogConfigInterval = 123
|
||||||
err := cl.SetQueryLogConfig(&model.QueryLogConfig{AnonymizeClientIp: utils.Ptr(true), Interval: &interval, Enabled: utils.Ptr(true)})
|
err := cl.SetQueryLogConfig(&model.QueryLogConfigWithIgnored{
|
||||||
|
QueryLogConfig: model.QueryLogConfig{
|
||||||
|
AnonymizeClientIp: utils.Ptr(true),
|
||||||
|
Interval: &interval,
|
||||||
|
Enabled: utils.Ptr(true),
|
||||||
|
},
|
||||||
|
Ignored: []string{"foo.bar"},
|
||||||
|
})
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
Context("StatsConfig", func() {
|
Context("StatsConfig", func() {
|
||||||
It("should read StatsConfig", func() {
|
It("should read StatsConfig", func() {
|
||||||
ts, cl = ClientGet("stats_info.json", "/stats_info")
|
ts, cl = ClientGet("stats_info.json", "/stats/config")
|
||||||
sc, err := cl.StatsConfig()
|
sc, err := cl.StatsConfig()
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
Ω(sc.Interval).ShouldNot(BeNil())
|
Ω(sc.Interval).ShouldNot(BeNil())
|
||||||
Ω(*sc.Interval).Should(Equal(model.StatsConfigInterval(1)))
|
Ω(sc.Interval).Should(Equal(float32(1)))
|
||||||
})
|
})
|
||||||
It("should set StatsConfig", func() {
|
It("should set StatsConfig", func() {
|
||||||
ts, cl = ClientPost("/stats_config", `{"interval":123}`)
|
ts, cl = ClientPost("/stats/config/update", `{"enabled":false,"ignored":null,"interval":123}`)
|
||||||
|
|
||||||
var interval model.StatsConfigInterval = 123
|
var interval float32 = 123
|
||||||
err := cl.SetStatsConfig(&model.StatsConfig{Interval: &interval})
|
err := cl.SetStatsConfig(&model.PutStatsConfigUpdateRequest{Interval: interval})
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -361,8 +354,8 @@ var _ = Describe("Client", func() {
|
|||||||
|
|
||||||
Context("doPost", func() {
|
Context("doPost", func() {
|
||||||
It("should return an error on status code != 200", func() {
|
It("should return an error on status code != 200", func() {
|
||||||
var interval model.StatsConfigInterval = 123
|
var interval float32 = 123
|
||||||
err := cl.SetStatsConfig(&model.StatsConfig{Interval: &interval})
|
err := cl.SetStatsConfig(&model.PutStatsConfigUpdateRequest{Interval: interval})
|
||||||
Ω(err).Should(HaveOccurred())
|
Ω(err).Should(HaveOccurred())
|
||||||
Ω(err.Error()).Should(Equal("401 Unauthorized"))
|
Ω(err.Error()).Should(Equal("401 Unauthorized"))
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -167,11 +167,40 @@ func (cl *Client) Sort() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PrepareDiff timezone BlockedServicesSchedule might differ if all other fields are empty,
|
||||||
|
// so we skip it in diff
|
||||||
|
func (cl *Client) PrepareDiff() *string {
|
||||||
|
var tz *string
|
||||||
|
bss := cl.BlockedServicesSchedule
|
||||||
|
if bss != nil && bss.Mon == nil && bss.Tue == nil && bss.Wed == nil &&
|
||||||
|
bss.Thu == nil && bss.Fri == nil && bss.Sat == nil && bss.Sun == nil {
|
||||||
|
|
||||||
|
tz = cl.BlockedServicesSchedule.TimeZone
|
||||||
|
cl.BlockedServicesSchedule.TimeZone = nil
|
||||||
|
}
|
||||||
|
return tz
|
||||||
|
}
|
||||||
|
|
||||||
|
// AfterDiff reset after diff
|
||||||
|
func (cl *Client) AfterDiff(tz *string) {
|
||||||
|
if cl.BlockedServicesSchedule != nil {
|
||||||
|
cl.BlockedServicesSchedule.TimeZone = tz
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Equals Clients equal check
|
// Equals Clients equal check
|
||||||
func (cl *Client) Equals(o *Client) bool {
|
func (cl *Client) Equals(o *Client) bool {
|
||||||
cl.Sort()
|
cl.Sort()
|
||||||
o.Sort()
|
o.Sort()
|
||||||
|
|
||||||
|
bssCl := cl.PrepareDiff()
|
||||||
|
bssO := o.PrepareDiff()
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
cl.AfterDiff(bssCl)
|
||||||
|
o.AfterDiff(bssO)
|
||||||
|
}()
|
||||||
|
|
||||||
return utils.JsonEquals(cl, o)
|
return utils.JsonEquals(cl, o)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,11 +350,16 @@ func (f *Filter) Equals(o *Filter) bool {
|
|||||||
return f.Enabled == o.Enabled && f.Url == o.Url && f.Name == o.Name
|
return f.Enabled == o.Enabled && f.Url == o.Url && f.Name == o.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type QueryLogConfigWithIgnored struct {
|
||||||
|
QueryLogConfig
|
||||||
|
|
||||||
|
// Ignored List of host names, which should not be written to log
|
||||||
|
Ignored []string `json:"ignored,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// Equals QueryLogConfig equal check
|
// Equals QueryLogConfig equal check
|
||||||
func (qlc *QueryLogConfig) Equals(o *QueryLogConfig) bool {
|
func (qlc *QueryLogConfigWithIgnored) Equals(o *QueryLogConfigWithIgnored) bool {
|
||||||
return ptrEquals(qlc.Enabled, o.Enabled) &&
|
return utils.JsonEquals(qlc, o)
|
||||||
ptrEquals(qlc.AnonymizeClientIp, o.AnonymizeClientIp) &&
|
|
||||||
qlc.Interval.Equals(o.Interval)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equals QueryLogConfigInterval equal check
|
// Equals QueryLogConfigInterval equal check
|
||||||
@@ -405,9 +439,15 @@ func ArrayString(a *[]string) string {
|
|||||||
|
|
||||||
func (c *DNSConfig) Sanitize(l *zap.SugaredLogger) {
|
func (c *DNSConfig) Sanitize(l *zap.SugaredLogger) {
|
||||||
// disable UsePrivatePtrResolvers if not configured
|
// disable UsePrivatePtrResolvers if not configured
|
||||||
|
// https://github.com/AdguardTeam/AdGuardHome/issues/6820
|
||||||
if c.UsePrivatePtrResolvers != nil && *c.UsePrivatePtrResolvers &&
|
if c.UsePrivatePtrResolvers != nil && *c.UsePrivatePtrResolvers &&
|
||||||
(c.LocalPtrUpstreams == nil || len(*c.LocalPtrUpstreams) == 0) {
|
(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)
|
c.UsePrivatePtrResolvers = utils.Ptr(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Equals GetStatsConfigResponse equal check
|
||||||
|
func (sc *GetStatsConfigResponse) Equals(o *GetStatsConfigResponse) bool {
|
||||||
|
return utils.JsonEquals(sc, o)
|
||||||
|
}
|
||||||
|
|||||||
@@ -115,12 +115,12 @@ var _ = Describe("Types", func() {
|
|||||||
Context("QueryLogConfig", func() {
|
Context("QueryLogConfig", func() {
|
||||||
Context("Equal", func() {
|
Context("Equal", func() {
|
||||||
var (
|
var (
|
||||||
a *model.QueryLogConfig
|
a *model.QueryLogConfigWithIgnored
|
||||||
b *model.QueryLogConfig
|
b *model.QueryLogConfigWithIgnored
|
||||||
)
|
)
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
a = &model.QueryLogConfig{}
|
a = &model.QueryLogConfigWithIgnored{}
|
||||||
b = &model.QueryLogConfig{}
|
b = &model.QueryLogConfigWithIgnored{}
|
||||||
})
|
})
|
||||||
It("should be equal", func() {
|
It("should be equal", func() {
|
||||||
a.Enabled = utils.Ptr(true)
|
a.Enabled = utils.Ptr(true)
|
||||||
@@ -303,6 +303,23 @@ var _ = Describe("Types", func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Context("Client", func() {
|
||||||
|
Context("Equals", func() {
|
||||||
|
var (
|
||||||
|
cl1 *model.Client
|
||||||
|
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")}}
|
||||||
|
})
|
||||||
|
|
||||||
|
It("should equal if only timezone differs on empty blocked service schedule", func() {
|
||||||
|
Ω(cl1.Equals(cl2)).Should(BeTrue())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
Context("BlockedServices", func() {
|
Context("BlockedServices", func() {
|
||||||
Context("Equals", func() {
|
Context("Equals", func() {
|
||||||
It("should be equal", func() {
|
It("should be equal", func() {
|
||||||
|
|||||||
@@ -106,6 +106,11 @@ func Logs() []string {
|
|||||||
return logs
|
return logs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear the current logs
|
||||||
|
func Clear() {
|
||||||
|
logs = nil
|
||||||
|
}
|
||||||
|
|
||||||
func addFields(enc zapcore.ObjectEncoder, fields []zapcore.Field) {
|
func addFields(enc zapcore.ObjectEncoder, fields []zapcore.Field) {
|
||||||
for i := range fields {
|
for i := range fields {
|
||||||
fields[i].AddTo(enc)
|
fields[i].AddTo(enc)
|
||||||
|
|||||||
@@ -114,21 +114,6 @@ func (mr *MockClientMockRecorder) AddRewriteEntries(arg0 ...any) *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRewriteEntries", reflect.TypeOf((*MockClient)(nil).AddRewriteEntries), arg0...)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRewriteEntries", reflect.TypeOf((*MockClient)(nil).AddRewriteEntries), arg0...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// BlockedServices mocks base method.
|
|
||||||
func (m *MockClient) BlockedServices() (*[]string, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "BlockedServices")
|
|
||||||
ret0, _ := ret[0].(*[]string)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlockedServices indicates an expected call of BlockedServices.
|
|
||||||
func (mr *MockClientMockRecorder) BlockedServices() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockedServices", reflect.TypeOf((*MockClient)(nil).BlockedServices))
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlockedServicesSchedule mocks base method.
|
// BlockedServicesSchedule mocks base method.
|
||||||
func (m *MockClient) BlockedServicesSchedule() (*model.BlockedServicesSchedule, error) {
|
func (m *MockClient) BlockedServicesSchedule() (*model.BlockedServicesSchedule, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -324,10 +309,10 @@ func (mr *MockClientMockRecorder) QueryLog(arg0 any) *gomock.Call {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// QueryLogConfig mocks base method.
|
// QueryLogConfig mocks base method.
|
||||||
func (m *MockClient) QueryLogConfig() (*model.QueryLogConfig, error) {
|
func (m *MockClient) QueryLogConfig() (*model.QueryLogConfigWithIgnored, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "QueryLogConfig")
|
ret := m.ctrl.Call(m, "QueryLogConfig")
|
||||||
ret0, _ := ret[0].(*model.QueryLogConfig)
|
ret0, _ := ret[0].(*model.QueryLogConfigWithIgnored)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
@@ -411,20 +396,6 @@ func (mr *MockClientMockRecorder) SetAccessList(arg0 any) *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAccessList", reflect.TypeOf((*MockClient)(nil).SetAccessList), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAccessList", reflect.TypeOf((*MockClient)(nil).SetAccessList), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetBlockedServices mocks base method.
|
|
||||||
func (m *MockClient) SetBlockedServices(arg0 *[]string) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "SetBlockedServices", arg0)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBlockedServices indicates an expected call of SetBlockedServices.
|
|
||||||
func (mr *MockClientMockRecorder) SetBlockedServices(arg0 any) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBlockedServices", reflect.TypeOf((*MockClient)(nil).SetBlockedServices), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBlockedServicesSchedule mocks base method.
|
// SetBlockedServicesSchedule mocks base method.
|
||||||
func (m *MockClient) SetBlockedServicesSchedule(arg0 *model.BlockedServicesSchedule) error {
|
func (m *MockClient) SetBlockedServicesSchedule(arg0 *model.BlockedServicesSchedule) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -496,7 +467,7 @@ func (mr *MockClientMockRecorder) SetProfileInfo(arg0 any) *gomock.Call {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetQueryLogConfig mocks base method.
|
// SetQueryLogConfig mocks base method.
|
||||||
func (m *MockClient) SetQueryLogConfig(arg0 *model.QueryLogConfig) error {
|
func (m *MockClient) SetQueryLogConfig(arg0 *model.QueryLogConfigWithIgnored) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "SetQueryLogConfig", arg0)
|
ret := m.ctrl.Call(m, "SetQueryLogConfig", arg0)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
@@ -524,7 +495,7 @@ func (mr *MockClientMockRecorder) SetSafeSearchConfig(arg0 any) *gomock.Call {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetStatsConfig mocks base method.
|
// SetStatsConfig mocks base method.
|
||||||
func (m *MockClient) SetStatsConfig(arg0 *model.StatsConfig) error {
|
func (m *MockClient) SetStatsConfig(arg0 *model.GetStatsConfigResponse) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "SetStatsConfig", arg0)
|
ret := m.ctrl.Call(m, "SetStatsConfig", arg0)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
@@ -567,10 +538,10 @@ func (mr *MockClientMockRecorder) Stats() *gomock.Call {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// StatsConfig mocks base method.
|
// StatsConfig mocks base method.
|
||||||
func (m *MockClient) StatsConfig() (*model.StatsConfig, error) {
|
func (m *MockClient) StatsConfig() (*model.GetStatsConfigResponse, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "StatsConfig")
|
ret := m.ctrl.Call(m, "StatsConfig")
|
||||||
ret0, _ := ret[0].(*model.StatsConfig)
|
ret0, _ := ret[0].(*model.GetStatsConfigResponse)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ var (
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if ac.origin.statsConfig.Interval != sc.Interval {
|
if !sc.Equals(ac.origin.statsConfig) {
|
||||||
return ac.client.SetStatsConfig(ac.origin.statsConfig)
|
return ac.client.SetStatsConfig(ac.origin.statsConfig)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@@ -111,17 +111,6 @@ var (
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
actionBlockedServices = func(ac *actionContext) error {
|
|
||||||
rs, err := ac.client.BlockedServices()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !model.EqualsStringSlice(ac.origin.blockedServices, rs, true) {
|
|
||||||
return ac.client.SetBlockedServices(ac.origin.blockedServices)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
actionBlockedServicesSchedule = func(ac *actionContext) error {
|
actionBlockedServicesSchedule = func(ac *actionContext) error {
|
||||||
rbss, err := ac.client.BlockedServicesSchedule()
|
rbss, err := ac.client.BlockedServicesSchedule()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -187,7 +176,7 @@ var (
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
dc.Sanitize(ac.rl)
|
// dc.Sanitize(ac.rl)
|
||||||
|
|
||||||
if !dc.Equals(ac.origin.dnsConfig) {
|
if !dc.Equals(ac.origin.dnsConfig) {
|
||||||
if err = ac.client.SetDNSConfig(ac.origin.dnsConfig); err != nil {
|
if err = ac.client.SetDNSConfig(ac.origin.dnsConfig); err != nil {
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ func setupActions(cfg *types.Config) (actions []syncAction) {
|
|||||||
}
|
}
|
||||||
if cfg.Features.Services {
|
if cfg.Features.Services {
|
||||||
actions = append(actions,
|
actions = append(actions,
|
||||||
action("blocked services", actionBlockedServices),
|
|
||||||
action("blocked services schedule", actionBlockedServicesSchedule),
|
action("blocked services schedule", actionBlockedServicesSchedule),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,12 +50,22 @@ func (w *worker) handleLogs(c *gin.Context) {
|
|||||||
c.Data(http.StatusOK, "text/plain", []byte(strings.Join(log.Logs(), "")))
|
c.Data(http.StatusOK, "text/plain", []byte(strings.Join(log.Logs(), "")))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *worker) handleClearLogs(c *gin.Context) {
|
||||||
|
log.Clear()
|
||||||
|
c.Data(http.StatusOK, "text/plain", []byte{})
|
||||||
|
}
|
||||||
|
|
||||||
func (w *worker) handleStatus(c *gin.Context) {
|
func (w *worker) handleStatus(c *gin.Context) {
|
||||||
c.JSON(http.StatusOK, w.status())
|
c.JSON(http.StatusOK, w.status())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *worker) listenAndServe() {
|
func (w *worker) listenAndServe() {
|
||||||
l.With("port", w.cfg.API.Port).Info("Starting API server")
|
sl := l.With("port", w.cfg.API.Port)
|
||||||
|
if w.cfg.API.TLS.Enabled() {
|
||||||
|
c, k := w.cfg.API.TLS.Certs()
|
||||||
|
sl = sl.With("tls-cert", c).With("tls-key", k)
|
||||||
|
}
|
||||||
|
sl.Info("Starting API server")
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
|
||||||
@@ -75,6 +85,7 @@ func (w *worker) listenAndServe() {
|
|||||||
r.SetHTMLTemplate(template.Must(template.New("index.html").Parse(string(index))))
|
r.SetHTMLTemplate(template.Must(template.New("index.html").Parse(string(index))))
|
||||||
r.POST("/api/v1/sync", w.handleSync)
|
r.POST("/api/v1/sync", w.handleSync)
|
||||||
r.GET("/api/v1/logs", w.handleLogs)
|
r.GET("/api/v1/logs", w.handleLogs)
|
||||||
|
r.POST("/api/v1/clear-logs", w.handleClearLogs)
|
||||||
r.GET("/api/v1/status", w.handleStatus)
|
r.GET("/api/v1/status", w.handleStatus)
|
||||||
r.GET("/favicon.ico", w.handleFavicon)
|
r.GET("/favicon.ico", w.handleFavicon)
|
||||||
r.GET("/", w.handleRoot)
|
r.GET("/", w.handleRoot)
|
||||||
@@ -85,7 +96,14 @@ func (w *worker) listenAndServe() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
if err := httpServer.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
|
var err error
|
||||||
|
if w.cfg.API.TLS.Enabled() {
|
||||||
|
err = httpServer.ListenAndServeTLS(w.cfg.API.TLS.Certs())
|
||||||
|
} else {
|
||||||
|
err = httpServer.ListenAndServe()
|
||||||
|
}
|
||||||
|
|
||||||
|
if !errors.Is(err, http.ErrServerClosed) {
|
||||||
l.With("error", err).Fatalf("HTTP server ListenAndServe")
|
l.With("error", err).Fatalf("HTTP server ListenAndServe")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
@@ -1,7 +1,13 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<title>AdGuardHome sync</title>
|
<title>AdGuardHome sync</title>
|
||||||
<script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.min.js">
|
<script type="text/javascript" src="https://code.jquery.com/jquery-3.7.1.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.12.9/dist/umd/popper.min.js"
|
||||||
|
integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/js/bootstrap.min.js"
|
||||||
|
integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous">
|
||||||
</script>
|
</script>
|
||||||
{{- if .DarkMode }}
|
{{- if .DarkMode }}
|
||||||
<link rel="stylesheet" href="https://bootswatch.com/5/darkly/bootstrap.min.css"
|
<link rel="stylesheet" href="https://bootswatch.com/5/darkly/bootstrap.min.css"
|
||||||
@@ -30,6 +36,12 @@
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
$("#clearLogs").click(function () {
|
||||||
|
$.post("api/v1/clear-logs", {}, function () {
|
||||||
|
$('#logs').html("");
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
$("#sync").click(function () {
|
$("#sync").click(function () {
|
||||||
$.post("api/v1/sync", {}, function (data) {
|
$.post("api/v1/sync", {}, function (data) {
|
||||||
});
|
});
|
||||||
@@ -51,12 +63,18 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
<input class="btn btn-success" type="button" id="sync" value="Synchronize"/>
|
<button type="button" class="btn btn-success" id="sync">Synchronize</button>
|
||||||
<input class="btn btn-secondary" type="button" id="showLogs" value="Update Logs"/>
|
<button type="button" class="btn btn-secondary" id="showLogs">Update Logs</button>
|
||||||
|
<button type="button" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<a class="dropdown-item" href="#" id="clearLogs">Clear Logs</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col col-md-auto">
|
<div class="col col-md-auto">
|
||||||
<div class="float-right">
|
<div class="btn-group float-right" role="group">
|
||||||
<a href="{{ .SyncStatus.Origin.URL }}" target="_blank" class="btn btn-{{ .SyncStatus.Origin.Status }}"
|
<a href="{{ .SyncStatus.Origin.URL }}" target="_blank" class="btn btn-{{ .SyncStatus.Origin.Status }}"
|
||||||
type="button" id="origin"
|
type="button" id="origin"
|
||||||
{{ if .SyncStatus.Origin.Error }} title="{{ .SyncStatus.Origin.Error }}" {{ end }}>Origin {{ .SyncStatus.Origin.Host }}</a>
|
{{ if .SyncStatus.Origin.Error }} title="{{ .SyncStatus.Origin.Error }}" {{ end }}>Origin {{ .SyncStatus.Origin.Host }}</a>
|
||||||
|
|||||||
@@ -201,12 +201,6 @@ func (w *worker) sync() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
o.blockedServices, err = oc.BlockedServices()
|
|
||||||
if err != nil {
|
|
||||||
sl.With("error", err).Error("Error getting origin blocked services")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
o.blockedServicesSchedule, err = oc.BlockedServicesSchedule()
|
o.blockedServicesSchedule, err = oc.BlockedServicesSchedule()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sl.With("error", err).Error("Error getting origin blocked services schedule")
|
sl.With("error", err).Error("Error getting origin blocked services schedule")
|
||||||
@@ -327,12 +321,11 @@ func (w *worker) statusWithSetup(rl *zap.SugaredLogger, replica types.AdGuardIns
|
|||||||
type origin struct {
|
type origin struct {
|
||||||
status *model.ServerStatus
|
status *model.ServerStatus
|
||||||
rewrites *model.RewriteEntries
|
rewrites *model.RewriteEntries
|
||||||
blockedServices *model.BlockedServicesArray
|
|
||||||
blockedServicesSchedule *model.BlockedServicesSchedule
|
blockedServicesSchedule *model.BlockedServicesSchedule
|
||||||
filters *model.FilterStatus
|
filters *model.FilterStatus
|
||||||
clients *model.Clients
|
clients *model.Clients
|
||||||
queryLogConfig *model.QueryLogConfig
|
queryLogConfig *model.QueryLogConfigWithIgnored
|
||||||
statsConfig *model.StatsConfig
|
statsConfig *model.GetStatsConfigResponse
|
||||||
accessList *model.AccessList
|
accessList *model.AccessList
|
||||||
dnsConfig *model.DNSConfig
|
dnsConfig *model.DNSConfig
|
||||||
dhcpServerConfig *model.DhcpStatus
|
dhcpServerConfig *model.DhcpStatus
|
||||||
|
|||||||
@@ -67,8 +67,8 @@ var _ = Describe("Sync", func() {
|
|||||||
},
|
},
|
||||||
status: &model.ServerStatus{},
|
status: &model.ServerStatus{},
|
||||||
safeSearch: &model.SafeSearchConfig{},
|
safeSearch: &model.SafeSearchConfig{},
|
||||||
queryLogConfig: &model.QueryLogConfig{},
|
queryLogConfig: &model.QueryLogConfigWithIgnored{},
|
||||||
statsConfig: &model.StatsConfig{},
|
statsConfig: &model.PutStatsConfigUpdateRequest{},
|
||||||
},
|
},
|
||||||
replicaStatus: &model.ServerStatus{},
|
replicaStatus: &model.ServerStatus{},
|
||||||
client: cl,
|
client: cl,
|
||||||
@@ -289,9 +289,9 @@ var _ = Describe("Sync", func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
Context("actionQueryLogConfig", func() {
|
Context("actionQueryLogConfig", func() {
|
||||||
var qlc *model.QueryLogConfig
|
var qlc *model.QueryLogConfigWithIgnored
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
qlc = &model.QueryLogConfig{}
|
qlc = &model.QueryLogConfigWithIgnored{}
|
||||||
})
|
})
|
||||||
It("should have no changes", func() {
|
It("should have no changes", func() {
|
||||||
cl.EXPECT().QueryLogConfig().Return(qlc, nil)
|
cl.EXPECT().QueryLogConfig().Return(qlc, nil)
|
||||||
@@ -302,15 +302,15 @@ var _ = Describe("Sync", func() {
|
|||||||
var interval model.QueryLogConfigInterval = 123
|
var interval model.QueryLogConfigInterval = 123
|
||||||
ac.origin.queryLogConfig.Interval = &interval
|
ac.origin.queryLogConfig.Interval = &interval
|
||||||
cl.EXPECT().QueryLogConfig().Return(qlc, nil)
|
cl.EXPECT().QueryLogConfig().Return(qlc, nil)
|
||||||
cl.EXPECT().SetQueryLogConfig(&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 := actionQueryLogConfig(ac)
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
Context("syncConfigs", func() {
|
Context("syncConfigs", func() {
|
||||||
var sc *model.StatsConfig
|
var sc *model.PutStatsConfigUpdateRequest
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
sc = &model.StatsConfig{}
|
sc = &model.PutStatsConfigUpdateRequest{}
|
||||||
})
|
})
|
||||||
It("should have no changes", func() {
|
It("should have no changes", func() {
|
||||||
cl.EXPECT().StatsConfig().Return(sc, nil)
|
cl.EXPECT().StatsConfig().Return(sc, nil)
|
||||||
@@ -318,10 +318,10 @@ var _ = Describe("Sync", func() {
|
|||||||
Ω(err).ShouldNot(HaveOccurred())
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
It("should have StatsConfig changes", func() {
|
It("should have StatsConfig changes", func() {
|
||||||
var interval model.StatsConfigInterval = 123
|
var interval float32 = 123
|
||||||
ac.origin.statsConfig.Interval = &interval
|
ac.origin.statsConfig.Interval = interval
|
||||||
cl.EXPECT().StatsConfig().Return(sc, nil)
|
cl.EXPECT().StatsConfig().Return(sc, nil)
|
||||||
cl.EXPECT().SetStatsConfig(&model.StatsConfig{Interval: &interval})
|
cl.EXPECT().SetStatsConfig(&model.PutStatsConfigUpdateRequest{Interval: interval})
|
||||||
err := actionStatsConfig(ac)
|
err := actionStatsConfig(ac)
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
Ω(err).ShouldNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
@@ -359,26 +359,6 @@ var _ = Describe("Sync", func() {
|
|||||||
Ω(st).Should(BeNil())
|
Ω(st).Should(BeNil())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
Context("actionBlockedServices", func() {
|
|
||||||
var rbs *model.BlockedServicesArray
|
|
||||||
BeforeEach(func() {
|
|
||||||
ac.origin.blockedServices = &model.BlockedServicesArray{"foo"}
|
|
||||||
rbs = &model.BlockedServicesArray{"foo"}
|
|
||||||
})
|
|
||||||
It("should have no changes", func() {
|
|
||||||
cl.EXPECT().BlockedServices().Return(rbs, nil)
|
|
||||||
err := actionBlockedServices(ac)
|
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
It("should have blockedServices changes", func() {
|
|
||||||
ac.origin.blockedServices = &model.BlockedServicesArray{"bar"}
|
|
||||||
|
|
||||||
cl.EXPECT().BlockedServices().Return(rbs, nil)
|
|
||||||
cl.EXPECT().SetBlockedServices(ac.origin.blockedServices)
|
|
||||||
err := actionBlockedServices(ac)
|
|
||||||
Ω(err).ShouldNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
Context("actionBlockedServicesSchedule", func() {
|
Context("actionBlockedServicesSchedule", func() {
|
||||||
var rbss *model.BlockedServicesSchedule
|
var rbss *model.BlockedServicesSchedule
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
@@ -599,12 +579,11 @@ var _ = Describe("Sync", func() {
|
|||||||
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
||||||
cl.EXPECT().SafeBrowsing()
|
cl.EXPECT().SafeBrowsing()
|
||||||
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
||||||
cl.EXPECT().BlockedServices()
|
|
||||||
cl.EXPECT().BlockedServicesSchedule()
|
cl.EXPECT().BlockedServicesSchedule()
|
||||||
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
||||||
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
||||||
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfig{}, nil)
|
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfigWithIgnored{}, nil)
|
||||||
cl.EXPECT().StatsConfig().Return(&model.StatsConfig{}, nil)
|
cl.EXPECT().StatsConfig().Return(&model.PutStatsConfigUpdateRequest{}, nil)
|
||||||
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
||||||
cl.EXPECT().DNSConfig().Return(&model.DNSConfig{}, nil)
|
cl.EXPECT().DNSConfig().Return(&model.DNSConfig{}, nil)
|
||||||
cl.EXPECT().DhcpConfig().Return(&model.DhcpStatus{}, nil)
|
cl.EXPECT().DhcpConfig().Return(&model.DhcpStatus{}, nil)
|
||||||
@@ -616,13 +595,12 @@ var _ = Describe("Sync", func() {
|
|||||||
cl.EXPECT().Parental()
|
cl.EXPECT().Parental()
|
||||||
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
||||||
cl.EXPECT().SafeBrowsing()
|
cl.EXPECT().SafeBrowsing()
|
||||||
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfig{}, nil)
|
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfigWithIgnored{}, nil)
|
||||||
cl.EXPECT().StatsConfig().Return(&model.StatsConfig{}, nil)
|
cl.EXPECT().StatsConfig().Return(&model.PutStatsConfigUpdateRequest{}, nil)
|
||||||
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
||||||
cl.EXPECT().AddRewriteEntries()
|
cl.EXPECT().AddRewriteEntries()
|
||||||
cl.EXPECT().DeleteRewriteEntries()
|
cl.EXPECT().DeleteRewriteEntries()
|
||||||
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
||||||
cl.EXPECT().BlockedServices()
|
|
||||||
cl.EXPECT().BlockedServicesSchedule()
|
cl.EXPECT().BlockedServicesSchedule()
|
||||||
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
||||||
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
||||||
@@ -641,12 +619,11 @@ var _ = Describe("Sync", func() {
|
|||||||
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
||||||
cl.EXPECT().SafeBrowsing()
|
cl.EXPECT().SafeBrowsing()
|
||||||
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
||||||
cl.EXPECT().BlockedServices()
|
|
||||||
cl.EXPECT().BlockedServicesSchedule()
|
cl.EXPECT().BlockedServicesSchedule()
|
||||||
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
||||||
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
||||||
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfig{}, nil)
|
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfigWithIgnored{}, nil)
|
||||||
cl.EXPECT().StatsConfig().Return(&model.StatsConfig{}, nil)
|
cl.EXPECT().StatsConfig().Return(&model.PutStatsConfigUpdateRequest{}, nil)
|
||||||
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
||||||
cl.EXPECT().DNSConfig().Return(&model.DNSConfig{}, nil)
|
cl.EXPECT().DNSConfig().Return(&model.DNSConfig{}, nil)
|
||||||
|
|
||||||
@@ -657,13 +634,12 @@ var _ = Describe("Sync", func() {
|
|||||||
cl.EXPECT().Parental()
|
cl.EXPECT().Parental()
|
||||||
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
||||||
cl.EXPECT().SafeBrowsing()
|
cl.EXPECT().SafeBrowsing()
|
||||||
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfig{}, nil)
|
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfigWithIgnored{}, nil)
|
||||||
cl.EXPECT().StatsConfig().Return(&model.StatsConfig{}, nil)
|
cl.EXPECT().StatsConfig().Return(&model.PutStatsConfigUpdateRequest{}, nil)
|
||||||
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
||||||
cl.EXPECT().AddRewriteEntries()
|
cl.EXPECT().AddRewriteEntries()
|
||||||
cl.EXPECT().DeleteRewriteEntries()
|
cl.EXPECT().DeleteRewriteEntries()
|
||||||
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
||||||
cl.EXPECT().BlockedServices()
|
|
||||||
cl.EXPECT().BlockedServicesSchedule()
|
cl.EXPECT().BlockedServicesSchedule()
|
||||||
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
||||||
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
||||||
@@ -685,12 +661,11 @@ var _ = Describe("Sync", func() {
|
|||||||
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
cl.EXPECT().SafeSearchConfig().Return(&model.SafeSearchConfig{}, nil)
|
||||||
cl.EXPECT().SafeBrowsing()
|
cl.EXPECT().SafeBrowsing()
|
||||||
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
cl.EXPECT().RewriteList().Return(&model.RewriteEntries{}, nil)
|
||||||
cl.EXPECT().BlockedServices()
|
|
||||||
cl.EXPECT().BlockedServicesSchedule()
|
cl.EXPECT().BlockedServicesSchedule()
|
||||||
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
cl.EXPECT().Filtering().Return(&model.FilterStatus{}, nil)
|
||||||
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
cl.EXPECT().Clients().Return(&model.Clients{}, nil)
|
||||||
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfig{}, nil)
|
cl.EXPECT().QueryLogConfig().Return(&model.QueryLogConfigWithIgnored{}, nil)
|
||||||
cl.EXPECT().StatsConfig().Return(&model.StatsConfig{}, nil)
|
cl.EXPECT().StatsConfig().Return(&model.PutStatsConfigUpdateRequest{}, nil)
|
||||||
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
cl.EXPECT().AccessList().Return(&model.AccessList{}, nil)
|
||||||
cl.EXPECT().DNSConfig().Return(&model.DNSConfig{}, nil)
|
cl.EXPECT().DNSConfig().Return(&model.DNSConfig{}, nil)
|
||||||
cl.EXPECT().DhcpConfig().Return(&model.DhcpStatus{}, nil)
|
cl.EXPECT().DhcpConfig().Return(&model.DhcpStatus{}, nil)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package types
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ type API struct {
|
|||||||
Password string `json:"password,omitempty" yaml:"password,omitempty" env:"API_PASSWORD"`
|
Password string `json:"password,omitempty" yaml:"password,omitempty" env:"API_PASSWORD"`
|
||||||
DarkMode bool `json:"darkMode,omitempty" yaml:"darkMode,omitempty" env:"API_DARK_MODE"`
|
DarkMode bool `json:"darkMode,omitempty" yaml:"darkMode,omitempty" env:"API_DARK_MODE"`
|
||||||
Metrics Metrics `json:"metrics,omitempty" yaml:"metrics,omitempty" env:"API_METRICS"`
|
Metrics Metrics `json:"metrics,omitempty" yaml:"metrics,omitempty" env:"API_METRICS"`
|
||||||
|
TLS TLS `json:"tls,omitempty" yaml:"tls,omitempty" env:"API_TLS"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metrics configuration
|
// Metrics configuration
|
||||||
@@ -44,6 +46,30 @@ type Metrics struct {
|
|||||||
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"`
|
||||||
|
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"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TLS) Enabled() bool {
|
||||||
|
return strings.TrimSpace(t.CertDir) != ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t TLS) Certs() (cert string, key string) {
|
||||||
|
cert = filepath.Join(t.CertDir, defaultIfEmpty(t.CertName, "tls.crt"))
|
||||||
|
key = filepath.Join(t.CertDir, defaultIfEmpty(t.KeyName, "tls.key"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultIfEmpty(val string, fallback string) string {
|
||||||
|
if strings.TrimSpace(val) == "" {
|
||||||
|
return fallback
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
// Mask maks username and password
|
// Mask maks username and password
|
||||||
func (a *API) Mask() {
|
func (a *API) Mask() {
|
||||||
a.Username = mask(a.Username)
|
a.Username = mask(a.Username)
|
||||||
|
|||||||
@@ -96,4 +96,35 @@ var _ = Describe("Types", func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Context("TLS", func() {
|
||||||
|
var t TLS
|
||||||
|
BeforeEach(func() {
|
||||||
|
t = TLS{
|
||||||
|
CertDir: "/path/to/certs",
|
||||||
|
}
|
||||||
|
})
|
||||||
|
Context("Enabled", func() {
|
||||||
|
It("should use enabled", func() {
|
||||||
|
Ω(t.Enabled()).Should(BeTrue())
|
||||||
|
})
|
||||||
|
It("should use disabled", func() {
|
||||||
|
t.CertDir = " "
|
||||||
|
Ω(t.Enabled()).Should(BeFalse())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
Context("Certs", func() {
|
||||||
|
It("should use default crt and key", func() {
|
||||||
|
crt, key := t.Certs()
|
||||||
|
Ω(crt).Should(Equal("/path/to/certs/tls.crt"))
|
||||||
|
Ω(key).Should(Equal("/path/to/certs/tls.key"))
|
||||||
|
})
|
||||||
|
It("should use custom crt and key", func() {
|
||||||
|
t.CertName = "foo.crt"
|
||||||
|
t.KeyName = "bar.key"
|
||||||
|
crt, key := t.Certs()
|
||||||
|
Ω(crt).Should(Equal("/path/to/certs/foo.crt"))
|
||||||
|
Ω(key).Should(Equal("/path/to/certs/bar.key"))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
2
testdata/e2e/bin/show-sync-metrics.sh
vendored
2
testdata/e2e/bin/show-sync-metrics.sh
vendored
@@ -7,5 +7,5 @@ sleep 30
|
|||||||
|
|
||||||
echo "## Pod adguardhome-sync metrics" >> $GITHUB_STEP_SUMMARY
|
echo "## Pod adguardhome-sync metrics" >> $GITHUB_STEP_SUMMARY
|
||||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||||
curl http://localhost:9090/metrics -s >> $GITHUB_STEP_SUMMARY
|
curl ${1}://localhost:9090/metrics -s -k >> $GITHUB_STEP_SUMMARY
|
||||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||||
|
|||||||
2
testdata/e2e/bin/wait-for-sync.sh
vendored
2
testdata/e2e/bin/wait-for-sync.sh
vendored
@@ -6,7 +6,7 @@ kubectl port-forward pod/adguardhome-sync 9090:9090 &
|
|||||||
|
|
||||||
for i in {1..6}; do
|
for i in {1..6}; do
|
||||||
sleep 10
|
sleep 10
|
||||||
RUNNING=$(curl http://localhost:9090/api/v1/status -s | jq -r .syncRunning)
|
RUNNING=$(curl ${1}://localhost:9090/api/v1/status -s -k | jq -r .syncRunning)
|
||||||
echo "SyncRunning = ${RUNNING}"
|
echo "SyncRunning = ${RUNNING}"
|
||||||
if [[ "${RUNNING}" == "false" ]]; then
|
if [[ "${RUNNING}" == "false" ]]; then
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
93
testdata/e2e/templates/configmap-certs.yaml
vendored
Normal file
93
testdata/e2e/templates/configmap-certs.yaml
vendored
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
{{- if eq .Values.mode "env" }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: certs
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
data:
|
||||||
|
my.crt: |
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIE7zCCAtcCFFthw5GxzLaZC/pTTlbwju6vYr9pMA0GCSqGSIb3DQEBCwUAMDMx
|
||||||
|
CzAJBgNVBAYTAkNIMRMwEQYDVQQIDApTb21lLVN0YXRlMQ8wDQYDVQQKDAZiYWtp
|
||||||
|
dG8wIBcNMjQwNDA0MDUxOTMyWhgPMjEyNDAzMTEwNTE5MzJaMDMxCzAJBgNVBAYT
|
||||||
|
AkNIMRMwEQYDVQQIDApTb21lLVN0YXRlMQ8wDQYDVQQKDAZiYWtpdG8wggIiMA0G
|
||||||
|
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCenHJ0SunHqdtBdG8d5Uy8y5KESOPE
|
||||||
|
GCpcjNetSR53binlV3QjVckrA+6tHQBR3yXpSgHWU424fR3eTdHsbS9/8/pAnV0V
|
||||||
|
CAaUntbCr5CJ8ww2zRlGSz6IlxkwJkqx4crmYUcTm6XNcEm5kSoBmFR1s8TiQAQ8
|
||||||
|
CnJyt4m3S5jSKnexAMi2l2LP4F5P5MwLHdpl2sfRYydWOoJty9nSYuRxarv7G7e3
|
||||||
|
N102voL3W2F9Dk8QbKF1Kzxcfmh+4twNz/YfUxxB3tggrCGHfMu4EcvMrFCkKhNv
|
||||||
|
sFcG9aZ0gNj4x54vCOMK+LuVd8JZQMcGBdcxZUq+q4nyj4dxFDKSUjZ+nVjdbuab
|
||||||
|
dk72dVbv/r2j6aGFuZDwPeYrKOyGCUlzyPvtX3qDjrebvalkrua0ApJLTiUntQK4
|
||||||
|
E+8P658GUzwqhKi6COEmgJgZO1+xIhO68OzPS6qj8OvgOw97VJqWsnTkDeu5Xd3E
|
||||||
|
qW37lk62EQ75FCLaWAmyBcxTDlIWNfwvSlI57Iyw0ec9ziN4JP+6pX3QTcj69Kvc
|
||||||
|
ERExUNGWcyQVYiCFigBqL/UtGO73PA4kb8P6Zef0oTx7siw4ysImvQ/RHvbArXPE
|
||||||
|
iqxg/afjJz/w7fTTwk9DRW12hiWj7+ojZMcoYCj1PcOlmZvchwZRdN8Lp37wm11I
|
||||||
|
EYxdoBQVRWk0vwIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQB6H+z2IEtiBTOIFnYJ
|
||||||
|
++CvZWw0CLPSpuFTwpDRIVUbrfhpFoXMwb6ungaqrGNXv3H4HQXl2EwXwZomsy2K
|
||||||
|
/pjk/0rHFdleEtJ4beSv44ToGCL+RqeU38sGuxCDQBCxIqGcbkErkqEYJqaSEV9I
|
||||||
|
elKjBA5PEy+WO/P+J5UYU6aY+59C+ZHrZ8HzoPUGrZ6ESu9Wm/9iOpUn4DWFzOOu
|
||||||
|
E/14QQqpHzHRvpbfOb/dsnEYv7JoiOaXhOedKmx5k+bLhNCXOJiqyqphNp0Io3Fr
|
||||||
|
8i6IxfvOo/6nw9sQ02E6PjNyC5bRq7TUrqffTcCRq7EYhJoK43V7nzLpUBItBF7K
|
||||||
|
FszFnvBxvgPtUdbhs6O8U8pqoPw1vCnoJLnerGfN1fEclV7Sbf3d1hCYXtHzmpZM
|
||||||
|
qflEkJIPSgkr8dyi2JjSQR5AJUtB5/VAZwBATNKNYINfnEVzyle+64iVaKteRt9e
|
||||||
|
yeLoy/ktTZSlQbb7/qg4NtQx9SA5PlYVMLj20S5HwStGQhLIb5lrwzkHNUZmkDWr
|
||||||
|
LUX1ufOfhNpCH2Egn078pyEn88B5iRTga2auCk3siOs9H3wmbT2r57E7ddX3l9Sf
|
||||||
|
MzO/8HyfNoa2RUTnJHdyduAT7VytyJSSRmfeapw9ITngZHGmpPhisKhxb6IoZm0J
|
||||||
|
j10kyQuFfNcZKlNa3D7XFvqzWQ==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
my.key: |
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCenHJ0SunHqdtB
|
||||||
|
dG8d5Uy8y5KESOPEGCpcjNetSR53binlV3QjVckrA+6tHQBR3yXpSgHWU424fR3e
|
||||||
|
TdHsbS9/8/pAnV0VCAaUntbCr5CJ8ww2zRlGSz6IlxkwJkqx4crmYUcTm6XNcEm5
|
||||||
|
kSoBmFR1s8TiQAQ8CnJyt4m3S5jSKnexAMi2l2LP4F5P5MwLHdpl2sfRYydWOoJt
|
||||||
|
y9nSYuRxarv7G7e3N102voL3W2F9Dk8QbKF1Kzxcfmh+4twNz/YfUxxB3tggrCGH
|
||||||
|
fMu4EcvMrFCkKhNvsFcG9aZ0gNj4x54vCOMK+LuVd8JZQMcGBdcxZUq+q4nyj4dx
|
||||||
|
FDKSUjZ+nVjdbuabdk72dVbv/r2j6aGFuZDwPeYrKOyGCUlzyPvtX3qDjrebvalk
|
||||||
|
rua0ApJLTiUntQK4E+8P658GUzwqhKi6COEmgJgZO1+xIhO68OzPS6qj8OvgOw97
|
||||||
|
VJqWsnTkDeu5Xd3EqW37lk62EQ75FCLaWAmyBcxTDlIWNfwvSlI57Iyw0ec9ziN4
|
||||||
|
JP+6pX3QTcj69KvcERExUNGWcyQVYiCFigBqL/UtGO73PA4kb8P6Zef0oTx7siw4
|
||||||
|
ysImvQ/RHvbArXPEiqxg/afjJz/w7fTTwk9DRW12hiWj7+ojZMcoYCj1PcOlmZvc
|
||||||
|
hwZRdN8Lp37wm11IEYxdoBQVRWk0vwIDAQABAoICAEx3eTh2m1F+oq1iQGXF0+Kb
|
||||||
|
NEZhS6mQyu92mU46F52Vd05RhLS6WXNLAIjmF+7gqYrYep1FB+ifLUSs+N1GYGWM
|
||||||
|
DqSTGTqX9XA2SaxvbrwK+GL9K0e34+x/CA4uD8nFZQf/cwBRhDRQg8KaaQl+0o0y
|
||||||
|
P2OiYEg/8yA6OwMqx4DfJ3gmvB1HS8STU3SqBfMAD/gV60qXxnGsYJAlfJyQv7is
|
||||||
|
L/dmTAJhByfq3gH5xLzBJr3w2UA/OWkQKjmuDk/8aBh+/XsGP+U0hy+mKyLRNZM1
|
||||||
|
qeUTQe6RMcuxp2+4ZKI/vpPHcYorE2iCZaiY8bqGG1J9lnTpB2bw6mfKSH1BdHKB
|
||||||
|
BCpnvMebe56hfNzQgbE5N4XZUHE4fdFRSDe0cLyagN+5BAekaA10E5cW5/7bfs4P
|
||||||
|
VFtJgcj3wSRsnYQ4UZoA/9LE6IeQXuHauUFf9lGvy26oW8FkuTysZk6w5uxyJOew
|
||||||
|
qM0/r7DaGZ6umAsINgLMV/2+ksVDGdOpcHmd7S6Gi26vFKIPdIXWO6BtVej6Mkb9
|
||||||
|
vUKEEnJbx+gdiehAO63WAg9KR77bHwTXFPYGvza3mB1SXrZCGjjfBnI5yQP6VDwG
|
||||||
|
uRa0fY/thbsS8QdHc6lmMJNKJnCyes3sG99qcpOX0HBWRpGt9YzjHMK16uQbMPn1
|
||||||
|
0ApKa/1j/izsQtMkai81AoIBAQDLi/WbQY5jrKesRjSN7AOGND0Ge/NHF7hPIKW6
|
||||||
|
Ql+BKiu3AiADemiXfnpeBS8OtkqxFWNFT6Ob2uv5pF2aRzP1un8mTaSipQu5iEOz
|
||||||
|
tejyiWGMCzKaGPksB/d2spDxaDTs1KIyM+YVP2ynx8IGwet2mRcWZ4ixyQxgaj2o
|
||||||
|
vZeCesxJZSPlt+D0NoPlthwDx4B7D49tU288WEvhPspcAjW3udE4WV4dnmFTZFtD
|
||||||
|
ZmJ9GrW4rQsti6D2f+hnkWi17F+qGR0B7B4yyE66W8y3wzMfq0/tZzBpAH+azwjk
|
||||||
|
qkHIbePrWTpwLwbAK4L4cKENs+yivAldfUj4kgVUhVLCscCrAoIBAQDHfBKKF/DK
|
||||||
|
BsGvWSxo5QahJza2px1walQeE0AifkDYkLI+fyYnArOTUKKAC1/SxI21PWlPPJHz
|
||||||
|
bt2lhF+I3+DFJTDLsUrBUN923rTpt1WpQVvBNzUFVz6JDlYr6VUOVOX0KY+LVE20
|
||||||
|
iPmZLrutgO3JRMMFWOaT0ptV1dVx/Eyd4BiT+NfK06D4ZSHGZ6QAsuUmjc+M5VfM
|
||||||
|
nRbuDlpMgOcBQYQSAfrA+LT6jZorv0mOO6rigNWzIP8FlsJxf1A5o5zL9CYAOOk/
|
||||||
|
lRWI7K4LSP4TTcTW8DnXqVH7q569d2QA/RS2B1EUEdpNuT2aKIAsNNrhA3JCX6S9
|
||||||
|
UZm9KOBwYuQ9AoIBAQCbD8ZNPkXA/RjHDryemXud01HiDK8qK5HHBfH60PF8rqma
|
||||||
|
w02sGKZxMnL6CSzuIkUIXmi/tonHA6HdDjAYhcG5oxeWEHQpS16BOqOI1j3d9naP
|
||||||
|
f0BPUFMSDgehLytoHKClAt+FKzBOY4Dc2Dqhdz1vnfSOptTly2lYUdcjIzu2tOHH
|
||||||
|
z/rm14vRv23/oxn4bxUbqqDzAiqtZ/52W6VBLpXJnw8ZxEsEeVFffAZidC73a0+g
|
||||||
|
noLzcXlwD8T2kTmZzbabGIKWok/nE92V7rUoENZze8hp7MBeXXjYcHwv5twyWjTV
|
||||||
|
Z6YzLEASSZN+vB6VF8pftqvTwsvCQUs6Nk7z7wH9AoIBAA6EH9E+tr3syfFZmtqz
|
||||||
|
N81ITjnyZTkF88MQgY1BBLT9qorTs9II50pkBr8slLeAqBM1OdGTRceiHKzrugv6
|
||||||
|
xp9x+mAIMblpiilbQWz0c15SrDueKdSOqbVNfsXJP/BAC0++KnzoEJN/mDImbW/N
|
||||||
|
vv/zagGcm4LMQ5N2cQbPZj/iy8cQx5sx1TfeHBwU9KE8Y2Jv1VeaZM417DI8hyOk
|
||||||
|
CatUuiiZTkb2kizdWwet7stT2jaLS4Gyd/xPIS0jJ5JaLpHE3XMMsSR4U83X8z5M
|
||||||
|
/HgpI5bEemEQKDAZJ/7/jh5oTDaGx8afGfSn8yyhn9oXqonPN2RPE2zXYEmcjOCA
|
||||||
|
wb0CggEBAI9ztuEtsucOVKa52Itzvk8sZn2MF1kpUPHGF6/VW6a/s45wvvFFW3PE
|
||||||
|
BjqmgJX8s2ZLgOgWE/wEmEpHX+lxmebYJ3bmOsx5eGfA1eZBypWCBYBSfezf/1zD
|
||||||
|
3AD65+gwO4GhnSN4zsrlyVC6SsWEaeu+sxexHt15YJI9SkwCkvZTYoLqe9nMcAjY
|
||||||
|
h41p/i6bhl9ODZPd1+hL631EFWguyMVSVTDgIG141OIYKz5hVQZ08ddrwHB2gPf6
|
||||||
|
JSdU2DFOD6tNCfvTYAMvUfkoIt3g9RDJ5dTdR9J/3efm0ZIutcYcHiASIcubPU9x
|
||||||
|
r8Ww1tZIoBx/s50i7X1JFyuXp0TWQsI=
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
@@ -8,6 +8,9 @@ data:
|
|||||||
API_PORT: '9090'
|
API_PORT: '9090'
|
||||||
API_METRICS_ENABLED: 'true'
|
API_METRICS_ENABLED: 'true'
|
||||||
API_METRICS_SCRAPE_INTERVAL: '30s'
|
API_METRICS_SCRAPE_INTERVAL: '30s'
|
||||||
|
API_TLS_CERT_DIR: '/certs'
|
||||||
|
API_TLS_CERT_NAME: 'my.crt'
|
||||||
|
API_TLS_KEY_NAME: 'my.key'
|
||||||
LOG_FORMAT: 'json'
|
LOG_FORMAT: 'json'
|
||||||
ORIGIN_URL: 'http://service-origin.{{ $.Release.Namespace }}.svc.cluster.local:3000'
|
ORIGIN_URL: 'http://service-origin.{{ $.Release.Namespace }}.svc.cluster.local:3000'
|
||||||
ORIGIN_PASSWORD: 'password'
|
ORIGIN_PASSWORD: 'password'
|
||||||
|
|||||||
@@ -26,5 +26,12 @@ spec:
|
|||||||
envFrom:
|
envFrom:
|
||||||
- configMapRef:
|
- configMapRef:
|
||||||
name: sync-conf
|
name: sync-conf
|
||||||
|
volumeMounts:
|
||||||
|
- name: certs
|
||||||
|
mountPath: /certs
|
||||||
restartPolicy: Never
|
restartPolicy: Never
|
||||||
|
volumes:
|
||||||
|
- name: certs
|
||||||
|
configMap:
|
||||||
|
name: certs
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|||||||
8
testdata/querylog_config.json
vendored
Normal file
8
testdata/querylog_config.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"interval": 90,
|
||||||
|
"anonymize_client_ip": false,
|
||||||
|
"ignored": [
|
||||||
|
"foo.bar"
|
||||||
|
]
|
||||||
|
}
|
||||||
5
testdata/querylog_info.json
vendored
5
testdata/querylog_info.json
vendored
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"enabled": true,
|
|
||||||
"interval": 90,
|
|
||||||
"anonymize_client_ip": false
|
|
||||||
}
|
|
||||||
14
tools.go
14
tools.go
@@ -1,14 +0,0 @@
|
|||||||
//go:build tools
|
|
||||||
// +build tools
|
|
||||||
|
|
||||||
package tools
|
|
||||||
|
|
||||||
import (
|
|
||||||
_ "github.com/bakito/semver"
|
|
||||||
_ "github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen"
|
|
||||||
_ "github.com/golangci/golangci-lint/cmd/golangci-lint"
|
|
||||||
_ "github.com/goreleaser/goreleaser"
|
|
||||||
_ "github.com/onsi/ginkgo/v2/ginkgo"
|
|
||||||
_ "go.uber.org/mock/mockgen"
|
|
||||||
_ "k8s.io/code-generator/cmd/deepcopy-gen"
|
|
||||||
)
|
|
||||||
Reference in New Issue
Block a user