From e5d92065a0dadb39803df5f6b6c9d15398a32611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christopher=20Larivi=C3=A8re?= Date: Thu, 21 Nov 2024 08:24:28 -0500 Subject: [PATCH] add profile, sso support and update dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christopher Larivière --- Dockerfile | 12 +++++--- README.md | 32 ++++++++++++++++++-- aws-es-proxy.go | 80 +++++++++++++++++++++++-------------------------- go.mod | 20 +++++++++++-- go.sum | 56 +++++++++++++++++----------------- 5 files changed, 121 insertions(+), 79 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9be23914..f7d88b8b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,15 @@ -FROM golang:1.20-alpine +FROM golang:1.23-alpine WORKDIR /go/src/github.com/abutaha/aws-es-proxy COPY . . -RUN CGO_ENABLED=0 GOOS=linux go build -o aws-es-proxy +ENV CGO_ENABLED=0 \ + GOOS=linux -FROM alpine:3.17 +RUN go mod download +RUN go build -o aws-es-proxy + +FROM alpine:3.20 LABEL name="aws-es-proxy" \ version="latest" @@ -13,7 +17,7 @@ RUN apk --no-cache add ca-certificates WORKDIR /home/ COPY --from=0 /go/src/github.com/abutaha/aws-es-proxy/aws-es-proxy /usr/local/bin/ -ENV PORT_NUM 9200 +ENV PORT_NUM=9200 EXPOSE ${PORT_NUM} ENTRYPOINT ["aws-es-proxy"] diff --git a/README.md b/README.md index 8e09bf53..18d3eebf 100644 --- a/README.md +++ b/README.md @@ -40,10 +40,10 @@ brew install aws-es-proxy ### Build from Source #### Dependencies: -* go1.14+ +* go1.23+ ```sh -#requires go1.14 +#requires go1.23 go build github.com/abutaha/aws-es-proxy ``` @@ -140,6 +140,8 @@ Usage of ./aws-es-proxy: HTTP Basic Auth Password -pretty Prettify verbose and file output + -profile + Use a shared profile in order to access the ES/OS resource -realm string Authentication Required -remote-terminate @@ -160,3 +162,29 @@ Usage of ./aws-es-proxy: After you run *aws-es-proxy*, you can now open your Web browser on [http://localhost:9200](http://localhost:9200). Everything should be working as you have your own instance of ElasticSearch running on port 9200. To access Kibana, use [http://localhost:9200/_plugin/kibana/app/kibana](http://localhost:9200/_plugin/kibana/app/kibana) + +## Using AWS Profile + +You can use `AWS_PROFILE` environment variable defined directly in AWS Go SDK V2 in order to set which profile to use. + +```text +[default] +sso_start_url=https:///start +sso_region=eu-west-1 +sso_role_name = sso-role +sso_account_id = 1234567890 +region=us-east-1 + +[main] +sso_start_url=https:///start +sso_region=eu-west-1 +sso_role_name = sso-role +sso_account_id = 1234567890 +region=us-east-1 +``` + +Example: + +```bash +./aws-es-proxy -endpoint https://dummy-host.eu-west-1.es.amazonaws.com -profile main +``` \ No newline at end of file diff --git a/aws-es-proxy.go b/aws-es-proxy.go index ae5651cc..5f01d289 100644 --- a/aws-es-proxy.go +++ b/aws-es-proxy.go @@ -2,12 +2,14 @@ package main import ( "bytes" + "context" + "crypto/sha256" "crypto/subtle" + "encoding/hex" "encoding/json" "flag" "fmt" "io" - "io/ioutil" "log" "net/http" "net/http/cookiejar" @@ -20,12 +22,12 @@ import ( "strings" "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/credentials/stscreds" + "github.com/aws/aws-sdk-go-v2/aws" + signer "github.com/aws/aws-sdk-go-v2/aws/signer/v4" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials/stscreds" + "github.com/aws/aws-sdk-go-v2/service/sts" "github.com/aws/aws-sdk-go/aws/endpoints" - "github.com/aws/aws-sdk-go/aws/session" - v4 "github.com/aws/aws-sdk-go/aws/signer/v4" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson/primitive" "golang.org/x/net/publicsuffix" @@ -82,7 +84,7 @@ type proxy struct { nosignreq bool fileRequest *os.File fileResponse *os.File - credentials *credentials.Credentials + credentials aws.CredentialsProvider httpClient *http.Client auth bool username string @@ -90,6 +92,7 @@ type proxy struct { realm string remoteTerminate bool assumeRole string + profile string } func newProxy(args ...interface{}) *proxy { @@ -122,6 +125,7 @@ func newProxy(args ...interface{}) *proxy { realm: args[9].(string), remoteTerminate: args[10].(bool), assumeRole: args[11].(string), + profile: args[12].(string), } } @@ -195,43 +199,34 @@ func (p *proxy) parseEndpoint() error { return nil } -func (p *proxy) getSigner() *v4.Signer { - // Refresh credentials after expiration. Required for STS +func (p *proxy) getSigner() *signer.Signer { if p.credentials == nil { - sess, err := session.NewSession( - &aws.Config{ - Region: aws.String(p.region), - CredentialsChainVerboseErrors: aws.Bool(true), - }, + cfg, err := config.LoadDefaultConfig(context.TODO(), + config.WithRegion(p.region), + config.WithSharedConfigProfile(p.profile), ) if err != nil { - logrus.Debugln(err) + logrus.Errorln(err) } - awsRoleARN := os.Getenv("AWS_ROLE_ARN") - awsWebIdentityTokenFile := os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE") - - var creds *credentials.Credentials - if awsRoleARN != "" && awsWebIdentityTokenFile != "" { - logrus.Infof("Using web identity credentials with role %s", awsRoleARN) - creds = stscreds.NewWebIdentityCredentials(sess, awsRoleARN, "", awsWebIdentityTokenFile) + if awsRoleARN := os.Getenv("AWS_ROLE_ARN"); awsRoleARN != "" { + creds := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), awsRoleARN) + p.credentials = creds } else if p.assumeRole != "" { - logrus.Infof("Assuming credentials from %s", p.assumeRole) - creds = stscreds.NewCredentials(sess, p.assumeRole, func(provider *stscreds.AssumeRoleProvider) { - provider.Duration = 17 * time.Minute - provider.ExpiryWindow = 13 * time.Minute - provider.MaxJitterFrac = 0.1 - }) + creds := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), p.assumeRole) + p.credentials = creds } else { logrus.Infoln("Using default credentials") - creds = sess.Config.Credentials + p.credentials = cfg.Credentials + } + if p.profile != "" { + logrus.Infof("Generated fresh AWS Credentials object with profile %s", p.profile) + } else { + logrus.Infoln("Generated fresh AWS Credentials object") } - - p.credentials = creds - logrus.Infoln("Generated fresh AWS Credentials object") } - return v4.NewSigner(p.credentials) + return signer.NewSigner() } func (p *proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -282,12 +277,10 @@ func (p *proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Make signV4 optional if !p.nosignreq { - // Start AWS session from ENV, Shared Creds or EC2Role signer := p.getSigner() - - // Sign the request with AWSv4 - payload := bytes.NewReader(replaceBody(req)) - _, err := signer.Sign(req, payload, p.service, p.region, time.Now()) + creds, _ := p.credentials.Retrieve(context.Background()) + body := sha256.Sum256(replaceBody(req)) + err := signer.SignHTTP(context.Background(), creds, req, hex.EncodeToString(body[:]), p.service, p.region, time.Now()) if err != nil { p.credentials = nil logrus.Errorln("Failed to sign", err) @@ -372,7 +365,7 @@ func (p *proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Println("Status: ", resp.StatusCode) fmt.Printf("Took: %.3fs\n", requestEnded.Seconds()) fmt.Println("Body: ") - fmt.Println(string(prettyBody.Bytes())) + fmt.Println(prettyBody.String()) } else { log.Printf(" -> %s; %s; %s; %s; %d; %.3fs\n", r.Method, r.RemoteAddr, @@ -398,7 +391,7 @@ func (p *proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { respStruct := &responseStruct{ Requestid: requestID, - Body: string(body.Bytes()), + Body: body.String(), } y, _ := json.Marshal(reqStruct) @@ -448,8 +441,8 @@ func replaceBody(req *http.Request) []byte { if req.Body == nil { return []byte{} } - payload, _ := ioutil.ReadAll(req.Body) - req.Body = ioutil.NopCloser(bytes.NewReader(payload)) + payload, _ := io.ReadAll(req.Body) + req.Body = io.NopCloser(bytes.NewReader(payload)) return payload } @@ -485,6 +478,7 @@ func main() { timeout int remoteTerminate bool assumeRole string + profile string ) flag.StringVar(&endpoint, "endpoint", "", "Amazon ElasticSearch Endpoint (e.g: https://dummy-host.eu-west-1.es.amazonaws.com)") @@ -502,6 +496,7 @@ func main() { flag.StringVar(&realm, "realm", "", "Authentication Required") flag.BoolVar(&remoteTerminate, "remote-terminate", false, "Allow HTTP remote termination") flag.StringVar(&assumeRole, "assume", "", "Optionally specify role to assume") + flag.StringVar(&profile, "profile", "", "Optionally specify profile to use") flag.Parse() if endpoint == "" { @@ -549,6 +544,7 @@ func main() { realm, remoteTerminate, assumeRole, + profile, ) if err = p.parseEndpoint(); err != nil { diff --git a/go.mod b/go.mod index 78cb65e5..5ac4a3b9 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,29 @@ module github.com/abutaha/aws-es-proxy -go 1.20 +go 1.23 + +toolchain go1.23.2 require ( - github.com/aws/aws-sdk-go v1.44.215 + github.com/aws/aws-sdk-go v1.55.5 + github.com/aws/aws-sdk-go-v2 v1.32.5 + github.com/aws/aws-sdk-go-v2/config v1.28.5 + github.com/aws/aws-sdk-go-v2/credentials v1.17.46 + github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 github.com/sirupsen/logrus v1.9.0 go.mongodb.org/mongo-driver v1.11.2 golang.org/x/net v0.8.0 ) require ( - github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 // indirect + github.com/aws/smithy-go v1.22.1 // indirect golang.org/x/sys v0.6.0 // indirect ) diff --git a/go.sum b/go.sum index e57e12d5..a61b1f8d 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,31 @@ -github.com/aws/aws-sdk-go v1.44.215 h1:K3KERfO6MaV349idub2w1u1H0R0KSkED0LshPnaAn3Q= -github.com/aws/aws-sdk-go v1.44.215/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.32.5 h1:U8vdWJuY7ruAkzaOdD7guwJjD06YSKmnKCJs7s3IkIo= +github.com/aws/aws-sdk-go-v2 v1.32.5/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/config v1.28.5 h1:Za41twdCXbuyyWv9LndXxZZv3QhTG1DinqlFsSuvtI0= +github.com/aws/aws-sdk-go-v2/config v1.28.5/go.mod h1:4VsPbHP8JdcdUDmbTVgNL/8w9SqOkM5jyY8ljIxLO3o= +github.com/aws/aws-sdk-go-v2/credentials v1.17.46 h1:AU7RcriIo2lXjUfHFnFKYsLCwgbz1E7Mm95ieIRDNUg= +github.com/aws/aws-sdk-go-v2/credentials v1.17.46/go.mod h1:1FmYyLGL08KQXQ6mcTlifyFXfJVCNJTVGuQP4m0d/UA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 h1:sDSXIrlsFSFJtWKLQS4PUWRvrT580rrnuLydJrCQ/yA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20/go.mod h1:WZ/c+w0ofps+/OUqMwWgnfrgzZH1DZO1RIkktICsqnY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 h1:4usbeaes3yJnCFC7kfeyhkdkPtoRYPa/hTmCqMpKpLI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24/go.mod h1:5CI1JemjVwde8m2WG3cz23qHKPOxbpkq0HaoreEgLIY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 h1:N1zsICrQglfzaBnrfM0Ys00860C+QFwu6u/5+LomP+o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24/go.mod h1:dCn9HbJ8+K31i8IQ8EWmWj0EiIk0+vKiHNMxTTYveAg= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 h1:wtpJ4zcwrSbwhECWQoI/g6WM9zqCcSpHDJIWSbMLOu4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5/go.mod h1:qu/W9HXQbbQ4+1+JcZp0ZNPV31ym537ZJN+fiS7Ti8E= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 h1:3zu537oLmsPfDMyjnUS2g+F2vITgy5pB74tHI+JBNoM= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.6/go.mod h1:WJSZH2ZvepM6t6jwu4w/Z45Eoi75lPN7DcydSRtJg6Y= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 h1:K0OQAsDywb0ltlFrZm0JHPY3yZp/S9OaoLU33S7vPS8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5/go.mod h1:ORITg+fyuMoeiQFiVGoqB3OydVTLkClw/ljbblMq6Cc= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 h1:6SZUVRQNvExYlMLbHdlKB48x0fLbc2iVROyaNEwBHbU= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.1/go.mod h1:GqWyYCwLXnlUB1lOAXQyNSPqPLQJvmo8J0DWBzp9mtg= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= 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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -8,8 +34,6 @@ github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -29,50 +53,26 @@ github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.2 h1:+1v2rDQUWNcGW7/7E0Jvdz51V38XXxJfhzbV17aNHCw= go.mongodb.org/mongo-driver v1.11.2/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=