]> Dogcows Code - chaz/tar/blobdiff - scripts/backup.in
Options to control option handling in file lists.
[chaz/tar] / scripts / backup.in
index aa9bca732d82d185b05d3d94b009723464f15cbb..087ab2c183398bd77b5e1e5cc93ef20b4a08b75e 100644 (file)
@@ -1,68 +1,47 @@
 #! /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
+# Make backups.
+
+# Copyright 2004-2006, 2013 Free Software Foundation
+
+# This file is part of GNU tar.
+
+# GNU tar 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,
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU tar 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.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # Load library routines
 SYSCONFDIR=${SYSCONFDIR-@sysconfdir@}
-. ${LIBPATH-@libexecdir@}/backup.sh
-
-now() {
-#IF_DATE_FORMAT_OK     
-       date +%Y-%m-%d
-#ELSE_DATE_FORMAT_OK
-        LC_ALL=C date | \
-       sed 's/[^ ]*  *\([^ ]*\)  *\([^ ]*\).* \([^ ]*\)$/\3-\1-\2/
-           /-[0-9]$/s/\([0-9]\)$/0\1/
-            /Jan/{s/Jan/01/p;q;}
-            /Feb/{s/Feb/02/p;q;}
-            /Mar/{s/Mar/03/p;q;}
-            /Apr/{s/Apr/04/p;q;}
-            /May/{s/May/05/p;q;}
-            /Jun/{s/Jun/06/p;q;}
-            /Jul/{s/Jul/07/p;q;}
-            /Aug/{s/Aug/08/p;q;}
-            /Sep/{s/Sep/09/p;q;}
-            /Oct/{s/Oct/10/p;q;}
-            /Nov/{s/Nov/11/p;q;}
-            /Dec/{s/Dec/12/p;q;}'
-#ENDIF_DATE_FORMAT_OK
-}
+. ${LIBDIR-@libexecdir@}/backup.sh
 
 DUMP_LEVEL=0
 TIME=
+NOW=`now`
 
 usage() {
        cat - <<EOF
 usage: $PROGNAME [OPTIONS] [WHEN]
 Options are:
 
-   -l, --level LEVEL       Do backup level LEVEL (default $DUMP_LEVEL).
+   -l, --level=LEVEL       Do backup level LEVEL (default $DUMP_LEVEL).
    -f, --force             Force backup even if today's log file already
                            exists.
-   -v, --verbose LEVEL     Set verbosity level.
-   -t, --time TIME         Wait till TIME, then do backup. 
+   -v, --verbose[=LEVEL]   Set verbosity level. Default 100.
+   -t, --time=TIME         Wait till TIME, then do backup.
 
-Informational options:   
+Informational options:
    -h, --help              Display this help message.
-   -l, --license           Display program license.
    -V, --version           Display program version.
 
-   Optional argumen WHEN is for backward compatibility only. It has been
+   Optional argument WHEN is for backward compatibility only. It has been
    superseded by --time option.
    TIME argument can be one of:
 
@@ -70,8 +49,7 @@ Informational options:
        HH           --     do backup at HH hours.
        HH:MM        --     do backup at HH:MM.
 
-
-   Send bug reports to @PACKAGE_BUGREPORT@.
+Send bug reports to @PACKAGE_BUGREPORT@.
 EOF
 }
 
@@ -81,46 +59,60 @@ case "$PROGNAME" in
 level-[0-9]) DUMP_LEVEL=`expr $PROGNAME : 'level-\([0-9][0-9]*\)'`;;
 esac
 
-while [ $# -ne 0 ];
+for opt
 do
-    case $1 in
-    -l|--l|--le|--lev|--leve|--level)
-       shift
-       DUMP_LEVEL=$1
-       ;;
-    -v|--verb|--verbo|--verbos|--verbose)
-       shift
-       VERBOSE=$1
-       ;;
-    -V|--v|--ve|--ver|--vers|--versi|--versio|--version)
-       echo "backup; @PACKAGE@ (@VERSION@)"
-       exit 0;;
-    -L|--li|--lic|--lice|--licen|--licens|--license)
-       license
-       exit;;
-    -t|--ti|--tim|--time)
-       shift
-       TIME=$1
-       ;;
-    -f|--f|--fo|--for|--forc|--force)
-       FORCE=yes
-       ;;
-    -h|--h|--he|--hel|--help)
-       usage
-       exit;;
-    *)  if [ "x$TIME" != "x" ]; then
-           bailout "Extra argument. Try $PROGNAME --help for more info."
-       else
-           TIME=$1
-       fi;;    
-    esac       
-    shift
-done    
+  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?*)  DUMP_LEVEL=`expr $option : '-l\(.*\)'`;;
+  -l|--l|--le|--lev|--leve|--level)
+        prev=--level
+        ;;
+  --verb=*|--verbo=*|--verbos=*|--verbose=*)
+         VERBOSE=$optarg
+        ;;
+  -v|--verb|--verbo|--verbos|--verbose)
+         VERBOSE=100
+        ;;
+  -v*)   VERBOSE=`expr $option : '-v\(.*\)'`;;
+  --t=*|--ti=*|--tim=*|--time=*)
+         TIME=$optarg
+        ;;
+  -t?*)  TIME=`expr $option : '-t\(.*\)'`;;
+  -t|--t|--ti|--tim|--time)
+        prev=--time
+        ;;
+  -V|--v|--ve|--ver|--vers|--versi|--versio|--version)
+        echo "backup (@PACKAGE_NAME@) @VERSION@"
+        license
+        exit;;
+  -h|--h|--he|--hel|--help)
+        usage
+        exit;;
+  -f|--f|--fo|--for|--forc|--force)
+        FORCE=yes
+        ;;
+  *)     if [ "x$TIME" != "x" ]; then
+            bailout "Extra argument. Try $PROGNAME --help for more info."
+         else
+            TIME=$option
+         fi;;
+  esac
+done
 
 if [ "x$TIME" = x ]; then
     bailout "No backup time specified. Try $PROGNAME --help for more info."
     exit 1
-fi    
+fi
 
 init_backup
 
@@ -130,7 +122,7 @@ wait_time $TIME
 if [ $DUMP_LEVEL -ne 0 ]; then
     PREV_LEVEL=`expr $DUMP_LEVEL - 1`
     PREV_DATE=`ls -t ${LOGPATH}/log-*-level-$PREV_LEVEL|
-                head -1|
+                head -1|
                sed "s,${LOGPATH}/log-\(.*\)-level.*,\1,"`
     if [ "x$PREV_DATE" = x ]; then
         bailout "Can't determine date of the previous backup"
@@ -144,10 +136,10 @@ fi
 
 if [ "x$FORCE" = "xyes" ]; then
     rm ${LOGFILE}
-fi    
+fi
 
 if [ -f "${LOGFILE}" ] ; then
-   bailout "Log file ${LOGFILE} already exists." 
+   bailout "Log file ${LOGFILE} already exists."
 else
    touch "${LOGFILE}"
 fi
@@ -158,7 +150,7 @@ message 20 "BACKUP_DIRS=$BACKUP_DIRS"
 message 20 "BACKUP_FILES=$BACKUP_FILES"
 
 # The buch of commands below is run in a subshell for which all output is
-# piped through `tee' to the logfile.  Doing this, instead of having
+# piped through 'tee' to the logfile.  Doing this, instead of having
 # multiple pipelines all over the place, is cleaner and allows access to
 # the exit value from various commands more easily.
 (
@@ -170,87 +162,93 @@ message 20 "BACKUP_FILES=$BACKUP_FILES"
 
  set - ${BACKUP_DIRS}
  while [ $# -ne 0 ] ; do
-    date="`date`"
-    fs="`echo \"${1}\" | sed -e 's/^.*://'`"
-    fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
-    remotehost="`expr \"${1}\" : '\([^/][^/]*\):.*'`"
-    if [ -z "$remotehost" ]; then
-       remotehost=$localhost
-    fi
-        
-    echo "Backing up ${1} at ${date}"
-    message 10 "fs=$fs"
-    message 10 "fsname=$fsname"
-    message 10 "remotehost=$remotehost"
-    if [ $DUMP_LEVEL -eq 0 ]; then
-       make_level_log ${remotehost}
-    else
-       LF=`level_log_name ${fsname} 0`
-       pdate=`remote_run "${remotehost}" ls -l $LF | awk '{
-           printf("%s", $6)
-           for (i=7;i<NF;i++)
-               printf(" %s", $i)
-           print "" }'`
-       echo "Last `prev_level` dump on this filesystem was on $pdate"
-       remote_run "${remotehost}" cp $LF "`level_log_name temp`"
-    fi
-       
-    backup_host ${remotehost} \
+     date="`date`"
+     fs="`echo \"${1}\" | sed -e 's/^.*://'`"
+     fs=`root_fs $fs`
+     fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
+     remotehost="`expr \"${1}\" : '\([^/][^/]*\):.*'`"
+     if [ -z "$remotehost" ]; then
+        remotehost=$localhost
+     fi
+
+     echo "Backing up ${1} at ${date}"
+     message 10 "fs=$fs"
+     message 10 "fsname=$fsname"
+     message 10 "remotehost=$remotehost"
+     if [ $DUMP_LEVEL -eq 0 ]; then
+        make_level_log ${remotehost}
+     else
+        echo "Last `prev_level` dump on this filesystem was on $PREV_DATE"
+        remote_run "${remotehost}" cp "`level_log_name ${fsname} $PREV_LEVEL`" "`level_log_name temp`"
+     fi
+
+     ${DUMP_BEGIN-:} $DUMP_LEVEL $remotehost $fs $fsname
+     backup_host ${remotehost} \
                 "--listed=`level_log_name temp`" \
-                "--label='`print_level` backup of ${fs} on ${remotehost} at ${date}'" \
+                "--label='`print_level` backup of ${fs} on ${remotehost} at ${NOW}'" \
                -C ${fs} .
 
-    # `rsh' doesn't exit with the exit status of the remote command.  What
-    # stupid lossage.  TODO: think of a reliable workaround.
-    if [ $? -ne 0 ] ; then
-       echo "Backup of ${1} failed." 1>&2
-       # I'm assuming that the tar will have written an empty
-       # file to the tape, otherwise I should do a cat here.
-    else
-       flush_level_log ${remotehost} ${fsname}
-    fi
-    ${MT_STATUS}
-    echo "sleeping ${SLEEP_TIME} seconds"
-    sleep ${SLEEP_TIME}
-    shift
+     # 'rsh' doesn't exit with the exit status of the remote command.  What
+     # stupid lossage.  TODO: think of a reliable workaround.
+     if [ $? -ne 0 ] ; then
+        echo "Backup of ${1} failed." 1>&2
+         # I'm assuming that the tar will have written an empty
+         # file to the tape, otherwise I should do a cat here.
+     else
+         flush_level_log ${remotehost} ${fsname}
+     fi
+     ${MT_STATUS} "$TAPE_FILE"
+     ${DUMP_END-:} $DUMP_LEVEL $remotehost $fs $fsname
+     echo "sleeping ${SLEEP_TIME} seconds"
+     sleep ${SLEEP_TIME}
+     shift
  done
 
  # Dump any individual files requested.
 
  if [ "x${BACKUP_FILES}" != "x" ] ; then
-    message 1 "processing individual files"
+     message 1 "processing individual files"
 
-    date="`date`"
+     date="`date`"
 
-    make_level_log $localhost
+     if [ $DUMP_LEVEL -eq 0 ]; then
+         make_level_log $localhost
+     else
+        echo "Last `prev_level` dump on this filesystem was on $PREV_DATE"
+        remote_run "${localhost}" cp "`level_log_name MISC $PREV_LEVEL`" "`level_log_name temp`"
+     fi
 
-    echo "Backing up miscellaneous files at ${date}"
-    
-    backup_host $localhost \
+     echo "Backing up miscellaneous files at ${date}"
+
+     ${DUMP_BEGIN-:} $DUMP_LEVEL $localhost MISC MISC
+     backup_host $localhost \
                "--listed=`level_log_name temp`"\
-               "--label='`print_level` backup of miscellaneous files at ${date}'" \
+               "--label='`print_level` backup of miscellaneous files at ${NOW}'" \
                ${BACKUP_FILES}
 
-    if [ $? -ne 0 ] ; then
-       echo "Backup of miscellaneous files failed."
-       # I'm assuming that the tar will have written an empty
-       # file to the tape, otherwise I should do a cat here.
-    else
-       flush_level_log $localhost
-    fi
-    ${MT_STATUS}
+     if [ $? -ne 0 ] ; then
+        echo "Backup of miscellaneous files failed."
+        # I'm assuming that the tar will have written an empty
+        # file to the tape, otherwise I should do a cat here.
+     else
+        flush_level_log $localhost MISC
+     fi
+     ${MT_STATUS} "$TAPE_FILE"
+     ${DUMP_END-:} $DUMP_LEVEL $localhost MISC MISC
  else
-    echo "No miscellaneous files specified"
+     echo "No miscellaneous files specified"
  fi
 
  message 1 "final cleanup"
 
- $MT_REWIND "${TAPE_FILE}" 
+ $MT_REWIND "${TAPE_FILE}"
  $MT_OFFLINE "${TAPE_FILE}"
-
+ echo "."
 ) 2>&1 | tee -a "${LOGFILE}"
 
-echo "Sending the dump log to ${ADMINISTRATOR}"
-mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}"
+if test "${ADMINISTRATOR}" != NONE; then
+     echo "Sending the dump log to ${ADMINISTRATOR}"
+     mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}"
+fi
 
-# eof
+# EOF
This page took 0.031349 seconds and 4 git commands to generate.