summaryrefslogtreecommitdiffstats
path: root/debian/exim4-base.cron.daily
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/exim4-base.cron.daily120
1 files changed, 120 insertions, 0 deletions
diff --git a/debian/exim4-base.cron.daily b/debian/exim4-base.cron.daily
new file mode 100644
index 0000000..0357a0e
--- /dev/null
+++ b/debian/exim4-base.cron.daily
@@ -0,0 +1,120 @@
+#!/bin/sh
+
+EX4SYSTEMDTIMER=$1
+
+# skip in favour of systemd timer if called from cron.daily
+if [ -d /run/systemd/system ] && [ "$EX4SYSTEMDTIMER" != "systemd-timer" ]; then
+ exit 0
+fi
+
+if [ -n "$EX4DEBUG" ]; then
+ echo "now debugging $0 $@"
+ set -x
+fi
+
+
+# set this to some other value if you don't want the panic log to be
+# watched by this script, for example when you're using your own log
+# checking mechanisms or don't care.
+
+E4BCD_DAILY_REPORT_TO=""
+E4BCD_DAILY_REPORT_OPTIONS=""
+E4BCD_WATCH_PANICLOG="yes"
+# Number of lines of paniclog quoted in warning email.
+E4BCD_PANICLOG_LINES="10"
+E4BCD_PANICLOG_NOISE=""
+E4BCD_PANICLOG_REPORT_TO=root
+
+# Only do anything if exim4 is actually installed
+if [ ! -x /usr/lib/exim4/exim4 ]; then
+ exit 0
+fi
+
+[ -f /etc/default/exim4 ] && . /etc/default/exim4
+
+SPOOLDIR="$(exim4 -bP spool_directory | sed 's/.*=[[:space:]]\(.*\)/\1/')"
+if [ -n "$E4BCD_DAILY_REPORT_TO" ] || [ "$E4BCD_WATCH_PANICLOG" != "no" ] ; then
+ # Only needed for mail subject.
+ if ! HOSTNAME=$(/usr/sbin/exim4 -be '${primary_hostname}'); then
+ HOSTNAME="$(hostname)"
+ fi
+fi
+
+
+# The log processing code used in this cron script is not very
+# sophisticated. It relies on this cron job being executed earlier than
+# the log rotation job, and will have false results if the log is not
+# rotated exactly once daily in the daily cron processing. Even in the
+# default configuration, it will ignore log entries made between this
+# cron job and the log rotation job.
+
+# Patches for more sophisticated processing are appreciated via the
+# Debian BTS.
+
+E4BCD_MAINLOG_NOISE="^[[:digit:][:space:]:-]\{20\}\(\(Start\|End\) queue run: pid=[[:digit:]]\+\|exim [[:digit:]\.]\+ daemon started: pid=[[:digit:]]\+, .*\)$"
+
+if [ -n "$E4BCD_DAILY_REPORT_TO" ]; then
+ if [ -x "$(command -v eximstats)" ] && [ -x "$(command -v mail)" ]; then
+ if [ "$(< /var/log/exim4/mainlog grep -v "$E4BCD_MAINLOG_NOISE" | wc -l)" -gt "0" ]; then
+ < /var/log/exim4/mainlog grep -v "$E4BCD_MAINLOG_NOISE" \
+ | eximstats $E4BCD_DAILY_REPORT_OPTIONS \
+ | mail -s"${HOSTNAME} Daily e-mail activity report" \
+ $E4BCD_DAILY_REPORT_TO
+ else
+ echo "no mail activity in this interval" \
+ | mail -s"${HOSTNAME} Daily e-mail activity report" \
+ $E4BCD_DAILY_REPORT_TO
+ fi
+ else
+ echo "The exim4 cron job is configured to send a daily report, but eximstats"
+ echo "and/or mail cannot be found. Please check and make sure that these two"
+ echo "binaries are available"
+ fi
+fi
+
+log_this() {
+ TEXT="$@"
+ if ! logger -t exim4 -p mail.alert $TEXT; then
+ RET="$?"
+ echo >&2 "ALERT: could not syslog $TEXT, logger return value $RET"
+ fi
+}
+
+if [ "$E4BCD_WATCH_PANICLOG" != "no" ]; then
+ if [ -s "/var/log/exim4/paniclog" ]; then
+ if [ -x "/usr/local/lib/exim4/nonzero_paniclog_hook" ]; then
+ /usr/local/lib/exim4/nonzero_paniclog_hook
+ fi
+ if [ -z "$E4BCD_PANICLOG_NOISE" ] || grep -vq "$E4BCD_PANICLOG_NOISE" /var/log/exim4/paniclog; then
+ log_this "ALERT: exim paniclog /var/log/exim4/paniclog has non-zero size, mail system possibly broken"
+ if ! printf "Subject: exim paniclog on %s has non-zero size\nTo: %s\n\nexim paniclog /var/log/exim4/paniclog on %s has non-zero size, mail system might be broken. Up to ${E4BCD_PANICLOG_LINES} lines are quoted below.\n\n%s\n" \
+ "${HOSTNAME}" "${E4BCD_PANICLOG_REPORT_TO}" "${HOSTNAME}" \
+ "$(if [ -z "$E4BCD_PANICLOG_NOISE" ] ; then tail -n "${E4BCD_PANICLOG_LINES}" /var/log/exim4/paniclog ; else grep -v "$E4BCD_PANICLOG_NOISE" /var/log/exim4/paniclog | tail -n "${E4BCD_PANICLOG_LINES}" ; fi)" \
+ | exim4 "${E4BCD_PANICLOG_REPORT_TO}"; then
+ log_this "PANIC: sending out e-mail warning has failed, exim has non-zero return code"
+ fi
+ if [ "$E4BCD_WATCH_PANICLOG" = "once" ]; then
+ logrotate -f /etc/logrotate.d/exim4-paniclog
+ fi
+ fi
+ fi
+fi
+
+# run tidydb as Debian-exim:Debian-exim.
+if [ -x /usr/sbin/exim_tidydb ]; then
+ cd $SPOOLDIR/db || exit 1
+ if ! find $SPOOLDIR/db -maxdepth 1 -name '*.lockfile' -or -name 'log.*' \
+ -or -type f -printf '%f\0' | \
+ xargs -0r -n 1 \
+ start-stop-daemon --start --exec /usr/sbin/exim_tidydb \
+ --chuid Debian-exim:Debian-exim -- $SPOOLDIR > /dev/null; then
+ # if we reach this, invoking exim_tidydb from start-stop-daemon has
+ # failed, most probably because of libpam-tmpdir being in use
+ # (see #373786 and #376165)
+ find $SPOOLDIR/db -maxdepth 1 -name '*.lockfile' -or -name 'log.*' \
+ -or -type f -printf '%f\0' | \
+ runuser --shell=/bin/bash \
+ --command="xargs -0r -n 1 /usr/sbin/exim_tidydb $SPOOLDIR > /dev/null" \
+ Debian-exim
+ fi
+fi