Files
Arquivotheca.AIX-4.1.3/bldenv/pkgtools/stack_32.sh
seta75D d6fe8fe829 Init
2021-10-11 22:19:34 -03:00

616 lines
19 KiB
Bash

#!/bin/ksh
# @(#)39 1.23 src/bldenv/pkgtools/stack_32.sh, pkgtools, bos412, GOLDA411a 4/4/94 16:24:18
#
# COMPONENT_NAME: PKGTOOLS
#
# FUNCTIONS: abort
# check_size
# cktape_avail
# get_type
# leadvol
# syntax
#
# ORIGINS: 27
#
# IBM CONFIDENTIAL -- (IBM Confidential Restricted when
# combined with the aggregated modules for this product)
# SOURCE MATERIALS
#
# (C) COPYRIGHT International Business Machines Corp. 1991,1993
# All Rights Reserved
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
#
#===============================================================================
#
# Purpose:
# This shell creates output stacked tapes. The output
# tapes contain a newly created Table of Content (TOC)
# file. The output tape also contains the product image
# files ( in backup or tar format) that are input
# via the -l and -c flags.
#
#===============================================================================
leadvol() {
if [ $volume -lt 10 ]
then
volume="0$volume"
fi
}
######################### Function ########################
# The 'syntax' function simply echos command syntax, then
# exits the shell.
###########################################################
syntax() {
echo "$cmd -l<stack_list> [-c<image_dir>] [-d<device>] [-s<size>] "
echo "\t[-i<image_type>] [-n<toc_dir>] [-1<boot_image>] [-2<inst_image>]"
echo "FLAGS: -l File name of stack list. Only one bff/tar file name"
echo " or pathname per line."
echo " -c Default directory name containing installable images."
echo " -d Device type for tape device. (default: rmt0)"
echo " -s Maximum size in megs for tape volume."
echo " Defaults are: 120 for 1/4 inch tape,"
echo " 525 for 7207 tape,"
echo " 1000 for 4mm2gb tape,"
echo " 2000 for 4mm4gb tape,"
echo " 1150 for 8mm tape, and"
echo " 2100 for 8mm5gb tape."
echo " -n Name of the directory where you want the TOC to be written."
echo " This option will generate a TOC, but not write a tape."
echo " -1 Bosboot image. Need to specify directory and"
echo " filename of bosboot image. This file will be the first"
echo " file of the output tape. There is no default."
echo "\nHit any key to continue page: \b"
read junk
echo "\n -2 Bos install image. Need to specify directory and"
echo " filename of bos install image. This file will be the"
echo " second file of the output tape. There is no default. "
echo " -i Specifies image type by AIX release for TOC format. Valid"
echo " values are 3.1, 3.2 and 4.1 which indicate type 1,"
echo " 2, and 3 TOC format, respectively. Default is type 1."
echo "\nNotes: File and Directory names can be absolute or relative"
echo " -1 and -2 flag must be used together."
echo "\nExamples:"
echo " stack_32 -l stack_list -c ./ -d rmt1 -s 1000 -n ./"
echo " stack_32 -l stack_list -c files -1 boot -2 install\n"
exit $error_code
}
abort() {
rm -rf ${WORK} > /dev/null 2>&1
echo ""
exit 1
}
cktape_avail() {
device=`ODMDIR=/etc/objrepos \
lsdev -C -c tape -l $dev -t $TYPE -S a` > /dev/null 2>&1
if [ "x$device" = "x" ]; then
echo "\n$cmd: ERROR: Tape device /dev/$dev defined but not available"
exit 25
fi
}
#------------------------------------------------------------------------
# Determine the tape device type. Set the maximum size value for |
# that device. Use 2100000000 for the 5gb tape drive limit so the |
# shell calculations wil work in Maketoc_32. |
# Since all tapes are written in block sizes of 512, this actually |
# reduces the max size to half of the actual tape capacity. Thus |
# the max size value for a 2gb tape is 1000meg, etc. Note that 1/4 |
# inch tapes (types 150mb, 525mb, and ost) are blocked at 512, so |
# maxsize in this case does reflect the true tape capacity. |
#------------------------------------------------------------------------
get_type ()
{
TYPE=`ODMDIR=/etc/objrepos lsdev -C -F type -c tape -l $dev`
case $TYPE in
"8mm5gb" ) check_size 2100000000;;
"8mm" ) check_size 1150000000;;
"4mm2gb" ) check_size 1000000000;;
"4mm4gb" ) check_size 2000000000;;
"150mb" ) check_size 120000000;;
"525mb" ) check_size 525000000;;
"ost" ) check_size 525000000;;
* )
#------------------------------------
# Not a recognized device type. |
#------------------------------------
echo "\n$cmd: ERROR: Device type not recognized. Valid device\n"
echo "\ttypes are 8mm5gb, 8mm, 4mm4gb, 4mm2gb, 150mb, 525mb and ost.\n"
exit 24;;
esac
return 0
}
#------------------------------------------------------------------------
# If -s flag set make sure it is not higher than maximum media limit. |
# Otherwise set maxsize to media limit. |
#------------------------------------------------------------------------
check_size ()
{
[ -z "$sizeFlag" ] && { maxsize=$1; return; }
if [ $maxsize -gt $1 ]
then
echo "\n$cmd: ERROR: The value specified with the -s option\n"
echo "\tmust be less than or equal to the maximum size of $1\n"
echo "\tfor a type $TYPE tape.\n\n\t$cmd Terminating."
exit 18
fi
}
###########################################################
# START OF SHELL LOGIC.
# First, check number of parameters on command line.
###########################################################
set -u
error_code=0
cmd=`basename $0`
if [ $# -lt 1 ]; then
error_code=1
syntax
fi
cmdline="$*"
############################################################
# Parse command line parameters
############################################################
set -- `getopt "bl:c:d:s:n:i:1:2:" $*`
if [ $? != 0 ]; then
echo "\n$cmd: ERROR: Problem in command line: $cmdline"
error_code=2
syntax
fi
##############################
# Initialize variables
##############################
TOC_DATE=`date +"%m""%d""%H""%M""%S""%y"` # Constant date stamp
WORK_DATE=`date +"%y""%m""%d""%H""%M""%S"` # Work directory date stamp
image_dir=`pwd` # Installable image directory
CURRENT_DIR=`pwd` # Current directory
STACK_LIST="" # Stack list file name
bootable=no # Bootable is no
gotsize=no # Defaults to program specified maximum tape size
toc_format=""
################################
writetape=yes # Defaults to write to tape
dev=rmt0 # Default device
DEV=/dev/rmt0 # Set device driver
sizeFlag="" # -s flag set
TYPE="" # Tape device type (either 1/4 inch, 4mm or 8mm)
b1=no # -1 specified flag
b2=no # -2 specified flag
BOSBOOT="" # initialize filename to null
BOSINSTAL="" # initialize filename to null
backup_pattern="0000000 004400" # Pattern that distinguishes between
# bff and tar files
BLOCK_SIZE=31744 # Streaming tape block size
export BLOCK_SIZE backup_pattern
while [ "$1" != "--" ]; do
case $1 in
"-d")
shift
dev=`basename $1`
DEV=/dev/$dev
;;
"-n")
shift
writetape=no
TOC_DIR=$1
if [ ! -d $TOC_DIR ]; then
echo "\n$cmd: ERROR: Can't find TOC directory $TOC_DIR"
error_code=3
else
cd $TOC_DIR
TOC_DIR=`pwd`
if [ ! -w $TOC_DIR ]; then
echo "\n$cmd: ERROR: TOC directory: $TOC_DIR not writable"
error_code=4
fi
fi
cd $CURRENT_DIR
;;
"-b")
echo "NOTICE: stack_32 no longer uses the '-b' flag. To leave bos"
echo "off of the tape, take bos and/or bos.obj out of your stacklist."
syntax
;;
"-s")
# Maxsize of 2300 was causing errors because of the integer size
# in Maketoc_32, so the maxsize was changed to 2100
# the breaking point seems to be 2147.
shift
if [ $1 -gt 0 -a $1 -lt 2100 ]; then
sizeFlag=yes
maxsize="${1}000000"
else
echo "\n$cmd: ERROR: Maximum tape size should be less than 2100 megs."
echo " Defaults are 120 for 1/4 inch tape, 525 for 7207 tape,"
echo " 2000 for 4mm4gb tape, 1000 for 4mm2gb tape, 1150 for 8mm tapes,"
echo " and 2100 for 8mm5gb tape."
error_code=5
fi
;;
"-l")
shift
# dirname gives all except the last part of the path name
# that is all but the last /
# set STACK_LIST to full path directory and filename using dirname cmd
stk_dir=`dirname $1`
if [ ! -d $stk_dir ]; then
echo "\n$cmd: ERROR: Can't find stack file directory $stk_dir"
error_code=6
else
cd `dirname $1`
stk_dir=`pwd`
stk_name=`basename $1`
STACK_LIST=$stk_dir/$stk_name
if [ ! -f $STACK_LIST ]; then
echo "\n$cmd: ERROR: Can't find stack list $STACK_LIST"
error_code=7
else
if [ ! -r $STACK_LIST ]; then
echo "\n$cmd: ERROR: Can't read stack list $STACK_LIST"
error_code=7
fi
fi
fi
cd $CURRENT_DIR
;;
"-c")
# Set image directory to full path directory
shift
image_dir=$1
if [ ! -d $image_dir ]; then
echo "\n$cmd: ERROR: Can't find installable image directory $image_dir"
error_code=8
else
cd $image_dir
image_dir=`pwd`
fi
cd $CURRENT_DIR
;;
"-i")
shift
[ "$1" = "4.1" ] && toc_format=3
[ "$1" = "3.2" ] && toc_format=2
[ "$1" = "3.1" ] && toc_format=1
if [ -z "$toc_format" ] && [ "$cmd" != "stack41" ]
then
echo "\n$cmd: WARNING: invalid value specified for -i option."
echo "\tDefaulting to type 1 (3.1) toc. Processing will continue."
toc_format=1
fi
;;
"-1")
# set BOSBOOT parameter.
# Will later be resolved relative to image_dir (-c)
# also set the b1 flag which will be used later to make sure
# that flag 1 and 2 were used together
shift
BOSBOOT="$1"
b1=yes
;;
"-2")
# set BOSINSTAL parameter
# Will later be resolved relative to image_dir (-c)
# also set the b2 flag which will be used later to make sure
# that flag 1 and 2 were used together
shift
BOSINSTAL="$1"
b2=yes
;;
esac
shift
done
# shift past the --
shift
# Additional arguments on the command line
if [ $# != 0 ]; then
echo "\n$cmd: ERROR: Additional arguments on command line: $*"
error_code=13
fi
# Default to type 1 toc format if -i not specified on command line.
[ -z "$toc_format" ] && toc_format=1
#
# check if absolute path specified on bosboot entry
#
if [ x != x$BOSBOOT ]; then
echo $BOSBOOT | grep '^/' > /dev/null
if [ $? -ne 0 ]; then
#
# add default path for relative entries
#
BOSBOOT="$image_dir/$BOSBOOT"
fi
if [ ! -f $BOSBOOT -o ! -r $BOSBOOT ]; then
echo "\n$cmd: ERROR: Can't read bosboot image $BOSBOOT"
echo " Check image directory and/or bosboot file"
error_code=10
fi
fi
#
# check if absolute path specified on bosinstall entry
#
if [ x != x$BOSINSTAL ]; then
echo $BOSINSTAL | grep '^/' > /dev/null
if [ $? -ne 0 ]; then
#
# add default path for relative entries
#
BOSINSTAL="$image_dir/$BOSINSTAL"
fi
if [ ! -f $BOSINSTAL -o ! -r $BOSINSTAL ]; then
echo "\n$cmd: ERROR: Can't read bosinstall image $BOSINSTAL"
echo " Check image directory and/or bosinstall file"
error_code=11
fi
fi
# Make sure flag -1 and -2 were used together
if [ "$b1" = "yes" -a "$b2" = "yes" ]; then
# set flags that specify that the tape should be bootable
# that is that files will be written to file 1 and 2 of the output tape
bootable=yes
export BOSBOOT
export BOSINSTAL
else
if [ "$b1" = "yes" -o "$b2" = "yes" ]; then
echo "\n$cmd: ERROR: FLAG -1 and -2 must be used together"
error_code=14
fi
fi
# Determine if device name and type are found
# Here is a sample output of lsdev -C -c tape:
# rmt0 Available 00-08-60-00 2.3 8mm tape drive
device=`ODMDIR=/etc/objrepos \
lsdev -C -c tape -l $dev` > /dev/null 2>&1
if [ "x$device" = "x" ]; then
echo "\n$cmd: ERROR: Invalid tape device: $dev"
error_code=15
else
get_type
cktape_avail
# Check the block size of device. It must be 512.
tapebs=`ODMDIR=/etc/objrepos \
lsattr -E -a block_size -l $dev | cut -d' ' -f2`
if [ "$tapebs" != "512" ]; then
echo "\n$cmd: ERROR: Tape block size on tape device must be set to 512"
echo " Use 'smit tape' to set block size to 512 or use"
echo " chdev -l $dev -a block_size=512"
error_code=21
fi
fi
# Image directory was set by using the -c flag
if [ "x$image_dir" = "x" ]; then
echo "\n$cmd: ERROR: Must have directory containing the installable images"
echo " Use the -c flag to enter directory"
error_code=22
fi
# STACK_LIST was set by using the -l flag
if [ "x$STACK_LIST" = "x" ]; then
echo "\n$cmd: ERROR: Must have the stack list file"
echo " Use the the -l flag to specify stack list file"
error_code=23
fi
#---------------------------------------------------------------------------
# If we were invoked as stack41 then always use a 4.1 (type 3) toc format. |
#---------------------------------------------------------------------------
[ "$cmd" = "stack41" ] && toc_format=3
# Check for errors in the command line
if [ $error_code != 0 ]; then
syntax
fi
if [ "$TYPE" = "525mb" -o "$TYPE" = "ost" ]; then
DEV="$DEV".1
else
DEV="$DEV".5
fi
echo "\nMaking a stacked tape of the following description:\n"
[ "$TYPE" = "150mb" ] && echo " TAPE TYPE: ......... 1/4 inch"
[ "$TYPE" = "8mm5gb" ] && echo " TAPE TYPE: ......... 8mm5gb"
[ "$TYPE" = "8mm" ] && echo " TAPE TYPE: ......... 8mm"
[ "$TYPE" = "4mm4gb" ] && echo " TAPE TYPE: ......... 4mm4gb"
[ "$TYPE" = "4mm2gb" ] && echo " TAPE TYPE: ......... 4mm2gb"
[ "$TYPE" = "525mb" ] && echo " TAPE TYPE: ......... 525 mb tape"
[ "$TYPE" = "ost" ] && echo " TAPE TYPE: ........ 7207 tape"
# [ "$toc_format" = "3" ] && echo " MEDIA FORMAT: ...... AIX v4.1"
# [ "$toc_format" = "2" ] && echo " MEDIA FORMAT: ...... AIX v3.2"
if [ "$toc_format" = "1" ]
then
[ "$toc_format" = "1" ] && echo " MEDIA FORMAT: ...... AIX v3.1"
else
echo " Defaulting to MEDIA FORMAT: ...... AIX v3.1"
echo "\t\t\tuntil Boulder supports additional formats."
toc_format=1
fi
echo " TAPE DEVICE: ....... /dev/$dev"
echo " TAPE SIZE: ......... $maxsize"
echo " BOOTABLE: .......... $bootable"
echo " DEFAULT IMAGE DIRECTORY: $image_dir"
echo " STACK LIST FILE: ... $STACK_LIST"
# Use a directory name variable for the tmp work directory
WORK=/tmp/stack_32_work.$$.$WORK_DATE
rm -f $WORK
if [ -d $WORK ]; then
echo "\n$cmd: ERROR: The temporary work directory $WORK could not be removed"
abort
fi
# Create the work directory
mkdir $WORK
if [ $? != 0 ]; then
echo "\n$cmd: ERROR: The temporary work directory $WORK could not be created"
abort
fi
# chmod added to make sure that the directory can be overwritten in the future
chmod 777 $WORK
VOLUME_TOC=$WORK/toc
WORK_TOC=$WORK/work_toc
WORK_STACK_LIST=$WORK/stack_list
# Prompt for a tape mount.
if [ "$writetape" = "yes" ]; then
echo "\07\nMount a tape in /dev/$dev and press enter"
read gorp
touch $WORK/tmpfile
dd if=$WORK/tmpfile of=$DEV 2>/dev/null
while [ $? -ne 0 ]; do
echo "Could not write to device /dev/$dev."
echo "\07\nCheck that a writable tape is mounted and press enter"
read gorp
dd if=$WORK/tmpfile of=$DEV 2>/dev/null
done
rm $WORK/tmpfile >/dev/null 2>&1
tctl -f$DEV rewind > /dev/null 2>&1&
rwd=$!
fi
# Build the WORK_TOC
echo "\nBuilding Table-of-Contents file:\n"
Maketoc_32 $image_dir $STACK_LIST $WORK_TOC $CURRENT_DIR $bootable $maxsize $WORK_STACK_LIST $toc_format
# Check return code from Maketoc_32
if [ $? != 0 ]; then
abort
fi
cd $image_dir
volume=1
leadvol
# WORK_STACK_LIST.volume contains a copy of the stack list created by Maketoc_32
while [ -f ${WORK_STACK_LIST}.${volume} ]; do
#########################################
## Format of TOC specifies that first line contain volume # in
## first character, the date created and a # for version of toc header.
## TOC for all volumes is same but for 1st line.
#########################################
# Put the header information into the new toc
echo "$volume $TOC_DATE $toc_format" > $VOLUME_TOC
cat $WORK_TOC >> $VOLUME_TOC
# chmod added to make sure that the toc can be overwritten in the future
chmod 777 $VOLUME_TOC
if [ "$writetape" = "yes" ]; then
stuff=`ps -p$rwd | tail -1 | cut -f4 -d" "`
if [ "x$stuff" != "xPID" ]
then
echo "Wait for rewind to complete..."
wait
else
echo "Rewind has completed..."
fi
# Add the bootable files, or place-holders
if [ "$bootable" = "yes" -a $volume -eq 1 ]; then
for x in $BOSBOOT $BOSINSTAL; do
echo "\n`basename $x`"
dd if=$x of=$DEV bs=$BLOCK_SIZE conv=sync
if [ $? != 0 ]; then
echo "\n$cmd: ERROR: Problem writing boot files to tape using dd"
abort
fi
done
else
# Must have placeholders for instupdt to process correctly.
for x in Reserved_file_1 Reserved_file_2; do
echo "\n$x"
echo "This is a reserved file" | dd of=$DEV bs=$BLOCK_SIZE conv=sync
if [ $? != 0 ]; then
echo "\n$cmd: ERROR: Problem writing reserved files to tape using dd"
abort
fi
done
fi
# Add the table of contents
echo "\nTable of Contents"
dd if=$VOLUME_TOC of=$DEV bs=512 conv=sync
if [ $? != 0 ]; then
echo "\n$cmd: ERROR: Problem writing TOC file to tape using dd"
abort
fi
# Get filename for each bff file in stack list
for fil in `cat ${WORK_STACK_LIST}.$volume`; do
echo "\n`basename $fil`"
dd if=$fil of=$DEV bs=$BLOCK_SIZE conv=sync
if [ $? != 0 ]; then
echo "\n$cmd: ERROR: Problem writing $fil file to tape using dd"
abort
fi
done
# After last file on tape, write an extra tape mark.
tctl -f$DEV weof
# Then rewind the tape.
tctl -f$DEV rewind
fi
# Increment the number of volumes
volume=`expr $volume + 1`
leadvol
# Get the next stack_list
if [ -f ${WORK_STACK_LIST}.$volume ]; then
if [ "$writetape" = "yes" ]; then
echo "\07\nMount volume $volume in $DEV and press enter"
read gorp
tctl -f$DEV rewind
fi
fi
done
# Graceful exit
if [ "$writetape" = "yes" ]; then
echo "\n$cmd SUCCESSFUL! Please remove tape from drive: /dev/$dev"
echo "\nTo get a copy of the table of contents you can use the command:"
echo " dd if=/dev/$dev of=table_of_contents fskip=2"
else
echo "\n$cmd SUCCESSFUL! NO Tape was written"
cp $VOLUME_TOC $TOC_DIR/toc.$WORK_DATE > /dev/null 2>&1
if [ $? != 0 ]; then
echo "\n$cmd: ERROR: Unable to write the toc file to $TOC_DIR"
abort
fi
VOLUME_NAME=`basename $VOLUME_TOC`
echo "\nNOTE: TOC file: $VOLUME_NAME.$WORK_DATE is now in $TOC_DIR"
fi
echo ""
cd $CURRENT_DIR
rm -rf ${WORK} > /dev/null 2>&1
exit 0