Source code for insights.combiners.modprobe

"""
Modprobe configuration
======================

The modprobe configuration files are normally available to rules as a list of
ModProbe objects.  This combiner turns those into one set of data, preserving
the original file name that defined modprobe configuration line using a tuple.

"""

from insights.core.plugins import combiner
from insights.parsers.modprobe import ModProbe
from .. import LegacyItemAccess

from collections import namedtuple


ModProbeValue = namedtuple("ModProbeValue", ['value', 'source'])
"""
A value from a ModProbe source
"""


[docs] @combiner(ModProbe) class AllModProbe(LegacyItemAccess): """ Combiner for accessing all the modprobe configuration files in one structure. It's important for our reporting and information purposes to know not only what the configuration was but where it was defined. Therefore, the format of the data in this combiner is slightly different compared to the ModProbe parser. Here, each 'value' is actually a 2-tuple, with the actual data first and the file name from whence the value came second. This does mean that you need to pull the value out of each item - e.g. using a list comprehension - but it means that every item is associated with the file it was defined in. In line with the ModProbe configuration parser, the actual value is usually a list of the space-separated parts on the line, and the definitions for each module are similarly kept in a list, which makes Thanks to the LegacyItemAccess class, this can also be treated as a dictionary for look-ups of data in the `data` attribute. Attributes: data (dict): The combined data structures, with each item as a 2-tuple, as described above. bad_lines(list): The list of unparseable lines from all files, with each line as a 2-tuple as described above. Sample data files:: /etc/modprobe.conf: # watchdog drivers blacklist i8xx_tco # Don't install the Firewire ethernet driver install eth1394 /bin/true /etc/modprobe.conf.d/no_ipv6.conf: options ipv6 disable=1 install ipv6 /bin/true Examples: >>> all_modprobe = shared[AllModProbe] >>> all_modprobe['alias'] [] >>> all_modprobe['blacklist'] {'i8xx_tco': ModProbeValue(True, '/etc/modprobe.conf')} >>> all_modprobe['install'] {'eth1394': ModProbeValue(['/bin/true'], '/etc/modprobe.conf'), 'ipv6': ModProbeValue(['/bin/true'], '/etc/modprobe.conf.d/no_ipv6.conf')} """ def __init__(self, modprobe): self.data = {} self.bad_lines = [] for mod in modprobe: filename = mod.file_path # relative path inside archive # Copy data section for section, sectdict in mod.data.items(): if section not in self.data: self.data[section] = {} for name, value in sectdict.items(): if name in self.data[section] and isinstance(self.data[section][name][0], list): # append to this module's value - should only # happen for aliases. self.data[section][name][0].append(value) else: # create new tuple self.data[section][name] = ModProbeValue(value=value, source=filename) # Copy bad lines, if any if mod.bad_lines: self.bad_lines.extend( [ModProbeValue(value=line, source=filename) for line in mod.bad_lines] ) super(AllModProbe, self).__init__()