cleanup: remove old unused files (#122)
Co-authored-by: Giorgi Lekveishvili <lekva@gl-mbp-m1-max.local>
diff --git a/core/auth/hydra-maester/.gitignore b/core/auth/hydra-maester/.gitignore
deleted file mode 100644
index 901cf92..0000000
--- a/core/auth/hydra-maester/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-hydra-maester
diff --git a/core/auth/hydra-maester/Dockerfile b/core/auth/hydra-maester/Dockerfile
deleted file mode 100644
index 585f9af..0000000
--- a/core/auth/hydra-maester/Dockerfile
+++ /dev/null
@@ -1,5 +0,0 @@
-FROM gcr.io/distroless/static:latest
-ARG TARGETARCH
-COPY hydra-maester/manager_${TARGETARCH} /manager
-USER 1000
-ENTRYPOINT ["/manager"]
diff --git a/core/auth/hydra-maester/Makefile b/core/auth/hydra-maester/Makefile
deleted file mode 100644
index 98453ac..0000000
--- a/core/auth/hydra-maester/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-clean: rm -rf hydra-maester/manager_*
-
-clone:
- git clone --depth 1 --branch v0.0.20 https://github.com/ory/hydra-maester.git
-
-build_arm64: export CGO_ENABLED=0
-build_arm64: export GO111MODULE=on
-build_arm64: export GOOS=linux
-build_arm64: export GOARCH=arm64
-build_arm64:
- cd hydra-maester && go build -o manager_arm64 main.go
-
-build_amd64: export CGO_ENABLED=0
-build_amd64: export GO111MODULE=on
-build_amd64: export GOOS=linux
-build_amd64: export GOARCH=amd64
-build_amd64:
- cd hydra-maester && go build -o manager_amd64 main.go
-
-build: clean build_arm64 build_amd64
-
-push: build
- docker buildx build --tag=giolekva/ory-hydra-maester:latest . --platform=linux/arm64,linux/amd64 --push
diff --git a/core/auth/hydra/Dockerfile b/core/auth/hydra/Dockerfile
deleted file mode 100644
index ba49668..0000000
--- a/core/auth/hydra/Dockerfile
+++ /dev/null
@@ -1,32 +0,0 @@
-FROM alpine:3.14.2
-
-ARG TARGETARCH
-
-RUN addgroup -S ory; \
- adduser -S ory -G ory -D -u 10000 -h /home/ory -s /bin/nologin; \
- chown -R ory:ory /home/ory
-
-RUN apk add -U --no-cache ca-certificates
-
-WORKDIR /downloads
-RUN if [[ "${TARGETARCH}" == "amd64" ]]; \
- then \
- wget https://github.com/ory/hydra/releases/download/v1.10.6/hydra_1.10.6_linux_64bit.tar.gz -O hydra.tar.gz ; \
- else \
- wget https://github.com/ory/hydra/releases/download/v1.10.6/hydra_1.10.6_linux_${TARGETARCH}.tar.gz -O hydra.tar.gz ; \
- fi
-
-RUN tar -xvf hydra.tar.gz
-RUN mv hydra /usr/bin
-
-VOLUME /home/ory
-WORKDIR /home/ory
-RUN rm -r /downloads
-
-# Declare the standard ports used by Hydra (4433 for public service endpoint, 4434 for admin service endpoint)
-EXPOSE 4433 4434
-
-USER 10000
-
-ENTRYPOINT ["hydra"]
-CMD ["serve"]
diff --git a/core/auth/hydra/Makefile b/core/auth/hydra/Makefile
deleted file mode 100644
index b0914b7..0000000
--- a/core/auth/hydra/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-push:
- docker buildx build --tag=giolekva/ory-hydra:latest . --platform=linux/arm64,linux/amd64 --push
diff --git a/core/auth/hydra/install.yaml b/core/auth/hydra/install.yaml
deleted file mode 100644
index b9a8d4d..0000000
--- a/core/auth/hydra/install.yaml
+++ /dev/null
@@ -1,161 +0,0 @@
----
-apiVersion: v1
-kind: Namespace
-metadata:
- name: core-auth
----
-apiVersion: v1
-kind: Service
-metadata:
- name: hydra
- namespace: core-auth
-spec:
- type: ClusterIP
- selector:
- app: hydra
- ports:
- - name: public
- port: 80
- targetPort: public
- protocol: TCP
- - name: admin
- port: 81
- targetPort: admin
- protocol: TCP
----
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
- name: ingress-hydra-public
- namespace: core-auth
- annotations:
- cert-manager.io/cluster-issuer: "letsencrypt-prod"
- acme.cert-manager.io/http01-edit-in-place: "true"
-spec:
- ingressClassName: nginx
- tls:
- - hosts:
- - hydra.lekva.me
- secretName: cert-hydra.lekva.me
- rules:
- - host: hydra.lekva.me
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: hydra
- port:
- name: public
----
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
- name: ingress-hydra-private
- namespace: core-auth
- annotations:
- cert-manager.io/cluster-issuer: "selfsigned-ca"
- acme.cert-manager.io/http01-edit-in-place: "true"
-spec:
- ingressClassName: nginx-private
- tls:
- - hosts:
- - hydra.pcloud
- secretName: cert-hydra.pcloud
- rules:
- - host: hydra.pcloud
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: hydra
- port:
- name: admin
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: hydra
- namespace: core-auth
-spec:
- selector:
- matchLabels:
- app: hydra
- replicas: 1
- template:
- metadata:
- labels:
- app: hydra
- spec:
- volumes:
- - name: config
- configMap:
- name: hydra
- containers:
- - name: hydra
- image: giolekva/ory-hydra:latest
- imagePullPolicy: IfNotPresent
- ports:
- - name: public
- containerPort: 4444
- protocol: TCP
- - name: admin
- containerPort: 4445
- protocol: TCP
- command:
- - "hydra"
- - "--config=/etc/hydra/config/hydra.yaml"
- - "serve"
- - "all"
- #command: ["hydra", "serve"]
- # resources:
- # requests:
- # memory: "10Mi"
- # cpu: "10m"
- # limits:
- # memory: "20Mi"
- # cpu: "100m"
- volumeMounts:
- - name: config
- mountPath: /etc/hydra/config
----
-apiVersion: batch/v1
-kind: Job
-metadata:
- name: hydra-migrate
- namespace: core-auth
-spec:
- template:
- metadata:
- labels:
- app: hydra-migrate
- spec:
- restartPolicy: OnFailure
- volumes:
- - name: config
- configMap:
- name: hydra
- containers:
- - name: hydra
- image: giolekva/ory-hydra:latest
- imagePullPolicy: IfNotPresent
- command:
- - "hydra"
- - "migrate"
- - "sql"
- - "-y"
- - "postgres://postgres:psswd@postgres:5432/hydra?sslmode=disable&max_conns=20&max_idle_conns=4"
- #command: ["hydra", "serve"]
- # resources:
- # requests:
- # memory: "10Mi"
- # cpu: "10m"
- # limits:
- # memory: "20Mi"
- # cpu: "100m"
- volumeMounts:
- - name: config
- mountPath: /etc/hydra/config
diff --git a/core/auth/kratos/Dockerfile b/core/auth/kratos/Dockerfile
deleted file mode 100644
index 6b60233..0000000
--- a/core/auth/kratos/Dockerfile
+++ /dev/null
@@ -1,29 +0,0 @@
-FROM alpine:3.14.2
-
-ARG TARGETARCH
-
-RUN addgroup -S ory; \
- adduser -S ory -G ory -D -u 10000 -h /home/ory -s /bin/nologin; \
- chown -R ory:ory /home/ory
-
-RUN apk add -U --no-cache ca-certificates
-
-RUN if [[ "${TARGETARCH}" == "amd64" ]]; \
- then \
- wget https://github.com/ory/kratos/releases/download/v0.7.6-alpha.1/kratos_0.7.6-alpha.1_linux_64bit.tar.gz -O kratos.tar.gz ; \
- else \
- wget https://github.com/ory/kratos/releases/download/v0.7.6-alpha.1/kratos_0.7.6-alpha.1_linux_${TARGETARCH}.tar.gz -O kratos.tar.gz ; \
- fi
-
-RUN tar -xvf kratos.tar.gz
-RUN mv kratos /usr/bin
-
-VOLUME /home/ory
-
-# Declare the standard ports used by Kratos (4433 for public service endpoint, 4434 for admin service endpoint)
-EXPOSE 4433 4434
-
-USER 10000
-
-ENTRYPOINT ["kratos"]
-CMD ["serve"]
diff --git a/core/auth/kratos/Makefile b/core/auth/kratos/Makefile
deleted file mode 100644
index 3b803ed..0000000
--- a/core/auth/kratos/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-push:
- docker buildx build --tag=giolekva/ory-kratos:latest . --platform=linux/arm64,linux/amd64 --push
diff --git a/core/auth/kratos/identity.schema.json b/core/auth/kratos/identity.schema.json
deleted file mode 100644
index f37a3df..0000000
--- a/core/auth/kratos/identity.schema.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "$id": "https://schemas.ory.sh/presets/kratos/quickstart/email-password/identity.schema.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
- "title": "User",
- "type": "object",
- "properties": {
- "traits": {
- "type": "object",
- "properties": {
- "username": {
- "type": "string",
- "format": "username",
- "title": "Username",
- "minLength": 3,
- "ory.sh/kratos": {
- "credentials": {
- "password": {
- "identifier": true
- }
- }
- }
- }
- },
- "additionalProperties": false
- }
- }
-}
diff --git a/core/auth/kratos/install.yaml b/core/auth/kratos/install.yaml
deleted file mode 100644
index c802dab..0000000
--- a/core/auth/kratos/install.yaml
+++ /dev/null
@@ -1,124 +0,0 @@
----
-apiVersion: v1
-kind: Namespace
-metadata:
- name: core-auth
----
-apiVersion: v1
-kind: Service
-metadata:
- name: kratos
- namespace: core-auth
-spec:
- type: ClusterIP
- selector:
- app: kratos
- ports:
- - name: public
- port: 80
- targetPort: public
- protocol: TCP
- - name: admin
- port: 81
- targetPort: admin
- protocol: TCP
----
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
- name: ingress-kratos-public
- namespace: core-auth
- annotations:
- cert-manager.io/cluster-issuer: "letsencrypt-prod"
- acme.cert-manager.io/http01-edit-in-place: "true"
-spec:
- ingressClassName: nginx
- tls:
- - hosts:
- - accounts.lekva.me
- secretName: cert-accounts.lekva.me
- rules:
- - host: accounts.lekva.me
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: kratos
- port:
- name: public
----
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
- name: ingress-kratos-private
- namespace: core-auth
- annotations:
- cert-manager.io/cluster-issuer: "selfsigned-ca"
- acme.cert-manager.io/http01-edit-in-place: "true"
-spec:
- ingressClassName: nginx-private
- tls:
- - hosts:
- - kratos.pcloud
- secretName: cert-kratos.pcloud
- rules:
- - host: kratos.pcloud
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: kratos
- port:
- name: admin
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: kratos
- namespace: core-auth
-spec:
- selector:
- matchLabels:
- app: kratos
- replicas: 1
- template:
- metadata:
- labels:
- app: kratos
- spec:
- volumes:
- - name: config
- configMap:
- name: kratos
- - name: identity
- configMap:
- name: identity
- containers:
- - name: kratos
- image: giolekva/ory-kratos:latest
- imagePullPolicy: IfNotPresent
- ports:
- - name: public
- containerPort: 4433
- protocol: TCP
- - name: admin
- containerPort: 4434
- protocol: TCP
- command: ["kratos", "--config=/etc/kratos/config/kratos.yaml", "serve"]
- #command: ["kratos", "serve"]
- # resources:
- # requests:
- # memory: "10Mi"
- # cpu: "10m"
- # limits:
- # memory: "20Mi"
- # cpu: "100m"
- volumeMounts:
- - name: config
- mountPath: /etc/kratos/config
- - name: identity
- mountPath: /etc/kratos/identity
diff --git a/core/auth/kratos/kratos.yaml b/core/auth/kratos/kratos.yaml
deleted file mode 100644
index b362dee..0000000
--- a/core/auth/kratos/kratos.yaml
+++ /dev/null
@@ -1,95 +0,0 @@
-version: v0.7.1-alpha.1
-
-dsn: postgres://postgres:psswd@postgres:5432/kr?sslmode=disable&max_conns=20&max_idle_conns=4
-
-serve:
- public:
- base_url: https://accounts.lekva.me/
- cors:
- enabled: true
- debug: true
- allow_credentials: true
- allowed_origins:
- - https://lekva.me
- - https://*.lekva.me
- admin:
- base_url: https://kratos.pcloud/
-
-selfservice:
- default_browser_return_url: https://accounts-ui.lekva.me/
- whitelisted_return_urls:
- - https://accounts-ui.lekva.me
-
- methods:
- password:
- enabled: true
-
- flows:
- error:
- ui_url: https://accounts-ui.lekva.me/error
-
- settings:
- ui_url: https://accounts-ui.lekva.me/settings
- privileged_session_max_age: 15m
-
- recovery:
- enabled: false
-
- verification:
- enabled: false
-
- logout:
- after:
- default_browser_return_url: https://accounts-ui.lekva.me/login
-
- login:
- ui_url: https://accounts-ui.lekva.me/login
- lifespan: 10m
- after:
- password:
- default_browser_return_url: https://accounts-ui.lekva.me/
-
- registration:
- lifespan: 10m
- ui_url: https://accounts-ui.lekva.me/registration
- after:
- password:
- hooks:
- -
- hook: session
- default_browser_return_url: https://accounts-ui.lekva.me/
-
-log:
- level: debug
- format: text
- leak_sensitive_values: true
-
-cookies:
- path: /
- same_site: None
- domain: lekva.me
-
-secrets:
- cookie:
- - PLEASE-CHANGE-ME-I-AM-VERY-INSECURE
- # cipher:
- # - 32-LONG-SECRET-NOT-SECURE-AT-ALL
-
-# ciphers:
-# algorithm: xchacha20-poly1305
-
-hashers:
- argon2:
- parallelism: 1
- memory: 128MB
- iterations: 2
- salt_length: 16
- key_length: 16
-
-identity:
- default_schema_url: file:///etc/kratos/identity/identity.schema.json
-
-courier:
- smtp:
- connection_uri: smtps://test-z1VmkYfYPjgdPRgPFgmeZ31esT9rUgS%40lekva.me:iW%213Kk%5EPPLFrZa%24%21bbpTPN9Wv3b8mvwS6ZJvMLtce%23A2%2A4MotD@mx1.lekva.me
- # connection_uri: smtps://test-z1VmkYfYPjgdPRgPFgmeZ31esT9rUgS@lekva.me:iW!3Kk^PPLFrZa$!bbpTPN9Wv3b8mvwS6ZJvMLtce#A2*4MotD@mx1.lekva.me
diff --git a/core/vpn/engine/engine.go b/core/vpn/engine/engine.go
deleted file mode 100644
index 17bced6..0000000
--- a/core/vpn/engine/engine.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package engine
-
-import (
- "inet.af/netaddr"
- "tailscale.com/ipn/ipnstate"
-
- "github.com/giolekva/pcloud/core/vpn/types"
-)
-
-// Abstracts away communication with host OS needed to setup netfwork interfaces
-// for VPN.
-type Engine interface {
- // Reconfigures local network interfaces in accordance to the given VPN
- // layout.
- Configure(netMap *types.NetworkMap) error
- // Unique public discovery key of the current device.
- DiscoKey() types.DiscoKey
- // Sends ping to the given IP address and invokes callback with results.
- Ping(ip netaddr.IP, cb func(*ipnstate.PingResult))
-}
diff --git a/core/vpn/engine/wireguard.go b/core/vpn/engine/wireguard.go
deleted file mode 100644
index cbe5ab9..0000000
--- a/core/vpn/engine/wireguard.go
+++ /dev/null
@@ -1,176 +0,0 @@
-package engine
-
-import (
- "fmt"
- "log"
-
- "github.com/giolekva/pcloud/core/vpn/types"
- "golang.zx2c4.com/wireguard/tun"
-
- "inet.af/netaddr"
- "tailscale.com/ipn/ipnstate"
- "tailscale.com/net/dns"
- "tailscale.com/tailcfg"
- "tailscale.com/types/netmap"
- "tailscale.com/types/wgkey"
- "tailscale.com/wgengine"
- "tailscale.com/wgengine/router"
- "tailscale.com/wgengine/wgcfg"
-)
-
-// Wireguard specific implementation of the Engine interface.
-type WireguardEngine struct {
- wg wgengine.Engine
- port uint16
- privKey types.PrivateKey
-}
-
-// Creates Wireguard engine.
-func NewWireguardEngine(tunName string, port uint16, privKey types.PrivateKey) (Engine, error) {
- tun, err := tun.CreateTUN(tunName, 1500)
- if err != nil {
- return nil, err
- }
- e, err := wgengine.NewUserspaceEngine(log.Printf, wgengine.Config{
- Tun: tun,
- ListenPort: port,
- })
- if err != nil {
- return nil, err
- }
- return &WireguardEngine{
- wg: e,
- port: port,
- privKey: privKey,
- }, nil
-}
-
-// Used for unit testing.
-func NewFakeWireguardEngine(port uint16, privKey types.PrivateKey) (Engine, error) {
- e, err := wgengine.NewFakeUserspaceEngine(log.Printf, port)
- if err != nil {
- return nil, err
- }
- return &WireguardEngine{
- wg: e,
- port: port,
- privKey: privKey,
- }, nil
-}
-
-func genWireguardConf(privKey types.PrivateKey, port uint16,
- netMap *types.NetworkMap) *wgcfg.Config {
- c := &wgcfg.Config{
- // TODO(giolekva): we shoudld probably use hostname and share
- // it with the controller
- Name: "local-node",
- PrivateKey: wgkey.Private(privKey),
- Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
- netMap.Self.VPNIP,
- 32, // TODO(giolekva): adapt for IPv6
- )},
- // ListenPort: port,
- Peers: make([]wgcfg.Peer, 0, len(netMap.Peers)),
- }
- for _, peer := range netMap.Peers {
- c.Peers = append(c.Peers, wgcfg.Peer{
- PublicKey: wgkey.Key(peer.PublicKey),
- AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
- peer.VPNIP,
- 32,
- )},
- Endpoints: wgcfg.Endpoints{
- DiscoKey: tailcfg.DiscoKey(peer.DiscoKey),
- },
- PersistentKeepalive: 15, // TODO(giolekva): make it configurable
- })
- }
- return c
-}
-
-func genRouterConf(netMap *types.NetworkMap) *router.Config {
- c := &router.Config{
- LocalAddrs: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
- netMap.Self.VPNIP,
- 32,
- )},
- Routes: make([]netaddr.IPPrefix, 0, len(netMap.Peers)),
- }
- for _, peer := range netMap.Peers {
- c.Routes = append(c.Routes, netaddr.IPPrefixFrom(
- peer.VPNIP,
- 32,
- ))
- }
- return c
-}
-
-func genTailNetMap(privKey types.PrivateKey, port uint16, netMap *types.NetworkMap) *netmap.NetworkMap {
- c := &netmap.NetworkMap{
- SelfNode: &tailcfg.Node{
- ID: 0, // TODO(giolekva): maybe IDs should be stored server side.
- StableID: "0",
- Name: "0",
- Key: tailcfg.NodeKey(netMap.Self.PublicKey),
- DiscoKey: tailcfg.DiscoKey(netMap.Self.DiscoKey),
- Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
- netMap.Self.VPNIP,
- 32,
- )},
- AllowedIPs: make([]netaddr.IPPrefix, 0, len(netMap.Peers)),
- Endpoints: []string{netMap.Self.IPPort.String()},
- KeepAlive: true, // TODO(giolekva): make it configurable
- },
- NodeKey: tailcfg.NodeKey(netMap.Self.PublicKey),
- PrivateKey: wgkey.Private(privKey),
- Name: "0",
- Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
- netMap.Self.VPNIP,
- 32,
- )},
- LocalPort: port,
- Peers: make([]*tailcfg.Node, 0, len(netMap.Peers)),
- }
- for i, peer := range netMap.Peers {
- c.Peers = append(c.Peers, &tailcfg.Node{
- ID: tailcfg.NodeID(i + 1),
- StableID: tailcfg.StableNodeID(fmt.Sprintf("%d", i+1)),
- Name: fmt.Sprintf("%d", i+1),
- Key: tailcfg.NodeKey(peer.PublicKey),
- DiscoKey: tailcfg.DiscoKey(peer.DiscoKey),
- Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
- peer.VPNIP,
- 32,
- )},
- AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
- netMap.Self.VPNIP,
- 32,
- )},
- Endpoints: []string{peer.IPPort.String()},
- KeepAlive: true,
- })
- }
- return c
-}
-
-func (e *WireguardEngine) Configure(netMap *types.NetworkMap) error {
- err := e.wg.Reconfig(
- genWireguardConf(e.privKey, e.port, netMap),
- genRouterConf(netMap),
- &dns.Config{},
- nil)
- if err != nil {
- return err
- }
- e.wg.SetNetworkMap(genTailNetMap(e.privKey, e.port, netMap))
- e.wg.RequestStatus()
- return err
-}
-
-func (e *WireguardEngine) DiscoKey() types.DiscoKey {
- return types.DiscoKey(e.wg.DiscoPublicKey())
-}
-
-func (e *WireguardEngine) Ping(ip netaddr.IP, cb func(*ipnstate.PingResult)) {
- e.wg.Ping(ip, false, cb)
-}
diff --git a/core/vpn/engine/wireguard_test.go b/core/vpn/engine/wireguard_test.go
deleted file mode 100644
index 02fdc19..0000000
--- a/core/vpn/engine/wireguard_test.go
+++ /dev/null
@@ -1,119 +0,0 @@
-package engine
-
-import (
- "fmt"
- "log"
- "testing"
-
- "github.com/giolekva/pcloud/core/vpn/types"
-
- "inet.af/netaddr"
- "tailscale.com/ipn/ipnstate"
-)
-
-type node struct {
- ip netaddr.IP
- privKey types.PrivateKey
- node types.Node
- peers []types.Node
- e Engine
-}
-
-func newNode(ip string, localPort uint16) (n *node, err error) {
- n = &node{
- ip: netaddr.MustParseIP(ip),
- privKey: types.NewPrivateKey(),
- }
- if n.e, err = NewFakeWireguardEngine(localPort, n.privKey); err != nil {
- return
- }
- n.node = types.Node{
- PublicKey: n.privKey.Public(),
- DiscoKey: n.e.DiscoKey(),
- IPPort: netaddr.IPPortFrom(
- netaddr.IPv4(127, 0, 0, 1),
- localPort,
- ),
- VPNIP: netaddr.MustParseIP(ip),
- }
- return
-}
-
-func (n *node) addPeer(x types.Node) {
- n.peers = append(n.peers, x)
-}
-
-func (n *node) configure() error {
- return n.e.Configure(&types.NetworkMap{n.node, n.peers})
-}
-
-func (n *node) ping(ip string, ch chan<- *ipnstate.PingResult) {
- n.e.Ping(netaddr.MustParseIP(ip), func(p *ipnstate.PingResult) {
- ch <- p
- })
-}
-
-func TestTwoPeers(t *testing.T) {
- var a, b *node
- var err error
- if a, err = newNode("10.0.0.1", 1234); err != nil {
- t.Fatal(err)
- }
- if b, err = newNode("10.0.0.2", 1235); err != nil {
- t.Fatal(err)
- }
- a.addPeer(b.node)
- b.addPeer(a.node)
- if err := a.configure(); err != nil {
- t.Fatal(err)
- }
- if err := b.configure(); err != nil {
- t.Fatal(err)
- }
- ping := make(chan *ipnstate.PingResult, 0)
- a.ping("10.0.0.2", ping)
- b.ping("10.0.0.1", ping)
- for i := 0; i < 2; i++ {
- p := <-ping
- if p.Err != "" {
- t.Error(p.Err)
- }
- log.Printf("Ping received: %+v\n", p)
- }
-}
-
-func TestTenPeers(t *testing.T) {
- n := 10
- nodes := make([]*node, n)
- ping := make(chan *ipnstate.PingResult, 0)
- for i := 0; i < n; i++ {
- ip := fmt.Sprintf("10.0.0.%d", i+1)
- localPort := uint16(i + 4321)
- var err error
- if nodes[i], err = newNode(ip, localPort); err != nil {
- t.Fatal(err)
- }
- for j := 0; j < i; j++ {
- nodes[i].addPeer(nodes[j].node)
- nodes[j].addPeer(nodes[i].node)
- }
- }
- for i := 0; i < n; i++ {
- if err := nodes[i].configure(); err != nil {
- t.Fatal(err)
- }
- for j := 0; j < i; j++ {
- nodes[i].ping(nodes[j].ip.String(), ping)
- nodes[j].ping(nodes[i].ip.String(), ping)
- }
-
- }
- for i := 0; i < n*(n-1); i++ {
- p := <-ping
- if p.Err != "" {
- t.Error(p.Err)
- } else {
- log.Printf("Ping received: %+v\n", p)
- }
- }
-}
diff --git a/core/vpn/go.mod b/core/vpn/go.mod
deleted file mode 100644
index b3719c5..0000000
--- a/core/vpn/go.mod
+++ /dev/null
@@ -1,10 +0,0 @@
-module github.com/giolekva/pcloud/core/vpn
-
-go 1.16
-
-require (
- github.com/tailscale/wireguard-go v0.0.0-20210120212909-7ad8a0443bd3
- golang.zx2c4.com/wireguard v0.0.0-20210624150102-15b24b6179e0
- inet.af/netaddr v0.0.0-20210721214506-ce7a8ad02cc1
- tailscale.com v1.12.1
-)
diff --git a/core/vpn/go.sum b/core/vpn/go.sum
deleted file mode 100644
index bd3ea51..0000000
--- a/core/vpn/go.sum
+++ /dev/null
@@ -1,788 +0,0 @@
-4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo=
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
-github.com/Djarvur/go-err113 v0.1.0/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
-github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
-github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
-github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
-github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
-github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
-github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
-github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
-github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
-github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
-github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
-github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA=
-github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
-github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
-github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
-github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
-github.com/aws/aws-sdk-go v1.38.52/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
-github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI=
-github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc=
-github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/cilium/ebpf v0.5.0 h1:E1KshmrMEtkMP2UjlWzfmUV1owWY+BnbL5FxxuatnrU=
-github.com/cilium/ebpf v0.5.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
-github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk=
-github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
-github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/daixiang0/gci v0.2.4/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4=
-github.com/daixiang0/gci v0.2.7/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc=
-github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
-github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
-github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
-github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
-github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/github/fakeca v0.1.0 h1:Km/MVOFvclqxPM9dZBC4+QE564nU4gz4iZ0D9pMw28I=
-github.com/github/fakeca v0.1.0/go.mod h1:+bormgoGMMuamOscx7N91aOuUST7wdaJ2rNjeohylyo=
-github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/gliderlabs/ssh v0.3.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-critic/go-critic v0.5.2/go.mod h1:cc0+HvdE3lFpqLecgqMaJcvWWH77sLdBp+wLGPM1Yyo=
-github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
-github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
-github.com/go-git/go-git/v5 v5.2.0/go.mod h1:kh02eMX+wdqqxgNMEyq8YgwlIOsDOa9homkUq1PoTMs=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-multierror/multierror v1.0.2 h1:AwsKbEXkmf49ajdFJgcFXqSG0aLo0HEyAE9zk9JguJo=
-github.com/go-multierror/multierror v1.0.2/go.mod h1:U7SZR/D9jHgt2nkSj8XcbCWdmVM2igraCHQ3HC1HiKY=
-github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
-github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
-github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
-github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
-github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
-github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
-github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
-github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU=
-github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
-github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
-github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
-github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
-github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
-github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
-github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
-github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
-github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
-github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
-github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
-github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
-github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
-github.com/golangci/golangci-lint v1.33.0/go.mod h1:zMnMLSCaDlrXExYsuq2LOweE9CHVqYk5jexk23UsjYM=
-github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
-github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
-github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
-github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
-github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
-github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
-github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
-github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
-github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
-github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
-github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/goexpect v0.0.0-20210430020637-ab937bf7fd6f/go.mod h1:n1ej5+FqyEytMt/mugVDZLIiqTMO+vsrgY+kM6ohzN0=
-github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/rpmpack v0.0.0-20201206194719-59e495f2b7e1/go.mod h1:+y9lKiqDhR4zkLl+V9h4q0rdyrYVsWWm6LLCQP33DIk=
-github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/gookit/color v1.3.1/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/goreleaser/chglog v0.1.2/go.mod h1:tTZsFuSZK4epDXfjMkxzcGbrIOXprf0JFp47BjIr3B8=
-github.com/goreleaser/fileglob v0.3.1/go.mod h1:kNcPrPzjCp+Ox3jmXLU5QEsjhqrtLBm6OnXAif8KRl8=
-github.com/goreleaser/nfpm v1.10.3/go.mod h1:EEC7YD5wi+ol0MiAshpgPANBOkjXDl7wqTLVk68OBsk=
-github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
-github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
-github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw=
-github.com/gostaticanalysis/analysisutil v0.6.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0=
-github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI=
-github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
-github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
-github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
-github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
-github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
-github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
-github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
-github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
-github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
-github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
-github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
-github.com/jgautheron/goconst v0.0.0-20201117150253-ccae5bf973f3/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4=
-github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s=
-github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
-github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
-github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
-github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
-github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
-github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/josharian/native v0.0.0-20200817173448-b6b71def0850 h1:uhL5Gw7BINiiPAo24A2sxkcDI0Jt/sqp1v5xQCniEFA=
-github.com/josharian/native v0.0.0-20200817173448-b6b71def0850/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
-github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw=
-github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ=
-github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok=
-github.com/jsimonetti/rtnetlink v0.0.0-20201216134343-bde56ed16391/go.mod h1:cR77jAZG3Y3bsb8hF6fHJbFoyFukLFOkQ98S0pQz3xw=
-github.com/jsimonetti/rtnetlink v0.0.0-20201220180245-69540ac93943/go.mod h1:z4c53zj6Eex712ROyh8WI0ihysb5j2ROyV42iNogmAs=
-github.com/jsimonetti/rtnetlink v0.0.0-20210122163228-8d122574c736/go.mod h1:ZXpIyOK59ZnN7J0BV99cZUPmsqDRZ3eq5X+st7u/oSA=
-github.com/jsimonetti/rtnetlink v0.0.0-20210212075122-66c871082f2b/go.mod h1:8w9Rh8m+aHZIG69YPGGem1i5VzoyRC8nw2kA8B+ik5U=
-github.com/jsimonetti/rtnetlink v0.0.0-20210525051524-4cc836578190 h1:iycCSDo8EKVueI9sfVBBJmtNn9DnXV/K1YWwEJO+uOs=
-github.com/jsimonetti/rtnetlink v0.0.0-20210525051524-4cc836578190/go.mod h1:NmKSdU4VGSiv1bMsdqNALI4RSvvjtz65tTMCnD05qLo=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
-github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30=
-github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg=
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
-github.com/lxn/walk v0.0.0-20210112085537-c389da54e794/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ=
-github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
-github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
-github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU=
-github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
-github.com/matoous/godox v0.0.0-20200801072554-4fb83dc2941e/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
-github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mbilski/exhaustivestruct v1.1.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc=
-github.com/mdlayher/ethtool v0.0.0-20210210192532-2b88debcdd43 h1:WgyLFv10Ov49JAQI/ZLUkCZ7VJS3r74hwFIGXJsgZlY=
-github.com/mdlayher/ethtool v0.0.0-20210210192532-2b88debcdd43/go.mod h1:+t7E0lkKfbBsebllff1xdTmyJt8lH37niI6kwFk9OTo=
-github.com/mdlayher/genetlink v1.0.0 h1:OoHN1OdyEIkScEmRgxLEe2M9U8ClMytqA5niynLtfj0=
-github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc=
-github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
-github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M=
-github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY=
-github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o=
-github.com/mdlayher/netlink v1.2.0/go.mod h1:kwVW1io0AZy9A1E2YYgaD4Cj+C+GPkU6klXCMzIJ9p8=
-github.com/mdlayher/netlink v1.2.1/go.mod h1:bacnNlfhqHqqLo4WsYeXSqfyXkInQ9JneWI68v1KwSU=
-github.com/mdlayher/netlink v1.2.2-0.20210123213345-5cc92139ae3e/go.mod h1:bacnNlfhqHqqLo4WsYeXSqfyXkInQ9JneWI68v1KwSU=
-github.com/mdlayher/netlink v1.3.0/go.mod h1:xK/BssKuwcRXHrtN04UBkwQ6dY9VviGGuriDdoPSWys=
-github.com/mdlayher/netlink v1.4.0/go.mod h1:dRJi5IABcZpBD2A3D0Mv/AiX8I9uDEu5oGkAVrekmf8=
-github.com/mdlayher/netlink v1.4.1 h1:I154BCU+mKlIf7BgcAJB2r7QjveNPty6uNY1g9ChVfI=
-github.com/mdlayher/netlink v1.4.1/go.mod h1:e4/KuJ+s8UhfUpO9z00/fDZZmhSrs+oxyqAS9cNgn6Q=
-github.com/mdlayher/sdnotify v0.0.0-20210228150836-ea3ec207d697 h1:PBb7ld5cQGfxHF2pKvb/ydtuPwdRaltGI4e0QSCuiNI=
-github.com/mdlayher/sdnotify v0.0.0-20210228150836-ea3ec207d697/go.mod h1:HtjVsQfsrBm1GDcDTUFn4ZXhftxTwO/hxrvEiRc61U4=
-github.com/mdlayher/socket v0.0.0-20210307095302-262dc9984e00 h1:qEtkL8n1DAHpi5/AOgAckwGQUlMe4+jhL/GMt+GKIks=
-github.com/mdlayher/socket v0.0.0-20210307095302-262dc9984e00/go.mod h1:GAFlyu4/XV68LkQKYzKhIo/WW7j3Zi0YRAz/BOoanUc=
-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/miekg/dns v1.1.42 h1:gWGe42RGaIqXQZ+r3WUGEKBEtvPHY2SXo4dqixDNxuY=
-github.com/miekg/dns v1.1.42/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
-github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
-github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
-github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
-github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
-github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k=
-github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c=
-github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ=
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pborman/getopt v1.1.0/go.mod h1:FxXoW1Re00sQG/+KIkuSqRL/LwQgSkv7uyac+STFsbk=
-github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys=
-github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
-github.com/peterbourgon/ff/v2 v2.0.0/go.mod h1:xjwr+t+SjWm4L46fcj/D+Ap+6ME7+HqFzaP22pP5Ggk=
-github.com/peterbourgon/ff/v3 v3.0.0/go.mod h1:UILIFjRH5a/ar8TjXYLTkIvSvekZqPm5Eb/qbGk6CT0=
-github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw=
-github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
-github.com/pkg/sftp v1.13.0/go.mod h1:41g+FIPlQUTDCveupEmEA65IoiQFrtgCeDopC4ajGIM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/polyfloyd/go-errorlint v0.0.0-20201006195004-351e25ade6e3/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw=
-github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw=
-github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
-github.com/quasilyte/go-ruleguard v0.2.0/go.mod h1:2RT/tf0Ce0UDj5y243iWKosQogJd8+1G3Rs2fxmlYnw=
-github.com/quasilyte/go-ruleguard v0.2.1/go.mod h1:hN2rVc/uS4bQhQKTio2XaSJSafJwqBUWWwtssT3cQmc=
-github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=
-github.com/quasilyte/regex/syntax v0.0.0-20200805063351-8f842688393c/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM=
-github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA=
-github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I=
-github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/securego/gosec/v2 v2.5.0/go.mod h1:L/CDXVntIff5ypVHIkqPXbtRpJiNCh6c6Amn68jXDjo=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
-github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc=
-github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
-github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
-github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
-github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI=
-github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
-github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
-github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
-github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
-github.com/tailscale/certstore v0.0.0-20210528134328-066c94b793d3 h1:fEubocuQkrlcuYeXelhYq/YcKvVVe1Ah7saQEtj98Mo=
-github.com/tailscale/certstore v0.0.0-20210528134328-066c94b793d3/go.mod h1:2P+hpOwd53e7JMX/L4f3VXkv1G+33ES6IWZSrkIeWNs=
-github.com/tailscale/depaware v0.0.0-20201214215404-77d1e9757027/go.mod h1:p9lPsd+cx33L3H9nNoecRRxPssFKUwwI50I3pZ0yT+8=
-github.com/tailscale/goupnp v1.0.1-0.20210710010003-1cf2d718bbb2 h1:AIJ8AF9O7jBmCwilP0ydwJMIzW5dw48Us8f3hLJhYBY=
-github.com/tailscale/goupnp v1.0.1-0.20210710010003-1cf2d718bbb2/go.mod h1:PdCqy9JzfWMJf1H5UJW2ip33/d4YkoKN0r67yKH1mG8=
-github.com/tailscale/hujson v0.0.0-20200924210142-dde312d0d6a2/go.mod h1:STqf+YV0ADdzk4ejtXFsGqDpATP9JoL0OB+hiFQbkdE=
-github.com/tailscale/wireguard-go v0.0.0-20210120212909-7ad8a0443bd3 h1:wpgSErXul2ysBGZVVM0fKISMgZ9BZRXuOYAyn8MxAbY=
-github.com/tailscale/wireguard-go v0.0.0-20210120212909-7ad8a0443bd3/go.mod h1:K/wyv4+3PcdVVTV7szyoiEjJ1nVHonM8cJ2mQwG5Fl8=
-github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ04I0=
-github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8=
-github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
-github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
-github.com/tetafro/godot v1.3.0/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0=
-github.com/tetafro/godot v1.3.2/go.mod h1:ah7jjYmOMnIjS9ku2krapvGQrFNtTLo9Z/qB3dGU1eU=
-github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
-github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/tomarrell/wrapcheck v0.0.0-20200807122107-df9e8bcb914d/go.mod h1:yiFB6fFoV7saXirUGfuK+cPtUh4NX/Hf5y2WC2lehu0=
-github.com/tomarrell/wrapcheck v0.0.0-20201130113247-1683564d9756/go.mod h1:yiFB6fFoV7saXirUGfuK+cPtUh4NX/Hf5y2WC2lehu0=
-github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig=
-github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM=
-github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
-github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
-github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA=
-github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM=
-github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA=
-github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY=
-github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
-github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
-github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
-github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/ziutek/telnet v0.0.0-20180329124119-c3b780dc415b/go.mod h1:IZpXDfkJ6tWD3PhBK5YzgQT+xJWh7OsdwiG8hA2MkO4=
-go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go4.org/intern v0.0.0-20201223054237-ef8cbcb8edd7/go.mod h1:vLqJ+12kCw61iCWsPto0EOHhBS+o4rO5VIucbc9g2Cc=
-go4.org/intern v0.0.0-20201223061701-969c7e87e7cb/go.mod h1:vLqJ+12kCw61iCWsPto0EOHhBS+o4rO5VIucbc9g2Cc=
-go4.org/intern v0.0.0-20210108033219-3eb7198706b2 h1:VFTf+jjIgsldaz/Mr00VaCSswHJrI2hIjQygE/W4IMg=
-go4.org/intern v0.0.0-20210108033219-3eb7198706b2/go.mod h1:vLqJ+12kCw61iCWsPto0EOHhBS+o4rO5VIucbc9g2Cc=
-go4.org/mem v0.0.0-20201119185036-c04c5a6ff174 h1:vSug/WNOi2+4jrKdivxayTN/zd8EA1UrStjpWvvo1jk=
-go4.org/mem v0.0.0-20201119185036-c04c5a6ff174/go.mod h1:reUoABIJ9ikfM5sgtSF3Wushcza7+WeD01VB9Lirh3g=
-go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222175341-b30ae309168e/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
-go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063 h1:1tk03FUNpulq2cuWpXZWj649rwJpk0d20rxWiopKRmc=
-go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI=
-golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
-golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-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=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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-20190221075227-b4e8571b14e0/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-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-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-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-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201109165425-215b40eba54c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201118182958-a01c418693c7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201218084310-7d0127a74742/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210123111255-9b0068b26619/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210216163648-f7da38b97c65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
-golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7-0.20210524175448-3115f89c4b99/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 h1:Vv0JUPWTyeqUq42B2WJ1FeIDjjvGKoA2Ss+Ts0lAVbs=
-golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
-golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
-golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
-golang.org/x/tools v0.0.0-20201007032633-0806396f153e/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
-golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
-golang.org/x/tools v0.0.0-20201013201025-64a9e34f3752/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
-golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201121010211-780cb80bd7fb/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.zx2c4.com/wireguard v0.0.0-20210624150102-15b24b6179e0 h1:qINUmOnDCCF7i14oomDDkGmlda7BSDTGfge77/aqdfk=
-golang.zx2c4.com/wireguard v0.0.0-20210624150102-15b24b6179e0/go.mod h1:laHzsbfMhGSobUmruXWAyMKKHSqvIcrqZJMyHD+/3O8=
-golang.zx2c4.com/wireguard/windows v0.3.16 h1:S42i0kp3SFHZm1mMFTtiU3OnEQJ0GRVOVlMkBhSDTZI=
-golang.zx2c4.com/wireguard/windows v0.3.16/go.mod h1:f80rkFY2CKQklps1GHE15k/M4Tq78aofbr1iQM5MTVY=
-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY=
-honnef.co/go/tools v0.1.4/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
-inet.af/netaddr v0.0.0-20201228234250-33d0a924ebbf/go.mod h1:9NdhtHLglxJliAZB6aC5ws3mfnUArdAzHG/iJq7cB/o=
-inet.af/netaddr v0.0.0-20210515010201-ad03edc7c841/go.mod h1:z0nx+Dh+7N7CC8V5ayHtHGpZpxLQZZxkIaaz6HN65Ls=
-inet.af/netaddr v0.0.0-20210721214506-ce7a8ad02cc1 h1:mxmfTV6kjXTlFqqFETnG9FQZzNFc6AKunZVAgQ3b7WA=
-inet.af/netaddr v0.0.0-20210721214506-ce7a8ad02cc1/go.mod h1:z0nx+Dh+7N7CC8V5ayHtHGpZpxLQZZxkIaaz6HN65Ls=
-inet.af/netstack v0.0.0-20210622165351-29b14ebc044e h1:z11NK94NQcI3DA+a3pUC/2dRYTph1kPX6B0FnCaMDzk=
-inet.af/netstack v0.0.0-20210622165351-29b14ebc044e/go.mod h1:fG3G1dekmK8oDX3iVzt8c0zICLMLSN8SjdxbXVt0WjU=
-inet.af/peercred v0.0.0-20210318190834-4259e17bb763/go.mod h1:FjawnflS/udxX+SvpsMgZfdqx2aykOlkISeAsADi5IU=
-inet.af/wf v0.0.0-20210516214145-a5343001b756/go.mod h1:ViGMZRA6+RA318D7GCncrjv5gHUrPYrNDejjU12tikA=
-mvdan.cc/gofumpt v0.0.0-20200802201014-ab5a8192947d/go.mod h1:bzrjFmaD6+xqohD3KYP0H2FEuxknnBmyyOxdhLdaIws=
-mvdan.cc/gofumpt v0.0.0-20201129102820-5c11c50e9475/go.mod h1:E4LOcu9JQEtnYXtB1Y51drqh2Qr2Ngk9J3YrRCwcbd0=
-mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
-mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
-mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc=
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/goversion v1.2.0 h1:SPn+NLTiAG7w30IRK/DKp1BjvpWabYgxlLp/+kx5J8w=
-rsc.io/goversion v1.2.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo=
-tailscale.com v1.12.1 h1:SjTfXwub5IV7+8D7n/ZXc3/+Z0EqBI9L3HhvysNCnvw=
-tailscale.com v1.12.1/go.mod h1:z4pZTL6lHgfm9sbFwIp3/H0fJzlUWGccbmLPE75PUMc=
diff --git a/core/vpn/in_memory_manager.go b/core/vpn/in_memory_manager.go
deleted file mode 100644
index 5237cfa..0000000
--- a/core/vpn/in_memory_manager.go
+++ /dev/null
@@ -1,248 +0,0 @@
-package vpn
-
-import (
- "fmt"
- "strconv"
- "sync"
-
- "github.com/giolekva/pcloud/core/vpn/types"
-)
-
-func errorDeviceNotFound(pubKey types.PublicKey) error {
- return fmt.Errorf("Device not found: %s", pubKey)
-}
-
-func errorGroupNotFound(id types.GroupID) error {
- return fmt.Errorf("Group not found: %s", id)
-}
-
-type InMemoryManager struct {
- lock sync.Mutex
- devices []*types.DeviceInfo
- keyToDevices map[types.PublicKey]*types.DeviceInfo
- currGroupID int64
- groups map[types.GroupID]*types.Group
- deviceToGroups map[types.PublicKey][]*types.Group
- callbacks map[types.PublicKey][]NetworkMapChangeCallback
- ipm IPManager
-}
-
-func NewInMemoryManager(ipm IPManager) Manager {
- return &InMemoryManager{
- devices: make([]*types.DeviceInfo, 0),
- keyToDevices: make(map[types.PublicKey]*types.DeviceInfo),
- callbacks: make(map[types.PublicKey][]NetworkMapChangeCallback),
- currGroupID: 0,
- groups: make(map[types.GroupID]*types.Group),
- deviceToGroups: make(map[types.PublicKey][]*types.Group),
- ipm: ipm,
- }
-}
-
-func (m *InMemoryManager) RegisterDevice(d types.DeviceInfo) error {
- m.lock.Lock()
- defer m.lock.Unlock()
- if _, ok := m.keyToDevices[d.PublicKey]; ok {
- return fmt.Errorf("Device with given public key is already registered: %s", d.PublicKey)
- }
- if _, err := m.ipm.New(d.PublicKey); err != nil {
- return err
- }
- m.keyToDevices[d.PublicKey] = &d
- m.devices = append(m.devices, &d)
- m.callbacks[d.PublicKey] = make([]NetworkMapChangeCallback, 0)
- m.deviceToGroups[d.PublicKey] = make([]*types.Group, 0)
- return nil
-}
-
-func (m *InMemoryManager) RemoveDevice(pubKey types.PublicKey) error {
- m.lock.Lock()
- defer m.lock.Unlock()
- if _, ok := m.keyToDevices[pubKey]; !ok {
- return errorDeviceNotFound(pubKey)
- }
- for _, g := range m.deviceToGroups[pubKey] {
- m.removeDeviceFromGroupNoLock(pubKey, g.ID)
- }
- delete(m.deviceToGroups, pubKey)
- delete(m.callbacks, pubKey)
- found := false
- for i, peer := range m.devices {
- if peer.PublicKey == pubKey {
- m.devices[i] = m.devices[len(m.devices)-1]
- m.devices = m.devices[:len(m.devices)-1]
- found = true
- break
- }
- }
- if !found {
- panic("MUST not happen, device not found")
- }
- delete(m.keyToDevices, pubKey) // TODO(giolekva): maybe mark as deleted?
- return nil
-}
-
-func (m *InMemoryManager) CreateGroup(name string) (types.GroupID, error) {
- m.lock.Lock()
- defer m.lock.Unlock()
- id := types.GroupID(strconv.FormatInt(m.currGroupID, 10))
- m.groups[id] = &types.Group{
- ID: id,
- Name: name,
- Peers: make([]*types.DeviceInfo, 0),
- }
- m.currGroupID++
- return id, nil
-}
-
-func (m *InMemoryManager) DeleteGroup(id types.GroupID) error {
- m.lock.Lock()
- defer m.lock.Unlock()
- g, ok := m.groups[id]
- if !ok {
- return errorGroupNotFound(id)
- }
- // TODO(giolekva): optimize, current implementation calls callbacks group size squared times.
- for _, peer := range g.Peers {
- if _, err := m.removeDeviceFromGroupNoLock(peer.PublicKey, id); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (m *InMemoryManager) AddDeviceToGroup(pubKey types.PublicKey, id types.GroupID) (*types.NetworkMap, error) {
- m.lock.Lock()
- defer m.lock.Unlock()
- d, ok := m.keyToDevices[pubKey]
- if !ok {
- return nil, errorDeviceNotFound(pubKey)
- }
- g, ok := m.groups[id]
- if !ok {
- return nil, errorGroupNotFound(id)
- }
- groups, ok := m.deviceToGroups[pubKey]
- if !ok {
- groups = make([]*types.Group, 1)
- }
- // TODO(giolekva): Check if device is already in the group and return error if so.
- g.Peers = append(g.Peers, d)
- groups = append(groups, g)
- m.deviceToGroups[pubKey] = groups
- ret, err := m.genNetworkMap(d)
- m.notifyPeers(d, g)
- return ret, err
-}
-
-func (m *InMemoryManager) RemoveDeviceFromGroup(pubKey types.PublicKey, id types.GroupID) (*types.NetworkMap, error) {
- m.lock.Lock()
- defer m.lock.Unlock()
- return m.removeDeviceFromGroupNoLock(pubKey, id)
-}
-
-func (m *InMemoryManager) removeDeviceFromGroupNoLock(pubKey types.PublicKey, id types.GroupID) (*types.NetworkMap, error) {
- d, ok := m.keyToDevices[pubKey]
- if !ok {
- return nil, errorDeviceNotFound(pubKey)
- }
- g, ok := m.groups[id]
- if !ok {
- return nil, errorGroupNotFound(id)
- }
- groups := m.deviceToGroups[pubKey]
- found := false
- for i, group := range groups {
- if id == group.ID {
- groups[i] = groups[len(groups)-1]
- groups = groups[:len(groups)-1]
- m.deviceToGroups[pubKey] = groups
- found = true
- break
- }
- }
- if !found {
- return nil, fmt.Errorf("Device %s is not part of the group %s", pubKey, id)
- }
- found = false
- for i, peer := range g.Peers {
- if pubKey == peer.PublicKey {
- g.Peers[i] = g.Peers[len(g.Peers)-1]
- g.Peers = g.Peers[:len(g.Peers)-1]
- found = true
- }
- }
- if !found {
- panic("Should not reach")
- }
- m.notifyPeers(d, g)
- return m.genNetworkMap(d)
-}
-
-func (m *InMemoryManager) GetNetworkMap(pubKey types.PublicKey) (*types.NetworkMap, error) {
- m.lock.Lock()
- defer m.lock.Unlock()
- if d, ok := m.keyToDevices[pubKey]; ok {
- return m.genNetworkMap(d)
- }
- return nil, errorDeviceNotFound(pubKey)
-}
-
-func (m *InMemoryManager) AddNetworkMapChangeCallback(pubKey types.PublicKey, cb NetworkMapChangeCallback) error {
- m.lock.Lock()
- defer m.lock.Unlock()
- if _, ok := m.keyToDevices[pubKey]; ok {
- m.callbacks[pubKey] = append(m.callbacks[pubKey], cb)
- }
- return errorDeviceNotFound(pubKey)
-}
-
-func (m *InMemoryManager) notifyPeers(d *types.DeviceInfo, g *types.Group) {
- // TODO(giolekva): maybe run this in a goroutine?
- for _, peer := range g.Peers {
- if peer.PublicKey != d.PublicKey {
- netMap, err := m.genNetworkMap(peer)
- if err != nil {
- panic(err) // TODO(giolekva): handle properly
- }
- for _, cb := range m.callbacks[peer.PublicKey] {
- cb(netMap)
- }
- }
- }
-}
-
-func (m *InMemoryManager) genNetworkMap(d *types.DeviceInfo) (*types.NetworkMap, error) {
- vpnIP, err := m.ipm.Get(d.PublicKey)
- // NOTE(giolekva): Should not happen as devices must have been already registered and assigned IP address.
- // Maybe should return error anyways instead of panic?
- if err != nil {
- return nil, err
- }
- ret := types.NetworkMap{
- Self: types.Node{
- PublicKey: d.PublicKey,
- DiscoKey: d.DiscoKey,
- IPPort: d.IPPort,
- VPNIP: vpnIP,
- },
- }
- for _, group := range m.deviceToGroups[d.PublicKey] {
- for _, peer := range group.Peers {
- if d.PublicKey == peer.PublicKey {
- continue
- }
- vpnIP, err := m.ipm.Get(peer.PublicKey)
- if err != nil {
- panic(err)
- }
- ret.Peers = append(ret.Peers, types.Node{
- PublicKey: peer.PublicKey,
- DiscoKey: peer.DiscoKey,
- IPPort: peer.IPPort,
- VPNIP: vpnIP,
- })
- }
- }
- return &ret, nil
-}
diff --git a/core/vpn/in_memory_manager_test.go b/core/vpn/in_memory_manager_test.go
deleted file mode 100644
index 3e3f258..0000000
--- a/core/vpn/in_memory_manager_test.go
+++ /dev/null
@@ -1,99 +0,0 @@
-package vpn
-
-import (
- "log"
- "testing"
-
- "inet.af/netaddr"
- "tailscale.com/ipn/ipnstate"
-
- "github.com/giolekva/pcloud/core/vpn/engine"
- "github.com/giolekva/pcloud/core/vpn/types"
-)
-
-// TODO(giolekva): split into multiple smaller tests
-func TestTwoPeers(t *testing.T) {
- ipm := NewSequentialIPManager(netaddr.MustParseIP("10.0.0.1"))
- m := NewInMemoryManager(ipm)
- groupId, err := m.CreateGroup("test")
- if err != nil {
- t.Fatal(err)
- }
- privKeyA := types.NewPrivateKey()
- a, err := engine.NewFakeWireguardEngine(12345, privKeyA)
- if err != nil {
- t.Fatal(err)
- }
- privKeyB := types.NewPrivateKey()
- b, err := engine.NewFakeWireguardEngine(12346, privKeyB)
- if err != nil {
- t.Fatal(err)
- }
- err = m.RegisterDevice(types.DeviceInfo{
- privKeyA.Public(),
- a.DiscoKey(),
- netaddr.MustParseIPPort("127.0.0.1:12345"),
- })
- if err != nil {
- t.Fatal(err)
- }
- m.AddNetworkMapChangeCallback(privKeyA.Public(), func(nm *types.NetworkMap) {
- log.Printf("a: Received new NetworkMap: %+v\n", nm)
- if err := a.Configure(nm); err != nil {
- t.Fatal(err)
- }
- })
- err = m.RegisterDevice(types.DeviceInfo{
- privKeyB.Public(),
- b.DiscoKey(),
- netaddr.MustParseIPPort("127.0.0.1:12346"),
- })
- if err != nil {
- t.Fatal(err)
- }
- m.AddNetworkMapChangeCallback(privKeyB.Public(), func(nm *types.NetworkMap) {
- log.Printf("b: Received new NetworkMap: %+v\n", nm)
- if err := b.Configure(nm); err != nil {
- t.Fatal(err)
- }
- })
- nma, err := m.AddDeviceToGroup(privKeyA.Public(), groupId)
- if err != nil {
- t.Fatal(err)
- }
- if err := a.Configure(nma); err != nil {
- t.Fatal(err)
- }
- nmb, err := m.AddDeviceToGroup(privKeyB.Public(), groupId)
- if err != nil {
- t.Fatal(err)
- }
- if err := b.Configure(nmb); err != nil {
- t.Fatal(err)
- }
- ping := make(chan *ipnstate.PingResult, 2)
- pingCb := func(p *ipnstate.PingResult) {
- ping <- p
- }
- a.Ping(nmb.Self.VPNIP, pingCb)
- b.Ping(nma.Self.VPNIP, pingCb)
- for i := 0; i < 2; i++ {
- p := <-ping
- if p.Err != "" {
- t.Error(p.Err)
- } else {
- log.Printf("Ping received: %+v\n", p)
- }
- }
- if err := m.RemoveDevice(privKeyA.Public()); err != nil {
- t.Fatal(err)
- }
- b.Ping(nma.Self.VPNIP, pingCb)
- p := <-ping
- if p.Err == "" {
- t.Fatalf("Ping received even after removing device: %+v", p)
- }
- if err := m.DeleteGroup(groupId); err != nil {
- t.Fatal(err)
- }
-}
diff --git a/core/vpn/ip_manager.go b/core/vpn/ip_manager.go
deleted file mode 100644
index 6758f3e..0000000
--- a/core/vpn/ip_manager.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package vpn
-
-import (
- "fmt"
-
- "github.com/giolekva/pcloud/core/vpn/types"
-
- "inet.af/netaddr"
-)
-
-// TODO(giolekva): Add Disable method which marks given IP as non-usable for future.
-// It will be used when devices get removed from the network, in which case IP should not be reused for safety reasons.
-type IPManager interface {
- New(pubKey types.PublicKey) (netaddr.IP, error)
- Get(pubKey types.PublicKey) (netaddr.IP, error)
-}
-
-type SequentialIPManager struct {
- cur netaddr.IP
- keyToIP map[types.PublicKey]netaddr.IP
-}
-
-func NewSequentialIPManager(start netaddr.IP) IPManager {
- return &SequentialIPManager{
- cur: start,
- keyToIP: make(map[types.PublicKey]netaddr.IP),
- }
-}
-
-func (m *SequentialIPManager) New(pubKey types.PublicKey) (netaddr.IP, error) {
- ip := m.cur
- if _, ok := m.keyToIP[pubKey]; ok {
- return netaddr.IP{}, fmt.Errorf("Device with public key %s has already been assigned IP", pubKey)
- }
- m.keyToIP[pubKey] = ip
- m.cur = m.cur.Next()
- return ip, nil
-}
-
-func (m *SequentialIPManager) Get(pubKey types.PublicKey) (netaddr.IP, error) {
- if ip, ok := m.keyToIP[pubKey]; ok {
- return ip, nil
- }
- return netaddr.IP{}, fmt.Errorf("Device with public key %s pubKey does not have VPN IP assigned.", pubKey)
-}
diff --git a/core/vpn/ip_manager_test.go b/core/vpn/ip_manager_test.go
deleted file mode 100644
index 3a09569..0000000
--- a/core/vpn/ip_manager_test.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package vpn
-
-import (
- "log"
- "testing"
-
- "github.com/giolekva/pcloud/core/vpn/types"
- "inet.af/netaddr"
-)
-
-func TestNewGet(t *testing.T) {
- m := NewSequentialIPManager(netaddr.MustParseIP("10.0.0.1"))
- a := types.NewPrivateKey()
- b := types.NewPrivateKey()
- ipA, err := m.New(a.Public())
- if err != nil {
- log.Fatal(err)
- }
- if ipA.String() != "10.0.0.1" {
- t.Fatalf("Expected 10.0.0.1 Got: %s", ipA.String())
- }
- ipA, err = m.Get(a.Public())
- if err != nil {
- log.Fatal(err)
- }
- if ipA.String() != "10.0.0.1" {
- t.Fatalf("Expected 10.0.0.1 Got: %s", ipA.String())
- }
- ipB, err := m.New(b.Public())
- if err != nil {
- log.Fatal(err)
- }
- if ipB.String() != "10.0.0.2" {
- t.Fatalf("Expected 10.0.0.2 Got: %s", ipB.String())
- }
- ipB, err = m.Get(b.Public())
- if err != nil {
- log.Fatal(err)
- }
- if ipB.String() != "10.0.0.2" {
- t.Fatalf("Expected 10.0.0.2 Got: %s", ipB.String())
- }
-
-}
-
-func TestGetNonExistentPublicKey(t *testing.T) {
- m := NewSequentialIPManager(netaddr.MustParseIP("10.0.0.1"))
- a := types.NewPrivateKey()
- if _, err := m.Get(a.Public()); err == nil {
- t.Fatal("Returned IP for non existent public key")
- }
-}
diff --git a/core/vpn/manager.go b/core/vpn/manager.go
deleted file mode 100644
index d0d3ef0..0000000
--- a/core/vpn/manager.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package vpn
-
-import (
- "github.com/giolekva/pcloud/core/vpn/types"
-)
-
-type NetworkMapChangeCallback func(*types.NetworkMap)
-
-// Manager interface manages mesh VPN configuration for all the devices registed by all users.
-// It does enforce device to device ACLs but delegates user authorization to the client.
-type Manager interface {
- // Registers new device.
- // Returns VPN network configuration on success and error otherwise.
- // By default new devices have access to other machines owned by the same user
- // and a PCloud entrypoint.
- RegisterDevice(d types.DeviceInfo) error
- // Completely removes device with given public key from the network.
- RemoveDevice(pubKey types.PublicKey) error
- // Creates new group with given name and returns it's id.
- // Name does not have to be unique.
- CreateGroup(name string) (types.GroupID, error)
- // Deletes group with given id.
- DeleteGroup(id types.GroupID) error
- // Adds device with given public key to the group and returns updated network configuration.
- AddDeviceToGroup(pubKey types.PublicKey, id types.GroupID) (*types.NetworkMap, error)
- // Removes device from the group and returns updated network configuration.
- RemoveDeviceFromGroup(pubKey types.PublicKey, id types.GroupID) (*types.NetworkMap, error)
- // Returns network configuration for a device with a given public key.
- // Result of this call must be encrypted with the same public key before
- // sending it back to the client, so only the owner of it's corresponding
- // private key is able to decrypt and use it.
- GetNetworkMap(pubKey types.PublicKey) (*types.NetworkMap, error)
- // AddNetworkMapChangeCallback can be used to receive new network configurations
- // for a device with given public key.
- AddNetworkMapChangeCallback(pubKey types.PublicKey, cb NetworkMapChangeCallback) error
-}
diff --git a/core/vpn/types/key.go b/core/vpn/types/key.go
deleted file mode 100644
index 7a530df..0000000
--- a/core/vpn/types/key.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package types
-
-import (
- "tailscale.com/types/key"
-)
-
-// Generates new private key.
-func NewPrivateKey() PrivateKey {
- return PrivateKey(key.NewPrivate())
-}
-
-// Returns public coutnerpart of the given private key.
-func (k PrivateKey) Public() PublicKey {
- return PublicKey(key.Private(k).Public())
-}
diff --git a/core/vpn/types/types.go b/core/vpn/types/types.go
deleted file mode 100644
index 3da8513..0000000
--- a/core/vpn/types/types.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package types
-
-import (
- "github.com/tailscale/wireguard-go/wgcfg"
- "inet.af/netaddr"
-)
-
-// Private key of the client.
-// MUST never leave the device it was generated on.
-type PrivateKey wgcfg.PrivateKey
-
-// Corresponding public key of the device.
-type PublicKey wgcfg.Key
-
-//Public discovery key of the device.
-type DiscoKey wgcfg.Key
-
-// Unique group identifier.
-type GroupID string
-
-type DeviceInfo struct {
- PublicKey PublicKey
- DiscoKey DiscoKey
- IPPort netaddr.IPPort
-}
-
-type Group struct {
- ID GroupID
- Name string
- Peers []*DeviceInfo
-}
-
-// Represents single node in the network.
-type Node struct {
- PublicKey PublicKey
- DiscoKey DiscoKey
- IPPort netaddr.IPPort
- VPNIP netaddr.IP
-}
-
-type NetworkMap struct {
- Self Node
- Peers []Node
-}
diff --git a/scripts/ds-overlaytest.yaml b/scripts/ds-overlaytest.yaml
deleted file mode 100644
index 6a2476d..0000000
--- a/scripts/ds-overlaytest.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-apiVersion: apps/v1
-kind: DaemonSet
-metadata:
- name: overlaytest
-spec:
- selector:
- matchLabels:
- name: overlaytest
- template:
- metadata:
- labels:
- name: overlaytest
- spec:
- tolerations:
- - operator: Exists
- containers:
- - image: busybox:1.28
- imagePullPolicy: Always
- name: busybox
- command: ["sh", "-c", "tail -f /dev/null"]
- terminationMessagePath: /dev/termination-log
diff --git a/scripts/goofys.sh b/scripts/goofys.sh
deleted file mode 100644
index 598d090..0000000
--- a/scripts/goofys.sh
+++ /dev/null
@@ -1 +0,0 @@
-goofys -f --debug_fuse --debug_s3 --profile mio --endpoint http://localhost:9000 my-test tmp/mio-test
diff --git a/scripts/homelab/authorized_keys b/scripts/homelab/authorized_keys
deleted file mode 100644
index 6f9d19c..0000000
--- a/scripts/homelab/authorized_keys
+++ /dev/null
@@ -1,5 +0,0 @@
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICt/rv/rpYQwqZWDyeaawvkDVQSYlciMQ7h0F7YlYu+p pcloud@rpi111
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOWBTWdkCzE/wwGvDl4rNHlwnboswgSTjmOsfeqdHfgl pcloud@rpi112
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAUwOoo9JoV7rdSamjIPQUu1XWwOjnmbj8e4OMnRTNc9 pcloud@rpi113
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAWpwC256L5A5XzL6IqO3mHpHCJrFyjyP/gt/UhrUH4c pcloud@rpi114
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBbMNLwf7yGluwSrUv2YcAbBqFQW6fBgGAS7HJLcqfRI pcloud@rpi116
diff --git a/scripts/homelab/installer/lighthouse-node.yaml b/scripts/homelab/installer/lighthouse-node.yaml
deleted file mode 100644
index c286f91..0000000
--- a/scripts/homelab/installer/lighthouse-node.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-apiVersion: lekva.me/v1
-kind: NebulaCA
-metadata:
- name: pcloud
- namespace: ingress-nginx-private
-spec:
- secretName: ca-pcloud-cert
----
-apiVersion: lekva.me/v1
-kind: NebulaNode
-metadata:
- name: lighthouse
- namespace: ingress-nginx-private
-spec:
- caName: pcloud
- caNamespace: ingress-nginx-private
- ipCidr: "111.0.0.1/24"
- secretName: node-lighthouse-cert
diff --git a/scripts/homelab/installer/lighthouse.yaml b/scripts/homelab/installer/lighthouse.yaml
deleted file mode 100644
index 8c0f373..0000000
--- a/scripts/homelab/installer/lighthouse.yaml
+++ /dev/null
@@ -1,246 +0,0 @@
-# This is the nebula example configuration file. You must edit, at a minimum, the static_host_map, lighthouse, and firewall sections
-# Some options in this file are HUPable, including the pki section. (A HUP will reload credentials from disk without affecting existing tunnels)
-
-# PKI defines the location of credentials for this node. Each of these can also be inlined by using the yaml ": |" syntax.
-pki:
- # The CAs that are accepted by this node. Must contain one or more certificates created by 'nebula-cert ca'
- ##ca: /etc/nebula/ca/ca.crt
- ca: /etc/nebula/lighthouse/ca.crt
- cert: /etc/nebula/lighthouse/host.crt
- key: /etc/nebula/lighthouse/host.key
- #blocklist is a list of certificate fingerprints that we will refuse to talk to
- #blocklist:
- # - c99d4e650533b92061b09918e838a5a0a6aaee21eed1d12fd937682865936c72
-
-# The static host map defines a set of hosts with fixed IP addresses on the internet (or any network).
-# A host can have multiple fixed IP addresses defined here, and nebula will try each when establishing a tunnel.
-# The syntax is:
-# "{nebula ip}": ["{routable ip/dns name}:{routable port}"]
-# Example, if your lighthouse has the nebula IP of 192.168.100.1 and has the real ip address of 100.64.22.11 and runs on port 4242:
-static_host_map:
- "111.0.0.1": ["46.49.35.44:4242"]
-
-
-lighthouse:
- # am_lighthouse is used to enable lighthouse functionality for a node. This should ONLY be true on nodes
- # you have configured to be lighthouses in your network
- am_lighthouse: true
- # serve_dns optionally starts a dns listener that responds to various queries and can even be
- # delegated to for resolution
- #serve_dns: false
- #dns:
- # The DNS host defines the IP to bind the dns listener to. This also allows binding to the nebula node IP.
- #host: 0.0.0.0
- #port: 53
- # interval is the number of seconds between updates from this node to a lighthouse.
- # during updates, a node sends information about its current IP addresses to each node.
- interval: 60
- # hosts is a list of lighthouse hosts this node should report to and query from
- # IMPORTANT: THIS SHOULD BE EMPTY ON LIGHTHOUSE NODES
- # IMPORTANT2: THIS SHOULD BE LIGHTHOUSES' NEBULA IPs, NOT LIGHTHOUSES' REAL ROUTABLE IPs
- hosts:
- # - "111.0.0.1"
-
- # remote_allow_list allows you to control ip ranges that this node will
- # consider when handshaking to another node. By default, any remote IPs are
- # allowed. You can provide CIDRs here with `true` to allow and `false` to
- # deny. The most specific CIDR rule applies to each remote. If all rules are
- # "allow", the default will be "deny", and vice-versa. If both "allow" and
- # "deny" rules are present, then you MUST set a rule for "0.0.0.0/0" as the
- # default.
- #remote_allow_list:
- # Example to block IPs from this subnet from being used for remote IPs.
- #"172.16.0.0/12": false
-
- # A more complicated example, allow public IPs but only private IPs from a specific subnet
- #"0.0.0.0/0": true
- #"10.0.0.0/8": false
- #"10.42.42.0/24": true
-
- # local_allow_list allows you to filter which local IP addresses we advertise
- # to the lighthouses. This uses the same logic as `remote_allow_list`, but
- # additionally, you can specify an `interfaces` map of regular expressions
- # to match against interface names. The regexp must match the entire name.
- # All interface rules must be either true or false (and the default will be
- # the inverse). CIDR rules are matched after interface name rules.
- # Default is all local IP addresses.
- #local_allow_list:
- # Example to block tun0 and all docker interfaces.
- #interfaces:
- #tun0: false
- #'docker.*': false
- # Example to only advertise this subnet to the lighthouse.
- #"10.0.0.0/8": true
-
-# Port Nebula will be listening on. The default here is 4242. For a lighthouse node, the port should be defined,
-# however using port 0 will dynamically assign a port and is recommended for roaming nodes.
-listen:
- # To listen on both any ipv4 and ipv6 use "[::]"
- host: "[::]"
- port: 4242
- # Sets the max number of packets to pull from the kernel for each syscall (under systems that support recvmmsg)
- # default is 64, does not support reload
- #batch: 64
- # Configure socket buffers for the udp side (outside), leave unset to use the system defaults. Values will be doubled by the kernel
- # Default is net.core.rmem_default and net.core.wmem_default (/proc/sys/net/core/rmem_default and /proc/sys/net/core/rmem_default)
- # Maximum is limited by memory in the system, SO_RCVBUFFORCE and SO_SNDBUFFORCE is used to avoid having to raise the system wide
- # max, net.core.rmem_max and net.core.wmem_max
- #read_buffer: 10485760
- #write_buffer: 10485760
-
-# EXPERIMENTAL: This option is currently only supported on linux and may
-# change in future minor releases.
-#
-# Routines is the number of thread pairs to run that consume from the tun and UDP queues.
-# Currently, this defaults to 1 which means we have 1 tun queue reader and 1
-# UDP queue reader. Setting this above one will set IFF_MULTI_QUEUE on the tun
-# device and SO_REUSEPORT on the UDP socket to allow multiple queues.
-#routines: 1
-
-punchy:
- # Continues to punch inbound/outbound at a regular interval to avoid expiration of firewall nat mappings
- punch: true
-
- # respond means that a node you are trying to reach will connect back out to you if your hole punching fails
- # this is extremely useful if one node is behind a difficult nat, such as a symmetric NAT
- # Default is false
- #respond: true
-
- # delays a punch response for misbehaving NATs, default is 1 second, respond must be true to take effect
- #delay: 1s
-
-# Cipher allows you to choose between the available ciphers for your network. Options are chachapoly or aes
-# IMPORTANT: this value must be identical on ALL NODES/LIGHTHOUSES. We do not/will not support use of different ciphers simultaneously!
-cipher: chachapoly
-
-# Local range is used to define a hint about the local network range, which speeds up discovering the fastest
-# path to a network adjacent nebula node.
-#local_range: "172.16.0.0/24"
-
-# sshd can expose informational and administrative functions via ssh this is a
-#sshd:
- # Toggles the feature
- #enabled: true
- # Host and port to listen on, port 22 is not allowed for your safety
- #listen: 127.0.0.1:2222
- # A file containing the ssh host private key to use
- # A decent way to generate one: ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N "" < /dev/null
- #host_key: ./ssh_host_ed25519_key
- # A file containing a list of authorized public keys
- #authorized_users:
- #- user: steeeeve
- # keys can be an array of strings or single string
- #keys:
- #- "ssh public key string"
-
-# Configure the private interface. Note: addr is baked into the nebula certificate
-tun:
- # When tun is disabled, a lighthouse can be started without a local tun interface (and therefore without root)
- disabled: false
- # Name of the device
- dev: nebula1
- # Toggles forwarding of local broadcast packets, the address of which depends on the ip/mask encoded in pki.cert
- drop_local_broadcast: false
- # Toggles forwarding of multicast packets
- drop_multicast: false
- # Sets the transmit queue length, if you notice lots of transmit drops on the tun it may help to raise this number. Default is 500
- tx_queue: 500
- # Default MTU for every packet, safe setting is (and the default) 1300 for internet based traffic
- mtu: 1300
- # Route based MTU overrides, you have known vpn ip paths that can support larger MTUs you can increase/decrease them here
- routes:
- #- mtu: 8800
- # route: 10.0.0.0/16
- # Unsafe routes allows you to route traffic over nebula to non-nebula nodes
- # Unsafe routes should be avoided unless you have hosts/services that cannot run nebula
- # NOTE: The nebula certificate of the "via" node *MUST* have the "route" defined as a subnet in its certificate
- unsafe_routes:
- #- route: 172.16.1.0/24
- # via: 192.168.100.99
- # mtu: 1300 #mtu will default to tun mtu if this option is not sepcified
-
-
-# TODO
-# Configure logging level
-logging:
- # panic, fatal, error, warning, info, or debug. Default is info
- level: info
- # json or text formats currently available. Default is text
- format: text
- # Disable timestamp logging. useful when output is redirected to logging system that already adds timestamps. Default is false
- #disable_timestamp: true
- # timestamp format is specified in Go time format, see:
- # https://golang.org/pkg/time/#pkg-constants
- # default when `format: json`: "2006-01-02T15:04:05Z07:00" (RFC3339)
- # default when `format: text`:
- # when TTY attached: seconds since beginning of execution
- # otherwise: "2006-01-02T15:04:05Z07:00" (RFC3339)
- # As an example, to log as RFC3339 with millisecond precision, set to:
- #timestamp_format: "2006-01-02T15:04:05.000Z07:00"
-
-#stats:
- #type: graphite
- #prefix: nebula
- #protocol: tcp
- #host: 127.0.0.1:9999
- #interval: 10s
-
- #type: prometheus
- #listen: 127.0.0.1:8080
- #path: /metrics
- #namespace: prometheusns
- #subsystem: nebula
- #interval: 10s
-
- # enables counter metrics for meta packets
- # e.g.: `messages.tx.handshake`
- # NOTE: `message.{tx,rx}.recv_error` is always emitted
- #message_metrics: false
-
- # enables detailed counter metrics for lighthouse packets
- # e.g.: `lighthouse.rx.HostQuery`
- #lighthouse_metrics: false
-
-# Handshake Manager Settings
-#handshakes:
- # Handshakes are sent to all known addresses at each interval with a linear backoff,
- # Wait try_interval after the 1st attempt, 2 * try_interval after the 2nd, etc, until the handshake is older than timeout
- # A 100ms interval with the default 10 retries will give a handshake 5.5 seconds to resolve before timing out
- #try_interval: 100ms
- #retries: 20
- # trigger_buffer is the size of the buffer channel for quickly sending handshakes
- # after receiving the response for lighthouse queries
- #trigger_buffer: 64
-
-
-# Nebula security group configuration
-firewall:
- conntrack:
- tcp_timeout: 12m
- udp_timeout: 3m
- default_timeout: 10m
- max_connections: 100000
-
- # The firewall is default deny. There is no way to write a deny rule.
- # Rules are comprised of a protocol, port, and one or more of host, group, or CIDR
- # Logical evaluation is roughly: port AND proto AND (ca_sha OR ca_name) AND (host OR group OR groups OR cidr)
- # - port: Takes `0` or `any` as any, a single number `80`, a range `200-901`, or `fragment` to match second and further fragments of fragmented packets (since there is no port available).
- # code: same as port but makes more sense when talking about ICMP, TODO: this is not currently implemented in a way that works, use `any`
- # proto: `any`, `tcp`, `udp`, or `icmp`
- # host: `any` or a literal hostname, ie `test-host`
- # group: `any` or a literal group name, ie `default-group`
- # groups: Same as group but accepts a list of values. Multiple values are AND'd together and a certificate would have to contain all groups to pass
- # cidr: a CIDR, `0.0.0.0/0` is any.
- # ca_name: An issuing CA name
- # ca_sha: An issuing CA shasum
-
- outbound:
- # Allow all outbound traffic from this node
- - port: any
- proto: any
- host: any
-
- inbound:
- - port: any
- proto: any
- host: any
diff --git a/scripts/homelab/installer/nodes-infrastructure.yaml b/scripts/homelab/installer/nodes-infrastructure.yaml
deleted file mode 100644
index f10392e..0000000
--- a/scripts/homelab/installer/nodes-infrastructure.yaml
+++ /dev/null
@@ -1,275 +0,0 @@
-apiVersion: lekva.me/v1
-kind: NebulaNode
-metadata:
- name: rpi111
- namespace: ingress-nginx-private
-spec:
- caName: pcloud
- caNamespace: ingress-nginx-private
- ipCidr: "111.0.0.111/24"
- secretName: node-rpi111-cert
----
-apiVersion: lekva.me/v1
-kind: NebulaNode
-metadata:
- name: rpi112
- namespace: ingress-nginx-private
-spec:
- caName: pcloud
- caNamespace: ingress-nginx-private
- ipCidr: "111.0.0.112/24"
- secretName: node-rpi112-cert
----
-apiVersion: lekva.me/v1
-kind: NebulaNode
-metadata:
- name: rpi113
- namespace: ingress-nginx-private
-spec:
- caName: pcloud
- caNamespace: ingress-nginx-private
- ipCidr: "111.0.0.113/24"
- secretName: node-rpi113-cert
----
-apiVersion: lekva.me/v1
-kind: NebulaNode
-metadata:
- name: rpi114
- namespace: ingress-nginx-private
-spec:
- caName: pcloud
- caNamespace: ingress-nginx-private
- ipCidr: "111.0.0.114/24"
- secretName: node-rpi114-cert
----
-apiVersion: apps/v1
-kind: DaemonSet
-metadata:
- name: lighthouse-rpi111
- namespace: ingress-nginx-private
-spec:
- selector:
- matchLabels:
- app: lighthouse-rpi111
- template:
- metadata:
- labels:
- app: lighthouse-rpi111
- spec:
- restartPolicy: Always
- hostNetwork: true
- volumes:
- - name: cert
- secret:
- secretName: node-rpi111-cert
- - name: config
- configMap:
- name: nodes-lighthouse-config
- containers:
- - name: lighthouse
- image: giolekva/nebula:latest
- imagePullPolicy: IfNotPresent
- securityContext:
- capabilities:
- add: ["NET_ADMIN"]
- privileged: true
- ports:
- - name: lighthouse
- containerPort: 4242
- protocol: UDP
- command: ["nebula", "--config=/etc/nebula/config/nodes-lighthouse.yaml"]
- volumeMounts:
- - name: cert
- mountPath: /etc/nebula/lighthouse
- readOnly: true
- - name: config
- mountPath: /etc/nebula/config
- readOnly: true
- affinity:
- nodeAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
- nodeSelectorTerms:
- - matchExpressions:
- - key: kubernetes.io/hostname
- operator: In
- values:
- - rpi111
- tolerations:
- - key: "pcloud"
- operator: "Equal"
- value: "role"
- effect: "NoSchedule"
----
-apiVersion: apps/v1
-kind: DaemonSet
-metadata:
- name: lighthouse-rpi112
- namespace: ingress-nginx-private
-spec:
- selector:
- matchLabels:
- app: lighthouse-rpi112
- template:
- metadata:
- labels:
- app: lighthouse-rpi112
- spec:
- restartPolicy: Always
- hostNetwork: true
- volumes:
- - name: cert
- secret:
- secretName: node-rpi112-cert
- - name: config
- configMap:
- name: nodes-lighthouse-config
- containers:
- - name: lighthouse
- image: giolekva/nebula:latest
- imagePullPolicy: IfNotPresent
- securityContext:
- capabilities:
- add: ["NET_ADMIN"]
- privileged: true
- ports:
- - name: lighthouse
- containerPort: 4242
- protocol: UDP
- command: ["nebula", "--config=/etc/nebula/config/nodes-lighthouse.yaml"]
- volumeMounts:
- - name: cert
- mountPath: /etc/nebula/lighthouse
- readOnly: true
- - name: config
- mountPath: /etc/nebula/config
- readOnly: true
- affinity:
- nodeAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
- nodeSelectorTerms:
- - matchExpressions:
- - key: kubernetes.io/hostname
- operator: In
- values:
- - rpi112
- tolerations:
- - key: "pcloud"
- operator: "Equal"
- value: "role"
- effect: "NoSchedule"
----
-apiVersion: apps/v1
-kind: DaemonSet
-metadata:
- name: lighthouse-rpi113
- namespace: ingress-nginx-private
-spec:
- selector:
- matchLabels:
- app: lighthouse-rpi113
- template:
- metadata:
- labels:
- app: lighthouse-rpi113
- spec:
- restartPolicy: Always
- hostNetwork: true
- volumes:
- - name: cert
- secret:
- secretName: node-rpi113-cert
- - name: config
- configMap:
- name: nodes-lighthouse-config
- containers:
- - name: lighthouse
- image: giolekva/nebula:latest
- imagePullPolicy: IfNotPresent
- securityContext:
- capabilities:
- add: ["NET_ADMIN"]
- privileged: true
- ports:
- - name: lighthouse
- containerPort: 4242
- protocol: UDP
- command: ["nebula", "--config=/etc/nebula/config/nodes-lighthouse.yaml"]
- volumeMounts:
- - name: cert
- mountPath: /etc/nebula/lighthouse
- readOnly: true
- - name: config
- mountPath: /etc/nebula/config
- readOnly: true
- affinity:
- nodeAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
- nodeSelectorTerms:
- - matchExpressions:
- - key: kubernetes.io/hostname
- operator: In
- values:
- - rpi113
- tolerations:
- - key: "pcloud"
- operator: "Equal"
- value: "role"
- effect: "NoSchedule"
----
-apiVersion: apps/v1
-kind: DaemonSet
-metadata:
- name: lighthouse-rpi114
- namespace: ingress-nginx-private
-spec:
- selector:
- matchLabels:
- app: lighthouse-rpi114
- template:
- metadata:
- labels:
- app: lighthouse-rpi114
- spec:
- restartPolicy: Always
- hostNetwork: true
- volumes:
- - name: cert
- secret:
- secretName: node-rpi114-cert
- - name: config
- configMap:
- name: nodes-lighthouse-config
- containers:
- - name: lighthouse
- image: giolekva/nebula:latest
- imagePullPolicy: IfNotPresent
- securityContext:
- capabilities:
- add: ["NET_ADMIN"]
- privileged: true
- ports:
- - name: lighthouse
- containerPort: 4242
- protocol: UDP
- command: ["nebula", "--config=/etc/nebula/config/nodes-lighthouse.yaml"]
- volumeMounts:
- - name: cert
- mountPath: /etc/nebula/lighthouse
- readOnly: true
- - name: config
- mountPath: /etc/nebula/config
- readOnly: true
- affinity:
- nodeAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
- nodeSelectorTerms:
- - matchExpressions:
- - key: kubernetes.io/hostname
- operator: In
- values:
- - rpi114
- tolerations:
- - key: "pcloud"
- operator: "Equal"
- value: "role"
- effect: "NoSchedule"
diff --git a/scripts/homelab/installer/nodes-lighthouse.yaml b/scripts/homelab/installer/nodes-lighthouse.yaml
deleted file mode 100644
index 62ea4d0..0000000
--- a/scripts/homelab/installer/nodes-lighthouse.yaml
+++ /dev/null
@@ -1,246 +0,0 @@
-# This is the nebula example configuration file. You must edit, at a minimum, the static_host_map, lighthouse, and firewall sections
-# Some options in this file are HUPable, including the pki section. (A HUP will reload credentials from disk without affecting existing tunnels)
-
-# PKI defines the location of credentials for this node. Each of these can also be inlined by using the yaml ": |" syntax.
-pki:
- # The CAs that are accepted by this node. Must contain one or more certificates created by 'nebula-cert ca'
- ##ca: /etc/nebula/ca/ca.crt
- ca: /etc/nebula/lighthouse/ca.crt
- cert: /etc/nebula/lighthouse/host.crt
- key: /etc/nebula/lighthouse/host.key
- #blocklist is a list of certificate fingerprints that we will refuse to talk to
- #blocklist:
- # - c99d4e650533b92061b09918e838a5a0a6aaee21eed1d12fd937682865936c72
-
-# The static host map defines a set of hosts with fixed IP addresses on the internet (or any network).
-# A host can have multiple fixed IP addresses defined here, and nebula will try each when establishing a tunnel.
-# The syntax is:
-# "{nebula ip}": ["{routable ip/dns name}:{routable port}"]
-# Example, if your lighthouse has the nebula IP of 192.168.100.1 and has the real ip address of 100.64.22.11 and runs on port 4242:
-static_host_map:
- "111.0.0.1": ["46.49.35.44:4242"]
-
-
-lighthouse:
- # am_lighthouse is used to enable lighthouse functionality for a node. This should ONLY be true on nodes
- # you have configured to be lighthouses in your network
- am_lighthouse: false
- # serve_dns optionally starts a dns listener that responds to various queries and can even be
- # delegated to for resolution
- #serve_dns: false
- #dns:
- # The DNS host defines the IP to bind the dns listener to. This also allows binding to the nebula node IP.
- #host: 0.0.0.0
- #port: 53
- # interval is the number of seconds between updates from this node to a lighthouse.
- # during updates, a node sends information about its current IP addresses to each node.
- interval: 60
- # hosts is a list of lighthouse hosts this node should report to and query from
- # IMPORTANT: THIS SHOULD BE EMPTY ON LIGHTHOUSE NODES
- # IMPORTANT2: THIS SHOULD BE LIGHTHOUSES' NEBULA IPs, NOT LIGHTHOUSES' REAL ROUTABLE IPs
- hosts:
- - "111.0.0.1"
-
- # remote_allow_list allows you to control ip ranges that this node will
- # consider when handshaking to another node. By default, any remote IPs are
- # allowed. You can provide CIDRs here with `true` to allow and `false` to
- # deny. The most specific CIDR rule applies to each remote. If all rules are
- # "allow", the default will be "deny", and vice-versa. If both "allow" and
- # "deny" rules are present, then you MUST set a rule for "0.0.0.0/0" as the
- # default.
- #remote_allow_list:
- # Example to block IPs from this subnet from being used for remote IPs.
- #"172.16.0.0/12": false
-
- # A more complicated example, allow public IPs but only private IPs from a specific subnet
- #"0.0.0.0/0": true
- #"10.0.0.0/8": false
- #"10.42.42.0/24": true
-
- # local_allow_list allows you to filter which local IP addresses we advertise
- # to the lighthouses. This uses the same logic as `remote_allow_list`, but
- # additionally, you can specify an `interfaces` map of regular expressions
- # to match against interface names. The regexp must match the entire name.
- # All interface rules must be either true or false (and the default will be
- # the inverse). CIDR rules are matched after interface name rules.
- # Default is all local IP addresses.
- #local_allow_list:
- # Example to block tun0 and all docker interfaces.
- #interfaces:
- #tun0: false
- #'docker.*': false
- # Example to only advertise this subnet to the lighthouse.
- #"10.0.0.0/8": true
-
-# Port Nebula will be listening on. The default here is 4242. For a lighthouse node, the port should be defined,
-# however using port 0 will dynamically assign a port and is recommended for roaming nodes.
-listen:
- # To listen on both any ipv4 and ipv6 use "[::]"
- host: "[::]"
- port: 4242
- # Sets the max number of packets to pull from the kernel for each syscall (under systems that support recvmmsg)
- # default is 64, does not support reload
- #batch: 64
- # Configure socket buffers for the udp side (outside), leave unset to use the system defaults. Values will be doubled by the kernel
- # Default is net.core.rmem_default and net.core.wmem_default (/proc/sys/net/core/rmem_default and /proc/sys/net/core/rmem_default)
- # Maximum is limited by memory in the system, SO_RCVBUFFORCE and SO_SNDBUFFORCE is used to avoid having to raise the system wide
- # max, net.core.rmem_max and net.core.wmem_max
- #read_buffer: 10485760
- #write_buffer: 10485760
-
-# EXPERIMENTAL: This option is currently only supported on linux and may
-# change in future minor releases.
-#
-# Routines is the number of thread pairs to run that consume from the tun and UDP queues.
-# Currently, this defaults to 1 which means we have 1 tun queue reader and 1
-# UDP queue reader. Setting this above one will set IFF_MULTI_QUEUE on the tun
-# device and SO_REUSEPORT on the UDP socket to allow multiple queues.
-#routines: 1
-
-punchy:
- # Continues to punch inbound/outbound at a regular interval to avoid expiration of firewall nat mappings
- punch: true
-
- # respond means that a node you are trying to reach will connect back out to you if your hole punching fails
- # this is extremely useful if one node is behind a difficult nat, such as a symmetric NAT
- # Default is false
- #respond: true
-
- # delays a punch response for misbehaving NATs, default is 1 second, respond must be true to take effect
- #delay: 1s
-
-# Cipher allows you to choose between the available ciphers for your network. Options are chachapoly or aes
-# IMPORTANT: this value must be identical on ALL NODES/LIGHTHOUSES. We do not/will not support use of different ciphers simultaneously!
-cipher: chachapoly
-
-# Local range is used to define a hint about the local network range, which speeds up discovering the fastest
-# path to a network adjacent nebula node.
-#local_range: "172.16.0.0/24"
-
-# sshd can expose informational and administrative functions via ssh this is a
-#sshd:
- # Toggles the feature
- #enabled: true
- # Host and port to listen on, port 22 is not allowed for your safety
- #listen: 127.0.0.1:2222
- # A file containing the ssh host private key to use
- # A decent way to generate one: ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N "" < /dev/null
- #host_key: ./ssh_host_ed25519_key
- # A file containing a list of authorized public keys
- #authorized_users:
- #- user: steeeeve
- # keys can be an array of strings or single string
- #keys:
- #- "ssh public key string"
-
-# Configure the private interface. Note: addr is baked into the nebula certificate
-tun:
- # When tun is disabled, a lighthouse can be started without a local tun interface (and therefore without root)
- disabled: false
- # Name of the device
- dev: nebula1
- # Toggles forwarding of local broadcast packets, the address of which depends on the ip/mask encoded in pki.cert
- drop_local_broadcast: false
- # Toggles forwarding of multicast packets
- drop_multicast: false
- # Sets the transmit queue length, if you notice lots of transmit drops on the tun it may help to raise this number. Default is 500
- tx_queue: 500
- # Default MTU for every packet, safe setting is (and the default) 1300 for internet based traffic
- mtu: 576
- # Route based MTU overrides, you have known vpn ip paths that can support larger MTUs you can increase/decrease them here
- routes:
- #- mtu: 8800
- # route: 10.0.0.0/16
- # Unsafe routes allows you to route traffic over nebula to non-nebula nodes
- # Unsafe routes should be avoided unless you have hosts/services that cannot run nebula
- # NOTE: The nebula certificate of the "via" node *MUST* have the "route" defined as a subnet in its certificate
- unsafe_routes:
- #- route: 172.16.1.0/24
- # via: 192.168.100.99
- # mtu: 1300 #mtu will default to tun mtu if this option is not sepcified
-
-
-# TODO
-# Configure logging level
-logging:
- # panic, fatal, error, warning, info, or debug. Default is info
- level: info
- # json or text formats currently available. Default is text
- format: text
- # Disable timestamp logging. useful when output is redirected to logging system that already adds timestamps. Default is false
- #disable_timestamp: true
- # timestamp format is specified in Go time format, see:
- # https://golang.org/pkg/time/#pkg-constants
- # default when `format: json`: "2006-01-02T15:04:05Z07:00" (RFC3339)
- # default when `format: text`:
- # when TTY attached: seconds since beginning of execution
- # otherwise: "2006-01-02T15:04:05Z07:00" (RFC3339)
- # As an example, to log as RFC3339 with millisecond precision, set to:
- #timestamp_format: "2006-01-02T15:04:05.000Z07:00"
-
-#stats:
- #type: graphite
- #prefix: nebula
- #protocol: tcp
- #host: 127.0.0.1:9999
- #interval: 10s
-
- #type: prometheus
- #listen: 127.0.0.1:8080
- #path: /metrics
- #namespace: prometheusns
- #subsystem: nebula
- #interval: 10s
-
- # enables counter metrics for meta packets
- # e.g.: `messages.tx.handshake`
- # NOTE: `message.{tx,rx}.recv_error` is always emitted
- #message_metrics: false
-
- # enables detailed counter metrics for lighthouse packets
- # e.g.: `lighthouse.rx.HostQuery`
- #lighthouse_metrics: false
-
-# Handshake Manager Settings
-#handshakes:
- # Handshakes are sent to all known addresses at each interval with a linear backoff,
- # Wait try_interval after the 1st attempt, 2 * try_interval after the 2nd, etc, until the handshake is older than timeout
- # A 100ms interval with the default 10 retries will give a handshake 5.5 seconds to resolve before timing out
- #try_interval: 100ms
- #retries: 20
- # trigger_buffer is the size of the buffer channel for quickly sending handshakes
- # after receiving the response for lighthouse queries
- #trigger_buffer: 64
-
-
-# Nebula security group configuration
-firewall:
- conntrack:
- tcp_timeout: 12m
- udp_timeout: 3m
- default_timeout: 10m
- max_connections: 100000
-
- # The firewall is default deny. There is no way to write a deny rule.
- # Rules are comprised of a protocol, port, and one or more of host, group, or CIDR
- # Logical evaluation is roughly: port AND proto AND (ca_sha OR ca_name) AND (host OR group OR groups OR cidr)
- # - port: Takes `0` or `any` as any, a single number `80`, a range `200-901`, or `fragment` to match second and further fragments of fragmented packets (since there is no port available).
- # code: same as port but makes more sense when talking about ICMP, TODO: this is not currently implemented in a way that works, use `any`
- # proto: `any`, `tcp`, `udp`, or `icmp`
- # host: `any` or a literal hostname, ie `test-host`
- # group: `any` or a literal group name, ie `default-group`
- # groups: Same as group but accepts a list of values. Multiple values are AND'd together and a certificate would have to contain all groups to pass
- # cidr: a CIDR, `0.0.0.0/0` is any.
- # ca_name: An issuing CA name
- # ca_sha: An issuing CA shasum
-
- outbound:
- # Allow all outbound traffic from this node
- - port: any
- proto: any
- host: any
-
- inbound:
- - port: any
- proto: any
- host: any
diff --git a/scripts/homelab/rpi112.sh b/scripts/homelab/rpi112.sh
deleted file mode 100755
index f443755..0000000
--- a/scripts/homelab/rpi112.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-DRIVE_NAME=$1
-
-sudo parted $DRIVE_NAME mklabel gpt
-sudo parted $DRIVE_NAME mkpart primary fat32 0% 1GB
-sudo parted $DRIVE_NAME mkpart primary ext4 1GB 101GB
-sudo parted $DRIVE_NAME mkpart primary 101GB 100%
-sudo mkfs.vfat -n system-boot -F 32 "${DRIVE_NAME}1"
-sudo mkfs.ext4 -L writable "${DRIVE_NAME}2"
-sudo mkfs.ext4 -L pcloud-storage "${DRIVE_NAME}3"
-
-sudo mkdir /mnt/boot-img
-sudo mkdir /mnt/rootfs-img
-sudo mkdir /mnt/boot-drive
-sudo mkdir /mnt/rootfs-drive
-LOOP_DEVICE=$(sudo losetup -fP --show ubuntu-21.04-server-arm64-raspi.img)
-sudo mount -o noatime "${LOOP_DEVICE}p1" /mnt/boot-img
-sudo mount -o noatime "${LOOP_DEVICE}p2" /mnt/rootfs-img
-sudo mount -o noatime "${DRIVE_NAME}1" /mnt/boot-drive
-sudo mount -o noatime "${DRIVE_NAME}2" /mnt/rootfs-drive
-sudo rsync -axv /mnt/boot-img/ /mnt/boot-drive
-sudo rsync -axv /mnt/rootfs-img/ /mnt/rootfs-drive
-sudo touch /mnt/boot-drive/ssh
-sudo cp -f user-data-rpi112 /mnt/boot-drive/user-data
-sudo cp -f network-config-rpi112 /mnt/boot-drive/network-config
-sudo umount /mnt/boot-img
-sudo umount /mnt/rootfs-img
-sudo umount /mnt/boot-drive
-sudo umount /mnt/rootfs-drive
diff --git a/scripts/homelab/rpi113.sh b/scripts/homelab/rpi113.sh
deleted file mode 100755
index b9bbeab..0000000
--- a/scripts/homelab/rpi113.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-DRIVE_NAME=$1
-
-sudo parted $DRIVE_NAME mklabel gpt
-sudo parted $DRIVE_NAME mkpart primary fat32 0% 1GB
-sudo parted $DRIVE_NAME mkpart primary ext4 1GB 101GB
-sudo parted $DRIVE_NAME mkpart primary 101GB 100%
-sudo mkfs.vfat -n system-boot -F 32 "${DRIVE_NAME}1"
-sudo mkfs.ext4 -L writable "${DRIVE_NAME}2"
-sudo mkfs.ext4 -L pcloud-storage "${DRIVE_NAME}3"
-
-sudo mkdir /mnt/boot-img
-sudo mkdir /mnt/rootfs-img
-sudo mkdir /mnt/boot-drive
-sudo mkdir /mnt/rootfs-drive
-LOOP_DEVICE=$(sudo losetup -fP --show ubuntu-21.04-server-arm64-raspi.img)
-sudo mount -o noatime "${LOOP_DEVICE}p1" /mnt/boot-img
-sudo mount -o noatime "${LOOP_DEVICE}p2" /mnt/rootfs-img
-sudo mount -o noatime "${DRIVE_NAME}1" /mnt/boot-drive
-sudo mount -o noatime "${DRIVE_NAME}2" /mnt/rootfs-drive
-sudo rsync -axv /mnt/boot-img/ /mnt/boot-drive
-sudo rsync -axv /mnt/rootfs-img/ /mnt/rootfs-drive
-sudo touch /mnt/boot-drive/ssh
-sudo cp -f user-data-rpi113 /mnt/boot-drive/user-data
-sudo cp -f network-config-rpi113 /mnt/boot-drive/network-config
-sudo umount /mnt/boot-img
-sudo umount /mnt/rootfs-img
-sudo umount /mnt/boot-drive
-sudo umount /mnt/rootfs-drive
-
diff --git a/scripts/homelab/rpi114.sh b/scripts/homelab/rpi114.sh
deleted file mode 100755
index 6dba2d4..0000000
--- a/scripts/homelab/rpi114.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-DRIVE_NAME=$1
-
-sudo parted $DRIVE_NAME mklabel gpt
-sudo parted $DRIVE_NAME mkpart primary fat32 0% 1GB
-sudo parted $DRIVE_NAME mkpart primary ext4 1GB 101GB
-sudo parted $DRIVE_NAME mkpart primary 101GB 100%
-sudo mkfs.vfat -n system-boot -F 32 "${DRIVE_NAME}1"
-sudo mkfs.ext4 -L writable "${DRIVE_NAME}2"
-sudo mkfs.ext4 -L pcloud-storage "${DRIVE_NAME}3"
-# update /etc/fstab to include pcloud-storage
-
-sudo mkdir /mnt/boot-img
-sudo mkdir /mnt/rootfs-img
-sudo mkdir /mnt/boot-drive
-sudo mkdir /mnt/rootfs-drive
-LOOP_DEVICE=$(sudo losetup -fP --show ubuntu-21.04-server-arm64-raspi.img)
-sudo mount -o noatime "${LOOP_DEVICE}p1" /mnt/boot-img
-sudo mount -o noatime "${LOOP_DEVICE}p2" /mnt/rootfs-img
-sudo mount -o noatime "${DRIVE_NAME}1" /mnt/boot-drive
-sudo mount -o noatime "${DRIVE_NAME}2" /mnt/rootfs-drive
-sudo rsync -axv /mnt/boot-img/ /mnt/boot-drive
-sudo rsync -axv /mnt/rootfs-img/ /mnt/rootfs-drive
-sudo touch /mnt/boot-drive/ssh
-sudo cp -f user-data-rpi114 /mnt/boot-drive/user-data
-sudo cp -f network-config-rpi114 /mnt/boot-drive/network-config
-sudo umount /mnt/boot-img
-sudo umount /mnt/rootfs-img
-sudo umount /mnt/boot-drive
-sudo umount /mnt/rootfs-drive
diff --git a/scripts/homelab/rpi115.sh b/scripts/homelab/rpi115.sh
deleted file mode 100755
index 975f8d6..0000000
--- a/scripts/homelab/rpi115.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-DRIVE_NAME=$1
-
-sudo parted $DRIVE_NAME mklabel gpt
-sudo parted $DRIVE_NAME mkpart primary fat32 0% 1GB
-sudo parted $DRIVE_NAME mkpart primary ext4 1GB 101GB
-sudo parted $DRIVE_NAME mkpart primary 101GB 100%
-sudo mkfs.vfat -n system-boot -F 32 "${DRIVE_NAME}1"
-sudo mkfs.ext4 -L writable "${DRIVE_NAME}2"
-sudo mkfs.ext4 -L pcloud-storage "${DRIVE_NAME}3"
-# update /etc/fstab to include pcloud-storage
-
-sudo mkdir /mnt/boot-img
-sudo mkdir /mnt/rootfs-img
-sudo mkdir /mnt/boot-drive
-sudo mkdir /mnt/rootfs-drive
-LOOP_DEVICE=$(sudo losetup -fP --show ubuntu-21.04-server-arm64-raspi.img)
-sudo mount -o noatime "${LOOP_DEVICE}p1" /mnt/boot-img
-sudo mount -o noatime "${LOOP_DEVICE}p2" /mnt/rootfs-img
-sudo mount -o noatime "${DRIVE_NAME}1" /mnt/boot-drive
-sudo mount -o noatime "${DRIVE_NAME}2" /mnt/rootfs-drive
-sudo rsync -axv /mnt/boot-img/ /mnt/boot-drive
-sudo rsync -axv /mnt/rootfs-img/ /mnt/rootfs-drive
-sudo touch /mnt/boot-drive/ssh
-sudo cp -f user-data-rpi115 /mnt/boot-drive/user-data
-sudo cp -f network-config-rpi115 /mnt/boot-drive/network-config
-sudo umount /mnt/boot-img
-sudo umount /mnt/rootfs-img
-sudo umount /mnt/boot-drive
-sudo umount /mnt/rootfs-drive
diff --git a/scripts/homelab/rpi116.sh b/scripts/homelab/rpi116.sh
deleted file mode 100755
index 85e5038..0000000
--- a/scripts/homelab/rpi116.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-DRIVE_NAME=$1
-
-sudo parted $DRIVE_NAME mklabel gpt
-sudo parted $DRIVE_NAME mkpart primary fat32 0% 1GB
-sudo parted $DRIVE_NAME mkpart primary ext4 1GB 101GB
-sudo parted $DRIVE_NAME mkpart primary 101GB 100%
-sudo mkfs.vfat -n system-boot -F 32 "${DRIVE_NAME}1"
-sudo mkfs.ext4 -L writable "${DRIVE_NAME}2"
-sudo mkfs.ext4 -L pcloud-storage "${DRIVE_NAME}3"
-# update /etc/fstab to include pcloud-storage
-
-sudo mkdir /mnt/boot-img
-sudo mkdir /mnt/rootfs-img
-sudo mkdir /mnt/boot-drive
-sudo mkdir /mnt/rootfs-drive
-LOOP_DEVICE=$(sudo losetup -fP --show ubuntu-21.04-server-arm64-raspi.img)
-sudo mount -o noatime "${LOOP_DEVICE}p1" /mnt/boot-img
-sudo mount -o noatime "${LOOP_DEVICE}p2" /mnt/rootfs-img
-sudo mount -o noatime "${DRIVE_NAME}1" /mnt/boot-drive
-sudo mount -o noatime "${DRIVE_NAME}2" /mnt/rootfs-drive
-sudo rsync -axv /mnt/boot-img/ /mnt/boot-drive
-sudo rsync -axv /mnt/rootfs-img/ /mnt/rootfs-drive
-sudo touch /mnt/boot-drive/ssh
-sudo cp -f user-data-rpi116 /mnt/boot-drive/user-data
-sudo cp -f network-config-rpi116 /mnt/boot-drive/network-config
-sudo umount /mnt/boot-img
-sudo umount /mnt/rootfs-img
-sudo umount /mnt/boot-drive
-sudo umount /mnt/rootfs-drive
diff --git a/scripts/network-config b/scripts/network-config
deleted file mode 100644
index bfd94c5..0000000
--- a/scripts/network-config
+++ /dev/null
@@ -1,22 +0,0 @@
-# This file contains a netplan-compatible configuration which cloud-init
-# will apply on first-boot. Please refer to the cloud-init documentation and
-# the netplan reference for full details:
-#
-# https://cloudinit.readthedocs.io/
-# https://netplan.io/reference
-#
-# Some additional examples are commented out below
-
-network:
- version: 2
- ethernets:
- eth0:
- dhcp4: true
- optional: true
- wifis:
- wlan0:
- optional: true
- dhcp4: true
- access-points:
- "SSID":
- password: "PSSWD"
diff --git a/scripts/overlaytest.sh b/scripts/overlaytest.sh
deleted file mode 100644
index b30d866..0000000
--- a/scripts/overlaytest.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# kubectl apply -f ds-overlaytest.yaml
-
-echo "=> Start network overlay test"; kubectl get pods -l name=overlaytest -o jsonpath='{range .items[*]}{@.metadata.name}{" "}{@.spec.nodeName}{"\n"}{end}' | while read spod shost; do kubectl get pods -l name=overlaytest -o jsonpath='{range .items[*]}{@.status.podIP}{" "}{@.spec.nodeName}{"\n"}{end}' | while read tip thost; do kubectl --request-timeout='10s' exec $spod -- /bin/sh -c "ping -c2 $tip > /dev/null 2>&1"; RC=$?; if [ $RC -ne 0 ]; then echo $shost cannot reach $thost; fi; done; done; echo "=> End network overlay test"
diff --git a/scripts/raspberry-pi.sh b/scripts/raspberry-pi.sh
deleted file mode 100644
index bafc8ca..0000000
--- a/scripts/raspberry-pi.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-### Ubuntu 18.04 https://dev.to/wesleybatista/setup-raspberry-pi-3-model-b-with-ubuntu-server-and-ssh-over-wifi-4d41
-
-### setup rpi connectivity
-## enable wifi and ssh
-# host
-# set ssid/psswd in wpa_suplicant.conf/network-config
-# Raspbian - cp wpa_supplicant.conf /Volumes/boot/
-# Ubuntu - sudoedit /etc/netplan/50-cloud-init.yaml and copy network-config into it
-touch /Volumes/boot/ssh
-## attach rpi to ip address
-# sudo add rpi to /etc/hosts
-
-
-
-### k3s
-## create pcloud sudo user
-# rpi
-sudo adduser pcloud
-sudo usermod -aG sudo pcloud
-sudoedit /boot/firmware/cmdline.txt # append cgroup_memory=1 cgroup_enable=memory
-sudo shutdown -r now
-## install k3s without traefik
-# pcloud@rpi
-curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --no-deploy traefik" K3S_KUBECONFIG_MODE="644" sh
-# worker
-curl -sfL https://get.k3s.io | K3S_URL=https://192.168.0.111:6443 K3S_TOKEN=K10ad9f018be91d743f3142246e848def8859145f8f86e08ac761938ec37b1d876e::server:e5adcf3075ce25c6d42729c7823a0d5a sh -
-## copy kubeconfig on host
-# pcloud@rpi
-sudo chown pcloud /etc/rancher/k3s/k3s.yaml
-# host
-scp pcloud@rpi:/etc/rancher/k3s/k3s.yaml ~/.k3s.kubeconfig
-sed -i -e 's/127\.0\.0\.1/rpi/g' ~/.k3s.kubeconfig
-printf "\n\n#k3s kubeconfig\nexport KUBECONFIG=~/.k3s.kubeconfig\n" >> ~/.bash_profile
-source ~/.bash_profile
-kubectl get pods -A
-
-
-
-### ingress
-## traefik 2.0
-helm repo add traefik https://containous.github.io/traefik-helm-chart
-helm repo update
-kubectl create namespace traefik
-helm --namespace=traefik install traefik traefik/traefik \
- --set additionalArguments="{--providers.kubernetesingress,--global.checknewversion=true}" \
- --set ports.traefik.expose=True
-
-
-
-### setup docker DO NOT INSTALL DOCKER, IT MESSES UP WITH k3s iptables
-# sudo adduser docker
-# sudo usermod -aG sudo docker
-# sudo apt-get install docker.io
diff --git a/scripts/wpa_supplicant.conf b/scripts/wpa_supplicant.conf
deleted file mode 100644
index ea5f403..0000000
--- a/scripts/wpa_supplicant.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
-update_config=1
-country=GE
-
-network={
- ssid="SSID"
- psk="PSSWD"
-}
\ No newline at end of file