1717EXIT_SUCCESS = 0
1818
1919PROGNAME = 'domaincheck'
20- VERSION = '0.2 '
20+ VERSION = '0.3 '
2121
2222# A data structure to hold our findings.
2323# This conveniently serializes directly to JSON.
@@ -162,49 +162,100 @@ def getResolver(resolver):
162162
163163
164164def lookup (dns_aspect , domain_name , rr , pattern = "" ):
165+ global RESULT
165166 data = None
166167
167- if 'timeout' in RESULT [domain ]:
168+ if domain_name not in RESULT :
169+ RESULT [domain_name ] = {}
170+
171+ if 'timeout' in RESULT [domain_name ]:
168172 return
169173
170- verbose ("Checking '{:s}' for domain '{:s}'..." .format (dns_aspect , domain ), 2 )
174+ verbose ("Checking '{:s}' for domain '{:s}'..." .format (dns_aspect , domain_name ), 2 )
171175 try :
172176 data = RESOLVER .resolve (domain_name , rr )
173177 except dns .resolver .LifetimeTimeout :
174- RESULT [domain ]['timeout' ] = True
178+ RESULT [domain_name ]['timeout' ] = True
175179 print ("DNS query for {:s} {:s} timed out." .format (domain_name , rr ), file = sys .stderr )
176180 except Exception as e :
177181 if VERBOSITY > 3 :
178182 print ("Lookup Exception:" , e , file = sys .stderr )
179183 return
180184
181- if data != None :
185+ if data is not None :
182186 for result in data :
183187 pattern_found = (pattern and (pattern in str (result )))
184188
185189 if pattern == "" or pattern_found :
186190 result = str (result ).strip ('\" ' )
187- if dns_aspect in RESULT [domain ]:
188- RESULT [domain ][dns_aspect ]['count' ] += 1
189- RESULT [domain ][dns_aspect ]['value' ].append (result )
191+ if dns_aspect in RESULT [domain_name ]:
192+ RESULT [domain_name ][dns_aspect ]['count' ] += 1
193+ RESULT [domain_name ][dns_aspect ]['value' ].append (result )
190194 else :
191- RESULT [domain ][dns_aspect ] = {
195+ RESULT [domain_name ][dns_aspect ] = {
192196 'count' : 1 ,
193197 'value' : [result ]
194198 }
195199
196200 if data .rdtype == dns .rdatatype .DNSKEY :
197201 validateDNSSEC (domain_name )
198202
199- return True
200-
203+ return True
204+
205+ def lookup2 (dns_aspect , domain_name , rr , pattern = "" ):
206+ result = {}
207+ data = None
208+
209+ result [domain_name ] = {}
210+
211+ if 'timeout' in result [domain_name ]:
212+ return
213+
214+ try :
215+ r = dns .resolver .Resolver ()
216+ r .timeout = 1
217+ r .lifetime = 1
218+ r .nameservers = ["8.8.8.8" ]
219+ data = r .resolve (domain_name , rr )
220+ except dns .resolver .LifetimeTimeout :
221+ result [domain_name ]['timeout' ] = True
222+ print ("DNS query for {:s} {:s} timed out." .format (domain_name , rr ), file = sys .stderr )
223+ except Exception as e :
224+ if VERBOSITY > 3 :
225+ print ("Lookup Exception:" , e , file = sys .stderr )
226+ return
227+ if data is not None :
228+ for results in data :
229+ pattern_found = (pattern and (pattern in str (results )))
230+ if pattern == "" or pattern_found :
231+ results = str (results ).strip ('\" ' )
232+
233+ if dns_aspect in result [domain_name ]:
234+ result [domain_name ][dns_aspect ]['count' ] += 1
235+ result [domain_name ][dns_aspect ]['value' ].append (results )
236+ else :
237+ result [domain_name ][dns_aspect ] = {
238+ 'count' : 1 ,
239+ 'value' : [results ]
240+ }
241+ if data .rdtype == dns .rdatatype .DNSKEY :
242+ validateDNSSEC (domain_name )
243+
244+ return result
245+
201246
202247def performAllChecks (domain ):
203248 for key in LOOKUPS .keys ():
204249 config = LOOKUPS [key ]
205250 lookup (key , config ['domain_prefix' ] + domain ,
206251 config ['rr' ], config ['pattern' ])
207-
252+ def performAllChecks2 (domain ):
253+ result = {}
254+ for key in LOOKUPS .keys ():
255+ config = LOOKUPS [key ]
256+ result [key ]= lookup2 (key , config ['domain_prefix' ] + domain ,
257+ config ['rr' ], config ['pattern' ])
258+ return (result )
208259
209260def printCsv (domain , lineNum ):
210261 if lineNum == 1 :
@@ -335,6 +386,33 @@ def verbose(msg, level=1):
335386###
336387# Main
337388###
389+ def main (domains , lookup_types = None , output_format = 'json' , resolver = None , verbosity = 0 ):
390+
391+ global LOOKUPS_WANTED , OUTPUT_FORMAT , RESOLVER , VERBOSITY
392+ LOOKUPS_WANTED = lookup_types or ['all' ]
393+ OUTPUT_FORMAT = output_format
394+ RESOLVER = getResolver (resolver )
395+ VERBOSITY = verbosity
396+ result = {}
397+ for domain in domains :
398+ verbose (f"Checking domain '{ domain } '..." )
399+ if 'all' in LOOKUPS_WANTED :
400+ result [domain ]= performAllChecks2 (domain )
401+ else :
402+ for l in LOOKUPS_WANTED :
403+ config = LOOKUPS [l ]
404+ result [l ]= lookup2 (l , config ['domain_prefix' ] + domain ,
405+ config ['rr' ], config ['pattern' ])
406+
407+ if OUTPUT_FORMAT == 'json' :
408+ try :
409+ j = json .dumps (result , indent = 2 )
410+ except BaseException as err :
411+ print ("Unable to jsonify result?\n {:s}" .format (err ), file = sys .stderr )
412+ sys .exit (EXIT_FAILURE )
413+ return (j )
414+
415+ else : "only json output is supported"
338416if __name__ == "__main__" :
339417
340418 getopts ()
@@ -372,4 +450,4 @@ def verbose(msg, level=1):
372450 if OUTPUT_FORMAT == 'json' :
373451 printJson ()
374452
375- sys .exit (EXIT_SUCCESS )
453+ sys .exit (EXIT_SUCCESS )
0 commit comments