VEDEV=/dev/vg0/ve$VEID
VEMNT=/var/lib/vz/private/$VEID
EXTFS=/media/esata
+unset WRITEPAR
# FUNCTIONS
ret="$1"
shift
msg="$*"
- [ -n "$ret" ] && ret=-1
- [ -n "$msg" ] && msg=undef
- restartve
- if [ "$ret" = "0" ]; then
- echo "$(date)" | tee -a "$INFO"
- echo "$msg" | tee -a "$INFO"
- echo "exit $ret" | tee -a "$INFO"
- touch "$EXTVEIDFS/good"
+ if [ -z "$INFO" ]; then
+ echo "$0: $msg" >&2
else
- echo "$(date)" | tee -a "$INFO" >&2
- echo "$msg" | tee -a "$INFO" >&2
- echo "exit $ret" | tee -a "$INFO" >&2
- touch "$EXTVEIDFS/bad"
+ [ -z "$ret" ] && ret=-1
+ [ -z "$msg" ] && msg=undef
+ restartve
+ if [ "$ret" = "0" ]; then
+ echo "$(date)" | tee -a "$INFO"
+ echo "cleanup message: $msg" | tee -a "$INFO"
+ echo "exit $ret" | tee -a "$INFO"
+ touch "$EXTVEIDFS/good"
+ else
+ echo "$(date)" | tee -a "$INFO" >&2
+ echo "cleanup message: $msg" | tee -a "$INFO" >&2
+ echo "exit $ret" | tee -a "$INFO" >&2
+ touch "$EXTVEIDFS/bad"
+ fi
+ [ -n "$backupwarn" ] && echo "WARNINGS FOUND" >> "$INFO"
fi
- [ -n "$backupwarn" ] && echo "WARNINGS FOUND" >> "$INFO"
exit $ret
}
# MAIN
if [ $(whoami) != "root" ]; then
- echo "$0: script requires super-user privileges" >&2
- exit 1
+ cleanup 1 "script requires super-user privileges"
fi
set $(vzctl status $VEID)
[ "$5" = "running" ] && running=1
if ! mount | grep -q "on $EXTFS"; then
- echo "$0: $EXTFS is not mounted" >&2
- exit 1
+ cleanup 1 "$EXTFS is not mounted"
else
echo "$EXTFS is mounted"
fi
if [ -z "$exist" ]; then
- echo "$0: VEID $VEID does not exist" >&2
- exit 1
+ cleanup 1 "VEID $VEID does not exist"
else
echo "VEID $VEID exists"
fi
if [ ! -d "$VEMNT" ]; then
- echo "$0: mount point for VEID $VEID does not exist" >&2
- exit 1
+ cleanup 1 "mount point for VEID $VEID does not exist"
else
echo "VEID $VEID has private mount point"
fi
if ! grep -q "$VEMNT[ ]" /etc/fstab; then
- echo "$0: mount point for VEID $VEID not in /etc/fstab" >&2
- exit 1
+ cleanup 1 "mount point for VEID $VEID not in /etc/fstab"
fi
if ! mount | grep -q "on $VEMNT"; then
- echo "$0: $VEMNT is not mounted" >&2
- exit 1
+ cleanup 1 "$VEMNT is not mounted"
else
echo "VEID $VEID is mounted on $VEMNT"
fi
# Unmount the filesystem, first getting its size
if mount | grep -q "on $VEMNT"; then
mounted=1 # duplicate; vzctl status told us...
- srcblks=$(df "$VEMNT" | grep "VEMNT" | awk '{ print $2 }')
+ srcblks=$(df -P "$VEMNT" | grep "$VEMNT" | awk '{ print $2 }')
# Add 5% buffer
t=$((srcblks / 20))
srcblks=$((srcblks + t))
fi
# Before we begin writing, remove old backup dirs until we have room
-dstblks=$(df "$EXTFS" | grep "$EXTFS" | awk '{ print $4 }')
+dstblks=$(df -P "$EXTFS" | grep "$EXTFS" | awk '{ print $4 }')
while [ $dstblks -le $srcblks ]; do
- oldest=$(cd $EXTFS && ls -ld "ve${VEID}*" 2>/dev/null | tail -1 | \
+ oldest=$(cd $EXTFS && eval ls -ltd "ve${VEID}*" 2>/dev/null | tail -1 | \
awk '{ print $8 }')
if [ -d "$oldest" ]; then
echo "Removing old backup $oldest from $EXTFS"
rm -rf $oldest
fi
- dstblks=$(df "$EXTFS" | grep "$EXTFS" | awk '{ print $4 }')
+ dstblks=$(df -P "$EXTFS" | grep "$EXTFS" | awk '{ print $4 }')
done
if [ $dstblks -le $srcblks ]; then
cleanup 1 "out of space: need $srcblks KB, have $dstblks KB"
mv "$EXTVEIDFS" "${EXTVEIDFS}.old"
else
rm -rf "$EXTVEIDFS"
- mkdir "$EXTVEIDFS"
- date > "$EXTVEIDFS/begin"
fi
+mkdir "$EXTVEIDFS"
+date > "$EXTVEIDFS/begin"
if ! cd "$EXTVEIDFS"; then
cleanup 1 "cannot change into $EXTVEIDFS directory"
fi
Volume: $VEDEV
dd_rescue log: ddrlog
dd_rescue bad blocks: ddrbb
-img file: img
+image file: image
+EOF+
-echo "copy $VEID device $VEDEV to img" | tee -a "$INFO"
+echo "copy $VEID device $VEDEV to $EXTVEIDFS/image" | tee -a "$INFO"
time dd_rescue -Aqy 8192 -l "$EXTVEIDFS/ddrlog" -o "$EXTVEIDFS/ddrbb" \
- $VEDEV "$EXTVEIDFS/img"
+ $VEDEV "$EXTVEIDFS/image"
ret=$?
if [ "$ret" != "0" ]; then
backupwarn=1
fi
echo "calculate md5sum for $VEDEV (src)" | tee -a "$INFO"
srcmd5=$(md5sum "$VEDEV" 2>&1 | awk '{ print $1 }')
-echo "calculate md5sum for img (dst)" | tee -a "$INFO"
+echo "calculate md5sum for image (dst)" | tee -a "$INFO"
# We're done with the partition. We can restart the VE now.
restartve
# Continue on with archive and validation
-dstmd5=$(cd "$EXTVEIDFS" && time md5sum img >destmd5 2>&1 | awk '{ print $1 }')
-echo "$srcmd5 srcmd5" | tee -a "$INFO"
-echo "$dstmd5 dstmd5" | tee -a "$INFO"
+(cd "$EXTVEIDFS" && md5sum image >image.md5sum 2>&1 | awk '{ print $1 }')
+dstmd5=$(md5sum "$EXTVEIDFS/image" 2>&1 | awk '{ print $1 }')
+echo "$dstmd5 image.md5sum" > "$EXTVEIDFS/image.md5sum"
+echo "$srcmd5 source md5sum" | tee -a "$INFO"
+echo "$dstmd5 dest md5sum" | tee -a "$INFO"
if [ "$srcmd5" != "$dstmd5" -o -z "$srcmd5" ]; then
backupwarn=1
echo "WARNING: md5 signatures do not match" | tee -a "$INFO" >&2
else
echo "md5 signatures match" | tee -a "$INFO"
fi
-(cd "$EXTVEIDFS" && time par2 c img)
-ret=$?
-if [ "$ret" != "0" ]; then
- backupwarn=1
- echo "WARNING: redundancy failed: par2 returned $ret" | tee -a "$INFO"
-fi
-(cd "$EXTVEIDFS" && time par2 v img)
-ret=$?
-if [ "$ret" != "0" ]; then
- backupwarn=1
- echo "WARNING: redundancy inexact: par2 returned $ret" | tee -a "$INFO"
+if [ -n "$WRITEPAR" ]; then
+ (cd "$EXTVEIDFS" && time par2 c img)
+ ret=$?
+ if [ "$ret" != "0" ]; then
+ backupwarn=1
+ echo "WARNING: redundancy failed: par2 returned $ret" | tee -a "$INFO"
+ fi
+ (cd "$EXTVEIDFS" && time par2 v img)
+ ret=$?
+ if [ "$ret" != "0" ]; then
+ backupwarn=1
+ echo "WARNING: redundancy inexact: par2 returned $ret" | tee -a "$INFO"
+ fi
fi
cleanup 0 "successful"