Source code for insights.combiners.sudoers

Sudoers - files ``/etc/sudoers`` or ``/etc/sudoers.d/*``

Module for combining the parsing results of ``/etc/sudoers`` and
``/etc/sudoers.d/*`` files.
from insights import combiner
from insights.parsers.sudoers import SudoersBase, EtcSudoers

[docs]@combiner(EtcSudoers) class Sudoers(SudoersBase): """ Class to combiner the ``/etc/sudoers`` and ``/etc/sudoers.d/*`` Attributes: lines(list): The list of RAW lines of all the ``/etc/sudoers`` and ``/etc/sudoers.d/*`` files. The order of lines keeps their original order them in files. And the files are read with `"filename`" alphabetical order. .. note:: 1. If there is not `"#includedir /etc/sudoers.d"` line in the entry file ``/etc/sudoers``, the ``/etc/sudoers.d/*`` files will be skipped. 2. Two helper functions :func:`insights.parsers.sudoers.SudoersBase.get()` and :func:`insights.parsers.sudoers.SudoersBase.last()` are also provided to quickly get the specified line(s). For details, see the super-class: :class:`insights.parsers.sudoers.SudoersBase`. Examples: >>> type(sudo) <class 'insights.combiners.sudoers.Sudoers'> >>> sudo.get(['wheel', 'ALL=(ALL)', 'ALL']) ['%wheel ALL=(ALL) ALL'] >>> sudo.last("#includedir") '#includedir /etc/sudoers.d' """ def __init__(self, sudoers): self.lines = [] first = False for sdr in sorted(sudoers, key=lambda x: x.file_path): self.lines.extend(sdr.lines) if not first: first = True include = sdr.last('#includedir') if not include or '/etc/sudoers.d' not in include.split()[-1]: break