From 9a9fcf39ed2a0648dfb902307b0221b798060df6 Mon Sep 17 00:00:00 2001 From: smckown Date: Wed, 9 Apr 2008 06:37:56 +0000 Subject: [PATCH] Early and not yet working version of bpcdump --- bpcdump | 199 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100755 bpcdump diff --git a/bpcdump b/bpcdump new file mode 100755 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 +# +# 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" -- 2.39.2