Skip to content

Commit 126a081

Browse files
authored
Merge pull request #2 from intelowlproject/usable-imports
fix
2 parents 8513633 + 2d9f3b8 commit 126a081

1 file changed

Lines changed: 91 additions & 13 deletions

File tree

domaincheck/domaincheck.py

Lines changed: 91 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
EXIT_SUCCESS = 0
1818

1919
PROGNAME = '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

164164
def 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

202247
def 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

209260
def 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"
338416
if __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

Comments
 (0)