Repository navigation
Expand file tree
/
Copy pathnginxy.go
More file actions
223 lines (178 loc) · 5.86 KB
/
Copy pathnginxy.go
File metadata and controls
223 lines (178 loc) · 5.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
package main
import (
"fmt"
"log"
"flag"
"time"
"os"
"github.com/fsouza/go-dockerclient"
)
type Nginx struct{
ServiceName string
DomainName string
ServicePort string
Ssl string
SslKey string
SslCert string
}
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
panic(fmt.Sprintf("%s: %s", msg, err))
}
}
var serviceCount = 0
var serviceList []string
func main() {
filter := make(map[string][]string)
filter["label"] = append(filter["label"],"nginxy.domain")
params := flag.String("endpoint","/tmp/docker.sock","Docker Endpoint (socket only)")
flag.Parse()
endpoint := "unix://"+*params
client, err := docker.NewClient(endpoint)
if err != nil {
panic(err)
}
// get the current list services and service count
serviceCount,serviceList := getServiceCount(client,filter)
imgs, err := client.ListServices(docker.ListServicesOptions{Filters: filter})
if err != nil {
panic(err)
}
for _, img := range imgs {
if ((serviceCount != 0)&& (img.Spec.Labels["nginxy.domain"] != "")){
// -- Generate the start configuration
name := img.Spec.Name
// check configuration is exist or not
_,filerr := os.Stat("/etc/nginx/conf.d/"+name+".conf")
if (filerr != nil){ // if didn't have configuration, then create the configuration
domain := img.Spec.Labels["nginxy.domain"]
port := img.Spec.Labels["nginxy.port"]
ssl := img.Spec.Labels["nginxy.ssl"]
key := img.Spec.Labels["nginxy.ssl.key"]
cert := img.Spec.Labels["nginxy.ssl.cert"]
nginxconf := Nginx{ServiceName:name,DomainName:domain,ServicePort:port,Ssl:ssl,SslKey:key,SslCert:cert}
fmt.Println(nginxconf)
nginxconf.WriteConf() // write the nginx configuration based on the name
reloadNginx()
} else {
log.Printf("File configuration of %s already exist, skip creating configuration for %s\n",img.Spec.Name)
}
}
}
log.Println("Jumlah Service : ",serviceCount)
// -- goruoutine start
forever := make(chan bool)
go func() {
for 1 < 5 {
// execution go here
currentCount,currentList := getServiceCount(client,filter)
// fmt.Printf("Current list : %v , awal Service List : %v\n",currentList,serviceList)
// fmt.Printf("Current Count : %v , awal Service Count : %v\n",currentCount,serviceCount)
// if currentCount > serviceCount do add new services
if(currentCount > serviceCount) {
// new Services, create new configuration
// get the differences services (check for new services)
diff := difference(currentList,serviceList)
for _, nama := range diff {
svcID := getServiceID(client,filter,nama)
detail, err := client.InspectService(svcID)
if err != nil {
log.Println(err)
}
name := detail.Spec.Name
domain := detail.Spec.Labels["nginxy.domain"]
port := detail.Spec.Labels["nginxy.port"]
ssl := detail.Spec.Labels["nginxy.ssl"]
key := detail.Spec.Labels["nginxy.ssl.key"]
cert := detail.Spec.Labels["nginxy.ssl.cert"]
nginxconf := Nginx{ServiceName:name,DomainName:domain,ServicePort:port,Ssl:ssl,SslKey:key,SslCert:cert}
fmt.Println(nginxconf)
nginxconf.WriteConf() // write the nginx configuration based on the name
reloadNginx()
}
serviceList = currentList
serviceCount++
// increment the serviceCount
}
if(currentCount < serviceCount) {
// fmt.Printf("masuk hapus current list : %v , Service List : %v",currentList,serviceList)
// delete the configuration because the service is deleted
// get the differences
diff := difference(currentList,serviceList)
for _, nama := range diff {
path := "/etc/nginx/conf.d/"+nama+".conf"
err := os.Remove(path)
if err != nil {
log.Println(err)
}else{
serviceCount--
// how to delete the element ??
serviceList = currentList
reloadNginx()
log.Println("Removing service ",nama)
}
}
}
time.Sleep(1 * time.Second)
// end
}
}()
log.Printf(" [*] Waiting for Docker Event(s). CTRL+C to exit\n")
<-forever
// -- goroutine end
}
// to get current service list
func getServiceCount(client *docker.Client,filter map[string][]string) (int ,[]string) {
var listSvc []string
localCount := 0
imgs, err := client.ListServices(docker.ListServicesOptions{Filters: filter})
if err != nil {
panic(err)
}
for _,img := range imgs {
listSvc = append(listSvc,img.Spec.Name)
localCount++
}
return localCount,listSvc
}
// to get list of differences between 2 slices
func difference(slice1 []string, slice2 []string) []string {
var diff []string
536B
// Loop two times, first to find slice1 strings not in slice2,
// second loop to find slice2 strings not in slice1
for i := 0; i < 2; i++ {
for _, s1 := range slice1 {
found := false
for _, s2 := range slice2 {
if s1 == s2 {
found = true
break
}
}
// String not found. We add it to return slice
if !found {
diff = append(diff, s1)
}
}
// Swap the slices, only if it was the first loop
if i == 0 {
slice1, slice2 = slice2, slice1
}
}
return diff
}
// find the current Service ID's
func getServiceID( client *docker.Client,filter map[string][]string,name string) string {
imgs, err := client.ListServices(docker.ListServicesOptions{Filters: filter})
if err != nil {
panic(err)
}
for _,img := range imgs {
if(img.Spec.Name == name){
return img.ID
break
}
}
return ""
}