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

185 lines
3.8 KiB
Bash

#!/sbin/sh
####
usage()
{
echo "Usage $0 [-v] [-h hostname] [-t tapedevice]"
exit
}
####
TP="/dev/tape"
HN="localhost"
FILE=""
bruv= tarv= cpiov= # verify options
####
if [ $# -gt 0 ]
then
while [ $1 = "-h" -o $1 = "-t" -o $1 = "-v" ]
do
if [ $1 = "-h" ]
then
shift
if [ $# -lt 1 ]
then
usage
fi
HN=$1
shift
if [ $# -lt 1 ]
then
break
fi
fi
if [ $1 = "-t" ]
then
shift
if [ $# -lt 1 ]
then
usage
fi
TP=$1
shift
if [ $# -lt 1 ]
then
break
fi
fi
if [ $1 = "-v" ]
then
shift
bruv=d tarv=C cpiov=TT # verify options
fi
done
fi
####
if [ $HN = "localhost" ]
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 ;;
}
ret=`(rsh guest@$HN -n mt -t $TP status 2>&1)`
fi
case "$ret" {
*Login?incorrect*) echo "Error: guest login incorrect on:" "$HN" ;
exit ;;
*No?such?file*) echo "Error: Tape device $TP not configured." ;
exit ;;
*Not?READY*) echo "Error: There is no tape in the drive." ;
exit ;;
*Unknown?host*) echo "Error: Host $HN is unknown." ;
exit ;;
*can*get?status*) echo "Error: Cannot stat $TP." ;
exit ;;
*I/O?error*) echo "Error: Unable to I/O on $TP." ;
exit ;;
}
sleep 2
if [ $HN = "localhost" ]
then
TPDEV="$TP"
else
TPDEV="guest@$HN:$TP"
fi
# function to determine tape type.
# assumes blocksize never > 256KB
get_backup_type() {
rsh guest@$HN -n dd if=$TP bs=256k count=1 > /tmp/$$type 2>/dev/null
LANG=C ttype="`file /tmp/$$type`"
case "$ttype" {
*bru*) echo Backup is a bru archive
labelcmd="bru -g -f /tmp/$$type"
listcmd="bru -tvj$bruv -f $TPDEV"
;;
*xfsdump*) echo Backup is an xfsdump archive
labelcmd=
# no verify option
listcmd="xfsrestore -v verbose -t -f $TPDEV"
;;
*cpio*) echo Backup is a cpio archive
labelcmd="cpiolabel /tmp/$$type"
listcmd="cpio -itvk$cpiov -I $TPDEV"
;;
*tar*) echo Backup is a tar archive
labelcmd="tarlabel /tmp/$$type"
listcmd="tar -vtRf$tarv $TPDEV"
;;
*) echo Unable to determine backup type, assuming cpio
labelcmd="cpiolabel /tmp/$$type"
listcmd="cpio -itvk$cpiov -I $TPDEV"
;;
}
}
# get label from a tar tape.
# since tar has no real labels, we simply fake this one.
# if it's written in the "sgi system backup format", it
# has such a label, otherwise we fake it.
# basicly, we assume the first file is small, and extract it.
tarlabel()
{
file="`tar Rtf $1 2>&1 | sed -n 1p`"
if [ $? -ne 0 ] #{
then
echo "Error trying to read label file"
return 0
fi #}
# get the label file; first file on tape
(cd /; tar Rxf $1 $file 2>/dev/null; if [ -f "$file" ];
then cat $file; rm -f $file; fi)
return 1;
}
# get label from a cpio tape.
# since tar has no real labels, we simply fake this one.
# if it's written in the "sgi system backup format", it
# has such a label, otherwise we fake it.
# basicly, we assume the first file is small, and extract it.
cpiolabel()
{
file="`cpio -ti -I $1 2>&1 | sed -n 1p`"
if [ $? -ne 0 ] #{
then
echo "Error trying to read label file"
return 0
fi #}
# get the label file; first file on tape
(cd /; cpio -i -I $1 $file >/dev/null 2>&1; if [ -f "$file" ];
then cat $file; rm -f $file; fi)
return 1;
}
trap 'rm -f /tmp/$$type /tmp/$$lab; trap 0; exit 0' 0
trap 'echo Interrupted; rm -f /tmp/$$type; trap 0; exit 1' 1 2
echo ""
echo "Tape listing started. Please wait..."
get_backup_type
$labelcmd | tee /tmp/$$lab
# if they asked for verify, try to start from same dir. This shouldn't
# be an issue if made through Backup, but may be done through other scripts
if [ -n "$cpiov" ]
then
sdir="`sed -n /label:/'s/.* //p' /tmp/$$lab`"
if [ -n "$sdir" ]; then
cd $sdir # may not work right if there was no label file...
fi
fi
echo ""
$listcmd
echo ""
echo "Tape listing complete."