4
0

restore.in 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #! /bin/sh
  2. # This program is part of GNU tar
  3. # Copyright 2004, Free Software Foundation
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 1, or (at your option)
  8. # any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  18. # 02111-1307, USA.
  19. # Load library routines
  20. SYSCONFDIR=${SYSCONFDIR-@sysconfdir@}
  21. . ${LIBPATH-@libexecdir@}/backup.sh
  22. usage() {
  23. cat - <<EOF
  24. usage: $PROGNAME [OPTIONS] [PATTERN [PATTERN...]]
  25. Options are:
  26. -l, --level=LEVEL Start restoring from backup level LEVEL (default $DUMP_LEVEL).
  27. -v, --verbose[=LEVEL] Set verbosity level. Default 100.
  28. Informational options:
  29. -h, --help Display this help message.
  30. -L, --license Display program license.
  31. -V, --version Display program version.
  32. Send bug reports to @PACKAGE_BUGREPORT@.
  33. EOF
  34. }
  35. unset PATTERN
  36. DUMP_LEVEL=0
  37. CMDLINE="$0 $@"
  38. for opt
  39. do
  40. if [ -z "$prev" ]; then
  41. option=$opt
  42. optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
  43. else
  44. option="${prev}=$opt"
  45. prev=""
  46. optarg=$opt
  47. fi
  48. case $option in
  49. --l=*|--le=*|--lev=*|--leve=*|--level=*)
  50. DUMP_LEVEL=$optarg
  51. ;;
  52. -l|--l|--le|--lev|--leve|--level)
  53. prev=$option
  54. ;;
  55. --verb=*|--verbo=*|--verbos=*|--verbose=*)
  56. VERBOSE=$optarg
  57. ;;
  58. -v|--verb|--verbo|--verbos|--verbose)
  59. VERBOSE=100
  60. ;;
  61. -v*) VERBOSE=`expr $option : "-v\(.*\)"`;;
  62. -V|--v|--ve|--ver|--vers|--versi|--versio|--version)
  63. echo "restore (@PACKAGE@ @VERSION@)"
  64. exit 0;;
  65. -L|--li|--lic|--lice|--licen|--licens|--license)
  66. license
  67. exit;;
  68. -h|--h|--he|--hel|--help)
  69. usage
  70. exit;;
  71. -*) bailout "Unknown option $opt. Try $PROGNAME --help for more info.";;
  72. *) if [ -z "$PATTERN" ]; then
  73. PATTERN=$opt
  74. else
  75. PATTERN="$PATTERN|$opt"
  76. fi
  77. ;;
  78. esac
  79. done
  80. init_restore
  81. cat > $LOGFILE <<EOF
  82. This file contains any messages produced by $PROGNAME.
  83. It was created by GNU $PROGNAME, from @PACKAGE@ (@VERSION@).
  84. Invocation command line was
  85. \$ $CMDLINE
  86. EOF
  87. restore_fs()
  88. {
  89. fs="`echo \"${1}\" | sed -e 's/^.*://'`"
  90. fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
  91. remotehost="`expr \"${1}\" : '\([^/][^/]*\):.*'`"
  92. if [ -z "$remotehost" ]; then
  93. remotehost=$localhost
  94. fi
  95. message 10 "fs=$fs"
  96. message 10 "fsname=$fsname"
  97. message 10 "remotehost=$remotehost"
  98. LOGPAT="`level_log_name ${fsname} '[0-9]'`"
  99. PREFIX="`level_log_name ${fsname} ''`"
  100. message 10 LOGPAT=$LOGPAT
  101. message 10 PREFIX=$PREFIX
  102. LEVELS=`remote_run "${remotehost}" ls $LOGPAT |
  103. sed "s,$PREFIX,," | sort -n`
  104. message 10 "LEVELS=$LEVELS"
  105. echo "Starting restore of ${1} at level $DUMP_LEVEL."
  106. for level in $LEVELS
  107. do
  108. if [ $level -lt $DUMP_LEVEL ]; then
  109. message 10 "Skipping level $level"
  110. continue;
  111. fi
  112. message 10 "Restoring level $level"
  113. DATE=`get_dump_time $level`
  114. FILE="`level_log_name ${fsname} ${level}`"
  115. message 10 "FILE=$FILE"
  116. LABEL="`print_level $level` backup of ${fs} on ${remotehost} at ${DATE}"
  117. ${RESTORE_BEGIN-:} $level $remotehost $fs $fsname
  118. backup_host ${remotehost} \
  119. "--listed=`level_log_name $fs $level`" \
  120. "--label=\"$LABEL\"" \
  121. -C ${ROOT_FS-/}$fs
  122. ${RESTORE_END-:} $level $remotehost $fs $fsname
  123. done
  124. }
  125. restore_files()
  126. {
  127. LOGPAT="`level_log_name MISC '[0-9]'`"
  128. PREFIX="`level_log_name MISC ''`"
  129. message 10 LOGPAT=$LOGPAT
  130. message 10 PREFIX=$PREFIX
  131. LEVELS=`remote_run "${localhost}" ls $LOGPAT | sed "s,$PREFIX,," | sort -n`
  132. message 10 "LEVELS=$LEVELS"
  133. echo "Starting restore of miscellaneous files at level $DUMP_LEVEL."
  134. for level in $LEVELS
  135. do
  136. if [ $level -lt $DUMP_LEVEL ]; then
  137. message 10 "Skipping level $level"
  138. continue;
  139. fi
  140. message 10 "Restoring level $level"
  141. DATE=`get_dump_time $level`
  142. FILE="`level_log_name MISC ${level}`"
  143. message 10 "FILE=$FILE"
  144. LABEL="`print_level $level` backup of miscellaneous files at ${DATE}"
  145. ${RESTORE_BEGIN-:} $level $localhost MISC MISC
  146. backup_host ${localhost} \
  147. "--listed=`level_log_name MISC $level`" \
  148. "--label=\"$LABEL\"" \
  149. -C ${ROOT_FS-/} $@
  150. ${RESTORE_END-:} $level $localhost MISC MISC
  151. done
  152. }
  153. # Operation Overwiew:
  154. #
  155. # 1. Determine the time of the last backup
  156. # 2. Create list of incremental listings to process
  157. # 3. For each filesystem:
  158. # 3.1. Start at the requested dump level (default 0) and proceed up to
  159. # the last available level:
  160. # 3.1.1 Deduce the volume label
  161. # 3.1.2. Invoke [rsh] tar --listed=FILE --label=LABEL [opts] -xf $TAPE_FILE
  162. # 4. End
  163. (message 1 "Preparing for restore"
  164. message 1 "processing backup directories"
  165. for dir in ${BACKUP_DIRS}
  166. do
  167. message 1 "Processing $dir"
  168. case $dir in
  169. ${PATTERN-*}) restore_fs $dir;;
  170. esac
  171. done
  172. if [ "x${BACKUP_FILES}" != "x" ] ; then
  173. message 1 "processing miscellaneous files"
  174. if [ -z "$PATTERN" ]; then
  175. restore_files
  176. else
  177. RESTORE_FILES=""
  178. for file in ${BACKUP_FILES}
  179. do
  180. rel_file=`expr $file : '/\(.*\)'`
  181. case $file in
  182. $PATTERN) if [ -z "$RESTORE_FILES" ]; then
  183. RESTORE_FILES="$rel_file"
  184. else
  185. RESTORE_FILES="$RESTORE_FILES $rel_file"
  186. fi;;
  187. esac
  188. done
  189. [ -z "$RESTORE_FILES" ] || restore_files $RESTORE_FILES
  190. fi
  191. fi) 2>&1 | tee -a "${LOGFILE}"
  192. # EOF