Initial revision

This commit is contained in:
François Pinard
1994-11-16 02:48:51 +00:00
parent b673b3f794
commit 8748e75cfb

View File

@@ -8,191 +8,139 @@
#
# You must edit the file `backup-specs' to set the parameters for your site.
# Useful for backup-specs, in case things have to be done slightly
# differently for different dump levels.
DUMP_LEVEL=1
# Insure `mail' is in PATH.
PATH="/usr/ucb:${PATH}"
export PATH
# This is not the most reliable test in the world. The following might be
# more predictable:
#
# whoami="`whoami`"
# euid="`sed -ne '/^'\"${whoami}\"':/{s/^[^:]*:[^:]*://;s/:.*//p;q;}' /etc/passwd`"
# if [ "${euid}" != 0 ]; then ...
#
if [ ! -w / ]; then
echo "The backup must be run as root or else some files will fail to be dumped."
echo The backup must be run as root,
echo or else some files will fail to be dumped.
exit 1
else
false
fi
# Get the values of BACKUP_DIRS, BACKUP_FILES, and other variables.
# Get the values of BACKUP_DIRS and BACKUP_FILES, and other variables.
. ./backup-specs
# Maybe sleep until around specified or default hour.
if [ "z${1}" != "znow" ]; then
if [ "${1}x" != "x" ]; then
spec="${1}"
#
if [ "$1" != "now" ]; then
if [ "$1"x != x ]; then
spec=$1
else
spec="${BACKUP_HOUR}"
spec=$BACKUP_HOUR
fi
pausetime="`date | awk '
{
hr = substr($4, 1, 2);
mn = substr($4, 4, 2);
if((hr + 0) < (spec + 0))
print 3600 * (spec - hr) - 60 * mn;
else
print 3600 * (spec + (24 - hr)) - 60 * mn;
}' spec=\"${spec}\"`"
pausetime=`date | awk '{hr=substr($4,1,2);\\
mn=substr($4,4,2);\\
if((hr+0)<spec)\\
print 3600*(spec-hr)-60*mn;\\
else\\
print 3600*(spec+(24-hr))-60*mn; }' spec=$spec`
clear
echo "${SLEEP_MESSAGE}"
sleep "${pausetime}"
cat ./dont_touch
sleep $pausetime
fi
# start doing things
# Put startdate in the subject line of mailed report, since if it happens
# to run longer than 24 hours (as may be the case if someone forgets to put
# in the next volume of the tape in adequate time), the backup date won't
# appear too misleading.
startdate="`date`"
here="`pwd`"
# Logfile name should be in the form ``log-1993-03-18-level-1''
# i.e. year-month-date. This format is useful for sorting by name, since
# logfiles are intentionally kept online for future reference.
LOGFILE=log-`date | awk '
BEGIN {
d["Jan"] = "01"; d["Feb"] = "02"; d["Mar"] = "03";
d["Apr"] = "04"; d["May"] = "05"; d["Jun"] = "06";
d["Jul"] = "07"; d["Aug"] = "08"; d["Sep"] = "09";
d["Oct"] = "10"; d["Nov"] = "11"; d["Dec"] = "12";
}
{
if ($3 < 10) $3 = "0" $3;
print $6 "-" d[$2] "-" $3;
}'`-level-${DUMP_LEVEL}
localhost="`hostname | sed -e 's/\..*//'`"
TAR_PART1="/usr/local/bin/tar -c --multi-volume --one-file-system --block=${BLOCKING} --sparse --volno-file=${VOLNO_FILE}"
# Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs
if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then
TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'"
fi
here=`pwd`
LOGFILE=log-`date | awk '{print $2 "-" $3 "-" $6}'`-level-1
HOST=`hostname | sed 's/\..*//'`
TAR_PART1="/usr/local/bin/tar -c --multi-volume --one-file-system --block=$BLOCKING --sparse --volno-file=$VOLNO_FILE"
#TAR_PART1="/usr/local/bin/tar -c --multi-volume --one-file-system --block=$BLOCKING "
# Make sure the log file did not already exist. Create it.
if [ -f "${LOGFILE}" ] ; then
echo "Log file ${LOGFILE} already exists." 1>&2
if [ -f $LOGFILE ] ; then
echo Log file $LOGFILE already exists.
exit 1
else
touch "${LOGFILE}"
touch $LOGFILE
fi
# Most everything below here is run in a subshell for which all output is
# 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.
(
# Caveat: Some version of `mt' require `-t', not `-f'.
mt -f "${TAPE_FILE}" rewind
rm -f "${VOLNO_FILE}"
mt -f $TAPE_FILE rewind
rm $VOLNO_FILE
set - "${BACKUP_DIRS}"
while [ $# -ne 0 ] ; do
date="`date`"
remotehost="`echo \"${1}\" | sed -e 's/:.*$//'`"
fs="`echo \"${1}\" | sed -e 's/^.*://'`"
fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
set $BACKUP_DIRS
while [ $# -ne 0 ] ; do
host=`echo $1 | sed 's/:.*$//'`
fs=`echo $1 | sed 's/^.*://'`
date=`date`
fsname=`echo $1 | sed 's/\//:/g'`
# This filename must be absolute; it is opened on the machine that runs tar.
TAR_PART2="--listed=/etc/tar-backup/temp.level-1"
TAR_PART3="--label='level 1 backup of ${fs} on ${remotehost} at ${date}' -C ${fs} ."
# This filename must be absolute; it is opened on the machine that runs tar.
TAR_PART2="--listed=/etc/tar-backup/temp.level-1"
TAR_PART3="--label='level 1 backup of $fs on $host at $date' -C $fs ."
echo "Backing up ${1} at ${date}"
echo "Last full dump on this filesystem:"
echo Backing up $1 at $date | tee -a $LOGFILE
echo Last full dump on this filesystem: | tee -a $LOGFILE
if [ "z${remotehost}" != "z${localhost}" ] ; then
rsh "${remotehost}" "ls -l /etc/tar-backup/${fsname}.level-0; \
cp /etc/tar-backup/${fsname}.level-0 /etc/tar-backup/temp.level-1"
else
ls -l "/etc/tar-backup/${fsname}.level-0"
cp "/etc/tar-backup/${fsname}.level-0" /etc/tar-backup/temp.level-1
fi
if [ $HOST != $host ] ; then
rsh $host "ls -l /etc/tar-backup/$fsname.level-0; \
cp /etc/tar-backup/$fsname.level-0 /etc/tar-backup/temp.level-1" \
2>&1 | tee -a $LOGFILE
else
ls -l /etc/tar-backup/$fsname.level-0 2>&1 | tee -a $LOGFILE
cp /etc/tar-backup/$fsname.level-0 /etc/tar-backup/temp.level-1 2>&1 | tee -a $LOGFILE
fi
# Actually back things up.
# Actually back things up.
if [ "z${remotehost}" != "z${localhost}" ] ; then
rsh "${remotehost}" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" ${TAR_PART2} ${TAR_PART3}
else
# Using `sh -c exec' causes nested quoting and shell substitution
# to be handled here in the same way rsh handles it.
sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3}"
fi
# `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."
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
if [ "z${localhost}" != "z${remotehost}" ] ; then
rsh "${remotehost}" mv -f /etc/tar-backup/temp.level-1 "/etc/tar-backup/${fsname}.level-1"
else
mv -f /etc/tar-backup/temp.level-1 "/etc/tar-backup/${fsname}.level-1"
fi
fi
${TAPE_STATUS}
sleep 60
shift
done
# Dump any individual files requested.
if [ "x${BACKUP_FILES}" != "x" ] ; then
date="`date`"
TAR_PART2="--listed=/etc/tar-backup/temp.level-1"
TAR_PART3="--label='Incremental backup of miscellaneous files at ${date}'"
echo "Backing up miscellaneous files at ${date}"
echo "Last full dump of these files:"
ls -l /etc/tar-backup/misc.level-0
rm -f /etc/tar-backup/temp.level-1
cp /etc/tar-backup/misc.level-0 /etc/tar-backup/temp.level-1
# Using `sh -c exec' causes nested quoting and shell substitution
# to be handled here in the same way rsh handles it.
sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3} ${BACKUP_FILES}"
if [ $? -ne 0 ] ; then
echo "Backup of miscellaneous files failed." 1>&2
if [ $HOST != $host ] ; then
rsh $host $TAR_PART1 -f $HOST:$TAPE_FILE $TAR_PART2 $TAR_PART3 2>&1 | tee -a $LOGFILE
else
# Using `sh -c exec' causes nested quoting and shell substitution
# to be handled here in the same way rsh handles it.
sh -c "exec $TAR_PART1 -f $TAPE_FILE $TAR_PART2 $TAR_PART3" 2>&1 | tee -a $LOGFILE
fi
if [ $? -ne 0 ] ; then
echo Backup of $1 failed. | tee -a $LOGFILE
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
mv -f /etc/tar-backup/temp.level-1 /etc/tar-backup/misc.level-1
fi
${TAPE_STATUS}
else
echo "No miscellaneous files specified"
fi
else
if [ $HOST != $host ] ; then
rsh $host mv -f /etc/tar-backup/temp.level-1 /etc/tar-backup/$fsname.level-1 2>&1 | tee -a $LOGFILE
else
mv -f /etc/tar-backup/temp.level-1 /etc/tar-backup/$fsname.level-1 2>&1 | tee -a $LOGFILE
fi
fi
$TAPE_STATUS | tee -a $LOGFILE
sleep 60
shift
done
# Caveat: some versions of `mt' use `-t' instead of `-f'.
mt -f "${TAPE_FILE}" rewind
mt -f "${TAPE_FILE}" offl
# Dump any individual files requested.
) 2>&1 | tee -a "${LOGFILE}"
if [ x != "x$BACKUP_FILES" ] ; then
date=`date`
TAR_PART2="--listed=/etc/tar-backup/temp.level-1"
TAR_PART3="--label='Incremental backup of miscellaneous files at $date'"
echo "Sending the dump log to ${ADMINISTRATOR}"
mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}"
echo Backing up miscellaneous files at $date | tee -a $LOGFILE
echo Last full dump of these files: | tee -a $LOGFILE
ls -l /etc/tar-backup/misc.level-0 2>&1 | tee -a $LOGFILE
# eof
rm -f /etc/tar-backup/temp.level-1 2>&1 | tee -a $LOGFILE
cp /etc/tar-backup/misc.level-0 /etc/tar-backup/temp.level-1 2>&1 | tee -a $LOGFILE
echo Backing up miscellaneous files at $date | tee -a $LOGFILE
# Using `sh -c exec' causes nested quoting and shell substitution
# to be handled here in the same way rsh handles it.
sh -c "exec $TAR_PART1 -f $TAPE_FILE $TAR_PART2 $TAR_PART3 \
$BACKUP_FILES" 2>&1 | tee -a $LOGFILE
if [ $? -ne 0 ] ; then
echo Backup of miscellaneous files failed. | tee -a $LOGFILE
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
mv -f /etc/tar-backup/temp.level-1 /etc/tar-backup/misc.level-1 2>&1 | tee -a $LOGFILE
fi
$TAPE_STATUS | tee -a $LOGFILE
else
echo No miscellaneous files specified | tee -a $LOGFILE
false
fi
mt -f $TAPE_FILE rewind
mt -f $TAPE_FILE offl
echo Sending the dump log to $ADMINISTRATOR
cat $LOGFILE | sed -f logfile.sed > $LOGFILE.tmp
/usr/ucb/mail -s "Results of backup on `date`" $ADMINISTRATOR < $LOGFILE.tmp