1
1
package main
2
2
3
3
import (
4
+ "errors"
4
5
"flag"
5
6
"fmt"
6
7
"log"
@@ -130,6 +131,21 @@ func usage() {
130
131
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>]" )
131
132
}
132
133
134
+ func NewDockerClient (endpoint string ) (* docker.Client , error ) {
135
+ if strings .HasPrefix (endpoint , "unix:" ) {
136
+ return docker .NewClient (endpoint )
137
+ } else if tlsVerify || tlsCert != "" || tlsKey != "" || tlsCaCert != "" {
138
+ if tlsVerify {
139
+ if tlsCaCert == "" {
140
+ return nil , errors .New ("TLS verification was requested, but no -tlscacert was provided" )
141
+ }
142
+ }
143
+
144
+ return docker .NewTLSClient (endpoint , tlsCert , tlsKey , tlsCaCert )
145
+ }
146
+ return docker .NewClient (endpoint )
147
+ }
148
+
133
149
func generateFromContainers (client * docker.Client ) {
134
150
containers , err := getContainers (client )
135
151
if err != nil {
@@ -156,7 +172,7 @@ func runNotifyCmd(config Config) {
156
172
cmd := exec .Command ("/bin/sh" , "-c" , config .NotifyCmd )
157
173
out , err := cmd .CombinedOutput ()
158
174
if err != nil {
159
- log .Printf ("error running notify command: %s, %s\n " , config .NotifyCmd , err )
175
+ log .Printf ("Error running notify command: %s, %s\n " , config .NotifyCmd , err )
160
176
log .Print (string (out ))
161
177
}
162
178
}
@@ -205,7 +221,7 @@ func generateAtInterval(client *docker.Client, configs ConfigFile) {
205
221
case <- ticker .C :
206
222
containers , err := getContainers (client )
207
223
if err != nil {
208
- log .Printf ("error listing containers: %s\n " , err )
224
+ log .Printf ("Error listing containers: %s\n " , err )
209
225
continue
210
226
}
211
227
// ignore changed return value. always run notify command
@@ -229,28 +245,103 @@ func generateFromEvents(client *docker.Client, configs ConfigFile) {
229
245
230
246
wg .Add (1 )
231
247
defer wg .Done ()
248
+ /*
249
+ err := client.AddEventListener((chan<- *docker.APIEvents)(eventChan))
250
+ if err != nil {
251
+ log.Fatalf("Unable to add docker event listener: %s", err)
252
+ }
253
+ defer client.RemoveEventListener(eventChan)*/
232
254
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
-
242
- log .Println ("Watching docker events" )
243
255
for {
244
- event := <- eventChan
256
+ if client == nil {
257
+ var err error
258
+ endpoint , err := getEndpoint ()
259
+ if err != nil {
260
+ log .Printf ("Bad endpoint: %s" , err )
261
+ time .Sleep (10 * time .Second )
262
+ continue
263
+ }
245
264
246
- if event == nil {
247
- continue
265
+ client , err = NewDockerClient (endpoint )
266
+ if err != nil {
267
+ log .Printf ("Unable to connect to docker daemaon: %s" , err )
268
+ time .Sleep (10 * time .Second )
269
+ continue
270
+ }
271
+ generateFromContainers (client )
248
272
}
249
273
250
- if event .Status == "start" || event .Status == "stop" || event .Status == "die" {
251
- log .Printf ("Received event %s for container %s" , event .Status , event .ID [:12 ])
252
- generateFromContainers (client )
274
+ eventChan := make (chan * docker.APIEvents , 100 )
275
+ defer close (eventChan )
276
+
277
+ watching := false
278
+ for {
279
+
280
+ if client == nil {
281
+ break
282
+ }
283
+ err := client .Ping ()
284
+ if err != nil {
285
+ log .Printf ("Unable to ping docker daemaon: %s" , err )
286
+ if watching {
287
+ client .RemoveEventListener (eventChan )
288
+ watching = false
289
+ client = nil
290
+ }
291
+ time .Sleep (10 * time .Second )
292
+ break
293
+
294
+ }
295
+
296
+ if ! watching {
297
+ err = client .AddEventListener (eventChan )
298
+ if err != nil && err != docker .ErrListenerAlreadyExists {
299
+ log .Printf ("Error registering docker event listener: %s" , err )
300
+ time .Sleep (10 * time .Second )
301
+ continue
302
+ }
303
+ watching = true
304
+ log .Println ("Watching docker events" )
305
+ }
306
+
307
+ select {
308
+
309
+ case event := <- eventChan :
310
+ if event == nil {
311
+ if watching {
312
+ client .RemoveEventListener (eventChan )
313
+ watching = false
314
+ client = nil
315
+ }
316
+ break
317
+ }
318
+
319
+ if event .Status == "start" || event .Status == "stop" || event .Status == "die" {
320
+ log .Printf ("Received event %s for container %s" , event .Status , event .ID [:12 ])
321
+ generateFromContainers (client )
322
+ }
323
+ case <- time .After (10 * time .Second ):
324
+ // check for docker liveness
325
+ }
326
+
253
327
}
328
+
329
+ /* event := <-eventChan
330
+ println(event)
331
+ if event == nil {
332
+ client.RemoveEventListener(eventChan)
333
+ client, err = NewDockerClient(endpoint)
334
+ println(client)
335
+ if err != nil {
336
+ log.Printf("Error connecting to docker daemon: %s", err)
337
+ }
338
+ goto RESTART
339
+ }
340
+
341
+ if event.Status == "start" || event.Status == "stop" || event.Status == "die" {
342
+ log.Printf("Received event %s for container %s", event.Status, event.ID[:12])
343
+ generateFromContainers(client)
344
+ }*/
254
345
}
255
346
}
256
347
@@ -312,20 +403,7 @@ func main() {
312
403
log .Fatalf ("Bad endpoint: %s" , err )
313
404
}
314
405
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
- }
406
+ client , err := NewDockerClient (endpoint )
329
407
if err != nil {
330
408
log .Fatalf ("Unable to create docker client: %s" , err )
331
409
}
0 commit comments