This commit is contained in:
Sergey Poznyakoff
2004-05-06 09:14:29 +00:00
parent 640effdebd
commit 0273b1ae09
4 changed files with 0 additions and 552 deletions

View File

@@ -1,107 +0,0 @@
#!/bin/sh
# This file is included in the GNU tar distribution as an example. It is
# not used by default unless the proper line is uncommented in backup-specs.
# System administrators will probably want to customize this and
# backup-specs for their site.
#
# This script should be run by tar with --info-script (-F) to inform
# interested parties that a tape for the next volume of the backup needs to
# be put in the tape drive.
#
# Include location of `sendmail' and GNU finger.
PATH="/usr/lib:/usr/local/gnubin:${PATH}"
export PATH
# Get definition of TAPE_FILE, VOLNO_FILE, and so on.
. /home/gd2/dump/backup-specs
mt -f "${TAPE_FILE}" rewind
mt -f "${TAPE_FILE}" offl
volno="`cat \"${VOLNO_FILE}\" 2> /dev/null`"
if [ $? -ne 0 ]; then
volno=0
fi
# Get a list of people to whom to mail a request for changing the tape.
# This egregious nightmare parses the output from GNU finger which shows
# which users are logged into consoles (and thus in the office and capable
# of changing tapes).
#
# Certain users (like `root') aren't real users, and shouldn't be notified.
# Neither should `zippy', `elvis', etc. (on the GNU machines) since they're
# just test accounts.
recipients="`
finger .clients 2> /dev/null \
| sed -ne '
1{
/clientstatus: file has not changed in/{
n;n;n;n;d
}
n;n;d
}
s/^..................................................//
$!{/^$/d
/^root?*$/d
/^zippy$/d
/^fnord$/d
/^elvis$/d
/^snurd$/d
H
}
${g
: 1
s/\(\n\)\([A-Za-z0-9_][A-Za-z0-9_]*\)\(\n.*\)\2\(.*\)/\1\2\3\4/g
s/\n$//g
t 1
s/^\n//
s/\n$//g
s/\n/, /g
: 2
s/, ,/,/g
t 2
p
}'`"
# Customized behavior for FSF machines, to bring attention to the fact that
# the tape needs to be changed (who looks at the terminal?)
sendmail -oi -t << __EOF__
From: `basename $0` (backup tape-changing reminder)
To: ${recipients}
Cc: ${ADMINISTRATOR}
Subject: Backup needs new tape for volume ${volno}
Reply-To: ${ADMINISTRATOR}
This is an automated report from the backup script running on
`hostname`.
Volume ${volno} of the backup needs to be put in the tape drive. Usually
whoever prepared the backup leaves labeled tapes on top of the drive
itself. If there aren't any more, information about where to find tapes
and how to label them are posted on the wall by apple-gunkies (unhelpfully
obscured by a bookshelf). An online copy (which is probably more
up-to-date) can also be found in ~friedman/etc/fsf/backup.how.
__EOF__
echo "Please put volume ${volno} in tape drive and press RETURN"
read input
echo "Writing volume ${volno}..."
sendmail -oi -t << __EOF__
From: `basename $0` (backup tape-changing reminder)
To: ${recipients}
Cc: ${ADMINISTRATOR}
Subject: Volume ${volno} for backup has been added
Reply-To: ${ADMINISTRATOR}
This is an automated report from the backup script running on
`hostname`.
The backup has been continued, so for now no further attention is required.
__EOF__
exit 0
# eof

View File

@@ -1,200 +0,0 @@
#!/bin/sh
#
# Run this script as root on the machine that has the tape drive, to make a
# full (level-0) dump.
#
# If you give `now' as an argument, the dump is done immediately.
# Otherwise, it waits until 1am, or until the hour given as argument.
# Specify the hour as a number from 0 to 23.
#
# 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=0
# 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."
exit 1
fi
# Get the values of BACKUP_DIRS, BACKUP_FILES, and other variables.
. ./backup-specs
# Maybe sleep until around specified or default hour.
if [ "${1}" != "now" ]; then
if [ "${1}x" != "x" ]; then
spec="${1}"
else
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}\"`"
clear
echo "${SLEEP_MESSAGE}"
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-0''
# They go in the subdirectory `log' of the current directory.
# i.e. year-month-date. This format is useful for sorting by name, since
# logfiles are intentionally kept online for future reference.
LOGFILE="log/log-`date | sed -ne '
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;}'`-level-${DUMP_LEVEL}"
localhost="`hostname | sed -e 's/\..*//'`"
TAR_PART1="${TAR} -c --multi-volume --one-file-system --blocking=${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
# Make sure the log file did not already exist. Create it.
if [ -f "${LOGFILE}" ] ; then
echo "Log file ${LOGFILE} already exists." 1>&2
exit 1
else
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}"
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'`"
# This filename must be absolute; it is opened on the machine that runs tar.
TAR_PART2="--listed=/etc/tar-backup/temp.level-0"
TAR_PART3="--label='Full backup of ${fs} on ${remotehost} at ${date}' -C ${fs} ."
echo "Backing up ${1} at ${date}"
# Actually back things up.
if [ "z${localhost}" != "z${remotehost}" ] ; then
rsh "${remotehost}" mkdir /etc/tar-backup > /dev/null 2>&1
rsh "${remotehost}" rm -f /etc/tar-backup/temp.level-0
rsh "${remotehost}" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" ${TAR_PART2} ${TAR_PART3}
else
mkdir /etc/tar-backup > /dev/null 2>&1
rm -f /etc/tar-backup/temp.level-0
# 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." 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
if [ "z${localhost}" != "z${remotehost}" ] ; then
rsh "${remotehost}" mv -f /etc/tar-backup/temp.level-0 "/etc/tar-backup/${fsname}.level-0"
else
mv -f /etc/tar-backup/temp.level-0 "/etc/tar-backup/${fsname}.level-0"
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-0"
TAR_PART3="--label='Full backup of miscellaneous files at ${date}'"
mkdir /etc/tar-backup > /dev/null 2>&1
rm -f /etc/tar-backup/temp.level-0
echo "Backing up miscellaneous files at ${date}"
# 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}"
# `rsh' doesn't exit with the exit status of the remote command. What
# lossage. TODO: think of a reliable workaround.
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
mv -f /etc/tar-backup/temp.level-0 /etc/tar-backup/misc.level-0
fi
${TAPE_STATUS}
else
echo "No miscellaneous files specified"
fi
# Caveat: some versions of `mt' use `-t' instead of `-f'.
mt -f "${TAPE_FILE}" rewind
mt -f "${TAPE_FILE}" offl
) 2>&1 | tee -a "${LOGFILE}"
echo "Sending the dump log to ${ADMINISTRATOR}"
mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}"
# eof

View File

@@ -1,203 +0,0 @@
#!/bin/sh
#
# Run this script as root on the machine that has the tape drive, to make a
# level-1 dump containing all files changed since the last full dump.
#
# If you give `now' as an argument, the dump is done immediately.
# Otherwise, it waits until 1am.
#
# 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."
exit 1
fi
# Get the values of BACKUP_DIRS, 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}"
else
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}\"`"
clear
echo "${SLEEP_MESSAGE}"
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''
# They go in the subdirectory `log' of the current directory.
# i.e. year-month-date. This format is useful for sorting by name, since
# logfiles are intentionally kept online for future reference.
LOGFILE="log/log-`date | sed -ne '
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;}'`-level-${DUMP_LEVEL}"
localhost="`hostname | sed -e 's/\..*//'`"
TAR_PART1="${TAR} -c --multi-volume --one-file-system --blocking=${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
# Make sure the log file did not already exist. Create it.
if [ -f "${LOGFILE}" ] ; then
echo "Log file ${LOGFILE} already exists." 1>&2
exit 1
else
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}"
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'`"
# 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} ."
echo "Backing up ${1} at ${date}"
echo "Last full dump on this filesystem:"
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
# 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
# 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
# Caveat: some versions of `mt' use `-t' instead of `-f'.
mt -f "${TAPE_FILE}" rewind
mt -f "${TAPE_FILE}" offl
) 2>&1 | tee -a "${LOGFILE}"
echo "Sending the dump log to ${ADMINISTRATOR}"
mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}"
# eof

View File

@@ -1,42 +0,0 @@
#!/bin/sh
# start doing things
TOBACKUP="albert:/"
HOST=`hostname | sed 's/\..*//'`
TAPEFILE=/dev/rfd0a
LOGFILE=tar-out
BLOCKING=20
TAR_PART1="/usr/local/bin/tar clbfVM $BLOCKING"
rm -f $LOGFILE
mt -f $TAPEFILE rewind
host=`echo $TOBACKUP | sed 's/:.*$//'`;
fs=`echo $TOBACKUP | sed 's/^.*://'`;
date=`date`;
fsname=`echo $TOBACKUP | sed 's/\//:/g'`
TAR_PART2="'Weekly backup of $fs on $host at $date' -C $fs ."
echo Backing up $TOBACKUP at $date | tee -a $LOGFILE
# Actually back things up.
if [ $HOST != $host ] ; then
rsh $host $TAR_PART1 $HOST:$TAPEFILE $TAR_PART2
else
sh -c "exec $TAR_PART1 $TAPEFILE $TAR_PART2"
fi
if [ $? -ne 0 ] ; then
echo Backup of $TOBACKUP failed. | tee -a $LOGFILE
echo mts at time of failure | tee -a $LOGFILE
mts -t $TAPEFILE | 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
echo $date > $fsname.lasttar
fi
sleep 60;
mt -f $TAPEFILE rewind
mt -f $TAPEFILE offl