1
0
Files
irix-657m-src/eoe/cmd/sadmin/Backup
2022-09-29 17:59:04 +03:00

297 lines
6.3 KiB
Bash

#!/sbin/sh
####
usage()
{
echo "Usage $0 [-h hostname] [-t tapedevice] [-i] directory_name/file_name"
exit 1
}
####
notabspath()
{
echo "you need to specify the absolute pathname for $FILE"
exit 1
}
####
nonrootincr()
{
echo "you can only do incremental backup from root ( / )"
exit 1
}
# matches what the GUI tool uses
make_label() {
( exec 2>/dev/null; \
echo label: "$1"; \
date;echo user: \\c;id -nu; echo group: \\c; id -ng; uname -a;\
ident /sbin/cpio|sed -n -e 's/.*Header: *//' -e 2p;\
echo options: "$2"
) > $LABEL_FILE
}
BDIR=""
TP="/dev/tape"
HN="LOCAL"
FILE=""
INCR="FALSE"
INCR_FILE=/etc/lastbackup # file we use to mark incremental backups
# was the date therein, now it's the modtime of that file.
LABEL_FILE=/tmp/.info_$$ # name should match system recovery and GUI tool
OPTS="$@" # original option string
####
if [ $# -eq 0 ]
then
usage
fi
####
while [ $1 = "-h" -o $1 = "-t" -o $1 = "-i" ]
do
if [ $1 = "-i" ]
then
INCR="TRUE"
shift
if [ $# -lt 1 ]
then
usage
fi
fi
if [ $1 = "-h" ]
then
shift
if [ $# -lt 1 ]
then
usage
fi
HN=$1
shift
if [ $# -lt 1 ]
then
usage
fi
fi
if [ $1 = "-t" ]
then
shift
if [ $# -lt 1 ]
then
usage
fi
TP=$1
shift
if [ $# -lt 1 ]
then
usage
fi
fi
done
####
BDIR="$@"
while [ $# -gt 0 ]
do
FILE=$1
shift
case "$FILE" in
/*)
continue ;;
*) notabspath ;
break ;;
esac
done
####
if [ "$BDIR" != "/" -a "$INCR" = "TRUE" ]
then
nonrootincr
fi
if [ $HN = "LOCAL" ]
then
ret=`mt -t $TP status 2>&1`
else
ret=`(/usr/etc/ping -s 1 -c 1 $HN 2>&1)`
case "$ret" {
*100%?packet?loss*) echo "Error: Unable to communicate with host:" "$HN" ;
exit 1;;
}
# do not use remote mt for historical reasons.
ret=`(rsh $HN -n -l guest mt -t $TP status 2>&1)`
fi
case "$ret" {
*Login?incorrect*) echo "Error: guest login incorrect on:" "$HN" ;
exit 1 ;;
*No?such?file*) echo "Error: Tape device $TP not configured." ;
exit 1 ;;
*Not?READY*) echo "Error: There is no tape in the drive." ;
exit 1 ;;
*write?protected*) echo "Error: The tape is write protected." ;
exit 1 ;;
*Unknown?host*) echo "Error: Host $HN is unknown." ;
exit 1 ;;
*can*get?status*) echo "Error: Cannot stat $TP." ;
exit 1 ;;
*I/O?error*) echo "Error: Unable to I/O on $TP." ;
exit 1 ;;
}
####
# set here even for incrementals, so rm in trap doesn't get an error
tabfiles=tmp/mtab # tabfiles need to be relative for restore script
# and so cpio sorts them to front of tape from cmdline args
sleep 2
echo ""
echo "Backup started. Please wait..."
trap 'cd /; rm -rf $tabfiles $LABEL_FILE; trap 0; exit 0' 0
trap 'cd /; echo Backup interrupted; rm -rf $tabfiles $LABEL_FILE; trap 0; exit 1' 1 2
if [ $HN = "LOCAL" ]
then
TPDEV="$TP"
else
TPDEV="guest@$HN:$TP"
fi
INCR_DATE="`stat -m $INCR_FILE 2>/dev/null | \
sed -e 's/.*[ ]modify time - //' -e 's/[ ]*<.*//' `"
if [ -z "$INCR_DATE" ]; then
if [ "$INCR" = "TRUE" ]; then
echo No incremental file $INCR_FILE, doing full backup
INCR=FALSE
fi
fi
if [ "$BDIR" = "/" ]
then
cd /
if [ "$INCR" = "TRUE" ]
then
cat /dev/null > /tmp/mtab
while read dev dir typ rest
do
if [ "$typ" = "efs" -o "$typ" = xfs ]
then
echo "$dev $dir $typ" >> /tmp/mtab
fi
done < /etc/mtab
make_label "Incremental Backup of files modified since $INCR_DATE from $BDIR" \
"/sbin/cpio -KWovO $TPDEV"
(echo $LABEL_FILE; for i in $tabfiles; do echo $i; done; \
find . -local -depth -newer "$INCR_FILE" ! -type s -print) | \
/sbin/cpio -KWovO $TPDEV
exitstat=$?
else
make_label "Full system backup from /" "/sbin/cpio -KWovO $TPDEV"
# ignore the volhdr lv and xlv files, and the files that are no longer
# in /stand, and that we handle specially below
dvhtool -v list | grep '[0123456789]' | sed \
-e /lvtab/d -e /xlvlab/d -e /sash/d -e /ide/d -e /symmon/d \
-e /sgilabel/d -e 's/^[ ]*//' -e 's/[ ].*//' > /tmp/volhdrlist
tabfiles="$tabfiles tmp/volhdrlist"
cat /dev/null > /tmp/mtab
while read dev dir typ rest
do
if [ "$typ" = "efs" -o "$typ" = xfs ]
then
echo "$dev $dir $typ" >> /tmp/mtab
fi
done < /etc/mtab
if [ -s /etc/lvtab ]
then cp /etc/lvtab /tmp
tabfiles="$tabfiles tmp/lvtab"
fi
# check if xlv volumes exist, if so store info
if [ -d /dev/dsk/xlv ]
then
set `ls /dev/dsk/xlv | wc`
if [ $1 -ne 0 ]
then
# xlv vols exist - store config and the list
/bin/ls /dev/dsk/xlv > /tmp/xlv_vollist
echo "script all\nquit\n" | xlv_mgr > /tmp/xlv_config_script
tabfiles="$tabfiles tmp/xlv_vollist tmp/xlv_config_script"
fi
fi
# check if quotas are on, if so store quota info
if [ -a /etc/init.d/quotas ]
then
repquota -s -a > /dev/null 2> /dev/null
if [ $? ]
then
repquota -s -a 2>&1 | \
grep -q 'user quota accounting.*off'
if [ $? -ne 0 ]
then
repquota -e /tmp/quotatab -a
tabfiles="$tabfiles tmp/quotatab"
fi
fi
fi
mkdir /var/tmp/_sgi_stand_$$
if [ ! -d /var/tmp/_sgi_stand_$$ ]
then echo Warning: unable to save copy of volume header files
else
dvhtool -v g sash /var/tmp/_sgi_stand_$$/sash
if [ ! -f /var/tmp/_sgi_stand_$$/sash ]
then echo Warning: not able to save copy of volume header sash
fi
# not all systems have ide or symmon, and not crucial
dvhtool -v g ide /var/tmp/_sgi_stand_$$/ide >/dev/null 2>&1
dvhtool -v g symmon /var/tmp/_sgi_stand_$$/symmon >/dev/null 2>&1
echo /var/tmp/_sgi_stand_$$ > /tmp/vh_savedir
tabfiles="$tabfiles tmp/vh_savedir"
fi
# The tabfiles all get backed up twice, but we want them to be at
# the beginning, so it's no big deal.
(echo $LABEL_FILE; for i in $tabfiles; do echo $i; done;
find . -local -depth ! -type s -print) | \
/sbin/cpio -KWovO $TPDEV
exitstat=$?
if [ $exitstat -eq 0 ]
then date +%D > $INCR_FILE
else echo $0 failed "(exit status $?)", $INCR_FILE not updated
fi
fi
else
if [ -d "$BDIR" ]
then
cd $BDIR
findarg=.
else # allow backup of specific file(s), but not with spaces in name
# label file will show working dir backup started from, which
# isn't very useful since the file has a full pathname, but it's
# a minor inconsistency that has no clear "correct" answer.
findarg="$BDIR"
fi
BDIR="`/bin/pwd`"
make_label "Selected Files Backup from $BDIR" "/sbin/cpio -KWovO $TPDEV"
(echo $LABEL_FILE; find $findarg -local -depth ! -type s -print) | \
/sbin/cpio -KWovO $TPDEV
exitstat=$?
fi
echo ""
echo "Backup complete."
exit $exitstat