diff --git a/.gitignore b/.gitignore index a41ba7b..ce170fe 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,8 @@ *.dll *.so *.dylib -.idea +/.idea/ +*.iml # Test binary, build with `go test -c` *.test @@ -14,6 +15,10 @@ # Ignore the built binary cert-manager-webhook-freedns +# dev-local build settings +*.work + # Make artifacts +bin _out _test diff --git a/Dockerfile b/Dockerfile index c92f9fb..d3ee0e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,24 +1,29 @@ -FROM golang:1.22-alpine3.19 AS build_deps +# syntax=docker/dockerfile:1.7 -RUN apk add --no-cache git +FROM --platform=$BUILDPLATFORM golang:1.26-alpine3.23 AS build WORKDIR /workspace -COPY go.mod . -COPY go.sum . +ARG TARGETOS +ARG TARGETARCH -RUN go mod download +COPY go.mod go.sum ./ -FROM build_deps AS build +RUN --mount=type=cache,target=/go/pkg/mod \ + go mod download COPY . . -RUN CGO_ENABLED=0 go build -o webhook -ldflags '-w -extldflags "-static"' . +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + CGO_ENABLED=0 \ + GOOS=$TARGETOS \ + GOARCH=$TARGETARCH \ + go build -trimpath -o /out/webhook -ldflags='-s -w' . -FROM alpine:3.18 +FROM scratch -RUN apk add --no-cache ca-certificates +COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ +COPY --from=build /out/webhook /usr/local/bin/webhook -COPY --from=build /workspace/webhook /usr/local/bin/webhook - -ENTRYPOINT ["webhook"] +ENTRYPOINT ["/usr/local/bin/webhook"] diff --git a/Makefile b/Makefile index 6fbb534..ad1b8d2 100644 --- a/Makefile +++ b/Makefile @@ -7,25 +7,22 @@ IMAGE_TAG := "latest" OUT := $(shell pwd)/_out -KUBEBUILDER_VERSION=1.28.0 +# FIXME: Required to set the environment variables below. Remove when fixed. +ENVTEST_K8S_VERSION=1.35.0 HELM_FILES := $(shell find deploy/freedns-webhook) -test: _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/etcd _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kube-apiserver _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kubectl - TEST_ASSET_ETCD=_test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/etcd \ - TEST_ASSET_KUBE_APISERVER=_test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kube-apiserver \ - TEST_ASSET_KUBECTL=_test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kubectl \ +# FIXME: The environment variables are required by the test helper in cert-manager, but not required to run the tests. +test: setup-envtest + TEST_ASSET_ETCD=$(LOCALBIN)/k8s/$(ENVTEST_K8S_VERSION)-$(OS)-$(ARCH)/etcd \ + TEST_ASSET_KUBE_APISERVER=$(LOCALBIN)/k8s/$(ENVTEST_K8S_VERSION)-$(OS)-$(ARCH)/kube-apiserver \ + TEST_ASSET_KUBECTL=$(LOCALBIN)/k8s/$(ENVTEST_K8S_VERSION)-$(OS)-$(ARCH)/kubectl \ $(GO) test -v . -_test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH).tar.gz: | _test - curl -fsSL https://go.kubebuilder.io/test-tools/$(KUBEBUILDER_VERSION)/$(OS)/$(ARCH) -o $@ - -_test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/etcd _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kube-apiserver _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kubectl: _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH).tar.gz | _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH) - tar xfO $< kubebuilder/bin/$(notdir $@) > $@ && chmod +x $@ - .PHONY: clean clean: - rm -r _test $(OUT) + chmod -R u+w $(LOCALBIN) $(OUT) 2>/dev/null || true + rm -rf $(LOCALBIN) $(OUT) .PHONY: build build: @@ -41,5 +38,54 @@ $(OUT)/rendered-manifest.yaml: $(HELM_FILES) | $(OUT) --set image.tag=$(IMAGE_TAG) \ deploy/freedns-webhook > $@ -_test $(OUT) _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH): - mkdir -p $@ +## Location to install dependencies to +LOCALBIN ?= $(shell pwd)/bin +$(LOCALBIN): + mkdir -p "$(LOCALBIN)" + +## Tool Binaries + +ENVTEST ?= $(LOCALBIN)/setup-envtest + +#ENVTEST_VERSION is the version of controller-runtime release branch to fetch the envtest setup script (i.e. release-0.20) +ENVTEST_VERSION ?= $(shell v='$(call gomodver,sigs.k8s.io/controller-runtime)'; \ + [ -n "$$v" ] || { echo "Set ENVTEST_VERSION manually (controller-runtime replace has no tag)" >&2; exit 1; }; \ + printf '%s\n' "$$v" | sed -E 's/^v?([0-9]+)\.([0-9]+).*/release-\1.\2/') + +#ENVTEST_K8S_VERSION is the version of Kubernetes to use for setting up ENVTEST binaries (i.e. 1.31) +ENVTEST_K8S_VERSION ?= $(shell v='$(call gomodver,k8s.io/api)'; \ + [ -n "$$v" ] || { echo "Set ENVTEST_K8S_VERSION manually (k8s.io/api replace has no tag)" >&2; exit 1; }; \ + printf '%s\n' "$$v" | sed -E 's/^v?[0-9]+\.([0-9]+).*/1.\1/') + +.PHONY: setup-envtest +setup-envtest: envtest ## Download the binaries required for ENVTEST in the local bin directory. + @echo "Setting up envtest binaries for Kubernetes version $(ENVTEST_K8S_VERSION)..." + @"$(ENVTEST)" use $(ENVTEST_K8S_VERSION) --bin-dir "$(LOCALBIN)" -p path || { \ + echo "Error: Failed to set up envtest binaries for version $(ENVTEST_K8S_VERSION)."; \ + exit 1; \ + } + +.PHONY: envtest +envtest: $(ENVTEST) ## Download setup-envtest locally if necessary. +$(ENVTEST): $(LOCALBIN) + $(call go-install-tool,$(ENVTEST),sigs.k8s.io/controller-runtime/tools/setup-envtest,$(ENVTEST_VERSION)) + +# go-install-tool will 'go install' any package with custom target and name of binary, if it doesn't exist +# $1 - target path with name of binary +# $2 - package url which can be installed +# $3 - specific version of package +define go-install-tool +@[ -f "$(1)-$(3)" ] && [ "$$(readlink -- "$(1)" 2>/dev/null)" = "$(1)-$(3)" ] || { \ +set -e; \ +package=$(2)@$(3) ;\ +echo "Downloading $${package}" ;\ +rm -f "$(1)" ;\ +GOBIN="$(LOCALBIN)" go install $${package} ;\ +mv "$(LOCALBIN)/$$(basename "$(1)")" "$(1)-$(3)" ;\ +} ;\ +ln -sf "$$(realpath "$(1)-$(3)")" "$(1)" +endef + +define gomodver +$(shell go list -m -f '{{if .Replace}}{{.Replace.Version}}{{else}}{{.Version}}{{end}}' $(1) 2>/dev/null) +endef diff --git a/OWNERS b/OWNERS index c0d7290..b72219c 100644 --- a/OWNERS +++ b/OWNERS @@ -4,13 +4,17 @@ approvers: - wallrj - jakexks - maelvls -- irbekrm - inteon +- sgtcodfish +- erikgb +- thatsmrtalbot reviewers: - munnerz - joshvanl - wallrj - jakexks - maelvls -- irbekrm - inteon +- sgtcodfish +- erikgb +- thatsmrtalbot diff --git a/README.md b/README.md index ab2b930..b54245e 100644 --- a/README.md +++ b/README.md @@ -46,10 +46,17 @@ Additionally, the following names can be customized * acme.freedns.afraid.org ### UPDATE -2024-10-30 +## 2026-05-21 +- Merged the latest upstream changes. +- Added `SOCKS5_PROXY` support to work around FreeDNS IP-based blocking. +- Added Helm values support for pinning container images by digest. +- Fixed the logging implementation to use cert-manager’s logging infrastructure correctly. +- Moved the default container image registry from Docker Hub to GHCR. + +## 2024-10-30 - Merged from upstream, now works on 1.31 cluster -2024-11-02 +## 2024-11-02 - Webhook will now properly logs its actions - Removed permissions to read secrets from pod for obvious reansons - Authentication details are now requested from Helm diff --git a/build.env b/build.env new file mode 100644 index 0000000..64e6d22 --- /dev/null +++ b/build.env @@ -0,0 +1,4 @@ +IMAGE_NAME=ghcr.io/tgckpg/cert-manager-webhook-freedns +IMAGE_TAG=2026.05.21.01 + +BUILDX_BUILDER=container-builder diff --git a/data.json b/data.json new file mode 100644 index 0000000..44ffc8d --- /dev/null +++ b/data.json @@ -0,0 +1 @@ +{"props":{"resources":{"repository":[{"name":"actions","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Workflows, workflow runs and artifacts.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-actions","fgp":["Read-only","Read and write"],"human_name":"actions","resource_group":"#repository-permissions-for-actions","title":"Actions"}},{"name":"administration","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Repository creation, deletion, settings, teams, and collaborators.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-administration","fgp":["Read-only","Read and write"],"human_name":"administration","resource_group":"#repository-permissions-for-administration","title":"Administration"}},{"name":"agent_secrets","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage agent repository secrets.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-agent-secrets","fgp":["Read-only","Read and write"],"human_name":"agent secrets","resource_group":"#repository-permissions-for-agent-secrets","title":"Agent secrets"}},{"name":"agent_tasks","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View, create, and manage agent tasks in a repository.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-agent-tasks","fgp":["Read-only","Read and write"],"human_name":"agent tasks","resource_group":"#repository-permissions-for-agent-tasks","title":"Agent tasks"}},{"name":"agent_variables","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage agent repository variables.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-agent-variables","fgp":["Read-only","Read and write"],"human_name":"agent variables","resource_group":"#repository-permissions-for-agent-variables","title":"Agent variables"}},{"name":"artifact_metadata","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Create and retrieve artifact metadata for a repository.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-artifact-metadata","fgp":["Read-only","Read and write"],"human_name":"artifact metadata","resource_group":"#repository-permissions-for-artifact-metadata","title":"Artifact metadata"}},{"name":"attestations","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Create and retrieve attestations for a repository.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-attestations","fgp":["Read-only","Read and write"],"human_name":"attestations api","resource_group":"#repository-permissions-for-attestations","title":"Attestations"}},{"name":"code_quality","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Access and manage code quality data for a repository.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-code-quality","fgp":["Read-only","Read and write"],"human_name":"code quality","resource_group":"#repository-permissions-for-code-quality","title":"Code quality"}},{"name":"security_events","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage code scanning alerts.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-code-scanning-alerts","fgp":["Read-only","Read and write"],"human_name":"security events","resource_group":"#repository-permissions-for-code-scanning-alerts","title":"Code scanning alerts"}},{"name":"codespaces","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Create, edit, delete and list Codespaces.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-codespaces","fgp":["Read-only","Read and write"],"human_name":"codespaces","resource_group":"#repository-permissions-for-codespaces","title":"Codespaces"}},{"name":"codespaces_lifecycle_admin","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage the lifecycle of Codespaces, including starting and stopping.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-codespaces-lifecycle-admin","fgp":["Read-only","Read and write"],"human_name":"codespaces lifecycle admin","resource_group":"#repository-permissions-for-codespaces-lifecycle-admin","title":"Codespaces lifecycle admin"}},{"name":"codespaces_metadata","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Access Codespaces metadata including the devcontainers and machine type.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-codespaces-metadata","fgp":["Read-only"],"human_name":"codespaces metadata","resource_group":"#repository-permissions-for-codespaces-metadata","title":"Codespaces metadata"}},{"name":"codespaces_secrets","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Restrict Codespaces user secrets modifications to specific repositories.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-codespaces-secrets","fgp":["Read and write"],"human_name":"codespaces secrets","resource_group":"#repository-permissions-for-codespaces-secrets","title":"Codespaces secrets"}},{"name":"statuses","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Commit statuses.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-commit-statuses","fgp":["Read-only","Read and write"],"human_name":"commit statuses","resource_group":"#repository-permissions-for-commit-statuses","title":"Commit statuses"}},{"name":"contents","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Repository contents, commits, branches, downloads, releases, and merges.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-contents","fgp":["Read-only","Read and write"],"human_name":"code","resource_group":"#repository-permissions-for-contents","title":"Contents"}},{"name":"copilot_agent_settings","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage Copilot cloud agent settings for a repository.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-copilot-agent-settings","fgp":["Read-only","Read and write"],"human_name":"copilot agent settings","resource_group":"#repository-permissions-for-copilot-agent-settings","title":"Copilot agent settings"}},{"name":"repository_custom_properties","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Read and write repository custom properties values at the repository level, when allowed by the property.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-custom-properties","fgp":["Read-only","Read and write"],"human_name":"custom properties for repositories","resource_group":"#repository-permissions-for-custom-properties","title":"Custom properties"}},{"name":"vulnerability_alerts","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Retrieve Dependabot alerts.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-dependabot-alerts","fgp":["Read-only","Read and write"],"human_name":"Dependabot alerts","resource_group":"#repository-permissions-for-dependabot-alerts","title":"Dependabot alerts"}},{"name":"dependabot_secrets","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Dependabot repository secrets.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-dependabot-secrets","fgp":["Read-only","Read and write"],"human_name":"dependabot secrets","resource_group":"#repository-permissions-for-dependabot-secrets","title":"Dependabot secrets"}},{"name":"deployments","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Deployments and deployment statuses.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-deployments","fgp":["Read-only","Read and write"],"human_name":"deployments","resource_group":"#repository-permissions-for-deployments","title":"Deployments"}},{"name":"discussions","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Discussions and related comments and labels.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-discussions","fgp":["Read-only","Read and write"],"human_name":"discussions","resource_group":"#repository-permissions-for-discussions","title":"Discussions"}},{"name":"environments","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage repository environments.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-environments","fgp":["Read-only","Read and write"],"human_name":"environments","resource_group":"#repository-permissions-for-environments","title":"Environments"}},{"name":"issues","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Issues and related comments, assignees, labels, and milestones.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-issues","fgp":["Read-only","Read and write"],"human_name":"issues","resource_group":"#repository-permissions-for-issues","title":"Issues"}},{"name":"merge_queues","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage a repository's merge queues","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-merge-queues","fgp":["Read-only","Read and write"],"human_name":"merge queues","resource_group":"#repository-permissions-for-merge-queues","title":"Merge queues"}},{"name":"metadata","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Search repositories, list collaborators, and access repository metadata.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-metadata","fgp":["Read-only"],"human_name":"metadata","resource_group":"#repository-permissions-for-metadata","title":"Metadata"}},{"name":"pages","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Retrieve Pages statuses, configuration, and builds, as well as create new builds.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-pages","fgp":["Read-only","Read and write"],"human_name":"pages","resource_group":"#repository-permissions-for-pages","title":"Pages"}},{"name":"pull_requests","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Pull requests and related comments, assignees, labels, milestones, and merges.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-pull-requests","fgp":["Read-only","Read and write"],"human_name":"pull requests","resource_group":"#repository-permissions-for-pull-requests","title":"Pull requests"}},{"name":"repository_advisories","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage repository security advisories.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-repository-security-advisories","fgp":["Read-only","Read and write"],"human_name":"repository advisories","resource_group":"#repository-permissions-for-repository-security-advisories","title":"Repository security advisories"}},{"name":"repo_secret_scanning_dismissal_requests","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage secret scanning alert dismissal requests","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-secret-scanning-alert-dismissal-requests","fgp":["Read-only","Read and write"],"human_name":"secret scanning alert dismissal requests","resource_group":"#repository-permissions-for-secret-scanning-alert-dismissal-requests","title":"Secret scanning alert dismissal requests"}},{"name":"secret_scanning_alerts","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage secret scanning alerts.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-secret-scanning-alerts","fgp":["Read-only","Read and write"],"human_name":"secret scanning alerts","resource_group":"#repository-permissions-for-secret-scanning-alerts","title":"Secret scanning alerts"}},{"name":"secret_scanning_bypass_requests","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Review and manage repository secret scanning push protection bypass requests.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-secret-scanning-push-protection-bypass-requests","fgp":["Read-only","Read and write"],"human_name":"secret scanning push protection bypass requests","resource_group":"#repository-permissions-for-secret-scanning-push-protection-bypass-requests","title":"Secret scanning push protection bypass requests"}},{"name":"secrets","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Actions repository secrets.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-secrets","fgp":["Read-only","Read and write"],"human_name":"secrets","resource_group":"#repository-permissions-for-secrets","title":"Secrets"}},{"name":"actions_variables","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Actions repository variables.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-variables","fgp":["Read-only","Read and write"],"human_name":"actions variables","resource_group":"#repository-permissions-for-variables","title":"Variables"}},{"name":"repository_hooks","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage the post-receive hooks for a repository.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-webhooks","fgp":["Read-only","Read and write"],"human_name":"repository hooks","resource_group":"#repository-permissions-for-webhooks","title":"Webhooks"}},{"name":"workflows","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Update GitHub Action workflow files.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-workflows","fgp":["Read and write"],"human_name":"workflows","resource_group":"#repository-permissions-for-workflows","title":"Workflows"}}],"organization":[{"name":"organization_api_insights","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View statistics on how the API is being used for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-api-insights","fgp":["Read-only"],"human_name":"organization API insights","resource_group":"#organization-permissions-for-api-insights","title":"API Insights"}},{"name":"organization_administration","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage access to an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-administration","fgp":["Read-only","Read and write"],"human_name":"organization administration","resource_group":"#organization-permissions-for-administration","title":"Administration"}},{"name":"organization_agent_secrets","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage agent organization secrets.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-agent-secrets","fgp":["Read-only","Read and write"],"human_name":"organization agent secrets","resource_group":"#organization-permissions-for-agent-secrets","title":"Agent secrets"}},{"name":"organization_agent_variables","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage agent organization variables.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-agent-variables","fgp":["Read-only","Read and write"],"human_name":"organization agent variables","resource_group":"#organization-permissions-for-agent-variables","title":"Agent variables"}},{"name":"organization_user_blocking","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage users blocked by the organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-blocking-users","fgp":["Read-only","Read and write"],"human_name":"organization user blocking","resource_group":"#organization-permissions-for-blocking-users","title":"Blocking users"}},{"name":"organization_campaigns","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage campaigns.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-campaigns","fgp":["Read-only","Read and write"],"human_name":"organization campaigns","resource_group":"#organization-permissions-for-campaigns","title":"Campaigns"}},{"name":"organization_copilot_spaces","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage Copilot Spaces for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-copilot-spaces","fgp":["Read-only","Read and write"],"human_name":"organization copilot spaces","resource_group":"#organization-permissions-for-copilot-spaces","title":"Copilot Spaces"}},{"name":"organization_copilot_agent_settings","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Copilot cloud agent settings for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-copilot-agent-settings","fgp":["Read-only","Read and write"],"human_name":"organization copilot agent settings","resource_group":"#organization-permissions-for-copilot-agent-settings","title":"Copilot agent settings"}},{"name":"org_copilot_content_exclusion","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Copilot content exclusion rules for the organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-copilot-content-exclusion","fgp":["Read-only","Read and write"],"human_name":"organization Copilot content exclusion","resource_group":"#organization-permissions-for-copilot-content-exclusion","title":"Copilot content exclusion"}},{"name":"organization_custom_org_roles","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Create, edit, delete and list custom organization roles. View system organization roles.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-custom-organization-roles","fgp":["Read-only","Read and write"],"human_name":"custom organization roles","resource_group":"#organization-permissions-for-custom-organization-roles","title":"Custom organization roles"}},{"name":"organization_custom_properties","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Read and write repository custom properties values and administer definitions at the organization level.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-custom-properties","fgp":["Read-only","Read and write","Admin"],"human_name":"organization custom properties for repositories","resource_group":"#organization-permissions-for-custom-properties","title":"Custom properties"}},{"name":"custom_properties_for_organizations","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Read and write organization custom properties values at the organization level, when allowed by the property.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-custom-properties-for-organizations","fgp":["Read-only","Read and write"],"human_name":"custom properties for organizations","resource_group":"#organization-permissions-for-custom-properties-for-organizations","title":"Custom properties for organizations"}},{"name":"organization_custom_roles","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Create, edit, delete and list custom repository roles.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-custom-repository-roles","fgp":["Read-only","Read and write"],"human_name":"custom repository roles","resource_group":"#organization-permissions-for-custom-repository-roles","title":"Custom repository roles"}},{"name":"organization_events","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View events triggered by an activity in an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-events","fgp":["Read-only"],"human_name":"organization events","resource_group":"#organization-permissions-for-events","title":"Events"}},{"name":"organization_copilot_seat_management","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Copilot Business seats and settings","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-github-copilot-business","fgp":["Read-only","Read and write"],"human_name":"organization copilot seat management","resource_group":"#organization-permissions-for-github-copilot-business","title":"GitHub Copilot Business"}},{"name":"organization_runner_custom_images","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage hosted runner custom images available to an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-hosted-runner-custom-images","fgp":["Read-only","Read and write"],"human_name":"organization runner custom images","resource_group":"#organization-permissions-for-hosted-runner-custom-images","title":"Hosted runner custom images"}},{"name":"issue_fields","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage issue fields for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-issue-fields","fgp":["Read-only","Read and write"],"human_name":"issue fields","resource_group":"#organization-permissions-for-issue-fields","title":"Issue Fields"}},{"name":"issue_types","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage issue types for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-issue-types","fgp":["Read-only","Read and write"],"human_name":"issue types","resource_group":"#organization-permissions-for-issue-types","title":"Issue Types"}},{"name":"members","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Organization members and teams.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-members","fgp":["Read-only","Read and write"],"human_name":"members","resource_group":"#organization-permissions-for-members","title":"Members"}},{"name":"organization_models","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage model access for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-models","fgp":["Read-only"],"human_name":"models","resource_group":"#organization-permissions-for-models","title":"Models"}},{"name":"organization_network_configurations","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage hosted compute network configurations available to an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-network-configurations","fgp":["Read-only","Read and write"],"human_name":"organization network configurations","resource_group":"#organization-permissions-for-network-configurations","title":"Network configurations"}},{"name":"organization_copilot_metrics","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View organization Copilot metrics.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-copilot-metrics","fgp":["Read-only"],"human_name":"organization copilot metrics","resource_group":"#organization-permissions-for-organization-copilot-metrics","title":"Organization Copilot metrics"}},{"name":"organization_announcement_banners","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and modify announcement banners for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-announcement-banners","fgp":["Read-only","Read and write"],"human_name":"organization announcement banners","resource_group":"#organization-permissions-for-organization-announcement-banners","title":"Organization announcement banners"}},{"name":"organization_secret_scanning_bypass_requests","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Review and manage secret scanning push protection bypass requests.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-bypass-requests-for-secret-scanning","fgp":["Read-only","Read and write"],"human_name":"organization secret scanning push protection bypass requests","resource_group":"#organization-permissions-for-organization-bypass-requests-for-secret-scanning","title":"Organization bypass requests for secret scanning"}},{"name":"organization_codespaces","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Codespaces for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-codespaces","fgp":["Read-only","Read and write"],"human_name":"organization codespaces","resource_group":"#organization-permissions-for-organization-codespaces","title":"Organization codespaces"}},{"name":"organization_codespaces_secrets","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Codespaces Secrets for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-codespaces-secrets","fgp":["Read-only","Read and write"],"human_name":"organization codespaces secrets","resource_group":"#organization-permissions-for-organization-codespaces-secrets","title":"Organization codespaces secrets"}},{"name":"organization_codespaces_settings","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Codespaces settings for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-codespaces-settings","fgp":["Read-only","Read and write"],"human_name":"organization codespaces settings","resource_group":"#organization-permissions-for-organization-codespaces-settings","title":"Organization codespaces settings"}},{"name":"organization_credentials","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage organization credentials","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-credentials","fgp":["Read-only","Read and write"],"human_name":"organization credentials","resource_group":"#organization-permissions-for-organization-credentials","title":"Organization credentials"}},{"name":"organization_dependabot_secrets","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Dependabot organization secrets.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-dependabot-secrets","fgp":["Read-only","Read and write"],"human_name":"organization dependabot secrets","resource_group":"#organization-permissions-for-organization-dependabot-secrets","title":"Organization dependabot secrets"}},{"name":"organization_dependabot_dismissal_requests","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Review and manage Dependabot alert dismissal requests.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-dismissal-requests-for-dependabot","fgp":["Read-only","Read and write"],"human_name":"organization Dependabot dismissal requests","resource_group":"#organization-permissions-for-organization-dismissal-requests-for-dependabot","title":"Organization dismissal requests for Dependabot"}},{"name":"organization_code_scanning_dismissal_requests","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Review and manage code scanning alert dismissal requests.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-dismissal-requests-for-code-scanning","fgp":["Read-only","Read and write"],"human_name":"organization code scanning dismissal requests","resource_group":"#organization-permissions-for-organization-dismissal-requests-for-code-scanning","title":"Organization dismissal requests for code scanning"}},{"name":"organization_private_registries","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage private registries for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-organization-private-registries","fgp":["Read-only","Read and write"],"human_name":"organization private registries","resource_group":"#organization-permissions-for-organization-private-registries","title":"Organization private registries"}},{"name":"organization_plan","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View an organization's plan.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-plan","fgp":["Read-only"],"human_name":"organization plan","resource_group":"#organization-permissions-for-plan","title":"Plan"}},{"name":"organization_projects","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage projects for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-projects","fgp":["Read-only","Read and write","Admin"],"human_name":"organization projects","resource_group":"#organization-permissions-for-projects","title":"Projects"}},{"name":"secret_scanning_dismissal_requests","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Review and manage secret scanning alert dismissal requests","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-secret-scanning-alert-dismissal-requests","fgp":["Read-only","Read and write"],"human_name":"secret scanning alert dismissal requests","resource_group":"#organization-permissions-for-secret-scanning-alert-dismissal-requests","title":"Secret scanning alert dismissal requests"}},{"name":"organization_secrets","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Actions organization secrets.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-secrets","fgp":["Read-only","Read and write"],"human_name":"organization secrets","resource_group":"#organization-permissions-for-secrets","title":"Secrets"}},{"name":"organization_self_hosted_runners","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage Actions self-hosted runners available to an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-self-hosted-runners","fgp":["Read-only","Read and write"],"human_name":"organization self hosted runners","resource_group":"#organization-permissions-for-self-hosted-runners","title":"Self-hosted runners"}},{"name":"organization_actions_variables","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Actions organization variables.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-variables","fgp":["Read-only","Read and write"],"human_name":"organization actions variables","resource_group":"#organization-permissions-for-variables","title":"Variables"}},{"name":"organization_hooks","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage the post-receive hooks for an organization.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#organization-permissions-for-webhooks","fgp":["Read-only","Read and write"],"human_name":"organization hooks","resource_group":"#organization-permissions-for-webhooks","title":"Webhooks"}}],"user":[{"name":"blocking","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage users blocked by the user.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-block-another-user","fgp":["Read-only","Read and write"],"human_name":"blocking","resource_group":"#user-permissions-for-block-another-user","title":"Block another user"}},{"name":"codespaces_user_secrets","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage Codespaces user secrets.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-codespaces-user-secrets","fgp":["Read-only","Read and write"],"human_name":"codespaces user secrets","resource_group":"#user-permissions-for-codespaces-user-secrets","title":"Codespaces user secrets"}},{"name":"copilot_messages","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"This application will receive your GitHub ID, your GitHub Copilot Chat session messages (not including messages sent to another application), and timestamps of provided GitHub Copilot Chat session messages. This permission must be enabled for Copilot Extensions.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-copilot-chat","fgp":["Read-only"],"human_name":"Copilot Chat","resource_group":"#user-permissions-for-copilot-chat","title":"Copilot Chat"}},{"name":"copilot_editor_context","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"This application will receive bits of Editor Context (e.g. currently opened file) whenever you send it a message through Copilot Chat.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-copilot-editor-context","fgp":["Read-only"],"human_name":"Copilot Editor Context","resource_group":"#user-permissions-for-copilot-editor-context","title":"Copilot Editor Context"}},{"name":"user_copilot_requests","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Send Copilot requests.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-copilot-requests","fgp":["Read-only"],"human_name":"user copilot requests","resource_group":"#user-permissions-for-copilot-requests","title":"Copilot Requests"}},{"name":"emails","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage a user's email addresses.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-email-addresses","fgp":["Read-only","Read and write"],"human_name":"email addresses","resource_group":"#user-permissions-for-email-addresses","title":"Email addresses"}},{"name":"user_events","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View events triggered by a user's activity.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-events","fgp":["Read-only"],"human_name":"user events","resource_group":"#user-permissions-for-events","title":"Events"}},{"name":"followers","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"A user's followers","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-followers","fgp":["Read-only","Read and write"],"human_name":"followers","resource_group":"#user-permissions-for-followers","title":"Followers"}},{"name":"gpg_keys","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage a user's GPG keys.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-gpg-keys","fgp":["Read-only","Read and write"],"human_name":"gpg keys","resource_group":"#user-permissions-for-gpg-keys","title":"GPG keys"}},{"name":"gists","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Create and modify a user's gists and comments.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-gists","fgp":["Read and write"],"human_name":"gists","resource_group":"#user-permissions-for-gists","title":"Gists"}},{"name":"keys","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Git SSH keys","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-git-ssh-keys","fgp":["Read-only","Read and write"],"human_name":"keys","resource_group":"#user-permissions-for-git-ssh-keys","title":"Git SSH keys"}},{"name":"interaction_limits","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Interaction limits on repositories","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-interaction-limits","fgp":["Read-only","Read and write"],"human_name":"interaction limits","resource_group":"#user-permissions-for-interaction-limits","title":"Interaction limits"}},{"name":"user_models","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Allows access to GitHub Models.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-models","fgp":["Read-only"],"human_name":"models","resource_group":"#user-permissions-for-models","title":"Models"}},{"name":"plan","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View a user's plan.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-plan","fgp":["Read-only"],"human_name":"plan","resource_group":"#user-permissions-for-plan","title":"Plan"}},{"name":"private_repository_invitations","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View a user's invitations to private repositories","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-private-repository-invitations","fgp":["Read-only"],"human_name":"private repository invitations","resource_group":"#user-permissions-for-private-repository-invitations","title":"Private repository invitations"}},{"name":"profile","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage a user's profile settings.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-profile","fgp":["Read and write"],"human_name":"profile","resource_group":"#user-permissions-for-profile","title":"Profile"}},{"name":"git_signing_ssh_public_keys","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage a user's SSH signing keys.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-ssh-signing-keys","fgp":["Read-only","Read and write"],"human_name":"git signing ssh public keys","resource_group":"#user-permissions-for-ssh-signing-keys","title":"SSH signing keys"}},{"name":"starring","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"List and manage repositories a user is starring.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-starring","fgp":["Read-only","Read and write"],"human_name":"starring","resource_group":"#user-permissions-for-starring","title":"Starring"}},{"name":"watching","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"List and change repositories a user is subscribed to.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#user-permissions-for-watching","fgp":["Read-only","Read and write"],"human_name":"watching","resource_group":"#user-permissions-for-watching","title":"Watching"}}],"business":[{"name":"enterprise_custom_enterprise_roles","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage enterprise custom roles and assignments.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-custom-enterprise-roles","fgp":["Read-only","Read and write"],"human_name":"custom enterprise roles","resource_group":"#enterprise-permissions-for-custom-enterprise-roles","title":"Custom enterprise roles"}},{"name":"enterprise_custom_properties","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View repository custom properties and administer definitions at the enterprise level.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-custom-properties","fgp":["Read-only","Read and write"],"human_name":"enterprise custom properties for repositories","resource_group":"#enterprise-permissions-for-custom-properties","title":"Custom properties"}},{"name":"enterprise_ai_controls","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage enterprise-wide AI controls configuration","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-enterprise-ai-controls","fgp":["Read-only","Read and write"],"human_name":"enterprise AI controls","resource_group":"#enterprise-permissions-for-enterprise-ai-controls","title":"Enterprise AI controls"}},{"name":"enterprise_copilot_metrics","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View enterprise Copilot metrics.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-enterprise-copilot-metrics","fgp":["Read-only"],"human_name":"enterprise copilot metrics","resource_group":"#enterprise-permissions-for-enterprise-copilot-metrics","title":"Enterprise Copilot metrics"}},{"name":"enterprise_credentials","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage enterprise credentials","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-enterprise-credentials","fgp":["Read-only","Read and write"],"human_name":"enterprise credentials","resource_group":"#enterprise-permissions-for-enterprise-credentials","title":"Enterprise credentials"}},{"name":"enterprise_custom_org_roles","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Create, edit, delete and list custom organization roles at the enterprise level. View system organization roles.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-enterprise-custom-organization-roles","fgp":["Read-only","Read and write"],"human_name":"enterprise custom organization roles","resource_group":"#enterprise-permissions-for-enterprise-custom-organization-roles","title":"Enterprise custom organization roles"}},{"name":"enterprise_custom_properties_for_organizations","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View organization custom properties and administer definitions at the enterprise level.","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-enterprise-custom-properties-for-organizations","fgp":["Read-only","Read and write","Admin"],"human_name":"enterprise custom properties for organizations","resource_group":"#enterprise-permissions-for-enterprise-custom-properties-for-organizations","title":"Enterprise custom properties for organizations"}},{"name":"enterprise_organizations","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Create and remove enterprise organizations","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-enterprise-organizations","fgp":["Read and write"],"human_name":"enterprise organizations","resource_group":"#enterprise-permissions-for-enterprise-organizations","title":"Enterprise organizations"}},{"name":"enterprise_people","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"Manage user access to the enterprise","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-enterprise-people","fgp":["Read-only","Read and write"],"human_name":"enterprise people","resource_group":"#enterprise-permissions-for-enterprise-people","title":"Enterprise people"}},{"name":"enterprise_sso","metadata":{"actions":{"none":"No access","read":"Read-only","write":"Read and write","admin":"Admin"},"description":"View and manage enterprise single sign-on configuration","docs_url":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#enterprise-permissions-for-enterprise-single-sign-on","fgp":["Read-only","Read and write"],"human_name":"enterprise single sign-on configuration","resource_group":"#enterprise-permissions-for-enterprise-single-sign-on","title":"Enterprise single sign-on"}}]},"view":{"disabledForAllActions":false,"grantedPermissions":{"repository":{},"organization":{},"user":{},"business":{}},"integrationView":false,"resourceDocsUrl":"https://docs.github.com/rest/overview/permissions-required-for-fine-grained-personal-access-tokens"},"showSections":{"repository":false,"organization":false,"user":true,"enterprise":false},"appMode":null}} \ No newline at end of file diff --git a/deploy/freedns-webhook/values.yaml b/deploy/freedns-webhook/values.yaml index 137c488..a0bca56 100644 --- a/deploy/freedns-webhook/values.yaml +++ b/deploy/freedns-webhook/values.yaml @@ -1,11 +1,13 @@ -# The GroupName here is used to identify your company or business unit that -# created this webhook. -# For freedns, this may be "acme.freedns.afraid.org". -# This name will need to be referenced in each Issuer's `webhook` stanza to +# The groupName avoids naming conflicts on the Kubernetes API, it should be set by the +# author of the webhook a unique domain that the author owns. For +# example: some-provider-webhook.mycompany.tld , or +# some-provider-webhook.mypersonalsite.tld if your webhook is a personal open-source +# project. +# Once set to a unique domain name by the webhook author, it does not need to be further +# adjusted by the users of a webhook chart! +# The name will need to be referenced in each Issuer's `webhook` stanza to # inform cert-manager of where to send ChallengePayload resources in order to # solve the DNS01 challenge. -# This group name should be **unique**, hence using your own company's domain -# here is recommended. groupName: acme.freedns.afraid.org certManager: @@ -13,8 +15,8 @@ certManager: serviceAccountName: cert-manager image: - repository: penguinade/cert-manager-webhook-freedns - tag: 2024.11.02.05 + repository: ghcr.io/tgckpg/cert-manager-webhook-freedns + tag: 2026.05.21.01 pullPolicy: IfNotPresent nameOverride: "" diff --git a/freedns/buildinfo_gen.go b/freedns/buildinfo_gen.go new file mode 100644 index 0000000..ed9f890 --- /dev/null +++ b/freedns/buildinfo_gen.go @@ -0,0 +1,6 @@ +package freedns + +const ( + IMAGE_TAG = "2026.05.21.01" + Timestamp = "20260521.170618" +) diff --git a/freedns/freedns.go b/freedns/freedns.go index ffe2771..86bbf65 100755 --- a/freedns/freedns.go +++ b/freedns/freedns.go @@ -14,6 +14,7 @@ import ( "strings" logf "github.com/cert-manager/cert-manager/pkg/logs" + logr "github.com/go-logr/logr" "golang.org/x/net/html" "golang.org/x/net/proxy" ) @@ -30,6 +31,7 @@ type FreeDNS struct { AuthCookie *http.Cookie DomainId string LoggedOut bool + Logger logr.Logger } type contextDialer interface { @@ -152,7 +154,6 @@ func (dnsObj *FreeDNS) Login(Username string, Password string) error { if err != nil { return err } - fmt.Println(err) if strings.Contains(respString, "Invalid UserID/Pass") { return errors.New("Invalid UserID/Pass") @@ -211,7 +212,7 @@ loop: break loop case html.TextToken: if inBold && strings.TrimSpace(htmlTokens.Token().Data) == DomainName { - logf.V(logf.InfoLevel).Info(fmt.Sprintf("Found HTMLTextNode that contains \"%s\", try looking for domain id", DomainName)) + dnsObj.Logger.V(logf.InfoLevel).Info(fmt.Sprintf("Found HTMLTextNode that contains \"%s\", try looking for domain id", DomainName)) lookForA = true } // The [Manage] anchor is next to the bold tag @@ -226,7 +227,7 @@ loop: _href := string(attrValue) if string(attrKey) == "href" && strings.HasPrefix(_href, "/subdomain/?limit=") { dnsObj.DomainId = strings.TrimPrefix(_href, "/subdomain/?limit=") - logf.V(logf.InfoLevel).Info(fmt.Sprintf("Domain id for \"%s\" is %s", DomainName, dnsObj.DomainId)) + dnsObj.Logger.V(logf.InfoLevel).Info(fmt.Sprintf("Domain id for \"%s\" is %s", DomainName, dnsObj.DomainId)) break loop } if !moreAttr { @@ -249,7 +250,7 @@ func (dnsObj *FreeDNS) AddRecord(RecordType string, Subdomain string, Address st return errors.New("No domain selected") } - logf.V(logf.InfoLevel).Info(fmt.Sprintf("Adding %s Record: %s %s", RecordType, Subdomain, Address)) + dnsObj.Logger.V(logf.InfoLevel).Info(fmt.Sprintf("Adding %s Record: %s %s", RecordType, Subdomain, Address)) recordData := url.Values{} recordData.Set("type", RecordType) @@ -270,7 +271,7 @@ func (dnsObj *FreeDNS) AddRecord(RecordType string, Subdomain string, Address st // Record already exists, treat this as success if strings.Contains(respStr, "already have another already existent") { - logf.V(logf.InfoLevel).Info("Record already exists") + dnsObj.Logger.V(logf.InfoLevel).Info("Record already exists") return nil } @@ -330,7 +331,7 @@ func (dnsObj *FreeDNS) AddRecord(RecordType string, Subdomain string, Address st } if strings.HasPrefix(_Location.Path, "/zc.php") { - logf.V(logf.DebugLevel).Info("Error on AddRecord: Cookie expired") + dnsObj.Logger.V(logf.DebugLevel).Info("Error on AddRecord: Cookie expired") return errors.New("dns_cookie maybe expired") } @@ -339,7 +340,7 @@ func (dnsObj *FreeDNS) AddRecord(RecordType string, Subdomain string, Address st func (dnsObj *FreeDNS) DeleteRecord(RecordId string) error { - logf.V(logf.InfoLevel).Info(fmt.Sprintf("(id=%s) Removing Record", RecordId)) + dnsObj.Logger.V(logf.InfoLevel).Info(fmt.Sprintf("(id=%s) Removing Record", RecordId)) resp, _, err := _HttpRequest("GET", fmt.Sprintf(URI_DELETE_RECORD, RecordId), nil, dnsObj.AuthCookie) if err != nil { @@ -443,7 +444,7 @@ loop: // Begin deep search for truncated records htmlAddr := strings.ReplaceAll(html.EscapeString(Address), """, """) for _, RecordId := range DeepSearchCandidates { - logf.V(logf.DebugLevel).Info("Searching in " + RecordId) + dnsObj.Logger.V(logf.DebugLevel).Info("Searching in " + RecordId) _, respStr, err := _HttpRequest("GET", URI_SUBDOMAIN_EDIT+RecordId, nil, dnsObj.AuthCookie) if err != nil { continue diff --git a/go.mod b/go.mod index b9b94c0..26e5616 100644 --- a/go.mod +++ b/go.mod @@ -1,110 +1,114 @@ module github.com/cert-manager/webhook-freedns -go 1.22.0 +go 1.25.0 require ( - github.com/cert-manager/cert-manager v1.15.1 - github.com/miekg/dns v1.1.61 - github.com/stretchr/testify v1.9.0 - k8s.io/apiextensions-apiserver v0.30.2 - k8s.io/client-go v0.30.2 + github.com/cert-manager/cert-manager v1.20.2 + github.com/miekg/dns v1.1.72 + github.com/stretchr/testify v1.11.1 + k8s.io/apiextensions-apiserver v0.35.4 + k8s.io/client-go v0.35.4 ) require ( + cel.dev/expr v0.25.1 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.12.0 // indirect - github.com/evanphx/json-patch v5.9.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/jsonpointer v0.22.4 // indirect + github.com/go-openapi/jsonreference v0.21.4 // indirect + github.com/go-openapi/swag v0.23.1 // indirect + github.com/go-openapi/swag/jsonname v0.25.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/cel-go v0.17.8 // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/cel-go v0.26.0 // indirect + github.com/google/gnostic-models v0.7.1 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/imdario/mergo v0.3.16 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/mailru/easyjson v0.9.1 // 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.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.18.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.46.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/stoewer/go-strcase v1.3.0 // indirect - go.etcd.io/etcd/api/v3 v3.5.13 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.13 // indirect - go.etcd.io/etcd/client/v3 v3.5.13 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 // indirect - go.opentelemetry.io/otel v1.26.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 // indirect - go.opentelemetry.io/otel/metric v1.26.0 // indirect - go.opentelemetry.io/otel/sdk v1.26.0 // indirect - go.opentelemetry.io/otel/trace v1.26.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/procfs v0.17.0 // indirect + github.com/spf13/cobra v1.10.2 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/stoewer/go-strcase v1.3.1 // indirect + github.com/x448/float16 v0.8.4 // indirect + go.etcd.io/etcd/api/v3 v3.6.5 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.6.5 // indirect + go.etcd.io/etcd/client/v3 v3.6.5 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.24.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/term v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.22.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240515191416-fc5f0ca64291 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect - google.golang.org/grpc v1.64.1 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.uber.org/zap v1.27.1 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.50.0 // indirect + golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect + golang.org/x/mod v0.34.0 // indirect + golang.org/x/net v0.53.0 // indirect + golang.org/x/oauth2 v0.35.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/term v0.42.0 // indirect + golang.org/x/text v0.36.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.43.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7 // indirect + google.golang.org/grpc v1.79.3 // indirect + google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.30.2 // indirect - k8s.io/apimachinery v0.30.2 // indirect - k8s.io/apiserver v0.30.2 // indirect - k8s.io/component-base v0.30.2 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kms v0.30.2 // indirect - k8s.io/kube-openapi v0.0.0-20240430033511-f0e62f92d13f // indirect - k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect - sigs.k8s.io/controller-runtime v0.18.2 // indirect - sigs.k8s.io/gateway-api v1.1.0 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect + k8s.io/api v0.35.4 // indirect + k8s.io/apimachinery v0.35.4 // indirect + k8s.io/apiserver v0.35.4 // indirect + k8s.io/component-base v0.35.4 // indirect + k8s.io/klog/v2 v2.140.0 // indirect + k8s.io/kms v0.35.4 // indirect + k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 // indirect + k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect + sigs.k8s.io/controller-runtime v0.23.1 // indirect + sigs.k8s.io/gateway-api v1.5.0 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index 52239a3..d1a9e57 100644 --- a/go.sum +++ b/go.sum @@ -1,304 +1,323 @@ +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= +github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cert-manager/cert-manager v1.15.1 h1:HSG4k2GlJ2YgTLkZfQzrArNaQpM9+ehDDg550IxAD94= -github.com/cert-manager/cert-manager v1.15.1/go.mod h1:p98JoGv3J9JhdKU9ngsj2EhWGI6/GlU7kpjWu5lf2js= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cert-manager/cert-manager v1.20.2 h1:CimnY00nLqB2lmxhoSuEC4GDMFDK7JCXqyjwMM9ndIQ= +github.com/cert-manager/cert-manager v1.20.2/go.mod h1:1g/+a/WK5zWH/dXPZa3dMD3aJQJNRXQu+PN17C6WrOw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= -github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= -github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= -github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4= +github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80= +github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8= +github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4= +github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= +github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= +github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= +github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.17.8 h1:j9m730pMZt1Fc4oKhCLUHfjj6527LuhYcYw0Rl8gqto= -github.com/google/cel-go v0.17.8/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= +github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c= +github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 h1:FbSCl+KggFl+Ocym490i/EyXF4lPgLoUtcSWquBM0Rs= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= +github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= -github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/mailru/easyjson v0.9.1 h1:LbtsOm5WAswyWbvTEOqhypdPeZzHavpZx96/n553mR8= +github.com/mailru/easyjson v0.9.1/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI= +github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= -github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= -github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= -github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/onsi/ginkgo/v2 v2.28.0 h1:Rrf+lVLmtlBIKv6KrIGJCjyY8N36vDVcutbGJkyqjJc= +github.com/onsi/ginkgo/v2 v2.28.0/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= +github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= +github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= -github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= -github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= +github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 h1:S2dVYn90KE98chqDkyE9Z4N61UnQd+KOfgp5Iu53llk= +github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= -go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd/api/v3 v3.5.13 h1:8WXU2/NBge6AUF1K1gOexB6e07NgsN1hXK0rSTtgSp4= -go.etcd.io/etcd/api/v3 v3.5.13/go.mod h1:gBqlqkcMMZMVTMm4NDZloEVJzxQOQIls8splbqBDa0c= -go.etcd.io/etcd/client/pkg/v3 v3.5.13 h1:RVZSAnWWWiI5IrYAXjQorajncORbS0zI48LQlE2kQWg= -go.etcd.io/etcd/client/pkg/v3 v3.5.13/go.mod h1:XxHT4u1qU12E2+po+UVPrEeL94Um6zL58ppuJWXSAB8= -go.etcd.io/etcd/client/v2 v2.305.10 h1:MrmRktzv/XF8CvtQt+P6wLUlURaNpSDJHFZhe//2QE4= -go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= -go.etcd.io/etcd/client/v3 v3.5.13 h1:o0fHTNJLeO0MyVbc7I3fsCf6nrOqn5d+diSarKnB2js= -go.etcd.io/etcd/client/v3 v3.5.13/go.mod h1:cqiAeY8b5DEEcpxvgWKsbLIWNM/8Wy2xJSDMtioMcoI= -go.etcd.io/etcd/pkg/v3 v3.5.10 h1:WPR8K0e9kWl1gAhB5A7gEa5ZBTNkT9NdNWrR8Qpo1CM= -go.etcd.io/etcd/pkg/v3 v3.5.10/go.mod h1:TKTuCKKcF1zxmfKWDkfz5qqYaE3JncKKZPFf8c1nFUs= -go.etcd.io/etcd/raft/v3 v3.5.10 h1:cgNAYe7xrsrn/5kXMSaH8kM/Ky8mAdMqGOxyYwpP0LA= -go.etcd.io/etcd/raft/v3 v3.5.10/go.mod h1:odD6kr8XQXTy9oQnyMPBOr0TVe+gT0neQhElQ6jbGRc= -go.etcd.io/etcd/server/v3 v3.5.10 h1:4NOGyOwD5sUZ22PiWYKmfxqoeh72z6EhYjNosKGLmZg= -go.etcd.io/etcd/server/v3 v3.5.10/go.mod h1:gBplPHfs6YI0L+RpGkTQO7buDbHv5HJGG/Bst0/zIPo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 h1:A3SayB3rNyt+1S6qpI9mHPkeHTZbD7XILEqWnYZb2l0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0/go.mod h1:27iA5uvhuRNmalO+iEUdVn5ZMj2qy10Mm+XRIpRmyuU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 h1:Xs2Ncz0gNihqu9iosIZ5SkBbWo5T8JhhLJFMQL1qmLI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0/go.mod h1:vy+2G/6NvVMpwGX/NyLqcC41fxepnuKHk16E6IZUcJc= -go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= -go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0/go.mod h1:z46paqbJ9l7c9fIPCXTqTGwhQZ5XoTIsfeFYWboizjs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 h1:Waw9Wfpo/IXzOI8bCB7DIk+0JZcqqsyn1JFnAc+iam8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0/go.mod h1:wnJIG4fOqyynOnnQF/eQb4/16VlX2EJAHhHgqIqWfAo= -go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= -go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= -go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= -go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= -go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= -go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= +go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= +go.etcd.io/etcd/api/v3 v3.6.5 h1:pMMc42276sgR1j1raO/Qv3QI9Af/AuyQUW6CBAWuntA= +go.etcd.io/etcd/api/v3 v3.6.5/go.mod h1:ob0/oWA/UQQlT1BmaEkWQzI0sJ1M0Et0mMpaABxguOQ= +go.etcd.io/etcd/client/pkg/v3 v3.6.5 h1:Duz9fAzIZFhYWgRjp/FgNq2gO1jId9Yae/rLn3RrBP8= +go.etcd.io/etcd/client/pkg/v3 v3.6.5/go.mod h1:8Wx3eGRPiy0qOFMZT/hfvdos+DjEaPxdIDiCDUv/FQk= +go.etcd.io/etcd/client/v3 v3.6.5 h1:yRwZNFBx/35VKHTcLDeO7XVLbCBFbPi+XV4OC3QJf2U= +go.etcd.io/etcd/client/v3 v3.6.5/go.mod h1:ZqwG/7TAFZ0BJ0jXRPoJjKQJtbFo/9NIY8uoFFKcCyo= +go.etcd.io/etcd/pkg/v3 v3.6.5 h1:byxWB4AqIKI4SBmquZUG1WGtvMfMaorXFoCcFbVeoxM= +go.etcd.io/etcd/pkg/v3 v3.6.5/go.mod h1:uqrXrzmMIJDEy5j00bCqhVLzR5jEJIwDp5wTlLwPGOU= +go.etcd.io/etcd/server/v3 v3.6.5 h1:4RbUb1Bd4y1WkBHmuF+cZII83JNQMuNXzyjwigQ06y0= +go.etcd.io/etcd/server/v3 v3.6.5/go.mod h1:PLuhyVXz8WWRhzXDsl3A3zv/+aK9e4A9lpQkqawIaH0= +go.etcd.io/raft/v3 v3.6.0 h1:5NtvbDVYpnfZWcIHgGRk9DyzkBIXOi8j+DDp1IcnUWQ= +go.etcd.io/raft/v3 v3.6.0/go.mod h1:nLvLevg6+xrVtHUmVaTcTz603gQPHfh7kUAwV6YpfGo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= +go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= +golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= +golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= +golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= +golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= +golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= -gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda h1:wu/KJm9KJwpfHWhkkZGohVC6KRrc1oJNr4jwtQMOQXw= -google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= -google.golang.org/genproto/googleapis/api v0.0.0-20240515191416-fc5f0ca64291 h1:4HZJ3Xv1cmrJ+0aFo304Zn79ur1HMxptAE7aCPNLSqc= -google.golang.org/genproto/googleapis/api v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 h1:AgADTJarZTBqgjiUzRgfaBchgYB3/WFTC80GPwsMcRI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= -google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= +gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 h1:merA0rdPeUV3YIIfHHcH4qBkiQAc1nfCKSI7lB4cV2M= +google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409/go.mod h1:fl8J1IvUjCilwZzQowmw2b7HQB2eAuYBabMXzWurF+I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7 h1:ndE4FoJqsIceKP2oYSnUZqhTdYufCYYkqwtFzfrhI7w= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.30.2 h1:+ZhRj+28QT4UOH+BKznu4CBgPWgkXO7XAvMcMl0qKvI= -k8s.io/api v0.30.2/go.mod h1:ULg5g9JvOev2dG0u2hig4Z7tQ2hHIuS+m8MNZ+X6EmI= -k8s.io/apiextensions-apiserver v0.30.2 h1:l7Eue2t6QiLHErfn2vwK4KgF4NeDgjQkCXtEbOocKIE= -k8s.io/apiextensions-apiserver v0.30.2/go.mod h1:lsJFLYyK40iguuinsb3nt+Sj6CmodSI4ACDLep1rgjw= -k8s.io/apimachinery v0.30.2 h1:fEMcnBj6qkzzPGSVsAZtQThU62SmQ4ZymlXRC5yFSCg= -k8s.io/apimachinery v0.30.2/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/apiserver v0.30.2 h1:ACouHiYl1yFI2VFI3YGM+lvxgy6ir4yK2oLOsLI1/tw= -k8s.io/apiserver v0.30.2/go.mod h1:BOTdFBIch9Sv0ypSEcUR6ew/NUFGocRFNl72Ra7wTm8= -k8s.io/client-go v0.30.2 h1:sBIVJdojUNPDU/jObC+18tXWcTJVcwyqS9diGdWHk50= -k8s.io/client-go v0.30.2/go.mod h1:JglKSWULm9xlJLx4KCkfLLQ7XwtlbflV6uFFSHTMgVs= -k8s.io/component-base v0.30.2 h1:pqGBczYoW1sno8q9ObExUqrYSKhtE5rW3y6gX88GZII= -k8s.io/component-base v0.30.2/go.mod h1:yQLkQDrkK8J6NtP+MGJOws+/PPeEXNpwFixsUI7h/OE= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.30.2 h1:VSZILO/tkzrz5Tu2j+yFQZ2Dc5JerQZX2GqhFJbQrfw= -k8s.io/kms v0.30.2/go.mod h1:GrMurD0qk3G4yNgGcsCEmepqf9KyyIrTXYR2lyUOJC4= -k8s.io/kube-openapi v0.0.0-20240430033511-f0e62f92d13f h1:0LQagt0gDpKqvIkAMPaRGcXawNMouPECM1+F9BVxEaM= -k8s.io/kube-openapi v0.0.0-20240430033511-f0e62f92d13f/go.mod h1:S9tOR0FxgyusSNR+MboCuiDpVWkAifZvaYI1Q2ubgro= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.18.2 h1:RqVW6Kpeaji67CY5nPEfRz6ZfFMk0lWQlNrLqlNpx+Q= -sigs.k8s.io/controller-runtime v0.18.2/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= -sigs.k8s.io/gateway-api v1.1.0 h1:DsLDXCi6jR+Xz8/xd0Z1PYl2Pn0TyaFMOPPZIj4inDM= -sigs.k8s.io/gateway-api v1.1.0/go.mod h1:ZH4lHrL2sDi0FHZ9jjneb8kKnGzFWyrTya35sWUTrRs= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +k8s.io/api v0.35.4 h1:P7nFYKl5vo9AGUp1Z+Pmd3p2tA7bX2wbFWCvDeRv988= +k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU= +k8s.io/apiextensions-apiserver v0.35.4 h1:HeP+Upp7ItdvnyGmub0yoix+2z5+ev4M5cE5TCgtOUU= +k8s.io/apiextensions-apiserver v0.35.4/go.mod h1:ogQlk+stIE8mnoRthSYCwlOS12fVqgWFiErMwPaXA7c= +k8s.io/apimachinery v0.35.4 h1:xtdom9RG7e+yDp71uoXoJDWEE2eOiHgeO4GdBzwWpds= +k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc= +k8s.io/apiserver v0.35.4 h1:vtuFqNFmF9bPRdHDL2lpK6qCTPWDreZJL4LRPwVM6ho= +k8s.io/apiserver v0.35.4/go.mod h1:JnBcb+J8kFXKpZkgcbcUnPBBHi4qgBii1I7dLxFY/oo= +k8s.io/client-go v0.35.4 h1:DN6fyaGuzK64UvnKO5fOA6ymSjvfGAnCAHAR0C66kD8= +k8s.io/client-go v0.35.4/go.mod h1:2Pg9WpsS4NeOpoYTfHHfMxBG8zFMSAUi4O/qoiJC3nY= +k8s.io/component-base v0.35.4 h1:6n1tNJ87johN0Hif0Fs8K2GMthsaUwMqCebUDLYyv7U= +k8s.io/component-base v0.35.4/go.mod h1:qaDJgz5c1KYKla9occFmlJEfPpkuA55s90G509R+PeY= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kms v0.35.4 h1:0eE6Zd4nACEs8cc7qCxf3UwMAtgM87X8doj+pJCxJk0= +k8s.io/kms v0.35.4/go.mod h1:c/uQe/eKrWdBkvizLFW+ThLA6tTzR0RkkwJJyzDRT1g= +k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 h1:HhDfevmPS+OalTjQRKbTHppRIz01AWi8s45TMXStgYY= +k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/controller-runtime v0.23.1 h1:TjJSM80Nf43Mg21+RCy3J70aj/W6KyvDtOlpKf+PupE= +sigs.k8s.io/controller-runtime v0.23.1/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= +sigs.k8s.io/gateway-api v1.5.0 h1:duoo14Ky/fJXpjpmyMISE2RTBGnfCg8zICfTYLTnBJA= +sigs.k8s.io/gateway-api v1.5.0/go.mod h1:GvCETiaMAlLym5CovLxGjS0NysqFk3+Yuq3/rh6QL2o= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/image.Makefile b/image.Makefile index acffdcf..f64dcf4 100644 --- a/image.Makefile +++ b/image.Makefile @@ -1,7 +1,12 @@ -IMAGE_NAME := penguinade/cert-manager-webhook-freedns -IMAGE_TAG := dev +include build.env +-include build.env.work +export -BUILDX_BUILDER := container-builder +IMAGE_NAME ?= webhook +IMAGE_TAG ?= dev + +BUILDX_BUILDER ?= container-builder +BUILDINFO_FILE := freedns/buildinfo_gen.go ensure-buildx: @if ! docker buildx inspect $(BUILDX_BUILDER) >/dev/null 2>&1; then \ @@ -16,17 +21,31 @@ ensure-buildx: docker buildx use $(BUILDX_BUILDER); \ fi -build: ensure-buildx +.buildinfo: + @mkdir -p $(dir $(BUILDINFO_FILE)) + @printf '%s\n' \ + 'package freedns' \ + '' \ + 'const (' \ + ' IMAGE_TAG = "$(IMAGE_TAG)"' \ + ' Timestamp = "'$$(TZ=UTC date +%Y%m%d.%H%M%S)'"' \ + ')' \ + > $(BUILDINFO_FILE) + +build: .buildinfo ensure-buildx docker buildx build \ --platform linux/amd64,linux/arm64 \ -f Dockerfile \ -t $(IMAGE_NAME):$(IMAGE_TAG) . -push: ensure-buildx +push: .buildinfo ensure-buildx docker buildx build \ --platform linux/amd64,linux/arm64 \ -f Dockerfile \ -t $(IMAGE_NAME):$(IMAGE_TAG) \ --push . -.PHONY: push +inspect: + docker buildx imagetools inspect $(IMAGE_NAME):$(IMAGE_TAG) + +.PHONY: push build .buildinfo diff --git a/main.go b/main.go index 7f16f30..8c4d4d5 100644 --- a/main.go +++ b/main.go @@ -10,16 +10,18 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" - logf "github.com/cert-manager/cert-manager/pkg/logs" - "github.com/cert-manager/webhook-freedns/freedns" "github.com/cert-manager/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1" "github.com/cert-manager/cert-manager/pkg/acme/webhook/cmd" + logf "github.com/cert-manager/cert-manager/pkg/logs" + "github.com/cert-manager/webhook-freedns/freedns" ) var GroupName = os.Getenv("GROUP_NAME") var UserName = os.Getenv("FREEDNS_USERNAME") var Password = os.Getenv("FREEDNS_PASSWORD") +var logger = logf.Log.WithName("freedns") + func main() { if GroupName == "" { panic("GROUP_NAME must be specified") @@ -97,7 +99,9 @@ func (c *customDNSProviderSolver) Name() string { // cert-manager itself will later perform a self check to ensure that the // solver has correctly configured the DNS provider. func (c *customDNSProviderSolver) Present(ch *v1alpha1.ChallengeRequest) error { - dnsObj := freedns.FreeDNS{} + dnsObj := freedns.FreeDNS{ + Logger: logger, + } err := dnsObj.Login(UserName, Password) if err != nil { return err @@ -141,7 +145,7 @@ func (c *customDNSProviderSolver) CleanUp(ch *v1alpha1.ChallengeRequest) error { _key := "\"" + ch.Key + "\"" _id, err := c.freedns.FindRecord(_addr, "TXT", _key) - logf.V(logf.InfoLevel).Info(fmt.Sprintf("(id=%s) TXT Record: %s %s", _id, _addr, _key)) + logger.V(logf.InfoLevel).Info(fmt.Sprintf("(id=%s) TXT Record: %s %s", _id, _addr, _key)) if _id != "" { err = c.freedns.DeleteRecord(_id) @@ -172,6 +176,8 @@ func (c *customDNSProviderSolver) Initialize(kubeClientConfig *rest.Config, stop } c.client = cl + logger.V(logf.InfoLevel).Info("FreeDNS webhook starting", "build", freedns.Timestamp, "tag", freedns.IMAGE_TAG) + ///// END OF CODE TO MAKE KUBERNETES CLIENTSET AVAILABLE return nil } diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..6c362bc --- /dev/null +++ b/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "local>cert-manager/renovate-config" + ] +}