aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/add-syslog
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/add-syslog')
-rwxr-xr-xtrunk/add-syslog167
1 files changed, 167 insertions, 0 deletions
diff --git a/trunk/add-syslog b/trunk/add-syslog
new file mode 100755
index 0000000..50cec83
--- /dev/null
+++ b/trunk/add-syslog
@@ -0,0 +1,167 @@
+#!/usr/bin/perl
+# rpm helper scriptlet to add an entry into default syslog implementation
+# $Id$
+use Getopt::Std;
+use strict;
+
+my @facilities = qw/auth authpriv cron daemon \
+ kern lpr mail mark news syslog \
+ user uucp local0 local1 local2 \
+ local3 local4 local5 local6 local7/;
+my %facilities = map { $_ => 1 } @facilities;
+my @priorities = qw/debug info notice warning err crit alert emerg/;
+my $i;
+my %priorities = map { $_ => $i++ } @priorities;
+
+main(@ARGV) unless caller();
+
+sub main {
+ my %opts = (
+ s => '/dev/log',
+ m => 'debug',
+ M => 'emerg'
+ );
+ getopts('s:m:M:', \%opts);
+ my ($source, $min, $max) = @opts{qw/s m M/};
+
+ die <<EOF if @ARGV < 4;
+usage: $0 [options] <pkg> <nb> <facility> <dest>
+Available options:
+-s <source> source (default: /dev/log)
+-m <priority> min priority (default: debug)
+-M <priority> max priority (default: emerg)
+EOF
+ my ($package, $number, $dest, $facility) = @ARGV;
+
+ # don't do anything for upgrade
+ exit(0) if $number == 2;
+
+ # check arguments
+ die "invalid facility '$facility'" if $facility && !$facilities{$facility};
+
+ die "invalid min priority '$min'" if $min && ! defined $priorities{$min};
+ die "invalid max priority '$max'" if $max && ! defined $priorities{$max};
+ die "maximum priority '$max' lower than minimum priority '$min'"
+ if $min && $max && ($priorities{$max} < $priorities{$min});
+
+ my $release_file = '/etc/release';
+ open(my $fh, '<', $release_file)
+ or die "can't open $release_file: $!";
+ my $line = <$fh>;
+ $line =~ /^Mageia release (\d\d\d\d\.\d)/;
+ my $release = $1;
+ close($fh);
+
+ # add an entry to default syslog implementation, if installed
+ add_rsyslog_entry($package, $source, $dest, $facility, $min, $max)
+ if -f '/etc/init.d/rsyslog';
+}
+
+sub add_sysklogd_entry {
+ my ($package, $source, $dest, $facility, $min, $max) = @_;
+
+ # ensure source is configured
+ add_new_source($source, '/etc/sysconfig/syslog')
+ if $source ne '/dev/log';
+
+ # compute selector
+ my $selector = get_selector($facility, $min, $max);
+
+ # compute spacing to keep default configuration file formatting
+ my $tabs = length($selector) < 48 ?
+ ((48 - length($selector)) / 8) :
+ 1;
+
+ # append entry
+ open(my $out, '>>', '/etc/syslog.conf')
+ or die "Can't open /etc/syslog.conf for appending: $!";
+ print $out "# BEGIN: Automatically added by $package installation\n";
+ print $out "$selector" . ("\t" x $tabs) . "-$dest\n";
+ print $out "# END\n";
+ close($out);
+
+ # relaunch syslog
+ system('service syslog condrestart 2>&1 >/dev/null');
+}
+
+sub add_rsyslog_entry {
+ my ($package, $source, $dest, $facility, $min, $max) = @_;
+
+ # compute selector
+ my $selector = get_selector($facility, $min, $max);
+
+ # append entry
+ open(my $out, '>', "/etc/rsyslog.d/$package.conf")
+ or die "Can't open /etc/rsyslog.d/$package.conf for writing: $!";
+ print $out "# Automatically added by $package installation\n";
+ print $out "\$AddUnixListenSocket $source\n" if $source ne '/dev/log';
+ print $out "$selector\t-$dest\n";
+ close($out);
+
+ # relaunch rsyslog
+ system('service rsyslog condrestart 2>&1 >/dev/null');
+}
+
+sub add_new_source {
+ my ($source, $file) = @_;
+
+ my ($content, $changed);
+ open(my $in, '<', $file)
+ or die "Can't open $file for reading: $!";
+
+ while (my $line = <$in>) {
+ if ($line =~ /^SYSLOGD_OPTIONS=(.*)/) {
+ my $options = $1;
+ if ($options) {
+ my $quote;
+ if ($options !~ /-a\s+$source/) {
+ if ($options =~ /^(["'])(.*)\1$/) {
+ $quote = $1;
+ $options = $2;
+ } else {
+ $quote = '"';
+ }
+ $options = $quote . $options . " -a $source" . $quote;
+ $changed = 1;
+ }
+ } else {
+ $options = "\"-a $source\"";
+ $changed = 1;
+ }
+
+ $content .= "SYSLOGD_OPTIONS=$options\n";
+ } else {
+ $content .= $line;
+ }
+ }
+ close($in);
+
+ if ($changed) {
+ open(my $out, '>', $file)
+ or die "Can't open $file for writing: $!";
+ print $out $content;
+ close($out);
+ }
+}
+
+sub get_selector {
+ my ($facility, $min, $max) = @_;
+
+ my $selector;
+ if ($max eq 'emerg') {
+ if ($min eq 'debug') {
+ $selector = "$facility.*";
+ } else {
+ $selector = "$facility.$min";
+ }
+ } else {
+ for my $i ($priorities{$min} .. $priorities{$max}) {
+ $selector .= ';' if $selector;
+ $selector .= "$facility.=$priorities[$i]";
+ }
+ }
+
+ return $selector;
+}
+
+1;