#!/usr/bin/python -tt
"""
Reports on selinux messages
Jeremy Kindy (kindyjd at wfu.edu), Wake Forest University
"""
import sys
import re
##
# This is for testing purposes, so you can invoke this from the
# modules directory. See also the testing notes at the end of the
# file.
#
sys.path.insert(0, '../py/')
from epylog import Result, InternalModule
class selinux_mod(InternalModule):
def __init__(self, opts, logger):
InternalModule.__init__(self)
self.logger = logger
self.logger.put(3, 'initializing selinux')
rc = re.compile
self.ignore = 0
self.preventing = 1
selinux_map = {
rc('.*setroubleshoot\: SELinux is preventing'): self.selinux
}
do_selinux = int(opts.get('enable_selinux', '1'))
self.regex_map = {}
if do_selinux: self.regex_map.update(selinux_map)
self.selinux_message_re = rc('setroubleshoot: (.*). For complete SELinux')
self.selinux_title = 'SELinux Report'
self.selinux_preventing_title = 'SELinux Prevention Report'
self.report_wrap = '
'
self.subreport_wrap = '%s |
\n%s'
self.line_rep = '%s | %s |
\n'
self.flip = ' bgcolor="#dddddd"'
##
# Line-matching routines
#
def selinux(self, linemap):
action = self.preventing
self.logger.put(3, 'selinux invoked')
sys, msg, mult = self.get_smm(linemap)
self.logger.put(3, 'test selinux %d' % mult)
message = self._get_selinux_message(msg)
self.logger.put(3, 'selinux message: %s' % message)
restuple = self._mk_restuple(sys, action, message)
self.logger.put(3, 'selinux finished')
return {restuple: mult}
##
# Helpers
#
def _mk_restuple(self, sys, action, message):
return (action, message, sys)
def _get_selinux_message(self, str):
message = 'unknown'
mo = self.selinux_message_re.search(str)
if mo: message = mo.group(1)
return message
####
# Finalize the report
def finalize(self, rs):
logger = self.logger
##
# Prepare report
#
report = ''
rep = {}
# (action, message)
for action in [self.preventing]:
rep[action] = ''
flipper = ''
for message in rs.get_distinct((action,)):
if flipper: flipper = ''
else: flipper = self.flip
service_rep = []
for system in rs.get_distinct((action, message,)):
service_rep.append(system)
system_list = ', '.join(service_rep)
rep[action] += self.line_rep % (flipper, message, system_list)
if rep[self.preventing]:
report += self.subreport_wrap % (self.selinux_preventing_title, rep[self.preventing])
logger.put(3, 'selinux report: self.preventing added')
report = self.report_wrap % report
return report
if __name__ == '__main__':
from epylog.helpers import ModuleTest
ModuleTest(selinux_mod, sys.argv)