X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=bpcdump;h=efb845621750ccc9bf83b0bfc5b340144eadf2d6;hb=HEAD;hp=0693e001ec3fc728d36ee1b1da07b8b653ebd6f6;hpb=2289d8cb0089b72802c6a39cdce181d57cf239a8;p=ovzbpc.git diff --git a/bpcdump b/bpcdump index 0693e00..efb8456 100755 --- a/bpcdump +++ b/bpcdump @@ -1,7 +1,9 @@ #!/bin/bash # # bpcdump -# Copyright (C) 2008 by Titanium Mirror, Inc. +# Version: __appVersion__ +# +# Copyright (C) 2008-2012 by Titanium Mirror, Inc. # Author: R. Steve McKown # # Dumps the BPC VEID to external storage. It must have its storage on a @@ -17,21 +19,29 @@ VEDEV=/dev/vg0/ve$VEID VEMNT=/var/lib/vz/private/$VEID EXTFS=/media/esata unset WRITEPAR -INFO=/dev/null export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/usr/sbin:$PATH SCRIPT_EXT="conf start stop mount umount" CONF_DIR=/etc/vz/conf +INFO=$(mktemp -q /tmp/bpcdump.XXXXX) # FUNCTIONS info() { - echo "$*" | tee -a "$INFO" + if [ -n "$INFO" ]; then + echo "$*" | tee -a "$INFO" + else + echo "$*" + fi } error() { - echo "$*" | tee -a "$INFO" >&2 + if [ -n "$INFO" ]; then + echo "$*" | tee -a "$INFO" >&2 + else + echo "$*" + fi } restartve() @@ -60,12 +70,12 @@ cleanup() [ -z "$msg" ] && msg=undef restartve if [ "$ret" = "0" ]; then - info "$(date)" + info "Backup completed on $(date)" info "cleanup message: $msg" info "exit $ret" touch "$EXTVEIDFS/good" else - error "$(date)" + error "Backup TERMINATED on $(date)" error "cleanup message: $msg" error "exit $ret" touch "$EXTVEIDFS/bad" @@ -76,6 +86,17 @@ cleanup() # MAIN +STARTDATE=$(date) +cat > "$INFO" <<+EOF+ +Date: $STARTDATE +VEID: $VEID +Volume: $VEDEV +dd_rescue log: ddrlog +dd_rescue bad blocks: ddrbb +image file: image + ++EOF+ + trap "cleanup 1 \"termination by signal\"" SIGINT SIGTERM if [ $(whoami) != "root" ]; then @@ -146,12 +167,16 @@ 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 +# Before we begin writing, remove old backup dirs until we have room. +# Assume backups for any VE are fair game for removal if space is needed. +# Other disk contents shall not be removed. dstblks=$(df -P "$EXTFS" | grep "$EXTFS" | awk '{ print $4 }') while [ $dstblks -le $srcblks ]; do info "Only $dstblks free on $EXTFS" - oldest=$(cd $EXTFS && eval ls -td "ve${VEID}*" 2>/dev/null | tail -1) - if [ -d "$EXTFS/$oldest" ]; then + oldest=$(cd $EXTFS && eval ls -td "ve[0-9]*" 2>/dev/null | tail -1) + if [ -z "$oldest" ]; then + cleanup 1 "out of space: need $srcblks KB, have $dstblks KB" + elif [ -d "$EXTFS/$oldest" ]; then info "Removing old backup $oldest from $EXTFS" rm -rf "$EXTFS/$oldest" else @@ -171,22 +196,14 @@ if [ -d "$EXTVEIDFS" ]; then else rm -rf "$EXTVEIDFS" fi -mkdir "$EXTVEIDFS" -date > "$EXTVEIDFS/begin" -if ! cd "$EXTVEIDFS"; then - cleanup 1 "cannot change into $EXTVEIDFS directory" -fi +mkdir "$EXTVEIDFS" || cleanup 1 "cannot mkdir $EXTVEIDFS/" +cd "$EXTVEIDFS" || cleanup 1 "cannot cd into $EXTVEIDFS/" +echo "$STARTDATE" > "$EXTVEIDFS/begin" +# Move temporary INFO file to its permanent home within $EXTVEIDFS +mv "$INFO" "$EXTVEIDFS/info" || cleanup 1 "cannot mv file to $EXTVEIDFS/" INFO="$EXTVEIDFS/info" -cat > "$INFO" <<+EOF+ -Date: $(date) -VEID: $VEID -Volume: $VEDEV -dd_rescue log: ddrlog -dd_rescue bad blocks: ddrbb -image file: image -+EOF+ info "copy $VEID device $VEDEV to $EXTVEIDFS/image" time dd_rescue -Aqy 8192 -l "$EXTVEIDFS/ddrlog" -o "$EXTVEIDFS/ddrbb" \ $VEDEV "$EXTVEIDFS/image"