4
4
"log"
5
5
"os"
6
6
"flag"
7
+ "strings"
8
+ "fmt"
7
9
"path/filepath"
8
10
"os/exec"
9
11
"syscall"
@@ -18,6 +20,12 @@ var debug = flag.Bool("d", false, "debug mode displays handler output")
18
20
var env = flag .Bool ("e" , false , "pass environment to handler" )
19
21
var shell = flag .Bool ("s" , false , "run handler via SHELL" )
20
22
23
+ var skipInspect = map [string ]bool {
24
+ "destroy" : true ,
25
+ "untag" : true ,
26
+ "delete" : true ,
27
+ }
28
+
21
29
func init () {
22
30
flag .Usage = func () {
23
31
fmt .Fprintf (os .Stderr , "Usage: %v [options] <hook-handler>\n \n " , os .Args [0 ])
@@ -52,25 +60,26 @@ func exitStatus(err error) (int, error) {
52
60
return 0 , nil
53
61
}
54
62
55
- func inspect (docker * dockerapi.Client , id string ) bytes.Buffer {
63
+ func inspect (docker * dockerapi.Client , id string ) * bytes.Buffer {
56
64
var b bytes.Buffer
57
65
container , err := docker .InspectContainer (id )
58
66
if err != nil {
59
67
log .Println ("warn: unable to inspect container:" , id [:12 ], err )
60
- return b
68
+ return & b
61
69
}
62
- data , err := json .Marshal (m )
70
+ data , err := json .Marshal (container )
63
71
if err != nil {
64
72
log .Println ("warn: unable to marshal container data:" , id [:12 ], err )
65
- return b
73
+ return & b
66
74
}
67
75
b .Write (data )
68
- return b
76
+ return & b
69
77
}
70
78
71
- func trigger (hook []string , event , id string , data bytes.Buffer ) {
79
+ func trigger (hook []string , event , id string , docker * dockerapi.Client ) {
80
+ log .Println ("info: trigger:" , id [:12 ], event )
72
81
hook = append (hook , event , id )
73
- var cmd exec.Cmd
82
+ var cmd * exec.Cmd
74
83
if * shell {
75
84
cmd = exec .Command (os .Getenv ("SHELL" ), "-c" , strings .Join (hook , " " ))
76
85
} else {
@@ -79,7 +88,9 @@ func trigger(hook []string, event, id string, data bytes.Buffer) {
79
88
if ! * env {
80
89
cmd .Env = []string {}
81
90
}
82
- cmd .Stdin = data
91
+ if ! skipInspect [event ] {
92
+ cmd .Stdin = inspect (docker , id )
93
+ }
83
94
if * debug {
84
95
cmd .Stdout = os .Stdout // TODO: wrap in log output
85
96
}
@@ -92,12 +103,12 @@ func trigger(hook []string, event, id string, data bytes.Buffer) {
92
103
93
104
func main () {
94
105
flag .Parse ()
95
- if flag .NArg () < 2 {
106
+ if flag .NArg () < 1 {
96
107
flag .Usage ()
97
108
os .Exit (64 )
98
109
}
99
110
100
- hook , err := shlex .Split (flag .Arg (1 ))
111
+ hook , err := shlex .Split (flag .Arg (0 ))
101
112
if err != nil {
102
113
log .Fatalln ("fatal: unable to parse handler command:" , err )
103
114
}
@@ -106,21 +117,23 @@ func main() {
106
117
log .Fatalln ("fatal: invalid handler executable path:" , err )
107
118
}
108
119
109
- docker , err := dockerapi .NewClient (getopt ("DOCKER_HOST" , "unix:///var/run/docker.sock" ))
120
+ if os .Getenv ("DOCKER_HOST" ) == "" {
121
+ assert (os .Setenv ("DOCKET_HOST" , "unix:///var/run/docker.sock" ))
122
+ }
123
+ docker , err := dockerapi .NewClientFromEnv ()
110
124
assert (err )
111
125
112
126
containers , err := docker .ListContainers (dockerapi.ListContainersOptions {})
113
127
assert (err )
114
128
for _ , listing := range containers {
115
- trigger (hook , "exists" , listing .ID , inspect ( docker , listing . ID ) )
129
+ trigger (hook , "exists" , listing .ID , docker )
116
130
}
117
131
118
132
events := make (chan * dockerapi.APIEvents )
119
133
assert (docker .AddEventListener (events ))
120
134
log .Println ("info: listening for Docker events..." )
121
135
for msg := range events {
122
- log .Println ("info: event:" , msg .Status , msg .ID [:12 ])
123
- go trigger (hook , msg .Status , msg .ID , inspect (docker , msg .ID ))
136
+ go trigger (hook , msg .Status , msg .ID , docker )
124
137
}
125
138
126
139
log .Fatal ("fatal: docker event loop closed" ) // todo: reconnect?
0 commit comments