[apparmor] [patch] require logfile only for aa-logprof and aa-genprof

Christian Boltz apparmor at cboltz.de
Fri Feb 20 19:23:02 UTC 2015


Hello,

this patch makes sure most tools (for example aa-complain) don't error 
out if no logfile can be found. (For obvious reasons, aa-logprof and 
aa-genprof will still require a logfile ;-)

This is done by moving code from the global area in aa.py to the new
function set_logfile(), which is called by aa-logprof and aa-genprof.

While on it,
- rename apparmor.filename to apparmor.logfile
- move the error handling for user-specified logfile from aa-genprof
  and aa-logprof to aa.py set_logfile()

Note: I'd have prefered to hand over the logfile as parameter to
do_logprof_pass(), but that would break last_audit_entry_time() in 
aa-genprof which requires the log filename before do_logprof_pass() is 
called.

Also note that the patch preserves all error messages. We could simplify
if by using "The logfile %s does not exist." instead of using two 
different error messages.


References: https://bugs.launchpad.net/apparmor/+bug/1423702


I'm not sure if we should apply this patch to 2.9 or if trunk is 
enough - opinions?


[ set-logfile.diff ]

=== modified file 'utils/aa-genprof'
--- utils/aa-genprof    2014-11-05 19:25:44 +0000
+++ utils/aa-genprof    2015-02-20 19:03:39 +0000
@@ -41,7 +41,7 @@
         f_out.write(str(value))
 
 def last_audit_entry_time():
-    out = subprocess.check_output(['tail', '-1', apparmor.filename])
+    out = subprocess.check_output(['tail', '-1', apparmor.logfile])
     logmark = None
     out = out.decode('ascii')
     if re.search('^.*msg\=audit\((\d+\.\d+\:\d+).*\).*$', out):
@@ -61,16 +61,8 @@
 
 profiling = args.program
 profiledir = args.dir
-filename = args.file
-
-
-if filename:
-    if not os.path.exists(filename):
-        raise apparmor.AppArmorException(_('The logfile %s does not exist. Please check the path') % filename)
-    elif os.path.isdir(filename):
-        raise apparmor.AppArmorException(_('%s is a directory. Please specify a file as logfile') % filename)
-    else:
-        apparmor.filename = filename
+
+apparmor.set_logfile(args.file)
 
 aa_mountpoint = apparmor.check_for_apparmor()
 if not aa_mountpoint:

=== modified file 'utils/aa-logprof'
--- utils/aa-logprof    2014-11-05 19:25:44 +0000
+++ utils/aa-logprof    2015-02-20 19:04:51 +0000
@@ -28,17 +28,9 @@
 args = parser.parse_args()
 
 profiledir = args.dir
-filename = args.file
 logmark = args.mark or ''
 
-
-if filename:
-    if not os.path.exists(filename):
-        raise apparmor.AppArmorException(_('The logfile %s does not exist. Please check the path') % filename)
-    elif os.path.isdir(filename):
-        raise apparmor.AppArmorException(_('%s is a directory. Please specify a file as logfile') % filename)
-    else:
-        apparmor.filename = filename
+apparmor.set_logfile(args.file)
 
 aa_mountpoint = apparmor.check_for_apparmor()
 if not aa_mountpoint:

=== modified file 'utils/apparmor/aa.py'
--- utils/apparmor/aa.py        2015-02-04 12:16:29 +0000
+++ utils/apparmor/aa.py        2015-02-20 19:02:43 +0000
@@ -72,7 +72,7 @@
 sev_db = None
 # The file to read log messages from
 ### Was our
-filename = None
+logfile = None
 
 cfg = None
 repo_cfg = None
@@ -2233,6 +2233,24 @@
 
     return newincludes
 
+def set_logfile(filename):
+    ''' set logfile to a) the specified filename or b) if not given, the first existing logfile from logprof.conf'''
+
+    global logfile
+
+    if filename:
+        logfile = filename
+    else:
+        logfile = conf.find_first_file(cfg['settings']['logfiles']) or '/var/log/syslog'
+
+    if not os.path.exists(logfile):
+        if filename:
+            raise AppArmorException(_('The logfile %s does not exist. Please check the path') % logfile)
+        else:
+            raise AppArmorException('Can\'t find system log "%s".' % (logfile))
+    elif os.path.isdir(logfile):
+        raise AppArmorException(_('%s is a directory. Please specify a file as logfile') % logfile)
+
 def do_logprof_pass(logmark='', passno=0, pid=pid):
     # set up variables for this pass
 #    t = hasher()
@@ -2250,7 +2268,7 @@
 #    skip = hasher()  # XXX global?
 #    filelist = hasher()
 
-    aaui.UI_Info(_('Reading log entries from %s.') % filename)
+    aaui.UI_Info(_('Reading log entries from %s.') % logfile)
 
     if not passno:
         aaui.UI_Info(_('Updating AppArmor profiles in %s.') % profile_dir)
@@ -2264,7 +2282,8 @@
     ##    repo_cfg = read_config('repository.conf')
     ##    if not repo_cfg['repository'].get('enabled', False) or repo_cfg['repository]['enabled'] not in ['yes', 'no']:
     ##    UI_ask_to_enable_repo()
-    log_reader = apparmor.logparser.ReadLog(pid, filename, existing_profiles, profile_dir, log)
+
+    log_reader = apparmor.logparser.ReadLog(pid, logfile, existing_profiles, profile_dir, log)
     log = log_reader.read_log(logmark)
     #read_log(logmark)
 
@@ -4572,10 +4591,6 @@
 if not os.path.isfile(parser) or not os.access(parser, os.EX_OK):
     raise AppArmorException('Can\'t find apparmor_parser')
 
-filename = conf.find_first_file(cfg['settings']['logfiles']) or '/var/log/syslog'
-if not os.path.isfile(filename):
-    raise AppArmorException('Can\'t find system log "%s".' % (filename))
-
 ldd = conf.find_first_file(cfg['settings']['ldd']) or '/usr/bin/ldd'
 if not os.path.isfile(ldd) or not os.access(ldd, os.EX_OK):
     raise AppArmorException('Can\'t find ldd')


Regards,

Christian Boltz
-- 
In college, I wrote a TECO-like progamming language as a joke -
one-letter statements, totally unreadable.  Then I discovered sendmail,
and stopped, because the joke had been done so much better than I ever
could. [Mark 'Kamikaze' Hughes]




More information about the AppArmor mailing list