Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement a holepunch transport #313

Merged
merged 45 commits into from
May 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e32bb76
WIP
nkryuchkov May 5, 2020
e4e5e05
Add debug logs
nkryuchkov May 7, 2020
73d7ed8
Reconnect on failure
nkryuchkov May 7, 2020
92ff5d6
Test connection between peers
nkryuchkov May 10, 2020
90fa027
Make TCP holepunching work
nkryuchkov May 13, 2020
d06b325
Fix workarounds for TCP holepunching
nkryuchkov May 15, 2020
cee33e2
Fix workarounds for TCP holepunching
nkryuchkov May 15, 2020
631aae4
Refactoring
nkryuchkov May 15, 2020
6219244
Further refactoring
nkryuchkov May 17, 2020
5a8eeec
Further refactoring
nkryuchkov May 17, 2020
6b54bd5
Remove redundant config field
nkryuchkov May 18, 2020
9299b74
Merge branch 'develop' into feature/holepunch-transport
nkryuchkov May 18, 2020
641112b
Fix merge conflicts
nkryuchkov May 18, 2020
16927b9
Make AR IP be added to direct routes by VPN client
Darkren May 19, 2020
6a51df0
Merge pull request #1 from Darkren/fix/holepunch-transport-vpn-client…
nkryuchkov May 19, 2020
92e71b2
Return plain stcp transport type
nkryuchkov May 20, 2020
5989f38
Fix linter
nkryuchkov May 20, 2020
5e9fa01
Fix prod address resolver address
nkryuchkov May 20, 2020
a9fc6ee
Merge branch 'develop' into feature/holepunch-transport
nkryuchkov May 21, 2020
a5ee931
Add encryption to stcp transports
nkryuchkov May 22, 2020
eb00af2
Fix bugs
nkryuchkov May 22, 2020
70581f8
Fix encryption, improve stcp
nkryuchkov May 22, 2020
58b1e35
Fix status text
nkryuchkov May 22, 2020
cc3f77e
Minor improvements
nkryuchkov May 25, 2020
9a9f7de
Make encryption in stcp, stcpr, stcph always on
nkryuchkov May 25, 2020
4f927a2
Fix encryption for stcp
nkryuchkov May 26, 2020
944b942
Fix stcpr encryption
nkryuchkov May 26, 2020
33ab05e
Refactoring of stcp and stcpr
nkryuchkov May 26, 2020
a2b75a1
Fix linter and tests
nkryuchkov May 26, 2020
b9b38d7
Fix stcph logic
nkryuchkov May 26, 2020
b4f72d0
Vendor dmsg
nkryuchkov May 26, 2020
105bd7a
Don't stop serving stcph
nkryuchkov May 26, 2020
188d96f
Fix test config generation for address resolver
nkryuchkov May 26, 2020
729cd90
Set default VPN server AutoStart value to false
nkryuchkov May 26, 2020
4496e11
Fix panic, improve logic of receiving packets
nkryuchkov May 26, 2020
aac60bb
Merge branch 'develop' into feature/holepunch-transport
nkryuchkov May 26, 2020
8f83d27
Fix reusing port bug
nkryuchkov May 27, 2020
fa009b4
Revert unnecessary changes in README.md
nkryuchkov May 30, 2020
d3fecd3
Fix env name
nkryuchkov May 30, 2020
0325c22
Change %v to %w in fmt.Errorf
nkryuchkov May 30, 2020
f86cec8
Improve logging and code quality
nkryuchkov May 30, 2020
098ab75
Merge branch 'develop' into feature/holepunch-transport
nkryuchkov May 30, 2020
a8f06f2
Add a comment regarding reusing address
nkryuchkov May 30, 2020
a401b36
Fix go.mod
nkryuchkov May 30, 2020
e60cc16
Exclude darwin/386 target from release
nkryuchkov May 30, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,8 @@ linters-settings:
simple: true
range-loops: true # Report preallocation suggestions on range loops, true by default
for-loops: false # Report preallocation suggestions on for loops, false by default
goimports:
local-prefixes: github.com/SkycoinProject/skywire-mainnet


linters:
Expand Down
18 changes: 18 additions & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ builds:
- arm
goarm:
- 7
ignore:
- goos: darwin
goarch: 386
env:
- CGO_ENABLED=0
main: ./cmd/skywire-visor/
Expand All @@ -32,6 +35,9 @@ builds:
- arm
goarm:
- 7
ignore:
- goos: darwin
goarch: 386
env:
- CGO_ENABLED=0
main: ./cmd/skywire-cli/
Expand All @@ -48,6 +54,9 @@ builds:
- arm
goarm:
- 7
ignore:
- goos: darwin
goarch: 386
env:
- CGO_ENABLED=0
main: ./cmd/hypervisor/
Expand All @@ -64,6 +73,9 @@ builds:
- arm
goarm:
- 7
ignore:
- goos: darwin
goarch: 386
env:
- CGO_ENABLED=0
main: ./cmd/apps/skychat/
Expand All @@ -80,6 +92,9 @@ builds:
- arm
goarm:
- 7
ignore:
- goos: darwin
goarch: 386
env:
- CGO_ENABLED=0
main: ./cmd/apps/skysocks/
Expand All @@ -96,6 +111,9 @@ builds:
- arm
goarm:
- 7
ignore:
- goos: darwin
goarch: 386
env:
- CGO_ENABLED=0
main: ./cmd/apps/skysocks-client/
Expand Down
38 changes: 28 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@

### Requirements

Skywire requires a version of [golang](https://golang.org/) with [go modules](https://github.com/golang/go/wiki/Modules) support.
Skywire requires a version of [golang](https://golang.org/)
with [go modules](https://github.com/golang/go/wiki/Modules) support.

### Build

Expand Down Expand Up @@ -52,15 +53,18 @@ $ skywire-cli visor gen-config

Additional options are displayed when `skywire-cli visor gen-config -h` is run.

If you are trying to test features from the develop branch, you should use the `-t ` flag when generating config files for either `skywire-visor` or `hypervisor`.
If you are trying to test features from the develop branch,
you should use the `-t ` flag when generating config files for either `skywire-visor` or `hypervisor`.

We will cover certain fields of the configuration file below.

#### `stcp` setup

With `stcp`, you can establish *skywire transports* to other skywire visors with the `tcp` protocol.

As visors are identified with public keys and not IP addresses, we need to directly define the associations between IP address and public keys. This is done via the configuration file for `skywire-visor`.
As visors are identified with public keys and not IP addresses,
we need to directly define the associations between IP address and public keys.
This is done via the configuration file for `skywire-visor`.

```json
{
Expand All @@ -76,19 +80,29 @@ As visors are identified with public keys and not IP addresses, we need to direc

In the above example, we have two other visors running on localhost (that we wish to connect to via `stcp`).
- The field `stcp.pk_table` holds the associations of `<public_key>` to `<ip_address>:<port>`.
- The field `stcp.local_address` should only be specified if you want the visor in question to listen for incoming `stcp` connection.
- The field `stcp.local_address` should only be specified if you want the visor in question to listen for incoming
`stcp` connection.

#### `hypervisor` setup

Every node can be controlled by one or more hypervisors. The hypervisor allows to control and configure multiple visors. In order to allow a hypervisor to access a visor, the address and PubKey of the hypervisor needs to be configured first on the visor. Here is an example configuration:
Every node can be controlled by one or more hypervisors. The hypervisor allows to control and configure multiple visors.
In order to allow a hypervisor to access a visor,
the address and PubKey of the hypervisor needs to be configured first on the visor. Here is an example configuration:

```json
"hypervisors":[{"public_key":"02b72766f0ebade8e06d6969b5aeedaff8bf8efd7867f362bb4a63135ab6009775"}],
{
"hypervisors": [{
"public_key":"02b72766f0ebade8e06d6969b5aeedaff8bf8efd7867f362bb4a63135ab6009775"
}]
}
```

### Run `skywire-visor`

`skywire-visor` hosts apps, proxies app's requests to remote visors and exposes communication API that apps can use to implement communication protocols. App binaries are spawned by the visor, communication between visor and app is performed via unix pipes provided on app startup.
`skywire-visor` hosts apps, proxies app's requests to remote visors and exposes communication API
that apps can use to implement communication protocols.
App binaries are spawned by the visor,
communication between visor and app is performed via unix pipes provided on app startup.

Note that `skywire-visor` requires a valid configuration file in order to execute.

Expand Down Expand Up @@ -160,7 +174,9 @@ And then simply run skywire from the opened terminal.

### Apps

After `skywire-visor` is up and running with default environment, default apps are run with the configuration specified in `skywire-config.json`. Refer to the following for usage of the apps:
After `skywire-visor` is up and running with default environment,
default apps are run with the configuration specified in `skywire-config.json`.
Refer to the following for usage of the apps:

- [Skychat](/cmd/apps/skychat)
- [Skysocks](/cmd/apps/skysocks) ([Client](/cmd/apps/skysocks-client))
Expand Down Expand Up @@ -222,7 +238,8 @@ Full info on each call input and output may be found in the [corresponding file]

### Transports

In order for a local Skywire App to communicate with an App running on a remote Skywire visor, a transport to that remote Skywire visor needs to be established.
In order for a local Skywire App to communicate with an App running on a remote Skywire visor,
a transport to that remote Skywire visor needs to be established.

Transports can be established via the `skywire-cli`.

Expand All @@ -245,7 +262,8 @@ We use [goreleaser](https://goreleaser.com) for creating them.
1. Make sure that `git` and [goreleaser](https://goreleaser.com/install) are installed.
2. Checkout to a commit you would like to create a release against.
3. Make sure that `git status` is in clean state.
4. Create a `git` tag with desired release version and release name: `git tag -a 0.1.0 -m "First release"`, where `0.1.0` is release version and `First release` is release name.
4. Create a `git` tag with desired release version and release name: `git tag -a 0.1.0 -m "First release"`,
where `0.1.0` is release version and `First release` is release name.
5. Push the created tag to the repository: `git push origin 0.1.0`, where `0.1.0` is release version.
6. [Issue a personal GitHub access token.](https://github.com/settings/tokens)
7. Run `GITHUB_TOKEN=your_token make github-release`
Expand Down
1 change: 0 additions & 1 deletion ci_scripts/run-pkg-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ go clean -testcache &> /dev/null || go test -race -tags no_ci -cover -timeout=5m
go clean -testcache &> /dev/null || go test -race -tags no_ci -cover -timeout=5m github.com/SkycoinProject/skywire-mainnet/pkg/transport -run TestTransportManagerReEstablishTransports >> ./logs/pkg/TestTransportManagerReEstablishTransports.log
go clean -testcache &> /dev/null || go test -race -tags no_ci -cover -timeout=5m github.com/SkycoinProject/skywire-mainnet/pkg/transport -run TestTransportManagerLogs >> ./logs/pkg/TestTransportManagerLogs.log
go clean -testcache &> /dev/null || go test -race -tags no_ci -cover -timeout=5m github.com/SkycoinProject/skywire-mainnet/pkg/transport -run TestTCPFactory >> ./logs/pkg/TestTCPFactory.log
go clean -testcache &> /dev/null || go test -race -tags no_ci -cover -timeout=5m github.com/SkycoinProject/skywire-mainnet/pkg/transport -run TestFilePKTable >> ./logs/pkg/TestFilePKTable.log
go clean -testcache &> /dev/null || go test -race -tags no_ci -cover -timeout=5m github.com/SkycoinProject/skywire-mainnet/pkg/transport-discovery/client -run TestClientAuth >> ./logs/pkg/TestClientAuth.log
go clean -testcache &> /dev/null || go test -race -tags no_ci -cover -timeout=5m github.com/SkycoinProject/skywire-mainnet/pkg/transport-discovery/client -run TestRegisterTransportResponses >> ./logs/pkg/TestRegisterTransportResponses.log
go clean -testcache &> /dev/null || go test -race -tags no_ci -cover -timeout=5m github.com/SkycoinProject/skywire-mainnet/pkg/transport-discovery/client -run TestRegisterTransports >> ./logs/pkg/TestRegisterTransports.log
Expand Down
2 changes: 1 addition & 1 deletion cmd/hypervisor/statik/statik.go

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion cmd/setup-node/commands/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ var rootCmd = &cobra.Command{
}
rdr, err = os.Open(configFile)
if err != nil {
log.Fatalf("Failed to open config: %s", err)
log.Fatalf("Failed to open config: %v", err)
}
} else {
logger.Info("Reading config from STDIN")
Expand Down
30 changes: 17 additions & 13 deletions cmd/skywire-cli/commands/visor/transports.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import (

"github.com/SkycoinProject/skywire-mainnet/cmd/skywire-cli/internal"
"github.com/SkycoinProject/skywire-mainnet/pkg/snet/stcp"
"github.com/SkycoinProject/skywire-mainnet/pkg/snet/stcph"
"github.com/SkycoinProject/skywire-mainnet/pkg/snet/stcpr"
"github.com/SkycoinProject/skywire-mainnet/pkg/visor"
)

Expand Down Expand Up @@ -80,7 +82,9 @@ var (

func init() {
const (
typeFlagUsage = "type of transport to add; if unspecified, cli will attempt to establish a transport in the following order: stcp, dmsg"
// TODO: add stcpr implementation
typeFlagUsage = "type of transport to add; if unspecified, cli will attempt to establish a transport " +
"in the following order: stcp, stcpr, stcph, dmsg"
publicFlagUsage = "whether to make the transport public"
timeoutFlagUsage = "if specified, sets an operation timeout"
)
Expand Down Expand Up @@ -108,22 +112,22 @@ var addTpCmd = &cobra.Command{

logger.Infof("Established %v transport to %v", transportType, pk)
} else {
transportType = stcp.Type

tp, err = rpcClient().AddTransport(pk, transportType, public, timeout)
if err != nil {
logger.WithError(err).
Warnf("Failed to establish stcp transport. Trying to establish dmsg transport")

transportType = dmsg.Type
transportTypes := []string{
stcp.Type,
stcpr.Type,
stcph.Type,
dmsg.Type,
}

for _, transportType := range transportTypes {
tp, err = rpcClient().AddTransport(pk, transportType, public, timeout)
if err != nil {
logger.WithError(err).Fatalf("Failed to establish dmsg transport")
if err == nil {
logger.Infof("Established %v transport to %v", transportType, pk)
break
}
}

logger.Infof("Established %v transport to %v", transportType, pk)
logger.WithError(err).Warnf("Failed to establish %v transport", transportType)
}
}

printTransports(tp)
Expand Down
3 changes: 0 additions & 3 deletions cmd/skywire-cli/skywire-cli.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
/*
CLI for skywire visor
*/
package main

import (
Expand Down
7 changes: 4 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ require (
github.com/google/uuid v1.1.1
github.com/gorilla/securecookie v1.1.1
github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/libp2p/go-reuseport v0.0.1
github.com/mholt/archiver/v3 v3.3.0
github.com/pkg/profile v1.3.0
github.com/prometheus/client_golang v1.3.0
Expand All @@ -21,12 +21,13 @@ require (
github.com/sirupsen/logrus v1.5.0
github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8
github.com/spf13/cobra v0.0.5
github.com/stretchr/testify v1.4.0
github.com/stretchr/testify v1.5.1
go.etcd.io/bbolt v1.3.4
golang.org/x/crypto v0.0.0-20200427165652-729f1e841bcc // indirect
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e
golang.org/x/sys v0.0.0-20200428200454-593003d681fa // indirect
golang.zx2c4.com/wireguard v0.0.20200320
nhooyr.io/websocket v1.8.2
)

// Uncomment for tests with alternate branches of 'dmsg'
Expand Down
14 changes: 10 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/SkycoinProject/dmsg v0.0.0-20200306152741-acee74fa4514/go.mod h1:DzykXMLlx6Fx0fGjZsCIRas/MIvxW8DZpmDA6f2nCRk=
github.com/SkycoinProject/dmsg v0.1.1-0.20200523194607-be73f083a729 h1:Edgnt4ido4MGfNTEJUYqNeXt0AlJ4EHlFCWBrKYPvT4=
github.com/SkycoinProject/dmsg v0.1.1-0.20200523194607-be73f083a729/go.mod h1:MiX+UG/6fl3g+9rS13/fq7BwUQ2eOlg1yOBOnNf6J6A=
github.com/SkycoinProject/dmsg v0.2.2 h1:dVsenV5YvvP1Ptm0keproi/c6nA07FU6UntsFBga/74=
github.com/SkycoinProject/dmsg v0.2.2/go.mod h1:ze0XfdlLo3wtaK7caRqFipkRxEOZDqfgdPDARqG/jZs=
github.com/SkycoinProject/skycoin v0.26.0/go.mod h1:xqPLOKh5B6GBZlGA7B5IJfQmCy7mwimD9NlqxR3gMXo=
Expand Down Expand Up @@ -130,6 +128,8 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw=
github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
Expand Down Expand Up @@ -164,6 +164,7 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/profile v1.3.0 h1:OQIvuDgm00gWVWGTf4m4mCt6W1/0YqU7Ntg0mySWgaI=
github.com/pkg/profile v1.3.0/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
Expand Down Expand Up @@ -222,6 +223,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
Expand Down Expand Up @@ -259,8 +262,8 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191204025024-5ee1b9f4859a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
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=
Expand All @@ -274,6 +277,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand All @@ -282,6 +286,7 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200428200454-593003d681fa h1:yMbJOvnfYkO1dSAviTu/ZguZWLBTXx4xE3LYrxUCCiA=
golang.org/x/sys v0.0.0-20200428200454-593003d681fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand All @@ -308,6 +313,7 @@ google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
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 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand Down
Loading