#! /bin/sh
# This file is part of BEAM
# Copyright (C) 2012 Sergey Poznyakoff
#
# BEAM is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# BEAM is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with BEAM. If not, see .
libdir=@LIBDIR@/beam
set -e
. $libdir/common.sh
set +e
if [ "$1" = "--wtf" ]; then
wtf $(basename $0) create a backup
exit 0
fi
load_config
taroptions="$backup_tar_options $backup_rsh_command"
# Options
root=/
verbose=
logfile=
dry_run=
listonly=
confirm=1
getyn() {
echo -n "$0:" $* " [Y/n]? "
read REPLY
case $REPLY in
''|y*|Y*) REPLY=y;;
*) REPLY=n;;
esac
}
help() {
cat <
EOT
exit 0
}
while [ $# -ne 0 ]
do
case $1 in
-C|--directory) shift; root=$1;;
-c|--confirm) confirm=0;;
-v|--verbose) verbose="$verbose -v";;
-t|--list) listonly=1;;
-l|--logfile) shift; logfile=$1; confirm=0;;
-n|--dry-run) dry_run=echo;;
-h|--help) help;;
-V|--version) print_version;;
-L|--level) shift; level=$1;;
-R|--round) shift; round=$1;;
-W|--week) shift; week=$1;;
--) shift; break;;
-*) echo >&2 "$0: unrecognized option $1"; exit 1;;
*) break;;
esac
shift
done
if [ -z "$listonly" ]; then
taroptions="$taroptions -x"
else
taroptions="$taroptions -t"
fi
# Collect items to be restored.
items=$*
test -z "$items" && items="$backup_items"
if [ -n "$logfile" ]; then
confirm=0
exec >>$logfile
exec 2>&1
fi
runhook prologue_hook
trap "runhook epilogue_hook" EXIT INT QUIT TERM
# Guess missing values
if [ -z "$week" ]; then
hour=$(date +%H)
if [ $hour -gt 6 ]; then
week=$(date +%U)
else
week=$(date -d yesterday +%U)
fi
fi
if [ -z "$round" ]; then
round=$(find $backup_archive_dir \
-regex '.*-'$week'-[0-9][0-9]*-[0-9][0-9]*\..*' \
-printf '%f\n' |
sed 's/.*-'$week'-\([0-9][0-9]*\)-[0-9][0-9]*\..*/\1/' |
sort +0 -1 |
tail -1)
test -z "$round" && abend 1 "cannot determine last round number"
fi
if [ -z "$level" ]; then
level=$(find $backup_archive_dir \
-regex '.*-'$week-$round'-[0-9][0-9]*\..*' \
-printf '%f\n' |
sed 's/.*-'$week-$round'-\([0-9][0-9]*\)\..*/\1/' |
sort +0 -1 |
tail -1)
test -z "$level" && abend 1 "cannot determine last level number"
fi
echo "$0: target root directory $root"
echo "$0: items to be restored: $items"
echo "$0: restoring from week $week, round $round, level $level"
if [ $confirm -ne 0 ]; then
getyn "Do you wish to proceed"
test $REPLY = "n" && exit 0
fi
logit "started"
for item in $items
do
eval type=\$${item}_type
${type}_restore $item
done
trap - EXIT INT QUIT TERM
runhook epilogue_hook
logit "finished"