Skip to content

Commit a811845

Browse files
committed
Add support for TLS
* New parameters: -tlscert, -tlskey, -tlscacert, -tlsverify
1 parent b15a2bd commit a811845

File tree

5 files changed

+44
-106
lines changed

5 files changed

+44
-106
lines changed

GLOCKFILE

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
github.com/BurntSushi/toml f87ce853111478914f0bcffa34d43a93643e6eda
2-
github.com/fsouza/go-dockerclient 194816684825a3abf28d60e5243ec5240608414d
2+
github.com/Sirupsen/logrus 6ebb4e7b3c24b9fef150d7693e728cb1ebadf1f5
3+
github.com/docker/docker 9d65017069ff12fbf0a6f078ccf91bce42fc8ffb
4+
github.com/fsouza/go-dockerclient e23bddf4d999bdcb20dfc54b8266ce1159494798

docker-gen.go

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ var (
2626
configs ConfigFile
2727
interval int
2828
endpoint string
29+
tlsCert string
30+
tlsKey string
31+
tlsCaCert string
32+
tlsVerify bool
2933
wg sync.WaitGroup
3034
)
3135

@@ -123,7 +127,7 @@ func (r *RuntimeContainer) PublishedAddresses() []Address {
123127
}
124128

125129
func usage() {
126-
println("Usage: docker-gen [-config file] [-watch=false] [-notify=\"restart xyz\"] [-notify-sighup=\"container-ID\"] [-interval=0] [-endpoint tcp|unix://..] <template> [<dest>]")
130+
println("Usage: docker-gen [-config file] [-watch=false] [-notify=\"restart xyz\"] [-notify-sighup=\"container-ID\"] [-interval=0] [-endpoint tcp|unix://..] [-tlscert file] [-tlskey file] [-tlscacert file] [-tlsverify] <template> [<dest>]")
127131
}
128132

129133
func generateFromContainers(client *docker.Client) {
@@ -225,8 +229,17 @@ func generateFromEvents(client *docker.Client, configs ConfigFile) {
225229

226230
wg.Add(1)
227231
defer wg.Done()
232+
233+
eventChan := make(chan *docker.APIEvents, 100)
234+
defer close(eventChan)
235+
236+
err := client.AddEventListener((chan<- *docker.APIEvents)(eventChan))
237+
if err != nil {
238+
log.Fatalf("Unable to add docker event listener: %s", err)
239+
}
240+
defer client.RemoveEventListener(eventChan)
241+
228242
log.Println("Watching docker events")
229-
eventChan := getEvents()
230243
for {
231244
event := <-eventChan
232245

@@ -235,7 +248,7 @@ func generateFromEvents(client *docker.Client, configs ConfigFile) {
235248
}
236249

237250
if event.Status == "start" || event.Status == "stop" || event.Status == "die" {
238-
log.Printf("Received event %s for container %s", event.Status, event.ContainerID[:12])
251+
log.Printf("Received event %s for container %s", event.Status, event.ID[:12])
239252
generateFromContainers(client)
240253
}
241254
}
@@ -251,6 +264,10 @@ func initFlags() {
251264
flag.StringVar(&configFile, "config", "", "config file with template directives")
252265
flag.IntVar(&interval, "interval", 0, "notify command interval (s)")
253266
flag.StringVar(&endpoint, "endpoint", "", "docker api endpoint")
267+
flag.StringVar(&tlsCert, "tlscert", "", "path to TLS client certificate file")
268+
flag.StringVar(&tlsKey, "tlskey", "", "path to TLS client key file")
269+
flag.StringVar(&tlsCaCert, "tlscacert", "", "path to TLS CA certificate file")
270+
flag.BoolVar(&tlsVerify, "tlsverify", false, "verify docker daemon's TLS certicate")
254271
flag.Parse()
255272
}
256273

@@ -270,8 +287,7 @@ func main() {
270287
if configFile != "" {
271288
err := loadConfig(configFile)
272289
if err != nil {
273-
log.Printf("error loading config %s: %s\n", configFile, err)
274-
os.Exit(1)
290+
log.Fatalf("error loading config %s: %s\n", configFile, err)
275291
}
276292
} else {
277293
config := Config{
@@ -296,9 +312,22 @@ func main() {
296312
log.Fatalf("Bad endpoint: %s", err)
297313
}
298314

299-
client, err := docker.NewClient(endpoint)
315+
var client *docker.Client
316+
if strings.HasPrefix(endpoint, "unix:") {
317+
client, err = docker.NewClient(endpoint)
318+
} else if tlsVerify || tlsCert != "" || tlsKey != "" || tlsCaCert != "" {
319+
if tlsVerify {
320+
if tlsCaCert == "" {
321+
log.Fatal("TLS verification was requested, but no -tlscacert was provided")
322+
}
323+
}
324+
325+
client, err = docker.NewTLSClient(endpoint, tlsCert, tlsKey, tlsCaCert)
326+
} else {
327+
client, err = docker.NewClient(endpoint)
328+
}
300329
if err != nil {
301-
log.Fatalf("Unable to parse %s: %s", endpoint, err)
330+
log.Fatalf("Unable to create docker client: %s", err)
302331
}
303332

304333
generateFromContainers(client)

docker_client.go

Lines changed: 0 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
11
package main
22

33
import (
4-
"encoding/json"
54
"fmt"
6-
"io"
75
"log"
8-
"net"
9-
"net/http"
10-
"net/http/httputil"
11-
"os"
12-
"os/signal"
136
"strconv"
147
"strings"
15-
"syscall"
16-
"time"
178

189
docker "github.com/fsouza/go-dockerclient"
1910
)
@@ -103,90 +94,6 @@ func splitDockerImage(img string) (string, string, string) {
10394
return registry, repository, tag
10495
}
10596

106-
func newConn() (*httputil.ClientConn, error) {
107-
endpoint, err := getEndpoint()
108-
if err != nil {
109-
return nil, err
110-
}
111-
112-
proto, addr, err := parseHost(endpoint)
113-
if err != nil {
114-
return nil, err
115-
}
116-
117-
conn, err := net.Dial(proto, addr)
118-
if err != nil {
119-
return nil, err
120-
}
121-
122-
return httputil.NewClientConn(conn, nil), nil
123-
}
124-
125-
func getEvents() chan *Event {
126-
eventChan := make(chan *Event, 100)
127-
go func() {
128-
defer close(eventChan)
129-
130-
for {
131-
132-
c, err := newConn()
133-
if err != nil {
134-
log.Printf("cannot connect to docker: %s\n", err)
135-
time.Sleep(10 * time.Second)
136-
continue
137-
}
138-
139-
req, err := http.NewRequest("GET", "/events", nil)
140-
if err != nil {
141-
log.Printf("bad request for events: %s\n", err)
142-
c.Close()
143-
time.Sleep(10 * time.Second)
144-
continue
145-
}
146-
147-
resp, err := c.Do(req)
148-
if err != nil {
149-
log.Printf("cannot connect to events endpoint: %s\n", err)
150-
c.Close()
151-
time.Sleep(10 * time.Second)
152-
continue
153-
}
154-
155-
// handle signals to stop the socket
156-
sigChan := make(chan os.Signal, 1)
157-
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT)
158-
go func() {
159-
for sig := range sigChan {
160-
log.Printf("received signal '%v', exiting\n", sig)
161-
162-
c.Close()
163-
resp.Body.Close()
164-
close(eventChan)
165-
os.Exit(0)
166-
}
167-
}()
168-
169-
dec := json.NewDecoder(resp.Body)
170-
for {
171-
var event *Event
172-
if err := dec.Decode(&event); err != nil || event.Status == "" {
173-
if err == io.EOF || (event != nil && event.Status == "") {
174-
log.Printf("connection closed")
175-
break
176-
}
177-
log.Printf("cannot decode json: %s\n", err)
178-
c.Close()
179-
resp.Body.Close()
180-
break
181-
}
182-
183-
eventChan <- event
184-
}
185-
}
186-
}()
187-
return eventChan
188-
}
189-
19097
func getContainers(client *docker.Client) ([]*RuntimeContainer, error) {
19198

19299
apiContainers, err := client.ListContainers(docker.ListContainersOptions{

utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func getEndpoint() (string, error) {
2727
}
2828

2929
if !exist {
30-
return "", errors.New(host + " does not exists.")
30+
return "", errors.New(host + " does not exist")
3131
}
3232
}
3333

utils_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import (
99
func TestDefaultEndpoint(t *testing.T) {
1010
endpoint, err := getEndpoint()
1111
if err != nil {
12-
t.Fatal("%s", err)
12+
t.Fatalf("%s", err)
1313
}
1414
if endpoint != "unix:///var/run/docker.sock" {
15-
t.Fatal("Expected unix:///var/run/docker.sock")
15+
t.Fatalf("Expected unix:///var/run/docker.sock, got %s", endpoint)
1616
}
1717
}
1818

@@ -28,7 +28,7 @@ func TestDockerHostEndpoint(t *testing.T) {
2828
}
2929

3030
if endpoint != "tcp://127.0.0.1:4243" {
31-
t.Fatal("Expected tcp://127.0.0.1:4243")
31+
t.Fatalf("Expected tcp://127.0.0.1:4243, got %s", endpoint)
3232
}
3333
}
3434

@@ -51,7 +51,7 @@ func TestDockerFlagEndpoint(t *testing.T) {
5151
t.Fatal("%s", err)
5252
}
5353
if endpoint != "tcp://127.0.0.1:5555" {
54-
t.Fatal("Expected tcp://127.0.0.1:5555")
54+
t.Fatalf("Expected tcp://127.0.0.1:5555, got %s", endpoint)
5555
}
5656
}
5757

0 commit comments

Comments
 (0)