#! /bin/sh # This file is part of BEAM # Copyright (C) 2012-2014 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=$(beam_exec find $backup_local_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=$(beam_exec find $backup_local_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"