Source code for insights.cleaner.hostname

"""
Hostname Obfuscation
====================
"""

import logging
import hashlib
import os
import re

from insights.cleaner.utilities import write_report

logger = logging.getLogger(__name__)


[docs] class Hostname(object): """ Class for obfuscating hostname. .. note:: Currently, only the system hostname will be obfuscated, see: - https://docs.redhat.com/en/documentation/red_hat_insights/1-latest/html/client_configuration_guide_for_red_hat_insights/assembly-client-data-obfuscation#proc-obfuscating-hostname_insights-cg-obfuscation """ def __init__(self, fqdn): # - Hostname obfuscate information # - original hostname : obfuscated hostname self._hn_db = dict() fqdn_split = fqdn.split('.') self.pattern = ( None if len(fqdn_split) <= 1 else r'(?![\W\-\:\ \.])[a-zA-Z0-9\-\_\.]*\.{0}'.format('.'.join(fqdn_split[1:])) ) self._hostname = fqdn_split[0] self._hn2db(fqdn) def _hn2db(self, hn): ''' Add a hostname to DB or return an existing entry ''' # Check db first if hn in self._hn_db: return self._hn_db[hn] # Handle domain hn_sp = hn.split('.') obf_hn = hashlib.sha1(hn_sp[0].encode('utf-8')).hexdigest()[:12] if len(hn_sp) > 1: obf_hn = '{0}.{1}'.format(obf_hn, 'example.com') self._hn_db[hn] = obf_hn return obf_hn
[docs] def parse_line(self, line, **kwargs): ''' Replace the exact hostname and all instances of the known domain with the obfuscated alternatives. ''' if not line: return line try: if self.pattern: hostnames = [each for each in re.findall(self.pattern, line)] for hn in hostnames: new_hn = self._hn2db(hn) logger.debug("Obfuscating FQDN - {0} > {1}".format(hn, new_hn)) line = line.replace(hn, new_hn) # catch any non-fqdn instances of the system hostname if self._hostname in line: line = line.replace(self._hostname, self._hn2db(self._hostname)) return line except Exception as e: # pragma: no cover logger.warning(e) raise Exception('SubHostnameError: Unable to Substitute Hostname/Domainname')
[docs] def mapping(self): mapping = [] for ori, obf in self._hn_db.items(): mapping.append({'original': ori, 'obfuscated': obf}) return mapping
[docs] def generate_report(self, report_dir, archive_name): try: hn_report_file = os.path.join(report_dir, "%s-hostname.csv" % archive_name) logger.info('Creating Hostname Report - %s', hn_report_file) lines = ['Obfuscated Hostname,Original Hostname'] if self._hn_db: for ori, obf in self._hn_db.items(): lines.append('{0},{1}'.format(obf, ori)) else: # pragma: no cover # never false lines.append('None,None') except Exception as e: # pragma: no cover logger.exception(e) raise Exception('CreateReport Error: Error Creating Hostname Report') write_report(lines, hn_report_file) logger.info('Completed Hostname Report.')