Browse Source

Use new docker and lego code

master
Chris Smith 5 years ago
parent
commit
5828c6f837
5 changed files with 53 additions and 43 deletions
  1. 0
    1
      .pre-commit-config.yaml
  2. 1
    1
      Dockerfile
  3. 35
    27
      dotege.go
  4. 7
    6
      go.mod
  5. 10
    8
      go.sum

+ 0
- 1
.pre-commit-config.yaml View File

13
     rev: v0.3.2
13
     rev: v0.3.2
14
     hooks:
14
     hooks:
15
       - id: go-fmt
15
       - id: go-fmt
16
-      - id: go-vet

+ 1
- 1
Dockerfile View File

1
 FROM golang:alpine
1
 FROM golang:alpine
2
 
2
 
3
 WORKDIR /go/src/app
3
 WORKDIR /go/src/app
4
-COPY . .
5
 
4
 
6
 RUN apk add git build-base
5
 RUN apk add git build-base
7
 
6
 
7
+COPY . .
8
 RUN GO111MODULE=on go install -v ./...
8
 RUN GO111MODULE=on go install -v ./...
9
 
9
 
10
 CMD ["dotege"]
10
 CMD ["dotege"]

+ 35
- 27
dotege.go View File

2
 
2
 
3
 import (
3
 import (
4
 	"fmt"
4
 	"fmt"
5
-	"github.com/csmith/dotege/certs"
6
-	"github.com/csmith/dotege/docker"
7
 	"github.com/csmith/dotege/model"
5
 	"github.com/csmith/dotege/model"
8
 	"github.com/docker/docker/client"
6
 	"github.com/docker/docker/client"
7
+	"github.com/xenolf/lego/certcrypto"
8
+	"github.com/xenolf/lego/lego"
9
+	"github.com/xenolf/lego/platform/config/env"
9
 	"go.uber.org/zap"
10
 	"go.uber.org/zap"
10
 	"go.uber.org/zap/zapcore"
11
 	"go.uber.org/zap/zapcore"
11
 	"os"
12
 	"os"
42
 	sugar.Info("Dotege is starting")
43
 	sugar.Info("Dotege is starting")
43
 
44
 
44
 	doneChan := monitorSignals()
45
 	doneChan := monitorSignals()
45
-	containerChan := make(chan model.Container, 1)
46
-	expiryChan := make(chan string, 1)
47
-	certChan := make(chan model.FoundCertificate, 1)
48
 
46
 
49
 	config := model.Config{
47
 	config := model.Config{
50
 		Labels: model.LabelConfig{
48
 		Labels: model.LabelConfig{
55
 		DefaultCertDestination: "/data/certs/",
53
 		DefaultCertDestination: "/data/certs/",
56
 	}
54
 	}
57
 
55
 
58
-	cli, err := client.NewEnvClient()
56
+	dockerStopChan := make(chan struct{})
57
+	dockerClient, err := client.NewEnvClient()
59
 	if err != nil {
58
 	if err != nil {
60
 		panic(err)
59
 		panic(err)
61
 	}
60
 	}
62
 
61
 
63
-	certMonitor := certs.NewCertificateManager(sugar, certChan)
64
-	certMonitor.AddDirectory("/data/certrequests/certs/")
65
-	certDeployer := certs.NewCertificateDeployer(sugar, certChan)
66
-
67
 	templateGenerator := NewTemplateGenerator(sugar)
62
 	templateGenerator := NewTemplateGenerator(sugar)
68
-	templateGenerator.AddTemplate(model.TemplateConfig{
69
-		Source:      "./templates/domains.txt.tpl",
70
-		Destination: "/data/certrequests/domains.txt",
71
-	})
72
 	templateGenerator.AddTemplate(model.TemplateConfig{
63
 	templateGenerator.AddTemplate(model.TemplateConfig{
73
 		Source:      "./templates/haproxy.cfg.tpl",
64
 		Source:      "./templates/haproxy.cfg.tpl",
74
 		Destination: "haproxy.cfg",
65
 		Destination: "haproxy.cfg",
75
 	})
66
 	})
76
 
67
 
77
-	monitor := docker.NewContainerMonitor(sugar, cli, containerChan, expiryChan)
78
-	go monitor.Monitor()
68
+	certificateManager := NewCertificateManager(sugar, lego.LEDirectoryStaging, certcrypto.EC256, env.GetOrDefaultString("DOTEGE_DNS_PROVIDER", ""), "/config/certs.json")
69
+
70
+	timer := time.NewTimer(time.Hour)
71
+	timer.Stop()
72
+	containers := make(map[string]model.Container)
79
 
73
 
80
 	go func() {
74
 	go func() {
81
-		containers := make(map[string]model.Container)
82
-		timer := time.NewTimer(time.Hour)
83
-		timer.Stop()
75
+		err := monitorContainers(dockerClient, dockerStopChan, func(container model.Container) {
76
+			containers[container.Name] = container
77
+			timer.Reset(100 * time.Millisecond)
78
+			err, _ = certificateManager.GetCertificate(getHostnamesForContainer(container, config))
79
+		}, func(name string) {
80
+			delete(containers, name)
81
+			timer.Reset(100 * time.Millisecond)
82
+		})
83
+
84
+		if err != nil {
85
+			sugar.Fatal("Error monitoring containers: ", err.Error())
86
+		}
87
+	}()
84
 
88
 
89
+	go func() {
85
 		for {
90
 		for {
86
 			select {
91
 			select {
87
-			case container := <-containerChan:
88
-				containers[container.Name] = container
89
-				timer.Reset(100 * time.Millisecond)
90
-			case name := <-expiryChan:
91
-				delete(containers, name)
92
-				timer.Reset(100 * time.Millisecond)
93
 			case <-timer.C:
92
 			case <-timer.C:
94
 				hostnames := getHostnames(containers, config)
93
 				hostnames := getHostnames(containers, config)
95
 				templateGenerator.Generate(Context{
94
 				templateGenerator.Generate(Context{
96
 					Containers: containers,
95
 					Containers: containers,
97
 					Hostnames:  hostnames,
96
 					Hostnames:  hostnames,
98
 				})
97
 				})
99
-				certDeployer.UpdateHostnames(hostnames)
98
+				//certDeployer.UpdateHostnames(hostnames)
100
 			}
99
 			}
101
 		}
100
 		}
102
 	}()
101
 	}()
103
 
102
 
104
 	<-doneChan
103
 	<-doneChan
105
 
104
 
106
-	err = cli.Close()
105
+	dockerStopChan <- struct{}{}
106
+	err = dockerClient.Close()
107
 	if err != nil {
107
 	if err != nil {
108
 		panic(err)
108
 		panic(err)
109
 	}
109
 	}
110
 }
110
 }
111
 
111
 
112
+func getHostnamesForContainer(container model.Container, config model.Config) []string {
113
+	if label, ok := container.Labels[config.Labels.Hostnames]; ok {
114
+		return strings.Split(strings.Replace(label, ",", " ", -1), " ")
115
+	} else {
116
+		return []string{}
117
+	}
118
+}
119
+
112
 func getHostnames(containers map[string]model.Container, config model.Config) (hostnames map[string]*model.Hostname) {
120
 func getHostnames(containers map[string]model.Container, config model.Config) (hostnames map[string]*model.Hostname) {
113
 	hostnames = make(map[string]*model.Hostname)
121
 	hostnames = make(map[string]*model.Hostname)
114
 	for _, container := range containers {
122
 	for _, container := range containers {

+ 7
- 6
go.mod View File

1
 module github.com/csmith/dotege
1
 module github.com/csmith/dotege
2
 
2
 
3
+go 1.12
4
+
3
 require (
5
 require (
4
 	contrib.go.opencensus.io/exporter/ocagent v0.4.6 // indirect
6
 	contrib.go.opencensus.io/exporter/ocagent v0.4.6 // indirect
5
 	github.com/Azure/azure-sdk-for-go v26.1.0+incompatible // indirect
7
 	github.com/Azure/azure-sdk-for-go v26.1.0+incompatible // indirect
6
 	github.com/Azure/go-autorest v11.5.0+incompatible // indirect
8
 	github.com/Azure/go-autorest v11.5.0+incompatible // indirect
7
 	github.com/JamesClonk/vultr v0.0.0-20190227191206-c034fac6873e // indirect
9
 	github.com/JamesClonk/vultr v0.0.0-20190227191206-c034fac6873e // indirect
8
-	github.com/Microsoft/go-winio v0.4.11 // indirect
9
 	github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect
10
 	github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect
10
 	github.com/akamai/AkamaiOPEN-edgegrid-golang v0.7.3 // indirect
11
 	github.com/akamai/AkamaiOPEN-edgegrid-golang v0.7.3 // indirect
11
 	github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190228100301-04069f0b8c3f // indirect
12
 	github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190228100301-04069f0b8c3f // indirect
13
 	github.com/cenkalti/backoff v2.1.1+incompatible // indirect
14
 	github.com/cenkalti/backoff v2.1.1+incompatible // indirect
14
 	github.com/cloudflare/cloudflare-go v0.8.5 // indirect
15
 	github.com/cloudflare/cloudflare-go v0.8.5 // indirect
15
 	github.com/cpu/goacmedns v0.0.1 // indirect
16
 	github.com/cpu/goacmedns v0.0.1 // indirect
16
-	github.com/decker502/dnspod-go v0.2.0 // indirect
17
+	github.com/decker502/dnspod-go v0.0.0-20181231011336-d1081970f528 // indirect
17
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
18
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
18
 	github.com/dimchansky/utfbom v1.1.0 // indirect
19
 	github.com/dimchansky/utfbom v1.1.0 // indirect
19
 	github.com/dnsimple/dnsimple-go v0.23.0 // indirect
20
 	github.com/dnsimple/dnsimple-go v0.23.0 // indirect
21
 	github.com/docker/docker v1.13.1
22
 	github.com/docker/docker v1.13.1
22
 	github.com/docker/go-connections v0.4.0 // indirect
23
 	github.com/docker/go-connections v0.4.0 // indirect
23
 	github.com/docker/go-units v0.3.3 // indirect
24
 	github.com/docker/go-units v0.3.3 // indirect
24
-	github.com/exoscale/egoscale v0.14.3 // indirect
25
+	github.com/exoscale/egoscale v0.11.1 // indirect
25
 	github.com/fatih/structs v1.1.0 // indirect
26
 	github.com/fatih/structs v1.1.0 // indirect
26
 	github.com/go-ini/ini v1.42.0 // indirect
27
 	github.com/go-ini/ini v1.42.0 // indirect
27
 	github.com/google/go-querystring v1.0.0 // indirect
28
 	github.com/google/go-querystring v1.0.0 // indirect
44
 	github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014 // indirect
45
 	github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014 // indirect
45
 	github.com/pkg/errors v0.8.1 // indirect
46
 	github.com/pkg/errors v0.8.1 // indirect
46
 	github.com/sacloud/libsacloud v1.15.0 // indirect
47
 	github.com/sacloud/libsacloud v1.15.0 // indirect
48
+	github.com/satori/go.uuid v1.2.0 // indirect
47
 	github.com/sirupsen/logrus v1.3.0 // indirect
49
 	github.com/sirupsen/logrus v1.3.0 // indirect
48
-	github.com/stretchr/testify v1.3.0 // indirect
49
 	github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7 // indirect
50
 	github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7 // indirect
50
 	github.com/transip/gotransip v5.8.2+incompatible // indirect
51
 	github.com/transip/gotransip v5.8.2+incompatible // indirect
51
 	github.com/xenolf/lego v2.2.0+incompatible
52
 	github.com/xenolf/lego v2.2.0+incompatible
52
 	go.uber.org/atomic v1.3.2 // indirect
53
 	go.uber.org/atomic v1.3.2 // indirect
53
 	go.uber.org/multierr v1.1.0 // indirect
54
 	go.uber.org/multierr v1.1.0 // indirect
54
 	go.uber.org/zap v1.9.1
55
 	go.uber.org/zap v1.9.1
55
-	golang.org/x/crypto v0.0.0-20190228050851-31a38585487a // indirect
56
-	golang.org/x/net v0.0.0-20190213061140-3a22650c66bd
56
+	golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 // indirect
57
+	golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7
57
 	golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 // indirect
58
 	golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 // indirect
58
 	golang.org/x/time v0.0.0-20181108054448-85acf8d2951c // indirect
59
 	golang.org/x/time v0.0.0-20181108054448-85acf8d2951c // indirect
59
 	google.golang.org/api v0.1.0 // indirect
60
 	google.golang.org/api v0.1.0 // indirect

+ 10
- 8
go.sum View File

10
 github.com/Azure/go-autorest v11.5.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
10
 github.com/Azure/go-autorest v11.5.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
11
 github.com/JamesClonk/vultr v0.0.0-20190227191206-c034fac6873e h1:l9pxunkqzV2TXLGWiPiWHzCVbplZ2tOeuI0ClGd03WE=
11
 github.com/JamesClonk/vultr v0.0.0-20190227191206-c034fac6873e h1:l9pxunkqzV2TXLGWiPiWHzCVbplZ2tOeuI0ClGd03WE=
12
 github.com/JamesClonk/vultr v0.0.0-20190227191206-c034fac6873e/go.mod h1:k9Jhe7M4bxsOOTMtsXQ0Hj7R7vw0FW4Q4jVJrPis9a8=
12
 github.com/JamesClonk/vultr v0.0.0-20190227191206-c034fac6873e/go.mod h1:k9Jhe7M4bxsOOTMtsXQ0Hj7R7vw0FW4Q4jVJrPis9a8=
13
-github.com/Microsoft/go-winio v0.4.11 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6nK2Q=
14
 github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
13
 github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
15
 github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 h1:xPMsUicZ3iosVPSIP7bW5EcGUzjiiMl1OYTe14y/R24=
14
 github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 h1:xPMsUicZ3iosVPSIP7bW5EcGUzjiiMl1OYTe14y/R24=
16
 github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks=
15
 github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks=
30
 github.com/cloudflare/cloudflare-go v0.8.5/go.mod h1:8KhU6K+zHUEWOSU++mEQYf7D9UZOcQcibUoSm6vCUz4=
29
 github.com/cloudflare/cloudflare-go v0.8.5/go.mod h1:8KhU6K+zHUEWOSU++mEQYf7D9UZOcQcibUoSm6vCUz4=
31
 github.com/cpu/goacmedns v0.0.1 h1:GeIU5chKys9zmHgOAgP+bstRaLqcGQ6HJh/hLw9hrus=
30
 github.com/cpu/goacmedns v0.0.1 h1:GeIU5chKys9zmHgOAgP+bstRaLqcGQ6HJh/hLw9hrus=
32
 github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok=
31
 github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok=
33
-github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
34
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
32
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
33
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
34
+github.com/decker502/dnspod-go v0.0.0-20181231011336-d1081970f528 h1:K+b0A8KmJsgR8OV17MH/IIpscz4nASjvaqYpslEgB3Q=
35
+github.com/decker502/dnspod-go v0.0.0-20181231011336-d1081970f528/go.mod h1:1xTEhqHsJ0UdTJTGBagkADAOwd/7ulfYdlQwJcqdSHs=
36
 github.com/decker502/dnspod-go v0.2.0 h1:6dwhUFCYbC5bgpebLKn7PrI43e/5mn9tpUL9YcYCdTU=
36
 github.com/decker502/dnspod-go v0.2.0 h1:6dwhUFCYbC5bgpebLKn7PrI43e/5mn9tpUL9YcYCdTU=
37
 github.com/decker502/dnspod-go v0.2.0/go.mod h1:qsurYu1FgxcDwfSwXJdLt4kRsBLZeosEb9uq4Sy+08g=
37
 github.com/decker502/dnspod-go v0.2.0/go.mod h1:qsurYu1FgxcDwfSwXJdLt4kRsBLZeosEb9uq4Sy+08g=
38
 github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
38
 github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
49
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
49
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
50
 github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk=
50
 github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk=
51
 github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
51
 github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
52
+github.com/exoscale/egoscale v0.11.1 h1:J6wiadBkUogH2nagtyQzaj+9X0ywvDf1OMY/pw7rKHc=
53
+github.com/exoscale/egoscale v0.11.1/go.mod h1:Ee3U4ZjSDpbbEc9VkQ/jttUU8USE8Nv7L3YzVi03Y1U=
54
+github.com/exoscale/egoscale v0.14.0 h1:xC09oILlpobCFxdKt3IuTw22e3UduIZ62gnozTcn6Ow=
55
+github.com/exoscale/egoscale v0.14.0/go.mod h1:SHSox0l8ud/I8Q6joR7Oj96DFer0mdo1cQzb7dmZgro=
52
 github.com/exoscale/egoscale v0.14.3 h1:e5NJdsJ54TMrHDOJBDr1TAWTgM6QQkrfvjRp/MoC5hg=
56
 github.com/exoscale/egoscale v0.14.3 h1:e5NJdsJ54TMrHDOJBDr1TAWTgM6QQkrfvjRp/MoC5hg=
53
 github.com/exoscale/egoscale v0.14.3/go.mod h1:SHSox0l8ud/I8Q6joR7Oj96DFer0mdo1cQzb7dmZgro=
57
 github.com/exoscale/egoscale v0.14.3/go.mod h1:SHSox0l8ud/I8Q6joR7Oj96DFer0mdo1cQzb7dmZgro=
54
 github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
58
 github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
112
 github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014/go.mod h1:joRatxRJaZBsY3JAOEMcoOp05CnZzsx4scTxi95DHyQ=
116
 github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014/go.mod h1:joRatxRJaZBsY3JAOEMcoOp05CnZzsx4scTxi95DHyQ=
113
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
117
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
114
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
118
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
115
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
116
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
119
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
117
 github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
120
 github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
118
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
121
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
128
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
131
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
129
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
132
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
130
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
133
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
131
-github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
132
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
134
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
133
 github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7 h1:CpHxIaZzVy26GqJn8ptRyto8fuoYOd1v0fXm9bG3wQ8=
135
 github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7 h1:CpHxIaZzVy26GqJn8ptRyto8fuoYOd1v0fXm9bG3wQ8=
134
 github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY=
136
 github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY=
149
 golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
151
 golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
150
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
152
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
151
 golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
153
 golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
152
-golang.org/x/crypto v0.0.0-20190228050851-31a38585487a h1:53VJPSIh1mc/PLK5AlXoj1HHfovtbS77YvYJ0AqjSgE=
153
 golang.org/x/crypto v0.0.0-20190228050851-31a38585487a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
154
 golang.org/x/crypto v0.0.0-20190228050851-31a38585487a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
155
+golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU=
156
+golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
154
 golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
157
 golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
155
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
158
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
156
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
159
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
159
 golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
162
 golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
160
 golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
163
 golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
161
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
164
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
162
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd h1:HuTn7WObtcDo9uEEU7rEqL0jYthdXAmZ6PP+meazmaU=
163
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
165
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
166
+golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7 h1:Qe/u+eY379X4He4GBMFZYu3pmh1ML5yT1aL1ndNM1zQ=
167
+golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
164
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
168
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
165
 golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
169
 golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
166
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
170
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
174
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
178
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
175
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
179
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
176
 golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
180
 golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
177
-golang.org/x/sys v0.0.0-20190213121743-983097b1a8a3 h1:+KlxhGbYkFs8lMfwKn+2ojry1ID5eBSMXprS2u/wqCE=
178
-golang.org/x/sys v0.0.0-20190213121743-983097b1a8a3/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
179
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
181
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
180
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
182
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
181
 golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
183
 golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=

Loading…
Cancel
Save