Skip to content

Commit 74717b8

Browse files
authored
feat: support client/server mode (aquasecurity#295)
* chore(app): change dir * feat(rpc): add a proto file and auto-generated files * chore(dep): add dependencies * fix(app): fix import path * fix(integration): fix import path * fix(protoc): use enum for severity * chore(Makefile): add fmt andd protoc * chore(clang): add .clang-format * refactor: split functions for client/server (aquasecurity#296) * refactor(db): split db.Download * refactor(standalone): create a different package * refactor(vulnerability): split FillAndFilter * fix(protoc): use enum for severity * chore(Makefile): add fmt andd protoc * chore(clang): add .clang-format * fix(db): remove an unused variable * fix(db): expose the github client as an argument of constructor * refactor(vulnerability): add the detail message * feat(rpc): add rpc client (aquasecurity#302) * fix(protoc): use enum for severity * chore(Makefile): add fmt andd protoc * chore(clang): add .clang-format * feat(rpc): convert types * feat(rpc): add rpc client * token: Refactor to handle bad headers being set Signed-off-by: Simarpreet Singh <[email protected]> * feat(rpc): add rpc server (aquasecurity#303) * feat(rpc): add rpc server * feat(utils): add CopyFile * feat(server/config): add config struct * feat(detector): add detector * feat(scanner): delegate procedures to detector * fix(scanner): fix the interface * test(mock): add mocks * test(rpc/server): add tests * test(rpc/ospkg/server): add tests * tets(os/detector): add tests * refactor(library): move directories * chore(dependency): add google/wire * refactor(library): introduce google/wire * refactor(ospkg/detector): move directory * feat(rpc): add eosl * refactor(ospkg): introduce google/wire * refactor(wire): bind an interface * refactor(client): use wire.Struct * chore(Makefile): fix wire * test(server): add AssertExpectations * test(server): add AssertExpectations * refactor(server): remove debug log * refactor(error): add more context messages * test(server): fix error message * refactor(test): create a constructor of mock * refactor(config): remove an unused variable * test(config): add an assertion to test the config struct * feat(client/server): add sub commands (aquasecurity#304) * feat(rpc): add rpc server * feat(utils): add CopyFile * feat(server/config): add config struct * feat(detector): add detector * feat(scanner): delegate procedures to detector * fix(scanner): fix the interface * feat(client/server): add sub commands * merge(server3) * test(scan): remove an unused mock * refactor(client): generate the constructor by wire * fix(cli): change the default port * fix(server): use auto-generated constructor * feat(ospkg): return eosl * test(integration): add integration tests for client/server (aquasecurity#306) * fix(server): remove unnecessary options * test(integration): add integration tests for client/server * fix(server): wrap an error * fix(server): change the update interval * fix(server): display the error detail * test(config): add an assertion to test the config struct * fix(client): returns an error when failing to initizlie a logger * test(ospkg/server): add eosl * Squashed commit of the following: * test(server): refactor and add tests (aquasecurity#307) * test(github): create a mock * test(db): create a mock * test(server): add tests for DB hot update * chore(db): add a log message * refactor(db): introduce google/wire * refactor(rpc): move directory * refactor(injector): fix import name * refactor(import): remove new lines * fix(server): display the error detail * fix(server): change the update interval * fix(server): wrap an error * test(integration): add integration tests for client/server * fix(server): remove unnecessary options * refactor(server): return an error when failing to initialize a logger * refactor(server): remove unused error * fix(client/server): fix default port * chore(README): add client/server * chore(README): update
1 parent 24fc88c commit 74717b8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+6680
-700
lines changed

.clang-format

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
Language: Proto
3+
BasedOnStyle: Google
4+
AlignConsecutiveAssignments: true
5+
AlignConsecutiveDeclarations: true

Makefile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,17 @@ LDFLAGS=-ldflags "-s -w -X=main.version=$(VERSION)"
33

44
GOPATH=$(shell go env GOPATH)
55
GOBIN=$(GOPATH)/bin
6+
GOSRC=$(GOPATH)/src
67

78
u := $(if $(update),-u)
89

10+
$(GOBIN)/wire:
11+
GO111MODULE=off go get github.com/google/wire/cmd/wire
12+
13+
.PHONY: wire
14+
wire: $(GOBIN)/wire
15+
wire gen ./...
16+
917
.PHONY: deps
1018
deps:
1119
go get ${u} -d
@@ -29,10 +37,18 @@ test-integration: integration/testdata/fixtures/*.tar.gz
2937
lint: $(GOBIN)/golangci-lint
3038
$(GOBIN)/golangci-lint run
3139

40+
.PHONY: fmt
41+
fmt:
42+
find ./ -name "*.proto" | xargs clang-format -i
43+
3244
.PHONY: build
3345
build:
3446
go build $(LDFLAGS) ./cmd/trivy
3547

48+
.PHONY: protoc
49+
protoc:
50+
protoc --proto_path=$(GOSRC):. --twirp_out=. --go_out=. ./rpc/detector/service.proto
51+
3652
.PHONY: install
3753
install:
3854
go install $(LDFLAGS) ./cmd/trivy

README.md

Lines changed: 106 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,22 @@ A Simple and Comprehensive Vulnerability Scanner for Containers, Suitable for CI
2828
- [Basic](#basic)
2929
- [Docker](#docker)
3030
- [Examples](#examples)
31-
- [Scan an image](#scan-an-image)
32-
- [Scan an image file](#scan-an-image-file)
33-
- [Save the results as JSON](#save-the-results-as-json)
34-
- [Filter the vulnerabilities by severities](#filter-the-vulnerabilities-by-severities)
35-
- [Filter the vulnerabilities by type](#filter-the-vulnerabilities-by-type)
36-
- [Skip an update of vulnerability DB](#skip-update-of-vulnerability-db)
37-
- [Ignore unfixed vulnerabilities](#ignore-unfixed-vulnerabilities)
38-
- [Specify exit code](#specify-exit-code)
39-
- [Ignore the specified vulnerabilities](#ignore-the-specified-vulnerabilities)
40-
- [Clear image caches](#clear-image-caches)
41-
- [Reset](#reset)
31+
- [Standalone](#standalone)
32+
- [Scan an image](#scan-an-image)
33+
- [Scan an image file](#scan-an-image-file)
34+
- [Save the results as JSON](#save-the-results-as-json)
35+
- [Filter the vulnerabilities by severities](#filter-the-vulnerabilities-by-severities)
36+
- [Filter the vulnerabilities by type](#filter-the-vulnerabilities-by-type)
37+
- [Skip an update of vulnerability DB](#skip-update-of-vulnerability-db)
38+
- [Ignore unfixed vulnerabilities](#ignore-unfixed-vulnerabilities)
39+
- [Specify exit code](#specify-exit-code)
40+
- [Ignore the specified vulnerabilities](#ignore-the-specified-vulnerabilities)
41+
- [Clear image caches](#clear-image-caches)
42+
- [Reset](#reset)
43+
- [Lightweight DB](#use-lightweight-db)
44+
- [Client/Server](#client--server)
45+
- [Server](#server)
46+
- [Client](#client)
4247
- [Continuous Integration (CI)](#continuous-integration-ci)
4348
- [Travis CI](#travis-ci)
4449
- [CircleCI](#circleci)
@@ -254,6 +259,8 @@ Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0)
254259

255260
# Examples
256261

262+
## Standalone
263+
257264
### Scan an image
258265

259266
Simply specify an image name (and a tag).
@@ -1078,6 +1085,46 @@ Total: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 2, HIGH: 0, CRITICAL: 0)
10781085
```
10791086
</details>
10801087

1088+
1089+
## Client / Server
1090+
Trivy has client/server mode. Trivy server has vulnerability database and Trivy client doesn't have to download vulnerability database. It is useful if you want to scan images at multiple locations and do not want to download the database at every location.
1091+
1092+
### Server
1093+
At first, you need to launch Trivy server. It downloads vulnerability database automatically and continue to fetch the latest DB in the background.
1094+
```
1095+
$ trivy server --listen localhost:8080
1096+
2019-12-12T15:17:06.551+0200 INFO Need to update DB
1097+
2019-12-12T15:17:56.706+0200 INFO Reopening DB...
1098+
2019-12-12T15:17:56.707+0200 INFO Listening localhost:8080...
1099+
```
1100+
1101+
### Client
1102+
Then, specify the remote address.
1103+
```
1104+
$ trivy client --remote http://localhost:8080 alpine:3.10
1105+
```
1106+
1107+
<details>
1108+
<summary>Result</summary>
1109+
1110+
```
1111+
alpine:3.10 (alpine 3.10.2)
1112+
===========================
1113+
Total: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 2, HIGH: 0, CRITICAL: 0)
1114+
1115+
+---------+------------------+----------+-------------------+---------------+
1116+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |
1117+
+---------+------------------+----------+-------------------+---------------+
1118+
| openssl | CVE-2019-1549 | MEDIUM | 1.1.1c-r0 | 1.1.1d-r0 |
1119+
+ +------------------+ + + +
1120+
| | CVE-2019-1563 | | | |
1121+
+ +------------------+----------+ + +
1122+
| | CVE-2019-1547 | LOW | | |
1123+
+---------+------------------+----------+-------------------+---------------+
1124+
```
1125+
</details>
1126+
1127+
10811128
### Deprecated options
10821129

10831130
`--only-update`, `--refresh` and `--auto-refresh` are deprecated since they are unnecessary now. These options will be removed at the next version
@@ -1297,6 +1344,7 @@ Trivy scans a tar image with the following format.
12971344
- https://github.com/RustSec/advisory-db
12981345

12991346
# Usage
1347+
## Standalone
13001348

13011349
```
13021350
NAME:
@@ -1333,6 +1381,53 @@ OPTIONS:
13331381
13341382
```
13351383

1384+
## Sub commands
1385+
Trivy has two sub commands, client and server.
1386+
1387+
```
1388+
NAME:
1389+
trivy client - client mode
1390+
1391+
USAGE:
1392+
trivy client [command options] [arguments...]
1393+
1394+
OPTIONS:
1395+
--template value, -t value output template [$TRIVY_TEMPLATE]
1396+
--format value, -f value format (table, json, template) (default: "table") [$TRIVY_FORMAT]
1397+
--input value, -i value input file path instead of image name [$TRIVY_INPUT]
1398+
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
1399+
--output value, -o value output file name [$TRIVY_OUTPUT]
1400+
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
1401+
--clear-cache, -c clear image caches without scanning [$TRIVY_CLEAR_CACHE]
1402+
--quiet, -q suppress progress bar and log output [$TRIVY_QUIET]
1403+
--ignore-unfixed display only fixed vulnerabilities [$TRIVY_IGNORE_UNFIXED]
1404+
--debug, -d debug mode [$TRIVY_DEBUG]
1405+
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
1406+
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
1407+
--cache-dir value use as cache directory, but image cache is stored in /path/to/cache/fanal (default: "/Users/teppei/Library/Caches/trivy") [$TRIVY_CACHE_DIR]
1408+
--timeout value docker timeout (default: 1m0s) [$TRIVY_TIMEOUT]
1409+
--token value for authentication [$TRIVY_TOKEN]
1410+
--remote value server address (default: "http://localhost:4954") [$TRIVY_REMOTE]
1411+
```
1412+
1413+
```
1414+
NAME:
1415+
trivy server - server mode
1416+
1417+
USAGE:
1418+
trivy server [command options] [arguments...]
1419+
1420+
OPTIONS:
1421+
--skip-update skip db update [$TRIVY_SKIP_UPDATE]
1422+
--download-db-only download/update vulnerability database but don't run a scan [$TRIVY_DOWNLOAD_DB_ONLY]
1423+
--reset remove all caches and database [$TRIVY_RESET]
1424+
--quiet, -q suppress progress bar and log output [$TRIVY_QUIET]
1425+
--debug, -d debug mode [$TRIVY_DEBUG]
1426+
--cache-dir value use as cache directory, but image cache is stored in /path/to/cache/fanal (default: "/Users/teppei/Library/Caches/trivy") [$TRIVY_CACHE_DIR]
1427+
--token value for authentication [$TRIVY_TOKEN]
1428+
--listen value listen address (default: "localhost:4954") [$TRIVY_LISTEN]
1429+
```
1430+
13361431
# Comparison with other scanners
13371432

13381433
## Overview

cmd/trivy/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
l "log"
55
"os"
66

7-
"github.com/aquasecurity/trivy/internal/standalone"
7+
"github.com/aquasecurity/trivy/internal"
88

99
"github.com/aquasecurity/trivy/pkg/log"
1010
)
@@ -14,7 +14,7 @@ var (
1414
)
1515

1616
func main() {
17-
app := standalone.NewApp(version)
17+
app := internal.NewApp(version)
1818
err := app.Run(os.Args)
1919
if err != nil {
2020
if log.Logger != nil {

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ require (
99
github.com/briandowns/spinner v0.0.0-20190319032542-ac46072a5a91
1010
github.com/caarlos0/env/v6 v6.0.0
1111
github.com/genuinetools/reg v0.16.1
12+
github.com/golang/protobuf v1.3.1
1213
github.com/google/go-github/v28 v28.1.1
14+
github.com/google/wire v0.3.0
1315
github.com/knqyf263/go-deb-version v0.0.0-20190517075300-09fca494f03d
1416
github.com/knqyf263/go-rpm-version v0.0.0-20170716094938-74609b86c936
1517
github.com/knqyf263/go-version v1.1.1
1618
github.com/kylelemons/godebug v1.1.0
1719
github.com/olekukonko/tablewriter v0.0.2-0.20190607075207-195002e6e56a
1820
github.com/stretchr/testify v1.4.0
21+
github.com/twitchtv/twirp v5.9.0+incompatible
1922
github.com/urfave/cli v1.20.0
2023
go.etcd.io/bbolt v1.3.3 // indirect
2124
go.uber.org/atomic v1.5.1 // indirect

go.sum

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX
1919
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
2020
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
2121
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
22+
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
2223
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
24+
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
2325
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
2426
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
2527
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
@@ -127,6 +129,8 @@ github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
127129
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
128130
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
129131
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
132+
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
133+
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
130134
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
131135
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
132136
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
@@ -140,6 +144,9 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO
140144
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
141145
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
142146
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
147+
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
148+
github.com/google/wire v0.3.0 h1:imGQZGEVEHpje5056+K+cgdO72p0LQv2xIIFXNGUf60=
149+
github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s=
143150
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
144151
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
145152
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
@@ -192,8 +199,12 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0
192199
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
193200
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
194201
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
202+
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
203+
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
195204
github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
196205
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
206+
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
207+
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
197208
github.com/mattn/go-jsonpointer v0.0.0-20180225143300-37667080efed h1:fCWISZq4YN4ulCJx7x0KB15rqxLEe3mtNJL8cSOGKZU=
198209
github.com/mattn/go-jsonpointer v0.0.0-20180225143300-37667080efed/go.mod h1:SDJ4hurDYyQ9/7nc+eCYtXqdufgK4Cq9TJlwPklqEYA=
199210
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
@@ -280,6 +291,8 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
280291
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
281292
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
282293
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
294+
github.com/twitchtv/twirp v5.9.0+incompatible h1:KBCo4NYCpE9alO1HAEcgninDnw/0AhPT1rZnHkkSqi8=
295+
github.com/twitchtv/twirp v5.9.0+incompatible/go.mod h1:RRJoFSAmTEh2weEqWtpPE3vFK5YBhA6bqp2l1kfCC5A=
283296
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
284297
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
285298
github.com/xanzy/ssh-agent v0.2.0/go.mod h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8=
@@ -379,6 +392,7 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
379392
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
380393
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
381394
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
395+
golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
382396
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
383397
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
384398
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=

0 commit comments

Comments
 (0)