Source code for insights.parsers.sealert

"""
Sealert - command ``/usr/bin/sealert -l "*"``
=============================================
"""
from insights.core import CommandParser
from insights.core.plugins import parser
from insights.specs import Specs


class Report(object):

    def __init__(self):
        self.lines = []

    def __str__(self):
        return "\n".join(self.lines).strip()

    def append_line(self, x):
        self.lines.append(x)

    def lines_stripped(self):
        """
        Returns the lines without trailing empty lines

        Returns:
            list: The lines without empty lines at the end of the list.
        """
        lines = self.lines[:]
        for index in range(len(self.lines) - 1, -1, -1):
            if lines[index] == '':
                del (lines[index])
            else:
                break
        return lines


[docs] @parser(Specs.sealert) class Sealert(CommandParser): """ Reads the output of ``/usr/bin/sealert -l "*"``. Sample output: .. code-block:: none SELinux is preventing sh from entrypoint access on the file /usr/bin/podman. ***** Plugin catchall (100. confidence) suggests ************************** If you believe that sh should be allowed entrypoint access on the podman file by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # ausearch -c 'sh' --raw | audit2allow -M my-sh # semodule -X 300 -i my-sh.pp Additional Information: Source Context unconfined_u:system_r:rpm_script_t:s0-s0:c0.c1023 Target Context system_u:object_r:container_runtime_exec_t:s0 Target Objects /usr/bin/podman [ file ] Source sh Source Path sh Port <Unknown> Host localhost.localdomain Source RPM Packages Target RPM Packages podman-1.1.2-1.git0ad9b6b.fc28.x86_64 Policy RPM selinux-policy-3.14.1-54.fc28.noarch Selinux Enabled True Policy Type targeted Enforcing Mode Enforcing Host Name localhost.localdomain Platform Linux localhost.localdomain 4.20.7-100.fc28.x86_64 #1 SMP Wed Feb 6 19:17:09 UTC 2019 x86_64 x86_64 Alert Count 1 First Seen 2019-07-30 11:15:04 CEST Last Seen 2019-07-30 11:15:04 CEST Local ID 39a7094b-e402-4d87-9af9-e97eda41219a Raw Audit Messages type=AVC msg=audit(1564478104.911:4631): avc: denied { entrypoint } for pid=29402 comm="sh" path="/usr/bin/podman" dev="dm-1" ino=955465 scontext=unconfined_u:system_r:rpm_script_t:s0-s0:c0.c1023 tcontext=system_u:object_r:container_runtime_exec_t:s0 tclass=file permissive=0 Hash: sh,rpm_script_t,container_runtime_exec_t,file,entrypoint Examples: >>> type(sealert) <class 'insights.parsers.sealert.Sealert'> >>> sealert.raw_lines[0] 'SELinux is preventing rngd from using the dac_override capability.' >>> sealert.reports[1].lines_stripped()[0] 'SELinux is preventing sh from entrypoint access on the file /usr/bin/podman.' >>> str(sealert.reports[1]).split('\\n')[0] 'SELinux is preventing sh from entrypoint access on the file /usr/bin/podman.' Attributes: raw_lines (list[str]): Unparsed output as list of lines reports (list[Report]): Sealert reports Raises: SkipComponent: When output is empty """ SELINUX_DISABLED_MESSAGE = "unable to establish connection to setroubleshoot daemon!" def __init__(self, context): super(Sealert, self).__init__(context, extra_bad_lines=[self.SELINUX_DISABLED_MESSAGE])
[docs] def parse_content(self, content): self.raw_lines = content self.reports = [] for line in content: if line.startswith("SELinux is preventing "): self.reports.append(Report()) if self.reports: # skips the first report if it contains only partial data self.reports[-1].append_line(line)