diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2004-05-08 22:14:52 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2004-05-08 22:14:52 +0000 |
commit | ef87ce7d109360c812ad5fef6d79591d2a37ac2d (patch) | |
tree | 182fca379a171f3baa55370cfd49960f0ce4a995 /scripts | |
parent | 22fae29fb760d9ad758848748869882f9cb2f8a0 (diff) | |
download | tar-ef87ce7d109360c812ad5fef6d79591d2a37ac2d.tar.gz |
New file
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/restore.in | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/scripts/restore.in b/scripts/restore.in new file mode 100644 index 00000000..35c7f136 --- /dev/null +++ b/scripts/restore.in @@ -0,0 +1,224 @@ +#! /bin/sh +# This program is part of GNU tar +# Copyright 2004, Free Software Foundation +# +# This program 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 1, or (at your option) +# any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# Load library routines +SYSCONFDIR=${SYSCONFDIR-@sysconfdir@} +. ${LIBPATH-@libexecdir@}/backup.sh + +usage() { + cat - <<EOF +usage: $PROGNAME [OPTIONS] [PATTERN [PATTERN...]] +Options are: + + -l, --level=LEVEL Start restoring from backup level LEVEL (default $DUMP_LEVEL). + -v, --verbose[=LEVEL] Set verbosity level. Default 100. + +Informational options: + -h, --help Display this help message. + -L, --license Display program license. + -V, --version Display program version. + +Send bug reports to @PACKAGE_BUGREPORT@. +EOF +} + +unset PATTERN +DUMP_LEVEL=0 +CMDLINE="$0 $@" + +for opt +do + if [ -z "$prev" ]; then + option=$opt + optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` + else + option="${prev}=$opt" + prev="" + optarg=$opt + fi + case $option in + --l=*|--le=*|--lev=*|--leve=*|--level=*) + DUMP_LEVEL=$optarg + ;; + -l|--l|--le|--lev|--leve|--level) + prev=$option + ;; + --verb=*|--verbo=*|--verbos=*|--verbose=*) + VERBOSE=$optarg + ;; + -v|--verb|--verbo|--verbos|--verbose) + VERBOSE=100 + ;; + -v*) VERBOSE=`expr $option : "-v\(.*\)"`;; + -V|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "restore; @PACKAGE@ (@VERSION@)" + exit 0;; + -L|--li|--lic|--lice|--licen|--licens|--license) + license + exit;; + -h|--h|--he|--hel|--help) + usage + exit;; + -*) bailout "Unknown option $opt. Try $PROGNAME --help for more info.";; + *) if [ -z "$PATTERN" ]; then + PATTERN=$opt + else + PATTERN="$PATTERN|$opt" + fi + ;; + esac +done + +init_restore +cat > $LOGFILE <<EOF +This file contains any messages produced by $PROGNAME. + +It was created by GNU $PROGNAME, from @PACKAGE@ (@VERSION@). +Invocation command line was + + \$ $CMDLINE + +EOF + +restore_fs() +{ + fs="`echo \"${1}\" | sed -e 's/^.*://'`" + fsname="`echo \"${1}\" | sed -e 's/\//:/g'`" + remotehost="`expr \"${1}\" : '\([^/][^/]*\):.*'`" + if [ -z "$remotehost" ]; then + remotehost=$localhost + fi + message 10 "fs=$fs" + message 10 "fsname=$fsname" + message 10 "remotehost=$remotehost" + + LOGPAT="`level_log_name ${fsname} '[0-9]'`" + PREFIX="`level_log_name ${fsname} ''`" + message 10 LOGPAT=$LOGPAT + message 10 PREFIX=$PREFIX + LEVELS=`remote_run "${remotehost}" ls $LOGPAT | + sed "s,$PREFIX,," | sort -n` + message 10 "LEVELS=$LEVELS" + + echo "Starting restore of ${1} at level $DUMP_LEVEL." + for level in $LEVELS + do + if [ $level -lt $DUMP_LEVEL ]; then + message 10 "Skipping level $level" + continue; + fi + message 10 "Restoring level $level" + + DATE=`get_dump_time $level` + FILE="`level_log_name ${fsname} ${level}`" + message 10 "FILE=$FILE" + + LABEL="`print_level $level` backup of ${fs} on ${remotehost} at ${DATE}" + ${RESTORE_BEGIN-:} $level $remotehost $fs $fsname + backup_host ${remotehost} \ + "--listed=`level_log_name $fs $level`" \ + "--label=\"$LABEL\"" \ + -C ${ROOT_FS-/}$fs + ${RESTORE_END-:} $level $remotehost $fs $fsname + done +} + +restore_files() +{ + LOGPAT="`level_log_name MISC '[0-9]'`" + PREFIX="`level_log_name MISC ''`" + message 10 LOGPAT=$LOGPAT + message 10 PREFIX=$PREFIX + LEVELS=`remote_run "${localhost}" ls $LOGPAT | sed "s,$PREFIX,," | sort -n` + message 10 "LEVELS=$LEVELS" + + echo "Starting restore of miscellaneous files at level $DUMP_LEVEL." + for level in $LEVELS + do + if [ $level -lt $DUMP_LEVEL ]; then + message 10 "Skipping level $level" + continue; + fi + message 10 "Restoring level $level" + + DATE=`get_dump_time $level` + FILE="`level_log_name MISC ${level}`" + message 10 "FILE=$FILE" + + LABEL="`print_level $level` backup of miscellaneous files at ${DATE}" + ${RESTORE_BEGIN-:} $level $localhost MISC MISC + backup_host ${localhost} \ + "--listed=`level_log_name MISC $level`" \ + "--label=\"$LABEL\"" \ + -C ${ROOT_FS-/} $@ + ${RESTORE_END-:} $level $localhost MISC MISC + done +} + +# Operation Overwiew: +# +# 1. Determine the time of the last backup +# 2. Create list of incremental listings to process +# 3. For each filesystem: +# 3.1. Start at the requested dump level (default 0) and proceed up to +# the last available level: +# 3.1.1 Deduce the volume label +# 3.1.2. Invoke [rsh] tar --listed=FILE --label=LABEL [opts] -xf $TAPE_FILE +# 4. End + +(message 1 "Preparing for restore" + +message 1 "processing backup directories" + +for dir in ${BACKUP_DIRS} +do + message 1 "Processing $dir" + case $dir in + ${PATTERN-*}) restore_fs $dir;; + esac +done + +if [ "x${BACKUP_FILES}" != "x" ] ; then + message 1 "processing miscellaneous files" + if [ -z "$PATTERN" ]; then + restore_files + else + RESTORE_FILES="" + for file in ${BACKUP_FILES} + do + rel_file=`expr $file : '/\(.*\)'` + case $file in + $PATTERN) if [ -z "$RESTORE_FILES" ]; then + RESTORE_FILES="$rel_file" + else + RESTORE_FILES="$RESTORE_FILES $rel_file" + fi;; + esac + done + [ -z "$RESTORE_FILES" ] || restore_files $RESTORE_FILES + fi + +fi) 2>&1 | tee -a "${LOGFILE}" + +# EOF + + + + +
\ No newline at end of file |