223 lines
4.7 KiB
Bash
223 lines
4.7 KiB
Bash
#! /bin/sh
|
|
#
|
|
# @(#)extract_release.sh 1.1 94/10/31 SMI
|
|
#
|
|
# Copyright (c) 1985 by Sun Microsystems, Inc.
|
|
#
|
|
|
|
HOME=/; export HOME
|
|
PATH=/bin:/usr/bin:/etc:/usr/etc:/usr/ucb
|
|
|
|
CMDNAME=$0
|
|
|
|
USAGE="
|
|
usage: ${CMDNAME} tape type keywords...
|
|
|
|
where:
|
|
tape = \"ar\" or \"st\" or \"mt\" or \"xt\"
|
|
|
|
type = \"tapefull\" or \"tapeless \`server_name'\"
|
|
|
|
keywords = \"kernel\" \"network\" \"debuggers\"
|
|
\"suntools_users\" \"suntools_programmers\"
|
|
\"src\" \"text_tools\" \"setup\"
|
|
\"stand_diag\" \"fortran\" \"usr_diag\"
|
|
\"graphics\" \"pascal\" \"profiled\"
|
|
\"uucp\" \"system_v\" \"man\" \"demo\"
|
|
\"games\" \"vtroff\"
|
|
|
|
"
|
|
|
|
if [ "`whoami`" != "root" ]; then
|
|
echo "${CMDNAME}: Must be run as root (super-user)."
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$#" -lt 3 ]; then
|
|
|
|
echo "${CMDNAME}: Incorrect number of arguments."
|
|
echo "${USAGE}"
|
|
exit 1
|
|
|
|
else
|
|
|
|
TAPE=${1}; shift
|
|
if [ "$TAPE" = "ar" -o "$TAPE" = "st" ]; then
|
|
BS=200
|
|
elif [ "$TAPE" = "mt" -o "$TAPE" = "xt" ]; then
|
|
BS=20
|
|
else
|
|
echo "${CMDNAME}: Bad argument \"${TAPE}\"."
|
|
echo "${USAGE}"
|
|
exit 1
|
|
fi
|
|
|
|
TYPE=${1}; shift
|
|
if [ "$TYPE" = "tapeless" ]; then
|
|
SERVER=${1}; shift
|
|
if rsh ${SERVER} -n date >/dev/null; then
|
|
:
|
|
else
|
|
echo "${CMDNAME}: Cannot talk to server ${SERVER}."
|
|
exit 1
|
|
fi
|
|
elif [ "$TYPE" = "tapefull" ]; then
|
|
:
|
|
else
|
|
echo "${CMDNAME}: Unknown type specified."
|
|
echo "${USAGE}"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "${1}" ]; then
|
|
echo "${CMDNAME}: No keywords specified."
|
|
echo "${USAGE}"
|
|
exit 1
|
|
fi
|
|
|
|
fi
|
|
|
|
#
|
|
# Format is name="tape number,[file system, tape file number]*".
|
|
# The entire "name" must be on the same tape.
|
|
#
|
|
if [ "$TAPE" = "ar" -o "$TAPE" = "st" ]; then
|
|
kernel="2,usr,3"
|
|
network="2,usr,4"
|
|
debuggers="2,usr,5"
|
|
suntools_users="3,usr,3"
|
|
suntools_programmers="3,usr,4"
|
|
src="3,usr,5"
|
|
text_tools="3,usr,6"
|
|
setup="3,usr,7"
|
|
stand_diag="3,usr,8"
|
|
fortran="3,usr,9"
|
|
usr_diag="3,usr,10"
|
|
graphics="3,usr,11"
|
|
pascal="3,usr,12"
|
|
profiled="3,usr,13"
|
|
uucp="3,usr,14"
|
|
system_v="4,usr,3"
|
|
man="4,usr,4"
|
|
demo="4,usr,5"
|
|
games="4,usr,6"
|
|
vtroff="4,usr,7"
|
|
fi
|
|
if [ "$TAPE" = "mt" -o "$TAPE" = "xt" ]; then
|
|
kernel="1,usr,10"
|
|
network="1,usr,11"
|
|
debuggers="1,usr,12"
|
|
suntools_users="2,usr,3"
|
|
suntools_programmers="2,usr,4"
|
|
src="2,usr,5"
|
|
text_tools="2,usr,6"
|
|
setup="2,usr,7"
|
|
stand_diag="2,usr,8"
|
|
fortran="2,usr,9"
|
|
usr_diag="2,usr,10"
|
|
graphics="2,usr,11"
|
|
pascal="2,usr,12"
|
|
profiled="2,usr,13"
|
|
uucp="2,usr,14"
|
|
system_v="3,usr,3"
|
|
man="3,usr,4"
|
|
demo="3,usr,5"
|
|
games="3,usr,6"
|
|
vtroff="3,usr,7"
|
|
fi
|
|
|
|
TAPENUM=0
|
|
|
|
KEYWORD=${1}
|
|
while [ -n "${KEYWORD}" ]; do
|
|
|
|
INFO=`eval echo '$'${KEYWORD}`
|
|
if [ -z "${INFO}" ]; then
|
|
echo "${CMDNAME}: Unknown keyword ${KEYWORD}."
|
|
shift; KEYWORD=${1}
|
|
continue
|
|
fi
|
|
NEWTAPENUM=`echo ${INFO} | awk '{FS=","; print $1}'`
|
|
|
|
if [ "${NEWTAPENUM}" != "${TAPENUM}" ]; then
|
|
|
|
TAPENUM=${NEWTAPENUM}
|
|
|
|
REALTAPENUM=${TAPENUM}
|
|
|
|
if [ "${TYPE}" = "tapefull" ]; then
|
|
|
|
echo -n "${CMDNAME}: Load \"${TAPE}\" release tape #${REALTAPENUM}, then press RETURN."
|
|
read x
|
|
|
|
if mt -f /dev/nr${TAPE}0 rew; then
|
|
:
|
|
else
|
|
echo "${CMDNAME}: Tape /dev/r${TAPE}0 not ready."
|
|
fi
|
|
|
|
elif [ "${TYPE}" = "tapeless" ]; then
|
|
|
|
echo -n "${CMDNAME}: Load \"${TAPE}\" release tape #${REALTAPENUM} on server ${SERVER}, then press RETURN."
|
|
read x
|
|
|
|
#
|
|
# No way to get exit code from command executed with
|
|
# rsh, so test if the mt -f returns an error msg, if
|
|
# the mt -f was successful it should be silent
|
|
#
|
|
STRING=`rsh ${SERVER} -n mt -f /dev/nr${TAPE}0 rew 2>&1`
|
|
if [ -n "$STRING" ]; then
|
|
echo "${STRING}"
|
|
echo "${CMDNAME}: Tape /dev/r${TAPE}0 on ${SERVER} not ready."
|
|
exit 1
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
echo "${CMDNAME}: Extracting ${KEYWORD} files from \"${TAPE}\" release tape #${REALTAPENUM}."
|
|
|
|
COUNT=2
|
|
while true; do
|
|
|
|
DIR=`echo ${INFO} | awk '{FS=","; print $'${COUNT}'}'`
|
|
COUNT=`expr ${COUNT} + 1`
|
|
FILE=`echo ${INFO} | awk '{FS=","; print $'${COUNT}'}'`
|
|
COUNT=`expr ${COUNT} + 1`
|
|
|
|
if [ -z "${DIR}" -o -z "${FILE}" ]; then
|
|
break
|
|
fi
|
|
|
|
if [ "${DIR}" = "root" ]; then
|
|
echo "Changing directory to \"/\"."
|
|
cd /
|
|
else
|
|
echo "Changing directory to \"/usr\"."
|
|
cd /usr
|
|
fi
|
|
|
|
SKIPFILE=`expr ${FILE} - 1`
|
|
|
|
if [ "${TYPE}" = "tapefull" ]; then
|
|
mt -f /dev/nr${TAPE}0 rew
|
|
mt -f /dev/nr${TAPE}0 fsf ${SKIPFILE}
|
|
tar xvpbf ${BS} /dev/nr${TAPE}0
|
|
mt -f /dev/nr${TAPE}0 rew
|
|
elif [ "${TYPE}" = "tapeless" ]; then
|
|
rsh ${SERVER} -n "mt -f /dev/nr${TAPE}0 rew"
|
|
rsh ${SERVER} -n "mt -f /dev/nr${TAPE}0 fsf ${SKIPFILE}"
|
|
rsh ${SERVER} -n "dd if=/dev/nr${TAPE}0 bs=${BS}b"|tar xvpBf -
|
|
rsh ${SERVER} -n "mt -f /dev/nr${TAPE}0 rew"
|
|
fi
|
|
|
|
done
|
|
|
|
shift; KEYWORD=${1}
|
|
|
|
done
|
|
|
|
echo "${CMDNAME}: End of file extract."
|