class SoSUsernameParser(SoSCleanerParser): """Parser for obfuscating usernames within an sosreport archive. Note that this parser does not rely on regex matching directly, like most other parsers do. Instead, usernames are discovered via scraping the collected output of lastlog. As such, we do not discover new usernames later on, and only usernames present in lastlog output will be obfuscated, and those passed via the --usernames option if one is provided. """ name = 'Username Parser' map_file_key = 'username_map' prep_map_file = [ 'sos_commands/login/lastlog_-u_1000-60000', 'sos_commands/login/lastlog_-u_60001-65536', 'sos_commands/login/lastlog_-u_65537-4294967295', # AD users will be reported here, but favor the lastlog files since # those will include local users who have not logged in 'sos_commands/login/last' ] regex_patterns = [] skip_list = [ 'core', 'nobody', 'nfsnobody', 'shutdown', 'reboot', 'root', 'ubuntu', 'wtmp' ] def __init__(self, config, opt_names=None): self.mapping = SoSUsernameMap() super(SoSUsernameParser, self).__init__(config) self.mapping.load_names_from_options(opt_names) def load_usernames_into_map(self, content): """Since we don't get the list of usernames from a straight regex for this parser, we need to override the initial parser prepping here. """ users = set() for line in content.splitlines()[1:]: try: user = line.split()[0] except Exception: continue if user in self.skip_list: continue users.add(user) for each in users: self.mapping.get(each) def parse_line(self, line): count = 0 for username in sorted(self.mapping.dataset.keys(), reverse=True): if username in line: count = line.count(username) line = line.replace(username, self.mapping.get(username)) return line, count
class SoSUsernameParser(SoSCleanerParser): """Parser for obfuscating usernames within an sosreport archive. Note that this parser does not rely on regex matching directly, like most other parsers do. Instead, usernames are discovered via scraping the collected output of lastlog. As such, we do not discover new usernames later on, and only usernames present in lastlog output will be obfuscated, and those passed via the --usernames option if one is provided. """ name = 'Username Parser' map_file_key = 'username_map' regex_patterns = [] skip_list = [ 'core', 'nobody', 'nfsnobody', 'shutdown', 'reboot', 'root', 'ubuntu', 'username', 'wtmp' ] def __init__(self, config, opt_names=None): self.mapping = SoSUsernameMap() super(SoSUsernameParser, self).__init__(config) self.mapping.load_names_from_options(opt_names) def load_usernames_into_map(self, content): """Since we don't get the list of usernames from a straight regex for this parser, we need to override the initial parser prepping here. """ users = set() for line in content.splitlines(): try: user = line.split()[0] except Exception: continue if user.lower() in self.skip_list: continue users.add(user) for each in users: self.mapping.get(each) def parse_line(self, line): count = 0 for username in sorted(self.mapping.dataset.keys(), reverse=True): _reg = re.compile(username, re.I) if _reg.search(line): line, count = _reg.subn(self.mapping.get(username.lower()), line) return line, count
class SoSUsernameParser(SoSCleanerParser): """Parser for obfuscating usernames within an sosreport archive. Note that this parser does not rely on regex matching directly, like most other parsers do. Instead, usernames are discovered via scraping the collected output of lastlog. As such, we do not discover new usernames later on, and only usernames present in lastlog output will be obfuscated, and those passed via the --usernames option if one is provided. """ name = 'Username Parser' map_file_key = 'username_map' prep_map_file = 'sos_commands/login/lastlog_-u_1000-60000' regex_patterns = [] skip_list = [ 'nobody', 'nfsnobody', 'root', 'ubuntu' ] def __init__(self, conf_file=None, opt_names=None): self.mapping = SoSUsernameMap() super(SoSUsernameParser, self).__init__(conf_file) self.mapping.load_names_from_options(opt_names) def load_usernames_into_map(self, content): """Since we don't get the list of usernames from a straight regex for this parser, we need to override the initial parser prepping here. """ for line in content.splitlines()[1:]: user = line.split()[0] if user in self.skip_list: continue self.mapping.get(user) def parse_line(self, line): count = 0 for username in self.mapping.dataset.keys(): if username in line: count = line.count(username) line = line.replace(username, self.mapping.get(username)) return line, count
def __init__(self, conf_file=None, opt_names=None): self.mapping = SoSUsernameMap() super(SoSUsernameParser, self).__init__(conf_file) self.mapping.load_names_from_options(opt_names)