Hi liebes Publikum,
das Thema rsnapshot hatten wir schon oft. Es ist ein tolles Tool zur Datensicherung. Solange QNAP die Datensicherung eher stiefmütterlich behandelt, kommt man um eine Ergänzung nicht herum.
Ich hatte mich schon vor einiger Zeit für rsnapshot entschieden. Auf die Vorteile will ich nicht näher eingehen. Das internet ist voll mit Beiträgen dazu.
Wo viel Licht, da ist auch Schatten. Mir fehlte eine Benachrichtigung über die Backups, wer liest schon täglich die Logs.
Eine Info über die Speichernutzung der, in meinem Fall, USB-Festplatte
Die Aufteilung in mehrere cronjobs fand ich auch nicht so toll, wenn noch ein rsnapshot-Prozess läuft, wir der nächst aufgerufene einfach beendet.
Diese kleinen Nachteile will ich mit meinem folgenden script abschaffen.
Was gemacht werden muss, um das script zum laufen zu bringen, steht im script selbst.
Die Nutzung ist natürlich auf eigene Gefahr.
Über Feedback würde ich mich sehr freuen, auch Kritik, Wünsche, Verbesserungen sind herzlich willkommen.
#!/bin/sh
# rsnapshot-Ergänzung snap.sh Version 1.0 ######################################################
# Voraussetzungen: core-utils, ipkg grep, rsnapshot, konfigurierte rsnapshot.conf, #############
# ein cronjob, der dieses script aufruft, rsnapshot cronjobs sind zu löschen ##
################################################################################################
# Variablen festlegen ##########################################################################
################################################################################################
# hier müssen Anpassungen vorgenommen werden ###################################################
BACKUP_HOURLY_DO=0 # Sollen stündliche Backups erfolgen? 1=ja, 0=nein, der cronjob muss entsprechend angelegt sein
BACKUP_DAILY=21 # Festlegen wann ein tägliches Backup efolgt, hier in der 21. Stunde, cronjob muss in dieser Zeit ausgeführt werden
BACKUP_WEEKLY=1 # Festlegen wann ein wöchentliches Backup efolgt, hier am Samstag
BACKUP_MONTHLY=1 # Festlegen wann ein monatliches Backup efolgt, hier am 1. Tag des Monats
WAIT=900 # Wie lange gewartet wird, bis ein neuer Versuch eines Backups gestartet wird, in Sekunden
RSNAPSHOT_CONF="/opt/etc/rsnapshot.conf" # Pfad zur rsnapshot.conf
LOG_AGE=30 # wie lange Logdateien aufbewahrt werden, in Tagen
HOST_NAME="TS 109" # Name des zu sichernden Gerätes (ist nur für den E-Mail Text)
USB_DISK="/share/external/sdo" # Mount-Point der USB-Festplatte oder des Sicherungsmediums,
# der sollte in eurer /etc/config/smb.conf stehen
USB_DISK_NAME="USBDisk1" # Bezeichnung der Backup USB-Festplatte (nur für E-Mail Text)
MAIL_FILE="/tmp/mail.txt" # Pfad für Zwischenspeicherung der E-Mail-Datei
MAIL_FROM="icke@icke.de" # Absender der E-Mail
MAIL_TO="nichicke@icke.de" # Empfänger der E-Mail
MAIL_LEVEL_HOURLY=2 # Wann sollen bei stündl. Backups Mails gesendet werden? 0=keine 1=Warnungen/Fehler 2=immer
MAIL_LEVEL_DAILY=2 # Wann sollen bei tägl. Backups Mails gesendet werden? 0=keine 1=Warnungen/Fehler 2=immer
MAIL_LEVEL_WEEKLY=2 # Wann sollen bei wöchentl. Backups Mails gesendet werden? 0=keine 1=Warnungen/Fehler 2=immer
MAIL_LEVEL_MONTHLY=2 # Wann sollen bei monatl. Backups Mails gesendet werden? 0=keine 1=Warnungen/Fehler 2=immer
DU_FILE="/tmp/du.txt"
# ENDE der Anpassungen ########################################################################
WEEKDAY=$(date +"%w") # ermitteln des Wochentages
MONTHDAY=$(date +"%d") # ermitteln Tag des Monats
TODAY_HOUR=$(date +"%H") # ermitteln Stund des Tages
TODAY=$(date +"%Y%m%d")
TODAY_WEEK=$(date +"%W")
TODAY_MONTH=$(date +"%m")
WAIT_MAIL="$(($WAIT /60)) min."
TIMESTAMP_DAY="/opt/etc/snap_day.ts" # Timestamp-Datei
if [ ! -f "${TIMESTAMP_DAY}" ]; then
echo "0" > ${TIMESTAMP_DAY}
fi
TIMESTAMP_WEEK="/opt/etc/snap_week.ts" # Timestamp-Datei
if [ ! -f "${TIMESTAMP_WEEK}" ]; then
echo "0" > ${TIMESTAMP_WEEK}
fi
TIMESTAMP_MONTH="/opt/etc/snap_month.ts" # Timestamp-Datei
if [ ! -f "${TIMESTAMP_MONTH}" ]; then
echo "0" > ${TIMESTAMP_MONTH}
fi
# Backupverzeichnis ermitteln (wird in rsnapshot.conf vorgegeben)
BACKUP_DIR=`/opt/bin/grep -w 'snapshot_root' $RSNAPSHOT_CONF | grep -v '#' | awk '{print $2}'`
# Log-Datei ermitteln (wird in rsnapshot.conf vorgegeben)
LOGFILE=`/opt/bin/grep -w 'logfile' $RSNAPSHOT_CONF | grep -v '#' | awk '{print $2}'`
# Log-Verzeichnis (leitet sich aus $LOGFILE ab)
LOG_DIR=${LOGFILE%/*}
# Ort der pid-File ermitteln (wird in rsnapshot.conf vorgegeben)
PID=`/opt/bin/grep -w 'lockfile' $RSNAPSHOT_CONF | grep -v '#' | awk '{print $2}'`
################################################################################################
# Überprüfen, ob Rsnapshot läuft, wenn ja, wird gewartet und eine Info-Mail verschickt #########
################################################################################################
while [ -e $PID ]; do
DATE_START=$(date +"%d.%m.%Y")
TIME_START=$(date +"%T")
echo "From: ${MAIL_FROM}" > $MAIL_FILE
echo "To: ${MAIL_TO}" >> $MAIL_FILE
echo "Subject: Rsnapshot-Backup nicht gestartet." >> $MAIL_FILE
echo "${BACKUP_TEXT}" >> $MAIL_FILE
echo "Start: ${DATE_START}, ${TIME_START}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Ein Rsnapshot-Backup läuft noch, deshalb bricht ${HOST_NAME} den Vorgang ab." >> $MAIL_FILE
echo "warte ${WAIT_MAIL}" >> $MAIL_FILE
sendmail -t < $MAIL_FILE
sleep $WAIT
done
################################################################################################
# starten des Rsnapshot-Backup-Monthly #########################################################
################################################################################################
TIMESTAMP_MONTH_READ=$(cat $TIMESTAMP_MONTH)
if [ $TODAY_MONTH != $TIMESTAMP_MONTH_READ ] && [ $MONTHDAY = $BACKUP_MONTHLY ] && [ ! -d "${BACKUPDIR}week.3" ]; then
DATE_START=$(date +"%d.%m.%Y") # Startdatum, Form 01.01.2001
TIME_START=$(date +"%T") # Startzeit, Form 17:30:12
LOG_DATE=$(date +"%Y-%m-%d") # Datum für die Logdatei, Form 2010-04-15
echo ${TODAY_MONTH} >${TIMESTAMP_MONTH}
/opt/bin/rsnapshot monthly
EXIT_STATUS="$?" # Status des Backups
case $EXIT_STATUS in
0) EXIT_STATUS_LONG="Erfolg";;
2) EXIT_STATUS_LONG="Warnung";;
1) EXIT_STATUS_LONG="Fehler";;
esac
DATE_END=$(date +"%d.%m.%Y") # Enddatum, Form 01.01.2001
TIME_END=$(date +"%T") # Endzeit ;-) , Form 17:30:12
BACKUP_TEXT="Backup-Monthly von ${HOSTNAME}:"
BACKUP_TEXT_2="Backup-Monthly"
################################################################################################
# belegten Speicherplatz des Backupmediums ermitteln ###########################################
################################################################################################
SPACE_USE_PERCENT=$(df -h $USB_DISK | tail -n1 | awk '{ print $5 }' | sed 's/.\{1\}$//')
SPACE_FREE=$(df -h $USB_DISK | tail -n1 | awk '{ print $4 }')
SPACE_USE=$(df -h $USB_DISK | tail -n1 | awk '{ print $3 }')
SPACE_TOTAL=$(df -h $USB_DISK | tail -n1 | awk '{ print $2 }')
SPACE_USE_RSNAPSHOT=`/opt/bin/rsnapshot du`
################################################################################################
# Erstellen und Versenden einer E-Mail mit Info über die Backupfestplatte ######################
# und dem Staus des Backups #####################
################################################################################################
if [ $EXIT_STATUS -ge 0 -a $MAIL_LEVEL_HOURLY -eq 2 ] || [ $EXIT_STATUS -ge 1 -a $MAIL_LEVEL_HOURLY -ge 1 ]; then
echo "To: ${MAIL_TO}" >> $MAIL_FILE
echo "Subject: ${BACKUP_TEXT_2} ${EXIT_STATUS_LONG}" >> $MAIL_FILE
echo "${BACKUP_TEXT}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Start: ${DATE_START}, ${TIME_START}" >> $MAIL_FILE
echo "Ende: ${DATE_END}, ${TIME_END}" >> $MAIL_FILE
echo "Status: ${EXIT_STATUS_LONG}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Speicherinformationen ${USB_DISK_NAME}:" >> $MAIL_FILE
echo "total: ${SPACE_TOTAL}" >> $MAIL_FILE
echo "belegt: ${SPACE_USE} = ${SPACE_USE_PERCENT}%" >> $MAIL_FILE
echo "frei: ${SPACE_FREE}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Speichernutzung durch Rsnapshot:" >> $MAIL_FILE
echo /opt/bin/rsnapshot du >> $MAIL_FILE
echo "${SPACE_USE_RSNAPSHOT}" >> $MAIL_FILE
sendmail -t < $MAIL_FILE
fi
mv -f "${LOGFILE}" "${LOGFILE}_monthly_${LOG_DATE}"
fi
################################################################################################
# starten des Rsnapshot-Backup-Weekly ##########################################################
################################################################################################
TIMESTAMP_WEEK_READ=$(cat $TIMESTAMP_WEEK)
if [ $TODAY_WEEK != $TIMESTAMP_WEEK_READ ] && [ $WEEKDAY = $BACKUP_WEEKLY ] && [ ! -d "${BACKUPDIR}daily.6" ]; then
DATE_START=$(date +"%d.%m.%Y")
TIME_START=$(date +"%T")
LOG_DATE=$(date +"%Y-%m-%d")
echo ${TODAY_WEEK} >${TIMESTAMP_WEEK}
/opt/bin/rsnapshot weekly
EXIT_STATUS="$?"
case $EXIT_STATUS in
0) EXIT_STATUS_LONG="Erfolg";;
2) EXIT_STATUS_LONG="Warnung";;
1) EXIT_STATUS_LONG="Fehler";;
esac
DATE_END=$(date +"%d.%m.%Y")
TIME_END=$(date +"%T")
BACKUP_TEXT="Backup-Weekly von ${HOSTNAME}:"
BACKUP_TEXT_2="Backup-Weekly"
################################################################################################
# belegten Speicherplatz des Backupmediums ermitteln ###########################################
################################################################################################
SPACE_USE_PERCENT=$(df -h $USB_DISK | tail -n1 | awk '{ print $5 }' | sed 's/.\{1\}$//')
SPACE_FREE=$(df -h $USB_DISK | tail -n1 | awk '{ print $4 }')
SPACE_USE=$(df -h $USB_DISK | tail -n1 | awk '{ print $3 }')
SPACE_TOTAL=$(df -h $USB_DISK | tail -n1 | awk '{ print $2 }')
SPACE_USE_RSNAPSHOT=`/opt/bin/rsnapshot du`
################################################################################################
# Erstellen und Versenden einer E-Mail mit Info über die Backupfestplatte ######################
# und dem Staus des Backups #####################
################################################################################################
if [ $EXIT_STATUS -ge 0 -a $MAIL_LEVEL_HOURLY -eq 2 ] || [ $EXIT_STATUS -ge 1 -a $MAIL_LEVEL_HOURLY -ge 1 ]; then
echo "From: ${MAIL_FROM}" > $MAIL_FILE
echo "To: ${MAIL_TO}" >> $MAIL_FILE
echo "Subject: ${BACKUP_TEXT_2} ${EXIT_STATUS_LONG}" >> $MAIL_FILE
echo "${BACKUP_TEXT}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Start: ${DATE_START}, ${TIME_START}" >> $MAIL_FILE
echo "Ende: ${DATE_END}, ${TIME_END}" >> $MAIL_FILE
echo "Status: ${EXIT_STATUS_LONG}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Speicherinformationen ${USB_DISK_NAME}:" >> $MAIL_FILE
echo "total: ${SPACE_TOTAL}" >> $MAIL_FILE
echo "belegt: ${SPACE_USE} = ${SPACE_USE_PERCENT}%" >> $MAIL_FILE
echo "frei: ${SPACE_FREE}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Speichernutzung durch Rsnapshot:" >> $MAIL_FILE
echo "${SPACE_USE_RSNAPSHOT}" >> $MAIL_FILE
sendmail -t < $MAIL_FILE
fi
mv -f "${LOGFILE}" "${LOGFILE}_monthly_${LOG_DATE}"
fi
################################################################################################
# starten des Rsnapshot-Backup-Daily ###########################################################
################################################################################################
TIMESTAMP_DAY_READ=$(cat $TIMESTAMP_DAY)
if [ $TODAY != $TIMESTAMP_DAY_READ ] && [ $BACKUP_DAILY == $TODAY_HOUR ]; then
DATE_START=$(date +"%d.%m.%Y")
TIME_START=$(date +"%T")
LOG_DATE=$(date +"%Y-%m-%d")
echo ${TODAY} >${TIMESTAMP_DAY}
/opt/bin/rsnapshot daily
EXIT_STATUS="$?"
case $EXIT_STATUS in
0) EXIT_STATUS_LONG="Erfolg";;
2) EXIT_STATUS_LONG="Warnung";;
1) EXIT_STATUS_LONG="Fehler";;
esac
DATE_END=$(date +"%d.%m.%Y")
TIME_END=$(date +"%T")
BACKUP_TEXT="Backup-Daily von ${HOSTNAME}:"
BACKUP_TEXT_2="Backup-Daily"
################################################################################################
# belegten Speicherplatz des Backupmediums ermitteln ###########################################
################################################################################################
SPACE_USE_PERCENT=$(df -h $USB_DISK | tail -n1 | awk '{ print $5 }' | sed 's/.\{1\}$//')
SPACE_FREE=$(df -h $USB_DISK | tail -n1 | awk '{ print $4 }')
SPACE_USE=$(df -h $USB_DISK | tail -n1 | awk '{ print $3 }')
SPACE_TOTAL=$(df -h $USB_DISK | tail -n1 | awk '{ print $2 }')
SPACE_USE_RSNAPSHOT=`/opt/bin/rsnapshot du`
################################################################################################
# Erstellen und Versenden einer E-Mail mit Info über die Backupfestplatte ######################
# und dem Staus des Backups #####################
################################################################################################
if [ $EXIT_STATUS -ge 0 -a $MAIL_LEVEL_HOURLY -eq 2 ] || [ $EXIT_STATUS -ge 1 -a $MAIL_LEVEL_HOURLY -ge 1 ]; then
echo "From: ${MAIL_FROM}" > $MAIL_FILE
echo "To: ${MAIL_TO}" >> $MAIL_FILE
echo "Subject: ${BACKUP_TEXT_2} ${EXIT_STATUS_LONG}" >> $MAIL_FILE
echo "${BACKUP_TEXT}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Start: ${DATE_START}, ${TIME_START}" >> $MAIL_FILE
echo "Ende: ${DATE_END}, ${TIME_END}" >> $MAIL_FILE
echo "Status: ${EXIT_STATUS_LONG}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Speicherinformationen ${USB_DISK_NAME}:" >> $MAIL_FILE
echo "total: ${SPACE_TOTAL}" >> $MAIL_FILE
echo "belegt: ${SPACE_USE} = ${SPACE_USE_PERCENT}%" >> $MAIL_FILE
echo "frei: ${SPACE_FREE}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Speichernutzung durch Rsnapshot:" >> $MAIL_FILE
echo "${SPACE_USE_RSNAPSHOT}" >> $MAIL_FILE
sendmail -t < $MAIL_FILE
fi
mv -f "${LOGFILE}" "${LOGFILE}_monthly_${LOG_DATE}"
fi
################################################################################################
# starten des Rsnapshot-Backup-Hourly ##########################################################
################################################################################################
if [ $BACKUP_HOURLY_DO == 1 ]; then
DATE_START=$(date +"%d.%m.%Y")
TIME_START=$(date +"%T")
LOG_DATE=$(date +"%Y-%m-%d")
/opt/bin/rsnapshot hourly
EXIT_STATUS="$?"
case $EXIT_STATUS in
0) EXIT_STATUS_LONG="Erfolg";;
2) EXIT_STATUS_LONG="Warnung";;
1) EXIT_STATUS_LONG="Fehler";;
esac
DATE_END=$(date +"%d.%m.%Y")
TIME_END=$(date +"%T")
BACKUP_TEXT="Backup-Hourly von ${HOSTNAME}:"
BACKUP_TEXT_2="Backup-Hourly"
################################################################################################
# belegten Speicherplatz des Backupmediums ermitteln ###########################################
################################################################################################
SPACE_USE_PERCENT=$(df -h $USB_DISK | tail -n1 | awk '{ print $5 }' | sed 's/.\{1\}$//')
SPACE_FREE=$(df -h $USB_DISK | tail -n1 | awk '{ print $4 }')
SPACE_USE=$(df -h $USB_DISK | tail -n1 | awk '{ print $3 }')
SPACE_TOTAL=$(df -h $USB_DISK | tail -n1 | awk '{ print $2 }')
SPACE_USE_RSNAPSHOT=`/opt/bin/rsnapshot du`
################################################################################################
# Erstellen und Versenden einer E-Mail mit Info über die Backupfestplatte ######################
# und dem Staus des Backups #####################
################################################################################################
if [ $EXIT_STATUS -ge 0 -a $MAIL_LEVEL_HOURLY -eq 2 ] || [ $EXIT_STATUS -ge 1 -a $MAIL_LEVEL_HOURLY -ge 1 ]; then
echo "From: ${MAIL_FROM}" > $MAIL_FILE
echo "To: ${MAIL_TO}" >> $MAIL_FILE
echo "Subject: ${BACKUP_TEXT_2} ${EXIT_STATUS_LONG}" >> $MAIL_FILE
echo "${BACKUP_TEXT}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Start: ${DATE_START}, ${TIME_START}" >> $MAIL_FILE
echo "Ende: ${DATE_END}, ${TIME_END}" >> $MAIL_FILE
echo "Status: ${EXIT_STATUS_LONG}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Speicherinformationen ${USB_DISK_NAME}:" >> $MAIL_FILE
echo "total: ${SPACE_TOTAL}" >> $MAIL_FILE
echo "belegt: ${SPACE_USE} = ${SPACE_USE_PERCENT}%" >> $MAIL_FILE
echo "frei: ${SPACE_FREE}" >> $MAIL_FILE
echo >> $MAIL_FILE
echo "Speichernutzung durch Rsnapshot:" >> $MAIL_FILE
echo "${SPACE_USE_RSNAPSHOT}" >> $MAIL_FILE
sendmail -t < $MAIL_FILE
fi
mv -f "${LOGFILE}" "${LOGFILE}_monthly_${LOG_DATE}"
fi
find $LOG_DIR -name 'rsnapshot*' -mtime +$LOG_AGE | xargs rm -f
Alles anzeigen
Leider ist es jetzt etwas bescheiden formatiert. Darum hänge es noch an.