summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2004-05-08 22:14:52 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2004-05-08 22:14:52 +0000
commitef87ce7d109360c812ad5fef6d79591d2a37ac2d (patch)
tree182fca379a171f3baa55370cfd49960f0ce4a995 /scripts
parent22fae29fb760d9ad758848748869882f9cb2f8a0 (diff)
downloadtar-ef87ce7d109360c812ad5fef6d79591d2a37ac2d.tar.gz
New file
Diffstat (limited to 'scripts')
-rw-r--r--scripts/restore.in224
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