summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/system/vyatta_update_syslog.pl114
1 files changed, 86 insertions, 28 deletions
diff --git a/scripts/system/vyatta_update_syslog.pl b/scripts/system/vyatta_update_syslog.pl
index d02d8be0..5951875c 100755
--- a/scripts/system/vyatta_update_syslog.pl
+++ b/scripts/system/vyatta_update_syslog.pl
@@ -1,45 +1,103 @@
#!/usr/bin/perl
+# **** License ****
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# This code was originally developed by Vyatta, Inc.
+# Portions created by Vyatta are Copyright (C) 2007 Vyatta, Inc.
+# All Rights Reserved.
+#
+# **** End License ****
+
+# Update /etc/syslog.conf
+# Exit code: 0 - update
+# 1 - no change or error
+
use strict;
+use lib "/opt/vyatta/share/perl5";
+use Vyatta::Config;
+use File::Compare;
+
my $SYSLOG_CONF = '/etc/syslog.conf';
+my $SYSLOG_TMP = "/tmp/syslog.conf.$$";
+my $MESSAGES = '/var/log/messages';
+my $CONSOLE = '/dev/console';
+my %entries = ();
+
+die "$0 expects no arguments\n" if (@ARGV);
+die "Must be run as root!\n" if ($EUID != 0);
+
+# This builds a data structure that maps from target
+# to selector list for that target
+sub add_entries {
+ my ( $config, $level, $target ) = @_;
+
+ foreach my $facility ( $config->listNodes("$level facility") ) {
+ my $loglevel = $config->returnValue("$level facility $facility level");
+ $facility = '*' if ( $facility eq 'all' );
+ $loglevel = '*' if ( $loglevel eq 'all' );
+
+ $entries{$target} = [] unless $entries{$target};
+ push @{ $entries{$target} }, $facility . '.' . $loglevel;
+ }
+}
-my $match1 = shift;
-my $match2 = shift;
-my $update_line = shift;
+my $config = new Vyatta::Config;
+$config->setLevel("system syslog");
-if (!defined($match1) || !defined($match2) || !defined($update_line)) {
- exit 1;
+add_entries( $config, 'global', $MESSAGES );
+
+# Default syslog.conf if no global entry
+%entries = ( $MESSAGES => { '*:notice', 'local7:*' } ) unless (%entries);
+
+add_entries( $config, 'console', $CONSOLE );
+
+foreach my $host ( $config->listNodes('host') ) {
+ add_entries( $config, "host $host", "@$host" );
+}
+
+foreach my $file ( $config->listNodes('file') ) {
+ add_entries( $config, "file $file", $file );
}
-if (system("touch $SYSLOG_CONF")) {
- exit 2;
+foreach my $user ( $config->listNodes('user') ) {
+ add_entries( $config, 'user $user', $user );
}
-my $exp1 = "";
-my $exp2 = "";
-if ($match1 ne "") {
- $exp1 = $match1;
- if ($match2 ne "") {
- $exp2 = $match2;
- }
-} elsif ($match2 ne "") {
- $exp1 = $match2;
+open my $in, '<', $SYSLOG_CONF
+ or die "Can't open $SYSLOG_CONF: $!";
+
+open my $out, '>', $SYSLOG_TMP
+ or die "Can't open $SYSLOG_TMP: $!";
+
+while (<$in>) {
+ chomp;
+ next if /# VYATTA$/;
+ print {$out} $_, "\n";
}
+close $in;
-if ($exp2 ne "") {
- if (system("sed -i '/$exp1/{/$exp2/d}' $SYSLOG_CONF")) {
- exit 2;
- }
-} elsif ($exp1 ne "") {
- if (system("sed -i '/$exp1/d' $SYSLOG_CONF")) {
- exit 3;
- }
+foreach my $target ( keys %entries ) {
+ print $out join( ';', @{ $entries{$target} } ), "\t$target # VYATTA\n";
}
+close $out
+ or die "Can't output $SYSLOG_TMP: $!";
-if ($update_line ne "") {
- open my $out, '>>', $SYSLOG_CONF or exit 4;
- print {$out} "$update_line";
- close $out;
+# Don't need to do anything, save time on boot
+if ( compare( $SYSLOG_CONF, $SYSLOG_TMP ) == 0 ) {
+ unlink($SYSLOG_TMP);
+ exit 1;
}
+system("sudo cp $SYSLOG_TMP $SYSLOG_CONF") == 0
+ or die "Can't copy $SYSLOG_TMP to $SYSLOG_CONF";
+
+unlink($SYSLOG_TMP);
exit 0;