11package main
22
33import (
4- "encoding/json"
54 "flag"
65 "fmt"
7- "io"
86 "log"
9- "net"
10- "net/http"
11- "net/http/httputil"
127 "os"
138 "os/exec"
14- "os/signal"
159 "strings"
1610 "sync"
17- "syscall"
1811 "time"
1912
2013 "github.com/BurntSushi/toml"
@@ -65,28 +58,6 @@ func (i *DockerImage) String() string {
6558 return ret
6659}
6760
68- func splitDockerImage (img string ) (string , string , string ) {
69-
70- index := 0
71- repository := img
72- var registry , tag string
73- if strings .Contains (img , "/" ) {
74- separator := strings .Index (img , "/" )
75- registry = img [index :separator ]
76- index = separator + 1
77- repository = img [index :]
78- }
79-
80- if strings .Contains (img , ":" ) {
81- separator := strings .Index (img , ":" )
82- repository = img [index :separator ]
83- index = separator + 1
84- tag = img [index :]
85- }
86-
87- return registry , repository , tag
88- }
89-
9061type Config struct {
9162 Template string
9263 Dest string
@@ -121,116 +92,6 @@ func usage() {
12192 println ("Usage: docker-gen [-config file] [-watch=false] [-notify=\" restart xyz\" ] [-interval=0] <template> [<dest>]" )
12293}
12394
124- func newConn () (* httputil.ClientConn , error ) {
125- conn , err := net .Dial ("unix" , "/var/run/docker.sock" )
126- if err != nil {
127- return nil , err
128- }
129- return httputil .NewClientConn (conn , nil ), nil
130- }
131-
132- func getEvents () chan * Event {
133- eventChan := make (chan * Event , 100 )
134- go func () {
135- defer close (eventChan )
136-
137- restart:
138-
139- c , err := newConn ()
140- if err != nil {
141- log .Printf ("cannot connect to docker: %s\n " , err )
142- return
143- }
144- defer c .Close ()
145-
146- req , err := http .NewRequest ("GET" , "/events" , nil )
147- if err != nil {
148- log .Printf ("bad request for events: %s\n " , err )
149- return
150- }
151-
152- resp , err := c .Do (req )
153- if err != nil {
154- log .Printf ("cannot connect to events endpoint: %s\n " , err )
155- return
156- }
157- defer resp .Body .Close ()
158-
159- // handle signals to stop the socket
160- sigChan := make (chan os.Signal , 1 )
161- signal .Notify (sigChan , os .Interrupt , syscall .SIGTERM , syscall .SIGQUIT )
162- go func () {
163- for sig := range sigChan {
164- log .Printf ("received signal '%v', exiting\n " , sig )
165-
166- c .Close ()
167- close (eventChan )
168- os .Exit (0 )
169- }
170- }()
171-
172- dec := json .NewDecoder (resp .Body )
173- for {
174- var event * Event
175- if err := dec .Decode (& event ); err != nil {
176- if err == io .EOF {
177- break
178- }
179- log .Printf ("cannot decode json: %s\n " , err )
180- goto restart
181- }
182- eventChan <- event
183- }
184- log .Printf ("closing event channel\n " )
185- }()
186- return eventChan
187- }
188-
189- func getContainers (client * docker.Client ) ([]* RuntimeContainer , error ) {
190- apiContainers , err := client .ListContainers (docker.ListContainersOptions {
191- All : false ,
192- })
193- if err != nil {
194- return nil , err
195- }
196-
197- containers := []* RuntimeContainer {}
198- for _ , apiContainer := range apiContainers {
199- container , err := client .InspectContainer (apiContainer .ID )
200- if err != nil {
201- log .Printf ("error inspecting container: %s: %s\n " , apiContainer .ID , err )
202- continue
203- }
204-
205- registry , repository , tag := splitDockerImage (container .Config .Image )
206- runtimeContainer := & RuntimeContainer {
207- ID : container .ID ,
208- Image : DockerImage {
209- Registry : registry ,
210- Repository : repository ,
211- Tag : tag ,
212- },
213- Addresses : []Address {},
214- Env : make (map [string ]string ),
215- }
216- for k , _ := range container .NetworkSettings .Ports {
217- runtimeContainer .Addresses = append (runtimeContainer .Addresses ,
218- Address {
219- IP : container .NetworkSettings .IPAddress ,
220- Port : k .Port (),
221- })
222- }
223-
224- for _ , entry := range container .Config .Env {
225- parts := strings .Split (entry , "=" )
226- runtimeContainer .Env [parts [0 ]] = parts [1 ]
227- }
228-
229- containers = append (containers , runtimeContainer )
230- }
231- return containers , nil
232-
233- }
23495func generateFromContainers (client * docker.Client ) {
23596 containers , err := getContainers (client )
23697 if err != nil {
@@ -296,7 +157,6 @@ func generateAtInterval(client *docker.Client, configs ConfigFile) {
296157 return
297158 }
298159 }
299-
300160 }()
301161 }
302162}
@@ -316,7 +176,6 @@ func generateFromEvents(client *docker.Client, configs ConfigFile) {
316176 generateFromContainers (client )
317177 }
318178 }
319-
320179}
321180
322181func main () {
0 commit comments