Skip to content

Commit

Permalink
CP-24501: add cloudzero-agent-inpector
Browse files Browse the repository at this point in the history
  • Loading branch information
evan-cz committed Jan 3, 2025
1 parent 86d5076 commit f4631f5
Show file tree
Hide file tree
Showing 17 changed files with 881 additions and 17 deletions.
40 changes: 35 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ REVISION ?= $(shell git rev-parse HEAD)
TAG ?= dev-$(REVISION)

# Directories
OUTPUT_BIN_DIR ?= bin
# Colors
ERROR_COLOR = \033[1;31m
INFO_COLOR = \033[1;32m
Expand All @@ -35,15 +36,31 @@ lint: ## Run the linter
vet: ## Run go vet against code
@go vet ./...

.PHONY: build
build: ## Build the binary
.PHONY: build-validator
build-validator:
@mkdir -p bin
@CGO_ENABLED=0 go build \
-mod=readonly \
-trimpath \
-ldflags="-s -w -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Time=${BUILD_TIME} -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Rev=${REVISION} -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Tag=${TAG}" \
${GO_BUILD_FLAGS} \
-o ${OUTPUT_BIN_DIR}/cloudzero-agent-validator \
./cmd/cloudzero-agent-validator/

.PHONY: build-inspector
build-inspector:
@mkdir -p bin
@CGO_ENABLED=0 go build \
-mod=readonly \
-trimpath \
-ldflags="-s -w -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Time=${BUILD_TIME} -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Rev=${REVISION} -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Tag=${TAG}" \
-o bin/cloudzero-agent-validator \
cmd/cloudzero-agent-validator/main.go
${GO_BUILD_FLAGS} \
-o ${OUTPUT_BIN_DIR}/cloudzero-agent-inspector \
./cmd/cloudzero-agent-inspector/

.PHONY: build
build: ## Build the binaries
build: build-validator build-inspector

.PHONY: clean
clean: ## Clean the binary
Expand All @@ -58,7 +75,7 @@ login: ## Docker login to GHCR
@echo $(GHCR_PAT) | $(CONTAINER_TOOL) login ghcr.io -u $(GHCR_USER) --password-stdin

.PHONY: package
package: ## Builds the Docker image
package: ## Builds and pushes the Docker image
ifeq ($(BUILDX_CONTAINER_EXISTS), 0)
@$(CONTAINER_TOOL) buildx create --name container --driver=docker-container --use
endif
Expand All @@ -70,6 +87,19 @@ endif
--build-arg BUILD_TIME=$(BUILD_TIME) \
--push -t $(IMAGE_NAME):$(TAG) -f docker/Dockerfile .

.PHONY: package-build
package-build: ## Builds the Docker image
ifeq ($(BUILDX_CONTAINER_EXISTS), 0)
@$(CONTAINER_TOOL) buildx create --name container --driver=docker-container --use
endif
@$(CONTAINER_TOOL) buildx build \
--builder=container \
--platform linux/amd64,linux/arm64 \
--build-arg REVISION=$(REVISION) \
--build-arg TAG=$(TAG) \
--build-arg BUILD_TIME=$(BUILD_TIME) \
--load -t $(IMAGE_NAME):$(TAG) -f docker/Dockerfile .

.PHONY: generate
generate: ## Generate the status protobuf definition package
$(MAKE) -C $(CURDIR)/pkg/status generate
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ The `Cloud Agent Validator` is a CLI utility designed to perform various validat

This utility provides valuable information such as the `lifecycle stage`, enabling CloudZero to proactively engage with customers if an agent is experiencing issues reporting metrics. It also captures the versions of the chart and Prometheus agent, facilitating issue reproduction. Additionally, it reports check status results and error messages for failing checks, allowing Customer Success teams to quickly identify the root cause of any problems.

This repository also contains another tool, `cloudzero-agent-inspector`. Its primary purpose is to help diagnose errors and misconfigurations, and present them in a user-friendly and actionable way.

## ⚡ Getting Started

The easiest way to get started it by using the [cloudzero-agent helm chart](https://github.com/Cloudzero/cloudzero-charts). However if you'd like run the validator locally - this is also possible!
Expand Down
11 changes: 11 additions & 0 deletions cmd/cloudzero-agent-inspector/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# CloudZero Agent Inspector

The CloudZero Agent Inspector is a tool that helps you diagnose errors and misconfigurations in your CloudZero Agent configuration.

## Usage

The easiest way to use the CloudZero Agent Inspector is to use the [CloudZero Agent Helm chart](https://github.com/Cloudzero/cloudzero-charts/tree/develop/charts/cloudzero-agent).

However, you can also run the CloudZero Agent Inspector directly from the binary. By default, it will listen on port 9376 and forward all requests to `https://api.cloudzero.com`, though this can be overridden by command line arguments.

To run the CloudZero Agent Inspector, simply run the executable. Any requests made to the inspector will then be forwarded to the CloudZero API. If the inspector detects errors it will log a description of the error to the console. For common errors, such as an invalid API key, the inspector will include a human-friendly description of the problem.
53 changes: 53 additions & 0 deletions cmd/cloudzero-agent-inspector/cmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package main

import (
"fmt"
"runtime"

"github.com/cloudzero/cloudzero-agent-validator/pkg/build"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
)

var cliServerConfig = serverConfig{
listenPort: 9376,
destinationURL: "https://api.cloudzero.com",
logLevel: zerolog.InfoLevel,
}

type zerologLevel struct{}

func (l *zerologLevel) Set(value string) error {
level, err := zerolog.ParseLevel(value)
if err != nil {
return err
}
cliServerConfig.logLevel = level
return nil
}

func (l *zerologLevel) Type() string {
return "level"
}

func (l *zerologLevel) String() string {
return cliServerConfig.logLevel.String()
}

var cliParamLogLevel = zerologLevel{}

var rootCmd = &cobra.Command{
Use: "cloudzero-agent-inspector",
Short: "A proxy server for CloudZero API requests",
Long: `cloudzero-agent-inspector acts as a proxy server for CloudZero API requests, allowing inspection and debugging of API traffic.`,
RunE: func(cmd *cobra.Command, args []string) error {

Check failure on line 43 in cmd/cloudzero-agent-inspector/cmd.go

View workflow job for this annotation

GitHub Actions / lint

unused-parameter: parameter 'cmd' seems to be unused, consider removing or renaming it as _ (revive)

Check failure on line 43 in cmd/cloudzero-agent-inspector/cmd.go

View workflow job for this annotation

GitHub Actions / lint

unused-parameter: parameter 'args' seems to be unused, consider removing or renaming it as _ (revive)
return runServer(&cliServerConfig)
},
Version: fmt.Sprintf("%s.%s/%s-%s", build.Rev, build.Tag, runtime.GOOS, runtime.GOARCH),
}

func init() {
rootCmd.PersistentFlags().Uint16VarP(&cliServerConfig.listenPort, "port", "p", 9376, "Port to listen on")
rootCmd.PersistentFlags().StringVarP(&cliServerConfig.destinationURL, "destination", "d", "https://api.cloudzero.com", "Destination URL to proxy requests to")
rootCmd.PersistentFlags().VarP(&cliParamLogLevel, "log-level", "l", "Log level (panic, fatal, error, warn, info, debug, trace)")
}
76 changes: 76 additions & 0 deletions cmd/cloudzero-agent-inspector/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package main

import (
"context"
"fmt"
"net/http"
"net/http/httputil"
"net/url"
"os"

"github.com/cloudzero/cloudzero-agent-validator/pkg/inspector"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)

type serverConfig struct {
destinationURL string
listenPort uint16
logLevel zerolog.Level
}

func runServer(cfg *serverConfig) error {
logger := log.Output(zerolog.ConsoleWriter{Out: os.Stdout}).Level(cfg.logLevel)

targetURL, err := url.Parse(cfg.destinationURL)
if err != nil {
logger.Error().Err(err).Msg("failed to parse target URL")
os.Exit(1)
}

czInspector := inspector.New()

proxy := &httputil.ReverseProxy{
Rewrite: func(pr *httputil.ProxyRequest) {
logger.Debug().
Str("method", pr.In.Method).
Str("destination", fmt.Sprintf("%s://%s/%s", targetURL.Scheme, targetURL.Host, pr.Out.URL.Path)).
Int64("length", int64(pr.In.ContentLength)).
Msg("rewrite request")

pr.SetURL(targetURL)
pr.Out.Host = targetURL.Host
},
ModifyResponse: func(resp *http.Response) error {
return czInspector.Inspect(context.Background(), resp, logger)
},
ErrorHandler: func(w http.ResponseWriter, r *http.Request, err error) {

Check failure on line 47 in cmd/cloudzero-agent-inspector/main.go

View workflow job for this annotation

GitHub Actions / lint

unused-parameter: parameter 'r' seems to be unused, consider removing or renaming it as _ (revive)
logger.Error().Err(err).Msg("proxy error")
w.WriteHeader(http.StatusBadGateway)
},
}

server := &http.Server{

Check failure on line 53 in cmd/cloudzero-agent-inspector/main.go

View workflow job for this annotation

GitHub Actions / lint

G112: Potential Slowloris Attack because ReadHeaderTimeout is not configured in the http.Server (gosec)
Addr: fmt.Sprintf(":%d", cfg.listenPort),
Handler: proxy,
}

logger.Info().
Str("log-level", cfg.logLevel.String()).
Str("addr", server.Addr).
Str("target", targetURL.String()).
Msg("starting inspector server")

if err := server.ListenAndServe(); err != nil {
return fmt.Errorf("failed run server: %w", err)
}

return nil
}

func main() {
if err := rootCmd.Execute(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
15 changes: 4 additions & 11 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,8 @@ COPY . .
ARG REVISION=unknown
ARG TAG=unknown
ARG BUILD_TIME=unknown
# LD_FLAGS="-s -w -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Time=${BUILD_TIME} -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Rev=${REVISION} -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Tag=${TAG}"
# CGO_ENABLED=0 go build -mod=readonly -trimpath -ldflags="${LD_FLAGS}" -tags 'netgo osusergo' -o cloudzero-agent-validator
# Build the Go binary
RUN CGO_ENABLED=0 go build \
-mod=readonly \
-trimpath \
-ldflags="-s -w -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Time=${BUILD_TIME} -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Rev=${REVISION} -X github.com/cloudzero/cloudzero-agent-validator/pkg/build.Tag=${TAG}" \
-tags 'netgo osusergo' \
-o /go/bin/cloudzero-agent-validator \
cmd/cloudzero-agent-validator/main.go
RUN make build GO_BUILD_FLAGS="-tags 'netgo osusergo'" OUTPUT_BIN_DIR=/go/bin BUILD_TIME=${BUILD_TIME} REVISION=${REVISION} TAG=${TAG}
RUN ls -rR /go/bin

# Stage 2: Access current certs
FROM gcr.io/distroless/static-debian11:debug@sha256:a0a404776dec98be120089ae42bbdfbe48c177921d856937d124d48eb8c0b951 AS certs
Expand Down Expand Up @@ -60,8 +52,9 @@ VOLUME [ "/app/config" ]
ENV PATH=/app:$PATH

# Copy the Go binary from the builder stage
COPY --from=builder /go/bin/cloudzero-agent-inspector /app/cloudzero-agent-inspector
COPY --from=builder /go/bin/cloudzero-agent-validator /app/cloudzero-agent-validator

# Allow the default ENTRYPOINT from busybox to be the default,
# however run the app as the default command
CMD ["/app/cloudzero-agent-validator", "-h"]
CMD ["/app/cloudzero-agent-validator", "-h"]
9 changes: 8 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@ go 1.23.0
toolchain go1.23.4

require (
github.com/google/go-cmp v0.6.0
github.com/ilyakaznacheev/cleanenv v1.5.0
github.com/itchyny/gojq v0.12.17
github.com/pkg/errors v0.9.1
github.com/rs/zerolog v1.33.0
github.com/sirupsen/logrus v1.9.3
github.com/spf13/cobra v1.8.1
github.com/stretchr/testify v1.10.0
github.com/urfave/cli/v2 v2.27.5
google.golang.org/protobuf v1.36.1
Expand All @@ -29,13 +33,16 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/gnostic-models v0.6.8 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/itchyny/timefmt-go v0.1.6 // indirect
github.com/joho/godotenv v1.5.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
Expand Down
23 changes: 23 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand All @@ -21,6 +23,7 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
Expand All @@ -39,6 +42,12 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/ilyakaznacheev/cleanenv v1.5.0 h1:0VNZXggJE2OYdXE87bfSSwGxeiGt9moSR2lOrsHHvr4=
github.com/ilyakaznacheev/cleanenv v1.5.0/go.mod h1:a5aDzaJrLCQZsazHol1w8InnDcOX0OColm64SlIi6gk=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/itchyny/gojq v0.12.17 h1:8av8eGduDb5+rvEdaOO+zQUjA04MS0m3Ps8HiD+fceg=
github.com/itchyny/gojq v0.12.17/go.mod h1:WBrEMkgAfAGO1LUcGOckBl5O726KPp+OlkKug0I/FEY=
github.com/itchyny/timefmt-go v0.1.6 h1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q=
github.com/itchyny/timefmt-go v0.1.6/go.mod h1:RRDZYC5s9ErkjQvTvvU7keJjxUYzIISJGxm9/mAERQg=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
Expand All @@ -53,6 +62,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/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-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
Expand All @@ -71,10 +86,15 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
Expand Down Expand Up @@ -110,6 +130,9 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
Expand Down
Loading

0 comments on commit f4631f5

Please sign in to comment.