green-spider/checks/dns_resolution.py

69 lines
1.9 KiB
Python

"""
This check attempts to resolve all hostnames/domains in the input URLs.
URLs which are not resolvable are removed from the config.
"""
import logging
from urllib.parse import urlparse
from urllib.parse import urlunparse
import dns.resolver
from checks.abstract_checker import AbstractChecker
class Checker(AbstractChecker):
def __init__(self, config, previous_results=None):
super().__init__(config, previous_results)
def run(self):
"""Executes the check routine, returns result dict"""
results = {}
urls = list(self.config.urls)
for url in urls:
parsed = urlparse(url)
results[url] = self.resolve_hostname(parsed.hostname)
# remove URL if IPv4 non-resolvable
if not results[url]['resolvable_ipv4']:
self.config.remove_url(url)
return results
def resolve_hostname(self, hostname):
"""
Resolve one to IPv4 address(es)
"""
result = {
'hostname': hostname,
'resolvable_ipv4': False,
'resolvable_ipv6': False,
'aliases': [],
'ipv4_addresses': [],
'ipv6_addresses': [],
}
# IPv4
try:
answers = dns.resolver.query(hostname, "A")
result['resolvable_ipv4'] = True
for rdata in answers:
result['ipv4_addresses'].append(rdata.address)
except Exception as e:
logging.debug("Hostname %s not resolvable via IPv4. Exception: %r" % (hostname, e))
# IPv6
try:
answers = dns.resolver.query(hostname, "AAAA")
result['resolvable_ipv6'] = True
for rdata in answers:
result['ipv6_addresses'].append(rdata.address)
except Exception as e:
logging.debug("Hostname %s not resolvable via IPv6. Exception: %r" % (hostname, e))
return result