44 "log"
55 "os"
66 "flag"
7+ "strings"
8+ "fmt"
79 "path/filepath"
810 "os/exec"
911 "syscall"
@@ -18,6 +20,12 @@ var debug = flag.Bool("d", false, "debug mode displays handler output")
1820var env = flag .Bool ("e" , false , "pass environment to handler" )
1921var shell = flag .Bool ("s" , false , "run handler via SHELL" )
2022
23+ var skipInspect = map [string ]bool {
24+ "destroy" : true ,
25+ "untag" : true ,
26+ "delete" : true ,
27+ }
28+
2129func init () {
2230 flag .Usage = func () {
2331 fmt .Fprintf (os .Stderr , "Usage: %v [options] <hook-handler>\n \n " , os .Args [0 ])
@@ -52,25 +60,26 @@ func exitStatus(err error) (int, error) {
5260 return 0 , nil
5361}
5462
55- func inspect (docker * dockerapi.Client , id string ) bytes.Buffer {
63+ func inspect (docker * dockerapi.Client , id string ) * bytes.Buffer {
5664 var b bytes.Buffer
5765 container , err := docker .InspectContainer (id )
5866 if err != nil {
5967 log .Println ("warn: unable to inspect container:" , id [:12 ], err )
60- return b
68+ return & b
6169 }
62- data , err := json .Marshal (m )
70+ data , err := json .Marshal (container )
6371 if err != nil {
6472 log .Println ("warn: unable to marshal container data:" , id [:12 ], err )
65- return b
73+ return & b
6674 }
6775 b .Write (data )
68- return b
76+ return & b
6977}
7078
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 )
7281 hook = append (hook , event , id )
73- var cmd exec.Cmd
82+ var cmd * exec.Cmd
7483 if * shell {
7584 cmd = exec .Command (os .Getenv ("SHELL" ), "-c" , strings .Join (hook , " " ))
7685 } else {
@@ -79,7 +88,9 @@ func trigger(hook []string, event, id string, data bytes.Buffer) {
7988 if ! * env {
8089 cmd .Env = []string {}
8190 }
82- cmd .Stdin = data
91+ if ! skipInspect [event ] {
92+ cmd .Stdin = inspect (docker , id )
93+ }
8394 if * debug {
8495 cmd .Stdout = os .Stdout // TODO: wrap in log output
8596 }
@@ -92,12 +103,12 @@ func trigger(hook []string, event, id string, data bytes.Buffer) {
92103
93104func main () {
94105 flag .Parse ()
95- if flag .NArg () < 2 {
106+ if flag .NArg () < 1 {
96107 flag .Usage ()
97108 os .Exit (64 )
98109 }
99110
100- hook , err := shlex .Split (flag .Arg (1 ))
111+ hook , err := shlex .Split (flag .Arg (0 ))
101112 if err != nil {
102113 log .Fatalln ("fatal: unable to parse handler command:" , err )
103114 }
@@ -106,21 +117,23 @@ func main() {
106117 log .Fatalln ("fatal: invalid handler executable path:" , err )
107118 }
108119
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 ()
110124 assert (err )
111125
112126 containers , err := docker .ListContainers (dockerapi.ListContainersOptions {})
113127 assert (err )
114128 for _ , listing := range containers {
115- trigger (hook , "exists" , listing .ID , inspect ( docker , listing . ID ) )
129+ trigger (hook , "exists" , listing .ID , docker )
116130 }
117131
118132 events := make (chan * dockerapi.APIEvents )
119133 assert (docker .AddEventListener (events ))
120134 log .Println ("info: listening for Docker events..." )
121135 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 )
124137 }
125138
126139 log .Fatal ("fatal: docker event loop closed" ) // todo: reconnect?
0 commit comments