1#!/bin/sh 2# 3# Run this script as root on the machine that has the tape drive, to make a 4# full (level-0) dump. 5# 6# If you give `now' as an argument, the dump is done immediately. 7# Otherwise, it waits until 1am, or until the hour given as argument. 8# Specify the hour as a number from 0 to 23. 9# 10# You must edit the file `backup-specs' to set the parameters for your site. 11 12# Useful for backup-specs, in case things have to be done slightly 13# differently for different dump levels. 14DUMP_LEVEL=0 15 16# Insure `mail' is in PATH. 17PATH="/usr/ucb:${PATH}" 18export PATH 19 20# This is not the most reliable test in the world. The following might be 21# more predictable: 22# 23# whoami="`whoami`" 24# euid="`sed -ne '/^'\"${whoami}\"':/{s/^[^:]*:[^:]*://;s/:.*//p;q;}' /etc/passwd`" 25# if [ "${euid}" != 0 ]; then ... 26# 27if [ ! -w / ]; then 28 echo "The backup must be run as root or else some files will fail to be dumped." 29 exit 1 30fi 31 32# Get the values of BACKUP_DIRS, BACKUP_FILES, and other variables. 33. ./backup-specs 34 35# Maybe sleep until around specified or default hour. 36if [ "${1}" != "now" ]; then 37 if [ "${1}x" != "x" ]; then 38 spec="${1}" 39 else 40 spec="${BACKUP_HOUR}" 41 fi 42 43 pausetime="`date | awk ' 44 { 45 hr = substr($4, 1, 2); 46 mn = substr($4, 4, 2); 47 if((hr + 0) < (spec + 0)) 48 print 3600 * (spec - hr) - 60 * mn; 49 else 50 print 3600 * (spec + (24 - hr)) - 60 * mn; 51 }' spec=\"${spec}\"`" 52 53 clear 54 echo "${SLEEP_MESSAGE}" 55 sleep "${pausetime}" 56fi 57 58# start doing things 59 60# Put startdate in the subject line of mailed report, since if it happens 61# to run longer than 24 hours (as may be the case if someone forgets to put 62# in the next volume of the tape in adequate time), the backup date won't 63# appear too misleading. 64startdate="`date`" 65 66here="`pwd`" 67 68# Logfile name should be in the form ``log-1993-03-18-level-0'' 69# i.e. year-month-date. This format is useful for sorting by name, since 70# logfiles are intentionally kept online for future reference. 71LOGFILE="log-`date | sed -ne ' 72 s/[^ ]* *\([^ ]*\) *\([^ ]*\).* \([^ ]*\)$/\3-\1-\2/ 73 /-[0-9]$/s/\([0-9]\)$/0\1/ 74 /Jan/{s/Jan/01/p;q;} 75 /Feb/{s/Feb/02/p;q;} 76 /Mar/{s/Mar/03/p;q;} 77 /Apr/{s/Apr/04/p;q;} 78 /May/{s/May/05/p;q;} 79 /Jun/{s/Jun/06/p;q;} 80 /Jul/{s/Jul/07/p;q;} 81 /Aug/{s/Aug/08/p;q;} 82 /Sep/{s/Sep/09/p;q;} 83 /Oct/{s/Oct/10/p;q;} 84 /Nov/{s/Nov/11/p;q;} 85 /Dec/{s/Dec/12/p;q;}'`-level-${DUMP_LEVEL}" 86 87localhost="`hostname | sed -e 's/\..*//'`" 88 89TAR_PART1="${TAR} -c --multi-volume --one-file-system --block-size=${BLOCKING} --sparse --volno-file=${VOLNO_FILE}" 90 91# Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs 92if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then 93 TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'" 94fi 95 96# Make sure the log file did not already exist. Create it. 97 98if [ -f "${LOGFILE}" ] ; then 99 echo "Log file ${LOGFILE} already exists." 1>&2 100 exit 1 101else 102 touch "${LOGFILE}" 103fi 104 105# Most everything below here is run in a subshell for which all output is 106# piped through `tee' to the logfile. Doing this, instead of having 107# multiple pipelines all over the place, is cleaner and allows access to 108# the exit value from various commands more easily. 109( 110 # Caveat: Some version of `mt' require `-t', not `-f'. 111 mt -f "${TAPE_FILE}" rewind 112 rm -f "${VOLNO_FILE}" 113 114 set - ${BACKUP_DIRS} 115 while [ $# -ne 0 ] ; do 116 date="`date`" 117 remotehost="`echo \"${1}\" | sed -e 's/:.*$//'`" 118 fs="`echo \"${1}\" | sed -e 's/^.*://'`" 119 fsname="`echo \"${1}\" | sed -e 's/\//:/g'`" 120 121 # This filename must be absolute; it is opened on the machine that runs tar. 122 TAR_PART2="--listed=/etc/tar-backup/temp.level-0" 123 TAR_PART3="--label='Full backup of ${fs} on ${remotehost} at ${date}' -C ${fs} ." 124 125 echo "Backing up ${1} at ${date}" 126 127 # Actually back things up. 128 129 if [ "z${localhost}" != "z${remotehost}" ] ; then 130 rsh "${remotehost}" mkdir /etc/tar-backup > /dev/null 2>&1 131 rsh "${remotehost}" rm -f /etc/tar-backup/temp.level-0 132 rsh "${remotehost}" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" ${TAR_PART2} ${TAR_PART3} 133 else 134 mkdir /etc/tar-backup > /dev/null 2>&1 135 rm -f /etc/tar-backup/temp.level-0 136 # Using `sh -c exec' causes nested quoting and shell substitution 137 # to be handled here in the same way rsh handles it. 138 sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3}" 139 fi 140 141 # `rsh' doesn't exit with the exit status of the remote command. What 142 # stupid lossage. TODO: think of a reliable workaround. 143 if [ $? -ne 0 ] ; then 144 echo "Backup of ${1} failed." 1>&2 145 # I'm assuming that the tar will have written an empty 146 # file to the tape, otherwise I should do a cat here. 147 else 148 if [ "z${localhost}" != "z${remotehost}" ] ; then 149 rsh "${remotehost}" mv -f /etc/tar-backup/temp.level-0 "/etc/tar-backup/${fsname}.level-0" 150 else 151 mv -f /etc/tar-backup/temp.level-0 "/etc/tar-backup/${fsname}.level-0" 152 fi 153 fi 154 ${TAPE_STATUS} 155 sleep 60 156 shift 157 done 158 159 # Dump any individual files requested. 160 161 if [ "x${BACKUP_FILES}" != "x" ] ; then 162 date="`date`" 163 164 TAR_PART2="--listed=/etc/tar-backup/temp.level-0" 165 TAR_PART3="--label='Full backup of miscellaneous files at ${date}'" 166 167 mkdir /etc/tar-backup > /dev/null 2>&1 168 rm -f /etc/tar-backup/temp.level-0 169 170 echo "Backing up miscellaneous files at ${date}" 171 172 # Using `sh -c exec' causes nested quoting and shell substitution 173 # to be handled here in the same way rsh handles it. 174 sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3} ${BACKUP_FILES}" 175 176 # `rsh' doesn't exit with the exit status of the remote command. What 177 # lossage. TODO: think of a reliable workaround. 178 if [ $? -ne 0 ] ; then 179 echo "Backup of miscellaneous files failed." 180 # I'm assuming that the tar will have written an empty 181 # file to the tape, otherwise I should do a cat here. 182 else 183 mv -f /etc/tar-backup/temp.level-0 /etc/tar-backup/misc.level-0 184 fi 185 ${TAPE_STATUS} 186 else 187 echo "No miscellaneous files specified" 188 fi 189 190 # Caveat: some versions of `mt' use `-t' instead of `-f'. 191 mt -f "${TAPE_FILE}" rewind 192 mt -f "${TAPE_FILE}" offl 193 194) 2>&1 | tee -a "${LOGFILE}" 195 196echo "Sending the dump log to ${ADMINISTRATOR}" 197mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}" 198 199# eof 200