Cover V04, I04
Article
Listing 1
Listing 2
Listing 3
Listing 4
Listing 5

jul95.tar


Listing 2: gethdr.scr

#!/bin/ksh
#
# gethdr.scr
#
# This script reads the header file (tar format) from a backup tape
# created with the backup.scr script.
#
# If the tape device being used is an 8 mm tape the blocksize is set
# to 1024 for the duration of the read and reset to the previous
# value at the end.  If this script is stopped or aborts the blocksize
# should be manually changed to the previous value.
#
# The format of the tape is as follows:
#
#       BOT
#       header file (format is below)                   (tar format)
#       EOF
#       filesystem 1                                    (backup format)
#       EOF
#       filesystem 2                                    (backup format)
#       EOF
#       .
#       .
#       filesystem n                                    (backup format)
#       EOF
#
# Header File Format
#
#       Line 1:         hostname
#       Line 2:         date and time
#       Line 3:         Level indicator
#       Lines 4-n+3:    i FILESYSTEM_NAME
#                       (where i is 1 for the first, 2 for the second, and
#                        so on.  This is the value of the advance file command
#                        to get this filesystem.)
#
# Parameters:
#
#      p1 : (optional) the tape device to read backups from.  The /dev/
#           qualifier and the .n suffix may be present or absent, i.e.
#           /dev/rmt1.1 is the same as /dev/rmt1 is the same as rmt1.1 is
#           the same as rmt1.  If a .n suffix is used on the device name
#           (i.e. rmt0.3), it MUST be a non-rewinding device, or the
#           successive filesystems will overwrite one another.  The
#           non-rewinding device suffixes are .1, .3, .5, & .7.  If the
#           .n suffix is absent then the value .1 (i.e. $DEFAULT_SUFFIX)
#           is used.  If the parameter is omitted the value /dev/rmt0.1
#           is used.
#
# Exit Status:
#
#       0 : Tape read completed successfully (file is in /tmp/!backuplist)
#       1 : Could not find the header file on the tape
#       92: Error rewinding the tape
#       94: Wrong number of parameters
#       96: Error changing the tape blocksize
#       97: Param 1 must be a tape device on this system
#       98: Param 1 must be a non-rewinding tape device
#
#
DEFAULT_TAPE=/dev/rmt0
DEFAULT_SUFFIX='.1'
DEFAULT_BLOCKSIZE="1024"
USAGE="$0 [optional_tape_device]"
blocksize=-1
basetape=""
#########################################################################
#
# If the selected tape drive is an 8mm unit, this function will set
# the block size of the drive to 1024.  If the current value is
# different it is saved and restored later.
#
set_blocksize()
{
blocksize=-1                                    # -1
means reset unnecessary
if [[ -n `lsdev -Cc tape | grep $basetape | grep 8mm` ]]
then
blocksize=`lsattr -E -a block_size -l $basetape | cut -f2 -d' '`
if [[ $blocksize != $DEFAULT_BLOCKSIZE ]]
then
chdev -l $basetape -a block_size=$DEFAULT_BLOCKSIZE >/dev/null
if [[ $? = 0 ]]
then
print "$basetape changed (old blocksize = $blocksize, new = $DEFAULT_BLOCKSIZE)"
else
print "Could not change tape blocksize to $DEFAULT_BLOCKSIZE.  Exiting."
exit 96
fi
fi
fi
}
#########################################################################
#
# If the tape blocksize was changed earlier, restore the old
# value.
#
reset_blocksize()
{
if [[ $blocksize != -1 && \
$blocksize != $DEFAULT_BLOCKSIZE ]]
then
chdev -l $basetape -a block_size=$blocksize >/dev/null
if [[ $? = 0 ]]
then
print "$basetape changed (blocksize = previous value of $blocksize)"
else
print "Could not change tape blocksize to $blocksize.  Exiting."
exit 96
fi
fi
}
#########################################################################
#
# This function rewinds a tape
#
rewind()
{
tctl -f $tapedev rewind
if [[ $? != 0 ]]
then
print "Error rewinding $tapedev.  Exiting."
exit 92
fi
}
#########################################################################
#
# This function checks the parameters and sets up the $tapedev symbol.
#
checkparm()
{
if [[ $savecount > 1 ]]
then
print "Wrong number of parameters, usage = $USAGE.  Exiting."
exit 94
fi
tapedev=${DEFAULT_TAPE}${DEFAULT_SUFFIX}
if [[ $savecount = 1 ]]
then
tapedev="/dev/`basename $savep1`"
if [[ `print $tapedev | cut -c6-8` != "rmt" || \
-z `ls $tapedev 2>/dev/null` ]]
then
print "Sorry, parm 1 must specify a tape device on your system.  Exiting."
exit 97
fi
if [[  -z `print $tapedev | grep "\."` ]]
then
tapedev=$tapedev${DEFAULT_SUFFIX}
else
suffix=`print $tapedev | cut -f2 -d'.'`
if [[ $suffix != 1 && \
$suffix != 3 && \
$suffix != 5 && \
$suffix != 7 ]]
then
print "Sorry, parm 2 must specify a non-rewinding tape device."
exit 98
fi
fi
fi
basetape=`basename $tapedev | cut -f1 -d'.'`
}
#########################################################################
#
# main
#
savecount=$#
savep1=$1
checkparm                                       # check the parms
rewind                                          # rewind the tape
set_blocksize                                   # set the tape blocksize
cd /tmp
mv !backuplist !backuplist.save.$$ 2>/dev/null  # save previous file if exists
tar -xf $tapedev !backuplist
reset_blocksize                                 # restore the tape blocksize
if [[ -s !backuplist ]]
then
###  print "Tape contents file is in /tmp/!backuplist"
chmod 644 !backuplist
exit 0
else
print "Sorry, could not read !backuplist from the tape."
exit 1
fi
exit 0