Dateibasierten Systembackup mit rsnapshot erstellen

Aus Bluelupo's Wiki
Wechseln zu: Navigation, Suche

Bashscript run_rsnapshot.sh

  1 #!/bin/bash
  2 #
  3 ########## Variablendefinition ##########
  4 
  5 # Standardbelegung der Variablen
  6 MISSINGPROGRAM="$0: Programoption -b oder -f muss angegeben werden"
  7 ERRORMESSAGE="$0: -$OPTION ist nicht erlaubt und wird ignoriert"
  8 PROGRAM="/usr/bin/rsnapshot"
  9 CONFIGFILE="/etc/rsnapshot.conf"
 10 RS_LOGFILE="/var/log/rsnapshot"
 11 RS_LOGFILE_EXTRACT="/tmp/extractfile.txt"
 12 BODYFILE="/tmp/bodyfile.txt"
 13 #USBDISK_DEV="/dev/usbdisk1"
 14 USBDISK_DEV="/dev/backupdisk1"
 15 MAIL_TIMESTAMP=`date '+%d/%b/%Y:'`
 16 TIMESTAMP1=`date '+\[%d/'`
 17 TIMESTAMP2=`date '+/%Y:%H'`
 18 TIMESTAMP3=`date '+%Y-%m-%d'`
 19 MAILRECIPIENT="michael@localhost"
 20 SSH_CONFIG_FILE_RS="/root/.ssh/config.rsnapshot"
 21 SSH_CONFIG_FILE="/root/.ssh/config"
 22 BACKUP_ROOTDIR="/mnt/backup/rsnapshot"
 23 
 24 ########## Funktionen ##########
 25 usage()
 26 {
 27    echo "Syntax: $0 [-h | -b <daily|weekly|monthly>| -f <daily|weekly|monthly>| -m <empfaenger>]"
 28    echo ""
 29    echo " -h             diese Hilfeseite anzeigen"
 30    echo " -b intervall   Backup durchfuehren mit Laufcheck (Standard)"
 31    echo " -f intervall   Backup zwingend durchfuehren (forced)"
 32    echo " -m user        Mailempfaenger (durch Kommatas getrennt)"
 33    echo ""
 34    exit 1
 35 }
 36 
 37 
 38 # Verfuegbarkeit von externer USB-Disk pruefen
 39 exits_usbdisk()
 40 {
 41    if [ -e "$USBDISK_DEV" ]
 42       then
 43       BACKUP_ROOTDIR_CHECK=`mount|egrep rsnapshot|cut -d" " -f3`
 44       if [ "$BACKUP_ROOTDIR_CHECK" = "$BACKUP_ROOTDIR" ]
 45          then
 46          RC=0
 47       else
 48          mount $USBDISK_DEV $BACKUP_ROOTDIR
 49          if [ $? = "0" ]
 50             then
 51             RC=0
 52          else
 53             RC=1
 54          fi
 55       fi
 56    else
 57       RC=2
 58    fi
 59 }
 60 
 61 
 62 # Mailtext aus den Auszuegn der Logdatei erzeugen
 63 get_logextract()
 64 {
 65    OPTION=$1
 66    egrep "(^$TIMESTAMP1.*$TIMESTAMP2.*$PROGRAM.*$OPTION:|^$TIMESTAMP1.*$TIMESTAMP2.*not present|^$TIMESTAMP1.*$TIMESTAMP2.*$OPTARG: completed successfully)" $RS_LOGFILE > $RS_LOGFILE_EXTRACT
 67 }
 68 
 69 
 70 # Versende Statusmail
 71 send_mail()
 72 {
 73    if [ -e $RS_LOGFILE_EXTRACT ]
 74       then
 75       SUBJECT=$1
 76       mailx -s "$SUBJECT" $MAILRECIPIENT < $RS_LOGFILE_EXTRACT
 77       rm $RS_LOGFILE_EXTRACT
 78    else
 79       SUBJECT=$1
 80       MAILBODY=$2
 81       cat > $BODYFILE <<EOF
 82 $MAILBODY
 83 EOF
 84    mailx -s "$SUBJECT" $MAILRECIPIENT < $BODYFILE
 85    rm $BODYFILE
 86    fi
 87 }
 88 
 89 
 90 # Backuplauf starten
 91 run_backup()
 92 {
 93    mv $SSH_CONFIG_FILE_RS $SSH_CONFIG_FILE
 94    sleep 2
 95    INTERVAL=$1
 96    $PROGRAM $INTERVAL 
 97    mv $SSH_CONFIG_FILE $SSH_CONFIG_FILE_RS
 98 }
 99 
100 
101 # Ueberpruefung ob bereits eine Sicherung des aktuellen Tages vorhanden ist
102 check_backup()
103 {
104    # 0=ja, Backup vorh.  1=nein, kein Backup vorh.
105    BACKUP_INTERVAL=$OPTARG.0
106    BACKUP_DATE_CHECK=`test -e $BACKUP_ROOTDIR/$BACKUP_INTERVAL && stat $BACKUP_ROOTDIR/$BACKUP_INTERVAL | grep ^Modify | cut -d" " -f2`
107    BACKUP_LIST=`ls -ltd $BACKUP_ROOTDIR/*`
108    if [ "$TIMESTAMP3" = "$BACKUP_DATE_CHECK" ]
109       then
110       CHK="0"
111    else
112       CHK="1"
113    fi
114    return $CHK
115 }
116 
117 
118 # Hilfeseite ausgeben
119 if [ $# -eq 0 ]; then
120    usage
121 fi
122 
123 ########## Hauptprogramm ##########
124 while getopts hb:f:m: OPTION; do
125    case $OPTION in
126       h)
127       usage
128       ;;
129 
130       b)
131       if [ "$OPTARG" = "daily" -o "$OPTARG" = "weekly" -o "$OPTARG" = "monthly" ]
132          then
133          exits_usbdisk
134          if [ "$RC" != "0" ]
135             then
136             send_mail "[BACKUP]: rsnapshot vom $MAIL_TIMESTAMP nicht durchfuehrbar" "[RC=$RC] USB-Device nicht verfuegbar!  Bitte USB-Anschlusskabel pruefen bzw. USB-Disk anschliessen."
137             exit 99
138          fi
139 
140          check_backup
141          if [ "$CHK" = "0" ]
142             then
143             send_mail "[BACKUP]: rsnapshot vom $MAIL_TIMESTAMP bereits vorhanden" "$BACKUP_LIST"
144 
145          elif [ "$CHK" = "1" ]
146             then
147             run_backup $OPTARG
148             get_logextract $OPTARG
149             send_mail "[BACKUP]: rsnapshot vom $MAIL_TIMESTAMP durchgefuehrt"
150          fi
151       else
152          send_mail "[BACKUP]: rsnapshot vom $MAIL_TIMESTAMP unbekannte Option" "Unbekanntes Intervall angegeben: -$OPTION $OPTARG"
153          exit 98
154       fi
155       ;;
156 
157 
158       f)
159       if [ "$OPTARG" = "daily" -o "$OPTARG" = "weekly" -o "$OPTARG" = "monthly" ]
160          then
161          exits_usbdisk
162          if [ "$RC" != "0" ]
163             then
164             send_mail "[BACKUP]: rsnapshot vom $MAIL_TIMESTAMP nicht durchfuehrbar" "[RC=$RC] USB-Device nicht verfuegbar!  Bitte USB-Anschlusskabel pruefen bzw. USB-Disk anschliessen."
165             exit 99
166          fi
167          run_backup $OPTARG
168          get_logextract $OPTARG
169          send_mail "[BACKUP]: rsnapshot vom $MAIL_TIMESTAMP durchgefuehrt"
170       else
171          send_mail "[BACKUP]: rsnapshot vom $MAIL_TIMESTAMP unbekannte Option" "Unbekanntes Intervall angegeben: -$OPTION $OPTARG"
172          exit 97
173       fi
174       ;;
175 
176       m)
177       MAILRECIPIENT=$OPTARG
178       echo $MISSINGPROGRAM
179       ;;
180 
181       \?)
182       echo $ERRORMESSAGE   
183       exit 3
184       ;;
185    
186    esac
187 done
188 shift `expr $OPTIND - 1`
189 
190 exit 0
191 # EOF