409 lines
11 KiB
Bash
409 lines
11 KiB
Bash
#! /bin/sh
|
||
#
|
||
#@(#)check_copyright.sh 1.1 94/10/31 SMI
|
||
#
|
||
########################################################################
|
||
#
|
||
#This utility extracts the Copyright file from the following media
|
||
#types for both sun3 and sun4 application architectures:
|
||
#
|
||
# Half Inch (mt) - Density = High (6250) or Low (1600)
|
||
# Quarter Inch (st) - Density = High (QIC24) or Low (QIC11)
|
||
#
|
||
#Requirements:
|
||
#
|
||
# o You must login to the tapehost and execute this script.
|
||
# If your tapehost is a release machine, this utility should
|
||
# be accessible under /usr/release/bin. If you do not
|
||
# find it there, please contact the RE for that particular
|
||
# machine.
|
||
#
|
||
# o The tapehost must be running 4.0.3 or later, to support
|
||
# the 'asf' option of the 'mt' command.
|
||
#
|
||
# o If you are verifying a SunOS release, the TOC conversion
|
||
# utility named "xdrtoc_`arch`" must be available.
|
||
# You do not have to worry about this if you already have
|
||
# aprime:/usr/krypton already mounted on the tapehost
|
||
# (which is usually the case for our release machines).
|
||
# If /usr/krypton is not accessible, make a copy in /tmp
|
||
# of your tapehost, using this command:
|
||
#
|
||
# rcp aprime:/usr/krypton/janet/xdrtoc_`arch` /tmp
|
||
#
|
||
#Usage: /usr/release/bin/check_copyright [-n]
|
||
#
|
||
# By default, each tape is rewound after verification.
|
||
# If you're in a rush and need to save time, suppress the
|
||
# rewind at the end using the -n option.
|
||
#
|
||
# You will be asked for the following information:
|
||
#
|
||
# Product Type to be verified (see below)
|
||
# Media to be verified (qtr/half)
|
||
# Density of media to be verified (hi/lo)
|
||
#
|
||
#Product Types Supported:
|
||
#
|
||
# You will be presented with a menu of products to be verified,
|
||
#
|
||
# SunOS
|
||
# Choosing this item will extract the TOC from File#1
|
||
# to determine the following info: copyright location,
|
||
# total number of volumes, and the volume number
|
||
# being processed. Tape format is always 'boot'.
|
||
#
|
||
# Crypt
|
||
# Choosing this item will extract the copyright file
|
||
# from File#12. Total number of volumes is always 1,
|
||
# tape format is always 'tar'.
|
||
#
|
||
# Diag Exec
|
||
# Choosing this item will extract the TOC from File#2
|
||
# to determine the copyright location. Total number of
|
||
# volumes is always 1, tape format is always 'tar'.
|
||
#
|
||
# Other
|
||
# If you choose this item, you will be prompted to specify
|
||
# a file number for the copyright location, or indicate
|
||
# that it is unknown by entering 'X'. You will also
|
||
# be prompted to enter the total number of volumes in the
|
||
# media set.
|
||
#
|
||
#Verification Process:
|
||
#
|
||
# The script checks for the existence of certain copyright
|
||
# components, listed below. However, it will also display
|
||
# the Copyright for your review, and save intermediate
|
||
# files for closer scrutiny. The copyright components
|
||
# checked are:
|
||
# Copyright year
|
||
# Tape Size
|
||
# Part Number
|
||
# Rev.
|
||
# Volume# of Total Volumes
|
||
# Density
|
||
#
|
||
#Hint:
|
||
#
|
||
# If the copyright file cannot be found where it is expected,
|
||
# Choose Product Type = Other, Copyright location = X, and
|
||
# let the script find the last file.
|
||
#
|
||
#Please send bugs/RFE's to Janet Timbol (janet@firenze)
|
||
#
|
||
########################################################################
|
||
#
|
||
#Screen yes/no reponses
|
||
#
|
||
|
||
usage="USAGE: $0 [ -n ] "
|
||
if [ $# -gt 1 ] ; then
|
||
echo "$usage" && exit 1
|
||
else
|
||
case $1 in
|
||
-n ) no_rewind=1;;
|
||
'' ) ;;
|
||
* ) echo $usage && exit 1;;
|
||
esac
|
||
fi
|
||
|
||
get_yn='(while read yn; do
|
||
case "$yn" in
|
||
[Yy]* ) exit 0;;
|
||
[Nn]* ) exit 1;;
|
||
* ) echo -n "Please answer y or n: ";;
|
||
esac
|
||
done)'
|
||
|
||
tmp=/tmp
|
||
here=`pwd`
|
||
rawdev=/dev/nr
|
||
|
||
#
|
||
#Floppies not supported--awaiting sample media and more info
|
||
#
|
||
|
||
while echo -n "Enter media to be verified (qtr/half): "; do
|
||
read media
|
||
case $media in
|
||
[Qq]* ) media_type=quarter; sz=1/4; d_unit=QIC; break;;
|
||
[Hh]* ) media_type=half; sz=1/2; d_unit=bpi; break;;
|
||
* ) echo "Try again.";;
|
||
esac
|
||
done
|
||
|
||
echo -n "Is this a high-density tape ie, 6250 bpi or QIC-24? (y/n): "
|
||
eval "$get_yn"
|
||
case $? in
|
||
0 ) if [ "$media_type" = "quarter" ]; then
|
||
device=${rawdev}st8
|
||
dens=24; blksz=200b
|
||
else
|
||
device=${rawdev}mt8
|
||
dens=6250; blksz=20b
|
||
fi; break;;
|
||
1 ) if [ "$media_type" = "quarter" ]; then
|
||
device=${rawdev}st0
|
||
dens=11; blksz=126b
|
||
else
|
||
device=${rawdev}mt0
|
||
dens=1600; blksz=20b
|
||
fi; break;;
|
||
esac
|
||
|
||
#
|
||
#Assume only 'SunOs' and 'Other' product category have multiple vols
|
||
#
|
||
while echo -n "
|
||
PRODUCT TYPES
|
||
|
||
1) Full SunOS release (TOC is 2nd file)
|
||
2) Crypt Kit (No TOC, Copyright is 13th file)
|
||
3) Diag Exec release, (TOC is 3rd file)
|
||
4) Other (TOC & Copyright location unknown)
|
||
|
||
Choose type of product being verified (1-4): "; do
|
||
read choice
|
||
case $choice in
|
||
1|[Ff]* ) toc_asf=1; convert_toc=1; multi_vol=1; prod="SunOS"
|
||
tp_format='BOOT';;
|
||
2|[Cc]* ) copy_asf=12; prod="Crypt"; tp_format=TAR;;
|
||
3|[Dd]* ) toc_asf=2; prod="DiagExec"; tp_format=TAR ;;
|
||
4|[Oo]* ) copy_asf=last; prod="Other"; multi_vol=1;;
|
||
* ) echo "$choice is not a valid selection"
|
||
echo -n "Press <RETURN> to continue: "
|
||
read return && /usr/ucb/clear && continue;;
|
||
esac
|
||
break
|
||
done
|
||
|
||
mydir=${tmp}/`whoami`
|
||
workdir=${tmp}/${media_type}; voldir=${mydir}/${prod}_${media_type}
|
||
for i in $mydir $voldir $workdir; do
|
||
[ ! -d $i ] && mkdir $i
|
||
done
|
||
cd $workdir; rm -f *
|
||
|
||
if [ "$prod" = "Other" ] ; then
|
||
while : ; do
|
||
echo -n \
|
||
"Enter total number of volumes for this media ($media_type): "
|
||
read vol_sum
|
||
case $vol_sum in
|
||
[1-9] | [1-9][1-9] ) break;;
|
||
* ) echo "Number should be between 1-99!";;
|
||
esac
|
||
done
|
||
[ "$vol_sum" -ne 1 ] && multi_vol=1 || multi_vol=
|
||
fi
|
||
|
||
if [ "$convert_toc" ]; then
|
||
xdr_bindir=/usr/krypton/janet
|
||
while [ ! -x $xdr_bindir/xdrtoc_`arch` ]; do
|
||
echo "We need 'xdrtoc_`arch`' utility!"
|
||
echo -n "Enter directory where it can be found: "
|
||
read xdr_bindir
|
||
done
|
||
fi
|
||
|
||
bad=
|
||
cleanup='(cd $here;
|
||
rm -rf $workdir
|
||
rm -f $tmp/*$$
|
||
[ "$bad" ] && exit 1
|
||
echo ""
|
||
echo "Output and error files are in the directory $voldir."
|
||
echo "You may want to clean it up when you are done, using:"
|
||
echo " rm -rf $voldir"
|
||
)'
|
||
|
||
chk_ok='( if egrep -vs " records " $errs ; then
|
||
echo "Tape Access Operation failed!"
|
||
bad=1; eval "$cleanup"
|
||
exit 1
|
||
else
|
||
exit 0
|
||
fi )'
|
||
|
||
#
|
||
#Check if 'asf' supported
|
||
#
|
||
os_release=`egrep '^SunOS Release ' /etc/motd | awk '{print $3}'`
|
||
case $os_release in
|
||
4.0.3* | 4.1* ) skip=asf;;
|
||
* ) echo "Please execute this utility on a system running 4.0.3 or later."
|
||
bad=1; eval "$cleanup"; exit 1;;
|
||
esac
|
||
|
||
trap 'echo ABORTED!; bad=1; eval "$cleanup"; exit 1' 1 2 3 15
|
||
errs=$tmp/errs_$$; rm -f $errs
|
||
|
||
#
|
||
# Begin multiple volume loop
|
||
#
|
||
|
||
while :
|
||
do
|
||
this_vol=
|
||
if [ ! "$prod" = "SunOS" ]; then
|
||
if [ "$multi_vol" ] ; then
|
||
while : ; do
|
||
echo -n "Enter Volume Number being processed: "
|
||
read this_vol
|
||
case $vol_sum in
|
||
[1-9] | [1-9][1-9] ) break;;
|
||
* ) echo "^GNumber should be between 1-99!";;
|
||
esac
|
||
done
|
||
else
|
||
this_vol=1
|
||
fi
|
||
fi
|
||
if [ "$prod" = "Other" ]; then
|
||
while echo -n \
|
||
"Enter last file number (first file=0) on this media, or 'x' if unknown: "; do
|
||
read copy_asf
|
||
case "$copy_asf" in
|
||
[0-9] | [0-9][0-9] ) break;;
|
||
[Xx]* ) copy_asf=unknown; break;;
|
||
* ) echo "Answer should be 'x' or a number.";;
|
||
esac
|
||
done
|
||
fi
|
||
|
||
/usr/ucb/clear
|
||
echo "Rewinding tape..."
|
||
mt -f $device rew
|
||
if [ ! $? = 0 ]; then
|
||
echo "Unable to access $device for $media_type media!"
|
||
bad=1; eval "$cleanup"
|
||
exit 1
|
||
fi
|
||
|
||
if [ "$toc_asf" ] ; then
|
||
echo "Extracting toc..."
|
||
mt -f $device $skip $toc_asf 2>> $errs
|
||
eval "$chk_ok" || exit 1
|
||
dd if=$device of=toc_dd bs=${blksz} 2>> $errs
|
||
eval "$chk_ok" || exit 1
|
||
if [ ! "$convert_toc" ]; then #Must be Diag Exec
|
||
mv toc_dd toc_read
|
||
copy_asf=`wc -l toc_read| awk '{print $1}'`
|
||
else
|
||
cat toc_dd | $xdr_bindir/xdrtoc_`arch` > toc_read
|
||
if [ ! "$?" = 0 ] ; then
|
||
echo "Can't read TOC!"
|
||
bad=1; eval "$cleanup"; exit 1
|
||
fi
|
||
rm -f toc_dd
|
||
this_vol=`egrep -i "^volume" toc_read | awk '{print $2}'`
|
||
vol_sum=`tail -1 toc_read | awk '{print $1}'`
|
||
echo "This is volume #${this_vol} of ${vol_sum}..."
|
||
copy_asf=`egrep -i copyright toc_read | \
|
||
egrep "[ ]${this_vol}[ ]"| awk '{print $2}'`
|
||
fi
|
||
fi
|
||
|
||
copy_out=copyright
|
||
echo "This is volume #${this_vol} of ${vol_sum}..."
|
||
if [ ! "$copy_asf" = "unknown" ] ; then
|
||
echo "Forwarding tape to Copyright file (#$copy_asf)"
|
||
mt -f $device $skip $copy_asf 2>> $errs
|
||
eval "$chk_ok" || exit 1
|
||
dd if=$device of=$copy_out bs=${blksz} 2>> $errs
|
||
eval "$chk_ok" || exit 1
|
||
else
|
||
echo "Searching for Copyright file..."
|
||
count=1; copy_asf=
|
||
while : ; do
|
||
mt -f $device $skip $count 2> $errs
|
||
eval "$chk_ok" || exit 1
|
||
dd if=$device of=/dev/null bs=${blksz} 2> $errs
|
||
if egrep -s '^0\+0 records in' $errs && \
|
||
egrep -s '^0\+0 records out' $errs ; then
|
||
echo \
|
||
"Forwarding to last file (#$copy_asf)..."
|
||
mt -f $device $skip $copy_asf 2>errs
|
||
dd if=$device of=$copy_out bs=${blksz} 2>> $errs
|
||
break
|
||
else
|
||
copy_asf=$count; count=`expr $count + 1`
|
||
fi
|
||
done
|
||
fi
|
||
|
||
#
|
||
#Check to see if extracted file IS the copyright
|
||
#
|
||
for i in reserve license; do
|
||
egrep -is $i $copy_out && break
|
||
echo "ERROR: Extracted file doesn't look like Copyright!"
|
||
eval "$cleanup"; exit 1
|
||
done
|
||
|
||
this_year=`date | awk '{print $NF}'`
|
||
egrep -i "^copyright " $copy_out | egrep -s $this_year
|
||
|
||
if [ ! "$?" = 0 ] ; then
|
||
echo "WARNING: Copyright period does not include $this_year" | \
|
||
tee -a check_errs
|
||
fi
|
||
|
||
for i in $sz "Part Number " " Rev." "$this_vol of $vol_sum"
|
||
do
|
||
egrep -is "$i" $copy_out
|
||
[ ! "$?" = 0 ] && echo "WARNING: '$i' string NOT FOUND!" | \
|
||
tee -a check_errs
|
||
done
|
||
case $media_type in
|
||
quarter) egrep $d_unit $copy_out | egrep "$dens" > $tmp/$$;;
|
||
half) egrep -i $d_unit $copy_out | egrep "$dens" > $tmp/$$;;
|
||
esac
|
||
[ ! -s $tmp/$$ ] && \
|
||
echo "WARNING: $d_unit/$dens Info Missing/Wrong!" | \
|
||
tee -a check_errs
|
||
if [ "$tp_format" ]; then
|
||
egrep -i ' format' $copy_out | egrep -i "${tp_format}" > $tmp/$$
|
||
else
|
||
egrep -i ' format' $copy_out > $tmp/$$
|
||
fi
|
||
[ ! -s $tmp/$$ ] && echo "WARNING: Format Info Incorrect!" | \
|
||
tee -a check_errs
|
||
|
||
rm -f ${voldir}/*${this_vol}
|
||
for i in `ls -F1 | egrep -v /$`; do
|
||
[ "$i" = ${copy_out} ] && \
|
||
mv $i ${voldir}/${copy_out}_asf${copy_asf}_vol${this_vol} && continue
|
||
mv $i ${voldir}/${i}_vol${this_vol}
|
||
done
|
||
echo "
|
||
Please make sure this matches the tape label:
|
||
"
|
||
echo "===========================Copyright File==========================="
|
||
cat ${voldir}/${copy_out}_asf${copy_asf}_vol${this_vol}
|
||
echo "====================================================================
|
||
"
|
||
if [ ! "$no_rewind" ] ; then
|
||
echo "Rewinding tape..."
|
||
mt -f $device rew
|
||
fi
|
||
if [ "$multi_vol" ] ; then
|
||
echo -n \
|
||
"Process another volume Media=$media_type, Product=$prod? (y/n) "
|
||
eval "$get_yn" || break
|
||
echo -n "Load next volume for this media set, press <RETURN> "
|
||
read return
|
||
else
|
||
break
|
||
fi
|
||
|
||
done
|
||
|
||
#
|
||
#End multiple volume loop
|
||
#
|
||
echo "DONE!"
|
||
eval "$cleanup"; exit 0
|
||
|