#!/bin/bash
#
# Muster-Skript zur Überwachung eines httpd-Servers
#
# Heinlein Professional Linux Support GmbH, 8/04
# http://www.heinlein-support.de
#

# Angabe eines Files für temporären Output
TEMPFILE="/tmp/servercheck.tmp.$$"

# Minimalfreier Platz für "/" in Prozent
HDMINFREE="90"

# Was soll gemacht werden?
CHECK_WEB=yes
CHECK_ACCOUNTS=yes
CHECK_HDMINFREE=yes
CHECK_LOGINS=yes
CHECK_STATUS=yes

#
# Ab hier keine Konfigurationsänderungen mehr.
#

DATUM=`date +'%d %e'`

echo Subject: Server-Status `date +"%b %e"` $HOSTNAME
echo
echo

# Prüfe, ob der Web-Server läuft
# Angepasst auf Apache2, ansonsten "/etc/init.d/apache"
# und "/usr/sbin/httpd -T" nehmen.
if [ $CHECK_WEB = "yes" ] ; then
if /etc/init.d/apache2 status &> /dev/null && wget --delete-after http://www.domain.local/checkfile.txt &>/dev/null ; then
        # Webserver läuft also! Versuche Reload, mache vorab Syntax-Check
        if /usr/sbin/httpd2 -t &>/dev/null; then
                /etc/init.d/apache2 reload &>/dev/null && echo "    Webserver lief und config-reload o.k."
        else
                echo "### WARNUNG: Reload von Apache wegen defekter CFG fehlgeschlagen! "
        fi
else
        # Webserver läuft also nicht! Versuche Start!
        if /usr/sbin/httpd2 -t &>/dev/null && /etc/init.d/apache2 start &>/dev/null ; then
                echo "### WARNUNG: Webserver war tot, Neustart erfolgreich."
        else
                echo "### WARNUNG: Webserver war tot, Neustart FEHLGESCHLAGEN! "
        fi
fi
fi

# Prüfe /etc/passwd auf versteckte root-User
if [ $CHECK_ACCOUNTS = "yes" ] ; then
cat /etc/passwd | grep ":0:" | grep -v ^root: > $TEMPFILE
ACCOUNTS=`cat $TEMPFILE | wc -l`
if [ $ACCOUNTS -ge 1 ] ; then
        echo "### WARNUNG: Es sind $ACCOUNTS zusätzliche Accounts mit root-Rechten versehen!"
        cat $TEMPFILE
else
        echo "    Keine weiteren root-Accounts."
fi
fi

# Prüfe auf HDMINFREE
if [ $CHECK_HDMINFREE = "yes" ] ; then
KBISFREE=`df | grep /$ | cut -b 52-54`
INODEISFREE=`df -i | grep /$ | cut -b 47-49`
if [ $KBISFREE -ge $HDMINFREE -o $INODEISFREE -ge $HDMINFREE ] ; then
        echo "### WARNUNG: root-Partition zu $KDISFREE% / INODEISFREE% belegt! "
else
        echo "    Festplattenplatz der root-Partition ist o.k."
fi
fi

# Prüfe auf Faillogins
# grep-Pattern ggf. auf eigenes Log-Format anpassen
if [ $CHECK_LOGINS = "yes" ] ; then
cat /var/log/messages | grep "$DATUM" | grep -i "FAILED " | grep -i "root" | grep -v "tty" |> $TEMPFILE
FAILLOGINCOUNT=`cat $TEMPFILE | wc -l`
if [ $FAILLOGINCOUNT -ge 15 ] ; then
        echo "### WARNUNG: Es gab mehr als 15 root-Fail-Logins! "
elif [ $FAILLOGINCOUNT -ge 1 ] ; then
        echo "    Es gab folgende root-Fail-Logins:"
fi
cat $TEMPFILE
fi

# Erzeuge Status:
if [ $CHECK_STATUS = "yes" ] ; then
echo
echo "Sonstiger Serverstatus:"
echo "-----------------------"
echo
echo "Aktuelle Load der letzten 15 Minuten: `cat /proc/loadavg | sed "s/.* .* \(.*\) .* .*/\1/"`"
echo
echo "Auszug aus der Speicherbelegung:"
cat /proc/meminfo | head -n 3
echo
echo "Folgende Benutzer sind zur Zeit angemeldet:"
who
fi
echo
echo
#rm $TEMPFILE