run_compress_dd.sh
Inhaltsverzeichnis
Einträge für die root Crontab
# Images komprimieren 25 8,18 * * 1,5 /usr/local/scripts/run_compress_dd.sh -b usb -n radiobox -c14 -l1 -s 25 8,18 * * 2,6 /usr/local/scripts/run_compress_dd.sh -b usb -n raven -c14 -l1 -s 59 9,19 * * 3,7 /usr/local/scripts/run_compress_dd.sh -b usb -n greenline -c14 -l1 -z18 -s 35 17 * * 1,3 /usr/local/scripts/run_compress_dd.sh -b usb -n neonlight -c14 -l1 -z18 -s 15 17 * * 5,7 /usr/local/scripts/run_compress_dd.sh -b usb -n neonlight -c14 -l1 -z18 -s # # Images loeschen 26 11 * * 5,7 /usr/local/scripts/run_compress_dd.sh -b usb -n neonlight -c14 -d 31 11 * * 5,7 /usr/local/scripts/run_compress_dd.sh -b usb -n radiobox -c14 -d 46 11 * * 5,7 /usr/local/scripts/run_compress_dd.sh -b usb -n raven -c14 -d 41 11 * * 5,7 /usr/local/scripts/run_compress_dd.sh -b usb -n greenline -c14 -d # # Images verschieben ins ARCHIVE 50 18 5-9 * * /usr/local/scripts/run_compress_dd.sh -b usb -n neonlight -m 00 19 5-11 * * /usr/local/scripts/run_compress_dd.sh -b usb -n radiobox -m 10 19 5-9 * * /usr/local/scripts/run_compress_dd.sh -b usb -n raven -m 20 19 5-9 * * /usr/local/scripts/run_compress_dd.sh -b usb -n greenline -m
Optionsparameter
Ausgabe der Hilfe (Option -h) für das Shellscript.
root:~# /usr/local/scripts/run_compress_dd.sh -h Syntax: /usr/local/scripts/run_compress_dd.sh [-h | -n <hostname> | -c <2...n> | -l <1-9> | -z <anzahl> | -d | -s | -m] | -b <nfs|usb> -h (help): diese Hilfeseite anzeigen -c (archive counter): Anzahl der zu archivierenden Backupversionen (gueltiger Wert=>1) die aufgehoben werden -l (compress level): Qualitaet der Komprimierung (1=schnellste Kompr. 9=beste Kompr.) -z (zip): Anzahl n (Default=12) der Images die pro Lauf max. komprimiert werden -d (delete only): nur Anzahl n Backupversionen behalten, keine Komprimierung durchfuehren -s (shrink): Backuplauf durchfuehren -m (move): Aeltesten Backupsatz ins Archiv verschieben -n (name): Hostname dessen Backupimages komprimiert werden sollen -b (backupmedia) verwendetes Backupmedium (NAS oder USB-Disk)
Codelisting Konfigurationsdateien
Alle Hostnamen deren Backupdateien aus dem Sicherungslauf des Shellscriptes run_lvmsnap.sh komprimiert werden sollen.
- /etc/compress_dd.conf
dagobert micky tick trick track
- /usr/local/scripts/smtpmail.conf
SMTP_RECIPIENT="info@meine-empfaenger-mailadresse.de" SMTP_SENDER="info@meine-sender-mailadresse.de" SMTP_SERVER="smtpserver.meinprovider.de" SMTP_MAIL_PWD="geheim"
Codelisting Shellscript
- run_compress_dd.sh
#!/bin/bash ########## Globale Variablendefinitionen ########## CONF_FILE="/etc/compress_dd.conf" ARCHIVE_COUNTER="3" COMPRESS_LEVEL="1" LOCKPATH="/var/tmp" LOCKFILE_LVMSNAP="run_lvmsnap.sh.lck" MAILRECIPIENT="michael@localhost" MAX_FILE_TO_ZIP="12" SMTPCONF="/usr/local/scripts/smtpmail.conf" SMTPMAILER=`which sendemail` ########## Funktionsdefinitionen ########## usage() { echo "Syntax: $0 [-h | -n <hostname> | -c <2...n> | -l <1-9> | -z <anzahl> | -d | -s | -m] | -b <nfs|usb>" echo "" echo " -h (help): diese Hilfeseite anzeigen" echo " -c (archive counter): Anzahl der zu archivierenden Backupversionen (gueltiger Wert=>1) die aufgehoben werden" echo " -l (compress level): Qualitaet der Komprimierung (1=schnellste Kompr. 9=beste Kompr.)" echo " -z (zip): Anzahl n (Default=12) der Images die pro Lauf max. komprimiert werden" echo " -d (delete only): nur Anzahl n Backupversionen behalten, keine Komprimierung durchfuehren" echo " -s (shrink): Backuplauf durchfuehren" echo " -m (move): Aeltesten Backupsatz ins Archiv verschieben" echo " -n (name): Hostname dessen Backupimages komprimiert werden sollen" echo " -b (backupmedia) verwendetes Backupmedium (NAS oder USB-Disk)" exit 1 } do_lock_moveperm() { if [ "$1" = "on" ] then if [ ! -e "$LOCKPATH/$LOCKFILE_MOVEPERM" ] then echo " --> Attention no log file $LOCKPATH/$LOCKFILE_MOVEPERM exists" >> $LOGFILE 2>&1 echo " --> Trying create a lock file for moving the monthly backup sets" >> $LOGFILE 2>&1 date '+%s' > $LOCKPATH/$LOCKFILE_MOVEPERM RC=$? if [ $RC -eq 0 ] then echo " --> Lock file $LOCKPATH/$LOCKFILE_MOVEPERM was created" >> $LOGFILE 2>&1 elif [ $RC -ne 0 ] then echo " --> Lock file $LOCKPATH/$LOCKFILE_MOVEPERM could not be created" >> $LOGFILE 2>&1 fi else LOCKFILE_TIMESTAMP=`stat $LOCKPATH/$LOCKFILE_MOVEPERM|egrep ^Modify:|cut -d" " -f2,3|cut -d"." -f1` echo " --> Verify lock file $LOCKPATH/$LOCKFILE_MOVEPERM from $LOCKFILE_TIMESTAMP for moving the monthly backup set" >> $LOGFILE 2>&1 HISTORICAL_MOVEDATE=`cat $LOCKPATH/$LOCKFILE_MOVEPERM` CURRENT_MOVEDATE=`date '+%s'` # 30 Tage = 2592000 Sekunden # 28 Tage = 2419200 Sekunden MOVE_INTERVAL=2419200 MOVE_INTERVAL_DAYS=`expr $MOVE_INTERVAL / 86400` # Alle 28 Tage einen Backup verschieben TIME2MOVE=`expr $CURRENT_MOVEDATE - $HISTORICAL_MOVEDATE` fi elif [ "$1" = "off" ] then LOCKFILE_TIMESTAMP=`stat $LOCKPATH/$LOCKFILE_MOVEPERM|egrep ^Modify:|cut -d" " -f2,3|cut -d"." -f1` rm -v $LOCKPATH/$LOCKFILE_MOVEPERM >> $LOGFILE 2>&1 echo " --> Old lock file $LOCKPATH/$LOCKFILE_MOVEPERM is deleted from $LOCKFILE_TIMESTAMP" >> $LOGFILE 2>&1 fi } do_lock() { if [ "$1" = "on" ] then echo " --> Processing begins now" >> $LOGFILE 2>&1 pidof -x $0 > $LOCKPATH/$LOCKFILE echo " --> Set lock in file $LOCKPATH/$LOCKFILE" >> $LOGFILE 2>&1 elif [ "$1" = "off" ] then rm -v $LOCKPATH/$LOCKFILE >> $LOGFILE 2>&1 echo " --> Script run complete" >> $LOGFILE 2>&1 fi } do_delete_older_lockfile() { # Lockfile aelter als 4 Stunden (210 min) loeschen (unter /var/lock/run_compress_dd.sh_<hostname>.lck) OLDER_LOCKFILE=`find $LOCKPATH -name $LOCKFILE -mmin +210` if [ "$OLDER_LOCKFILE" ] then echo " --> A lock file $LOCKPATH/$LOCKFILE is older than 3.5 hours (210 min) from a previous processing has been deleted" >> $LOGFILE 2>&1 rm $LOCKPATH/$LOCKFILE elif [ "$OLDER_LOCKFILE" = "" ] then echo " --> No lock file $LOCKPATH/$LOCKFILE exists older than 3.5 hours from a previous processing" >> $LOGFILE 2>&1 fi } do_runtest() { do_delete_older_lockfile if [ ! -e "$LOCKPATH/$LOCKFILE" -a ! -e "$LOCKPATH_LVMSNAP/$LOCKFILE_LVMSNAP" ] then do_lock on elif [ -e "$LOCKPATH/$LOCKFILE" ] then echo " --> No run available (lock file: $LOCKPATH/$LOCKFILE)" >> $LOGFILE 2>&1 print_message LOCK1 create_logentry stop exit 2 elif [ -e "$LOCKPATH_LVMSNAP/$LOCKFILE_LVMSNAP" ] then echo " --> No run available (lock file: $LOCKPATH_LVMSNAP/$LOCKFILE_LVMSNAP)" >> $LOGFILE 2>&1 print_message LOCK2 create_logentry stop exit 3 fi } create_logentry() { if [ "$1" = "start" ] then LOGFILE_START_TIMESTAMP=`date '+%Y-%m-%d %H:%M:%S'` echo "[Log started: $LOGFILE_START_TIMESTAMP]" >> $LOGFILE elif [ "$1" = "stop" ] then LOGFILE_END_TIMESTAMP=`date '+%Y-%m-%d %H:%M:%S'` echo "[Log ended: $LOGFILE_END_TIMESTAMP]" >> $LOGFILE fi } do_compress() { DD_COUNTER=`find $BACKUP_PATH -name "*.dd" | wc -l` DD_COUNTER=`expr $DD_COUNTER + 0` if [ $DD_COUNTER -gt 0 ] then echo "" >> $LOGFILE 2>&1 echo " --> Start the compression of the backup set of $MASCHINENAME" >> $LOGFILE 2>&1 #find $BACKUP_PATH -name "*.dd" | tail -$MAX_FILE_TO_ZIP | xargs pbzip2 -m150 -v -$COMPRESS_LEVEL >> $LOGFILE 2>&1 find $BACKUP_PATH -name "*.dd" | tail -$MAX_FILE_TO_ZIP | xargs lzop -U -v -$COMPRESS_LEVEL >> $LOGFILE 2>&1 RC=$? echo " --> Complete the compression of the backup set of $MASCHINENAME" >> $LOGFILE 2>&1 elif [ $DD_COUNTER -eq 0 ] then echo " --> No uncompressed image of maschine $MASCHINENAME available" >> $LOGFILE 2>&1 RC=0 fi } do_del_oldest_backup() { if [ $RC -eq 0 ] then BACKUP_COUNTER=`find $BACKUP_PATH -type d -name "????-??-??-????" | wc -l` if [ $BACKUP_COUNTER -gt $ARCHIVE_COUNTER ] then SUM_BACKUPDIR=`ls -1r $BACKUP_PATH | wc -l` TO_DEL_BACKUPDIR=`expr $SUM_BACKUPDIR - $ARCHIVE_COUNTER` OLDEST_BACKUPDIR=`ls -1r $BACKUP_PATH | tail -$TO_DEL_BACKUPDIR` for DEL in $OLDEST_BACKUPDIR do echo "" >> $LOGFILE 2>&1 echo " --> Remove the oldest backup sets from the archive" >> $LOGFILE 2>&1 rm -rv $BACKUP_PATH/$DEL >> $LOGFILE 2>&1 done elif [ $BACKUP_COUNTER -le $ARCHIVE_COUNTER ] then echo " --> Number of archive versions ($BACKUP_COUNTER of $ARCHIVE_COUNTER) within limits" >> $LOGFILE 2>&1 fi elif [ $RC -ne 0 ] then echo "" >> $LOGFILE 2>&1 echo " --> Error (RC=$RC) during compression" >> $LOGFILE 2>&1 fi } print_message() { NOARGUMENT="Bei der Option -$OPTION wurde kein Wert angegeben" MISSINGARGUMENT="Bei der Option -$OPTION wurde ein falscher Wert angegeben" NOTAVAILIBLEOPT="Option $2 ist nicht erlaubt und wird ignoriert" TOSMALLARGUMENT="Bei der Option -$OPTION wurde ein zu kleiner Wert angegeben" NO_RUN1="Es laueft noch die Komprimierung der LVM-Snapshots oder die Verarbeitung wurde abgebrochen" NO_RUN2="Es laeuft noch ein LVM-Snapshot oder die Verarbeitung wurde abgebrochen" if [ "$1" = "MISSINGARGUMENT" ] then echo $MISSINGARGUMENT elif [ "$1" = "NOTAVAILIBLEOPT" ] then echo $NOTAVAILIBLEOPT elif [ "$1" = "TOSMALLARGUMENT" ] then echo $TOSMALLARGUMENT elif [ "$1" = "LOCK1" ] then echo $NO_RUN1 elif [ "$1" = "LOCK2" ] then echo $NO_RUN2 elif [ "$1" = "NOARGUMENT" ] then echo $NOARGUMENT fi } do_mailsend() { MAILSUBJECT=$1 if [ "$SMTPMAILER" ] then . "$SMTPCONF" sed -n "/\[Log started: $LOGFILE_START_TIMESTAMP\]/,/\[Log ended: $LOGFILE_END_TIMESTAMP\]/p" $LOGFILE | sendemail -q -f $SMTP_SENDER -t $SMTP_RECIPIENT -u "$MAILSUBJECT" -s $SMTP_SERVER -xu $SMTP_RECIPIENT -xp $SMTP_MAIL_PWD else sed -n "/\[Log started: $LOGFILE_START_TIMESTAMP\]/,/\[Log ended: $LOGFILE_END_TIMESTAMP\]/p" $LOGFILE | mailx -s "$MAILSUBJECT" $MAILRECIPIENT fi } do_naswakeup() { ping -c4 -q -W10 diskstation >/dev/null 2>&1 RC_PING=`echo $?` if [ "$RC_PING" = "0" ] then echo " --> Backup media (NAS) is awake" >> $LOGFILE 2>&1 sleep 10 RC_NFS=`mount | grep -o "$BACKUP_MOUNTDIR type nfs " | cut -d" " -f3` if [ "$RC_NFS" = "nfs" ] then echo " --> NFS on backup media (NAS) is available" >> $LOGFILE 2>&1 elif [ "$RC_NFS" != "nfs" ] then echo " --> NFS on backup media (NAS) is not available" >> $LOGFILE 2>&1 fi elif [ "$RC_PING" != "0" ] then echo " --> Backup media (NAS) is not awake" >> $LOGFILE 2>&1 fi } do_availability_backupmedia() { RC="" if [ "$BACKUP_MEDIA_TYPE" = "nfs" ] then BACKUP_MOUNTDIR_CHECK=`mount | grep -o "$BACKUP_MOUNTDIR type nfs " | cut -d" " -f1` elif [ "$BACKUP_MEDIA_TYPE" = "usb" ] then BACKUP_MOUNTDIR_CHECK=`mount | grep -o "$BACKUP_MOUNTDIR type ext4 " | cut -d" " -f1` fi if [ "$BACKUP_MOUNTDIR_CHECK" = "$BACKUP_MOUNTDIR" ] then RC=0 echo " --> Remote backup (NAS-Station or USB-Station) directory is available" >> $LOGFILE 2>&1 else mount $BACKUP_MOUNTDIR >> $LOGFILE 2>&1 if [ $? = "0" ] then RC=0 else RC=1 echo " --> No backup media (NAS-Station or USB-Station) available" >> $LOGFILE 2>&1 fi fi } print_startup_parameter() { echo -n " Startup Parameters:" >> $LOGFILE 2>&1 echo " $CALL_PARAMETER" >> $LOGFILE 2>&1 echo "" >> $LOGFILE 2>&1 } print_additional_archive_info() { echo "$1" >> $LOGFILE 2>&1 } move_backup() { if [ ! -d "$ARCHIVE_PATH" ] then mkdir $ARCHIVE_PATH fi BACKUP_COUNTER=`find $BACKUP_PATH -type d -name "????-??-??-????" | wc -l` if [ $BACKUP_COUNTER -gt 1 ] then echo " --> Try to move the oldest backup sets to the archive directory" >> $LOGFILE 2>&1 OLDEST_BACKUPDIR=`ls -1r $BACKUP_PATH | tail -1` mv -v $BACKUP_PATH/$OLDEST_BACKUPDIR $ARCHIVE_PATH >> $LOGFILE 2>&1 echo " --> All backup sets on the archive directory moved" >> $LOGFILE 2>&1 fi } do_set_enviroment() { if [ "$BACKUP_MEDIA_TYPE" = "nfs" ] then BACKUP_PATH="/mnt/import/diskdump/" BACKUP_MOUNTDIR="/mnt/import/diskdump" ARCHIVE_PATH="/mnt/import/archive/" LOCKPATH_LVMSNAP="$BACKUP_MOUNTDIR/lock" elif [ "$BACKUP_MEDIA_TYPE" = "usb" ] then BACKUP_PATH="/mnt/share/usbstation/diskdump/" BACKUP_MOUNTDIR="/mnt/share/usbstation" ARCHIVE_PATH="/mnt/share/usbstation/archive/" LOCKPATH_LVMSNAP="$BACKUP_MOUNTDIR/lock" else echo "Wrong backup media type $BACKUP_MEDIA_TYPE (nfs|usb)" exit 4 fi } set_local_variables() { MASCHINENAME=$1 LOGFILE="/var/log/compress_dd_"$MASCHINENAME".log" BACKUP_PATH="$BACKUP_PATH$MASCHINENAME" ARCHIVE_PATH="$ARCHIVE_PATH$MASCHINENAME" LOCKFILE_MOVEPERM="move_perm_$MASCHINENAME.lck" LOCKFILE="`basename $0`_$MASCHINENAME.lck" } set_existing_hostnames() { if [ -s "$CONF_FILE" ] then for ROW in `cat $CONF_FILE` do ARRAY_HOSTS[$INDEX_HOSTS]=$ROW INDEX_HOSTS=`expr $INDEX_HOSTS + 1` done else echo "Die Konfigurationsdatei $CONF_FILE mit den gueltigen Hostnamen existiert nicht, bitte anlegen!" exit 99 fi } set_valid_hostname() { for ROW in ${ARRAY_HOSTS[@]} do if [ "$ROW" = "$OPTARG" ] then VALID_HOST=$ROW fi done if [ -z "$VALID_HOST" ] then echo "Angebener Hostname $OPTARG ist nicht in der Konfigurationsdatei $CONF_FILE vorhanden" exit 99 fi } debug_printarray() { echo "" echo "-----------------Debuging Ausgabe--------------------" for I in ${ARRAY_HOSTS[@]} do echo $I done echo "-----------------Debuging Ausgabe--------------------" echo "" } if [ $# -eq 0 ]; then usage fi CALL_PARAMETER="$0 $@" ########## Hauptprogramm ########## while getopts hb:n:c:z:l:dsmx OPTION do case $OPTION in h) usage ;; b) BACKUP_MEDIA_TYPE=$OPTARG do_set_enviroment ;; n) set_existing_hostnames set_valid_hostname set_local_variables $OPTARG ;; l) if [ $OPTARG -gt 0 -a $OPTARG -lt 10 ] then COMPRESS_LEVEL=$OPTARG else FALSEOPT=$1 print_message MISSINGARGUMENT $FALSEOPT fi ;; c) if [ $OPTARG -lt 2 ] then FALSEOPT=$1 print_message TOSMALLARGUMENT $FALSEOPT exit 2 elif [ $OPTARG -ge 2 ] then ARCHIVE_COUNTER=$OPTARG else FALSEOPT=$1 print_message MISSINGARGUMENT $FALSEOPT exit 3 fi ;; z) MAX_FILE_TO_ZIP=$OPTARG if [[ $OPTARG = -* ]] then print_message NOARGUMENT exit 99 fi if [[ $OPTARG -eq 0 ]] then print_message TOSMALLARGUMENT exit 99 fi ;; s) create_logentry start print_startup_parameter do_runtest print_additional_archive_info " --> Set compress level to value: $COMPRESS_LEVEL" print_additional_archive_info " --> Set archive version(s) to value: $ARCHIVE_COUNTER" print_additional_archive_info " --> Set maximum number of backup files to be compressed in a single pass on the value: $MAX_FILE_TO_ZIP" do_availability_backupmedia $BACKUP_MEDIA_TYPE if [ "$RC" != "0" ] then do_lock off create_logentry stop do_mailsend "[BATCH: COMPRESS IMAGE] $MASCHINENAME: Komprimierung der Images nicht durchfuehrbar. Diskstation nicht verfuegbar!" elif [ "$RC" = "0" ] then do_compress do_del_oldest_backup do_lock off create_logentry stop do_mailsend "[BATCH: COMPRESS IMAGE] $MASCHINENAME: Komprimierung der Images duruchgefuehrt" fi ;; d) RC=0 create_logentry start print_startup_parameter do_runtest do_availability_backupmedia $BACKUP_MEDIA_TYPE if [ "$RC" != "0" ] then do_lock off create_logentry stop do_mailsend "[BATCH: DELETE IMAGE] $MASCHINENAME: Loeschen der Images nicht moeglich. Diskstation nicht verfuegbar!" elif [ "$RC" = "0" ] then do_del_oldest_backup do_lock off create_logentry stop do_mailsend "[BATCH: DELETE IMAGE] $MASCHINENAME: Loeschen der Images durchgefuehrt" fi ;; m) create_logentry start print_startup_parameter do_runtest do_availability_backupmedia $BACKUP_MEDIA_TYPE if [ "$RC" != "0" ] then do_lock off create_logentry stop do_mailsend "[BATCH: MOVE IMAGE] $MASCHINENAME: Verschieben der Images nicht durchfuehrbar. Diskstation nicht verfuegbar!" fi do_lock_moveperm on if [ $TIME2MOVE -gt $MOVE_INTERVAL ] then move_backup do_lock off do_lock_moveperm off do_lock_moveperm on ### create_logentry stop do_mailsend "[BATCH: MOVE IMAGES] $MASCHINENAME: Verschieben der Images durchgefuehrt" else do_lock off create_logentry stop do_mailsend "[BATCH: MOVE IMAGES] $MASCHINENAME: Verschieben der Images nicht noetig. Zeitintervall von $MOVE_INTERVAL_DAYS Tagen noch nicht erreicht" fi ;; x) debug_printarray ;; \?) FALSEOPT=$1 print_message NOTAVAILIBLEOPT $FALSEOPT exit 4 ;; esac done shift `expr $OPTIND - 1` exit 0 #EOF
run_compress_dd.sh.txt · Zuletzt geändert: 2020/02/21 19:38 von dwadmin