-
Notifications
You must be signed in to change notification settings - Fork 0
/
daemon.go
146 lines (113 loc) · 2.89 KB
/
daemon.go
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
package main
import (
"log"
)
var (
paths map[string]string
needsUpdate []string
found bool
KeepalivedFiles map[string]string
)
func Summon() {
// init paths map for tracking updates and data
paths = make(map[string]string)
KeepalivedFiles = make(map[string]string)
// LDAP connect
l, err := LDAPConnect()
if err != nil {
log.Fatalf("Connection error: %v\n", err)
}
defer l.Close()
// Bind and search for timestamps
result, err := LDAPSearch(l, c.HostDN, []string{"modifyTimestamp"})
if err != nil {
log.Fatalf("LDAP search error: %v\n", err)
//continue
}
// mark files that need updating
for _, entry := range result.Entries {
if val, ok := paths[entry.DN]; ok {
if entry.GetAttributeValue("modifyTimestamp") == val {
// no update needed
continue
}
}
log.Printf("%s is outdated\n", entry.DN)
needsUpdate = append(needsUpdate, entry.DN)
paths[entry.DN] = entry.GetAttributeValue("modifyTimestamp")
}
// grab file data from LDAP
for _, dn := range needsUpdate {
// search for files needing updates
result, err = LDAPSearch(l, dn, []string{})
if err != nil {
// In case dn changes before we can search again
// Print error but do not exit
log.Printf("LDAP search error: %v\n", err)
continue
}
// generate files based on objectClass
entry := result.Entries[0]
found = false
for _, oc := range entry.GetAttributeValues("objectClass") {
switch oc {
case "keepalivedGlobalConfig":
f := Kalived{}
err = entry.Unmarshal(&f)
if err != nil {
log.Fatalf("Unmarshal error: %v\n", err)
}
if c.Debug {
log.Printf("Formatting keepalived config for %s at %s\n", entry.DN, f.Path)
}
err = FormatKeepalived(f, "global")
if err != nil {
log.Fatalf("Formatting error: %v\n", err)
}
found = true
break
case "keepalivedVRRPGroupConfig":
f := Kalived{}
err = entry.Unmarshal(&f)
if err != nil {
log.Fatalf("Unmarshal error: %v\n", err)
}
if c.Debug {
log.Printf("Formatting keepalived config for %s at %s\n", entry.DN, f.Path)
}
err = FormatKeepalived(f, "group")
if err != nil {
log.Fatalf("Formatting error: %v\n", err)
}
found = true
break
case "keepalivedVRRPInstanceConfig":
//format
found = true
break
}
}
if found != true {
f := File{}
err = entry.Unmarshal(&f)
if err != nil {
log.Fatalf("Unmarshal error: %v\n", err)
}
if c.Debug {
log.Printf("Writing config file for %s at %s\n", f.CN, f.Path)
}
err = WriteFile(f.Path, f.Data, f.Perm)
if err != nil {
log.Fatalf("File generation error: %v\n", err)
}
}
}
// write keepalived files
for file, data := range KeepalivedFiles {
if c.Debug {
log.Printf("Writing config file to %s\n", file)
}
WriteFile(file, data, "")
}
needsUpdate = nil
}