[Apparmor-dev] aa-parselog: simple script that parses log messages
and print apparmor messages.
Mathias Gug
mathiaz at ubuntu.com
Tue Jun 5 09:59:22 MDT 2007
Hi,
I've attached a small script that I use to parse /var/log/messages and
print relevant apparmor messages grouped by profiles and running
processes.
A sample output is :
/usr/sbin/named:
14203:
PERMITTING r access to /etc/bind/named.conf
(named(14203)profile /usr/sbin/named active /usr/sbin/named)
PERMITTING r access to /etc/bind/named.conf.options
(named(14203) profile /usr/sbin/named active /usr/sbin/named)
13383:
PERMITTING w access to /var/run/bind/run/named.pid
(named(13383) profile /usr/sbin/named active /usr/sbin/named)
/sbin/klogd:
4885:
PERMITTING w access to /var/run/klogd/klogd.pid (klogd(4885)
profile /sbin/klogd active /sbin/klogd)
PERMITTING r access to /var/run/klogd/kmsg
(klogd(4885) profile /sbin/klogd active /sbin/klogd)
4844:
PERMITTING w access to /var/run/klogd/klogd.pid (klogd(4844)
profile /sbin/klogd active /sbin/klogd)
PERMITTING r access to /var/run/klogd/kmsg (klogd(4844)
profile /sbin/klogd active /sbin/klogd)
It can list log messages relevant for running processes (default) or all
processes. It has other options :
$ ./aa-parselog -h
Usage: ./aa-parselog [OPTIONS]
Parse log file for apparmor messages.
OPTIONS :
--all print all messages, even for non-running processes
--file=filename log file to process. DEFAULT=/var/log/messages
--help this message
--profile=name restrict processing to the profile. DEFAULT:process all profiles.
Let me know what you think about it and how it could be improved.
It may be integrated into apparmor_status. It may also use the log
parser library in the future.
--
Mathias
-------------- next part --------------
#!/usr/bin/perl -w
use strict;
use Getopt::Long;
my $log_file_dfl = '/var/log/messages';
my $report_all = 0;
my $log_file = $log_file_dfl;
my $profile_regex = '';
my $help = 0;
GetOptions(
'all' => \$report_all,
'file=s' => \$log_file,
'profile=s' => \$profile_regex,
'help|h' => \$help,
) or usage();
sub usage {
print "Usage: $0 [OPTIONS]\n";
print "Parse log file for apparmor messages.\n";
print "OPTIONS :\n";
print " --all print all messages, even for non-running processes\n";
print " --file=filename log file to process. DEFAULT=$log_file_dfl\n";
print " --profile=name restrict processing to the profile. DEFAULT: process all profiles.\n",
print " --help this message\n";
exit;
}
usage() if $help;
open(LOG,$log_file);
my %status = ();
while (<LOG>) {
next unless (/audit\([\d\.:]+\):\s(.+)$/);
my $msg = $1;
if ($msg =~ /.*\([^\(]+\((\d+)\).+profile\s(.+)\sactive\s.+\)/) {
my $pid = $1;
my $profile = $2;
if ( ( $profile_regex ne '' ? $profile =~ /$profile_regex/ : 1)
and ( $report_all or (-e "/proc/$pid")) ) {
if (defined($status{$profile}{$pid})) {
push(@{ $status{$profile}{$pid} },$msg);
} else {
$status{$profile}{$pid} = [$msg] ;
}
}
}
}
while ( my ($profile,$processes) = each(%status) ) {
print "$profile:\n";
while( my ($pid,$msgs) = each(%{ $processes }) ) {
print " $pid: \n";
foreach my $msg (@{ $msgs }) {
print " $msg\n";
}
}
}
More information about the Apparmor-dev
mailing list