########## Variablendefinition ########## # Standardbelegung der Variablen BACKUP_HOSTS="/etc/backup_hosts.conf" MISSINGPROGRAM="$0: Programoption -b oder -f muss angegeben werden" ERRORMESSAGE="$0: -$OPTION ist nicht erlaubt und wird ignoriert" PROGRAM="/usr/bin/rsnapshot" TIMESTAMP3=`date '+%Y-%m-%d'` MAILRECIPIENT="michael@localhost" SSH_CONFIG_FILE_RS="/root/.ssh/config.rsnapshot" SSH_CONFIG_FILE="/root/.ssh/config" CALL_PARAM=`echo $0 $*` SMTPCONF="/usr/local/scripts/smtpmail.conf" SMTPMAILER=`which sendemail` ########## Funktionen ########## usage() { echo "Syntax: $0 [-h | -o | -n | -b | -f | -m ]" echo "" echo " -h diese Hilfeseite anzeigen" echo " -o nfs|usb Backmedium NFS (NAS) oder USB (externe Disk)" echo " -n name Hostname des zu sichernden Systems" echo " -b intervall Backup durchfuehren mit Laufcheck (Standard)" echo " -f intervall Backup zwingend durchfuehren (forced)" echo " -m user Mailempfaenger (durch Kommatas getrennt)" echo "" echo " Die zu sichernden Hosts muessen in der Konfigurationsdatei $BACKUP_HOSTS eingetragen sein (pro Zeile ein Hostname)" echo "" exit 1 } # Umsetzung der Monatsnamen von englisch in deutsch change_month() { MONTH=`date '+%m'` case $MONTH in 01|02|03|04|05|06|07|08|09|10|11|12) # Alter Timestamp: [03/Feb/2016:19:42:04] # Neuer Timestamp: [2016-03-02T11:26:56] TIMESTAMP1="`date '+\[%Y-'$MONTH'-%dT'`" ;; *) TIMESTAMP1=`date '+\[%d/%b/%Y'` ;; esac } availability_backupmedia() { wakeup_nas BACKUP_MOUNTDIR_CHECK=`mount | egrep -w "$BACKUP_MOUNTDIR type nfs" | cut -d" " -f3 | head -1` if [ "$BACKUP_MOUNTDIR_CHECK" = "$BACKUP_MOUNTDIR" ] then RC=0 else wakeup_nas mount $BACKUP_MOUNTDIR if [ $? = "0" ] then RC=0 else RC=1 fi fi } do_availability_usbstation() { RC="" BACKUP_MOUNTDIR_CHECK=`mount | grep -o "$BACKUP_MOUNTDIR type ext4 " | cut -d" " -f1` if [ "$BACKUP_MOUNTDIR_CHECK" = "$BACKUP_MOUNTDIR" ] then RC=0 else mount $BACKUP_MOUNTDIR if [ $? = "0" ] then RC=0 else RC=1 echo " --> No backup media (USB-Station) available" fi fi } do_set_enviroment() { if [ "$BACKUP_MEDIA_TYPE" = "nfs" ] then CONFIGFILE="/etc/rsnapshot_"$MASCHINENAME".conf" BACKUP_MOUNTDIR="/mnt/import/rsnapshot" BACKUP_ROOTDIR="/mnt/import/rsnapshot/$MASCHINENAME" elif [ "$BACKUP_MEDIA_TYPE" = "usb" ] then CONFIGFILE="/etc/rsnapshot_"$MASCHINENAME"_usb.conf" BACKUP_MOUNTDIR="/mnt/share/usbstation" BACKUP_ROOTDIR="/mnt/share/usbstation/rsnapshot/$MASCHINENAME" else echo "Wrong backup media type $BACKUP_MEDIA_TYPE (nfs|usb)" exit 4 fi } wakeup_nas() { ping -c5 -q diskstation > /dev/null 2>&1 mount $BACKUP_MOUNTDIR > /dev/null 2>&1 } # Mailtext aus den Auszuegn der Logdatei erzeugen get_logextract() { OPTION=$1 change_month egrep "(^$TIMESTAMP1.*$OPTION:)" $RS_LOGFILE >> $RS_LOGFILE_EXTRACT } # Versende Statusmail send_mail() { if [ -e $RS_LOGFILE_EXTRACT -a $# -eq 1 ] then SUBJECT=$1 if [ "$SMTPMAILER" ] then . "$SMTPCONF" sendemail -q -f $SMTP_SENDER -t $SMTP_RECIPIENT -u "$SUBJECT" -s $SMTP_SERVER -xu $SMTP_RECIPIENT -xp $SMTP_MAIL_PWD < $RS_LOGFILE_EXTRACT else mailx -s "$SUBJECT" $MAILRECIPIENT < $RS_LOGFILE_EXTRACT fi rm $RS_LOGFILE_EXTRACT elif [ -e $RS_LOGFILE_EXTRACT -a $# -eq 2 ] then SUBJECT=$1 MAILBODY=$2 cat $RS_LOGFILE_EXTRACT > $BODYFILE cat >> $BODYFILE </dev/null 2>&1 hostname; echo $?` if [ "$CONNECT_TRIAL" != "0" ] then RC=1 elif [ "$CONNECT_TRIAL" = "0" ] then RC=0 fi return $RC } # Ueberpruefung ob bereits eine Sicherung des aktuellen Tages vorhanden ist check_backup() { # 0=ja, Backup vorh. 1=nein, kein Backup vorh. if [ "$OPTARG" = "hourly" ] then CHK="1" else BACKUP_INTERVAL=$OPTARG.0 BACKUP_DATE_CHECK=`test -e $BACKUP_ROOTDIR/$BACKUP_INTERVAL && stat $BACKUP_ROOTDIR/$BACKUP_INTERVAL | grep ^Modifiziert | cut -d" " -f2` BACKUP_LIST=`ls -ld $BACKUP_ROOTDIR/*` if [ "$TIMESTAMP3" = "$BACKUP_DATE_CHECK" ] then CHK="0" else CHK="1" fi fi return $CHK } print_startup_parameter() { echo "Startup Parameters:" > $RS_LOGFILE_EXTRACT echo $CALL_PARAM >> $RS_LOGFILE_EXTRACT echo "" >> $RS_LOGFILE_EXTRACT } # Hilfeseite ausgeben if [ $# -eq 0 ] then usage fi if [ ! -s $BACKUP_HOSTS ] then usage fi ########## Hauptprogramm ########## while getopts ho:n:b:f:m: OPTION; do case $OPTION in h) usage ;; o) BACKUP_MEDIA_TYPE=$OPTARG do_set_enviroment ;; n) MASCHINENAME=$OPTARG do_set_enviroment while read ROW do HOST_TO_BACKUP=`grep -w $MASCHINENAME $BACKUP_HOSTS` if [ "$HOST_TO_BACKUP" ] then RC=0 break else RC=1 fi done < $BACKUP_HOSTS if [ "$RC" = "1" ] then echo "Fehler: >>$MASCHINENAME<< ist ein unbekannter Host, bitte ggf. die Konfiguartionsdatei $BACKUP_HOSTS anpassen" exit 90 fi RS_LOGFILE_EXTRACT="/tmp/extractfile_$MASCHINENAME.txt" BODYFILE="/tmp/bodyfile_$MASCHINENAME.txt" RS_LOGFILE="/var/log/rsnapshot_$MASCHINENAME" print_startup_parameter ;; b) print_startup_parameter if [ "$OPTARG" = "hourly" -o "$OPTARG" = "daily" -o "$OPTARG" = "weekly" -o "$OPTARG" = "monthly" ] then availability_client if [ "$RC" != "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Achtung Host $MASCHINENAME ist nicht erreichbar!" exit 99 fi if [ "$BACKUP_MEDIA_TYPE" = "usb" ] then do_availability_usbstation elif [ "$BACKUP_MEDIA_TYPE" = "nfs" ] then availability_backupmedia fi if [ "$RC" != "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Achtung Diskstation ist fuer Host $MASCHINENAME nicht erreichbar!" exit 98 fi check_backup if [ "$CHK" = "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung bereits vorhanden" "$BACKUP_LIST" elif [ "$CHK" = "1" ] then run_backup $OPTARG get_logextract $OPTARG send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung durchgefuehrt" fi else send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Unbekanntes Intervall (Option) angegeben: -$OPTION $OPTARG" exit 97 fi ;; f) print_startup_parameter if [ "$OPTARG" = "hourly" -o "$OPTARG" = "daily" -o "$OPTARG" = "weekly" -o "$OPTARG" = "monthly" ] then availability_client if [ "$RC" != "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Achtung Host $MASCHINENAME ist nicht erreichbar!" exit 96 fi if [ "$BACKUP_MEDIA_TYPE" = "usb" ] then do_availability_usbstation elif [ "$BACKUP_MEDIA_TYPE" = "nfs" ] then availability_backupmedia fi if [ "$RC" != "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Achtung Diskstation ist fuer Host $MASCHINENAME nicht erreichbar!" exit 95 fi run_backup $OPTARG get_logextract $OPTARG send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung durchgefuehrt" else send_mail "[BATCH: BACKUP FILES]: $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Unbekanntes Intervall (Option) angegeben: -$OPTION $OPTARG" exit 94 fi ;; m) MAILRECIPIENT=$OPTARG echo $MISSINGPROGRAM ;; \?) echo $ERRORMESSAGE exit 3 ;; esac done shift `expr $OPTIND - 1` exit 0 #EOF