VEMNT=/var/lib/vz/private/$VEID
EXTFS=/media/esata
unset WRITEPAR
+INFO=/dev/null
# FUNCTIONS
+info()
+{
+ echo "$*" | tee -a "$INFO"
+}
+
+error()
+{
+ echo "$*" | tee -a "$INFO" >&2
+}
+
restartve()
{
if [ -n "$mounted" ]; then
- echo "remounting VEID $VEID" | tee -a "$INFO"
+ info "remounting VEID $VEID"
mount $VEMNT && unset mounted
fi
if [ -n "$running" ]; then
- echo "restarting VEID $VEID" | tee -a "$INFO"
+ info "restarting VEID $VEID"
vzctl start $VEID && unset running
fi
}
ret="$1"
shift
msg="$*"
- if [ -z "$INFO" ]; then
- echo "$0: $msg" >&2
+ [ -z "$ret" ] && ret=-1
+ [ -z "$msg" ] && msg=undef
+ restartve
+ if [ "$ret" = "0" ]; then
+ info "$(date)"
+ info "cleanup message: $msg"
+ info "exit $ret"
+ touch "$EXTVEIDFS/good"
else
- [ -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"
+ error "$(date)"
+ error "cleanup message: $msg"
+ error "exit $ret"
+ touch "$EXTVEIDFS/bad"
fi
+ [ -n "$backupwarn" ] && info "WARNINGS FOUND" >> "$INFO"
exit $ret
}
# MAIN
+trap "cleanup 1 \"termination by signal\"" SIGINT SIGTERM
+
if [ $(whoami) != "root" ]; then
cleanup 1 "script requires super-user privileges"
fi
if ! mount | grep -q "on $EXTFS"; then
cleanup 1 "$EXTFS is not mounted"
else
- echo "$EXTFS is mounted"
+ info "$EXTFS is mounted"
fi
if [ -z "$exist" ]; then
cleanup 1 "VEID $VEID does not exist"
else
- echo "VEID $VEID exists"
+ info "VEID $VEID exists"
fi
if [ ! -d "$VEMNT" ]; then
cleanup 1 "mount point for VEID $VEID does not exist"
else
- echo "VEID $VEID has private mount point"
+ info "VEID $VEID has private mount point"
fi
if ! grep -q "$VEMNT[ ]" /etc/fstab; then
if ! mount | grep -q "on $VEMNT"; then
cleanup 1 "$VEMNT is not mounted"
else
- echo "VEID $VEID is mounted on $VEMNT"
+ info "VEID $VEID is mounted on $VEMNT"
fi
if [ -n "$running" ]; then
- echo "stopping VEID $VEID"
+ info "stopping VEID $VEID"
vzctl stop $VEID
fi
# Add 5% buffer
t=$((srcblks / 20))
srcblks=$((srcblks + t))
- echo "VEID fs contains $srcblks blocks"
- echo "unmount VEID $VEID"
+ info "VEID fs contains $srcblks blocks"
+ info "unmount VEID $VEID"
umount "$VEMNT"
else
cleanup 1 "VEID private fs must be mounted to determine its size"
# Before we begin writing, remove old backup dirs until we have room
dstblks=$(df -P "$EXTFS" | grep "$EXTFS" | awk '{ print $4 }')
while [ $dstblks -le $srcblks ]; do
+ info "Not enough space on $EXTFS"
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
+ if [ -d "$EXTFS/$oldest" ]; then
+ info "Removing old backup $oldest from $EXTFS"
+ rm -rf "$EXTFS/$oldest"
+ else
+ cleanup 1 "Structure error on $EXTFS. Correct manually."
fi
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"
fi
-echo "Archive space ok: need $srcblks KB, have $dstblks KB"
+info "Archive space ok: need $srcblks KB, have $dstblks KB"
EXTVEIDFS="$EXTFS/ve$VEID-$(date +'%Y%m%d')"
if [ -d "$EXTVEIDFS" ]; then
image file: image
+EOF+
-echo "copy $VEID device $VEDEV to $EXTVEIDFS/image" | tee -a "$INFO"
+info "copy $VEID device $VEDEV to $EXTVEIDFS/image"
time dd_rescue -Aqy 8192 -l "$EXTVEIDFS/ddrlog" -o "$EXTVEIDFS/ddrbb" \
$VEDEV "$EXTVEIDFS/image"
ret=$?
if [ "$ret" != "0" ]; then
backupwarn=1
- echo "WARNING: dd_rescue returned $ret" | tee -a "$INFO" >&2
+ error "WARNING: dd_rescue returned $ret"
fi
-echo "calculate md5sum for $VEDEV (src)" | tee -a "$INFO"
+info "calculate md5sum for $VEDEV (src)"
srcmd5=$(md5sum "$VEDEV" 2>&1 | awk '{ print $1 }')
-echo "calculate md5sum for image (dst)" | tee -a "$INFO"
+info "calculate md5sum for image (dst)"
# We're done with the partition. We can restart the VE now.
restartve
(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"
+info "$srcmd5 source md5sum"
+info "$dstmd5 dest md5sum"
if [ "$srcmd5" != "$dstmd5" -o -z "$srcmd5" ]; then
backupwarn=1
- echo "WARNING: md5 signatures do not match" | tee -a "$INFO" >&2
+ error "WARNING: md5 signatures do not match"
else
- echo "md5 signatures match" | tee -a "$INFO"
+ info "md5 signatures match"
fi
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"
+ info "WARNING: redundancy failed: par2 returned $ret"
fi
(cd "$EXTVEIDFS" && time par2 v img)
ret=$?
if [ "$ret" != "0" ]; then
backupwarn=1
- echo "WARNING: redundancy inexact: par2 returned $ret" | tee -a "$INFO"
+ info "WARNING: redundancy inexact: par2 returned $ret"
fi
fi