Ich benutze rdiff-backup um meine Systeme zu sichern. Bis Heute hatte ich für jeden Job ein extra Script. Da ich nun aber eine Übersicht meine Backups als Mail haben will, habe ich mich hingesetzt und eine generellere Lösung gesucht.
Das Script was ich nun habe wird mit einer Job Datei aufgerufen. In der steht was wohin gesichert werden soll. Zusätzlich will ich in der selben Datei Kommandos auflisten die vor bzw nach dem Backup ausgeführt werden sollen.
Dabei habe ich nun das Problem das wenn Sie per ssh ausgeführt werden nur der erste befehl ausgeführt wird. Und das wenn sie lokal ausgeführt werden ich keine Sonderzeichen wie [] und verwenden kann.
#!/bin/bash
RDIFF=`which rdiff-backup`
MAIL=`which mail`
WOL=`which wakeonlan`
MAILTO="sebastian@zuhause.local"
#MAILTO=
LOG=/tmp/backup-`date +%s`
DATE=`date`
JOB=""
TMPJOB=/tmp/backup-job-`date +%s`
while [ -e $LOG ]
do
sleep 1
LOG=/tmp/backup-`date +%s`
done
while [ -e $TMPJOB ]
do
sleep 1
TMPJOB=/tmp/backup-job-`date +%s`
done
function maillog {
if [ ! -n "$MAILTO" ]; then
echo "Keine Emailadress weiche auf cat aus"
cat $LOG
return 0
fi
if [ -e $MAIL ]; then
cat $LOG | $MAIL -s "backup.sh hat den Job $JOB am $DATE mit dem Status $1 beendet" $MAILTO
else
echo "Kann Mail Programm nicht finden. Weiche auf cat aus"
cat $LOG
return 0
fi
}
function checkoption {
if [ "$#" == "1" ]; then
JOB=$1
if [ "${JOB##*.}" == "job" ]; then
[ -e "$JOB" ] && return 0
fi
fi
echo "Es darf nur ein Parameter übergeben werden, dieser mus eine .job Datei sein" >>$LOG
return 1
}
function checkjob {
cat $JOB | grep -v ^# | sed '/^$/d' > $TMPJOB
echo "Prüfe Job Variablen" >>$LOG
for i in SOURCE DEST EXCLUDE PRECMDSTART AFTERCMDSTART PRECMDSTOP AFTERCMDSTOP CMDHOST MAC
do
local tmp
if tmp=`grep ^$i $TMPJOB`; then
echo "$tmp in job Datei gefunden" >>$LOG
else
echo "$i nicht in job Datei. Bitte Format prüfen!" >>$LOG
return 1
fi
done
return 0
}
function cleanup {
[ -e $LOG ] && rm -f $LOG
[ -e $TMPJOB ] && rm -f $TMPJOB
}
function isterror {
maillog ERROR
cleanup
exit 1
}
function getsource {
SOURCE=$(grep SOURCE= $TMPJOB | cut -d \= -f 2)
[ -n "$SOURCE" ] && return 0
echo "$SOURCE ist kein gültiger Wert für SOURCE" >>$LOG
}
function getdest {
DEST=$(grep DEST= $TMPJOB | cut -d \= -f 2)
[ -n "$DEST" ] && return 0
echo "$DEST ist kein gültiger Wert für DEST" >>$LOG
}
function getexclude {
EXCLUDE=$(grep EXCLUDE= $TMPJOB | cut -d \= -f 2)
return 0
}
function getcmdhost {
CMDHOST=$(grep CMDHOST= $TMPJOB | cut -d \= -f 2)
[ -n "$CMDHOST" ] || CMDHOST=localhost
return 0
}
function getmac {
MAC=$(grep MAC= $TMPJOB | cut -d \= -f 2)
return 0
}
function excutlocal {
$@ >>$LOG
if [ "$?" != "0" ]; then
echo "Fehler bei $1" >>$LOG
return 1
fi
return 0
}
function excuteremote {
ssh $CMDHOST "$@" >>$LOG
if [ "$?" != "0" ]; then
echo "Fehler bei $1" >>$LOG
return 1
fi
return 0
}
function excutecmd {
# 1 PRE oder AFTER
exec<$TMPJOB
declare -i n=0
declare -i START=0
declare -i STOP=0
case $1 in
PRE) echo "Starte vor Beckup Komandos" >>$LOG
START=$(grep -m 1 -n PRECMDSTART $TMPJOB | cut -d : -f 1)
STOP=$(grep -m 1 -n PRECMDSTOP $TMPJOB | cut -d : -f 1)
while read line
do
n=`expr $n + 1`
if [ $n -gt $START -a $n -lt $STOP ]; then
if [ "$CMDHOST" != "localhost" ]; then
excuteremote "$line" || isterror
else
excutlocal "$line" || isterror
fi
fi
done
echo "Vor Beckup Komandos erfolgreich beendet" >>$LOG
;;
AFTER) echo "Start nach Beckup Komandos" >>$LOG
START=$(grep -m 1 -n AFTERCMDSTART $TMPJOB | cut -d : -f 1)
STOP=$(grep -m 1 -n AFTERCMDSTOP $TMPJOB | cut -d : -f 1)
while read line
do
n=`expr $n + 1`
if [ $n -gt $START -a $n -lt $STOP ]; then
if [ "$CMDHOST" != "localhost" ]; then
excuteremote "$line" || isterror
else
excutlocal "$line" || isterror
fi
fi
done
echo "Nach Backup Komandos erfolgreich" >>$LOG
;;
*) echo "function execute wurde falsch aufgerufen" >>$LOG
return 1
esac
}
function dobackup {
CMD=$RDIFF
for i in $EXCLUDE
do
CMD="$CMD --exclude $i"
done
echo "Starte rdiff-backup" >>$LOG
echo "$CMD $SOURCE $DEST" >>$LOG
$CMD $SOURCE $DEST >>$LOG 2>&1
# sleep 180
}
function checkcmdhost {
if [ -n "$CMDHOST" ]; then
for (( VERSUCH=0; $VERSUCH < 10; VERSUCH++ ))
do
if ping -c 3 $CMDHOST; then
echo "$CMDHOST ist an fahre mit Backup fort" >>$LOG
return 0
else
echo "kann $CMDHOST nicht erreichen, sende WOL" >>$LOG
$WOL $MAC
sleep 60
fi
done
echo "kann $CMDHOST nicht erreichen, gebe auf" >>$LOG
return 1
fi
}
#MAIN
echo "Beginne mit backup.sh für Job $1 am $DATE" >>$LOG
for i in "checkoption $@" checkjob getsource getdest getexclude getcmdhost checkcmdhost "excutecmd PRE" dobackup "excutecmd AFTER"
do
$i || isterror
done
maillog OK
cleanup
exit 0
Alles anzeigen
Schaut euch doch bitte die excutecmd Funktion an. Vielleicht hat ja jemand eine Lösung dafür. Was ich nur ungern machen würde ist die Vor- und Nach- Backup Kommandos in separaten Dateien zu speichern. Auch wüste ich dann nicht wie ich die Verarbeitung beim ersten gescheiterten Kommando abbrechen könnte.