2929ENDPOINT_KEY = os .getenv ("ENDPOINT_KEY" )
3030
3131DISCOVERY_INTERVAL = os .getenv ("DISCOVERY_INTERVAL" )
32+ FULL_DISCOVERY_INTERVAL = os .getenv ("FULL_DISCOVERY_INTERVAL" )
33+
34+ fullDiscoveryRatio = 0
3235
3336dockerClient = DockerClient (base_url = "unix://var/run/docker.sock" )
3437
@@ -60,19 +63,25 @@ def getHostsFromLabels(labels):
6063
6164 return hosts
6265
63- def updateEnabledContainers ():
66+ def getEnabledContainers ():
67+ newContainers = []
68+
69+ try :
70+ newContainers = dockerClient .containers .list (filters = {"label" : "discovery.enable=true" })
71+ except Exception as e :
72+ logger .error (f"Error fetching containers: { str (e )} " )
73+
74+ return newContainers
75+
76+ def getDiscovery ():
6477 diffs = {
6578 "removed" : [],
6679 "added" : []
6780 }
6881
6982 global containers
70- newContainers = []
7183
72- try :
73- newContainers = dockerClient .containers .list (filters = {"label" : "discovery.enable=true" })
74- except Exception as e :
75- logger .error (f"Error fetching containers: { str (e )} " )
84+ newContainers = getEnabledContainers ()
7685
7786 containerDiff = getDiff (containers , newContainers )
7887
@@ -124,6 +133,23 @@ def updateEnabledContainers():
124133
125134 return diffs
126135
136+ def getFullDiscovery ():
137+ diffs = {
138+ "removed" : [],
139+ "added" : []
140+ }
141+
142+ newContainers = getEnabledContainers ()
143+
144+ logger .info (f"Found { newContainers .__len__ ()} Containers" )
145+
146+ for container in newContainers :
147+ hosts = getHostsFromLabels (container .labels )
148+
149+ diffs .get ("added" ).extend (hosts )
150+
151+ return diffs
152+
127153def cleanDiff (diff ):
128154 removed , added = set (diff .get ("removed" )), set (diff .get ("added" ))
129155
@@ -163,21 +189,49 @@ def sendDiffToEndpoint(diff):
163189# thread = threading.Thread(target=main, daemon=True)
164190# thread.start()
165191
192+ def doDiscovery ():
193+ logger .debug ("Starting Discovery" )
194+
195+ globalDiff = getDiscovery ()
196+
197+ logger .debug ("Cleaning Diff" )
198+
199+ return cleanDiff (globalDiff )
200+
201+ def doFullDiscovery ():
202+ logger .debug ("Starting Full Discovery" )
203+
204+ globalDiff = getFullDiscovery ()
205+
206+ return globalDiff
207+
166208def main ():
209+ i = 0
167210 while True :
168- logger . info ( f"Starting Discover in { DISCOVERY_INTERVAL } ..." )
211+ isFullDiscovery = False
169212
170- sleep ( DISCOVERY_INTERVAL )
171-
172- logger . info ( "Starting Discovery" )
213+ if i == fullDiscoveryRatio :
214+ isFullDiscovery = True
215+ i = 0
173216
174- globalDiff = updateEnabledContainers ()
217+ if not isFullDiscovery :
218+ logger .info (f"Starting Discover in { DISCOVERY_INTERVAL } ..." )
219+ else :
220+ logger .info (f"Starting Full Discover in { DISCOVERY_INTERVAL } ..." )
175221
176- logger . debug ( "Cleaning Diff" )
222+ sleep ( DISCOVERY_INTERVAL )
177223
178- globalDiff = cleanDiff (globalDiff )
224+ globalDiff = {
225+ "removed" : [],
226+ "added" : []
227+ }
179228
180- # Check if there is actually any Diff
229+ if not isFullDiscovery :
230+ globalDiff = doDiscovery ()
231+ else :
232+ globalDiff = doFullDiscovery ()
233+
234+ # Check if there are any Changes
181235 if globalDiff .get ("removed" ).__len__ () + globalDiff .get ("added" ).__len__ () <= 0 :
182236 logger .debug ("No Changes were made, skipping..." )
183237 continue
@@ -188,6 +242,8 @@ def main():
188242
189243 logger .debug (f"Endpoint responded with { response .text } { response .status_code } { "OK" if response .ok else "NOT OK" } " )
190244
245+ i += 1
246+
191247if __name__ == '__main__' :
192248 logger .setLevel (level = LOG_LEVEL )
193249
@@ -203,6 +259,17 @@ def main():
203259 logger .warning (f"No DISCOVERY_INTERVAL set, using 30sec as default" )
204260 DISCOVERY_INTERVAL = 30
205261
262+ if not FULL_DISCOVERY_INTERVAL :
263+ logger .warning (f"No FULL_DISCOVERY_INTERVAL set, disregarding Full Discoveries" )
264+ FULL_DISCOVERY_INTERVAL = 0
265+ elif FULL_DISCOVERY_INTERVAL % DISCOVERY_INTERVAL != 0 :
266+ logger .warning (f"FULL_DISCOVERY_INTERVAL is not a valid Integer, rounding to nearest Int" )
267+ FULL_DISCOVERY_INTERVAL = round (FULL_DISCOVERY_INTERVAL )
268+
269+ if FULL_DISCOVERY_INTERVAL != 0 :
270+ fullDiscoveryRatio = FULL_DISCOVERY_INTERVAL / DISCOVERY_INTERVAL
271+ logger .debug (f"FULL_DISCOVERY_INTERVAL ratio set to { fullDiscoveryRatio } " )
272+
206273 if not ENDPOINT_KEY or ENDPOINT_KEY == "" :
207274 logger .warning (f"No ENDPOINT_KEY set, requests may be denied" )
208275
0 commit comments