2018-10-03 11:05:42 +02:00
|
|
|
"""
|
|
|
|
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
|
|
|
|
|
2019-07-15 22:59:33 +02:00
|
|
|
import dns.resolver
|
|
|
|
|
2018-10-03 11:05:42 +02:00
|
|
|
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)
|
|
|
|
|
2019-07-15 22:59:33 +02:00
|
|
|
# remove URL if IPv4 non-resolvable
|
|
|
|
if not results[url]['resolvable_ipv4']:
|
2018-10-03 11:05:42 +02:00
|
|
|
self.config.remove_url(url)
|
|
|
|
|
|
|
|
return results
|
|
|
|
|
|
|
|
def resolve_hostname(self, hostname):
|
|
|
|
"""
|
|
|
|
Resolve one to IPv4 address(es)
|
|
|
|
"""
|
|
|
|
result = {
|
|
|
|
'hostname': hostname,
|
2019-07-15 22:59:33 +02:00
|
|
|
'resolvable_ipv4': False,
|
|
|
|
'resolvable_ipv6': False,
|
2018-10-03 11:05:42 +02:00
|
|
|
'aliases': [],
|
|
|
|
'ipv4_addresses': [],
|
2019-07-15 22:59:33 +02:00
|
|
|
'ipv6_addresses': [],
|
2018-10-03 11:05:42 +02:00
|
|
|
}
|
|
|
|
|
2019-07-15 22:59:33 +02:00
|
|
|
# IPv4
|
|
|
|
try:
|
2022-10-24 21:35:15 +02:00
|
|
|
answers = dns.resolver.resolve(hostname, "A")
|
2019-07-15 22:59:33 +02:00
|
|
|
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
|
2018-10-03 11:05:42 +02:00
|
|
|
try:
|
2022-10-24 21:35:15 +02:00
|
|
|
answers = dns.resolver.resolve(hostname, "AAAA")
|
2019-07-15 22:59:33 +02:00
|
|
|
result['resolvable_ipv6'] = True
|
|
|
|
for rdata in answers:
|
|
|
|
result['ipv6_addresses'].append(rdata.address)
|
2018-10-03 11:05:42 +02:00
|
|
|
except Exception as e:
|
2019-11-22 08:38:26 +01:00
|
|
|
logging.debug("Hostname %s not resolvable via IPv6. Exception: %r" % (hostname, e))
|
2018-10-03 11:05:42 +02:00
|
|
|
|
|
|
|
return result
|