]> oss.titaniummirror.com Git - ovzbpc.git/commitdiff
Early and not yet working version of bpcdump
authorsmckown <smckown@986fd584-583e-0410-b54d-b9fe63dff8e5>
Wed, 9 Apr 2008 06:37:56 +0000 (06:37 +0000)
committersmckown <smckown@986fd584-583e-0410-b54d-b9fe63dff8e5>
Wed, 9 Apr 2008 06:37:56 +0000 (06:37 +0000)
bpcdump [new file with mode: 0755]

diff --git a/bpcdump b/bpcdump
new file mode 100755 (executable)
index 0000000..3953ef9
--- /dev/null
+++ b/bpcdump
@@ -0,0 +1,199 @@
+#!/bin/bash
+#
+# bpcdump
+# Copyright (C) 2008 by Titanium Mirror, Inc.
+# Author: R. Steve McKown <smckown@titaniummirror.com>
+#
+# Dumps the BPC VEID to external storage.  It must have its storage on a
+# private filesystem mounted at /var/lib/vz/private/$VEID.
+#
+# A generalized version of this script should be created later.  A recovery
+# option within this script should also be created.
+
+# CONSTANTS
+
+VEID=1158
+VEDEV=/dev/vg0/ve$VEID
+VEMNT=/var/lib/vz/private/$VEID
+EXTFS=/media/esata
+
+# FUNCTIONS
+
+restartve()
+{
+    if [ -n "$mounted" ]; then
+       echo "remounting VEID $VEID" | tee -a "$INFO"
+       mount $VEMNT && unset mounted
+    fi
+    if [ -n "$running" ]; then
+       echo "restarting VEID $VEID" | tee -a "$INFO"
+       vzctl start $VEID && unset running
+    fi
+}
+
+cleanup()
+{
+    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"
+    else
+       echo "$(date)" | tee -a "$INFO" >&2
+       echo "$msg" | tee -a "$INFO" >&2
+       echo "exit $ret" | tee -a "$INFO" >&2
+       touch "$EXTVEIDFS/bad"
+    fi
+    [ -n "$backupwarn" ] && echo "WARNINGS FOUND" >> "$INFO"
+    exit $ret
+}
+
+# MAIN
+
+if [ $(whoami) != "root" ]; then
+    echo "$0: script requires super-user privileges" >&2
+    exit 1
+fi
+
+set $(vzctl status $VEID)
+unset exist mounted running backupwarn
+[ "$3" = "exist" ] && exist=1
+[ "$4" = "mounted" ] && mounted=1
+[ "$5" = "running" ] && running=1
+
+if ! mount | grep -q "on $EXTFS"; then
+    echo "$0: $EXTFS is not mounted" >&2
+    exit 1
+else
+    echo "$EXTFS is mounted"
+fi
+
+if [ -z "$exist" ]; then
+    echo "$0: VEID $VEID does not exist" >&2
+    exit 1
+else
+    echo "VEID $VEID exists"
+fi
+
+if [ ! -d "$VEMNT" ]; then
+    echo "$0: mount point for VEID $VEID does not exist" >&2
+    exit 1
+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
+fi
+
+if ! mount | grep -q "on $VEMNT"; then
+    echo "$0: $VEMNT is not mounted" >&2
+    exit 1
+else
+    echo "VEID $VEID is mounted on $VEMNT"
+fi
+
+if [ -n "$running" ]; then
+    echo "stopping VEID $VEID"
+    vzctl stop $VEID
+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 }')
+    # Add 5% buffer
+    t=$((srcblks / 20))
+    srcblks=$((srcblks + t))
+    echo "VEID fs contains $srcblks blocks"
+    echo "unmount VEID $VEID"
+    umount "$VEMNT"
+else
+    cleanup 1 "VEID private fs must be mounted to determine its size"
+fi
+
+# Before we begin writing, remove old backup dirs until we have room
+dstblks=$(df "$EXTFS" | grep "$EXTFS" | awk '{ print $4 }')
+while [ $dstblks -le $srcblks ]; do
+    oldest=$(cd $EXTFS && ls -ld "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 }')
+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"
+
+EXTVEIDFS="$EXTFS/ve$VEID-$(date +'%Y%m%d')"
+if [ -d "$EXTVEIDFS" ]; then
+    rm -rf "${EXTVEIDFS}.old"
+    mv "$EXTVEIDFS" "${EXTVEIDFS}.old"
+else
+    rm -rf "$EXTVEIDFS"
+    mkdir "$EXTVEIDFS"
+    date > "$EXTVEIDFS/begin"
+fi
+if ! cd "$EXTVEIDFS"; then
+    cleanup 1 "cannot change into $EXTVEIDFS directory"
+fi
+
+INFO="$EXTVEIDFS/info"
+cat > "$INFO" <<+EOF+
+Date: $(date)
+VEID: $VEID
+Volume: $VEDEV
+dd_rescue log: ddrlog
+dd_rescue bad blocks: ddrbb
+img file: img
+
++EOF+
+echo "copy $VEID device $VEDEV to img" | tee -a "$INFO"
+time dd_rescue -Aqy 8192 -l "$EXTVEIDFS/ddrlog" -o "$EXTVEIDFS/ddrbb" \
+       $VEDEV "$EXTVEIDFS/img"
+ret=$?
+if [ "$ret" != "0" ]; then
+    backupwarn=1
+    echo "WARNING: dd_rescue returned $ret" | tee -a "$INFO" >&2
+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"
+
+# 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"
+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"
+fi
+
+cleanup 0 "successful"