aboutsummaryrefslogtreecommitdiffstats
path: root/add-syslog
diff options
context:
space:
mode:
Diffstat (limited to 'add-syslog')
-rwxr-xr-xadd-syslog234
1 files changed, 234 insertions, 0 deletions
diff --git a/add-syslog b/add-syslog
new file mode 100755
index 0000000..9f1a7e1
--- /dev/null
+++ b/add-syslog
@@ -0,0 +1,234 @@
+#!/bin/sh
+#---------------------------------------------------------------
+# Project : Mandriva Linux
+# Module : rpm-helper
+# File : add-syslog
+# Version : 1
+# Author : Herton Ronaldo Krzesinski
+# Created On : Tue Jul 19 23:24:48 2005
+# Modified On : Sat Jul 30 22:25:00 2005
+# Purpose : helper script for rpm scriptlets to add a
+# entry filter for software from package into
+# syslog (supported sysklogd and syslog-ng).
+#---------------------------------------------------------------
+
+if [ $# -lt 6 ]; then
+ echo "usage: $0 <pkg name> <num installed> <source> <facility> <level_begin> <level_end> <log file>" 1>&2
+ exit 1
+fi
+
+priority_order="debug info notice warn,warning err,error crit alert emerg,panic"
+
+# check range of level priority, example, an level mail.notice in
+# syslog.conf will filter and log notice or greater level of messages
+not_existing_entry() {
+ if [ "$3" = "*" -o "$4" = "*" ]; then
+ if sed "s/#.*$//g" /etc/syslog.conf | grep "$1" | grep -q "$2\.\*" ||
+ sed "s/#.*$//g" /etc/syslog.conf | grep "$1" | grep -q "$2\.=\*"; then
+ return 1
+ fi
+ lvl_start=`echo $priority_order | cut -d " " -f 1 | sed "s:,.*::"`
+ num_levels=`echo $priority_order | wc -w`
+ lvl_end=`echo $priority_order | cut -d " " -f $num_levels | sed "s:,.*::"`
+ else
+ lvl_start=$3
+ lvl_end=$4
+ fi
+ local begin=0
+ for x in $priority_order; do
+ if [[ "$begin" -eq 0 ]] && ! echo $x | grep -q "$lvl_start"; then
+ continue
+ fi
+ begin=1
+ x=`echo $x | sed "s:,: :g"`
+ for y in $x; do
+ if sed "s/#.*$//g" /etc/syslog.conf | grep "$1" | grep -q "$2\.$y"; then
+ return 1
+ fi
+ if sed "s/#.*$//g" /etc/syslog.conf | grep "$1" | grep -q "$2\.=$y"; then
+ return 1
+ fi
+ done
+ if echo $x | grep -q "$lvl_end"; then
+ return 0
+ fi
+ done
+}
+
+add_blank_line() {
+ [ -n "`tail -n 1 $1`" ] && echo >> $1 || :
+}
+
+pkg=$1 # name of the package
+num=$2 # number of packages installed
+source=$3 # from where the log will come (log stream)
+ # NOTE: source must be a unix-stream
+facility=$4 # subclass of log source, like kern, mail...
+level_begin=$5 # log level, eg.: info, notice, critical...
+level_end=$6 # if in a range, you especify level_end
+ # like when you log from level debug
+ # untill notice. if not in a range
+ # you must specify level_end the same as
+ # level_begin or leave level_end empty
+logfile=$7 # log file, like /var/log/messages
+
+# Don't readd entry on package updates
+if [ "$num" -ne 1 ]; then
+ return 0
+fi
+
+# just ignore if it's default unix domain socket
+[ "$source" = "/dev/log" ] && source="" || :
+
+# if we only have level_end, assume that level_begin is the lowest
+# priority level order
+if [ -z "$level_begin" -a -n "$level_end" ]; then
+ level_begin=`echo $priority_order | cut -d " " -f 1 | sed "s:,.*::"`
+fi
+
+# Do not use deprecated level names, set also label for syslog-ng levels
+for loglevel in $priority_order; do
+ if echo $loglevel | grep -q "$level_begin"; then
+ level_begin=`echo $loglevel | sed s:,.*::`
+ break
+ fi
+done
+if [ -n "$level_end" ]; then
+ for loglevel in $priority_order; do
+ if echo $loglevel | grep -q "$level_end"; then
+ level_end=`echo $loglevel | sed s:,.*::`
+ break
+ fi
+ done
+ level_label=${level_begin}_${level_end}
+else
+ level_label=$level_begin
+fi
+
+# Wildcards on begin or end means we want levels until a limit on either side
+# Just use wildcard if range of levels contains all levels
+if [ "$level_begin" = "debug" -a "$level_end" = "*" -o "$level_begin" = "*" -a "$level_end" = "emerg" ]; then
+ level_begin="*"
+ level_end="*"
+elif [ "$level_begin" = "*" -a "$level_end" != "*" ]; then
+ level_begin="debug"
+elif [ "$level_begin" != "*" -a "$level_end" = "*" ]; then
+ level_end="emerg"
+elif [ "$level_begin" = "debug" -a "$level_end" = "emerg" ]; then
+ level_begin="*"
+ level_end="*"
+fi
+
+# sysklogd handler
+if [ -f /etc/syslog.conf ]; then
+ if [[ -n "$source" ]] && ! grep -q "$source" /etc/sysconfig/syslog; then
+ . /etc/sysconfig/syslog
+ SYSLOGD_OPTIONS="$SYSLOGD_OPTIONS -a $source"
+ sed -i -e :a -e \
+ "s:SYSLOGD_OPTIONS=\"[^\"]*\":SYSLOGD_OPTIONS=\"$SYSLOGD_OPTIONS\":g;/SYSLOGD_OPTIONS/N;//ba" \
+ /etc/sysconfig/syslog
+ fi
+ # we first verify if there isn't already a log entry for the
+ # logfile/facility/level provided, and then add the entry to
+ # syslog.conf. Note that we must always remove comments,
+ # otherwise commented lines are interpreted as active
+ if not_existing_entry "$logfile" "$facility" "$level_begin" "$level_end"; then
+ add_blank_line /etc/syslog.conf
+ if [ "$level_begin" = "*" -a "$level_end" = "*" ]; then
+ echo -e "$facility.*\t\t\t\t\t\t\t$logfile" >> /etc/syslog.conf
+ elif [ -n "$level_begin" -a -n "$level_end" -a "$level_begin" != "$level_end" -a "$level_end" = "emerg" ]; then
+ echo -e "$facility.$level_begin\t\t\t\t\t\t\t$logfile" >> /etc/syslog.conf
+ elif [ -n "$level_begin" -a -n "$level_end" -a "$level_begin" != "$level_end" ]; then
+ count=0
+ for loglevel in $priority_order; do
+ if [[ "$count" -eq 0 ]] && ! echo "$loglevel" | grep -q "$level_begin"; then
+ continue
+ fi
+ let count=count+1
+ current_level=`echo $loglevel | sed "s:,.*::"`
+ if ! echo "$loglevel" | grep -q "$level_end"; then
+ echo -n "$facility.=$current_level;" >> /etc/syslog.conf
+ else
+ echo -n "$facility.=$current_level " >> /etc/syslog.conf
+ break
+ fi
+ done
+ let count=8-count
+ while [ "$count" -gt 0 ]; do
+ echo -ne "\t" >> /etc/syslog.conf
+ let count=count-1
+ done
+ echo -n "$logfile" >> /etc/syslog.conf
+ elif [ -n "$level_begin" ]; then
+ echo -e "$facility.=$level_begin\t\t\t\t\t\t\t$logfile" >> /etc/syslog.conf
+ fi
+ fi
+fi
+
+# syslog-ng handler
+if [ -f /etc/syslog-ng.conf ]; then
+ config=`sed "s/#.*$//g" /etc/syslog-ng.conf`
+ add_blank_line /etc/syslog-ng.conf
+ if ! sed "s/#.*$//g" /etc/syslog-ng.conf | grep -q "$source"; then
+ if [ -n "$facility" -o -n "$level_begin" -a -n "$logfile" ]; then
+ echo "source $pkg { unix-stream (\"$source\"); };" >> /etc/syslog-ng.conf
+ from=$pkg
+ else
+ from=`echo $config | sed -n "s:\(.*source[[:space:]]\+\)\([[:alnum:]]\+\)\(.*/dev/log.*\):\2:p"`
+ fi
+ else
+ from=`echo $config | sed -n "s:\(.*source[[:space:]]\+\)\([[:alnum:]]\+\)\(.*$source.*\):\2:p"`
+ fi
+ if [ -n "$facility" -o -n "$level_begin" -a -n "$logfile" ]; then
+ if ! sed "s/#.*$//g" /etc/syslog-ng.conf | grep -q "$logfile"; then
+ echo "destination ${pkg}_${level_label} { file(\"$logfile\"); };" >> /etc/syslog-ng.conf
+ dest=${pkg}_${level_label}
+ else
+ dest=`echo $config | sed -n "s:\(.*destination[[:space:]]\+\)\([[:alnum:]]\+\)\(.*$logfile.*\):\2:p"`
+ fi
+
+ if [ -n "$level_begin" -a -n "$level_end" -a "$level_begin" != "$level_end" ]; then
+ level_str="$level_begin..$level_end"
+ elif [ "$level_begin" = "*" -a "$level_end" = "*" ]; then
+ level_str="debug..emerg"
+ elif [ -n "$level_begin" ]; then
+ level_str="$level_begin"
+ fi
+ if ! sed "s/#.*$//g" /etc/syslog-ng.conf | grep "$facility" | grep -q filter; then
+ echo "filter f_${pkg}_${level_label} { facility($facility) and level($level_str); };" >> /etc/syslog-ng.conf
+ filter=f_${pkg}_${level_label}
+ else
+ filter=`echo $config | sed -n "s:\(.*filter[[:space:]]\+\)\([[:alnum:]]\+\)\(.*$facility.*\):\2:p"`
+ curfilt=`echo $config | sed -n "s:\(.*\)\(filter[[:space:]]\+$filter[^}]*};\)\(.*\):\2:gp"`
+ has_level=0
+ levels=`echo $priority_order | sed -n "s:\($level_begin.*\):\1:p"`
+ levels=`echo $levels | sed -n "s:\(.*$level_end\):\1:p"`
+ for log_level in $levels; do
+ if echo $curfilt | grep -q "$log_level"; then
+ has_level=1
+ break
+ fi
+ done
+ if [ "$has_level" -eq 0 ]; then
+ echo "filter f_${pkg}_${level_label} { facility($facility) and level($level_str); };" >> /etc/syslog-ng.conf
+ filter=f_${pkg}_${level_label}
+ fi
+ fi
+ if [ -n "$from" -a -n "$dest" -a -n "$filter" ]; then
+ if ! sed "s/#.*$//g" /etc/syslog-ng.conf | grep "$from" \
+ | grep "$dest" | grep "$filter" | grep -q "^[[:space:]]*log"; then
+ echo "log { source($from); filter($filter); destination($dest); };" \
+ >> /etc/syslog-ng.conf
+ fi
+ fi
+ elif [ -n "$source" ]; then
+ from=`echo $config | sed -n "s:\(.*source[[:space:]]\+\)\([[:alnum:]]\+\)\(.*/dev/log.*\):\2:p"`
+ if [ -n "$from" ]; then
+ sed -i -e :a -e \
+ "s:\(source[[:space:]]\+$from[[:space:]]*{[^}]*\)\(}[[:space:]]*\);:\1 unix-stream (\"$source\"); };:g;/source/N;//ba" \
+ /etc/syslog-ng.conf
+ fi
+ fi
+fi
+
+exit 0