diff options
author | Casey Deccio <casey@deccio.net> | 2019-06-28 22:44:58 +0300 |
---|---|---|
committer | Casey Deccio <casey@deccio.net> | 2019-06-28 22:44:58 +0300 |
commit | 6e8451ce2944eef0c64f629fa99f2ef8bcce661f (patch) | |
tree | 31f1817c8410972ddd3b03f96ea7fbf32fe89876 | |
parent | 54de8186268d9025645e3c5fcfceab2bdc9f5fc7 (diff) |
Populate server status
-rw-r--r-- | dnsviz/analysis/offline.py | 42 | ||||
-rw-r--r-- | dnsviz/analysis/status.py | 16 |
2 files changed, 58 insertions, 0 deletions
diff --git a/dnsviz/analysis/offline.py b/dnsviz/analysis/offline.py index a3db2e0..f155b1c 100644 --- a/dnsviz/analysis/offline.py +++ b/dnsviz/analysis/offline.py @@ -776,6 +776,47 @@ class OfflineDomainNameAnalysis(OnlineDomainNameAnalysis): (not x.effective_tcp and x.udp_responsive)) and \ (not require_valid or x.is_valid_response())) + def _initialize_server_checklist(self): + self.server_checklist = OrderedDict() + + if not self.is_zone(): + return + + for status in ('UDP_RESPONSIVE', 'TCP_RESPONSIVE'): + self.server_checklist[status] = {} + + for query in self.queries.values(): + for query1 in query.queries.values(): + for server in query1.responses: + for client in query1.responses[server]: + response = query1.responses[server][client] + if response.udp_attempted: + if response.udp_responsive: + if server not in self.server_checklist['UDP_RESPONSIVE']: + self.server_checklist['UDP_RESPONSIVE'][server] = Status.ServerStatusResponsive('UDP_RESPONSIVE', Status.SERVER_CHECKLIST_STATUS_OK) + elif self.server_checklist['UDP_RESPONSIVE'][server].status == Status.SERVER_CHECKLIST_STATUS_ERROR: + self.server_checklist['UDP_RESPONSIVE'][server].status = Status.SERVER_CHECKLIST_STATUS_WARNING + self.server_checklist['UDP_RESPONSIVE'][server].successes += 1 + else: + if server not in self.server_checklist['UDP_RESPONSIVE']: + self.server_checklist['UDP_RESPONSIVE'][server] = Status.ServerStatusResponsive('UDP_RESPONSIVE', Status.SERVER_CHECKLIST_STATUS_ERROR) + elif self.server_checklist['UDP_RESPONSIVE'][server].status == Status.SERVER_CHECKLIST_STATUS_OK: + self.server_checklist['UDP_RESPONSIVE'][server].status = Status.SERVER_CHECKLIST_STATUS_WARNING + self.server_checklist['UDP_RESPONSIVE'][server].failures += 1 + if response.tcp_attempted: + if response.tcp_responsive: + if server not in self.server_checklist['TCP_RESPONSIVE']: + self.server_checklist['TCP_RESPONSIVE'][server] = Status.ServerStatusResponsive('TCP_RESPONSIVE', Status.SERVER_CHECKLIST_STATUS_OK) + elif self.server_checklist['TCP_RESPONSIVE'][server].status == Status.SERVER_CHECKLIST_STATUS_ERROR: + self.server_checklist['TCP_RESPONSIVE'][server].status = Status.SERVER_CHECKLIST_STATUS_WARNING + self.server_checklist['TCP_RESPONSIVE'][server].successes += 1 + else: + if server not in self.server_checklist['TCP_RESPONSIVE']: + self.server_checklist['TCP_RESPONSIVE'][server] = Status.ServerStatusResponsive('TCP_RESPONSIVE', Status.SERVER_CHECKLIST_STATUS_ERROR) + elif self.server_checklist['TCP_RESPONSIVE'][server].status == Status.SERVER_CHECKLIST_STATUS_OK: + self.server_checklist['TCP_RESPONSIVE'][server].status = Status.SERVER_CHECKLIST_STATUS_WARNING + self.server_checklist['TCP_RESPONSIVE'][server].failures += 1 + def populate_status(self, trusted_keys, supported_algs=None, supported_digest_algs=None, is_dlv=False, trace=None, follow_mx=True): if trace is None: trace = [] @@ -829,6 +870,7 @@ class OfflineDomainNameAnalysis(OnlineDomainNameAnalysis): self.dlv_parent.populate_status(trusted_keys, supported_algs, supported_digest_algs, is_dlv=True, trace=trace + [self]) _logger.debug('Assessing status of %s...' % (fmt.humanize_name(self.name))) + self._initialize_server_checklist() self._populate_name_status() self._index_dnskeys() self._populate_rrsig_status_all(supported_algs) diff --git a/dnsviz/analysis/status.py b/dnsviz/analysis/status.py index d349ded..618da37 100644 --- a/dnsviz/analysis/status.py +++ b/dnsviz/analysis/status.py @@ -169,6 +169,11 @@ RRSIG_SIG_LENGTH_ERRORS = { DS_DIGEST_ALGS_STRONGER_THAN_SHA1 = (2, 4) DS_DIGEST_ALGS_IGNORING_SHA1 = (2,) +SERVER_CHECKLIST_STATUS_OK = 0 +SERVER_CHECKLIST_STATUS_INDETERMINATE = 1 +SERVER_CHECKLIST_STATUS_WARNING = 2 +SERVER_CHECKLIST_STATUS_ERROR = 3 + class RRSIGStatus(object): def __init__(self, rrset, rrsig, dnskey, zone_name, reference_ts, supported_algs): self.rrset = rrset @@ -1553,3 +1558,14 @@ class CNAMEFromDNAMEStatus(object): d['errors'] = [e.serialize(consolidate_clients=consolidate_clients, html_format=html_format) for e in self.errors] return d + +class ServerStatus(object): + def __init__(self, terse_description, status): + self.terse_description = terse_description + self.status = status + +class ServerStatusResponsive(ServerStatus): + def __init__(self, terse_description, status): + super(ServerStatusResponsive, self).__init__(terse_description, status) + self.successes = 0 + self.failures = 0 |