1
1
package main
2
2
3
3
import (
4
- "encoding/json"
5
4
"flag"
6
5
"fmt"
7
- "io"
8
6
"log"
9
- "net"
10
- "net/http"
11
- "net/http/httputil"
12
7
"os"
13
8
"os/exec"
14
- "os/signal"
15
9
"strings"
16
10
"sync"
17
- "syscall"
18
11
"time"
19
12
20
13
"github.com/BurntSushi/toml"
@@ -65,28 +58,6 @@ func (i *DockerImage) String() string {
65
58
return ret
66
59
}
67
60
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
-
90
61
type Config struct {
91
62
Template string
92
63
Dest string
@@ -121,116 +92,6 @@ func usage() {
121
92
println ("Usage: docker-gen [-config file] [-watch=false] [-notify=\" restart xyz\" ] [-interval=0] <template> [<dest>]" )
122
93
}
123
94
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
- }
234
95
func generateFromContainers (client * docker.Client ) {
235
96
containers , err := getContainers (client )
236
97
if err != nil {
@@ -296,7 +157,6 @@ func generateAtInterval(client *docker.Client, configs ConfigFile) {
296
157
return
297
158
}
298
159
}
299
-
300
160
}()
301
161
}
302
162
}
@@ -316,7 +176,6 @@ func generateFromEvents(client *docker.Client, configs ConfigFile) {
316
176
generateFromContainers (client )
317
177
}
318
178
}
319
-
320
179
}
321
180
322
181
func main () {
0 commit comments