summaryrefslogtreecommitdiffstats
path: root/modules.d/98syslog
diff options
context:
space:
mode:
Diffstat (limited to 'modules.d/98syslog')
-rw-r--r--modules.d/98syslog/README24
-rwxr-xr-xmodules.d/98syslog/module-setup.sh38
-rwxr-xr-xmodules.d/98syslog/parse-syslog-opts.sh38
-rw-r--r--modules.d/98syslog/rsyslog.conf31
-rwxr-xr-xmodules.d/98syslog/rsyslogd-start.sh47
-rwxr-xr-xmodules.d/98syslog/rsyslogd-stop.sh13
-rwxr-xr-xmodules.d/98syslog/syslog-cleanup.sh14
7 files changed, 205 insertions, 0 deletions
diff --git a/modules.d/98syslog/README b/modules.d/98syslog/README
new file mode 100644
index 0000000..9eb5ade
--- /dev/null
+++ b/modules.d/98syslog/README
@@ -0,0 +1,24 @@
+Syslog support for dracut
+
+This module provides syslog functionality in the initrd.
+This is especially interesting when complex configuration being
+used to provide access to the device the rootfs resides on.
+
+When this module is installed into the ramfs it is triggered by
+the udev event from the nic being setup (online).
+
+Then if syslog is configured it is started and will forward all
+kernel messages to the given syslog server.
+
+The syslog implementation is detected automatically by finding the
+appropriate binary with the following order:
+rsyslogd
+syslogd
+syslog-ng
+Then if detected the syslog.conf is generated and syslog is started.
+
+Bootparameters:
+syslogserver=ip Where to syslog to
+sysloglevel=level What level has to be logged
+syslogtype=rsyslog|syslog|syslogng
+ Don't auto detect syslog but set it
diff --git a/modules.d/98syslog/module-setup.sh b/modules.d/98syslog/module-setup.sh
new file mode 100755
index 0000000..2909a56
--- /dev/null
+++ b/modules.d/98syslog/module-setup.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+# called by dracut
+check() {
+ # do not add this module by default
+ return 255
+}
+
+# called by dracut
+depends() {
+ return 0
+}
+
+# called by dracut
+install() {
+ local _installs
+ if find_binary rsyslogd > /dev/null; then
+ _installs="rsyslogd"
+ inst_libdir_file rsyslog/lmnet.so rsyslog/imklog.so rsyslog/imuxsock.so rsyslog/imjournal.so
+ elif find_binary syslogd > /dev/null; then
+ _installs="syslogd"
+ elif find_binary syslog-ng > /dev/null; then
+ _installs="syslog-ng"
+ else
+ derror "Could not find any syslog binary although the syslogmodule" \
+ "is selected to be installed. Please check."
+ fi
+ if [ -n "$_installs" ]; then
+ inst_multiple cat $_installs
+ inst_hook cmdline 90 "$moddir/parse-syslog-opts.sh"
+ inst_hook cleanup 99 "$moddir/syslog-cleanup.sh"
+ inst_hook initqueue/online 70 "$moddir/rsyslogd-start.sh"
+ inst_simple "$moddir/rsyslogd-stop.sh" /sbin/rsyslogd-stop
+ mkdir -m 0755 -p "${initdir}"/etc/templates
+ inst_simple "${moddir}/rsyslog.conf" /etc/templates/rsyslog.conf
+ fi
+ dracut_need_initqueue
+}
diff --git a/modules.d/98syslog/parse-syslog-opts.sh b/modules.d/98syslog/parse-syslog-opts.sh
new file mode 100755
index 0000000..ccefd9d
--- /dev/null
+++ b/modules.d/98syslog/parse-syslog-opts.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+# Parses the syslog commandline options
+#
+#Bootparameters:
+#syslogserver=ip Where to syslog to
+#sysloglevel=level What level has to be logged
+#syslogtype=rsyslog|syslog|syslogng
+# Don't auto detect syslog but set it
+type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+detect_syslog() {
+ syslogtype=""
+ if [ -e /sbin/rsyslogd ]; then
+ syslogtype="rsyslogd"
+ elif [ -e /sbin/syslogd ]; then
+ syslogtype="syslogd"
+ elif [ -e /sbin/syslog-ng ]; then
+ syslogtype="syslog-ng"
+ else
+ warn "Could not find any syslog binary although the syslogmodule is selected to be installed. Please check."
+ fi
+ echo "$syslogtype"
+ [ -n "$syslogtype" ]
+}
+
+syslogserver=$(getarg syslog.server -d syslog)
+syslogfilters=$(getargs syslog.filter -d filter)
+syslogtype=$(getarg syslog.type -d syslogtype)
+
+[ -n "$syslogserver" ] && echo "$syslogserver" > /tmp/syslog.server
+[ -n "$syslogfilters" ] && echo "$syslogfilters" > /tmp/syslog.filters
+if [ -n "$syslogtype" ]; then
+ echo "$syslogtype" > /tmp/syslog.type
+else
+ syslogtype=$(detect_syslog)
+ echo "$syslogtype" > /tmp/syslog.type
+fi
diff --git a/modules.d/98syslog/rsyslog.conf b/modules.d/98syslog/rsyslog.conf
new file mode 100644
index 0000000..218072b
--- /dev/null
+++ b/modules.d/98syslog/rsyslog.conf
@@ -0,0 +1,31 @@
+#rsyslog v3 config file
+
+# if you experience problems, check
+# http://www.rsyslog.com/troubleshoot for assistance
+
+#### MODULES ####
+
+$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
+$ModLoad imklog.so # provides kernel logging support (previously done by rklogd)
+#$ModLoad immark.so # provides --MARK-- message capability
+
+# Provides UDP syslog reception
+#$ModLoad imudp.so
+#$UDPServerRun 514
+
+# Provides TCP syslog reception
+#$ModLoad imtcp.so
+#$InputTCPServerRun 514
+
+
+#### GLOBAL DIRECTIVES ####
+
+# Use default timestamp format
+$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
+
+# File syncing capability is disabled by default. This feature is usually not required,
+# not useful and an extreme performance hit
+#$ActionFileEnableSync on
+
+
+#### RULES ####
diff --git a/modules.d/98syslog/rsyslogd-start.sh b/modules.d/98syslog/rsyslogd-start.sh
new file mode 100755
index 0000000..d404e51
--- /dev/null
+++ b/modules.d/98syslog/rsyslogd-start.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+# Triggered by initqueue/online and starts rsyslogd with bootparameters
+
+type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+# prevent starting again if already running
+if [ -f /var/run/syslogd.pid ]; then
+ read -r pid < /var/run/syslogd.pid
+ kill -0 "$pid" && exit 0
+fi
+
+rsyslog_config() {
+ local server="$1"
+ shift
+ local syslog_template="$1"
+ shift
+ local filters="$*"
+ local filter=
+
+ cat "$syslog_template"
+
+ (
+ # disable shell expansion / globbing
+ # since filters contain such characters
+ set -f
+ for filter in $filters; do
+ echo "${filter} @${server}"
+ done
+ )
+ #echo "*.* /tmp/syslog"
+}
+
+[ -f /tmp/syslog.type ] && read -r type < /tmp/syslog.type
+[ -f /tmp/syslog.server ] && read -r server < /tmp/syslog.server
+[ -f /tmp/syslog.filters ] && read -r filters < /tmp/syslog.filters
+[ -z "$filters" ] && filters="kern.*"
+[ -f /tmp/syslog.conf ] && read -r conf < /tmp/syslog.conf
+[ -z "$conf" ] && conf="/etc/rsyslog.conf" && echo "$conf" > /tmp/syslog.conf
+
+if [ "$type" = "rsyslogd" ]; then
+ template=/etc/templates/rsyslog.conf
+ if [ -n "$server" ]; then
+ rsyslog_config "$server" "$template" "$filters" > $conf
+ rsyslogd -c3
+ fi
+fi
diff --git a/modules.d/98syslog/rsyslogd-stop.sh b/modules.d/98syslog/rsyslogd-stop.sh
new file mode 100755
index 0000000..3fc2a5f
--- /dev/null
+++ b/modules.d/98syslog/rsyslogd-stop.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+# Kills rsyslogd
+
+if [ -f /var/run/syslogd.pid ]; then
+ read -r pid < /var/run/syslogd.pid
+ kill "$pid"
+ kill -0 "$pid" && kill -9 "$pid"
+else
+ warn "rsyslogd-stop: Could not find a pid for rsyslogd. Won't kill it."
+fi
diff --git a/modules.d/98syslog/syslog-cleanup.sh b/modules.d/98syslog/syslog-cleanup.sh
new file mode 100755
index 0000000..2d08d8a
--- /dev/null
+++ b/modules.d/98syslog/syslog-cleanup.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+# Just cleans up a previously started syslogd
+
+type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+if [ -f /tmp/syslog.server ]; then
+ read -r syslogtype < /tmp/syslog.type
+ if command -v "${syslogtype}-stop" > /dev/null; then
+ "${syslogtype}"-stop
+ else
+ warn "syslog-cleanup: Could not find script to stop syslog of type \"$syslogtype\". Syslog will not be stopped."
+ fi
+fi