Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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