Skip to content

Commit bd46e16

Browse files
Get acls subcommand (#150)
* bump kafka-go to include acl apis * add acl interfaces and aclinfo type stub * pull latest kafka-go and use kafka-go aclresource type * wip * fix test * fix typos * get acls working * getacls working * upgrade cobra to latest * finish separating get into separate subcommands * remove unneeded variables * wip * pr feedback * Revert "upgrade cobra to latest" This reverts commit 7b8ee42. * use getCliRunnerAndCtx in get acls * more consistent variable names * custom cobra type * bring in new kafka-go * support resource pattern type * add support for acloperationtype and remove options for unknown * improve descriptions * support permissiontype and host filters * add resource name filter and fix permission type formatting * support principal filtering * improve docs * add examples * remove comment * remove TODOs that are complete * remove TODOs that are complete * update README * fix test * wip * fix error handling * error handling for zk * more consistent error msg * clean up createacl * add TestBrokerClientCreateACLReadOnly * improve zk tests * run acl tests in ci * enable acls for kafka 2.4.1 in ci * fix zk tests * skip TestBrokerClientCreateACLReadOnly on old versions of kafka * try to debug * handle nested errors from createacls * operations -> operation * operations -> operation * remove setting log level in test * clean up allowed types in help command * fix merge conflict * fix test * add json annotations * use released version of kafka-go * createacl -> createacls * add minimal repl support * add sleep to stop flaky test failures * remove sleep * capitalize ACls
1 parent a9fbfec commit bd46e16

File tree

17 files changed

+709
-23
lines changed

17 files changed

+709
-23
lines changed

.github/workflows/ci.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ jobs:
139139
env:
140140
KAFKA_TOPICS_TEST_ZK_ADDR: zookeeper:2181
141141
KAFKA_TOPICS_TEST_KAFKA_ADDR: kafka1:9092
142+
KAFKA_TOPICS_TEST_BROKER_ADMIN_SECURITY: 1
142143

143144
services:
144145
zookeeper:
@@ -156,6 +157,8 @@ jobs:
156157
KAFKA_ADVERTISED_HOST_NAME: kafka1
157158
KAFKA_ADVERTISED_PORT: 9092
158159
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
160+
KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
161+
KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: true
159162

160163
kafka2:
161164
image: wurstmeister/kafka:2.12-2.4.1
@@ -167,6 +170,8 @@ jobs:
167170
KAFKA_ADVERTISED_HOST_NAME: kafka2
168171
KAFKA_ADVERTISED_PORT: 9092
169172
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
173+
KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
174+
KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: true
170175

171176
kafka3:
172177
image: wurstmeister/kafka:2.12-2.4.1
@@ -178,6 +183,8 @@ jobs:
178183
KAFKA_ADVERTISED_HOST_NAME: kafka3
179184
KAFKA_ADVERTISED_PORT: 9092
180185
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
186+
KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
187+
KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: true
181188

182189
kafka4:
183190
image: wurstmeister/kafka:2.12-2.4.1
@@ -189,6 +196,8 @@ jobs:
189196
KAFKA_ADVERTISED_HOST_NAME: kafka4
190197
KAFKA_ADVERTISED_PORT: 9092
191198
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
199+
KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
200+
KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: true
192201

193202
kafka5:
194203
image: wurstmeister/kafka:2.12-2.4.1
@@ -200,6 +209,8 @@ jobs:
200209
KAFKA_ADVERTISED_HOST_NAME: kafka5
201210
KAFKA_ADVERTISED_PORT: 9092
202211
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
212+
KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
213+
KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: true
203214

204215
kafka6:
205216
image: wurstmeister/kafka:2.12-2.4.1
@@ -211,7 +222,8 @@ jobs:
211222
KAFKA_ADVERTISED_HOST_NAME: kafka6
212223
KAFKA_ADVERTISED_PORT: 9092
213224
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
214-
225+
KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
226+
KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: true
215227

216228
snyk:
217229
runs-on: ubuntu-latest

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ resource type in the cluster. Currently, the following operations are supported:
175175
| `get partitions [optional: topics]` | Get all partitions for topics |
176176
| `get offsets [topic]` | Number of messages per partition along with start and end times |
177177
| `get topics` | All topics in the cluster |
178+
| `get acls [flags]` | Describe access control levels (ACLs) in the cluster |
178179

179180
#### rebalance
180181

cmd/topicctl/subcmd/get.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"strings"
77

88
"github.com/aws/aws-sdk-go/aws/session"
9+
"github.com/segmentio/kafka-go"
910
"github.com/segmentio/topicctl/pkg/admin"
1011
"github.com/segmentio/topicctl/pkg/cli"
1112
log "github.com/sirupsen/logrus"
@@ -66,6 +67,7 @@ func init() {
6667
partitionsCmd(),
6768
offsetsCmd(),
6869
topicsCmd(),
70+
aclsCmd(),
6971
)
7072
RootCmd.AddCommand(getCmd)
7173
}
@@ -308,3 +310,107 @@ func topicsCmd() *cobra.Command {
308310
},
309311
}
310312
}
313+
314+
type aclsCmdConfig struct {
315+
hostFilter string
316+
operationType admin.ACLOperationType
317+
permissionType admin.ACLPermissionType
318+
principalFilter string
319+
resourceNameFilter string
320+
resourcePatternType admin.PatternType
321+
resourceType admin.ResourceType
322+
}
323+
324+
// aclsConfig defines the default values if a flag is not provided. These all default
325+
// to doing no filtering (e.g. "all" or null)
326+
var aclsConfig = aclsCmdConfig{
327+
hostFilter: "",
328+
operationType: admin.ACLOperationType(kafka.ACLOperationTypeAny),
329+
permissionType: admin.ACLPermissionType(kafka.ACLPermissionTypeAny),
330+
principalFilter: "",
331+
resourceNameFilter: "",
332+
resourceType: admin.ResourceType(kafka.ResourceTypeAny),
333+
resourcePatternType: admin.PatternType(kafka.PatternTypeAny),
334+
}
335+
336+
func aclsCmd() *cobra.Command {
337+
cmd := &cobra.Command{
338+
Use: "acls",
339+
Short: "Displays information for ACLs in the cluster. Supports filtering with flags.",
340+
Args: cobra.NoArgs,
341+
Example: `List all acls
342+
$ topicctl get acls
343+
344+
List read acls for topic my-topic
345+
$ topicctl get acls --resource-type topic --resource-name my-topic --operation read
346+
347+
List acls for user Alice with permission allow
348+
$ topicctl get acls --principal User:alice --permission-type allow
349+
350+
List acls for host 198.51.100.0
351+
$ topicctl get acls --host 198.51.100.0
352+
`,
353+
RunE: func(cmd *cobra.Command, args []string) error {
354+
ctx := context.Background()
355+
sess := session.Must(session.NewSession())
356+
357+
adminClient, err := getConfig.shared.getAdminClient(ctx, sess, true)
358+
if err != nil {
359+
return err
360+
}
361+
defer adminClient.Close()
362+
363+
cliRunner := cli.NewCLIRunner(adminClient, log.Infof, !noSpinner)
364+
365+
filter := kafka.ACLFilter{
366+
ResourceTypeFilter: kafka.ResourceType(aclsConfig.resourceType),
367+
ResourceNameFilter: aclsConfig.resourceNameFilter,
368+
ResourcePatternTypeFilter: kafka.PatternType(aclsConfig.resourcePatternType),
369+
PrincipalFilter: aclsConfig.principalFilter,
370+
HostFilter: aclsConfig.hostFilter,
371+
Operation: kafka.ACLOperationType(aclsConfig.operationType),
372+
PermissionType: kafka.ACLPermissionType(aclsConfig.permissionType),
373+
}
374+
return cliRunner.GetACLs(ctx, filter)
375+
},
376+
}
377+
cmd.Flags().StringVar(
378+
&aclsConfig.hostFilter,
379+
"host",
380+
"",
381+
`The host to filter on. (e.g. 198.51.100.0)`,
382+
)
383+
cmd.Flags().Var(
384+
&aclsConfig.operationType,
385+
"operation",
386+
`The operation that is being allowed or denied to filter on. allowed: [any, all, read, write, create, delete, alter, describe, clusteraction, describeconfigs, alterconfigs, idempotentwrite]`,
387+
)
388+
cmd.Flags().Var(
389+
&aclsConfig.permissionType,
390+
"permission-type",
391+
`The permission type to filter on. allowed: [any, allow, deny]`,
392+
)
393+
cmd.Flags().StringVar(
394+
&aclsConfig.principalFilter,
395+
"principal",
396+
"",
397+
`The principal to filter on in principalType:name format (e.g. User:alice).`,
398+
)
399+
cmd.Flags().StringVar(
400+
&aclsConfig.resourceNameFilter,
401+
"resource-name",
402+
"",
403+
`The resource name to filter on. (e.g. my-topic)`,
404+
)
405+
cmd.Flags().Var(
406+
&aclsConfig.resourcePatternType,
407+
"resource-pattern-type",
408+
`The type of the resource pattern or filter. allowed: [any, match, literal, prefixed]. "any" will match any pattern type (literal or prefixed), but will match the resource name exactly, where as "match" will perform pattern matching to list all acls that affect the supplied resource(s).`,
409+
)
410+
cmd.Flags().Var(
411+
&aclsConfig.resourceType,
412+
"resource-type",
413+
`The type of resource to filter on. allowed: [any, topic, group, cluster, transactionalid, delegationtoken]`,
414+
)
415+
return cmd
416+
}

docker-compose-auth.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ services:
3434
KAFKA_LISTENERS: "PLAINTEXT://:9092,SSL://:9093,SASL_PLAINTEXT://:9094,SASL_SSL://:9095"
3535
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://localhost:9092,SSL://localhost:9093,SASL_PLAINTEXT://localhost:9094,SASL_SSL://localhost:9095"
3636
KAFKA_SASL_ENABLED_MECHANISMS: "PLAIN,SCRAM-SHA-256,SCRAM-SHA-512"
37+
KAFKA_AUTHORIZER_CLASS_NAME: 'kafka.security.auth.SimpleAclAuthorizer'
38+
KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: 'true'
3739
KAFKA_SSL_KEYSTORE_LOCATION: /certs/kafka.keystore.jks
3840
KAFKA_SSL_KEYSTORE_PASSWORD: test123
3941
KAFKA_SSL_KEY_PASSWORD: test123

go.mod

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ require (
1111
github.com/hashicorp/go-multierror v1.1.1
1212
github.com/olekukonko/tablewriter v0.0.5
1313
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da
14-
github.com/segmentio/kafka-go v0.4.35
14+
github.com/segmentio/kafka-go v0.4.43
1515
github.com/segmentio/kafka-go/sasl/aws_msk_iam v0.0.0-20220211180808-78889264d070
1616
github.com/sirupsen/logrus v1.9.0
1717
github.com/spf13/cobra v1.5.0
@@ -25,7 +25,7 @@ require (
2525
github.com/hashicorp/errwrap v1.0.0 // indirect
2626
github.com/inconshreveable/mousetrap v1.0.0 // indirect
2727
github.com/jmespath/go-jmespath v0.4.0 // indirect
28-
github.com/klauspost/compress v1.15.7 // indirect
28+
github.com/klauspost/compress v1.15.9 // indirect
2929
github.com/mattn/go-colorable v0.1.9 // indirect
3030
github.com/mattn/go-isatty v0.0.14 // indirect
3131
github.com/mattn/go-runewidth v0.0.9 // indirect
@@ -37,11 +37,12 @@ require (
3737
github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 // indirect
3838
github.com/pmezard/go-difflib v1.0.0 // indirect
3939
github.com/spf13/pflag v1.0.5 // indirect
40-
github.com/xdg/scram v1.0.5 // indirect
41-
github.com/xdg/stringprep v1.0.3 // indirect
42-
golang.org/x/sys v0.1.0 // indirect
43-
golang.org/x/term v0.1.0 // indirect
44-
golang.org/x/text v0.4.0 // indirect
40+
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
41+
github.com/xdg-go/scram v1.1.2 // indirect
42+
github.com/xdg-go/stringprep v1.0.4 // indirect
43+
golang.org/x/sys v0.5.0 // indirect
44+
golang.org/x/term v0.5.0 // indirect
45+
golang.org/x/text v0.7.0 // indirect
4546
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
4647
gopkg.in/yaml.v2 v2.4.0 // indirect
4748
gopkg.in/yaml.v3 v3.0.1 // indirect

go.sum

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW
3333
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
3434
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
3535
github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
36-
github.com/klauspost/compress v1.15.7 h1:7cgTQxJCU/vy+oP/E3B9RGbQTgbiVzIJWIKOLoAsPok=
37-
github.com/klauspost/compress v1.15.7/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
36+
github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY=
37+
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
3838
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
3939
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
4040
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -74,8 +74,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
7474
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da h1:p3Vo3i64TCLY7gIfzeQaUJ+kppEO5WQG3cL8iE8tGHU=
7575
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
7676
github.com/segmentio/kafka-go v0.4.28/go.mod h1:XzMcoMjSzDGHcIwpWUI7GB43iKZ2fTVmryPSGLf/MPg=
77-
github.com/segmentio/kafka-go v0.4.35 h1:TAsQ7q1SjS39PcFvU0zDJhCuVAxHomy7xOAfbdSuhzs=
78-
github.com/segmentio/kafka-go v0.4.35/go.mod h1:GAjxBQJdQMB5zfNA21AhpaqOB2Mu+w3De4ni3Gbm8y0=
77+
github.com/segmentio/kafka-go v0.4.43 h1:yKVQ/i6BobbX7AWzwkhulsEn47wpLA8eO6H03bCMqYg=
78+
github.com/segmentio/kafka-go v0.4.43/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg=
7979
github.com/segmentio/kafka-go/sasl/aws_msk_iam v0.0.0-20220211180808-78889264d070 h1:ng1Z/x5LLOIrzgWUOtypsCkR+dHTux7slqOCVkuwQBo=
8080
github.com/segmentio/kafka-go/sasl/aws_msk_iam v0.0.0-20220211180808-78889264d070/go.mod h1:IjMUGcOJoATsnlqAProGN1ezXeEgU5GCWr1/EzmkEMA=
8181
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
@@ -93,12 +93,14 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK
9393
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
9494
github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg=
9595
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
96+
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
97+
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
98+
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
99+
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
100+
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
101+
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
96102
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
97-
github.com/xdg/scram v1.0.5 h1:TuS0RFmt5Is5qm9Tm2SoD89OPqe4IRiFtyFY4iwWXsw=
98-
github.com/xdg/scram v1.0.5/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
99103
github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
100-
github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4=
101-
github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
102104
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
103105
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
104106
golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -111,11 +113,10 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
111113
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
112114
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
113115
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
114-
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
115-
golang.org/x/net v0.0.0-20220706163947-c90051bbdb60/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
116116
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
117-
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
118117
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
118+
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
119+
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
119120
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
120121
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
121122
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -135,18 +136,22 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
135136
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
136137
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
137138
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
138-
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
139139
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
140+
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
141+
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
140142
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
141143
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
142-
golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw=
143144
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
145+
golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
146+
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
144147
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
145148
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
146149
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
147150
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
148-
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
151+
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
149152
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
153+
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
154+
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
150155
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
151156
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
152157
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=

0 commit comments

Comments
 (0)