Merge branch 'master' into gh-802
This commit is contained in:
commit
cc42a09b5e
|
@ -4,7 +4,7 @@ jobs:
|
||||||
check:
|
check:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go-version: [1.19.x]
|
go-version: [1.21.x]
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
|
|
|
@ -143,7 +143,7 @@ if [[ ! -z "$CODE_SIGN_NAME" ]]; then
|
||||||
codesign -s "${CODE_SIGN_NAME}" -f -v --timestamp --options runtime ${BINARY_NAME}
|
codesign -s "${CODE_SIGN_NAME}" -f -v --timestamp --options runtime ${BINARY_NAME}
|
||||||
|
|
||||||
# notarize the binary
|
# notarize the binary
|
||||||
# TODO: https://jira.cfdata.org/browse/TUN-5789
|
# TODO: TUN-5789
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# creating build directory
|
# creating build directory
|
||||||
|
@ -169,7 +169,7 @@ if [[ ! -z "$PKG_SIGN_NAME" ]]; then
|
||||||
${PKGNAME}
|
${PKGNAME}
|
||||||
|
|
||||||
# notarize the package
|
# notarize the package
|
||||||
# TODO: https://jira.cfdata.org/browse/TUN-5789
|
# TODO: TUN-5789
|
||||||
else
|
else
|
||||||
pkgbuild --identifier com.cloudflare.${PRODUCT} \
|
pkgbuild --identifier com.cloudflare.${PRODUCT} \
|
||||||
--version ${VERSION} \
|
--version ${VERSION} \
|
|
@ -0,0 +1,15 @@
|
||||||
|
cd /tmp/
|
||||||
|
rm -rf go
|
||||||
|
rm -rf gocache
|
||||||
|
export GOCACHE=/tmp/gocache
|
||||||
|
|
||||||
|
git clone -q https://github.com/cloudflare/go
|
||||||
|
cd go/src
|
||||||
|
# https://github.com/cloudflare/go/tree/34129e47042e214121b6bbff0ded4712debed18e is version go1.21.5-devel-cf
|
||||||
|
git checkout -q 34129e47042e214121b6bbff0ded4712debed18e
|
||||||
|
./make.bash
|
||||||
|
|
||||||
|
export PATH="/tmp/go/bin:$PATH"
|
||||||
|
go version
|
||||||
|
which go
|
||||||
|
go env
|
|
@ -0,0 +1,28 @@
|
||||||
|
Set-StrictMode -Version Latest
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$ProgressPreference = "SilentlyContinue"
|
||||||
|
|
||||||
|
# Relative path to working directory
|
||||||
|
$CloudflaredDirectory = "go\src\github.com\cloudflare\cloudflared"
|
||||||
|
|
||||||
|
cd $CloudflaredDirectory
|
||||||
|
|
||||||
|
Write-Output "Building for amd64"
|
||||||
|
$env:TARGET_OS = "windows"
|
||||||
|
$env:CGO_ENABLED = 1
|
||||||
|
$env:TARGET_ARCH = "amd64"
|
||||||
|
$env:Path = "$Env:Temp\go\bin;$($env:Path)"
|
||||||
|
|
||||||
|
go env
|
||||||
|
go version
|
||||||
|
|
||||||
|
& make cloudflared
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw "Failed to build cloudflared for amd64" }
|
||||||
|
copy .\cloudflared.exe .\cloudflared-windows-amd64.exe
|
||||||
|
|
||||||
|
Write-Output "Building for 386"
|
||||||
|
$env:CGO_ENABLED = 0
|
||||||
|
$env:TARGET_ARCH = "386"
|
||||||
|
make cloudflared
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw "Failed to build cloudflared for 386" }
|
||||||
|
copy .\cloudflared.exe .\cloudflared-windows-386.exe
|
|
@ -0,0 +1,82 @@
|
||||||
|
Set-StrictMode -Version Latest
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$ProgressPreference = "SilentlyContinue"
|
||||||
|
|
||||||
|
$WorkingDirectory = Get-Location
|
||||||
|
$CloudflaredDirectory = "$WorkingDirectory\go\src\github.com\cloudflare\cloudflared"
|
||||||
|
|
||||||
|
Write-Output "Installing python..."
|
||||||
|
|
||||||
|
$PythonVersion = "3.10.11"
|
||||||
|
$PythonZipFile = "$env:Temp\python-$PythonVersion-embed-amd64.zip"
|
||||||
|
$PipInstallFile = "$env:Temp\get-pip.py"
|
||||||
|
$PythonZipUrl = "https://www.python.org/ftp/python/$PythonVersion/python-$PythonVersion-embed-amd64.zip"
|
||||||
|
$PythonPath = "$WorkingDirectory\Python"
|
||||||
|
$PythonBinPath = "$PythonPath\python.exe"
|
||||||
|
|
||||||
|
# Download Python zip file
|
||||||
|
Invoke-WebRequest -Uri $PythonZipUrl -OutFile $PythonZipFile
|
||||||
|
|
||||||
|
# Download Python pip file
|
||||||
|
Invoke-WebRequest -Uri "https://bootstrap.pypa.io/get-pip.py" -OutFile $PipInstallFile
|
||||||
|
|
||||||
|
# Extract Python files
|
||||||
|
Expand-Archive $PythonZipFile -DestinationPath $PythonPath -Force
|
||||||
|
|
||||||
|
# Add Python to PATH
|
||||||
|
$env:Path = "$PythonPath\Scripts;$PythonPath;$($env:Path)"
|
||||||
|
|
||||||
|
Write-Output "Installed to $PythonPath"
|
||||||
|
|
||||||
|
# Install pip
|
||||||
|
& $PythonBinPath $PipInstallFile
|
||||||
|
|
||||||
|
# Add package paths in pythonXX._pth to unblock python -m pip
|
||||||
|
$PythonImportPathFile = "$PythonPath\python310._pth"
|
||||||
|
$ComponentTestsDir = "$CloudflaredDirectory\component-tests\"
|
||||||
|
@($ComponentTestsDir, "Lib\site-packages", $(Get-Content $PythonImportPathFile)) | Set-Content $PythonImportPathFile
|
||||||
|
|
||||||
|
# Test Python installation
|
||||||
|
& $PythonBinPath --version
|
||||||
|
& $PythonBinPath -m pip --version
|
||||||
|
|
||||||
|
go env
|
||||||
|
go version
|
||||||
|
|
||||||
|
$env:TARGET_OS = "windows"
|
||||||
|
$env:CGO_ENABLED = 1
|
||||||
|
$env:TARGET_ARCH = "amd64"
|
||||||
|
$env:Path = "$Env:Temp\go\bin;$($env:Path)"
|
||||||
|
|
||||||
|
& $PythonBinPath --version
|
||||||
|
& $PythonBinPath -m pip --version
|
||||||
|
|
||||||
|
cd $CloudflaredDirectory
|
||||||
|
|
||||||
|
go env
|
||||||
|
go version
|
||||||
|
|
||||||
|
Write-Output "Building cloudflared"
|
||||||
|
|
||||||
|
& make cloudflared
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw "Failed to build cloudflared" }
|
||||||
|
|
||||||
|
echo $LASTEXITCODE
|
||||||
|
|
||||||
|
Write-Output "Running unit tests"
|
||||||
|
|
||||||
|
# Not testing with race detector because of https://github.com/golang/go/issues/61058
|
||||||
|
# We already test it on other platforms
|
||||||
|
& go test -failfast -mod=vendor ./...
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw "Failed unit tests" }
|
||||||
|
|
||||||
|
Write-Output "Running component tests"
|
||||||
|
|
||||||
|
& $PythonBinPath -m pip install --upgrade -r component-tests/requirements.txt
|
||||||
|
& $PythonBinPath component-tests/setup.py --type create
|
||||||
|
& $PythonBinPath -m pytest component-tests -o log_cli=true --log-cli-level=INFO
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
& $PythonBinPath component-tests/setup.py --type cleanup
|
||||||
|
throw "Failed component tests"
|
||||||
|
}
|
||||||
|
& $PythonBinPath component-tests/setup.py --type cleanup
|
|
@ -0,0 +1,16 @@
|
||||||
|
Set-StrictMode -Version Latest
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$ProgressPreference = "SilentlyContinue"
|
||||||
|
|
||||||
|
Write-Output "Downloading cloudflare go..."
|
||||||
|
|
||||||
|
Set-Location "$Env:Temp"
|
||||||
|
|
||||||
|
git clone -q https://github.com/cloudflare/go
|
||||||
|
Write-Output "Building go..."
|
||||||
|
cd go/src
|
||||||
|
# https://github.com/cloudflare/go/tree/34129e47042e214121b6bbff0ded4712debed18e is version go1.21.5-devel-cf
|
||||||
|
git checkout -q 34129e47042e214121b6bbff0ded4712debed18e
|
||||||
|
& ./make.bat
|
||||||
|
|
||||||
|
Write-Output "Installed"
|
|
@ -0,0 +1,20 @@
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$ProgressPreference = "SilentlyContinue"
|
||||||
|
$GoMsiVersion = "go1.21.5.windows-amd64.msi"
|
||||||
|
|
||||||
|
Write-Output "Downloading go installer..."
|
||||||
|
|
||||||
|
Set-Location "$Env:Temp"
|
||||||
|
|
||||||
|
(New-Object System.Net.WebClient).DownloadFile(
|
||||||
|
"https://go.dev/dl/$GoMsiVersion",
|
||||||
|
"$Env:Temp\$GoMsiVersion"
|
||||||
|
)
|
||||||
|
|
||||||
|
Write-Output "Installing go..."
|
||||||
|
Install-Package "$Env:Temp\$GoMsiVersion" -Force
|
||||||
|
|
||||||
|
# Go installer updates global $PATH
|
||||||
|
go env
|
||||||
|
|
||||||
|
Write-Output "Installed"
|
|
@ -1,3 +1,6 @@
|
||||||
|
## 2023.9.0
|
||||||
|
### Notices
|
||||||
|
- The `warp-routing` `enabled: boolean` flag is no longer supported in the configuration file. Warp Routing traffic (eg TCP, UDP, ICMP) traffic is proxied to cloudflared if routes to the target tunnel are configured. This change does not affect remotely managed tunnels, but for locally managed tunnels, users that might be relying on this feature flag to block traffic should instead guarantee that tunnel has no Private Routes configured for the tunnel.
|
||||||
## 2023.7.0
|
## 2023.7.0
|
||||||
### New Features
|
### New Features
|
||||||
- You can now enable additional diagnostics over the management.argotunnel.com service for your active cloudflared connectors via a new runtime flag `--management-diagnostics` (or env `TUNNEL_MANAGEMENT_DIAGNOSTICS`). This feature is provided as opt-in and requires the flag to enable. Endpoints such as /metrics provides your prometheus metrics endpoint another mechanism to be reached. Additionally /debug/pprof/(goroutine|heap) are also introduced to allow for remotely retrieving active pprof information from a running cloudflared connector.
|
- You can now enable additional diagnostics over the management.argotunnel.com service for your active cloudflared connectors via a new runtime flag `--management-diagnostics` (or env `TUNNEL_MANAGEMENT_DIAGNOSTICS`). This feature is provided as opt-in and requires the flag to enable. Endpoints such as /metrics provides your prometheus metrics endpoint another mechanism to be reached. Additionally /debug/pprof/(goroutine|heap) are also introduced to allow for remotely retrieving active pprof information from a running cloudflared connector.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# use a builder image for building cloudflare
|
# use a builder image for building cloudflare
|
||||||
ARG TARGET_GOOS
|
ARG TARGET_GOOS
|
||||||
ARG TARGET_GOARCH
|
ARG TARGET_GOARCH
|
||||||
FROM golang:1.19 as builder
|
FROM golang:1.21.5 as builder
|
||||||
ENV GO111MODULE=on \
|
ENV GO111MODULE=on \
|
||||||
CGO_ENABLED=0 \
|
CGO_ENABLED=0 \
|
||||||
TARGET_GOOS=${TARGET_GOOS} \
|
TARGET_GOOS=${TARGET_GOOS} \
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# use a builder image for building cloudflare
|
# use a builder image for building cloudflare
|
||||||
FROM golang:1.19 as builder
|
FROM golang:1.21.5 as builder
|
||||||
ENV GO111MODULE=on \
|
ENV GO111MODULE=on \
|
||||||
CGO_ENABLED=0
|
CGO_ENABLED=0
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# use a builder image for building cloudflare
|
# use a builder image for building cloudflare
|
||||||
FROM golang:1.19 as builder
|
FROM golang:1.21.5 as builder
|
||||||
ENV GO111MODULE=on \
|
ENV GO111MODULE=on \
|
||||||
CGO_ENABLED=0
|
CGO_ENABLED=0
|
||||||
|
|
||||||
|
|
56
Makefile
56
Makefile
|
@ -126,7 +126,7 @@ ifeq ($(FIPS), true)
|
||||||
$(info Building cloudflared with go-fips)
|
$(info Building cloudflared with go-fips)
|
||||||
cp -f fips/fips.go.linux-amd64 cmd/cloudflared/fips.go
|
cp -f fips/fips.go.linux-amd64 cmd/cloudflared/fips.go
|
||||||
endif
|
endif
|
||||||
GOOS=$(TARGET_OS) GOARCH=$(TARGET_ARCH) $(ARM_COMMAND) go build -v -mod=vendor $(GO_BUILD_TAGS) $(LDFLAGS) $(IMPORT_PATH)/cmd/cloudflared
|
GOOS=$(TARGET_OS) GOARCH=$(TARGET_ARCH) $(ARM_COMMAND) go build -mod=vendor $(GO_BUILD_TAGS) $(LDFLAGS) $(IMPORT_PATH)/cmd/cloudflared
|
||||||
ifeq ($(FIPS), true)
|
ifeq ($(FIPS), true)
|
||||||
rm -f cmd/cloudflared/fips.go
|
rm -f cmd/cloudflared/fips.go
|
||||||
./check-fips.sh cloudflared
|
./check-fips.sh cloudflared
|
||||||
|
@ -209,58 +209,6 @@ cloudflared-darwin-amd64.tgz: cloudflared
|
||||||
tar czf cloudflared-darwin-amd64.tgz cloudflared
|
tar czf cloudflared-darwin-amd64.tgz cloudflared
|
||||||
rm cloudflared
|
rm cloudflared
|
||||||
|
|
||||||
.PHONY: cloudflared-junos
|
|
||||||
cloudflared-junos: cloudflared jetez-certificate.pem jetez-key.pem
|
|
||||||
jetez --source . \
|
|
||||||
-j jet.yaml \
|
|
||||||
--key jetez-key.pem \
|
|
||||||
--cert jetez-certificate.pem \
|
|
||||||
--version $(VERSION)
|
|
||||||
rm jetez-*.pem
|
|
||||||
|
|
||||||
jetez-certificate.pem:
|
|
||||||
ifndef JETEZ_CERT
|
|
||||||
$(error JETEZ_CERT not defined)
|
|
||||||
endif
|
|
||||||
@echo "Writing JetEZ certificate"
|
|
||||||
@echo "$$JETEZ_CERT" > jetez-certificate.pem
|
|
||||||
|
|
||||||
jetez-key.pem:
|
|
||||||
ifndef JETEZ_KEY
|
|
||||||
$(error JETEZ_KEY not defined)
|
|
||||||
endif
|
|
||||||
@echo "Writing JetEZ key"
|
|
||||||
@echo "$$JETEZ_KEY" > jetez-key.pem
|
|
||||||
|
|
||||||
.PHONY: publish-cloudflared-junos
|
|
||||||
publish-cloudflared-junos: cloudflared-junos cloudflared-x86-64.latest.s3
|
|
||||||
ifndef S3_ENDPOINT
|
|
||||||
$(error S3_HOST not defined)
|
|
||||||
endif
|
|
||||||
ifndef S3_URI
|
|
||||||
$(error S3_URI not defined)
|
|
||||||
endif
|
|
||||||
ifndef S3_ACCESS_KEY
|
|
||||||
$(error S3_ACCESS_KEY not defined)
|
|
||||||
endif
|
|
||||||
ifndef S3_SECRET_KEY
|
|
||||||
$(error S3_SECRET_KEY not defined)
|
|
||||||
endif
|
|
||||||
sha256sum cloudflared-x86-64-$(VERSION).tgz | awk '{printf $$1}' > cloudflared-x86-64-$(VERSION).tgz.shasum
|
|
||||||
s4cmd --endpoint-url $(S3_ENDPOINT) --force --API-GrantRead=uri=http://acs.amazonaws.com/groups/global/AllUsers \
|
|
||||||
put cloudflared-x86-64-$(VERSION).tgz $(S3_URI)/cloudflared-x86-64-$(VERSION).tgz
|
|
||||||
s4cmd --endpoint-url $(S3_ENDPOINT) --force --API-GrantRead=uri=http://acs.amazonaws.com/groups/global/AllUsers \
|
|
||||||
put cloudflared-x86-64-$(VERSION).tgz.shasum $(S3_URI)/cloudflared-x86-64-$(VERSION).tgz.shasum
|
|
||||||
dpkg --compare-versions "$(VERSION)" gt "$(shell cat cloudflared-x86-64.latest.s3)" && \
|
|
||||||
echo -n "$(VERSION)" > cloudflared-x86-64.latest && \
|
|
||||||
s4cmd --endpoint-url $(S3_ENDPOINT) --force --API-GrantRead=uri=http://acs.amazonaws.com/groups/global/AllUsers \
|
|
||||||
put cloudflared-x86-64.latest $(S3_URI)/cloudflared-x86-64.latest || \
|
|
||||||
echo "Latest version not updated"
|
|
||||||
|
|
||||||
cloudflared-x86-64.latest.s3:
|
|
||||||
s4cmd --endpoint-url $(S3_ENDPOINT) --force \
|
|
||||||
get $(S3_URI)/cloudflared-x86-64.latest cloudflared-x86-64.latest.s3
|
|
||||||
|
|
||||||
.PHONY: homebrew-upload
|
.PHONY: homebrew-upload
|
||||||
homebrew-upload: cloudflared-darwin-amd64.tgz
|
homebrew-upload: cloudflared-darwin-amd64.tgz
|
||||||
aws s3 --endpoint-url $(S3_ENDPOINT) cp --acl public-read $$^ $(S3_URI)/cloudflared-$$(VERSION)-$1.tgz
|
aws s3 --endpoint-url $(S3_ENDPOINT) cp --acl public-read $$^ $(S3_URI)/cloudflared-$$(VERSION)-$1.tgz
|
||||||
|
@ -312,7 +260,7 @@ quic-deps:
|
||||||
|
|
||||||
.PHONY: vet
|
.PHONY: vet
|
||||||
vet:
|
vet:
|
||||||
go vet -v -mod=vendor github.com/cloudflare/cloudflared/...
|
go vet -mod=vendor github.com/cloudflare/cloudflared/...
|
||||||
|
|
||||||
.PHONY: fmt
|
.PHONY: fmt
|
||||||
fmt:
|
fmt:
|
||||||
|
|
|
@ -53,9 +53,6 @@ Want to test Cloudflare Tunnel before adding a website to Cloudflare? You can do
|
||||||
|
|
||||||
## Deprecated versions
|
## Deprecated versions
|
||||||
|
|
||||||
Cloudflare currently supports versions of `cloudflared` 2020.5.1 and later. Breaking changes unrelated to feature availability may be introduced that will impact versions released prior to 2020.5.1. You can read more about upgrading `cloudflared` in our [developer documentation](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation#updating-cloudflared).
|
Cloudflare currently supports versions of cloudflared that are **within one year** of the most recent release. Breaking changes unrelated to feature availability may be introduced that will impact versions released more than one year ago. You can read more about upgrading cloudflared in our [developer documentation](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/#updating-cloudflared).
|
||||||
|
|
||||||
| Version(s) | Deprecation status |
|
For example, as of January 2023 Cloudflare will support cloudflared version 2023.1.1 to cloudflared 2022.1.1.
|
||||||
|---|---|
|
|
||||||
| 2020.5.1 and later | Supported |
|
|
||||||
| Versions prior to 2020.5.1 | No longer supported |
|
|
||||||
|
|
|
@ -1,3 +1,38 @@
|
||||||
|
2023.10.0
|
||||||
|
- 2023-10-06 TUN-7864: Document cloudflared versions support
|
||||||
|
- 2023-10-03 CUSTESC-33731: Make rule match test report rule in 0-index base
|
||||||
|
- 2023-09-22 TUN-7824: Fix usage of systemctl status to detect which services are installed
|
||||||
|
- 2023-09-20 TUN-7813: Improve tunnel delete command to use cascade delete
|
||||||
|
- 2023-09-20 TUN-7787: cloudflared only list ip routes targeted for cfd_tunnel
|
||||||
|
- 2023-09-15 TUN-7787: Refactor cloudflared to use new route endpoints based on route IDs
|
||||||
|
- 2023-09-08 TUN-7776: Remove warp-routing flag from cloudflared
|
||||||
|
- 2023-09-05 TUN-7756: Clarify that QUIC is mandatory to support ICMP proxying
|
||||||
|
|
||||||
|
2023.8.2
|
||||||
|
- 2023-08-25 TUN-7700: Implement feature selector to determine if connections will prefer post quantum cryptography
|
||||||
|
- 2023-08-22 TUN-7707: Use X25519Kyber768Draft00 curve when post-quantum feature is enabled
|
||||||
|
|
||||||
|
2023.8.1
|
||||||
|
- 2023-08-23 TUN-7718: Update R2 Token to no longer encode secret
|
||||||
|
|
||||||
|
2023.8.0
|
||||||
|
- 2023-07-26 TUN-7584: Bump go 1.20.6
|
||||||
|
|
||||||
|
2023.7.3
|
||||||
|
- 2023-07-25 TUN-7628: Correct Host parsing for Access
|
||||||
|
- 2023-07-24 TUN-7624: Fix flaky TestBackoffGracePeriod test in cloudflared
|
||||||
|
|
||||||
|
2023.7.2
|
||||||
|
- 2023-07-19 TUN-7599: Onboard cloudflared to Software Dashboard
|
||||||
|
- 2023-07-19 TUN-7587: Remove junos builds
|
||||||
|
- 2023-07-18 TUN-7597: Add flag to disable auto-update services to be installed
|
||||||
|
- 2023-07-17 TUN-7594: Add nightly arm64 cloudflared internal deb publishes
|
||||||
|
- 2023-07-14 TUN-7586: Upgrade go-jose/go-jose/v3 and core-os/go-oidc/v3
|
||||||
|
- 2023-07-14 TUN-7589: Remove legacy golang.org/x/crypto/ssh/terminal package usage
|
||||||
|
- 2023-07-14 TUN-7590: Remove usages of ioutil
|
||||||
|
- 2023-07-14 TUN-7585: Remove h2mux compression
|
||||||
|
- 2023-07-14 TUN-7588: Update package coreos/go-systemd
|
||||||
|
|
||||||
2023.7.1
|
2023.7.1
|
||||||
- 2023-07-13 TUN-7582: Correct changelog wording for --management-diagnostics
|
- 2023-07-13 TUN-7582: Correct changelog wording for --management-diagnostics
|
||||||
- 2023-07-12 TUN-7575: Add option to disable PTMU discovery over QUIC
|
- 2023-07-12 TUN-7575: Add option to disable PTMU discovery over QUIC
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
apiVersion: backstage.io/v1alpha1
|
||||||
|
kind: Component
|
||||||
|
metadata:
|
||||||
|
name: cloudflared
|
||||||
|
description: Client for Cloudflare Tunnels
|
||||||
|
annotations:
|
||||||
|
backstage.io/source-location: url:https://bitbucket.cfdata.org/projects/TUN/repos/cloudflared/browse
|
||||||
|
cloudflare.com/software-excellence-opt-in: "true"
|
||||||
|
cloudflare.com/jira-project-key: "TUN"
|
||||||
|
cloudflare.com/jira-project-component: "Cloudflare Tunnel"
|
||||||
|
tags:
|
||||||
|
- internal
|
||||||
|
spec:
|
||||||
|
type: "service"
|
||||||
|
lifecycle: "Active"
|
||||||
|
owner: "teams/tunnel-teams-routing"
|
|
@ -9,7 +9,7 @@ type TunnelClient interface {
|
||||||
GetTunnel(tunnelID uuid.UUID) (*Tunnel, error)
|
GetTunnel(tunnelID uuid.UUID) (*Tunnel, error)
|
||||||
GetTunnelToken(tunnelID uuid.UUID) (string, error)
|
GetTunnelToken(tunnelID uuid.UUID) (string, error)
|
||||||
GetManagementToken(tunnelID uuid.UUID) (string, error)
|
GetManagementToken(tunnelID uuid.UUID) (string, error)
|
||||||
DeleteTunnel(tunnelID uuid.UUID) error
|
DeleteTunnel(tunnelID uuid.UUID, cascade bool) error
|
||||||
ListTunnels(filter *TunnelFilter) ([]*Tunnel, error)
|
ListTunnels(filter *TunnelFilter) ([]*Tunnel, error)
|
||||||
ListActiveClients(tunnelID uuid.UUID) ([]*ActiveClient, error)
|
ListActiveClients(tunnelID uuid.UUID) ([]*ActiveClient, error)
|
||||||
CleanupConnections(tunnelID uuid.UUID, params *CleanupParams) error
|
CleanupConnections(tunnelID uuid.UUID, params *CleanupParams) error
|
||||||
|
@ -22,7 +22,7 @@ type HostnameClient interface {
|
||||||
type IPRouteClient interface {
|
type IPRouteClient interface {
|
||||||
ListRoutes(filter *IpRouteFilter) ([]*DetailedRoute, error)
|
ListRoutes(filter *IpRouteFilter) ([]*DetailedRoute, error)
|
||||||
AddRoute(newRoute NewRoute) (Route, error)
|
AddRoute(newRoute NewRoute) (Route, error)
|
||||||
DeleteRoute(params DeleteRouteParams) error
|
DeleteRoute(id uuid.UUID) error
|
||||||
GetByIP(params GetRouteByIpParams) (DetailedRoute, error)
|
GetByIP(params GetRouteByIpParams) (DetailedRoute, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,10 +75,12 @@ type NewRoute struct {
|
||||||
// MarshalJSON handles fields with non-JSON types (e.g. net.IPNet).
|
// MarshalJSON handles fields with non-JSON types (e.g. net.IPNet).
|
||||||
func (r NewRoute) MarshalJSON() ([]byte, error) {
|
func (r NewRoute) MarshalJSON() ([]byte, error) {
|
||||||
return json.Marshal(&struct {
|
return json.Marshal(&struct {
|
||||||
|
Network string `json:"network"`
|
||||||
TunnelID uuid.UUID `json:"tunnel_id"`
|
TunnelID uuid.UUID `json:"tunnel_id"`
|
||||||
Comment string `json:"comment"`
|
Comment string `json:"comment"`
|
||||||
VNetID *uuid.UUID `json:"virtual_network_id,omitempty"`
|
VNetID *uuid.UUID `json:"virtual_network_id,omitempty"`
|
||||||
}{
|
}{
|
||||||
|
Network: r.Network.String(),
|
||||||
TunnelID: r.TunnelID,
|
TunnelID: r.TunnelID,
|
||||||
Comment: r.Comment,
|
Comment: r.Comment,
|
||||||
VNetID: r.VNetID,
|
VNetID: r.VNetID,
|
||||||
|
@ -87,6 +89,7 @@ func (r NewRoute) MarshalJSON() ([]byte, error) {
|
||||||
|
|
||||||
// DetailedRoute is just a Route with some extra fields, e.g. TunnelName.
|
// DetailedRoute is just a Route with some extra fields, e.g. TunnelName.
|
||||||
type DetailedRoute struct {
|
type DetailedRoute struct {
|
||||||
|
ID uuid.UUID `json:"id"`
|
||||||
Network CIDR `json:"network"`
|
Network CIDR `json:"network"`
|
||||||
TunnelID uuid.UUID `json:"tunnel_id"`
|
TunnelID uuid.UUID `json:"tunnel_id"`
|
||||||
// Optional field. When unset, it means the DetailedRoute belongs to the default virtual network.
|
// Optional field. When unset, it means the DetailedRoute belongs to the default virtual network.
|
||||||
|
@ -115,7 +118,8 @@ func (r DetailedRoute) TableString() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf(
|
||||||
"%s\t%s\t%s\t%s\t%s\t%s\t%s\t",
|
"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t",
|
||||||
|
r.ID,
|
||||||
r.Network.String(),
|
r.Network.String(),
|
||||||
vnetColumn,
|
vnetColumn,
|
||||||
r.Comment,
|
r.Comment,
|
||||||
|
@ -126,12 +130,6 @@ func (r DetailedRoute) TableString() string {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeleteRouteParams struct {
|
|
||||||
Network net.IPNet
|
|
||||||
// Optional field. If unset, backend will assume the default vnet for the account.
|
|
||||||
VNetID *uuid.UUID
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetRouteByIpParams struct {
|
type GetRouteByIpParams struct {
|
||||||
Ip net.IP
|
Ip net.IP
|
||||||
// Optional field. If unset, backend will assume the default vnet for the account.
|
// Optional field. If unset, backend will assume the default vnet for the account.
|
||||||
|
@ -158,7 +156,7 @@ func (r *RESTClient) ListRoutes(filter *IpRouteFilter) ([]*DetailedRoute, error)
|
||||||
// AddRoute calls the Tunnelstore POST endpoint for a given route.
|
// AddRoute calls the Tunnelstore POST endpoint for a given route.
|
||||||
func (r *RESTClient) AddRoute(newRoute NewRoute) (Route, error) {
|
func (r *RESTClient) AddRoute(newRoute NewRoute) (Route, error) {
|
||||||
endpoint := r.baseEndpoints.accountRoutes
|
endpoint := r.baseEndpoints.accountRoutes
|
||||||
endpoint.Path = path.Join(endpoint.Path, "network", url.PathEscape(newRoute.Network.String()))
|
endpoint.Path = path.Join(endpoint.Path)
|
||||||
resp, err := r.sendRequest("POST", endpoint, newRoute)
|
resp, err := r.sendRequest("POST", endpoint, newRoute)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Route{}, errors.Wrap(err, "REST request failed")
|
return Route{}, errors.Wrap(err, "REST request failed")
|
||||||
|
@ -173,10 +171,9 @@ func (r *RESTClient) AddRoute(newRoute NewRoute) (Route, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteRoute calls the Tunnelstore DELETE endpoint for a given route.
|
// DeleteRoute calls the Tunnelstore DELETE endpoint for a given route.
|
||||||
func (r *RESTClient) DeleteRoute(params DeleteRouteParams) error {
|
func (r *RESTClient) DeleteRoute(id uuid.UUID) error {
|
||||||
endpoint := r.baseEndpoints.accountRoutes
|
endpoint := r.baseEndpoints.accountRoutes
|
||||||
endpoint.Path = path.Join(endpoint.Path, "network", url.PathEscape(params.Network.String()))
|
endpoint.Path = path.Join(endpoint.Path, url.PathEscape(id.String()))
|
||||||
setVnetParam(&endpoint, params.VNetID)
|
|
||||||
|
|
||||||
resp, err := r.sendRequest("DELETE", endpoint, nil)
|
resp, err := r.sendRequest("DELETE", endpoint, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -58,31 +58,29 @@ type IpRouteFilter struct {
|
||||||
|
|
||||||
// NewIpRouteFilterFromCLI parses CLI flags to discover which filters should get applied.
|
// NewIpRouteFilterFromCLI parses CLI flags to discover which filters should get applied.
|
||||||
func NewIpRouteFilterFromCLI(c *cli.Context) (*IpRouteFilter, error) {
|
func NewIpRouteFilterFromCLI(c *cli.Context) (*IpRouteFilter, error) {
|
||||||
f := &IpRouteFilter{
|
f := NewIPRouteFilter()
|
||||||
queryParams: url.Values{},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set deletion filter
|
// Set deletion filter
|
||||||
if flag := filterIpRouteDeleted.Name; c.IsSet(flag) && c.Bool(flag) {
|
if flag := filterIpRouteDeleted.Name; c.IsSet(flag) && c.Bool(flag) {
|
||||||
f.deleted()
|
f.Deleted()
|
||||||
} else {
|
} else {
|
||||||
f.notDeleted()
|
f.NotDeleted()
|
||||||
}
|
}
|
||||||
|
|
||||||
if subset, err := cidrFromFlag(c, filterSubsetIpRoute); err != nil {
|
if subset, err := cidrFromFlag(c, filterSubsetIpRoute); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else if subset != nil {
|
} else if subset != nil {
|
||||||
f.networkIsSupersetOf(*subset)
|
f.NetworkIsSupersetOf(*subset)
|
||||||
}
|
}
|
||||||
|
|
||||||
if superset, err := cidrFromFlag(c, filterSupersetIpRoute); err != nil {
|
if superset, err := cidrFromFlag(c, filterSupersetIpRoute); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else if superset != nil {
|
} else if superset != nil {
|
||||||
f.networkIsSupersetOf(*superset)
|
f.NetworkIsSupersetOf(*superset)
|
||||||
}
|
}
|
||||||
|
|
||||||
if comment := c.String(filterIpRouteComment.Name); comment != "" {
|
if comment := c.String(filterIpRouteComment.Name); comment != "" {
|
||||||
f.commentIs(comment)
|
f.CommentIs(comment)
|
||||||
}
|
}
|
||||||
|
|
||||||
if tunnelID := c.String(filterIpRouteTunnelID.Name); tunnelID != "" {
|
if tunnelID := c.String(filterIpRouteTunnelID.Name); tunnelID != "" {
|
||||||
|
@ -90,7 +88,7 @@ func NewIpRouteFilterFromCLI(c *cli.Context) (*IpRouteFilter, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "Couldn't parse UUID from %s", filterIpRouteTunnelID.Name)
|
return nil, errors.Wrapf(err, "Couldn't parse UUID from %s", filterIpRouteTunnelID.Name)
|
||||||
}
|
}
|
||||||
f.tunnelID(u)
|
f.TunnelID(u)
|
||||||
}
|
}
|
||||||
|
|
||||||
if vnetId := c.String(filterIpRouteByVnet.Name); vnetId != "" {
|
if vnetId := c.String(filterIpRouteByVnet.Name); vnetId != "" {
|
||||||
|
@ -98,7 +96,7 @@ func NewIpRouteFilterFromCLI(c *cli.Context) (*IpRouteFilter, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "Couldn't parse UUID from %s", filterIpRouteByVnet.Name)
|
return nil, errors.Wrapf(err, "Couldn't parse UUID from %s", filterIpRouteByVnet.Name)
|
||||||
}
|
}
|
||||||
f.vnetID(u)
|
f.VNetID(u)
|
||||||
}
|
}
|
||||||
|
|
||||||
if maxFetch := c.Int("max-fetch-size"); maxFetch > 0 {
|
if maxFetch := c.Int("max-fetch-size"); maxFetch > 0 {
|
||||||
|
@ -124,35 +122,44 @@ func cidrFromFlag(c *cli.Context, flag cli.StringFlag) (*net.IPNet, error) {
|
||||||
return subset, nil
|
return subset, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *IpRouteFilter) commentIs(comment string) {
|
func NewIPRouteFilter() *IpRouteFilter {
|
||||||
|
values := &IpRouteFilter{queryParams: url.Values{}}
|
||||||
|
|
||||||
|
// always list cfd_tunnel routes only
|
||||||
|
values.queryParams.Set("tun_types", "cfd_tunnel")
|
||||||
|
|
||||||
|
return values
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *IpRouteFilter) CommentIs(comment string) {
|
||||||
f.queryParams.Set("comment", comment)
|
f.queryParams.Set("comment", comment)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *IpRouteFilter) notDeleted() {
|
func (f *IpRouteFilter) NotDeleted() {
|
||||||
f.queryParams.Set("is_deleted", "false")
|
f.queryParams.Set("is_deleted", "false")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *IpRouteFilter) deleted() {
|
func (f *IpRouteFilter) Deleted() {
|
||||||
f.queryParams.Set("is_deleted", "true")
|
f.queryParams.Set("is_deleted", "true")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *IpRouteFilter) networkIsSubsetOf(superset net.IPNet) {
|
func (f *IpRouteFilter) NetworkIsSubsetOf(superset net.IPNet) {
|
||||||
f.queryParams.Set("network_subset", superset.String())
|
f.queryParams.Set("network_subset", superset.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *IpRouteFilter) networkIsSupersetOf(subset net.IPNet) {
|
func (f *IpRouteFilter) NetworkIsSupersetOf(subset net.IPNet) {
|
||||||
f.queryParams.Set("network_superset", subset.String())
|
f.queryParams.Set("network_superset", subset.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *IpRouteFilter) existedAt(existedAt time.Time) {
|
func (f *IpRouteFilter) ExistedAt(existedAt time.Time) {
|
||||||
f.queryParams.Set("existed_at", existedAt.Format(time.RFC3339))
|
f.queryParams.Set("existed_at", existedAt.Format(time.RFC3339))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *IpRouteFilter) tunnelID(id uuid.UUID) {
|
func (f *IpRouteFilter) TunnelID(id uuid.UUID) {
|
||||||
f.queryParams.Set("tunnel_id", id.String())
|
f.queryParams.Set("tunnel_id", id.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *IpRouteFilter) vnetID(id uuid.UUID) {
|
func (f *IpRouteFilter) VNetID(id uuid.UUID) {
|
||||||
f.queryParams.Set("virtual_network_id", id.String())
|
f.queryParams.Set("virtual_network_id", id.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,7 @@ func TestDetailedRouteJsonRoundtrip(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
`{
|
`{
|
||||||
|
"id":"91ebc578-cc99-4641-9937-0fb630505fa0",
|
||||||
"network":"10.1.2.40/29",
|
"network":"10.1.2.40/29",
|
||||||
"tunnel_id":"fba6ffea-807f-4e7a-a740-4184ee1b82c8",
|
"tunnel_id":"fba6ffea-807f-4e7a-a740-4184ee1b82c8",
|
||||||
"comment":"test",
|
"comment":"test",
|
||||||
|
@ -80,6 +81,7 @@ func TestDetailedRouteJsonRoundtrip(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
`{
|
`{
|
||||||
|
"id":"91ebc578-cc99-4641-9937-0fb630505fa0",
|
||||||
"network":"10.1.2.40/29",
|
"network":"10.1.2.40/29",
|
||||||
"tunnel_id":"fba6ffea-807f-4e7a-a740-4184ee1b82c8",
|
"tunnel_id":"fba6ffea-807f-4e7a-a740-4184ee1b82c8",
|
||||||
"virtual_network_id":"38c95083-8191-4110-8339-3f438d44fdb9",
|
"virtual_network_id":"38c95083-8191-4110-8339-3f438d44fdb9",
|
||||||
|
@ -167,9 +169,10 @@ func TestRouteTableString(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, network)
|
require.NotNil(t, network)
|
||||||
r := DetailedRoute{
|
r := DetailedRoute{
|
||||||
|
ID: uuid.Nil,
|
||||||
Network: CIDR(*network),
|
Network: CIDR(*network),
|
||||||
}
|
}
|
||||||
row := r.TableString()
|
row := r.TableString()
|
||||||
fmt.Println(row)
|
fmt.Println(row)
|
||||||
require.True(t, strings.HasPrefix(row, "1.2.3.4/32"))
|
require.True(t, strings.HasPrefix(row, "00000000-0000-0000-0000-000000000000\t1.2.3.4/32"))
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,9 +159,14 @@ func (r *RESTClient) GetManagementToken(tunnelID uuid.UUID) (token string, err e
|
||||||
return "", r.statusCodeToError("get tunnel token", resp)
|
return "", r.statusCodeToError("get tunnel token", resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RESTClient) DeleteTunnel(tunnelID uuid.UUID) error {
|
func (r *RESTClient) DeleteTunnel(tunnelID uuid.UUID, cascade bool) error {
|
||||||
endpoint := r.baseEndpoints.accountLevel
|
endpoint := r.baseEndpoints.accountLevel
|
||||||
endpoint.Path = path.Join(endpoint.Path, fmt.Sprintf("%v", tunnelID))
|
endpoint.Path = path.Join(endpoint.Path, fmt.Sprintf("%v", tunnelID))
|
||||||
|
// Cascade will delete all tunnel dependencies (connections, routes, etc.) that
|
||||||
|
// are linked to the deleted tunnel.
|
||||||
|
if cascade {
|
||||||
|
endpoint.RawQuery = "cascade=true"
|
||||||
|
}
|
||||||
resp, err := r.sendRequest("DELETE", endpoint, nil)
|
resp, err := r.sendRequest("DELETE", endpoint, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "REST request failed")
|
return errors.Wrap(err, "REST request failed")
|
||||||
|
|
|
@ -3,7 +3,7 @@ package cfapi
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -49,7 +49,7 @@ func Test_parseListTunnels(t *testing.T) {
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
body := ioutil.NopCloser(bytes.NewReader([]byte(tt.args.body)))
|
body := io.NopCloser(bytes.NewReader([]byte(tt.args.body)))
|
||||||
got, err := parseListTunnels(body)
|
got, err := parseListTunnels(body)
|
||||||
if (err != nil) != tt.wantErr {
|
if (err != nil) != tt.wantErr {
|
||||||
t.Errorf("parseListTunnels() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("parseListTunnels() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
|
59
cfsetup.yaml
59
cfsetup.yaml
|
@ -1,5 +1,4 @@
|
||||||
pinned_go: &pinned_go go=1.19.6-1
|
pinned_go: &pinned_go go-boring=1.21.5-1
|
||||||
pinned_go_fips: &pinned_go_fips go-boring=1.19.6-1
|
|
||||||
|
|
||||||
build_dir: &build_dir /cfsetup_build
|
build_dir: &build_dir /cfsetup_build
|
||||||
default-flavor: bullseye
|
default-flavor: bullseye
|
||||||
|
@ -19,16 +18,13 @@ buster: &buster
|
||||||
- make cloudflared
|
- make cloudflared
|
||||||
build-fips:
|
build-fips:
|
||||||
build_dir: *build_dir
|
build_dir: *build_dir
|
||||||
builddeps: &build_deps_fips
|
builddeps: *build_deps
|
||||||
- *pinned_go_fips
|
|
||||||
- build-essential
|
|
||||||
- gotest-to-teamcity
|
|
||||||
pre-cache: *build_pre_cache
|
pre-cache: *build_pre_cache
|
||||||
post-cache:
|
post-cache:
|
||||||
- export GOOS=linux
|
- export GOOS=linux
|
||||||
- export GOARCH=amd64
|
- export GOARCH=amd64
|
||||||
- export FIPS=true
|
|
||||||
- make cloudflared
|
- make cloudflared
|
||||||
|
- export FIPS=true
|
||||||
cover:
|
cover:
|
||||||
build_dir: *build_dir
|
build_dir: *build_dir
|
||||||
builddeps: *build_deps
|
builddeps: *build_deps
|
||||||
|
@ -72,7 +68,7 @@ buster: &buster
|
||||||
github-fips-release-pkgs:
|
github-fips-release-pkgs:
|
||||||
build_dir: *build_dir
|
build_dir: *build_dir
|
||||||
builddeps:
|
builddeps:
|
||||||
- *pinned_go_fips
|
- *pinned_go
|
||||||
- build-essential
|
- build-essential
|
||||||
- fakeroot
|
- fakeroot
|
||||||
- rubygem-fpm
|
- rubygem-fpm
|
||||||
|
@ -111,7 +107,7 @@ buster: &buster
|
||||||
build-fips-internal-deb:
|
build-fips-internal-deb:
|
||||||
build_dir: *build_dir
|
build_dir: *build_dir
|
||||||
builddeps: &build_fips_deb_deps
|
builddeps: &build_fips_deb_deps
|
||||||
- *pinned_go_fips
|
- *pinned_go
|
||||||
- build-essential
|
- build-essential
|
||||||
- fakeroot
|
- fakeroot
|
||||||
- rubygem-fpm
|
- rubygem-fpm
|
||||||
|
@ -121,7 +117,7 @@ buster: &buster
|
||||||
- export FIPS=true
|
- export FIPS=true
|
||||||
- export ORIGINAL_NAME=true
|
- export ORIGINAL_NAME=true
|
||||||
- make cloudflared-deb
|
- make cloudflared-deb
|
||||||
build-fips-internal-deb-nightly:
|
build-internal-deb-nightly-amd64:
|
||||||
build_dir: *build_dir
|
build_dir: *build_dir
|
||||||
builddeps: *build_fips_deb_deps
|
builddeps: *build_fips_deb_deps
|
||||||
post-cache:
|
post-cache:
|
||||||
|
@ -131,6 +127,16 @@ buster: &buster
|
||||||
- export FIPS=true
|
- export FIPS=true
|
||||||
- export ORIGINAL_NAME=true
|
- export ORIGINAL_NAME=true
|
||||||
- make cloudflared-deb
|
- make cloudflared-deb
|
||||||
|
build-internal-deb-nightly-arm64:
|
||||||
|
build_dir: *build_dir
|
||||||
|
builddeps: *build_fips_deb_deps
|
||||||
|
post-cache:
|
||||||
|
- export GOOS=linux
|
||||||
|
- export GOARCH=arm64
|
||||||
|
- export NIGHTLY=true
|
||||||
|
#- export FIPS=true # TUN-7595
|
||||||
|
- export ORIGINAL_NAME=true
|
||||||
|
- make cloudflared-deb
|
||||||
build-deb-arm64:
|
build-deb-arm64:
|
||||||
build_dir: *build_dir
|
build_dir: *build_dir
|
||||||
builddeps: *build_deb_deps
|
builddeps: *build_deb_deps
|
||||||
|
@ -185,7 +191,7 @@ buster: &buster
|
||||||
- make test | gotest-to-teamcity
|
- make test | gotest-to-teamcity
|
||||||
test-fips:
|
test-fips:
|
||||||
build_dir: *build_dir
|
build_dir: *build_dir
|
||||||
builddeps: *build_deps_fips
|
builddeps: *build_deps
|
||||||
pre-cache: *build_pre_cache
|
pre-cache: *build_pre_cache
|
||||||
post-cache:
|
post-cache:
|
||||||
- export GOOS=linux
|
- export GOOS=linux
|
||||||
|
@ -217,7 +223,7 @@ buster: &buster
|
||||||
component-test-fips:
|
component-test-fips:
|
||||||
build_dir: *build_dir
|
build_dir: *build_dir
|
||||||
builddeps:
|
builddeps:
|
||||||
- *pinned_go_fips
|
- *pinned_go
|
||||||
- python3.7
|
- python3.7
|
||||||
- python3-pip
|
- python3-pip
|
||||||
- python3-setuptools
|
- python3-setuptools
|
||||||
|
@ -244,35 +250,6 @@ buster: &buster
|
||||||
pre-cache: *install_pygithub
|
pre-cache: *install_pygithub
|
||||||
post-cache:
|
post-cache:
|
||||||
- make github-message
|
- make github-message
|
||||||
build-junos:
|
|
||||||
build_dir: *build_dir
|
|
||||||
builddeps:
|
|
||||||
- *pinned_go
|
|
||||||
- build-essential
|
|
||||||
- python3
|
|
||||||
- genisoimage
|
|
||||||
pre-cache:
|
|
||||||
- ln -s /usr/bin/genisoimage /usr/bin/mkisofs
|
|
||||||
post-cache:
|
|
||||||
- export CGO_ENABLED=0
|
|
||||||
- export GOOS=freebsd
|
|
||||||
- export GOARCH=amd64
|
|
||||||
- make cloudflared
|
|
||||||
publish-junos:
|
|
||||||
build_dir: *build_dir
|
|
||||||
builddeps:
|
|
||||||
- *pinned_go
|
|
||||||
- build-essential
|
|
||||||
- python3
|
|
||||||
- genisoimage
|
|
||||||
- jetez
|
|
||||||
- s4cmd
|
|
||||||
pre-cache:
|
|
||||||
- ln -s /usr/bin/genisoimage /usr/bin/mkisofs
|
|
||||||
post-cache:
|
|
||||||
- export GOOS=freebsd
|
|
||||||
- export GOARCH=amd64
|
|
||||||
- make publish-cloudflared-junos
|
|
||||||
|
|
||||||
bullseye: *buster
|
bullseye: *buster
|
||||||
bookworm: *buster
|
bookworm: *buster
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<!--Set the cloudflared bin location to the Path Environment Variable-->
|
<!--Set the cloudflared bin location to the Path Environment Variable-->
|
||||||
<Environment Id="ENV0"
|
<Environment Id="ENV0"
|
||||||
Name="PATH"
|
Name="PATH"
|
||||||
Value="[INSTALLDIR]."
|
Value="[INSTALLDIR]"
|
||||||
Permanent="no"
|
Permanent="no"
|
||||||
Part="last"
|
Part="last"
|
||||||
Action="create"
|
Action="create"
|
||||||
|
|
|
@ -70,14 +70,14 @@ func ssh(c *cli.Context) error {
|
||||||
|
|
||||||
// get the hostname from the cmdline and error out if its not provided
|
// get the hostname from the cmdline and error out if its not provided
|
||||||
rawHostName := c.String(sshHostnameFlag)
|
rawHostName := c.String(sshHostnameFlag)
|
||||||
hostname, err := validation.ValidateHostname(rawHostName)
|
url, err := parseURL(rawHostName)
|
||||||
if err != nil || rawHostName == "" {
|
if err != nil {
|
||||||
|
log.Err(err).Send()
|
||||||
return cli.ShowCommandHelp(c, "ssh")
|
return cli.ShowCommandHelp(c, "ssh")
|
||||||
}
|
}
|
||||||
originURL := ensureURLScheme(hostname)
|
|
||||||
|
|
||||||
// get the headers from the cmdline and add them
|
// get the headers from the cmdline and add them
|
||||||
headers := buildRequestHeaders(c.StringSlice(sshHeaderFlag))
|
headers := parseRequestHeaders(c.StringSlice(sshHeaderFlag))
|
||||||
if c.IsSet(sshTokenIDFlag) {
|
if c.IsSet(sshTokenIDFlag) {
|
||||||
headers.Set(cfAccessClientIDHeader, c.String(sshTokenIDFlag))
|
headers.Set(cfAccessClientIDHeader, c.String(sshTokenIDFlag))
|
||||||
}
|
}
|
||||||
|
@ -89,9 +89,9 @@ func ssh(c *cli.Context) error {
|
||||||
carrier.SetBastionDest(headers, c.String(sshDestinationFlag))
|
carrier.SetBastionDest(headers, c.String(sshDestinationFlag))
|
||||||
|
|
||||||
options := &carrier.StartOptions{
|
options := &carrier.StartOptions{
|
||||||
OriginURL: originURL,
|
OriginURL: url.String(),
|
||||||
Headers: headers,
|
Headers: headers,
|
||||||
Host: hostname,
|
Host: url.Host,
|
||||||
}
|
}
|
||||||
|
|
||||||
if connectTo := c.String(sshConnectTo); connectTo != "" {
|
if connectTo := c.String(sshConnectTo); connectTo != "" {
|
||||||
|
@ -138,20 +138,9 @@ func ssh(c *cli.Context) error {
|
||||||
// default to 10 if provided but unset
|
// default to 10 if provided but unset
|
||||||
maxMessages = 10
|
maxMessages = 10
|
||||||
}
|
}
|
||||||
logger := log.With().Str("host", hostname).Logger()
|
logger := log.With().Str("host", url.Host).Logger()
|
||||||
s = stream.NewDebugStream(s, &logger, maxMessages)
|
s = stream.NewDebugStream(s, &logger, maxMessages)
|
||||||
}
|
}
|
||||||
carrier.StartClient(wsConn, s, options)
|
carrier.StartClient(wsConn, s, options)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildRequestHeaders(values []string) http.Header {
|
|
||||||
headers := make(http.Header)
|
|
||||||
for _, valuePair := range values {
|
|
||||||
header, value, found := strings.Cut(valuePair, ":")
|
|
||||||
if found {
|
|
||||||
headers.Add(strings.TrimSpace(header), strings.TrimSpace(value))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return headers
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
package access
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestBuildRequestHeaders(t *testing.T) {
|
|
||||||
headers := make(http.Header)
|
|
||||||
headers.Add("client", "value")
|
|
||||||
headers.Add("secret", "safe-value")
|
|
||||||
|
|
||||||
values := buildRequestHeaders([]string{"client: value", "secret: safe-value", "trash", "cf-trace-id: 000:000:0:1:asd"})
|
|
||||||
assert.Equal(t, headers.Get("client"), values.Get("client"))
|
|
||||||
assert.Equal(t, headers.Get("secret"), values.Get("secret"))
|
|
||||||
assert.Equal(t, headers.Get("cf-trace-id"), values.Get("000:000:0:1:asd"))
|
|
||||||
}
|
|
|
@ -26,6 +26,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
loginQuietFlag = "quiet"
|
||||||
sshHostnameFlag = "hostname"
|
sshHostnameFlag = "hostname"
|
||||||
sshDestinationFlag = "destination"
|
sshDestinationFlag = "destination"
|
||||||
sshURLFlag = "url"
|
sshURLFlag = "url"
|
||||||
|
@ -90,6 +91,13 @@ func Commands() []*cli.Command {
|
||||||
Once authenticated with your identity provider, the login command will generate a JSON Web Token (JWT)
|
Once authenticated with your identity provider, the login command will generate a JSON Web Token (JWT)
|
||||||
scoped to your identity, the application you intend to reach, and valid for a session duration set by your
|
scoped to your identity, the application you intend to reach, and valid for a session duration set by your
|
||||||
administrator. cloudflared stores the token in local storage.`,
|
administrator. cloudflared stores the token in local storage.`,
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: loginQuietFlag,
|
||||||
|
Aliases: []string{"q"},
|
||||||
|
Usage: "do not print the jwt to the command line",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "curl",
|
Name: "curl",
|
||||||
|
@ -222,8 +230,7 @@ func login(c *cli.Context) error {
|
||||||
log := logger.CreateLoggerFromContext(c, logger.EnableTerminalLog)
|
log := logger.CreateLoggerFromContext(c, logger.EnableTerminalLog)
|
||||||
|
|
||||||
args := c.Args()
|
args := c.Args()
|
||||||
rawURL := ensureURLScheme(args.First())
|
appURL, err := parseURL(args.First())
|
||||||
appURL, err := url.Parse(rawURL)
|
|
||||||
if args.Len() < 1 || err != nil {
|
if args.Len() < 1 || err != nil {
|
||||||
log.Error().Msg("Please provide the url of the Access application")
|
log.Error().Msg("Please provide the url of the Access application")
|
||||||
return err
|
return err
|
||||||
|
@ -247,21 +254,15 @@ func login(c *cli.Context) error {
|
||||||
fmt.Fprintln(os.Stderr, "token for provided application was empty.")
|
fmt.Fprintln(os.Stderr, "token for provided application was empty.")
|
||||||
return errors.New("empty application token")
|
return errors.New("empty application token")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.Bool(loginQuietFlag) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
fmt.Fprintf(os.Stdout, "Successfully fetched your token:\n\n%s\n\n", cfdToken)
|
fmt.Fprintf(os.Stdout, "Successfully fetched your token:\n\n%s\n\n", cfdToken)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensureURLScheme prepends a URL with https:// if it doesn't have a scheme. http:// URLs will not be converted.
|
|
||||||
func ensureURLScheme(url string) string {
|
|
||||||
url = strings.Replace(strings.ToLower(url), "http://", "https://", 1)
|
|
||||||
if !strings.HasPrefix(url, "https://") {
|
|
||||||
url = fmt.Sprintf("https://%s", url)
|
|
||||||
|
|
||||||
}
|
|
||||||
return url
|
|
||||||
}
|
|
||||||
|
|
||||||
// curl provides a wrapper around curl, passing Access JWT along in request
|
// curl provides a wrapper around curl, passing Access JWT along in request
|
||||||
func curl(c *cli.Context) error {
|
func curl(c *cli.Context) error {
|
||||||
err := sentry.Init(sentry.ClientOptions{
|
err := sentry.Init(sentry.ClientOptions{
|
||||||
|
@ -345,7 +346,7 @@ func generateToken(c *cli.Context) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
appURL, err := url.Parse(ensureURLScheme(c.String("app")))
|
appURL, err := parseURL(c.String("app"))
|
||||||
if err != nil || c.NumFlags() < 1 {
|
if err != nil || c.NumFlags() < 1 {
|
||||||
fmt.Fprintln(os.Stderr, "Please provide a url.")
|
fmt.Fprintln(os.Stderr, "Please provide a url.")
|
||||||
return err
|
return err
|
||||||
|
@ -398,7 +399,7 @@ func sshGen(c *cli.Context) error {
|
||||||
return cli.ShowCommandHelp(c, "ssh-gen")
|
return cli.ShowCommandHelp(c, "ssh-gen")
|
||||||
}
|
}
|
||||||
|
|
||||||
originURL, err := url.Parse(ensureURLScheme(hostname))
|
originURL, err := parseURL(hostname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -477,6 +478,11 @@ func processURL(s string) (*url.URL, error) {
|
||||||
|
|
||||||
// cloudflaredPath pulls the full path of cloudflared on disk
|
// cloudflaredPath pulls the full path of cloudflared on disk
|
||||||
func cloudflaredPath() string {
|
func cloudflaredPath() string {
|
||||||
|
path, err := os.Executable()
|
||||||
|
if err == nil && isFileThere(path) {
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
for _, p := range strings.Split(os.Getenv("PATH"), ":") {
|
for _, p := range strings.Split(os.Getenv("PATH"), ":") {
|
||||||
path := fmt.Sprintf("%s/%s", p, "cloudflared")
|
path := fmt.Sprintf("%s/%s", p, "cloudflared")
|
||||||
if isFileThere(path) {
|
if isFileThere(path) {
|
||||||
|
@ -499,7 +505,7 @@ func isFileThere(candidate string) bool {
|
||||||
// Then makes a request to to the origin with the token to ensure it is valid.
|
// Then makes a request to to the origin with the token to ensure it is valid.
|
||||||
// Returns nil if token is valid.
|
// Returns nil if token is valid.
|
||||||
func verifyTokenAtEdge(appUrl *url.URL, appInfo *token.AppInfo, c *cli.Context, log *zerolog.Logger) error {
|
func verifyTokenAtEdge(appUrl *url.URL, appInfo *token.AppInfo, c *cli.Context, log *zerolog.Logger) error {
|
||||||
headers := buildRequestHeaders(c.StringSlice(sshHeaderFlag))
|
headers := parseRequestHeaders(c.StringSlice(sshHeaderFlag))
|
||||||
if c.IsSet(sshTokenIDFlag) {
|
if c.IsSet(sshTokenIDFlag) {
|
||||||
headers.Add(cfAccessClientIDHeader, c.String(sshTokenIDFlag))
|
headers.Add(cfAccessClientIDHeader, c.String(sshTokenIDFlag))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
package access
|
|
||||||
|
|
||||||
import "testing"
|
|
||||||
|
|
||||||
func Test_ensureURLScheme(t *testing.T) {
|
|
||||||
type args struct {
|
|
||||||
url string
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{"no scheme", args{"localhost:123"}, "https://localhost:123"},
|
|
||||||
{"http scheme", args{"http://test"}, "https://test"},
|
|
||||||
{"https scheme", args{"https://test"}, "https://test"},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if got := ensureURLScheme(tt.args.url); got != tt.want {
|
|
||||||
t.Errorf("ensureURLScheme() = %v, want %v", got, tt.want)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
package access
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"golang.org/x/net/http/httpguts"
|
||||||
|
)
|
||||||
|
|
||||||
|
// parseRequestHeaders will take user-provided header values as strings "Content-Type: application/json" and create
|
||||||
|
// a http.Header object.
|
||||||
|
func parseRequestHeaders(values []string) http.Header {
|
||||||
|
headers := make(http.Header)
|
||||||
|
for _, valuePair := range values {
|
||||||
|
header, value, found := strings.Cut(valuePair, ":")
|
||||||
|
if found {
|
||||||
|
headers.Add(strings.TrimSpace(header), strings.TrimSpace(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return headers
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseHostname will attempt to convert a user provided URL string into a string with some light error checking on
|
||||||
|
// certain expectations from the URL.
|
||||||
|
// Will convert all HTTP URLs to HTTPS
|
||||||
|
func parseURL(input string) (*url.URL, error) {
|
||||||
|
if input == "" {
|
||||||
|
return nil, errors.New("no input provided")
|
||||||
|
}
|
||||||
|
if !strings.HasPrefix(input, "https://") && !strings.HasPrefix(input, "http://") {
|
||||||
|
input = fmt.Sprintf("https://%s", input)
|
||||||
|
}
|
||||||
|
url, err := url.ParseRequestURI(input)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to parse as URL: %w", err)
|
||||||
|
}
|
||||||
|
if url.Scheme != "https" {
|
||||||
|
url.Scheme = "https"
|
||||||
|
}
|
||||||
|
if url.Host == "" {
|
||||||
|
return nil, errors.New("failed to parse Host")
|
||||||
|
}
|
||||||
|
host, err := httpguts.PunycodeHostPort(url.Host)
|
||||||
|
if err != nil || host == "" {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if !httpguts.ValidHostHeader(host) {
|
||||||
|
return nil, errors.New("invalid Host provided")
|
||||||
|
}
|
||||||
|
url.Host = host
|
||||||
|
return url, nil
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
package access
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestParseRequestHeaders(t *testing.T) {
|
||||||
|
values := parseRequestHeaders([]string{"client: value", "secret: safe-value", "trash", "cf-trace-id: 000:000:0:1:asd"})
|
||||||
|
assert.Len(t, values, 3)
|
||||||
|
assert.Equal(t, "value", values.Get("client"))
|
||||||
|
assert.Equal(t, "safe-value", values.Get("secret"))
|
||||||
|
assert.Equal(t, "000:000:0:1:asd", values.Get("cf-trace-id"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseURL(t *testing.T) {
|
||||||
|
schemes := []string{
|
||||||
|
"http://",
|
||||||
|
"https://",
|
||||||
|
"",
|
||||||
|
}
|
||||||
|
hosts := []struct {
|
||||||
|
input string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{"localhost", "localhost"},
|
||||||
|
{"127.0.0.1", "127.0.0.1"},
|
||||||
|
{"127.0.0.1:9090", "127.0.0.1:9090"},
|
||||||
|
{"::1", "::1"},
|
||||||
|
{"::1:8080", "::1:8080"},
|
||||||
|
{"[::1]", "[::1]"},
|
||||||
|
{"[::1]:8080", "[::1]:8080"},
|
||||||
|
{":8080", ":8080"},
|
||||||
|
{"example.com", "example.com"},
|
||||||
|
{"hello.example.com", "hello.example.com"},
|
||||||
|
{"bücher.example.com", "xn--bcher-kva.example.com"},
|
||||||
|
}
|
||||||
|
paths := []string{
|
||||||
|
"",
|
||||||
|
"/test",
|
||||||
|
"/example.com?qwe=123",
|
||||||
|
}
|
||||||
|
for i, scheme := range schemes {
|
||||||
|
for j, host := range hosts {
|
||||||
|
for k, path := range paths {
|
||||||
|
t.Run(fmt.Sprintf("%d_%d_%d", i, j, k), func(t *testing.T) {
|
||||||
|
input := fmt.Sprintf("%s%s%s", scheme, host.input, path)
|
||||||
|
expected := fmt.Sprintf("%s%s%s", "https://", host.expected, path)
|
||||||
|
url, err := parseURL(input)
|
||||||
|
assert.NoError(t, err, "input: %s\texpected: %s", input, expected)
|
||||||
|
assert.Equal(t, expected, url.String())
|
||||||
|
assert.Equal(t, host.expected, url.Host)
|
||||||
|
assert.Equal(t, "https", url.Scheme)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("no input", func(t *testing.T) {
|
||||||
|
_, err := parseURL("")
|
||||||
|
assert.ErrorContains(t, err, "no input provided")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("missing host", func(t *testing.T) {
|
||||||
|
_, err := parseURL("https:///host")
|
||||||
|
assert.ErrorContains(t, err, "failed to parse Host")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("invalid path only", func(t *testing.T) {
|
||||||
|
_, err := parseURL("/host")
|
||||||
|
assert.ErrorContains(t, err, "failed to parse Host")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("invalid parse URL", func(t *testing.T) {
|
||||||
|
_, err := parseURL("https://host\\host")
|
||||||
|
assert.ErrorContains(t, err, "failed to parse as URL")
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build !windows && !darwin && !linux
|
//go:build !windows && !darwin && !linux
|
||||||
// +build !windows,!darwin,!linux
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build linux
|
//go:build linux
|
||||||
// +build linux
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
@ -25,6 +24,9 @@ func runApp(app *cli.App, graceShutdownC chan struct{}) {
|
||||||
Name: "install",
|
Name: "install",
|
||||||
Usage: "Install cloudflared as a system service",
|
Usage: "Install cloudflared as a system service",
|
||||||
Action: cliutil.ConfiguredAction(installLinuxService),
|
Action: cliutil.ConfiguredAction(installLinuxService),
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
noUpdateServiceFlag,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "uninstall",
|
Name: "uninstall",
|
||||||
|
@ -45,10 +47,12 @@ const (
|
||||||
serviceConfigPath = serviceConfigDir + "/" + serviceConfigFile
|
serviceConfigPath = serviceConfigDir + "/" + serviceConfigFile
|
||||||
serviceEnvFile = "/etc/default/cloudflared"
|
serviceEnvFile = "/etc/default/cloudflared"
|
||||||
cloudflaredService = "cloudflared.service"
|
cloudflaredService = "cloudflared.service"
|
||||||
|
cloudflaredUpdateService = "cloudflared-update.service"
|
||||||
|
cloudflaredUpdateTimer = "cloudflared-update.timer"
|
||||||
)
|
)
|
||||||
|
|
||||||
var systemdTemplates = []ServiceTemplate{
|
var systemdAllTemplates = map[string]ServiceTemplate{
|
||||||
{
|
cloudflaredService: {
|
||||||
Path: fmt.Sprintf("/etc/systemd/system/%s", cloudflaredService),
|
Path: fmt.Sprintf("/etc/systemd/system/%s", cloudflaredService),
|
||||||
Content: `[Unit]
|
Content: `[Unit]
|
||||||
Description=cloudflared
|
Description=cloudflared
|
||||||
|
@ -67,8 +71,8 @@ RestartSec=5s
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
cloudflaredUpdateService: {
|
||||||
Path: "/etc/systemd/system/cloudflared-update.service",
|
Path: fmt.Sprintf("/etc/systemd/system/%s", cloudflaredUpdateService),
|
||||||
Content: `[Unit]
|
Content: `[Unit]
|
||||||
Description=Update cloudflared
|
Description=Update cloudflared
|
||||||
After=network.target
|
After=network.target
|
||||||
|
@ -77,8 +81,8 @@ After=network.target
|
||||||
ExecStart=/bin/bash -c '{{ .Path }} update; code=$?; if [ $code -eq 11 ]; then systemctl restart cloudflared; exit 0; fi; exit $code'
|
ExecStart=/bin/bash -c '{{ .Path }} update; code=$?; if [ $code -eq 11 ]; then systemctl restart cloudflared; exit 0; fi; exit $code'
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
cloudflaredUpdateTimer: {
|
||||||
Path: "/etc/systemd/system/cloudflared-update.timer",
|
Path: fmt.Sprintf("/etc/systemd/system/%s", cloudflaredUpdateTimer),
|
||||||
Content: `[Unit]
|
Content: `[Unit]
|
||||||
Description=Update cloudflared
|
Description=Update cloudflared
|
||||||
|
|
||||||
|
@ -109,7 +113,7 @@ var sysvTemplate = ServiceTemplate{
|
||||||
# Description: cloudflared agent
|
# Description: cloudflared agent
|
||||||
### END INIT INFO
|
### END INIT INFO
|
||||||
name=$(basename $(readlink -f $0))
|
name=$(basename $(readlink -f $0))
|
||||||
cmd="{{.Path}} --pidfile /var/run/$name.pid --autoupdate-freq 24h0m0s{{ range .ExtraArgs }} {{ . }}{{ end }}"
|
cmd="{{.Path}} --pidfile /var/run/$name.pid {{ range .ExtraArgs }} {{ . }}{{ end }}"
|
||||||
pid_file="/var/run/$name.pid"
|
pid_file="/var/run/$name.pid"
|
||||||
stdout_log="/var/log/$name.log"
|
stdout_log="/var/log/$name.log"
|
||||||
stderr_log="/var/log/$name.err"
|
stderr_log="/var/log/$name.err"
|
||||||
|
@ -181,6 +185,14 @@ exit 0
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
noUpdateServiceFlag = &cli.BoolFlag{
|
||||||
|
Name: "no-update-service",
|
||||||
|
Usage: "Disable auto-update of the cloudflared linux service, which restarts the server to upgrade for new versions.",
|
||||||
|
Value: false,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
func isSystemd() bool {
|
func isSystemd() bool {
|
||||||
if _, err := os.Stat("/run/systemd/system"); err == nil {
|
if _, err := os.Stat("/run/systemd/system"); err == nil {
|
||||||
return true
|
return true
|
||||||
|
@ -199,6 +211,9 @@ func installLinuxService(c *cli.Context) error {
|
||||||
Path: etPath,
|
Path: etPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if the "no update flag" is set
|
||||||
|
autoUpdate := !c.IsSet(noUpdateServiceFlag.Name)
|
||||||
|
|
||||||
var extraArgsFunc buildArgsFunc
|
var extraArgsFunc buildArgsFunc
|
||||||
if c.NArg() == 0 {
|
if c.NArg() == 0 {
|
||||||
extraArgsFunc = buildArgsForConfig
|
extraArgsFunc = buildArgsForConfig
|
||||||
|
@ -220,10 +235,10 @@ func installLinuxService(c *cli.Context) error {
|
||||||
switch {
|
switch {
|
||||||
case isSystemd():
|
case isSystemd():
|
||||||
log.Info().Msgf("Using Systemd")
|
log.Info().Msgf("Using Systemd")
|
||||||
err = installSystemd(&templateArgs, log)
|
err = installSystemd(&templateArgs, autoUpdate, log)
|
||||||
default:
|
default:
|
||||||
log.Info().Msgf("Using SysV")
|
log.Info().Msgf("Using SysV")
|
||||||
err = installSysv(&templateArgs, log)
|
err = installSysv(&templateArgs, autoUpdate, log)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
@ -268,7 +283,20 @@ credentials-file: CREDENTIALS-FILE
|
||||||
}, nil, nil
|
}, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func installSystemd(templateArgs *ServiceTemplateArgs, log *zerolog.Logger) error {
|
func installSystemd(templateArgs *ServiceTemplateArgs, autoUpdate bool, log *zerolog.Logger) error {
|
||||||
|
var systemdTemplates []ServiceTemplate
|
||||||
|
if autoUpdate {
|
||||||
|
systemdTemplates = []ServiceTemplate{
|
||||||
|
systemdAllTemplates[cloudflaredService],
|
||||||
|
systemdAllTemplates[cloudflaredUpdateService],
|
||||||
|
systemdAllTemplates[cloudflaredUpdateTimer],
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
systemdTemplates = []ServiceTemplate{
|
||||||
|
systemdAllTemplates[cloudflaredService],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for _, serviceTemplate := range systemdTemplates {
|
for _, serviceTemplate := range systemdTemplates {
|
||||||
err := serviceTemplate.Generate(templateArgs)
|
err := serviceTemplate.Generate(templateArgs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -280,10 +308,14 @@ func installSystemd(templateArgs *ServiceTemplateArgs, log *zerolog.Logger) erro
|
||||||
log.Err(err).Msgf("systemctl enable %s error", cloudflaredService)
|
log.Err(err).Msgf("systemctl enable %s error", cloudflaredService)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := runCommand("systemctl", "start", "cloudflared-update.timer"); err != nil {
|
|
||||||
log.Err(err).Msg("systemctl start cloudflared-update.timer error")
|
if autoUpdate {
|
||||||
|
if err := runCommand("systemctl", "start", cloudflaredUpdateTimer); err != nil {
|
||||||
|
log.Err(err).Msgf("systemctl start %s error", cloudflaredUpdateTimer)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := runCommand("systemctl", "daemon-reload"); err != nil {
|
if err := runCommand("systemctl", "daemon-reload"); err != nil {
|
||||||
log.Err(err).Msg("systemctl daemon-reload error")
|
log.Err(err).Msg("systemctl daemon-reload error")
|
||||||
return err
|
return err
|
||||||
|
@ -291,12 +323,19 @@ func installSystemd(templateArgs *ServiceTemplateArgs, log *zerolog.Logger) erro
|
||||||
return runCommand("systemctl", "start", cloudflaredService)
|
return runCommand("systemctl", "start", cloudflaredService)
|
||||||
}
|
}
|
||||||
|
|
||||||
func installSysv(templateArgs *ServiceTemplateArgs, log *zerolog.Logger) error {
|
func installSysv(templateArgs *ServiceTemplateArgs, autoUpdate bool, log *zerolog.Logger) error {
|
||||||
confPath, err := sysvTemplate.ResolvePath()
|
confPath, err := sysvTemplate.ResolvePath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Err(err).Msg("error resolving system path")
|
log.Err(err).Msg("error resolving system path")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if autoUpdate {
|
||||||
|
templateArgs.ExtraArgs = append([]string{"--autoupdate-freq 24h0m0s"}, templateArgs.ExtraArgs...)
|
||||||
|
} else {
|
||||||
|
templateArgs.ExtraArgs = append([]string{"--no-autoupdate"}, templateArgs.ExtraArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
if err := sysvTemplate.Generate(templateArgs); err != nil {
|
if err := sysvTemplate.Generate(templateArgs); err != nil {
|
||||||
log.Err(err).Msg("error generating system template")
|
log.Err(err).Msg("error generating system template")
|
||||||
return err
|
return err
|
||||||
|
@ -334,6 +373,17 @@ func uninstallLinuxService(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func uninstallSystemd(log *zerolog.Logger) error {
|
func uninstallSystemd(log *zerolog.Logger) error {
|
||||||
|
// Get only the installed services
|
||||||
|
installedServices := make(map[string]ServiceTemplate)
|
||||||
|
for serviceName, serviceTemplate := range systemdAllTemplates {
|
||||||
|
if err := runCommand("systemctl", "list-units", "--all", "|", "grep", serviceName); err == nil {
|
||||||
|
installedServices[serviceName] = serviceTemplate
|
||||||
|
} else {
|
||||||
|
log.Info().Msgf("Service '%s' not installed, skipping its uninstall", serviceName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, exists := installedServices[cloudflaredService]; exists {
|
||||||
if err := runCommand("systemctl", "disable", cloudflaredService); err != nil {
|
if err := runCommand("systemctl", "disable", cloudflaredService); err != nil {
|
||||||
log.Err(err).Msgf("systemctl disable %s error", cloudflaredService)
|
log.Err(err).Msgf("systemctl disable %s error", cloudflaredService)
|
||||||
return err
|
return err
|
||||||
|
@ -342,11 +392,16 @@ func uninstallSystemd(log *zerolog.Logger) error {
|
||||||
log.Err(err).Msgf("systemctl stop %s error", cloudflaredService)
|
log.Err(err).Msgf("systemctl stop %s error", cloudflaredService)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := runCommand("systemctl", "stop", "cloudflared-update.timer"); err != nil {
|
}
|
||||||
log.Err(err).Msg("systemctl stop cloudflared-update.timer error")
|
|
||||||
|
if _, exists := installedServices[cloudflaredUpdateTimer]; exists {
|
||||||
|
if err := runCommand("systemctl", "stop", cloudflaredUpdateTimer); err != nil {
|
||||||
|
log.Err(err).Msgf("systemctl stop %s error", cloudflaredUpdateTimer)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, serviceTemplate := range systemdTemplates {
|
}
|
||||||
|
|
||||||
|
for _, serviceTemplate := range installedServices {
|
||||||
if err := serviceTemplate.Remove(); err != nil {
|
if err := serviceTemplate.Remove(); err != nil {
|
||||||
log.Err(err).Msg("error removing service template")
|
log.Err(err).Msg("error removing service template")
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build darwin
|
//go:build darwin
|
||||||
// +build darwin
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
|
@ -102,7 +101,7 @@ func (st *ServiceTemplate) Generate(args *ServiceTemplateArgs) error {
|
||||||
return fmt.Errorf("error creating %s: %v", plistFolder, err)
|
return fmt.Errorf("error creating %s: %v", plistFolder, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ioutil.WriteFile(resolvedPath, buffer.Bytes(), fileMode)
|
err = os.WriteFile(resolvedPath, buffer.Bytes(), fileMode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error writing %s: %v", resolvedPath, err)
|
return fmt.Errorf("error writing %s: %v", resolvedPath, err)
|
||||||
}
|
}
|
||||||
|
@ -141,7 +140,7 @@ func runCommand(command string, args ...string) error {
|
||||||
return fmt.Errorf("error starting %s: %v", command, err)
|
return fmt.Errorf("error starting %s: %v", command, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
output, _ := ioutil.ReadAll(stderr)
|
output, _ := io.ReadAll(stderr)
|
||||||
err = cmd.Wait()
|
err = cmd.Wait()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%s %v returned with error code %v due to: %v", command, args, err, string(output))
|
return fmt.Errorf("%s %v returned with error code %v due to: %v", command, args, err, string(output))
|
||||||
|
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"runtime/trace"
|
"runtime/trace"
|
||||||
|
@ -12,7 +11,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/go-systemd/daemon"
|
"github.com/coreos/go-systemd/v22/daemon"
|
||||||
"github.com/facebookgo/grace/gracenet"
|
"github.com/facebookgo/grace/gracenet"
|
||||||
"github.com/getsentry/sentry-go"
|
"github.com/getsentry/sentry-go"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
@ -305,7 +304,7 @@ func StartServer(
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.IsSet("trace-output") {
|
if c.IsSet("trace-output") {
|
||||||
tmpTraceFile, err := ioutil.TempFile("", "trace")
|
tmpTraceFile, err := os.CreateTemp("", "trace")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Err(err).Msg("Failed to create new temporary file to save trace output")
|
log.Err(err).Msg("Failed to create new temporary file to save trace output")
|
||||||
}
|
}
|
||||||
|
@ -341,7 +340,7 @@ func StartServer(
|
||||||
logClientOptions(c, log)
|
logClientOptions(c, log)
|
||||||
|
|
||||||
// this context drives the server, when it's cancelled tunnel and all other components (origins, dns, etc...) should stop
|
// this context drives the server, when it's cancelled tunnel and all other components (origins, dns, etc...) should stop
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(c.Context)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
go waitForSignal(graceShutdownC, log)
|
go waitForSignal(graceShutdownC, log)
|
||||||
|
@ -393,7 +392,7 @@ func StartServer(
|
||||||
observer.SendURL(quickTunnelURL)
|
observer.SendURL(quickTunnelURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
tunnelConfig, orchestratorConfig, err := prepareTunnelConfig(c, info, log, logTransport, observer, namedTunnel)
|
tunnelConfig, orchestratorConfig, err := prepareTunnelConfig(ctx, c, info, log, logTransport, observer, namedTunnel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Err(err).Msg("Couldn't start tunnel")
|
log.Err(err).Msg("Couldn't start tunnel")
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -4,10 +4,12 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/cloudflare/cloudflared/features"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDedup(t *testing.T) {
|
func TestDedup(t *testing.T) {
|
||||||
expected := []string{"a", "b"}
|
expected := []string{"a", "b"}
|
||||||
actual := dedup([]string{"a", "b", "a"})
|
actual := features.Dedup([]string{"a", "b", "a"})
|
||||||
require.ElementsMatch(t, expected, actual)
|
require.ElementsMatch(t, expected, actual)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package tunnel
|
package tunnel
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
mathRand "math/rand"
|
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"os"
|
"os"
|
||||||
|
@ -15,7 +15,7 @@ import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"github.com/urfave/cli/v2/altsrc"
|
"github.com/urfave/cli/v2/altsrc"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/term"
|
||||||
|
|
||||||
"github.com/cloudflare/cloudflared/cmd/cloudflared/cliutil"
|
"github.com/cloudflare/cloudflared/cmd/cloudflared/cliutil"
|
||||||
"github.com/cloudflare/cloudflared/config"
|
"github.com/cloudflare/cloudflared/config"
|
||||||
|
@ -33,9 +33,9 @@ import (
|
||||||
const secretValue = "*****"
|
const secretValue = "*****"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
developerPortal = "https://developers.cloudflare.com/argo-tunnel"
|
developerPortal = "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup"
|
||||||
serviceUrl = developerPortal + "/reference/service/"
|
serviceUrl = developerPortal + "/tunnel-guide/local/as-a-service/"
|
||||||
argumentsUrl = developerPortal + "/reference/arguments/"
|
argumentsUrl = developerPortal + "/tunnel-guide/local/local-management/arguments/"
|
||||||
|
|
||||||
secretFlags = [2]*altsrc.StringFlag{credentialsContentsFlag, tunnelTokenFlag}
|
secretFlags = [2]*altsrc.StringFlag{credentialsContentsFlag, tunnelTokenFlag}
|
||||||
|
|
||||||
|
@ -113,6 +113,7 @@ func dnsProxyStandAlone(c *cli.Context, namedTunnel *connection.NamedTunnelPrope
|
||||||
}
|
}
|
||||||
|
|
||||||
func prepareTunnelConfig(
|
func prepareTunnelConfig(
|
||||||
|
ctx context.Context,
|
||||||
c *cli.Context,
|
c *cli.Context,
|
||||||
info *cliutil.BuildInfo,
|
info *cliutil.BuildInfo,
|
||||||
log, logTransport *zerolog.Logger,
|
log, logTransport *zerolog.Logger,
|
||||||
|
@ -132,22 +133,36 @@ func prepareTunnelConfig(
|
||||||
tags = append(tags, tunnelpogs.Tag{Name: "ID", Value: clientID.String()})
|
tags = append(tags, tunnelpogs.Tag{Name: "ID", Value: clientID.String()})
|
||||||
|
|
||||||
transportProtocol := c.String("protocol")
|
transportProtocol := c.String("protocol")
|
||||||
needPQ := c.Bool("post-quantum")
|
|
||||||
if needPQ {
|
clientFeatures := features.Dedup(append(c.StringSlice("features"), features.DefaultFeatures...))
|
||||||
|
|
||||||
|
staticFeatures := features.StaticFeatures{}
|
||||||
|
if c.Bool("post-quantum") {
|
||||||
if FipsEnabled {
|
if FipsEnabled {
|
||||||
return nil, nil, fmt.Errorf("post-quantum not supported in FIPS mode")
|
return nil, nil, fmt.Errorf("post-quantum not supported in FIPS mode")
|
||||||
}
|
}
|
||||||
|
pqMode := features.PostQuantumStrict
|
||||||
|
staticFeatures.PostQuantumMode = &pqMode
|
||||||
|
}
|
||||||
|
featureSelector, err := features.NewFeatureSelector(ctx, namedTunnel.Credentials.AccountTag, staticFeatures, log)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, errors.Wrap(err, "Failed to create feature selector")
|
||||||
|
}
|
||||||
|
pqMode := featureSelector.PostQuantumMode()
|
||||||
|
if pqMode == features.PostQuantumStrict {
|
||||||
// Error if the user tries to force a non-quic transport protocol
|
// Error if the user tries to force a non-quic transport protocol
|
||||||
if transportProtocol != connection.AutoSelectFlag && transportProtocol != connection.QUIC.String() {
|
if transportProtocol != connection.AutoSelectFlag && transportProtocol != connection.QUIC.String() {
|
||||||
return nil, nil, fmt.Errorf("post-quantum is only supported with the quic transport")
|
return nil, nil, fmt.Errorf("post-quantum is only supported with the quic transport")
|
||||||
}
|
}
|
||||||
transportProtocol = connection.QUIC.String()
|
transportProtocol = connection.QUIC.String()
|
||||||
|
clientFeatures = append(clientFeatures, features.FeaturePostQuantum)
|
||||||
|
|
||||||
|
log.Info().Msgf(
|
||||||
|
"Using hybrid post-quantum key agreement %s",
|
||||||
|
supervisor.PQKexName,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
clientFeatures := dedup(append(c.StringSlice("features"), features.DefaultFeatures...))
|
|
||||||
if needPQ {
|
|
||||||
clientFeatures = append(clientFeatures, features.FeaturePostQuantum)
|
|
||||||
}
|
|
||||||
namedTunnel.Client = tunnelpogs.ClientInfo{
|
namedTunnel.Client = tunnelpogs.ClientInfo{
|
||||||
ClientID: clientID[:],
|
ClientID: clientID[:],
|
||||||
Features: clientFeatures,
|
Features: clientFeatures,
|
||||||
|
@ -203,15 +218,6 @@ func prepareTunnelConfig(
|
||||||
log.Warn().Str("edgeIPVersion", edgeIPVersion.String()).Err(err).Msg("Overriding edge-ip-version")
|
log.Warn().Str("edgeIPVersion", edgeIPVersion.String()).Err(err).Msg("Overriding edge-ip-version")
|
||||||
}
|
}
|
||||||
|
|
||||||
var pqKexIdx int
|
|
||||||
if needPQ {
|
|
||||||
pqKexIdx = mathRand.Intn(len(supervisor.PQKexes))
|
|
||||||
log.Info().Msgf(
|
|
||||||
"Using experimental hybrid post-quantum key agreement %s",
|
|
||||||
supervisor.PQKexNames[supervisor.PQKexes[pqKexIdx]],
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
tunnelConfig := &supervisor.TunnelConfig{
|
tunnelConfig := &supervisor.TunnelConfig{
|
||||||
GracePeriod: gracePeriod,
|
GracePeriod: gracePeriod,
|
||||||
ReplaceExisting: c.Bool("force"),
|
ReplaceExisting: c.Bool("force"),
|
||||||
|
@ -222,7 +228,6 @@ func prepareTunnelConfig(
|
||||||
EdgeIPVersion: edgeIPVersion,
|
EdgeIPVersion: edgeIPVersion,
|
||||||
EdgeBindAddr: edgeBindAddr,
|
EdgeBindAddr: edgeBindAddr,
|
||||||
HAConnections: c.Int(haConnectionsFlag),
|
HAConnections: c.Int(haConnectionsFlag),
|
||||||
IncidentLookup: supervisor.NewIncidentLookup(),
|
|
||||||
IsAutoupdated: c.Bool("is-autoupdated"),
|
IsAutoupdated: c.Bool("is-autoupdated"),
|
||||||
LBPool: c.String("lb-pool"),
|
LBPool: c.String("lb-pool"),
|
||||||
Tags: tags,
|
Tags: tags,
|
||||||
|
@ -236,8 +241,7 @@ func prepareTunnelConfig(
|
||||||
NamedTunnel: namedTunnel,
|
NamedTunnel: namedTunnel,
|
||||||
ProtocolSelector: protocolSelector,
|
ProtocolSelector: protocolSelector,
|
||||||
EdgeTLSConfigs: edgeTLSConfigs,
|
EdgeTLSConfigs: edgeTLSConfigs,
|
||||||
NeedPQ: needPQ,
|
FeatureSelector: featureSelector,
|
||||||
PQKexIdx: pqKexIdx,
|
|
||||||
MaxEdgeAddrRetries: uint8(c.Int("max-edge-addr-retries")),
|
MaxEdgeAddrRetries: uint8(c.Int("max-edge-addr-retries")),
|
||||||
UDPUnregisterSessionTimeout: c.Duration(udpUnregisterSessionTimeoutFlag),
|
UDPUnregisterSessionTimeout: c.Duration(udpUnregisterSessionTimeoutFlag),
|
||||||
DisableQUICPathMTUDiscovery: c.Bool(quicDisablePathMTUDiscovery),
|
DisableQUICPathMTUDiscovery: c.Bool(quicDisablePathMTUDiscovery),
|
||||||
|
@ -277,26 +281,7 @@ func gracePeriod(c *cli.Context) (time.Duration, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func isRunningFromTerminal() bool {
|
func isRunningFromTerminal() bool {
|
||||||
return terminal.IsTerminal(int(os.Stdout.Fd()))
|
return term.IsTerminal(int(os.Stdout.Fd()))
|
||||||
}
|
|
||||||
|
|
||||||
// Remove any duplicates from the slice
|
|
||||||
func dedup(slice []string) []string {
|
|
||||||
|
|
||||||
// Convert the slice into a set
|
|
||||||
set := make(map[string]bool, 0)
|
|
||||||
for _, str := range slice {
|
|
||||||
set[str] = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert the set back into a slice
|
|
||||||
keys := make([]string, len(set))
|
|
||||||
i := 0
|
|
||||||
for str := range set {
|
|
||||||
keys[i] = str
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
return keys
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseConfigIPVersion returns the IP version from possible expected values from config
|
// ParseConfigIPVersion returns the IP version from possible expected values from config
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build ignore
|
//go:build ignore
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// TODO: Remove the above build tag and include this test when we start compiling with Golang 1.10.0+
|
// TODO: Remove the above build tag and include this test when we start compiling with Golang 1.10.0+
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package tunnel
|
package tunnel
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,5 +22,5 @@ func (fs realFileSystem) validFilePath(path string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fs realFileSystem) readFile(filePath string) ([]byte, error) {
|
func (fs realFileSystem) readFile(filePath string) ([]byte, error) {
|
||||||
return ioutil.ReadFile(filePath)
|
return os.ReadFile(filePath)
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,7 +139,7 @@ func testURLCommand(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
_, i := ing.FindMatchingRule(requestURL.Hostname(), requestURL.Path)
|
_, i := ing.FindMatchingRule(requestURL.Hostname(), requestURL.Path)
|
||||||
fmt.Printf("Matched rule #%d\n", i+1)
|
fmt.Printf("Matched rule #%d\n", i)
|
||||||
fmt.Println(ing.Rules[i].MultiLineString())
|
fmt.Println(ing.Rules[i].MultiLineString())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package tunnel
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -66,7 +65,7 @@ func login(c *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := ioutil.WriteFile(path, resourceData, 0600); err != nil {
|
if err := os.WriteFile(path, resourceData, 0600); err != nil {
|
||||||
return errors.Wrap(err, fmt.Sprintf("error writing cert to %s", path))
|
return errors.Wrap(err, fmt.Sprintf("error writing cert to %s", path))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build !windows
|
//go:build !windows
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package tunnel
|
package tunnel
|
||||||
|
|
||||||
|
|
|
@ -156,7 +156,7 @@ func (sc *subcommandContext) create(name string, credentialsFilePath string, sec
|
||||||
var errorLines []string
|
var errorLines []string
|
||||||
errorLines = append(errorLines, fmt.Sprintf("Your tunnel '%v' was created with ID %v. However, cloudflared couldn't write tunnel credentials to %s.", tunnel.Name, tunnel.ID, credentialsFilePath))
|
errorLines = append(errorLines, fmt.Sprintf("Your tunnel '%v' was created with ID %v. However, cloudflared couldn't write tunnel credentials to %s.", tunnel.Name, tunnel.ID, credentialsFilePath))
|
||||||
errorLines = append(errorLines, fmt.Sprintf("The file-writing error is: %v", writeFileErr))
|
errorLines = append(errorLines, fmt.Sprintf("The file-writing error is: %v", writeFileErr))
|
||||||
if deleteErr := client.DeleteTunnel(tunnel.ID); deleteErr != nil {
|
if deleteErr := client.DeleteTunnel(tunnel.ID, true); deleteErr != nil {
|
||||||
errorLines = append(errorLines, fmt.Sprintf("Cloudflared tried to delete the tunnel for you, but encountered an error. You should use `cloudflared tunnel delete %v` to delete the tunnel yourself, because the tunnel can't be run without the tunnelfile.", tunnel.ID))
|
errorLines = append(errorLines, fmt.Sprintf("Cloudflared tried to delete the tunnel for you, but encountered an error. You should use `cloudflared tunnel delete %v` to delete the tunnel yourself, because the tunnel can't be run without the tunnelfile.", tunnel.ID))
|
||||||
errorLines = append(errorLines, fmt.Sprintf("The delete tunnel error is: %v", deleteErr))
|
errorLines = append(errorLines, fmt.Sprintf("The delete tunnel error is: %v", deleteErr))
|
||||||
} else {
|
} else {
|
||||||
|
@ -206,13 +206,8 @@ func (sc *subcommandContext) delete(tunnelIDs []uuid.UUID) error {
|
||||||
if !tunnel.DeletedAt.IsZero() {
|
if !tunnel.DeletedAt.IsZero() {
|
||||||
return fmt.Errorf("Tunnel %s has already been deleted", tunnel.ID)
|
return fmt.Errorf("Tunnel %s has already been deleted", tunnel.ID)
|
||||||
}
|
}
|
||||||
if forceFlagSet {
|
|
||||||
if err := client.CleanupConnections(tunnel.ID, cfapi.NewCleanupParams()); err != nil {
|
|
||||||
return errors.Wrapf(err, "Error cleaning up connections for tunnel %s", tunnel.ID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := client.DeleteTunnel(tunnel.ID); err != nil {
|
if err := client.DeleteTunnel(tunnel.ID, forceFlagSet); err != nil {
|
||||||
return errors.Wrapf(err, "Error deleting tunnel %s", tunnel.ID)
|
return errors.Wrapf(err, "Error deleting tunnel %s", tunnel.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package tunnel
|
package tunnel
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/cloudflare/cloudflared/cfapi"
|
"github.com/cloudflare/cloudflared/cfapi"
|
||||||
|
@ -24,12 +27,12 @@ func (sc *subcommandContext) addRoute(newRoute cfapi.NewRoute) (cfapi.Route, err
|
||||||
return client.AddRoute(newRoute)
|
return client.AddRoute(newRoute)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sc *subcommandContext) deleteRoute(params cfapi.DeleteRouteParams) error {
|
func (sc *subcommandContext) deleteRoute(id uuid.UUID) error {
|
||||||
client, err := sc.client()
|
client, err := sc.client()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, noClientMsg)
|
return errors.Wrap(err, noClientMsg)
|
||||||
}
|
}
|
||||||
return client.DeleteRoute(params)
|
return client.DeleteRoute(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sc *subcommandContext) getRouteByIP(params cfapi.GetRouteByIpParams) (cfapi.DetailedRoute, error) {
|
func (sc *subcommandContext) getRouteByIP(params cfapi.GetRouteByIpParams) (cfapi.DetailedRoute, error) {
|
||||||
|
@ -39,3 +42,25 @@ func (sc *subcommandContext) getRouteByIP(params cfapi.GetRouteByIpParams) (cfap
|
||||||
}
|
}
|
||||||
return client.GetByIP(params)
|
return client.GetByIP(params)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sc *subcommandContext) getRouteId(network net.IPNet, vnetId *uuid.UUID) (uuid.UUID, error) {
|
||||||
|
filters := cfapi.NewIPRouteFilter()
|
||||||
|
filters.NotDeleted()
|
||||||
|
filters.NetworkIsSubsetOf(network)
|
||||||
|
filters.NetworkIsSupersetOf(network)
|
||||||
|
|
||||||
|
if vnetId != nil {
|
||||||
|
filters.VNetID(*vnetId)
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := sc.listRoutes(filters)
|
||||||
|
if err != nil {
|
||||||
|
return uuid.Nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(result) != 1 {
|
||||||
|
return uuid.Nil, errors.New("unable to find route for provided network and vnet")
|
||||||
|
}
|
||||||
|
|
||||||
|
return result[0].ID, nil
|
||||||
|
}
|
||||||
|
|
|
@ -219,7 +219,7 @@ func (d *deleteMockTunnelStore) GetTunnelToken(tunnelID uuid.UUID) (string, erro
|
||||||
return "token", nil
|
return "token", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *deleteMockTunnelStore) DeleteTunnel(tunnelID uuid.UUID) error {
|
func (d *deleteMockTunnelStore) DeleteTunnel(tunnelID uuid.UUID, cascade bool) error {
|
||||||
tunnel, ok := d.mockTunnels[tunnelID]
|
tunnel, ok := d.mockTunnels[tunnelID]
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("Couldn't find tunnel: %v", tunnelID)
|
return fmt.Errorf("Couldn't find tunnel: %v", tunnelID)
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
@ -120,8 +119,8 @@ var (
|
||||||
forceDeleteFlag = &cli.BoolFlag{
|
forceDeleteFlag = &cli.BoolFlag{
|
||||||
Name: "force",
|
Name: "force",
|
||||||
Aliases: []string{"f"},
|
Aliases: []string{"f"},
|
||||||
Usage: "Cleans up any stale connections before the tunnel is deleted. cloudflared will not " +
|
Usage: "Deletes a tunnel even if tunnel is connected and it has dependencies associated to it. (eg. IP routes)." +
|
||||||
"delete a tunnel with connections without this flag.",
|
" It is not possible to delete tunnels that have connections or non-deleted dependencies, without this flag.",
|
||||||
EnvVars: []string{"TUNNEL_RUN_FORCE_OVERWRITE"},
|
EnvVars: []string{"TUNNEL_RUN_FORCE_OVERWRITE"},
|
||||||
}
|
}
|
||||||
selectProtocolFlag = altsrc.NewStringFlag(&cli.StringFlag{
|
selectProtocolFlag = altsrc.NewStringFlag(&cli.StringFlag{
|
||||||
|
@ -241,7 +240,7 @@ func writeTunnelCredentials(filePath string, credentials *connection.Credentials
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Unable to marshal tunnel credentials to JSON")
|
return errors.Wrap(err, "Unable to marshal tunnel credentials to JSON")
|
||||||
}
|
}
|
||||||
return ioutil.WriteFile(filePath, body, 400)
|
return os.WriteFile(filePath, body, 0400)
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildListCommand() *cli.Command {
|
func buildListCommand() *cli.Command {
|
||||||
|
|
|
@ -21,6 +21,8 @@ var (
|
||||||
Aliases: []string{"vn"},
|
Aliases: []string{"vn"},
|
||||||
Usage: "The ID or name of the virtual network to which the route is associated to.",
|
Usage: "The ID or name of the virtual network to which the route is associated to.",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
routeAddError = errors.New("You must supply exactly one argument, the ID or CIDR of the route you want to delete")
|
||||||
)
|
)
|
||||||
|
|
||||||
func buildRouteIPSubcommand() *cli.Command {
|
func buildRouteIPSubcommand() *cli.Command {
|
||||||
|
@ -68,11 +70,9 @@ which virtual network's routing table you want to add the route to with:
|
||||||
Name: "delete",
|
Name: "delete",
|
||||||
Action: cliutil.ConfiguredAction(deleteRouteCommand),
|
Action: cliutil.ConfiguredAction(deleteRouteCommand),
|
||||||
Usage: "Delete a row from your organization's private routing table",
|
Usage: "Delete a row from your organization's private routing table",
|
||||||
UsageText: "cloudflared tunnel [--config FILEPATH] route ip delete [flags] [CIDR]",
|
UsageText: "cloudflared tunnel [--config FILEPATH] route ip delete [flags] [Route ID or CIDR]",
|
||||||
Description: `Deletes the row for a given CIDR from your routing table. That portion of your network
|
Description: `Deletes the row for the given route ID from your routing table. That portion of your network
|
||||||
will no longer be reachable by the WARP clients. Note that if you use virtual
|
will no longer be reachable.`,
|
||||||
networks, then you have to tell which virtual network whose routing table you
|
|
||||||
have a row deleted from.`,
|
|
||||||
Flags: []cli.Flag{vnetFlag},
|
Flags: []cli.Flag{vnetFlag},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -187,33 +187,36 @@ func deleteRouteCommand(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.NArg() != 1 {
|
if c.NArg() != 1 {
|
||||||
return errors.New("You must supply exactly one argument, the network whose route you want to delete (in CIDR form e.g. 1.2.3.4/32)")
|
return routeAddError
|
||||||
}
|
}
|
||||||
|
|
||||||
_, network, err := net.ParseCIDR(c.Args().First())
|
var routeId uuid.UUID
|
||||||
|
routeId, err = uuid.Parse(c.Args().First())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Invalid network CIDR")
|
_, network, err := net.ParseCIDR(c.Args().First())
|
||||||
}
|
if err != nil || network == nil {
|
||||||
if network == nil {
|
return routeAddError
|
||||||
return errors.New("Invalid network CIDR")
|
|
||||||
}
|
|
||||||
|
|
||||||
params := cfapi.DeleteRouteParams{
|
|
||||||
Network: *network,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var vnetId *uuid.UUID
|
||||||
if c.IsSet(vnetFlag.Name) {
|
if c.IsSet(vnetFlag.Name) {
|
||||||
vnetId, err := getVnetId(sc, c.String(vnetFlag.Name))
|
id, err := getVnetId(sc, c.String(vnetFlag.Name))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
params.VNetID = &vnetId
|
vnetId = &id
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := sc.deleteRoute(params); err != nil {
|
routeId, err = sc.getRouteId(*network, vnetId)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := sc.deleteRoute(routeId); err != nil {
|
||||||
return errors.Wrap(err, "API error")
|
return errors.Wrap(err, "API error")
|
||||||
}
|
}
|
||||||
fmt.Printf("Successfully deleted route for %s\n", network)
|
fmt.Printf("Successfully deleted route with ID %s\n", routeId)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +272,7 @@ func formatAndPrintRouteList(routes []*cfapi.DetailedRoute) {
|
||||||
defer writer.Flush()
|
defer writer.Flush()
|
||||||
|
|
||||||
// Print column headers with tabbed columns
|
// Print column headers with tabbed columns
|
||||||
_, _ = fmt.Fprintln(writer, "NETWORK\tVIRTUAL NET ID\tCOMMENT\tTUNNEL ID\tTUNNEL NAME\tCREATED\tDELETED\t")
|
_, _ = fmt.Fprintln(writer, "ID\tNETWORK\tVIRTUAL NET ID\tCOMMENT\tTUNNEL ID\tTUNNEL NAME\tCREATED\tDELETED\t")
|
||||||
|
|
||||||
// Loop through routes, create formatted string for each, and print using tabwriter
|
// Loop through routes, create formatted string for each, and print using tabwriter
|
||||||
for _, route := range routes {
|
for _, route := range routes {
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"github.com/facebookgo/grace/gracenet"
|
"github.com/facebookgo/grace/gracenet"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/term"
|
||||||
|
|
||||||
"github.com/cloudflare/cloudflared/config"
|
"github.com/cloudflare/cloudflared/config"
|
||||||
"github.com/cloudflare/cloudflared/logger"
|
"github.com/cloudflare/cloudflared/logger"
|
||||||
|
@ -304,7 +304,7 @@ func wasInstalledFromPackageManager() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func isRunningFromTerminal() bool {
|
func isRunningFromTerminal() bool {
|
||||||
return terminal.IsTerminal(int(os.Stdout.Fd()))
|
return term.IsTerminal(int(os.Stdout.Fd()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsSysV() bool {
|
func IsSysV() bool {
|
||||||
|
|
|
@ -56,6 +56,9 @@ func (s *WorkersService) Check() (CheckResult, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
req, err := http.NewRequest(http.MethodGet, s.url, nil)
|
req, err := http.NewRequest(http.MethodGet, s.url, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
q := req.URL.Query()
|
q := req.URL.Query()
|
||||||
q.Add(OSKeyName, runtime.GOOS)
|
q.Add(OSKeyName, runtime.GOOS)
|
||||||
q.Add(ArchitectureKeyName, runtime.GOARCH)
|
q.Add(ArchitectureKeyName, runtime.GOARCH)
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build !windows
|
//go:build !windows
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package updater
|
package updater
|
||||||
|
|
||||||
|
@ -11,7 +10,6 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
@ -224,7 +222,7 @@ func TestUpdateService(t *testing.T) {
|
||||||
require.Equal(t, v.Version(), mostRecentVersion)
|
require.Equal(t, v.Version(), mostRecentVersion)
|
||||||
|
|
||||||
require.NoError(t, v.Apply())
|
require.NoError(t, v.Apply())
|
||||||
dat, err := ioutil.ReadFile(testFilePath)
|
dat, err := os.ReadFile(testFilePath)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, string(dat), mostRecentVersion)
|
require.Equal(t, string(dat), mostRecentVersion)
|
||||||
|
@ -243,7 +241,7 @@ func TestBetaUpdateService(t *testing.T) {
|
||||||
require.Equal(t, v.Version(), mostRecentBetaVersion)
|
require.Equal(t, v.Version(), mostRecentBetaVersion)
|
||||||
|
|
||||||
require.NoError(t, v.Apply())
|
require.NoError(t, v.Apply())
|
||||||
dat, err := ioutil.ReadFile(testFilePath)
|
dat, err := os.ReadFile(testFilePath)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, string(dat), mostRecentBetaVersion)
|
require.Equal(t, string(dat), mostRecentBetaVersion)
|
||||||
|
@ -289,7 +287,7 @@ func TestForcedUpdateService(t *testing.T) {
|
||||||
require.Equal(t, v.Version(), mostRecentVersion)
|
require.Equal(t, v.Version(), mostRecentVersion)
|
||||||
|
|
||||||
require.NoError(t, v.Apply())
|
require.NoError(t, v.Apply())
|
||||||
dat, err := ioutil.ReadFile(testFilePath)
|
dat, err := os.ReadFile(testFilePath)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, string(dat), mostRecentVersion)
|
require.Equal(t, string(dat), mostRecentVersion)
|
||||||
|
@ -309,7 +307,7 @@ func TestUpdateSpecificVersionService(t *testing.T) {
|
||||||
require.Equal(t, reqVersion, v.Version())
|
require.Equal(t, reqVersion, v.Version())
|
||||||
|
|
||||||
require.NoError(t, v.Apply())
|
require.NoError(t, v.Apply())
|
||||||
dat, err := ioutil.ReadFile(testFilePath)
|
dat, err := os.ReadFile(testFilePath)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, reqVersion, string(dat))
|
require.Equal(t, reqVersion, string(dat))
|
||||||
|
@ -328,7 +326,7 @@ func TestCompressedUpdateService(t *testing.T) {
|
||||||
require.Equal(t, "2020.09.02", v.Version())
|
require.Equal(t, "2020.09.02", v.Version())
|
||||||
|
|
||||||
require.NoError(t, v.Apply())
|
require.NoError(t, v.Apply())
|
||||||
dat, err := ioutil.ReadFile(testFilePath)
|
dat, err := os.ReadFile(testFilePath)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "2020.09.02", string(dat))
|
require.Equal(t, "2020.09.02", string(dat))
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build windows
|
//go:build windows
|
||||||
// +build windows
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
cloudflare==2.8.15
|
cloudflare==2.14.3
|
||||||
flaky==3.7.0
|
flaky==3.7.0
|
||||||
pytest==7.3.1
|
pytest==7.3.1
|
||||||
pytest-asyncio==0.21.0
|
pytest-asyncio==0.21.0
|
||||||
pyyaml==5.4.1
|
pyyaml==6.0.1
|
||||||
requests==2.28.2
|
requests==2.28.2
|
||||||
retrying==1.3.4
|
retrying==1.3.4
|
||||||
websockets==11.0.1
|
websockets==11.0.1
|
||||||
|
|
|
@ -74,7 +74,7 @@ def delete_tunnel(config):
|
||||||
|
|
||||||
@retry(stop_max_attempt_number=MAX_RETRIES, wait_fixed=BACKOFF_SECS * 1000)
|
@retry(stop_max_attempt_number=MAX_RETRIES, wait_fixed=BACKOFF_SECS * 1000)
|
||||||
def create_dns(config, hostname, type, content):
|
def create_dns(config, hostname, type, content):
|
||||||
cf = CloudFlare.CloudFlare(debug=True, token=get_env("DNS_API_TOKEN"))
|
cf = CloudFlare.CloudFlare(debug=False, token=get_env("DNS_API_TOKEN"))
|
||||||
cf.zones.dns_records.post(
|
cf.zones.dns_records.post(
|
||||||
config["zone_tag"],
|
config["zone_tag"],
|
||||||
data={'name': hostname, 'type': type, 'content': content, 'proxied': True}
|
data={'name': hostname, 'type': type, 'content': content, 'proxied': True}
|
||||||
|
@ -89,7 +89,7 @@ def create_named_dns(config, random_uuid):
|
||||||
|
|
||||||
@retry(stop_max_attempt_number=MAX_RETRIES, wait_fixed=BACKOFF_SECS * 1000)
|
@retry(stop_max_attempt_number=MAX_RETRIES, wait_fixed=BACKOFF_SECS * 1000)
|
||||||
def delete_dns(config, hostname):
|
def delete_dns(config, hostname):
|
||||||
cf = CloudFlare.CloudFlare(debug=True, token=get_env("DNS_API_TOKEN"))
|
cf = CloudFlare.CloudFlare(debug=False, token=get_env("DNS_API_TOKEN"))
|
||||||
zone_tag = config["zone_tag"]
|
zone_tag = config["zone_tag"]
|
||||||
dns_records = cf.zones.dns_records.get(zone_tag, params={'name': hostname})
|
dns_records = cf.zones.dns_records.get(zone_tag, params={'name': hostname})
|
||||||
if len(dns_records) > 0:
|
if len(dns_records) > 0:
|
||||||
|
|
|
@ -36,17 +36,17 @@ class TestConfig:
|
||||||
_ = start_cloudflared(tmp_path, config, validate_args)
|
_ = start_cloudflared(tmp_path, config, validate_args)
|
||||||
|
|
||||||
self.match_rule(tmp_path, config,
|
self.match_rule(tmp_path, config,
|
||||||
"http://example.com/index.html", 1)
|
"http://example.com/index.html", 0)
|
||||||
self.match_rule(tmp_path, config,
|
self.match_rule(tmp_path, config,
|
||||||
"https://example.com/index.html", 1)
|
"https://example.com/index.html", 0)
|
||||||
self.match_rule(tmp_path, config,
|
self.match_rule(tmp_path, config,
|
||||||
"https://api.example.com/login", 2)
|
"https://api.example.com/login", 1)
|
||||||
self.match_rule(tmp_path, config,
|
self.match_rule(tmp_path, config,
|
||||||
"https://wss.example.com", 3)
|
"https://wss.example.com", 2)
|
||||||
self.match_rule(tmp_path, config,
|
self.match_rule(tmp_path, config,
|
||||||
"https://ssh.example.com", 4)
|
"https://ssh.example.com", 3)
|
||||||
self.match_rule(tmp_path, config,
|
self.match_rule(tmp_path, config,
|
||||||
"https://api.example.com", 5)
|
"https://api.example.com", 4)
|
||||||
|
|
||||||
# This is used to check that the command tunnel ingress url <url> matches rule number <rule_num>. Note that rule number uses 1-based indexing
|
# This is used to check that the command tunnel ingress url <url> matches rule number <rule_num>. Note that rule number uses 1-based indexing
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import platform
|
||||||
import subprocess
|
import subprocess
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
import sys
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
@ -14,8 +15,14 @@ from retrying import retry
|
||||||
|
|
||||||
from constants import METRICS_PORT, MAX_RETRIES, BACKOFF_SECS
|
from constants import METRICS_PORT, MAX_RETRIES, BACKOFF_SECS
|
||||||
|
|
||||||
LOGGER = logging.getLogger(__name__)
|
def configure_logger():
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
logger.setLevel(logging.DEBUG)
|
||||||
|
handler = logging.StreamHandler(sys.stdout)
|
||||||
|
logger.addHandler(handler)
|
||||||
|
return logger
|
||||||
|
|
||||||
|
LOGGER = configure_logger()
|
||||||
|
|
||||||
def select_platform(plat):
|
def select_platform(plat):
|
||||||
return pytest.mark.skipif(
|
return pytest.mark.skipif(
|
||||||
|
|
|
@ -257,7 +257,6 @@ type Configuration struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type WarpRoutingConfig struct {
|
type WarpRoutingConfig struct {
|
||||||
Enabled bool `yaml:"enabled" json:"enabled"`
|
|
||||||
ConnectTimeout *CustomDuration `yaml:"connectTimeout" json:"connectTimeout,omitempty"`
|
ConnectTimeout *CustomDuration `yaml:"connectTimeout" json:"connectTimeout,omitempty"`
|
||||||
TCPKeepAlive *CustomDuration `yaml:"tcpKeepAlive" json:"tcpKeepAlive,omitempty"`
|
TCPKeepAlive *CustomDuration `yaml:"tcpKeepAlive" json:"tcpKeepAlive,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ func TestConfigFileSettings(t *testing.T) {
|
||||||
Service: "https://localhost:8001",
|
Service: "https://localhost:8001",
|
||||||
}
|
}
|
||||||
warpRouting = WarpRoutingConfig{
|
warpRouting = WarpRoutingConfig{
|
||||||
Enabled: true,
|
|
||||||
ConnectTimeout: &CustomDuration{Duration: 2 * time.Second},
|
ConnectTimeout: &CustomDuration{Duration: 2 * time.Second},
|
||||||
TCPKeepAlive: &CustomDuration{Duration: 10 * time.Second},
|
TCPKeepAlive: &CustomDuration{Duration: 10 * time.Second},
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,6 @@ type Orchestrator interface {
|
||||||
UpdateConfig(version int32, config []byte) *pogs.UpdateConfigurationResponse
|
UpdateConfig(version int32, config []byte) *pogs.UpdateConfigurationResponse
|
||||||
GetConfigJSON() ([]byte, error)
|
GetConfigJSON() ([]byte, error)
|
||||||
GetOriginProxy() (OriginProxy, error)
|
GetOriginProxy() (OriginProxy, error)
|
||||||
WarpRoutingEnabled() (enabled bool)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type NamedTunnelProperties struct {
|
type NamedTunnelProperties struct {
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
@ -84,7 +83,7 @@ func TestHTTP2ConfigurationSet(t *testing.T) {
|
||||||
resp, err := edgeHTTP2Conn.RoundTrip(req)
|
resp, err := edgeHTTP2Conn.RoundTrip(req)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, http.StatusOK, resp.StatusCode)
|
require.Equal(t, http.StatusOK, resp.StatusCode)
|
||||||
bdy, err := ioutil.ReadAll(resp.Body)
|
bdy, err := io.ReadAll(resp.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, `{"lastAppliedVersion":2,"err":null}`, string(bdy))
|
assert.Equal(t, `{"lastAppliedVersion":2,"err":null}`, string(bdy))
|
||||||
cancel()
|
cancel()
|
||||||
|
@ -149,7 +148,7 @@ func TestServeHTTP(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, test.expectedStatus, resp.StatusCode)
|
require.Equal(t, test.expectedStatus, resp.StatusCode)
|
||||||
if test.expectedBody != nil {
|
if test.expectedBody != nil {
|
||||||
respBody, err := ioutil.ReadAll(resp.Body)
|
respBody, err := io.ReadAll(resp.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, test.expectedBody, respBody)
|
require.Equal(t, test.expectedBody, respBody)
|
||||||
}
|
}
|
||||||
|
@ -546,7 +545,7 @@ func benchmarkServeHTTP(b *testing.B, test testRequest) {
|
||||||
require.NoError(b, err)
|
require.NoError(b, err)
|
||||||
require.Equal(b, test.expectedStatus, resp.StatusCode)
|
require.Equal(b, test.expectedStatus, resp.StatusCode)
|
||||||
if test.expectedBody != nil {
|
if test.expectedBody != nil {
|
||||||
respBody, err := ioutil.ReadAll(resp.Body)
|
respBody, err := io.ReadAll(resp.Body)
|
||||||
require.NoError(b, err)
|
require.NoError(b, err)
|
||||||
require.Equal(b, test.expectedBody, respBody)
|
require.Equal(b, test.expectedBody, respBody)
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -103,7 +104,7 @@ func NewQUICConnection(
|
||||||
sessionDemuxChan := make(chan *packet.Session, demuxChanCapacity)
|
sessionDemuxChan := make(chan *packet.Session, demuxChanCapacity)
|
||||||
datagramMuxer := quicpogs.NewDatagramMuxerV2(session, logger, sessionDemuxChan)
|
datagramMuxer := quicpogs.NewDatagramMuxerV2(session, logger, sessionDemuxChan)
|
||||||
sessionManager := datagramsession.NewManager(logger, datagramMuxer.SendToSession, sessionDemuxChan)
|
sessionManager := datagramsession.NewManager(logger, datagramMuxer.SendToSession, sessionDemuxChan)
|
||||||
packetRouter := ingress.NewPacketRouter(packetRouterConfig, datagramMuxer, logger, orchestrator.WarpRoutingEnabled)
|
packetRouter := ingress.NewPacketRouter(packetRouterConfig, datagramMuxer, logger)
|
||||||
|
|
||||||
return &QUICConnection{
|
return &QUICConnection{
|
||||||
session: session,
|
session: session,
|
||||||
|
@ -623,9 +624,19 @@ func createUDPConnForConnIndex(connIndex uint8, localIP net.IP, logger *zerolog.
|
||||||
localIP = net.IPv4zero
|
localIP = net.IPv4zero
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listenNetwork := "udp"
|
||||||
|
// https://github.com/quic-go/quic-go/issues/3793 DF bit cannot be set for dual stack listener on OSX
|
||||||
|
if runtime.GOOS == "darwin" {
|
||||||
|
if localIP.To4() != nil {
|
||||||
|
listenNetwork = "udp4"
|
||||||
|
} else {
|
||||||
|
listenNetwork = "udp6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// if port was not set yet, it will be zero, so bind will randomly allocate one.
|
// if port was not set yet, it will be zero, so bind will randomly allocate one.
|
||||||
if port, ok := portForConnIndex[connIndex]; ok {
|
if port, ok := portForConnIndex[connIndex]; ok {
|
||||||
udpConn, err := net.ListenUDP("udp", &net.UDPAddr{IP: localIP, Port: port})
|
udpConn, err := net.ListenUDP(listenNetwork, &net.UDPAddr{IP: localIP, Port: port})
|
||||||
// if there wasn't an error, or if port was 0 (independently of error or not, just return)
|
// if there wasn't an error, or if port was 0 (independently of error or not, just return)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return udpConn, nil
|
return udpConn, nil
|
||||||
|
@ -635,7 +646,7 @@ func createUDPConnForConnIndex(connIndex uint8, localIP net.IP, logger *zerolog.
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we reached here, then there was an error or port as not been allocated it.
|
// if we reached here, then there was an error or port as not been allocated it.
|
||||||
udpConn, err := net.ListenUDP("udp", &net.UDPAddr{IP: localIP, Port: 0})
|
udpConn, err := net.ListenUDP(listenNetwork, &net.UDPAddr{IP: localIP, Port: 0})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
udpAddr, ok := (udpConn.LocalAddr()).(*net.UDPAddr)
|
udpAddr, ok := (udpConn.LocalAddr()).(*net.UDPAddr)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|
|
@ -621,7 +621,7 @@ func serveSession(ctx context.Context, qc *QUICConnection, edgeQUICSession quic.
|
||||||
muxedPayload, err = quicpogs.SuffixType(muxedPayload, quicpogs.DatagramTypeUDP)
|
muxedPayload, err = quicpogs.SuffixType(muxedPayload, quicpogs.DatagramTypeUDP)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = edgeQUICSession.SendMessage(muxedPayload)
|
err = edgeQUICSession.SendDatagram(muxedPayload)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
readBuffer := make([]byte, len(payload)+1)
|
readBuffer := make([]byte, len(payload)+1)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM golang:1.19 as builder
|
FROM golang:1.21.5 as builder
|
||||||
ENV GO111MODULE=on \
|
ENV GO111MODULE=on \
|
||||||
CGO_ENABLED=0
|
CGO_ENABLED=0
|
||||||
WORKDIR /go/src/github.com/cloudflare/cloudflared/
|
WORKDIR /go/src/github.com/cloudflare/cloudflared/
|
||||||
|
|
|
@ -28,3 +28,22 @@ func Contains(feature string) bool {
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove any duplicates from the slice
|
||||||
|
func Dedup(slice []string) []string {
|
||||||
|
|
||||||
|
// Convert the slice into a set
|
||||||
|
set := make(map[string]bool, 0)
|
||||||
|
for _, str := range slice {
|
||||||
|
set[str] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert the set back into a slice
|
||||||
|
keys := make([]string, len(set))
|
||||||
|
i := 0
|
||||||
|
for str := range set {
|
||||||
|
keys[i] = str
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
return keys
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,153 @@
|
||||||
|
package features
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"hash/fnv"
|
||||||
|
"net"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/rs/zerolog"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
featureSelectorHostname = "cfd-features.argotunnel.com"
|
||||||
|
defaultRefreshFreq = time.Hour * 6
|
||||||
|
lookupTimeout = time.Second * 10
|
||||||
|
)
|
||||||
|
|
||||||
|
type PostQuantumMode uint8
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Prefer post quantum, but fallback if connection cannot be established
|
||||||
|
PostQuantumPrefer PostQuantumMode = iota
|
||||||
|
// If the user passes the --post-quantum flag, we override
|
||||||
|
// CurvePreferences to only support hybrid post-quantum key agreements.
|
||||||
|
PostQuantumStrict
|
||||||
|
)
|
||||||
|
|
||||||
|
// If the TXT record adds other fields, the umarshal logic will ignore those keys
|
||||||
|
// If the TXT record is missing a key, the field will unmarshal to the default Go value
|
||||||
|
// pq was removed in TUN-7970
|
||||||
|
type featuresRecord struct{}
|
||||||
|
|
||||||
|
func NewFeatureSelector(ctx context.Context, accountTag string, staticFeatures StaticFeatures, logger *zerolog.Logger) (*FeatureSelector, error) {
|
||||||
|
return newFeatureSelector(ctx, accountTag, logger, newDNSResolver(), staticFeatures, defaultRefreshFreq)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FeatureSelector determines if this account will try new features. It preiodically queries a DNS TXT record
|
||||||
|
// to see which features are turned on
|
||||||
|
type FeatureSelector struct {
|
||||||
|
accountHash int32
|
||||||
|
logger *zerolog.Logger
|
||||||
|
resolver resolver
|
||||||
|
|
||||||
|
staticFeatures StaticFeatures
|
||||||
|
|
||||||
|
// lock protects concurrent access to dynamic features
|
||||||
|
lock sync.RWMutex
|
||||||
|
features featuresRecord
|
||||||
|
}
|
||||||
|
|
||||||
|
// Features set by user provided flags
|
||||||
|
type StaticFeatures struct {
|
||||||
|
PostQuantumMode *PostQuantumMode
|
||||||
|
}
|
||||||
|
|
||||||
|
func newFeatureSelector(ctx context.Context, accountTag string, logger *zerolog.Logger, resolver resolver, staticFeatures StaticFeatures, refreshFreq time.Duration) (*FeatureSelector, error) {
|
||||||
|
selector := &FeatureSelector{
|
||||||
|
accountHash: switchThreshold(accountTag),
|
||||||
|
logger: logger,
|
||||||
|
resolver: resolver,
|
||||||
|
staticFeatures: staticFeatures,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := selector.refresh(ctx); err != nil {
|
||||||
|
logger.Err(err).Msg("Failed to fetch features, default to disable")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run refreshLoop next time we have a new feature to rollout
|
||||||
|
|
||||||
|
return selector, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fs *FeatureSelector) PostQuantumMode() PostQuantumMode {
|
||||||
|
if fs.staticFeatures.PostQuantumMode != nil {
|
||||||
|
return *fs.staticFeatures.PostQuantumMode
|
||||||
|
}
|
||||||
|
|
||||||
|
return PostQuantumPrefer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fs *FeatureSelector) refreshLoop(ctx context.Context, refreshFreq time.Duration) {
|
||||||
|
ticker := time.NewTicker(refreshFreq)
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
case <-ticker.C:
|
||||||
|
err := fs.refresh(ctx)
|
||||||
|
if err != nil {
|
||||||
|
fs.logger.Err(err).Msg("Failed to refresh feature selector")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fs *FeatureSelector) refresh(ctx context.Context) error {
|
||||||
|
record, err := fs.resolver.lookupRecord(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var features featuresRecord
|
||||||
|
if err := json.Unmarshal(record, &features); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.lock.Lock()
|
||||||
|
defer fs.lock.Unlock()
|
||||||
|
|
||||||
|
fs.features = features
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// resolver represents an object that can look up featuresRecord
|
||||||
|
type resolver interface {
|
||||||
|
lookupRecord(ctx context.Context) ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type dnsResolver struct {
|
||||||
|
resolver *net.Resolver
|
||||||
|
}
|
||||||
|
|
||||||
|
func newDNSResolver() *dnsResolver {
|
||||||
|
return &dnsResolver{
|
||||||
|
resolver: net.DefaultResolver,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dr *dnsResolver) lookupRecord(ctx context.Context) ([]byte, error) {
|
||||||
|
ctx, cancel := context.WithTimeout(ctx, lookupTimeout)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
records, err := dr.resolver.LookupTXT(ctx, featureSelectorHostname)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(records) == 0 {
|
||||||
|
return nil, fmt.Errorf("No TXT record found for %s to determine which features to opt-in", featureSelectorHostname)
|
||||||
|
}
|
||||||
|
|
||||||
|
return []byte(records[0]), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func switchThreshold(accountTag string) int32 {
|
||||||
|
h := fnv.New32a()
|
||||||
|
_, _ = h.Write([]byte(accountTag))
|
||||||
|
return int32(h.Sum32() % 100)
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
package features
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/rs/zerolog"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestUnmarshalFeaturesRecord(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
record []byte
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
record: []byte(`{"pq":0}`),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
record: []byte(`{"pq":39}`),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
record: []byte(`{"pq":100}`),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
record: []byte(`{}`), // Unmarshal to default struct if key is not present
|
||||||
|
},
|
||||||
|
{
|
||||||
|
record: []byte(`{"kyber":768}`), // Unmarshal to default struct if key is not present
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
var features featuresRecord
|
||||||
|
err := json.Unmarshal(test.record, &features)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, featuresRecord{}, features)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStaticFeatures(t *testing.T) {
|
||||||
|
pqMode := PostQuantumStrict
|
||||||
|
selector := newTestSelector(t, &pqMode, time.Millisecond*10)
|
||||||
|
require.Equal(t, PostQuantumStrict, selector.PostQuantumMode())
|
||||||
|
|
||||||
|
// No StaticFeatures configured
|
||||||
|
selector = newTestSelector(t, nil, time.Millisecond*10)
|
||||||
|
require.Equal(t, PostQuantumPrefer, selector.PostQuantumMode())
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTestSelector(t *testing.T, pqMode *PostQuantumMode, refreshFreq time.Duration) *FeatureSelector {
|
||||||
|
accountTag := t.Name()
|
||||||
|
logger := zerolog.Nop()
|
||||||
|
|
||||||
|
resolver := &mockResolver{}
|
||||||
|
|
||||||
|
staticFeatures := StaticFeatures{
|
||||||
|
PostQuantumMode: pqMode,
|
||||||
|
}
|
||||||
|
selector, err := newFeatureSelector(context.Background(), accountTag, &logger, resolver, staticFeatures, refreshFreq)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
return selector
|
||||||
|
}
|
||||||
|
|
||||||
|
type mockResolver struct{}
|
||||||
|
|
||||||
|
func (mr *mockResolver) lookupRecord(ctx context.Context) ([]byte, error) {
|
||||||
|
return nil, fmt.Errorf("mockResolver hasn't implement lookupRecord")
|
||||||
|
}
|
84
go.mod
84
go.mod
|
@ -1,13 +1,11 @@
|
||||||
module github.com/cloudflare/cloudflared
|
module github.com/cloudflare/cloudflared
|
||||||
|
|
||||||
go 1.19
|
go 1.21
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cloudflare/brotli-go v0.0.0-20191101163834-d34379f7ff93
|
|
||||||
github.com/cloudflare/golibs v0.0.0-20170913112048-333127dbecfc
|
|
||||||
github.com/coredns/coredns v1.10.0
|
github.com/coredns/coredns v1.10.0
|
||||||
github.com/coreos/go-oidc/v3 v3.4.0
|
github.com/coreos/go-oidc/v3 v3.6.0
|
||||||
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf
|
github.com/coreos/go-systemd/v22 v22.5.0
|
||||||
github.com/facebookgo/grace v0.0.0-20180706040059-75cf19382434
|
github.com/facebookgo/grace v0.0.0-20180706040059-75cf19382434
|
||||||
github.com/fsnotify/fsnotify v1.4.9
|
github.com/fsnotify/fsnotify v1.4.9
|
||||||
github.com/getsentry/sentry-go v0.16.0
|
github.com/getsentry/sentry-go v0.16.0
|
||||||
|
@ -17,7 +15,7 @@ require (
|
||||||
github.com/gobwas/ws v1.0.4
|
github.com/gobwas/ws v1.0.4
|
||||||
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
|
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
|
||||||
github.com/google/gopacket v1.1.19
|
github.com/google/gopacket v1.1.19
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.1
|
||||||
github.com/gorilla/websocket v1.4.2
|
github.com/gorilla/websocket v1.4.2
|
||||||
github.com/json-iterator/go v1.1.12
|
github.com/json-iterator/go v1.1.12
|
||||||
github.com/mattn/go-colorable v0.1.13
|
github.com/mattn/go-colorable v0.1.13
|
||||||
|
@ -26,26 +24,24 @@ require (
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/prometheus/client_golang v1.13.0
|
github.com/prometheus/client_golang v1.13.0
|
||||||
github.com/prometheus/client_model v0.2.0
|
github.com/prometheus/client_model v0.2.0
|
||||||
github.com/quic-go/quic-go v0.0.0-00010101000000-000000000000
|
github.com/quic-go/quic-go v0.40.1-0.20231203135336-87ef8ec48d55
|
||||||
github.com/rs/zerolog v1.20.0
|
github.com/rs/zerolog v1.20.0
|
||||||
github.com/stretchr/testify v1.8.1
|
github.com/stretchr/testify v1.8.4
|
||||||
github.com/urfave/cli/v2 v2.3.0
|
github.com/urfave/cli/v2 v2.3.0
|
||||||
go.opentelemetry.io/contrib/propagators v0.22.0
|
go.opentelemetry.io/contrib/propagators v0.22.0
|
||||||
go.opentelemetry.io/otel v1.6.3
|
go.opentelemetry.io/otel v1.21.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0
|
||||||
go.opentelemetry.io/otel/sdk v1.6.3
|
go.opentelemetry.io/otel/sdk v1.21.0
|
||||||
go.opentelemetry.io/otel/trace v1.6.3
|
go.opentelemetry.io/otel/trace v1.21.0
|
||||||
go.opentelemetry.io/proto/otlp v0.15.0
|
go.opentelemetry.io/proto/otlp v1.0.0
|
||||||
go.uber.org/automaxprocs v1.4.0
|
go.uber.org/automaxprocs v1.4.0
|
||||||
golang.org/x/crypto v0.8.0
|
golang.org/x/crypto v0.16.0
|
||||||
golang.org/x/net v0.9.0
|
golang.org/x/net v0.19.0
|
||||||
golang.org/x/sync v0.1.0
|
golang.org/x/sync v0.4.0
|
||||||
golang.org/x/sys v0.7.0
|
golang.org/x/sys v0.15.0
|
||||||
golang.org/x/term v0.7.0
|
golang.org/x/term v0.15.0
|
||||||
google.golang.org/protobuf v1.28.1
|
google.golang.org/protobuf v1.31.0
|
||||||
gopkg.in/coreos/go-oidc.v2 v2.2.1
|
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
||||||
gopkg.in/square/go-jose.v2 v2.6.0
|
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
nhooyr.io/websocket v1.8.7
|
nhooyr.io/websocket v1.8.7
|
||||||
zombiezen.com/go/capnproto2 v2.18.0+incompatible
|
zombiezen.com/go/capnproto2 v2.18.0+incompatible
|
||||||
|
@ -55,8 +51,7 @@ require (
|
||||||
github.com/BurntSushi/toml v1.2.0 // indirect
|
github.com/BurntSushi/toml v1.2.0 // indirect
|
||||||
github.com/apparentlymart/go-cidr v1.1.0 // indirect
|
github.com/apparentlymart/go-cidr v1.1.0 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||||
github.com/cloudflare/circl v1.2.1-0.20220809205628-0a9554f37a47 // indirect
|
|
||||||
github.com/coredns/caddy v1.1.1 // indirect
|
github.com/coredns/caddy v1.1.1 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
@ -65,15 +60,14 @@ require (
|
||||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
|
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
|
||||||
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect
|
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect
|
||||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect
|
||||||
github.com/go-logr/logr v1.2.3 // indirect
|
github.com/go-logr/logr v1.3.0 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
|
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||||
github.com/gobwas/httphead v0.0.0-20200921212729-da3d93bc3c58 // indirect
|
github.com/gobwas/httphead v0.0.0-20200921212729-da3d93bc3c58 // indirect
|
||||||
github.com/gobwas/pool v0.2.1 // indirect
|
github.com/gobwas/pool v0.2.1 // indirect
|
||||||
github.com/golang/mock v1.6.0 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
|
||||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
|
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect
|
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect
|
||||||
github.com/klauspost/compress v1.15.11 // indirect
|
github.com/klauspost/compress v1.15.11 // indirect
|
||||||
github.com/kr/text v0.2.0 // indirect
|
github.com/kr/text v0.2.0 // indirect
|
||||||
|
@ -82,25 +76,24 @@ require (
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/onsi/ginkgo/v2 v2.4.0 // indirect
|
github.com/onsi/ginkgo/v2 v2.9.5 // indirect
|
||||||
github.com/onsi/gomega v1.23.0 // indirect
|
|
||||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect
|
|
||||||
github.com/prometheus/common v0.37.0 // indirect
|
github.com/prometheus/common v0.37.0 // indirect
|
||||||
github.com/prometheus/procfs v0.8.0 // indirect
|
github.com/prometheus/procfs v0.8.0 // indirect
|
||||||
github.com/quic-go/qtls-go1-19 v0.3.2 // indirect
|
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
|
||||||
github.com/quic-go/qtls-go1-20 v0.2.2 // indirect
|
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
|
go.opentelemetry.io/otel/metric v1.21.0 // indirect
|
||||||
|
go.uber.org/mock v0.3.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect
|
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect
|
||||||
golang.org/x/mod v0.8.0 // indirect
|
golang.org/x/mod v0.11.0 // indirect
|
||||||
golang.org/x/oauth2 v0.4.0 // indirect
|
golang.org/x/oauth2 v0.13.0 // indirect
|
||||||
golang.org/x/text v0.9.0 // indirect
|
golang.org/x/text v0.14.0 // indirect
|
||||||
golang.org/x/tools v0.6.0 // indirect
|
golang.org/x/tools v0.9.1 // indirect
|
||||||
google.golang.org/appengine v1.6.7 // indirect
|
google.golang.org/appengine v1.6.8 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect
|
||||||
google.golang.org/grpc v1.51.0 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
google.golang.org/grpc v1.60.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -110,12 +103,3 @@ replace github.com/urfave/cli/v2 => github.com/ipostelnik/cli/v2 v2.3.1-0.202103
|
||||||
replace github.com/prometheus/golang_client => github.com/prometheus/golang_client v1.12.1
|
replace github.com/prometheus/golang_client => github.com/prometheus/golang_client v1.12.1
|
||||||
|
|
||||||
replace gopkg.in/yaml.v3 => gopkg.in/yaml.v3 v3.0.1
|
replace gopkg.in/yaml.v3 => gopkg.in/yaml.v3 v3.0.1
|
||||||
|
|
||||||
replace github.com/quic-go/quic-go => github.com/devincarr/quic-go v0.0.0-20230502200822-d1f4edacbee7
|
|
||||||
|
|
||||||
// Post-quantum tunnel RTG-1339
|
|
||||||
replace (
|
|
||||||
// Branches go1.19 go1.20 on github.com/cloudflare/qtls-pq
|
|
||||||
github.com/quic-go/qtls-go1-19 => github.com/cloudflare/qtls-pq v0.0.0-20230320123031-3faac1a945b2
|
|
||||||
github.com/quic-go/qtls-go1-20 => github.com/cloudflare/qtls-pq v0.0.0-20230320122459-4ed280d0d633
|
|
||||||
)
|
|
||||||
|
|
433
go.sum
433
go.sum
|
@ -13,36 +13,14 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV
|
||||||
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
||||||
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||||
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
|
|
||||||
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
|
|
||||||
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
|
|
||||||
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
|
|
||||||
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
|
|
||||||
cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
|
|
||||||
cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
|
|
||||||
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
|
|
||||||
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
|
|
||||||
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
|
|
||||||
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
|
|
||||||
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
|
|
||||||
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
|
|
||||||
cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
|
|
||||||
cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
|
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||||
cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
|
|
||||||
cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
|
|
||||||
cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
|
|
||||||
cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
|
|
||||||
cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
|
|
||||||
cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
|
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
|
|
||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
|
@ -52,64 +30,41 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
|
||||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||||
cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
|
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
|
github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
|
||||||
github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
|
||||||
github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU=
|
github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU=
|
||||||
github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
|
github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
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/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bwesterb/go-ristretto v1.2.2/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
|
|
||||||
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
|
||||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||||
|
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cloudflare/brotli-go v0.0.0-20191101163834-d34379f7ff93 h1:QrGfkZDnMxcWHaYDdB7CmqS9i26OAnUj/xcus/abYkY=
|
|
||||||
github.com/cloudflare/brotli-go v0.0.0-20191101163834-d34379f7ff93/go.mod h1:QiTe66jFdP7cUKMCCf/WrvDyYdtdmdZfVcdoLbzaKVY=
|
|
||||||
github.com/cloudflare/circl v1.2.1-0.20220809205628-0a9554f37a47 h1:YzpECHxZ9TzO7LpnKmPxItSd79lLgrR5heIlnqU4dTU=
|
|
||||||
github.com/cloudflare/circl v1.2.1-0.20220809205628-0a9554f37a47/go.mod h1:qhx8gBILsYlbam7h09SvHDSkjpe3TfLA7b/z4rxJvkE=
|
|
||||||
github.com/cloudflare/golibs v0.0.0-20170913112048-333127dbecfc h1:Dvk3ySBsOm5EviLx6VCyILnafPcQinXGP5jbTdHUJgE=
|
|
||||||
github.com/cloudflare/golibs v0.0.0-20170913112048-333127dbecfc/go.mod h1:HlgKKR8V5a1wroIDDIz3/A+T+9Janfq+7n1P5sEFdi0=
|
|
||||||
github.com/cloudflare/qtls-pq v0.0.0-20230320122459-4ed280d0d633 h1:ZTub2XMOBpxyBiJf6Q+UKqAi07yt1rZmFitriHvFd8M=
|
|
||||||
github.com/cloudflare/qtls-pq v0.0.0-20230320122459-4ed280d0d633/go.mod h1:j/igSUc4PgBMayIsBGjAFu2i7g663rm6kZrKy4htb7E=
|
|
||||||
github.com/cloudflare/qtls-pq v0.0.0-20230320123031-3faac1a945b2 h1:0/KuLjh9lBMiXlooAdwoo+FbLVD5DABtquB0ImEFOK0=
|
|
||||||
github.com/cloudflare/qtls-pq v0.0.0-20230320123031-3faac1a945b2/go.mod h1:XzuZIjv4mF5cM205RHHW1d60PQtWGwMR6jx38YKuYHs=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0=
|
github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0=
|
||||||
github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=
|
github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=
|
||||||
github.com/coredns/coredns v1.10.0 h1:jCfuWsBjTs0dapkkhISfPCzn5LqvSRtrFtaf/Tjj4DI=
|
github.com/coredns/coredns v1.10.0 h1:jCfuWsBjTs0dapkkhISfPCzn5LqvSRtrFtaf/Tjj4DI=
|
||||||
github.com/coredns/coredns v1.10.0/go.mod h1:CIfRU5TgpuoIiJBJ4XrofQzfFQpPFh32ERpUevrSlaw=
|
github.com/coredns/coredns v1.10.0/go.mod h1:CIfRU5TgpuoIiJBJ4XrofQzfFQpPFh32ERpUevrSlaw=
|
||||||
github.com/coreos/go-oidc/v3 v3.4.0 h1:xz7elHb/LDwm/ERpwHd+5nb7wFHL32rsr6bBOgaeu6g=
|
github.com/coreos/go-oidc/v3 v3.6.0 h1:AKVxfYw1Gmkn/w96z0DbT/B/xFnzTd3MkZvWLjF4n/o=
|
||||||
github.com/coreos/go-oidc/v3 v3.4.0/go.mod h1:eHUXhZtXPQLgEaDrOVTgwbgmz1xGOkJNye6h3zkD2Pw=
|
github.com/coreos/go-oidc/v3 v3.6.0/go.mod h1:ZpHUsHBucTUj6WOkrP4E20UPynbLZzhTQ1XKCXkxyPc=
|
||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
|
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
|
||||||
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
|
@ -117,17 +72,9 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/devincarr/quic-go v0.0.0-20230502200822-d1f4edacbee7 h1:qxyoKKPXmPsbvT7SZTcvhEgUaZhEttk4f6u8rIawKj0=
|
|
||||||
github.com/devincarr/quic-go v0.0.0-20230502200822-d1f4edacbee7/go.mod h1:+4CVgVppm0FNjpG3UcX8Joi/frKOH7/ciD5yGcwOO1g=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
|
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ=
|
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ=
|
||||||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64=
|
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64=
|
||||||
|
@ -145,16 +92,17 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
github.com/getsentry/sentry-go v0.16.0 h1:owk+S+5XcgJLlGR/3+3s6N4d+uKwqYvh/eS0AIMjPWo=
|
github.com/getsentry/sentry-go v0.16.0 h1:owk+S+5XcgJLlGR/3+3s6N4d+uKwqYvh/eS0AIMjPWo=
|
||||||
github.com/getsentry/sentry-go v0.16.0/go.mod h1:ZXCloQLj0pG7mja5NK6NPf2V4A88YJ4pNlc2mOHwh6Y=
|
github.com/getsentry/sentry-go v0.16.0/go.mod h1:ZXCloQLj0pG7mja5NK6NPf2V4A88YJ4pNlc2mOHwh6Y=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
|
||||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||||
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||||
github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
|
github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
|
||||||
|
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
|
||||||
github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=
|
github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=
|
||||||
github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
|
github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
|
||||||
github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
|
github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
|
||||||
github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
|
github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
|
||||||
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
|
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
|
||||||
|
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
|
@ -169,20 +117,23 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
|
||||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
|
||||||
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
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/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||||
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
|
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
|
||||||
|
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
|
||||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
||||||
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
|
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
|
||||||
|
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
|
||||||
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
||||||
github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ=
|
github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ=
|
||||||
|
github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||||
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
|
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
|
||||||
github.com/gobwas/httphead v0.0.0-20200921212729-da3d93bc3c58 h1:YyrUZvJaU8Q0QsoVo+xLFBgWDTam29PKea6GYmwvSiQ=
|
github.com/gobwas/httphead v0.0.0-20200921212729-da3d93bc3c58 h1:YyrUZvJaU8Q0QsoVo+xLFBgWDTam29PKea6GYmwvSiQ=
|
||||||
github.com/gobwas/httphead v0.0.0-20200921212729-da3d93bc3c58/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
|
github.com/gobwas/httphead v0.0.0-20200921212729-da3d93bc3c58/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
|
||||||
|
@ -193,12 +144,14 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E
|
||||||
github.com/gobwas/ws v1.0.4 h1:5eXU1CZhpQdq5kXbKb+sECH5Ia5KiO6CYzIzdlVx6Bs=
|
github.com/gobwas/ws v1.0.4 h1:5eXU1CZhpQdq5kXbKb+sECH5Ia5KiO6CYzIzdlVx6Bs=
|
||||||
github.com/gobwas/ws v1.0.4/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
|
github.com/gobwas/ws v1.0.4/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
|
||||||
github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
|
github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
|
||||||
|
github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=
|
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=
|
||||||
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU=
|
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
|
github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=
|
||||||
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
|
github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
@ -209,9 +162,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
|
||||||
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||||
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
|
|
||||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
|
||||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
@ -227,10 +177,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
|
|
||||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
|
||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||||
|
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
@ -240,21 +189,16 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||||
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
||||||
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
|
||||||
github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
|
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
@ -262,34 +206,19 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf
|
||||||
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
|
||||||
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
|
||||||
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
|
||||||
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
|
||||||
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
|
||||||
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
|
||||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
|
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
|
||||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
|
||||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
|
|
||||||
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
|
|
||||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
|
|
||||||
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=
|
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=
|
||||||
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw=
|
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw=
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
@ -317,8 +246,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
@ -327,6 +256,7 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0
|
||||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||||
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
||||||
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
|
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
|
||||||
|
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
||||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
|
@ -347,23 +277,24 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
|
||||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs=
|
github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
|
||||||
github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo=
|
github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
|
||||||
github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys=
|
github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
|
||||||
github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg=
|
github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg=
|
||||||
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
|
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
|
||||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=
|
github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=
|
||||||
|
github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas=
|
||||||
github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=
|
github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=
|
||||||
|
github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||||
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
|
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
|
||||||
|
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU=
|
|
||||||
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||||
|
@ -389,8 +320,13 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
|
||||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
|
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
|
||||||
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
|
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
|
||||||
|
github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
||||||
|
github.com/quic-go/quic-go v0.40.1-0.20231203135336-87ef8ec48d55 h1:I4N3ZRnkZPbDN935Tg8QDf8fRpHp3bZ0U0/L42jBgNE=
|
||||||
|
github.com/quic-go/quic-go v0.40.1-0.20231203135336-87ef8ec48d55/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||||
|
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||||
github.com/rs/zerolog v1.20.0 h1:38k9hgtUBdxFwE34yS8rTHmHBa4eN16E4DJlv177LNs=
|
github.com/rs/zerolog v1.20.0 h1:38k9hgtUBdxFwE34yS8rTHmHBa4eN16E4DJlv177LNs=
|
||||||
github.com/rs/zerolog v1.20.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo=
|
github.com/rs/zerolog v1.20.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo=
|
||||||
|
@ -401,56 +337,52 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/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/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
|
github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
|
||||||
|
github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||||
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
|
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
|
||||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||||
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
||||||
|
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
|
||||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
|
||||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
|
||||||
go.opentelemetry.io/contrib/propagators v0.22.0 h1:KGdv58M2//veiYLIhb31mofaI2LgkIPXXAZVeYVyfd8=
|
go.opentelemetry.io/contrib/propagators v0.22.0 h1:KGdv58M2//veiYLIhb31mofaI2LgkIPXXAZVeYVyfd8=
|
||||||
go.opentelemetry.io/contrib/propagators v0.22.0/go.mod h1:xGOuXr6lLIF9BXipA4pm6UuOSI0M98U6tsI3khbOiwU=
|
go.opentelemetry.io/contrib/propagators v0.22.0/go.mod h1:xGOuXr6lLIF9BXipA4pm6UuOSI0M98U6tsI3khbOiwU=
|
||||||
go.opentelemetry.io/otel v1.0.0-RC2/go.mod h1:w1thVQ7qbAy8MHb0IFj8a5Q2QU0l2ksf8u/CN8m3NOM=
|
go.opentelemetry.io/otel v1.0.0-RC2/go.mod h1:w1thVQ7qbAy8MHb0IFj8a5Q2QU0l2ksf8u/CN8m3NOM=
|
||||||
go.opentelemetry.io/otel v1.6.3 h1:FLOfo8f9JzFVFVyU+MSRJc2HdEAXQgm7pIv2uFKRSZE=
|
go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=
|
||||||
go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI=
|
go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3 h1:4/UjHWMVVc5VwX/KAtqJOHErKigMCH8NexChMuanb/o=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3/go.mod h1:UJmXdiVVBaZ63umRUTwJuCMAV//GCMvDiQwn703/GoY=
|
go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=
|
||||||
go.opentelemetry.io/otel/sdk v1.6.3 h1:prSHYdwCQOX5DrsEzxowH3nLhoAzEBdZhvrR79scfLs=
|
go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
|
||||||
go.opentelemetry.io/otel/sdk v1.6.3/go.mod h1:A4iWF7HTXa+GWL/AaqESz28VuSBIcZ+0CV+IzJ5NMiQ=
|
go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
|
||||||
go.opentelemetry.io/otel/trace v1.0.0-RC2/go.mod h1:JPQ+z6nNw9mqEGT8o3eoPTdnNI+Aj5JcxEsVGREIAy4=
|
go.opentelemetry.io/otel/trace v1.0.0-RC2/go.mod h1:JPQ+z6nNw9mqEGT8o3eoPTdnNI+Aj5JcxEsVGREIAy4=
|
||||||
go.opentelemetry.io/otel/trace v1.6.3 h1:IqN4L+5b0mPNjdXIiZ90Ni4Bl5BRkDQywePLWemd9bc=
|
go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=
|
||||||
go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs=
|
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
|
||||||
go.opentelemetry.io/proto/otlp v0.15.0 h1:h0bKrvdrT/9sBwEJ6iWUqT/N/xPcS66bL4u3isneJ6w=
|
go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
|
||||||
go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
|
||||||
go.uber.org/automaxprocs v1.4.0 h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0=
|
go.uber.org/automaxprocs v1.4.0 h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0=
|
||||||
go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q=
|
go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q=
|
||||||
|
go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo=
|
||||||
|
go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
@ -458,9 +390,9 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
|
||||||
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
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.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
|
||||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
@ -485,8 +417,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl
|
||||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
|
||||||
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
|
||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
|
@ -495,11 +425,10 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
|
||||||
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
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.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU=
|
||||||
|
golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
@ -528,51 +457,24 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/
|
||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
||||||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
||||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
||||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
|
||||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
|
||||||
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
|
||||||
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
|
||||||
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
|
||||||
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
|
||||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
|
||||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
||||||
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY=
|
||||||
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0=
|
||||||
golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
|
|
||||||
golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M=
|
|
||||||
golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
|
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -581,12 +483,11 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
@ -620,63 +521,35 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
|
golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
|
||||||
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||||
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
@ -721,27 +594,14 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY
|
||||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
|
|
||||||
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
|
||||||
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
|
||||||
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
|
||||||
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
|
||||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
|
||||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|
||||||
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|
||||||
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|
||||||
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|
||||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|
||||||
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
|
||||||
|
golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
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-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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
|
||||||
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
|
||||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
@ -758,37 +618,14 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M
|
||||||
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||||
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||||
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
||||||
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
|
|
||||||
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
|
|
||||||
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
|
|
||||||
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
|
|
||||||
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
|
|
||||||
google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
|
|
||||||
google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
|
|
||||||
google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
|
|
||||||
google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
|
|
||||||
google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
|
|
||||||
google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
|
||||||
google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
|
||||||
google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
|
|
||||||
google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
|
|
||||||
google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
|
|
||||||
google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
|
|
||||||
google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
|
|
||||||
google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
|
|
||||||
google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
|
|
||||||
google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
|
|
||||||
google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
|
|
||||||
google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
|
|
||||||
google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=
|
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
|
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
|
||||||
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
@ -812,63 +649,18 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG
|
||||||
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
|
||||||
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0=
|
||||||
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk=
|
||||||
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU=
|
||||||
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0=
|
||||||
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0=
|
||||||
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY=
|
||||||
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
|
||||||
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
|
||||||
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
|
||||||
google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
|
||||||
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
|
||||||
google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
|
||||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
|
||||||
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
|
||||||
google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
|
||||||
google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
|
|
||||||
google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
|
|
||||||
google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
|
|
||||||
google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
|
||||||
google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
|
||||||
google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
|
|
||||||
google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
|
||||||
google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
|
||||||
google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
|
||||||
google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
|
||||||
google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
|
||||||
google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
|
||||||
google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
|
||||||
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
|
||||||
google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
|
||||||
google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
|
||||||
google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
|
||||||
google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
|
|
||||||
google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
|
|
||||||
google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
|
|
||||||
google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
|
|
||||||
google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
|
|
||||||
google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
|
||||||
google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
|
||||||
google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
|
||||||
google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
|
||||||
google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
|
||||||
google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
|
|
||||||
google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
|
|
||||||
google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
|
|
||||||
google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
|
|
||||||
google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
|
|
||||||
google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd h1:OjndDrsik+Gt+e6fs45z9AxiewiKyLKYpA45W5Kpkks=
|
|
||||||
google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=
|
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
|
@ -881,29 +673,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa
|
||||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k=
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
|
||||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
|
||||||
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
|
|
||||||
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
|
||||||
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
|
||||||
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
|
||||||
google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
|
||||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
|
||||||
google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
|
||||||
google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
|
||||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
|
||||||
google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
|
||||||
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
|
||||||
google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
|
||||||
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
|
|
||||||
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
|
||||||
google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
|
||||||
google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
|
||||||
google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U=
|
|
||||||
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
|
|
||||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
@ -916,23 +687,17 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
|
||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
|
||||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
|
||||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/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 h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/coreos/go-oidc.v2 v2.2.1 h1:MY5SZClJ7vhjKfr64a4nHAOV/c3WH2gB9BMrR64J1Mc=
|
|
||||||
gopkg.in/coreos/go-oidc.v2 v2.2.1/go.mod h1:fYaTe2FS96wZZwR17YTDHwG+Mw6fmyqJNxN2eNCGPCI=
|
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||||
gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI=
|
|
||||||
gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
//go:build !cgo
|
|
||||||
// +build !cgo
|
|
||||||
|
|
||||||
package h2mux
|
package h2mux
|
||||||
|
|
||||||
import (
|
import (
|
|
@ -1,22 +0,0 @@
|
||||||
//go:build cgo
|
|
||||||
// +build cgo
|
|
||||||
|
|
||||||
package h2mux
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
|
|
||||||
"github.com/cloudflare/brotli-go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func CompressionIsSupported() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func newDecompressor(src io.Reader) *brotli.Reader {
|
|
||||||
return brotli.NewReader(src)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newCompressor(dst io.Writer, quality, lgwin int) *brotli.Writer {
|
|
||||||
return brotli.NewWriter(dst, brotli.WriterOptions{Quality: quality, LGWin: lgwin})
|
|
||||||
}
|
|
|
@ -135,14 +135,7 @@ func Handshake(
|
||||||
m.f.ReadMetaHeaders = hpack.NewDecoder(4096, func(hpack.HeaderField) {})
|
m.f.ReadMetaHeaders = hpack.NewDecoder(4096, func(hpack.HeaderField) {})
|
||||||
// Initialise the settings to identify this connection and confirm the other end is sane.
|
// Initialise the settings to identify this connection and confirm the other end is sane.
|
||||||
handshakeSetting := http2.Setting{ID: SettingMuxerMagic, Val: MuxerMagicEdge}
|
handshakeSetting := http2.Setting{ID: SettingMuxerMagic, Val: MuxerMagicEdge}
|
||||||
compressionSetting := http2.Setting{ID: SettingCompression, Val: config.CompressionQuality.toH2Setting()}
|
compressionSetting := http2.Setting{ID: SettingCompression, Val: 0}
|
||||||
if CompressionIsSupported() {
|
|
||||||
config.Log.Debug().Msg("muxer: Compression is supported")
|
|
||||||
m.compressionQuality = config.CompressionQuality.getPreset()
|
|
||||||
} else {
|
|
||||||
config.Log.Debug().Msg("muxer: Compression is not supported")
|
|
||||||
compressionSetting = http2.Setting{ID: SettingCompression, Val: 0}
|
|
||||||
}
|
|
||||||
|
|
||||||
expectedMagic := MuxerMagicOrigin
|
expectedMagic := MuxerMagicOrigin
|
||||||
if config.IsClient {
|
if config.IsClient {
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
|
@ -652,7 +651,7 @@ func TestHPACK(t *testing.T) {
|
||||||
if stream.Headers[0].Value != "200" {
|
if stream.Headers[0].Value != "200" {
|
||||||
t.Fatalf("expected status 200, got %s", stream.Headers[0].Value)
|
t.Fatalf("expected status 200, got %s", stream.Headers[0].Value)
|
||||||
}
|
}
|
||||||
_, _ = ioutil.ReadAll(stream)
|
_, _ = io.ReadAll(stream)
|
||||||
_ = stream.Close()
|
_ = stream.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -678,157 +677,6 @@ func AssertIfPipeReadable(t *testing.T, pipe io.ReadCloser) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMultipleStreamsWithDictionaries(t *testing.T) {
|
|
||||||
l := zerolog.Nop()
|
|
||||||
|
|
||||||
for q := CompressionNone; q <= CompressionMax; q++ {
|
|
||||||
htmlBody := `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"` +
|
|
||||||
`"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">` +
|
|
||||||
`<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">` +
|
|
||||||
`<head>` +
|
|
||||||
` <title>Your page title here</title>` +
|
|
||||||
`</head>` +
|
|
||||||
`<body>` +
|
|
||||||
`<h1>Your major heading here</h1>` +
|
|
||||||
`<p>` +
|
|
||||||
`This is a regular text paragraph.` +
|
|
||||||
`</p>` +
|
|
||||||
`<ul>` +
|
|
||||||
` <li>` +
|
|
||||||
` First bullet of a bullet list.` +
|
|
||||||
` </li>` +
|
|
||||||
` <li>` +
|
|
||||||
` This is the <em>second</em> bullet.` +
|
|
||||||
` </li>` +
|
|
||||||
`</ul>` +
|
|
||||||
`</body>` +
|
|
||||||
`</html>`
|
|
||||||
|
|
||||||
f := MuxedStreamFunc(func(stream *MuxedStream) error {
|
|
||||||
var contentType string
|
|
||||||
var pathHeader Header
|
|
||||||
|
|
||||||
for _, h := range stream.Headers {
|
|
||||||
if h.Name == ":path" {
|
|
||||||
pathHeader = h
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if pathHeader.Name != ":path" {
|
|
||||||
panic("Couldn't find :path header in test")
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.Contains(pathHeader.Value, "html") {
|
|
||||||
contentType = "text/html; charset=utf-8"
|
|
||||||
} else if strings.Contains(pathHeader.Value, "js") {
|
|
||||||
contentType = "application/javascript"
|
|
||||||
} else if strings.Contains(pathHeader.Value, "css") {
|
|
||||||
contentType = "text/css"
|
|
||||||
} else {
|
|
||||||
contentType = "img/gif"
|
|
||||||
}
|
|
||||||
|
|
||||||
_ = stream.WriteHeaders([]Header{
|
|
||||||
{Name: "content-type", Value: contentType},
|
|
||||||
})
|
|
||||||
_, _ = stream.Write([]byte(strings.Replace(htmlBody, "paragraph", pathHeader.Value, 1) + stream.Headers[5].Value))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
muxPair := NewCompressedMuxerPair(t, fmt.Sprintf("%s_%d", t.Name(), q), q, f)
|
|
||||||
muxPair.Serve(t)
|
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
|
|
||||||
paths := []string{
|
|
||||||
"/html1",
|
|
||||||
"/html2?sa:ds",
|
|
||||||
"/html3",
|
|
||||||
"/css1",
|
|
||||||
"/html1",
|
|
||||||
"/html2?sa:ds",
|
|
||||||
"/html3",
|
|
||||||
"/css1",
|
|
||||||
"/css2",
|
|
||||||
"/css3",
|
|
||||||
"/js",
|
|
||||||
"/js",
|
|
||||||
"/js",
|
|
||||||
"/js2",
|
|
||||||
"/img2",
|
|
||||||
"/html1",
|
|
||||||
"/html2?sa:ds",
|
|
||||||
"/html3",
|
|
||||||
"/css1",
|
|
||||||
"/css2",
|
|
||||||
"/css3",
|
|
||||||
"/js",
|
|
||||||
"/js",
|
|
||||||
"/js",
|
|
||||||
"/js2",
|
|
||||||
"/img1",
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Add(len(paths))
|
|
||||||
errorsC := make(chan error, len(paths))
|
|
||||||
|
|
||||||
for i, s := range paths {
|
|
||||||
go func(index int, path string) {
|
|
||||||
defer wg.Done()
|
|
||||||
stream, err := muxPair.OpenEdgeMuxStream(
|
|
||||||
[]Header{
|
|
||||||
{Name: ":method", Value: "GET"},
|
|
||||||
{Name: ":scheme", Value: "https"},
|
|
||||||
{Name: ":authority", Value: "tunnel.otterlyadorable.co.uk"},
|
|
||||||
{Name: ":path", Value: path},
|
|
||||||
{Name: "cf-ray", Value: "378948953f044408-SFO-DOG"},
|
|
||||||
{Name: "idx", Value: strconv.Itoa(index)},
|
|
||||||
{Name: "accept-encoding", Value: "gzip, br"},
|
|
||||||
},
|
|
||||||
nil,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
errorsC <- fmt.Errorf("error in OpenStream: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
expectBody := strings.Replace(htmlBody, "paragraph", path, 1) + strconv.Itoa(index)
|
|
||||||
responseBody := make([]byte, len(expectBody)*2)
|
|
||||||
n, err := stream.Read(responseBody)
|
|
||||||
if err != nil {
|
|
||||||
errorsC <- fmt.Errorf("stream %d error from (*MuxedStream).Read: %s", stream.streamID, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if n != len(expectBody) {
|
|
||||||
errorsC <- fmt.Errorf("stream %d expected response body to have %d bytes, got %d", stream.streamID, len(expectBody), n)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if string(responseBody[:n]) != expectBody {
|
|
||||||
errorsC <- fmt.Errorf("stream %d expected response body %s, got %s", stream.streamID, expectBody, responseBody[:n])
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}(i, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Wait()
|
|
||||||
close(errorsC)
|
|
||||||
testFail := false
|
|
||||||
for err := range errorsC {
|
|
||||||
testFail = true
|
|
||||||
l.Error().Msgf("%s", err)
|
|
||||||
}
|
|
||||||
if testFail {
|
|
||||||
t.Fatalf("TestMultipleStreams failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
originMuxMetrics := muxPair.OriginMux.Metrics()
|
|
||||||
if q > CompressionNone && originMuxMetrics.CompBytesBefore.Value() <= 10*originMuxMetrics.CompBytesAfter.Value() {
|
|
||||||
t.Fatalf("Cross-stream compression is expected to give a better compression ratio")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func sampleSiteHandler(files map[string][]byte) MuxedStreamFunc {
|
func sampleSiteHandler(files map[string][]byte) MuxedStreamFunc {
|
||||||
return func(stream *MuxedStream) error {
|
return func(stream *MuxedStream) error {
|
||||||
var contentType string
|
var contentType string
|
||||||
|
@ -905,7 +753,7 @@ func loadSampleFiles(paths []string) (map[string][]byte, error) {
|
||||||
files := make(map[string][]byte)
|
files := make(map[string][]byte)
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
if _, ok := files[path]; !ok {
|
if _, ok := files[path]; !ok {
|
||||||
expectBody, err := ioutil.ReadFile(path)
|
expectBody, err := os.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -915,82 +763,6 @@ func loadSampleFiles(paths []string) (map[string][]byte, error) {
|
||||||
return files, nil
|
return files, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSampleSiteWithDictionaries(t *testing.T) {
|
|
||||||
paths := []string{
|
|
||||||
"./sample/index.html",
|
|
||||||
"./sample/index2.html",
|
|
||||||
"./sample/index1.html",
|
|
||||||
"./sample/ghost-url.min.js",
|
|
||||||
"./sample/jquery.fitvids.js",
|
|
||||||
"./sample/index1.html",
|
|
||||||
"./sample/index2.html",
|
|
||||||
"./sample/index.html",
|
|
||||||
}
|
|
||||||
files, err := loadSampleFiles(paths)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
for q := CompressionNone; q <= CompressionMax; q++ {
|
|
||||||
muxPair := NewCompressedMuxerPair(t, fmt.Sprintf("%s_%d", t.Name(), q), q, sampleSiteHandler(files))
|
|
||||||
muxPair.Serve(t)
|
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
errC := make(chan error, len(paths))
|
|
||||||
|
|
||||||
wg.Add(len(paths))
|
|
||||||
for _, s := range paths {
|
|
||||||
go func(path string) {
|
|
||||||
defer wg.Done()
|
|
||||||
errC <- sampleSiteTest(muxPair, path, files)
|
|
||||||
}(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Wait()
|
|
||||||
close(errC)
|
|
||||||
|
|
||||||
for err := range errC {
|
|
||||||
assert.NoError(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
originMuxMetrics := muxPair.OriginMux.Metrics()
|
|
||||||
if q > CompressionNone && originMuxMetrics.CompBytesBefore.Value() <= 10*originMuxMetrics.CompBytesAfter.Value() {
|
|
||||||
t.Fatalf("Cross-stream compression is expected to give a better compression ratio")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestLongSiteWithDictionaries(t *testing.T) {
|
|
||||||
paths := []string{
|
|
||||||
"./sample/index.html",
|
|
||||||
"./sample/index1.html",
|
|
||||||
"./sample/index2.html",
|
|
||||||
"./sample/ghost-url.min.js",
|
|
||||||
"./sample/jquery.fitvids.js",
|
|
||||||
}
|
|
||||||
files, err := loadSampleFiles(paths)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
for q := CompressionNone; q <= CompressionMedium; q++ {
|
|
||||||
muxPair := NewCompressedMuxerPair(t, fmt.Sprintf("%s_%d", t.Name(), q), q, sampleSiteHandler(files))
|
|
||||||
muxPair.Serve(t)
|
|
||||||
|
|
||||||
rand.Seed(time.Now().Unix())
|
|
||||||
|
|
||||||
tstLen := 500
|
|
||||||
errGroup, _ := errgroup.WithContext(context.Background())
|
|
||||||
for i := 0; i < tstLen; i++ {
|
|
||||||
errGroup.Go(func() error {
|
|
||||||
path := paths[rand.Int()%len(paths)]
|
|
||||||
return sampleSiteTest(muxPair, path, files)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
assert.NoError(t, errGroup.Wait())
|
|
||||||
|
|
||||||
originMuxMetrics := muxPair.OriginMux.Metrics()
|
|
||||||
if q > CompressionNone && originMuxMetrics.CompBytesBefore.Value() <= 10*originMuxMetrics.CompBytesAfter.Value() {
|
|
||||||
t.Fatalf("Cross-stream compression is expected to give a better compression ratio")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkOpenStream(b *testing.B) {
|
func BenchmarkOpenStream(b *testing.B) {
|
||||||
const streams = 5000
|
const streams = 5000
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
"io/ioutil"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
@ -234,7 +234,7 @@ func rootHandler(serverName string) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
var body string
|
var body string
|
||||||
rawBody, err := ioutil.ReadAll(r.Body)
|
rawBody, err := io.ReadAll(r.Body)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
body = string(rawBody)
|
body = string(rawBody)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -44,14 +44,12 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
type WarpRoutingConfig struct {
|
type WarpRoutingConfig struct {
|
||||||
Enabled bool `yaml:"enabled" json:"enabled"`
|
|
||||||
ConnectTimeout config.CustomDuration `yaml:"connectTimeout" json:"connectTimeout,omitempty"`
|
ConnectTimeout config.CustomDuration `yaml:"connectTimeout" json:"connectTimeout,omitempty"`
|
||||||
TCPKeepAlive config.CustomDuration `yaml:"tcpKeepAlive" json:"tcpKeepAlive,omitempty"`
|
TCPKeepAlive config.CustomDuration `yaml:"tcpKeepAlive" json:"tcpKeepAlive,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWarpRoutingConfig(raw *config.WarpRoutingConfig) WarpRoutingConfig {
|
func NewWarpRoutingConfig(raw *config.WarpRoutingConfig) WarpRoutingConfig {
|
||||||
cfg := WarpRoutingConfig{
|
cfg := WarpRoutingConfig{
|
||||||
Enabled: raw.Enabled,
|
|
||||||
ConnectTimeout: defaultWarpRoutingConnectTimeout,
|
ConnectTimeout: defaultWarpRoutingConnectTimeout,
|
||||||
TCPKeepAlive: defaultTCPKeepAlive,
|
TCPKeepAlive: defaultTCPKeepAlive,
|
||||||
}
|
}
|
||||||
|
@ -65,9 +63,7 @@ func NewWarpRoutingConfig(raw *config.WarpRoutingConfig) WarpRoutingConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *WarpRoutingConfig) RawConfig() config.WarpRoutingConfig {
|
func (c *WarpRoutingConfig) RawConfig() config.WarpRoutingConfig {
|
||||||
raw := config.WarpRoutingConfig{
|
raw := config.WarpRoutingConfig{}
|
||||||
Enabled: c.Enabled,
|
|
||||||
}
|
|
||||||
if c.ConnectTimeout.Duration != defaultWarpRoutingConnectTimeout.Duration {
|
if c.ConnectTimeout.Duration != defaultWarpRoutingConnectTimeout.Duration {
|
||||||
raw.ConnectTimeout = &c.ConnectTimeout
|
raw.ConnectTimeout = &c.ConnectTimeout
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,7 @@ type Ingress struct {
|
||||||
|
|
||||||
// ParseIngress parses ingress rules, but does not send HTTP requests to the origins.
|
// ParseIngress parses ingress rules, but does not send HTTP requests to the origins.
|
||||||
func ParseIngress(conf *config.Configuration) (Ingress, error) {
|
func ParseIngress(conf *config.Configuration) (Ingress, error) {
|
||||||
if len(conf.Ingress) == 0 {
|
if conf == nil || len(conf.Ingress) == 0 {
|
||||||
return Ingress{}, ErrNoIngressRules
|
return Ingress{}, ErrNoIngressRules
|
||||||
}
|
}
|
||||||
return validateIngress(conf.Ingress, originRequestFromConfig(conf.OriginRequest))
|
return validateIngress(conf.Ingress, originRequestFromConfig(conf.OriginRequest))
|
||||||
|
|
|
@ -43,6 +43,11 @@ ingress:
|
||||||
require.Equal(t, "https", s.scheme)
|
require.Equal(t, "https", s.scheme)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseIngressNilConfig(t *testing.T) {
|
||||||
|
_, err := ParseIngress(nil)
|
||||||
|
require.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestParseIngress(t *testing.T) {
|
func TestParseIngress(t *testing.T) {
|
||||||
localhost8000 := MustParseURL(t, "https://localhost:8000")
|
localhost8000 := MustParseURL(t, "https://localhost:8000")
|
||||||
localhost8001 := MustParseURL(t, "https://localhost:8001")
|
localhost8001 := MustParseURL(t, "https://localhost:8001")
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
@ -118,7 +117,7 @@ func TestSocksStreamWSOverTCPConnection(t *testing.T) {
|
||||||
}
|
}
|
||||||
for _, status := range statusCodes {
|
for _, status := range statusCodes {
|
||||||
handler := func(w http.ResponseWriter, r *http.Request) {
|
handler := func(w http.ResponseWriter, r *http.Request) {
|
||||||
body, err := ioutil.ReadAll(r.Body)
|
body, err := io.ReadAll(r.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, []byte(sendMessage), body)
|
require.Equal(t, []byte(sendMessage), body)
|
||||||
|
|
||||||
|
@ -180,7 +179,7 @@ func TestSocksStreamWSOverTCPConnection(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, status, resp.StatusCode)
|
assert.Equal(t, status, resp.StatusCode)
|
||||||
require.Equal(t, echoHeaderReturnValue, resp.Header.Get(echoHeaderName))
|
require.Equal(t, echoHeaderReturnValue, resp.Header.Get(echoHeaderName))
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, []byte(echoMessage), body)
|
require.Equal(t, []byte(echoMessage), body)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package ingress
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
@ -141,7 +141,7 @@ func TestHTTPServiceHostHeaderOverride(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, http.StatusOK, resp.StatusCode)
|
require.Equal(t, http.StatusOK, resp.StatusCode)
|
||||||
|
|
||||||
respBody, err := ioutil.ReadAll(resp.Body)
|
respBody, err := io.ReadAll(resp.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, respBody, []byte(originURL.Host))
|
require.Equal(t, respBody, []byte(originURL.Host))
|
||||||
}
|
}
|
||||||
|
@ -180,7 +180,7 @@ func TestHTTPServiceUsesIngressRuleScheme(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, http.StatusOK, resp.StatusCode)
|
require.Equal(t, http.StatusOK, resp.StatusCode)
|
||||||
|
|
||||||
respBody, err := ioutil.ReadAll(resp.Body)
|
respBody, err := io.ReadAll(resp.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, respBody, []byte(p))
|
require.Equal(t, respBody, []byte(p))
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ type PacketRouter struct {
|
||||||
globalConfig *GlobalRouterConfig
|
globalConfig *GlobalRouterConfig
|
||||||
muxer muxer
|
muxer muxer
|
||||||
logger *zerolog.Logger
|
logger *zerolog.Logger
|
||||||
checkRouterEnabledFunc func() bool
|
|
||||||
icmpDecoder *packet.ICMPDecoder
|
icmpDecoder *packet.ICMPDecoder
|
||||||
encoder *packet.Encoder
|
encoder *packet.Encoder
|
||||||
}
|
}
|
||||||
|
@ -40,12 +39,11 @@ type GlobalRouterConfig struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewPacketRouter creates a PacketRouter that handles ICMP packets. Packets are read from muxer but dropped if globalConfig is nil.
|
// NewPacketRouter creates a PacketRouter that handles ICMP packets. Packets are read from muxer but dropped if globalConfig is nil.
|
||||||
func NewPacketRouter(globalConfig *GlobalRouterConfig, muxer muxer, logger *zerolog.Logger, checkRouterEnabledFunc func() bool) *PacketRouter {
|
func NewPacketRouter(globalConfig *GlobalRouterConfig, muxer muxer, logger *zerolog.Logger) *PacketRouter {
|
||||||
return &PacketRouter{
|
return &PacketRouter{
|
||||||
globalConfig: globalConfig,
|
globalConfig: globalConfig,
|
||||||
muxer: muxer,
|
muxer: muxer,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
checkRouterEnabledFunc: checkRouterEnabledFunc,
|
|
||||||
icmpDecoder: packet.NewICMPDecoder(),
|
icmpDecoder: packet.NewICMPDecoder(),
|
||||||
encoder: packet.NewEncoder(),
|
encoder: packet.NewEncoder(),
|
||||||
}
|
}
|
||||||
|
@ -92,10 +90,6 @@ func (r *PacketRouter) handlePacket(ctx context.Context, rawPacket packet.RawPac
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if enabled := r.checkRouterEnabledFunc(); !enabled {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
icmpPacket, err := r.icmpDecoder.Decode(rawPacket)
|
icmpPacket, err := r.icmpDecoder.Decode(rawPacket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.logger.Err(err).Msg("Failed to decode ICMP packet from quic datagram")
|
r.logger.Err(err).Msg("Failed to decode ICMP packet from quic datagram")
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/google/gopacket/layers"
|
"github.com/google/gopacket/layers"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -29,9 +28,7 @@ var (
|
||||||
|
|
||||||
func TestRouterReturnTTLExceed(t *testing.T) {
|
func TestRouterReturnTTLExceed(t *testing.T) {
|
||||||
muxer := newMockMuxer(0)
|
muxer := newMockMuxer(0)
|
||||||
routerEnabled := &routerEnabledChecker{}
|
router := NewPacketRouter(packetConfig, muxer, &noopLogger)
|
||||||
routerEnabled.set(true)
|
|
||||||
router := NewPacketRouter(packetConfig, muxer, &noopLogger, routerEnabled.isEnabled)
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
routerStopped := make(chan struct{})
|
routerStopped := make(chan struct{})
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -80,65 +77,6 @@ func TestRouterReturnTTLExceed(t *testing.T) {
|
||||||
<-routerStopped
|
<-routerStopped
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRouterCheckEnabled(t *testing.T) {
|
|
||||||
muxer := newMockMuxer(0)
|
|
||||||
routerEnabled := &routerEnabledChecker{}
|
|
||||||
router := NewPacketRouter(packetConfig, muxer, &noopLogger, routerEnabled.isEnabled)
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
|
||||||
routerStopped := make(chan struct{})
|
|
||||||
go func() {
|
|
||||||
router.Serve(ctx)
|
|
||||||
close(routerStopped)
|
|
||||||
}()
|
|
||||||
|
|
||||||
pk := packet.ICMP{
|
|
||||||
IP: &packet.IP{
|
|
||||||
Src: netip.MustParseAddr("192.168.1.1"),
|
|
||||||
Dst: netip.MustParseAddr("10.0.0.1"),
|
|
||||||
Protocol: layers.IPProtocolICMPv4,
|
|
||||||
TTL: 1,
|
|
||||||
},
|
|
||||||
Message: &icmp.Message{
|
|
||||||
Type: ipv4.ICMPTypeEcho,
|
|
||||||
Code: 0,
|
|
||||||
Body: &icmp.Echo{
|
|
||||||
ID: 12481,
|
|
||||||
Seq: 8036,
|
|
||||||
Data: []byte(t.Name()),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// router is disabled
|
|
||||||
encoder := packet.NewEncoder()
|
|
||||||
encodedPacket, err := encoder.Encode(&pk)
|
|
||||||
require.NoError(t, err)
|
|
||||||
sendPacket := quicpogs.RawPacket(encodedPacket)
|
|
||||||
|
|
||||||
muxer.edgeToCfd <- sendPacket
|
|
||||||
select {
|
|
||||||
case <-time.After(time.Millisecond * 10):
|
|
||||||
case <-muxer.cfdToEdge:
|
|
||||||
t.Error("Unexpected reply when router is disabled")
|
|
||||||
}
|
|
||||||
routerEnabled.set(true)
|
|
||||||
// router is enabled, expects reply
|
|
||||||
muxer.edgeToCfd <- sendPacket
|
|
||||||
<-muxer.cfdToEdge
|
|
||||||
|
|
||||||
routerEnabled.set(false)
|
|
||||||
// router is disabled
|
|
||||||
muxer.edgeToCfd <- sendPacket
|
|
||||||
select {
|
|
||||||
case <-time.After(time.Millisecond * 10):
|
|
||||||
case <-muxer.cfdToEdge:
|
|
||||||
t.Error("Unexpected reply when router is disabled")
|
|
||||||
}
|
|
||||||
|
|
||||||
cancel()
|
|
||||||
<-routerStopped
|
|
||||||
}
|
|
||||||
|
|
||||||
func assertTTLExceed(t *testing.T, originalPacket *packet.ICMP, expectedSrc netip.Addr, muxer *mockMuxer) {
|
func assertTTLExceed(t *testing.T, originalPacket *packet.ICMP, expectedSrc netip.Addr, muxer *mockMuxer) {
|
||||||
encoder := packet.NewEncoder()
|
encoder := packet.NewEncoder()
|
||||||
rawPacket, err := encoder.Encode(originalPacket)
|
rawPacket, err := encoder.Encode(originalPacket)
|
||||||
|
|
9
jet.yaml
9
jet.yaml
|
@ -1,9 +0,0 @@
|
||||||
---
|
|
||||||
basename: "cloudflared"
|
|
||||||
comment: "Cloudflare Tunnel"
|
|
||||||
copyright: "Cloudflare, Inc"
|
|
||||||
arch: "x86"
|
|
||||||
abi: "64"
|
|
||||||
files:
|
|
||||||
- source: cloudflared
|
|
||||||
destination: /var/db/scripts/jet/cloudflared
|
|
|
@ -7,8 +7,8 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/go-jose/go-jose/v3"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"gopkg.in/square/go-jose.v2"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -60,7 +60,6 @@ func TestNewLocalConfig_MarshalJSON(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": true,
|
|
||||||
"connectTimeout": 1
|
"connectTimeout": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,7 +82,6 @@ func TestNewLocalConfig_MarshalJSON(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, remoteConfig.WarpRouting, ingress.WarpRoutingConfig{
|
require.Equal(t, remoteConfig.WarpRouting, ingress.WarpRoutingConfig{
|
||||||
Enabled: true,
|
|
||||||
ConnectTimeout: config.CustomDuration{
|
ConnectTimeout: config.CustomDuration{
|
||||||
Duration: time.Second,
|
Duration: time.Second,
|
||||||
},
|
},
|
||||||
|
|
|
@ -30,7 +30,6 @@ type Orchestrator struct {
|
||||||
proxy atomic.Value
|
proxy atomic.Value
|
||||||
// Set of internal ingress rules defined at cloudflared startup (separate from user-defined ingress rules)
|
// Set of internal ingress rules defined at cloudflared startup (separate from user-defined ingress rules)
|
||||||
internalRules []ingress.Rule
|
internalRules []ingress.Rule
|
||||||
warpRoutingEnabled atomic.Bool
|
|
||||||
config *Config
|
config *Config
|
||||||
tags []tunnelpogs.Tag
|
tags []tunnelpogs.Tag
|
||||||
log *zerolog.Logger
|
log *zerolog.Logger
|
||||||
|
@ -136,11 +135,6 @@ func (o *Orchestrator) updateIngress(ingressRules ingress.Ingress, warpRouting i
|
||||||
o.proxy.Store(proxy)
|
o.proxy.Store(proxy)
|
||||||
o.config.Ingress = &ingressRules
|
o.config.Ingress = &ingressRules
|
||||||
o.config.WarpRouting = warpRouting
|
o.config.WarpRouting = warpRouting
|
||||||
if warpRouting.Enabled {
|
|
||||||
o.warpRoutingEnabled.Store(true)
|
|
||||||
} else {
|
|
||||||
o.warpRoutingEnabled.Store(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If proxyShutdownC is nil, there is no previous running proxy
|
// If proxyShutdownC is nil, there is no previous running proxy
|
||||||
if o.proxyShutdownC != nil {
|
if o.proxyShutdownC != nil {
|
||||||
|
@ -209,10 +203,6 @@ func (o *Orchestrator) GetOriginProxy() (connection.OriginProxy, error) {
|
||||||
return proxy, nil
|
return proxy, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *Orchestrator) WarpRoutingEnabled() bool {
|
|
||||||
return o.warpRoutingEnabled.Load()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Orchestrator) waitToCloseLastProxy() {
|
func (o *Orchestrator) waitToCloseLastProxy() {
|
||||||
<-o.shutdownC
|
<-o.shutdownC
|
||||||
o.lock.Lock()
|
o.lock.Lock()
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
@ -56,7 +55,6 @@ func TestUpdateConfiguration(t *testing.T) {
|
||||||
initOriginProxy, err := orchestrator.GetOriginProxy()
|
initOriginProxy, err := orchestrator.GetOriginProxy()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Implements(t, (*connection.OriginProxy)(nil), initOriginProxy)
|
require.Implements(t, (*connection.OriginProxy)(nil), initOriginProxy)
|
||||||
require.False(t, orchestrator.WarpRoutingEnabled())
|
|
||||||
|
|
||||||
configJSONV2 := []byte(`
|
configJSONV2 := []byte(`
|
||||||
{
|
{
|
||||||
|
@ -88,7 +86,6 @@ func TestUpdateConfiguration(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": true,
|
|
||||||
"connectTimeout": 10
|
"connectTimeout": 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,8 +124,6 @@ func TestUpdateConfiguration(t *testing.T) {
|
||||||
require.Equal(t, config.CustomDuration{Duration: time.Second * 90}, configV2.Ingress.Rules[2].Config.ConnectTimeout)
|
require.Equal(t, config.CustomDuration{Duration: time.Second * 90}, configV2.Ingress.Rules[2].Config.ConnectTimeout)
|
||||||
require.Equal(t, false, configV2.Ingress.Rules[2].Config.NoTLSVerify)
|
require.Equal(t, false, configV2.Ingress.Rules[2].Config.NoTLSVerify)
|
||||||
require.Equal(t, true, configV2.Ingress.Rules[2].Config.NoHappyEyeballs)
|
require.Equal(t, true, configV2.Ingress.Rules[2].Config.NoHappyEyeballs)
|
||||||
require.True(t, configV2.WarpRouting.Enabled)
|
|
||||||
require.Equal(t, configV2.WarpRouting.Enabled, orchestrator.WarpRoutingEnabled())
|
|
||||||
require.Equal(t, configV2.WarpRouting.ConnectTimeout.Duration, 10*time.Second)
|
require.Equal(t, configV2.WarpRouting.ConnectTimeout.Duration, 10*time.Second)
|
||||||
|
|
||||||
originProxyV2, err := orchestrator.GetOriginProxy()
|
originProxyV2, err := orchestrator.GetOriginProxy()
|
||||||
|
@ -163,7 +158,6 @@ func TestUpdateConfiguration(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
@ -172,8 +166,6 @@ func TestUpdateConfiguration(t *testing.T) {
|
||||||
require.Len(t, configV10.Ingress.Rules, 1)
|
require.Len(t, configV10.Ingress.Rules, 1)
|
||||||
require.True(t, configV10.Ingress.Rules[0].Matches("blogs.tunnel.io", "/2022/02/10"))
|
require.True(t, configV10.Ingress.Rules[0].Matches("blogs.tunnel.io", "/2022/02/10"))
|
||||||
require.Equal(t, ingress.HelloWorldService, configV10.Ingress.Rules[0].Service.String())
|
require.Equal(t, ingress.HelloWorldService, configV10.Ingress.Rules[0].Service.String())
|
||||||
require.False(t, configV10.WarpRouting.Enabled)
|
|
||||||
require.Equal(t, configV10.WarpRouting.Enabled, orchestrator.WarpRoutingEnabled())
|
|
||||||
|
|
||||||
originProxyV10, err := orchestrator.GetOriginProxy()
|
originProxyV10, err := orchestrator.GetOriginProxy()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -192,7 +184,6 @@ func TestUpdateConfiguration_FromMigration(t *testing.T) {
|
||||||
initOriginProxy, err := orchestrator.GetOriginProxy()
|
initOriginProxy, err := orchestrator.GetOriginProxy()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Implements(t, (*connection.OriginProxy)(nil), initOriginProxy)
|
require.Implements(t, (*connection.OriginProxy)(nil), initOriginProxy)
|
||||||
require.False(t, orchestrator.WarpRoutingEnabled())
|
|
||||||
|
|
||||||
configJSONV2 := []byte(`
|
configJSONV2 := []byte(`
|
||||||
{
|
{
|
||||||
|
@ -202,7 +193,6 @@ func TestUpdateConfiguration_FromMigration(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
@ -272,7 +262,6 @@ func TestConcurrentUpdateAndRead(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`, hostname, httpOrigin.URL, expectedHost))
|
`, hostname, httpOrigin.URL, expectedHost))
|
||||||
|
@ -284,7 +273,6 @@ func TestConcurrentUpdateAndRead(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
@ -297,7 +285,6 @@ func TestConcurrentUpdateAndRead(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
@ -338,7 +325,7 @@ func TestConcurrentUpdateAndRead(t *testing.T) {
|
||||||
switch resp.StatusCode {
|
switch resp.StatusCode {
|
||||||
// v1 proxy, warp enabled
|
// v1 proxy, warp enabled
|
||||||
case 200:
|
case 200:
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, t.Name(), string(body))
|
require.Equal(t, t.Name(), string(body))
|
||||||
warpRoutingDisabled = false
|
warpRoutingDisabled = false
|
||||||
|
@ -517,7 +504,6 @@ func TestClosePreviousProxies(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`, hostname))
|
`, hostname))
|
||||||
|
@ -530,7 +516,6 @@ func TestClosePreviousProxies(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
@ -613,7 +598,6 @@ func TestPersistentConnection(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`, wsOrigin.URL))
|
`, wsOrigin.URL))
|
||||||
|
@ -680,7 +664,6 @@ func TestPersistentConnection(t *testing.T) {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"warp-routing": {
|
"warp-routing": {
|
||||||
"enabled": false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
|
|
@ -57,10 +57,8 @@ func NewOriginProxy(
|
||||||
tags: tags,
|
tags: tags,
|
||||||
log: log,
|
log: log,
|
||||||
}
|
}
|
||||||
if warpRouting.Enabled {
|
|
||||||
proxy.warpRouting = ingress.NewWarpRoutingService(warpRouting)
|
proxy.warpRouting = ingress.NewWarpRoutingService(warpRouting)
|
||||||
log.Info().Msgf("Warp-routing is enabled")
|
|
||||||
}
|
|
||||||
|
|
||||||
return proxy
|
return proxy
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
//go:build !windows
|
//go:build !windows
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
@ -17,7 +15,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestUnixSocketOrigin(t *testing.T) {
|
func TestUnixSocketOrigin(t *testing.T) {
|
||||||
file, err := ioutil.TempFile("", "unix.sock")
|
file, err := os.CreateTemp("", "unix.sock")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
os.Remove(file.Name()) // remove the file since binding the socket expects to create it
|
os.Remove(file.Name()) // remove the file since binding the socket expects to create it
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@ var (
|
||||||
testTags = []tunnelpogs.Tag{{Name: "Name", Value: "value"}}
|
testTags = []tunnelpogs.Tag{{Name: "Name", Value: "value"}}
|
||||||
noWarpRouting = ingress.WarpRoutingConfig{}
|
noWarpRouting = ingress.WarpRoutingConfig{}
|
||||||
testWarpRouting = ingress.WarpRoutingConfig{
|
testWarpRouting = ingress.WarpRoutingConfig{
|
||||||
Enabled: true,
|
|
||||||
ConnectTimeout: config.CustomDuration{Duration: time.Second},
|
ConnectTimeout: config.CustomDuration{Duration: time.Second},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -53,7 +53,7 @@ func (dm *DatagramMuxer) SendToSession(session *packet.Session) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Failed to suffix session ID to datagram, it will be dropped")
|
return errors.Wrap(err, "Failed to suffix session ID to datagram, it will be dropped")
|
||||||
}
|
}
|
||||||
if err := dm.session.SendMessage(payloadWithMetadata); err != nil {
|
if err := dm.session.SendDatagram(payloadWithMetadata); err != nil {
|
||||||
return errors.Wrap(err, "Failed to send datagram back to edge")
|
return errors.Wrap(err, "Failed to send datagram back to edge")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -64,7 +64,7 @@ func (dm *DatagramMuxer) ServeReceive(ctx context.Context) error {
|
||||||
// Extracts datagram session ID, then sends the session ID and payload to receiver
|
// Extracts datagram session ID, then sends the session ID and payload to receiver
|
||||||
// which determines how to proxy to the origin. It assumes the datagram session has already been
|
// which determines how to proxy to the origin. It assumes the datagram session has already been
|
||||||
// registered with receiver through other side channel
|
// registered with receiver through other side channel
|
||||||
msg, err := dm.session.ReceiveMessage()
|
msg, err := dm.session.ReceiveDatagram(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
@ -116,7 +117,6 @@ func testDatagram(t *testing.T, version uint8, sessionToPayloads []*packet.Sessi
|
||||||
quicConfig := &quic.Config{
|
quicConfig := &quic.Config{
|
||||||
KeepAlivePeriod: 5 * time.Millisecond,
|
KeepAlivePeriod: 5 * time.Millisecond,
|
||||||
EnableDatagrams: true,
|
EnableDatagrams: true,
|
||||||
MaxDatagramFrameSize: MaxDatagramFrameSize,
|
|
||||||
}
|
}
|
||||||
quicListener := newQUICListener(t, quicConfig)
|
quicListener := newQUICListener(t, quicConfig)
|
||||||
defer quicListener.Close()
|
defer quicListener.Close()
|
||||||
|
@ -182,8 +182,12 @@ func testDatagram(t *testing.T, version uint8, sessionToPayloads []*packet.Sessi
|
||||||
}
|
}
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
|
// https://github.com/quic-go/quic-go/issues/3793 MTU discovery is disabled on OSX for dual stack listeners
|
||||||
|
udpConn, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4zero, Port: 0})
|
||||||
|
require.NoError(t, err)
|
||||||
// Establish quic connection
|
// Establish quic connection
|
||||||
quicSession, err := quic.DialAddrEarly(ctx, quicListener.Addr().String(), tlsClientConfig, quicConfig)
|
quicSession, err := quic.DialEarly(ctx, udpConn, quicListener.Addr(), tlsClientConfig, quicConfig)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer quicSession.CloseWithError(0, "")
|
defer quicSession.CloseWithError(0, "")
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,7 @@ func (dm *DatagramMuxerV2) SendToSession(session *packet.Session) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Failed to suffix datagram type, it will be dropped")
|
return errors.Wrap(err, "Failed to suffix datagram type, it will be dropped")
|
||||||
}
|
}
|
||||||
if err := dm.session.SendMessage(msgWithIDAndType); err != nil {
|
if err := dm.session.SendDatagram(msgWithIDAndType); err != nil {
|
||||||
return errors.Wrap(err, "Failed to send datagram back to edge")
|
return errors.Wrap(err, "Failed to send datagram back to edge")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -104,7 +104,7 @@ func (dm *DatagramMuxerV2) SendPacket(pk Packet) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Failed to suffix datagram type, it will be dropped")
|
return errors.Wrap(err, "Failed to suffix datagram type, it will be dropped")
|
||||||
}
|
}
|
||||||
if err := dm.session.SendMessage(payloadWithMetadataAndType); err != nil {
|
if err := dm.session.SendDatagram(payloadWithMetadataAndType); err != nil {
|
||||||
return errors.Wrap(err, "Failed to send datagram back to edge")
|
return errors.Wrap(err, "Failed to send datagram back to edge")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -113,7 +113,7 @@ func (dm *DatagramMuxerV2) SendPacket(pk Packet) error {
|
||||||
// Demux reads datagrams from the QUIC connection and demuxes depending on whether it's a session or packet
|
// Demux reads datagrams from the QUIC connection and demuxes depending on whether it's a session or packet
|
||||||
func (dm *DatagramMuxerV2) ServeReceive(ctx context.Context) error {
|
func (dm *DatagramMuxerV2) ServeReceive(ctx context.Context) error {
|
||||||
for {
|
for {
|
||||||
msg, err := dm.session.ReceiveMessage()
|
msg, err := dm.session.ReceiveDatagram(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ type tracerConfig struct {
|
||||||
index uint8
|
index uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewClientTracer(logger *zerolog.Logger, index uint8) func(context.Context, logging.Perspective, logging.ConnectionID) logging.ConnectionTracer {
|
func NewClientTracer(logger *zerolog.Logger, index uint8) func(context.Context, logging.Perspective, logging.ConnectionID) *logging.ConnectionTracer {
|
||||||
t := &tracer{
|
t := &tracer{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
config: &tracerConfig{
|
config: &tracerConfig{
|
||||||
|
@ -32,42 +32,61 @@ func NewClientTracer(logger *zerolog.Logger, index uint8) func(context.Context,
|
||||||
return t.TracerForConnection
|
return t.TracerForConnection
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServerTracer(logger *zerolog.Logger) logging.Tracer {
|
func NewServerTracer(logger *zerolog.Logger) *logging.Tracer {
|
||||||
return &tracer{
|
return &logging.Tracer{
|
||||||
logger: logger,
|
SentPacket: func(net.Addr, *logging.Header, logging.ByteCount, []logging.Frame) {},
|
||||||
config: &tracerConfig{
|
SentVersionNegotiationPacket: func(_ net.Addr, dest, src logging.ArbitraryLenConnectionID, _ []logging.VersionNumber) {},
|
||||||
isClient: false,
|
DroppedPacket: func(net.Addr, logging.PacketType, logging.ByteCount, logging.PacketDropReason) {},
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *tracer) TracerForConnection(_ctx context.Context, _p logging.Perspective, _odcid logging.ConnectionID) logging.ConnectionTracer {
|
func (t *tracer) TracerForConnection(_ctx context.Context, _p logging.Perspective, _odcid logging.ConnectionID) *logging.ConnectionTracer {
|
||||||
if t.config.isClient {
|
if t.config.isClient {
|
||||||
return newConnTracer(newClientCollector(t.config.index))
|
return newConnTracer(newClientCollector(t.config.index))
|
||||||
}
|
}
|
||||||
return newConnTracer(newServiceCollector())
|
return newConnTracer(newServiceCollector())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*tracer) SentPacket(net.Addr, *logging.Header, logging.ByteCount, []logging.Frame) {
|
|
||||||
}
|
|
||||||
func (*tracer) SentVersionNegotiationPacket(_ net.Addr, dest, src logging.ArbitraryLenConnectionID, _ []logging.VersionNumber) {
|
|
||||||
}
|
|
||||||
func (*tracer) DroppedPacket(net.Addr, logging.PacketType, logging.ByteCount, logging.PacketDropReason) {
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ logging.Tracer = (*tracer)(nil)
|
|
||||||
|
|
||||||
// connTracer collects connection level metrics
|
// connTracer collects connection level metrics
|
||||||
type connTracer struct {
|
type connTracer struct {
|
||||||
metricsCollector MetricsCollector
|
metricsCollector MetricsCollector
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ logging.ConnectionTracer = (*connTracer)(nil)
|
func newConnTracer(metricsCollector MetricsCollector) *logging.ConnectionTracer {
|
||||||
|
tracer := connTracer{
|
||||||
func newConnTracer(metricsCollector MetricsCollector) logging.ConnectionTracer {
|
|
||||||
return &connTracer{
|
|
||||||
metricsCollector: metricsCollector,
|
metricsCollector: metricsCollector,
|
||||||
}
|
}
|
||||||
|
return &logging.ConnectionTracer{
|
||||||
|
StartedConnection: tracer.StartedConnection,
|
||||||
|
NegotiatedVersion: tracer.NegotiatedVersion,
|
||||||
|
ClosedConnection: tracer.ClosedConnection,
|
||||||
|
SentTransportParameters: tracer.SentTransportParameters,
|
||||||
|
ReceivedTransportParameters: tracer.ReceivedTransportParameters,
|
||||||
|
RestoredTransportParameters: tracer.RestoredTransportParameters,
|
||||||
|
SentLongHeaderPacket: tracer.SentLongHeaderPacket,
|
||||||
|
SentShortHeaderPacket: tracer.SentShortHeaderPacket,
|
||||||
|
ReceivedVersionNegotiationPacket: tracer.ReceivedVersionNegotiationPacket,
|
||||||
|
ReceivedRetry: tracer.ReceivedRetry,
|
||||||
|
ReceivedLongHeaderPacket: tracer.ReceivedLongHeaderPacket,
|
||||||
|
ReceivedShortHeaderPacket: tracer.ReceivedShortHeaderPacket,
|
||||||
|
BufferedPacket: tracer.BufferedPacket,
|
||||||
|
DroppedPacket: tracer.DroppedPacket,
|
||||||
|
UpdatedMetrics: tracer.UpdatedMetrics,
|
||||||
|
AcknowledgedPacket: tracer.AcknowledgedPacket,
|
||||||
|
LostPacket: tracer.LostPacket,
|
||||||
|
UpdatedCongestionState: tracer.UpdatedCongestionState,
|
||||||
|
UpdatedPTOCount: tracer.UpdatedPTOCount,
|
||||||
|
UpdatedKeyFromTLS: tracer.UpdatedKeyFromTLS,
|
||||||
|
UpdatedKey: tracer.UpdatedKey,
|
||||||
|
DroppedEncryptionLevel: tracer.DroppedEncryptionLevel,
|
||||||
|
DroppedKey: tracer.DroppedKey,
|
||||||
|
SetLossTimer: tracer.SetLossTimer,
|
||||||
|
LossTimerExpired: tracer.LossTimerExpired,
|
||||||
|
LossTimerCanceled: tracer.LossTimerCanceled,
|
||||||
|
ECNStateUpdated: tracer.ECNStateUpdated,
|
||||||
|
Close: tracer.Close,
|
||||||
|
Debug: tracer.Debug,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ct *connTracer) StartedConnection(local, remote net.Addr, srcConnID, destConnID logging.ConnectionID) {
|
func (ct *connTracer) StartedConnection(local, remote net.Addr, srcConnID, destConnID logging.ConnectionID) {
|
||||||
|
@ -90,7 +109,7 @@ func (ct *connTracer) BufferedPacket(pt logging.PacketType, size logging.ByteCou
|
||||||
ct.metricsCollector.bufferedPackets(pt)
|
ct.metricsCollector.bufferedPackets(pt)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ct *connTracer) DroppedPacket(pt logging.PacketType, size logging.ByteCount, reason logging.PacketDropReason) {
|
func (ct *connTracer) DroppedPacket(pt logging.PacketType, number logging.PacketNumber, size logging.ByteCount, reason logging.PacketDropReason) {
|
||||||
ct.metricsCollector.droppedPackets(pt, size, reason)
|
ct.metricsCollector.droppedPackets(pt, size, reason)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,10 +133,10 @@ func (ct *connTracer) ReceivedTransportParameters(parameters *logging.TransportP
|
||||||
func (ct *connTracer) RestoredTransportParameters(parameters *logging.TransportParameters) {
|
func (ct *connTracer) RestoredTransportParameters(parameters *logging.TransportParameters) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ct *connTracer) SentLongHeaderPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, ack *logging.AckFrame, frames []logging.Frame) {
|
func (ct *connTracer) SentLongHeaderPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, ecn logging.ECN, ack *logging.AckFrame, frames []logging.Frame) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ct *connTracer) SentShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, ack *logging.AckFrame, frames []logging.Frame) {
|
func (ct *connTracer) SentShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, ecn logging.ECN, ack *logging.AckFrame, frames []logging.Frame) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ct *connTracer) ReceivedVersionNegotiationPacket(dest, src logging.ArbitraryLenConnectionID, _ []logging.VersionNumber) {
|
func (ct *connTracer) ReceivedVersionNegotiationPacket(dest, src logging.ArbitraryLenConnectionID, _ []logging.VersionNumber) {
|
||||||
|
@ -126,10 +145,10 @@ func (ct *connTracer) ReceivedVersionNegotiationPacket(dest, src logging.Arbitra
|
||||||
func (ct *connTracer) ReceivedRetry(header *logging.Header) {
|
func (ct *connTracer) ReceivedRetry(header *logging.Header) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ct *connTracer) ReceivedLongHeaderPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, frames []logging.Frame) {
|
func (ct *connTracer) ReceivedLongHeaderPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, ecn logging.ECN, frames []logging.Frame) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ct *connTracer) ReceivedShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, frames []logging.Frame) {
|
func (ct *connTracer) ReceivedShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, ecn logging.ECN, frames []logging.Frame) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ct *connTracer) AcknowledgedPacket(level logging.EncryptionLevel, number logging.PacketNumber) {
|
func (ct *connTracer) AcknowledgedPacket(level logging.EncryptionLevel, number logging.PacketNumber) {
|
||||||
|
@ -162,6 +181,10 @@ func (ct *connTracer) LossTimerExpired(timerType logging.TimerType, level loggin
|
||||||
func (ct *connTracer) LossTimerCanceled() {
|
func (ct *connTracer) LossTimerCanceled() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ct *connTracer) ECNStateUpdated(state logging.ECNState, trigger logging.ECNStateTrigger) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (ct *connTracer) Close() {
|
func (ct *connTracer) Close() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@ import base64
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
from hashlib import sha256
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
|
|
||||||
|
@ -35,7 +34,6 @@ class PkgUploader:
|
||||||
|
|
||||||
def upload_pkg_to_r2(self, filename, upload_file_path):
|
def upload_pkg_to_r2(self, filename, upload_file_path):
|
||||||
endpoint_url = f"https://{self.account_id}.r2.cloudflarestorage.com"
|
endpoint_url = f"https://{self.account_id}.r2.cloudflarestorage.com"
|
||||||
token_secret_hash = sha256(self.client_secret.encode()).hexdigest()
|
|
||||||
|
|
||||||
config = Config(
|
config = Config(
|
||||||
region_name='auto',
|
region_name='auto',
|
||||||
|
@ -48,7 +46,7 @@ class PkgUploader:
|
||||||
"s3",
|
"s3",
|
||||||
endpoint_url=endpoint_url,
|
endpoint_url=endpoint_url,
|
||||||
aws_access_key_id=self.client_id,
|
aws_access_key_id=self.client_id,
|
||||||
aws_secret_access_key=token_secret_hash,
|
aws_secret_access_key=self.client_secret,
|
||||||
config=config,
|
config=config,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -91,10 +91,12 @@ func (b *BackoffHandler) Backoff(ctx context.Context) bool {
|
||||||
|
|
||||||
// Sets a grace period within which the the backoff timer is maintained. After the grace
|
// Sets a grace period within which the the backoff timer is maintained. After the grace
|
||||||
// period expires, the number of retries & backoff duration is reset.
|
// period expires, the number of retries & backoff duration is reset.
|
||||||
func (b *BackoffHandler) SetGracePeriod() {
|
func (b *BackoffHandler) SetGracePeriod() time.Duration {
|
||||||
maxTimeToWait := b.GetBaseTime() * 2 << (b.retries + 1)
|
maxTimeToWait := b.GetBaseTime() * 2 << (b.retries + 1)
|
||||||
timeToWait := time.Duration(rand.Int63n(maxTimeToWait.Nanoseconds()))
|
timeToWait := time.Duration(rand.Int63n(maxTimeToWait.Nanoseconds()))
|
||||||
b.resetDeadline = Clock.Now().Add(timeToWait)
|
b.resetDeadline = Clock.Now().Add(timeToWait)
|
||||||
|
|
||||||
|
return timeToWait
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b BackoffHandler) GetBaseTime() time.Duration {
|
func (b BackoffHandler) GetBaseTime() time.Duration {
|
||||||
|
|
|
@ -57,9 +57,9 @@ func TestBackoffGracePeriod(t *testing.T) {
|
||||||
t.Fatalf("backoff failed immediately")
|
t.Fatalf("backoff failed immediately")
|
||||||
}
|
}
|
||||||
// the next call to Backoff would fail unless it's after the grace period
|
// the next call to Backoff would fail unless it's after the grace period
|
||||||
backoff.SetGracePeriod()
|
gracePeriod := backoff.SetGracePeriod()
|
||||||
// advance time to after the grace period (~4 seconds) and see what happens
|
// advance time to after the grace period, which at most will be 8 seconds, but we will advance +1 second.
|
||||||
currentTime = currentTime.Add(time.Second * 5)
|
currentTime = currentTime.Add(gracePeriod + time.Second)
|
||||||
if !backoff.Backoff(ctx) {
|
if !backoff.Backoff(ctx) {
|
||||||
t.Fatalf("backoff failed after the grace period expired")
|
t.Fatalf("backoff failed after the grace period expired")
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ package socks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -32,7 +32,7 @@ func sendSocksRequest(t *testing.T) []byte {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
b, err := ioutil.ReadAll(resp.Body)
|
b, err := io.ReadAll(resp.Body)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
return b
|
return b
|
||||||
|
|
|
@ -10,15 +10,15 @@ import (
|
||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-jose/go-jose/v3/jwt"
|
||||||
homedir "github.com/mitchellh/go-homedir"
|
homedir "github.com/mitchellh/go-homedir"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
gossh "golang.org/x/crypto/ssh"
|
gossh "golang.org/x/crypto/ssh"
|
||||||
"gopkg.in/square/go-jose.v2/jwt"
|
|
||||||
|
|
||||||
"github.com/cloudflare/cloudflared/config"
|
"github.com/cloudflare/cloudflared/config"
|
||||||
cfpath "github.com/cloudflare/cloudflared/token"
|
cfpath "github.com/cloudflare/cloudflared/token"
|
||||||
|
@ -148,7 +148,7 @@ func generateKeyPair(fullName string) ([]byte, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if exist {
|
if exist {
|
||||||
return ioutil.ReadFile(pubKeyName)
|
return os.ReadFile(pubKeyName)
|
||||||
}
|
}
|
||||||
|
|
||||||
key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
||||||
|
@ -187,5 +187,5 @@ func writeKey(filename string, data []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return ioutil.WriteFile(filepath, data, 0600)
|
return os.WriteFile(filepath, data, 0600)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//go:build !windows
|
//go:build !windows
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package sshgen
|
package sshgen
|
||||||
|
|
||||||
|
@ -7,7 +6,6 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -16,9 +14,9 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-jose/go-jose/v3"
|
||||||
|
"github.com/go-jose/go-jose/v3/jwt"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"gopkg.in/square/go-jose.v2"
|
|
||||||
"gopkg.in/square/go-jose.v2/jwt"
|
|
||||||
|
|
||||||
"github.com/cloudflare/cloudflared/config"
|
"github.com/cloudflare/cloudflared/config"
|
||||||
cfpath "github.com/cloudflare/cloudflared/token"
|
cfpath "github.com/cloudflare/cloudflared/token"
|
||||||
|
@ -64,7 +62,7 @@ func TestCertGenSuccess(t *testing.T) {
|
||||||
mockRequest = func(url, contentType string, body io.Reader) (*http.Response, error) {
|
mockRequest = func(url, contentType string, body io.Reader) (*http.Response, error) {
|
||||||
assert.Contains(t, "/cdn-cgi/access/cert_sign", url)
|
assert.Contains(t, "/cdn-cgi/access/cert_sign", url)
|
||||||
assert.Equal(t, "application/json", contentType)
|
assert.Equal(t, "application/json", contentType)
|
||||||
buf, err := ioutil.ReadAll(body)
|
buf, err := io.ReadAll(body)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotEmpty(t, buf)
|
assert.NotEmpty(t, buf)
|
||||||
return w.Result(), nil
|
return w.Result(), nil
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
package supervisor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/cloudflare/golibs/lrucache"
|
|
||||||
)
|
|
||||||
|
|
||||||
// StatusPage.io API docs:
|
|
||||||
// https://www.cloudflarestatus.com/api/v2/#incidents-unresolved
|
|
||||||
const (
|
|
||||||
activeIncidentsURL = "https://yh6f0r4529hb.statuspage.io/api/v2/incidents/unresolved.json"
|
|
||||||
argoTunnelKeyword = "argo tunnel"
|
|
||||||
incidentDetailsPrefix = "https://www.cloudflarestatus.com/incidents/"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IncidentLookup is an object that checks for active incidents in
|
|
||||||
// the Cloudflare infrastructure.
|
|
||||||
type IncidentLookup interface {
|
|
||||||
ActiveIncidents() []Incident
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewIncidentLookup returns a new IncidentLookup instance that caches its
|
|
||||||
// results with a 1-minute TTL.
|
|
||||||
func NewIncidentLookup() IncidentLookup {
|
|
||||||
return newCachedIncidentLookup(fetchActiveIncidents)
|
|
||||||
}
|
|
||||||
|
|
||||||
type IncidentUpdate struct {
|
|
||||||
Body string
|
|
||||||
}
|
|
||||||
|
|
||||||
type Incident struct {
|
|
||||||
Name string
|
|
||||||
ID string `json:"id"`
|
|
||||||
Updates []IncidentUpdate `json:"incident_updates"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type StatusPage struct {
|
|
||||||
Incidents []Incident
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i Incident) URL() string {
|
|
||||||
return incidentDetailsPrefix + i.ID
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseStatusPage(data []byte) (*StatusPage, error) {
|
|
||||||
var result StatusPage
|
|
||||||
err := json.Unmarshal(data, &result)
|
|
||||||
return &result, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func isArgoTunnelIncident(i Incident) bool {
|
|
||||||
if strings.Contains(strings.ToLower(i.Name), argoTunnelKeyword) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, u := range i.Updates {
|
|
||||||
if strings.Contains(strings.ToLower(u.Body), argoTunnelKeyword) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func fetchActiveIncidents() (incidents []Incident) {
|
|
||||||
resp, err := http.Get(activeIncidentsURL)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
statusPage, err := parseStatusPage(body)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, i := range statusPage.Incidents {
|
|
||||||
if isArgoTunnelIncident(i) {
|
|
||||||
incidents = append(incidents, i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return incidents
|
|
||||||
}
|
|
||||||
|
|
||||||
type cachedIncidentLookup struct {
|
|
||||||
cache *lrucache.LRUCache
|
|
||||||
ttl time.Duration
|
|
||||||
uncachedLookup func() []Incident
|
|
||||||
}
|
|
||||||
|
|
||||||
func newCachedIncidentLookup(uncachedLookup func() []Incident) *cachedIncidentLookup {
|
|
||||||
return &cachedIncidentLookup{
|
|
||||||
cache: lrucache.NewLRUCache(1),
|
|
||||||
ttl: time.Minute,
|
|
||||||
uncachedLookup: uncachedLookup,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We only need one cache entry. Always use the empty string as its key.
|
|
||||||
const cacheKey = ""
|
|
||||||
|
|
||||||
func (c *cachedIncidentLookup) ActiveIncidents() []Incident {
|
|
||||||
if cached, ok := c.cache.GetNotStale(cacheKey); ok {
|
|
||||||
if incidents, ok := cached.([]Incident); ok {
|
|
||||||
return incidents
|
|
||||||
}
|
|
||||||
}
|
|
||||||
incidents := c.uncachedLookup()
|
|
||||||
c.cache.Set(cacheKey, incidents, time.Now().Add(c.ttl))
|
|
||||||
return incidents
|
|
||||||
}
|
|
|
@ -1,384 +0,0 @@
|
||||||
package supervisor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/cloudflare/golibs/lrucache"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestParseStatusPage(t *testing.T) {
|
|
||||||
testCases := []struct {
|
|
||||||
input []byte
|
|
||||||
output *StatusPage
|
|
||||||
fail bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
input: []byte(`<html>
|
|
||||||
<head><title>504 Gateway Time-out</title></head>
|
|
||||||
<body><center><h1>504 Gateway Time-out</h1></center></body>
|
|
||||||
</html>`),
|
|
||||||
output: nil,
|
|
||||||
fail: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: []byte(`{
|
|
||||||
"page": {
|
|
||||||
"id": "yh6f0r4529hb",
|
|
||||||
"name": "Cloudflare",
|
|
||||||
"url": "https://www.cloudflarestatus.com",
|
|
||||||
"time_zone": "Etc/UTC",
|
|
||||||
"updated_at": "2019-01-10T20:11:38.750Z"
|
|
||||||
},
|
|
||||||
"incidents": [
|
|
||||||
{
|
|
||||||
"name": "Cloudflare API service issues",
|
|
||||||
"status": "resolved",
|
|
||||||
"created_at": "2018-09-17T19:29:21.132Z",
|
|
||||||
"updated_at": "2018-09-18T07:45:41.313Z",
|
|
||||||
"monitoring_at": "2018-09-17T21:35:06.492Z",
|
|
||||||
"resolved_at": "2018-09-18T07:45:41.290Z",
|
|
||||||
"shortlink": "http://stspg.io/7f079791e",
|
|
||||||
"id": "q746ybtyb6q0",
|
|
||||||
"page_id": "yh6f0r4529hb",
|
|
||||||
"incident_updates": [
|
|
||||||
{
|
|
||||||
"status": "resolved",
|
|
||||||
"body": "Cloudflare has resolved the issue and the service have resumed normal operation.",
|
|
||||||
"created_at": "2018-09-18T07:45:41.290Z",
|
|
||||||
"updated_at": "2018-09-18T07:45:41.290Z",
|
|
||||||
"display_at": "2018-09-18T07:45:41.290Z",
|
|
||||||
"affected_components": [
|
|
||||||
{
|
|
||||||
"code": "g4tb35rs9yw7",
|
|
||||||
"name": "Cloudflare customer dashboard and APIs - Cloudflare APIs",
|
|
||||||
"old_status": "operational",
|
|
||||||
"new_status": "operational"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"deliver_notifications": true,
|
|
||||||
"tweet_id": null,
|
|
||||||
"id": "zl5g2pl5zhfs",
|
|
||||||
"incident_id": "q746ybtyb6q0",
|
|
||||||
"custom_tweet": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"status": "monitoring",
|
|
||||||
"body": "Cloudflare has implemented a fix for this issue and is currently monitoring the results.\r\n\r\nWe will update the status once the issue is resolved.",
|
|
||||||
"created_at": "2018-09-17T21:35:06.492Z",
|
|
||||||
"updated_at": "2018-09-17T21:35:06.492Z",
|
|
||||||
"display_at": "2018-09-17T21:35:06.492Z",
|
|
||||||
"affected_components": [
|
|
||||||
{
|
|
||||||
"code": "g4tb35rs9yw7",
|
|
||||||
"name": "Cloudflare customer dashboard and APIs - Cloudflare APIs",
|
|
||||||
"old_status": "degraded_performance",
|
|
||||||
"new_status": "operational"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"deliver_notifications": false,
|
|
||||||
"tweet_id": null,
|
|
||||||
"id": "0001sv3chdnx",
|
|
||||||
"incident_id": "q746ybtyb6q0",
|
|
||||||
"custom_tweet": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"status": "investigating",
|
|
||||||
"body": "We are continuing to investigate this issue.",
|
|
||||||
"created_at": "2018-09-17T19:30:08.049Z",
|
|
||||||
"updated_at": "2018-09-17T19:30:08.049Z",
|
|
||||||
"display_at": "2018-09-17T19:30:08.049Z",
|
|
||||||
"affected_components": [
|
|
||||||
{
|
|
||||||
"code": "g4tb35rs9yw7",
|
|
||||||
"name": "Cloudflare customer dashboard and APIs - Cloudflare APIs",
|
|
||||||
"old_status": "operational",
|
|
||||||
"new_status": "degraded_performance"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"deliver_notifications": false,
|
|
||||||
"tweet_id": null,
|
|
||||||
"id": "qdr164tfpq7m",
|
|
||||||
"incident_id": "q746ybtyb6q0",
|
|
||||||
"custom_tweet": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"status": "investigating",
|
|
||||||
"body": "Cloudflare is investigating issues with APIs and Page Rule delays for Page Rule updates. Cloudflare Page Rule service delivery is unaffected and is operating normally. Also, these issues do not affect the Cloudflare CDN and therefore, do not impact customer websites.",
|
|
||||||
"created_at": "2018-09-17T19:29:21.201Z",
|
|
||||||
"updated_at": "2018-09-17T19:29:21.201Z",
|
|
||||||
"display_at": "2018-09-17T19:29:21.201Z",
|
|
||||||
"affected_components": [
|
|
||||||
{
|
|
||||||
"code": "g4tb35rs9yw7",
|
|
||||||
"name": "Cloudflare customer dashboard and APIs - Cloudflare APIs",
|
|
||||||
"old_status": "operational",
|
|
||||||
"new_status": "operational"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"deliver_notifications": false,
|
|
||||||
"tweet_id": null,
|
|
||||||
"id": "qzl2n0q8tskg",
|
|
||||||
"incident_id": "q746ybtyb6q0",
|
|
||||||
"custom_tweet": null
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"status": "operational",
|
|
||||||
"name": "Cloudflare APIs",
|
|
||||||
"created_at": "2014-10-09T03:32:07.158Z",
|
|
||||||
"updated_at": "2019-01-01T22:58:30.846Z",
|
|
||||||
"position": 2,
|
|
||||||
"description": null,
|
|
||||||
"showcase": false,
|
|
||||||
"id": "g4tb35rs9yw7",
|
|
||||||
"page_id": "yh6f0r4529hb",
|
|
||||||
"group_id": "1km35smx8p41",
|
|
||||||
"group": false,
|
|
||||||
"only_show_if_degraded": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"impact": "minor"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Web Analytics Delays",
|
|
||||||
"status": "resolved",
|
|
||||||
"created_at": "2018-09-17T18:05:39.907Z",
|
|
||||||
"updated_at": "2018-09-17T22:53:05.078Z",
|
|
||||||
"monitoring_at": null,
|
|
||||||
"resolved_at": "2018-09-17T22:53:05.057Z",
|
|
||||||
"shortlink": "http://stspg.io/cb208928c",
|
|
||||||
"id": "wqfk9mzs5qt1",
|
|
||||||
"page_id": "yh6f0r4529hb",
|
|
||||||
"incident_updates": [
|
|
||||||
{
|
|
||||||
"status": "resolved",
|
|
||||||
"body": "Cloudflare has resolved the issue and Web Analytics have resumed normal operation.",
|
|
||||||
"created_at": "2018-09-17T22:53:05.057Z",
|
|
||||||
"updated_at": "2018-09-17T22:53:05.057Z",
|
|
||||||
"display_at": "2018-09-17T22:53:05.057Z",
|
|
||||||
"affected_components": [
|
|
||||||
{
|
|
||||||
"code": "4c231tkdlpcl",
|
|
||||||
"name": "Cloudflare customer dashboard and APIs - Analytics",
|
|
||||||
"old_status": "degraded_performance",
|
|
||||||
"new_status": "operational"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"deliver_notifications": false,
|
|
||||||
"tweet_id": null,
|
|
||||||
"id": "93y1w00yqzk4",
|
|
||||||
"incident_id": "wqfk9mzs5qt1",
|
|
||||||
"custom_tweet": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"status": "investigating",
|
|
||||||
"body": "There is a delay in processing Cloudflare Web Analytics. This affects timely delivery of customer data.\n\nThese delays do not impact analytics for DNS and Rate Limiting.",
|
|
||||||
"created_at": "2018-09-17T18:05:40.033Z",
|
|
||||||
"updated_at": "2018-09-17T18:05:40.033Z",
|
|
||||||
"display_at": "2018-09-17T18:05:40.033Z",
|
|
||||||
"affected_components": [
|
|
||||||
{
|
|
||||||
"code": "4c231tkdlpcl",
|
|
||||||
"name": "Cloudflare customer dashboard and APIs - Analytics",
|
|
||||||
"old_status": "operational",
|
|
||||||
"new_status": "degraded_performance"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"deliver_notifications": false,
|
|
||||||
"tweet_id": null,
|
|
||||||
"id": "362t6lv0vrpk",
|
|
||||||
"incident_id": "wqfk9mzs5qt1",
|
|
||||||
"custom_tweet": null
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"status": "operational",
|
|
||||||
"name": "Analytics",
|
|
||||||
"created_at": "2014-11-13T11:54:10.191Z",
|
|
||||||
"updated_at": "2018-12-31T08:20:52.349Z",
|
|
||||||
"position": 3,
|
|
||||||
"description": "Customer data",
|
|
||||||
"showcase": false,
|
|
||||||
"id": "4c231tkdlpcl",
|
|
||||||
"page_id": "yh6f0r4529hb",
|
|
||||||
"group_id": "1km35smx8p41",
|
|
||||||
"group": false,
|
|
||||||
"only_show_if_degraded": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"impact": "minor"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}`),
|
|
||||||
output: &StatusPage{
|
|
||||||
Incidents: []Incident{
|
|
||||||
Incident{
|
|
||||||
Name: "Cloudflare API service issues",
|
|
||||||
ID: "q746ybtyb6q0",
|
|
||||||
Updates: []IncidentUpdate{
|
|
||||||
IncidentUpdate{
|
|
||||||
Body: "Cloudflare has resolved the issue and the service have resumed normal operation.",
|
|
||||||
},
|
|
||||||
IncidentUpdate{
|
|
||||||
Body: "Cloudflare has implemented a fix for this issue and is currently monitoring the results.\r\n\r\nWe will update the status once the issue is resolved.",
|
|
||||||
},
|
|
||||||
IncidentUpdate{
|
|
||||||
Body: "We are continuing to investigate this issue.",
|
|
||||||
},
|
|
||||||
IncidentUpdate{
|
|
||||||
Body: "Cloudflare is investigating issues with APIs and Page Rule delays for Page Rule updates. Cloudflare Page Rule service delivery is unaffected and is operating normally. Also, these issues do not affect the Cloudflare CDN and therefore, do not impact customer websites.",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Incident{
|
|
||||||
Name: "Web Analytics Delays",
|
|
||||||
ID: "wqfk9mzs5qt1",
|
|
||||||
Updates: []IncidentUpdate{
|
|
||||||
IncidentUpdate{
|
|
||||||
Body: "Cloudflare has resolved the issue and Web Analytics have resumed normal operation.",
|
|
||||||
},
|
|
||||||
IncidentUpdate{
|
|
||||||
Body: "There is a delay in processing Cloudflare Web Analytics. This affects timely delivery of customer data.\n\nThese delays do not impact analytics for DNS and Rate Limiting.",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
fail: false,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, testCase := range testCases {
|
|
||||||
output, err := parseStatusPage(testCase.input)
|
|
||||||
if testCase.fail {
|
|
||||||
assert.Error(t, err)
|
|
||||||
} else {
|
|
||||||
assert.Nil(t, err)
|
|
||||||
assert.Equal(t, testCase.output, output)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestIsArgoTunnelIncident(t *testing.T) {
|
|
||||||
testCases := []struct {
|
|
||||||
input Incident
|
|
||||||
output bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
input: Incident{},
|
|
||||||
output: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: Incident{Name: "An Argo Tunnel incident"},
|
|
||||||
output: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: Incident{Name: "an argo tunnel incident"},
|
|
||||||
output: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: Incident{Name: "an aRgO TuNnEl incident"},
|
|
||||||
output: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: Incident{Name: "an argotunnel incident"},
|
|
||||||
output: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: Incident{Name: "irrelevant"},
|
|
||||||
output: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: Incident{
|
|
||||||
Name: "irrelevant",
|
|
||||||
Updates: []IncidentUpdate{
|
|
||||||
IncidentUpdate{Body: "irrelevant"},
|
|
||||||
IncidentUpdate{Body: "an Argo Tunnel incident"},
|
|
||||||
IncidentUpdate{Body: "irrelevant"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
output: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: Incident{
|
|
||||||
Name: "an Argo Tunnel incident",
|
|
||||||
Updates: []IncidentUpdate{
|
|
||||||
IncidentUpdate{Body: "irrelevant"},
|
|
||||||
IncidentUpdate{Body: "irrelevant"},
|
|
||||||
IncidentUpdate{Body: "irrelevant"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
output: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, testCase := range testCases {
|
|
||||||
actual := isArgoTunnelIncident(testCase.input)
|
|
||||||
assert.Equal(t, testCase.output, actual, "Test case failed: %v", testCase.input)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestIncidentURL(t *testing.T) {
|
|
||||||
incident := Incident{
|
|
||||||
ID: "s6k0dnn5347b",
|
|
||||||
}
|
|
||||||
assert.Equal(t, "https://www.cloudflarestatus.com/incidents/s6k0dnn5347b", incident.URL())
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNewCachedIncidentLookup(t *testing.T) {
|
|
||||||
c := newCachedIncidentLookup(func() []Incident { return nil })
|
|
||||||
assert.Equal(t, time.Minute, c.ttl)
|
|
||||||
assert.Equal(t, 1, c.cache.Capacity())
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCachedIncidentLookup(t *testing.T) {
|
|
||||||
expected := []Incident{
|
|
||||||
Incident{
|
|
||||||
Name: "An incident",
|
|
||||||
ID: "incidentID",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var shouldCallUncachedLookup bool
|
|
||||||
c := &cachedIncidentLookup{
|
|
||||||
cache: lrucache.NewLRUCache(1),
|
|
||||||
ttl: 50 * time.Millisecond,
|
|
||||||
uncachedLookup: func() []Incident {
|
|
||||||
if !shouldCallUncachedLookup {
|
|
||||||
t.Fatal("uncachedLookup shouldn't have been called")
|
|
||||||
}
|
|
||||||
return expected
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
shouldCallUncachedLookup = true
|
|
||||||
assert.Equal(t, expected, c.ActiveIncidents())
|
|
||||||
|
|
||||||
shouldCallUncachedLookup = false
|
|
||||||
assert.Equal(t, expected, c.ActiveIncidents())
|
|
||||||
assert.Equal(t, expected, c.ActiveIncidents())
|
|
||||||
|
|
||||||
time.Sleep(50 * time.Millisecond)
|
|
||||||
shouldCallUncachedLookup = true
|
|
||||||
assert.Equal(t, expected, c.ActiveIncidents())
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCachedIncidentLookupDoesntPanic(t *testing.T) {
|
|
||||||
expected := []Incident{
|
|
||||||
Incident{
|
|
||||||
Name: "An incident",
|
|
||||||
ID: "incidentID",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
c := &cachedIncidentLookup{
|
|
||||||
cache: lrucache.NewLRUCache(1),
|
|
||||||
ttl: 50 * time.Millisecond,
|
|
||||||
uncachedLookup: func() []Incident { return expected },
|
|
||||||
}
|
|
||||||
c.cache.Set(cacheKey, 42, time.Now().Add(30*time.Minute))
|
|
||||||
actual := c.ActiveIncidents()
|
|
||||||
assert.Equal(t, expected, actual)
|
|
||||||
}
|
|
|
@ -1,100 +1,37 @@
|
||||||
package supervisor
|
package supervisor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"encoding/json"
|
"fmt"
|
||||||
"net/http"
|
|
||||||
"sync"
|
"github.com/cloudflare/cloudflared/features"
|
||||||
)
|
)
|
||||||
|
|
||||||
// When experimental post-quantum tunnels are enabled, and we're hitting an
|
// When experimental post-quantum tunnels are enabled, and we're hitting an
|
||||||
// issue creating the tunnel, we'll report the first error
|
// issue creating the tunnel, we'll report the first error
|
||||||
// to https://pqtunnels.cloudflareresearch.com.
|
// to https://pqtunnels.cloudflareresearch.com.
|
||||||
|
|
||||||
var (
|
const (
|
||||||
PQKexes = [...]tls.CurveID{
|
PQKex = tls.CurveID(0xfe31) // X25519Kyber768Draft00
|
||||||
tls.CurveID(0xfe30), // X25519Kyber512Draft00
|
PQKexName = "X25519Kyber768Draft00"
|
||||||
tls.CurveID(0xfe31), // X25519Kyber768Draft00
|
|
||||||
}
|
|
||||||
PQKexNames map[tls.CurveID]string = map[tls.CurveID]string{
|
|
||||||
tls.CurveID(0xfe30): "X25519Kyber512Draft00",
|
|
||||||
tls.CurveID(0xfe31): "X25519Kyber768Draft00",
|
|
||||||
}
|
|
||||||
|
|
||||||
pqtMux sync.Mutex // protects pqtSubmitted and pqtWaitForMessage
|
|
||||||
pqtSubmitted bool // whether an error has already been submitted
|
|
||||||
|
|
||||||
// Number of errors to ignore before printing elaborate instructions.
|
|
||||||
pqtWaitForMessage int
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func handlePQTunnelError(rep error, config *TunnelConfig) {
|
func curvePreference(pqMode features.PostQuantumMode, currentCurve []tls.CurveID) ([]tls.CurveID, error) {
|
||||||
needToMessage := false
|
switch pqMode {
|
||||||
|
case features.PostQuantumStrict:
|
||||||
pqtMux.Lock()
|
// If the user passes the -post-quantum flag, we override
|
||||||
needToSubmit := !pqtSubmitted
|
// CurvePreferences to only support hybrid post-quantum key agreements.
|
||||||
if needToSubmit {
|
return []tls.CurveID{PQKex}, nil
|
||||||
pqtSubmitted = true
|
case features.PostQuantumPrefer:
|
||||||
}
|
if len(currentCurve) == 0 {
|
||||||
pqtWaitForMessage--
|
return []tls.CurveID{PQKex}, nil
|
||||||
if pqtWaitForMessage < 0 {
|
|
||||||
pqtWaitForMessage = 5
|
|
||||||
needToMessage = true
|
|
||||||
}
|
|
||||||
pqtMux.Unlock()
|
|
||||||
|
|
||||||
if needToMessage {
|
|
||||||
config.Log.Info().Msgf(
|
|
||||||
"\n\n" +
|
|
||||||
"===================================================================================\n" +
|
|
||||||
"You are hitting an error while using the experimental post-quantum tunnels feature.\n" +
|
|
||||||
"\n" +
|
|
||||||
"Please check:\n" +
|
|
||||||
"\n" +
|
|
||||||
" https://pqtunnels.cloudflareresearch.com\n" +
|
|
||||||
"\n" +
|
|
||||||
"for known problems.\n" +
|
|
||||||
"===================================================================================\n\n",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if needToSubmit {
|
if currentCurve[0] != PQKex {
|
||||||
go submitPQTunnelError(rep, config)
|
return append([]tls.CurveID{PQKex}, currentCurve...), nil
|
||||||
|
}
|
||||||
|
return currentCurve, nil
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("Unexpected post quantum mode")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func submitPQTunnelError(rep error, config *TunnelConfig) {
|
|
||||||
body, err := json.Marshal(struct {
|
|
||||||
Group int `json:"g"`
|
|
||||||
Message string `json:"m"`
|
|
||||||
Version string `json:"v"`
|
|
||||||
}{
|
|
||||||
Group: int(PQKexes[config.PQKexIdx]),
|
|
||||||
Message: rep.Error(),
|
|
||||||
Version: config.ReportedVersion,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
config.Log.Err(err).Msg("Failed to create error report")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := http.Post(
|
|
||||||
"https://pqtunnels.cloudflareresearch.com",
|
|
||||||
"application/json",
|
|
||||||
bytes.NewBuffer(body),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
config.Log.Err(err).Msg(
|
|
||||||
"Failed to submit post-quantum tunnel error report",
|
|
||||||
)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if resp.StatusCode != 200 {
|
|
||||||
config.Log.Error().Msgf(
|
|
||||||
"Failed to submit post-quantum tunnel error report: status %d",
|
|
||||||
resp.StatusCode,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
resp.Body.Close()
|
|
||||||
}
|
|
||||||
|
|
|
@ -47,7 +47,6 @@ type TunnelConfig struct {
|
||||||
EdgeIPVersion allregions.ConfigIPVersion
|
EdgeIPVersion allregions.ConfigIPVersion
|
||||||
EdgeBindAddr net.IP
|
EdgeBindAddr net.IP
|
||||||
HAConnections int
|
HAConnections int
|
||||||
IncidentLookup IncidentLookup
|
|
||||||
IsAutoupdated bool
|
IsAutoupdated bool
|
||||||
LBPool string
|
LBPool string
|
||||||
Tags []tunnelpogs.Tag
|
Tags []tunnelpogs.Tag
|
||||||
|
@ -61,9 +60,6 @@ type TunnelConfig struct {
|
||||||
|
|
||||||
NeedPQ bool
|
NeedPQ bool
|
||||||
|
|
||||||
// Index into PQKexes of post-quantum kex to use if NeedPQ is set.
|
|
||||||
PQKexIdx int
|
|
||||||
|
|
||||||
NamedTunnel *connection.NamedTunnelProperties
|
NamedTunnel *connection.NamedTunnelProperties
|
||||||
ProtocolSelector connection.ProtocolSelector
|
ProtocolSelector connection.ProtocolSelector
|
||||||
EdgeTLSConfigs map[connection.Protocol]*tls.Config
|
EdgeTLSConfigs map[connection.Protocol]*tls.Config
|
||||||
|
@ -72,6 +68,8 @@ type TunnelConfig struct {
|
||||||
UDPUnregisterSessionTimeout time.Duration
|
UDPUnregisterSessionTimeout time.Duration
|
||||||
|
|
||||||
DisableQUICPathMTUDiscovery bool
|
DisableQUICPathMTUDiscovery bool
|
||||||
|
|
||||||
|
FeatureSelector *features.FeatureSelector
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *TunnelConfig) registrationOptions(connectionID uint8, OriginLocalIP string, uuid uuid.UUID) *tunnelpogs.RegistrationOptions {
|
func (c *TunnelConfig) registrationOptions(connectionID uint8, OriginLocalIP string, uuid uuid.UUID) *tunnelpogs.RegistrationOptions {
|
||||||
|
@ -354,7 +352,7 @@ func selectNextProtocol(
|
||||||
"Cloudflare Network with `quic` protocol, then most likely your machine/network is getting its egress " +
|
"Cloudflare Network with `quic` protocol, then most likely your machine/network is getting its egress " +
|
||||||
"UDP to port 7844 (or others) blocked or dropped. Make sure to allow egress connectivity as per " +
|
"UDP to port 7844 (or others) blocked or dropped. Make sure to allow egress connectivity as per " +
|
||||||
"https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/ports-and-ips/\n" +
|
"https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/ports-and-ips/\n" +
|
||||||
"If you are using private routing to this Tunnel, then UDP (and Private DNS Resolution) will not work " +
|
"If you are using private routing to this Tunnel, then ICMP, UDP (and Private DNS Resolution) will not work " +
|
||||||
"unless your cloudflared can connect with Cloudflare Network with `quic`.")
|
"unless your cloudflared can connect with Cloudflare Network with `quic`.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -437,9 +435,6 @@ func (e *EdgeTunnelServer) serveTunnel(
|
||||||
connLog.ConnAwareLogger().Err(err).Msg("Register tunnel error from server side")
|
connLog.ConnAwareLogger().Err(err).Msg("Register tunnel error from server side")
|
||||||
// Don't send registration error return from server to Sentry. They are
|
// Don't send registration error return from server to Sentry. They are
|
||||||
// logged on server side
|
// logged on server side
|
||||||
if incidents := e.config.IncidentLookup.ActiveIncidents(); len(incidents) > 0 {
|
|
||||||
connLog.ConnAwareLogger().Msg(activeIncidentsMsg(incidents))
|
|
||||||
}
|
|
||||||
return err.Cause, !err.Permanent
|
return err.Cause, !err.Permanent
|
||||||
case *connection.EdgeQuicDialError:
|
case *connection.EdgeQuicDialError:
|
||||||
return err, false
|
return err, false
|
||||||
|
@ -539,7 +534,8 @@ func (e *EdgeTunnelServer) serveHTTP2(
|
||||||
controlStreamHandler connection.ControlStreamHandler,
|
controlStreamHandler connection.ControlStreamHandler,
|
||||||
connIndex uint8,
|
connIndex uint8,
|
||||||
) error {
|
) error {
|
||||||
if e.config.NeedPQ {
|
pqMode := e.config.FeatureSelector.PostQuantumMode()
|
||||||
|
if pqMode == features.PostQuantumStrict {
|
||||||
return unrecoverableError{errors.New("HTTP/2 transport does not support post-quantum")}
|
return unrecoverableError{errors.New("HTTP/2 transport does not support post-quantum")}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -582,21 +578,18 @@ func (e *EdgeTunnelServer) serveQUIC(
|
||||||
) (err error, recoverable bool) {
|
) (err error, recoverable bool) {
|
||||||
tlsConfig := e.config.EdgeTLSConfigs[connection.QUIC]
|
tlsConfig := e.config.EdgeTLSConfigs[connection.QUIC]
|
||||||
|
|
||||||
if e.config.NeedPQ {
|
pqMode := e.config.FeatureSelector.PostQuantumMode()
|
||||||
// If the user passes the -post-quantum flag, we override
|
if pqMode == features.PostQuantumStrict || pqMode == features.PostQuantumPrefer {
|
||||||
// CurvePreferences to only support hybrid post-quantum key agreements.
|
connOptions.Client.Features = features.Dedup(append(connOptions.Client.Features, features.FeaturePostQuantum))
|
||||||
cs := make([]tls.CurveID, len(PQKexes))
|
|
||||||
copy(cs, PQKexes[:])
|
|
||||||
|
|
||||||
// It is unclear whether Kyber512 or Kyber768 will become the standard.
|
|
||||||
// Kyber768 is a bit bigger (and doesn't fit in one initial
|
|
||||||
// datagram anymore). We're enabling both, but pick randomly which
|
|
||||||
// one to put first. (TLS will use the first one in the list
|
|
||||||
// and allows a fallback to the second.)
|
|
||||||
cs[0], cs[e.config.PQKexIdx] = cs[e.config.PQKexIdx], cs[0]
|
|
||||||
tlsConfig.CurvePreferences = cs
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
curvePref, err := curvePreference(pqMode, tlsConfig.CurvePreferences)
|
||||||
|
if err != nil {
|
||||||
|
return err, true
|
||||||
|
}
|
||||||
|
|
||||||
|
tlsConfig.CurvePreferences = curvePref
|
||||||
|
|
||||||
quicConfig := &quic.Config{
|
quicConfig := &quic.Config{
|
||||||
HandshakeIdleTimeout: quicpogs.HandshakeIdleTimeout,
|
HandshakeIdleTimeout: quicpogs.HandshakeIdleTimeout,
|
||||||
MaxIdleTimeout: quicpogs.MaxIdleTimeout,
|
MaxIdleTimeout: quicpogs.MaxIdleTimeout,
|
||||||
|
@ -604,7 +597,6 @@ func (e *EdgeTunnelServer) serveQUIC(
|
||||||
MaxIncomingStreams: quicpogs.MaxIncomingStreams,
|
MaxIncomingStreams: quicpogs.MaxIncomingStreams,
|
||||||
MaxIncomingUniStreams: quicpogs.MaxIncomingStreams,
|
MaxIncomingUniStreams: quicpogs.MaxIncomingStreams,
|
||||||
EnableDatagrams: true,
|
EnableDatagrams: true,
|
||||||
MaxDatagramFrameSize: quicpogs.MaxDatagramFrameSize,
|
|
||||||
Tracer: quicpogs.NewClientTracer(connLogger.Logger(), connIndex),
|
Tracer: quicpogs.NewClientTracer(connLogger.Logger(), connIndex),
|
||||||
DisablePathMTUDiscovery: e.config.DisableQUICPathMTUDiscovery,
|
DisablePathMTUDiscovery: e.config.DisableQUICPathMTUDiscovery,
|
||||||
}
|
}
|
||||||
|
@ -624,10 +616,6 @@ func (e *EdgeTunnelServer) serveQUIC(
|
||||||
e.config.UDPUnregisterSessionTimeout,
|
e.config.UDPUnregisterSessionTimeout,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if e.config.NeedPQ {
|
|
||||||
handlePQTunnelError(err, e.config)
|
|
||||||
}
|
|
||||||
|
|
||||||
connLogger.ConnAwareLogger().Err(err).Msgf("Failed to create new quic connection")
|
connLogger.ConnAwareLogger().Err(err).Msgf("Failed to create new quic connection")
|
||||||
return err, true
|
return err, true
|
||||||
}
|
}
|
||||||
|
@ -678,16 +666,3 @@ func (cf *connectedFuse) Connected() {
|
||||||
func (cf *connectedFuse) IsConnected() bool {
|
func (cf *connectedFuse) IsConnected() bool {
|
||||||
return cf.fuse.Value()
|
return cf.fuse.Value()
|
||||||
}
|
}
|
||||||
|
|
||||||
func activeIncidentsMsg(incidents []Incident) string {
|
|
||||||
preamble := "There is an active Cloudflare incident that may be related:"
|
|
||||||
if len(incidents) > 1 {
|
|
||||||
preamble = "There are active Cloudflare incidents that may be related:"
|
|
||||||
}
|
|
||||||
incidentStrings := []string{}
|
|
||||||
for _, incident := range incidents {
|
|
||||||
incidentString := fmt.Sprintf("%s (%s)", incident.Name, incident.URL())
|
|
||||||
incidentStrings = append(incidentStrings, incidentString)
|
|
||||||
}
|
|
||||||
return preamble + " " + strings.Join(incidentStrings, "; ")
|
|
||||||
}
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue