#!/bin/ksh -
#
# @(#)mk-afs-readtape	1.12 (hursley) 11/1/96
# /afs/hursley.ibm.com/common/src/afs/@cell/rs_aix32/usr/local/sbin/mk-afs-readtape/SCCS/s.mk-afs-readtape
#
# NAME		mk-afs-readtape
# AUTHOR	Paul Blackburn <mpb@acm.org>
# PURPOSE	Read in Transarc AFS distribution tape.
#		Create compressed tar archives ready for other mk-afs* tools.
# USAGE		Normally invoked once to create network install files.
#		Should be run by root.
# NOTES		conventionally: /vol/afs${ver}/tapeimages/@sys (see usage)

CMD=$(basename ${0})

NEED=24

usage() {

cat <<eeooff
Usage: ${CMD} [tape-device-name]
Reads in a Transarc binary distribution tape to create compressed tar images
in the current directory (where you need a minimum of ${NEED}MB free).
eeooff
}

if [ "${1}" = "-?" -o "${1}" = "-help" ]; then
	usage
	exit
fi

# Must have 1 argument...                                         (:-)

if [ -z "${1}" ]; then
	echo  "${CMD} error: no device specified" >&2
	usage
	exit 1
fi

X=${afs_install_base}/usr/local/sbin/mk-afs-cf

if [[ ! -f ${X} ]]; then
	echo "fatal error: ${X} not found" >&2
	exit 1
fi

# source global config for afs installation

. ${X}

TAPEBLKSZ=/tmp/tapeblksz.$$

# traps

trap "echo interrupted; rm -f ${TAPEBLKSZ}; exit 1" 1 2 3 15
trap "rm -f ${TAPEBLKSZ}; exit" 0

# main

tstamp "version 1.12 commenced on `date '+%a %d %h %y'`"

tstamp "check we have ${NEED}MB free in current directory"
FS=.; FREE=`df ${FS} | tail -1 | awk '{print int($3/1024)}'`

if [ "${FREE}" -lt ${NEED} ]; then
	fatal "not enough space! Need at least ${NEED}MB free in ${FS}"
else
	tstamp "OK, we have ${FREE}MB free in ${FS}"
fi

tstamp "check device name"

DEVICE=${1}

if [ `expr "$DEVICE" : "[/]"` -eq 0 ]; then
	fatal "device name must begin with a \"/\""
fi

case "$DEVICE" in
	/dev/rmt[0-9]*)
		tstamp "DEVICE=${DEVICE}"
                # see if a low or high density tape device was specified
                # (eg rmt0.1)
                density="`expr $DEVICE : \
			"/dev/rmt[0-9]*\.\([0-9]*\)"`"
		tstamp "density=${density}"

                # strip /dev/ from device name and get the base name
		# (eg translate: /dev/rmt0.2 to rmt0)

                tapedev="`expr $DEVICE : \
			"/dev/\(rmt[0-9]*\)[\.]*[0-9]*"`"
		tstamp "tapedev=${tapedev}"

                # change device to 0 tape block size

                X="lsattr -E -O -a block_size"
                oldblksize=`${X} -l $tapedev | grep -v block_size`
                oldblksize=${oldblksize:-512}
                echo $oldblksize > $TAPEBLKSZ
                doit "/usr/lib/methods/ucfgdevice -l $tapedev"
                doit "/usr/lib/methods/chggen -l $tapedev -a block_size=0"
                doit "/usr/lib/methods/cfgsctape -l $tapedev"
                [ "${density:-1}" -lt 4 ] && density=1 || density=5
                DEVICE="/dev/${tapedev}.${density}"
		tstamp "DEVICE=${DEVICE}"
                ;;
esac

doit "pwd"

tstamp "Read in tape images from tape"

for i in 1 2 3 4 5 6; do
	doit "mkdir set${i}"
	tstamp "cd set${i}"
	cd set${i}
	doit "tar -xvf ${DEVICE}"
	tstamp "cd .."
	cd ..
	doit "chown -R bin set${i}; chgrp -R bin set${i}"
	doit "cd set${i}; tar cf - . | compress > ../set${i}.tar.Z; cd .."
	doit "rm -rf set${i}"
	doit "chown bin set${i}.tar.Z; chgrp bin set${i}.tar.Z"
done

tstamp "reset tape device to tape block size preset by user"
if [ $oldblksize -ne 0 ]; then
	doit "/usr/lib/methods/ucfgdevice -l $tapedev"
	doit "/usr/lib/methods/chggen -l $tapedev \
		-a block_size=${oldblksize:-0}"
	doit "/usr/lib/methods/cfgsctape -l $tapedev"
	doit "tctl -f $DEVICE rewind"   # wait for tape to rewind
fi

tstamp "compute space required for compressed tar images"

BLOCKS=`du -k -s set?.tar.Z | awk '{kb+=$1}
END {
	pp=kb/4096
	if ( kb%4096 != 0 ) pp++
	b=8192*pp
	printf("%d\n",b)
}'`

tstamp "crfs -v jfs -g\$VG -asize=${BLOCKS} -m/vol/afs -Ayes -prw"

tstamp "completed"
