📄 gentapes
字号:
rm -f /tmp/RTLDD$$ return 0 else echo 1>&2 "Cannot read from $DEV:" cat 1>&2 /tmp/RTLDD$$; echo 1>&2 " " rm -f /tmp/RTLDD$$ return 1 fi ;;esacecho 1>&2 "?$FUNC: Unexpected return."return 1)}GT_Get_Arguments(){(FUNC=GT_Get_Argumentstest $DEBUG && echo 1>&2 "DEBUG: $FUNC($*)"WRITE=0 VFY=0 CHECK_ONLY=0 HOST= KITCODE= DEV= DEVTYPE= STAT=while : truedo case "$1" in -verify|-v*) VFY=1 shift ;; -write|-w*) WRITE=1 shift ;; -check_only|-c*) CHECK_ONLY=1 shift ;; -help|-h*) echo "${GENTAPES_USAGE}" | more 1>&2 return 1 ;; -*) (echo "$PROG.$FUNC: Invalid flag-- '$1'\n" echo "${GENTAPES_USAGE}") | more 1>&2 return 1 ;; *) break ;; esacdonecase "$WRITE$VFY" in 00) WRITE=1 VFY=1 ;;esacif [ $CHECK_ONLY -ne 0 ]then WRITE=1 VFY=0ficase $# in 2) DEV=$2 if file $DEV | grep -s "TK.*" > /dev/null || test "$DEV" = "/dev/null" then DEVTYPE="TK" else DEVTYPE="MT" fi test "$DEBUG" && echo 1>&2 "DEBUG: DEVTYPE=$DEVTYPE" eval `_U_Get_Hostname "$1"` || return 1 KITCODE="$REMAINDER" ;; *) (echo "?Invalid number of arguments ($#): $*\n" echo 1>&2 "${GENTAPES_USAGE}" ) | more 1>&2 return 1 ;;esacecho WRITE='"'$WRITE'"' VFY='"'$VFY'"' CHECK_ONLY='"'$CHECK_ONLY'"' \ HOST='"'$HOST'"' KITCODE='"'$KITCODE'"'\ DEV='"'$DEV'"' DEVTYPE='"'$DEVTYPE'"'return 0)}GT_Create_Kit() { (test $DEBUG && echo 1>&2 "DEBUG: GT_Create_Kit($*)") VERIFYLIST= OPNAME="Generating" if [ $CHECK_ONLY -ne 0 ] then OPNAME="Checking" fi DISPHOST=`echo $HOST | sed 's=\(.*/.*\)/.*=\1/password::='` case $THISVOL in "" | 0) echo 1>&2 "$OPNAME $KITCODE kit from $DISPHOST on $DEV" ;; *) echo 1>&2 "$OPNAME volume $THISVOL of $KITCODE from $DISPHOST on $DEV" ;; esac if [ $CHECK_ONLY -ne 0 ] then echo 1>&2 "Note: component existence check only. No kit will be made." fi if test ! "$DEV" = /dev/null then mt -f $DEV rew & echo 1>&2 rewind. fi if [ $CHECK_ONLY -eq 0 ] then echo 1>&2 "Write." fi PREVSUBSET= for K in $SUBSETLIST do case $K in %%*) # volume change if [ "$VFY" -ne 0 ] then NEXTVOL=`expr $K : '%%\(.*\)'` THISVOL=`expr $NEXTVOL - 1` GT_Verify_Tape fi VERIFYLIST= _U_Request_Device_Load $DEV "tape" \ "Mount $KITCODE volume $NEXTVOL on $DEV" write || exit 1 echo 1>&2 "Generating volume $NEXTVOL of $KITCODE" \ "from $DISPHOST on $DEV" continue ;; esac if [ $CHECK_ONLY -ne 0 ] then if [ "$PREVSUBSET" = "$K" ] then PREVSUBSET="$K" continue fi PREVSUBSET="$K" fi OFS="$IFS" IFS='|' set $K IFS="$OFS" IMAGE=$1 case "$2" in "") BS=20 ;; *) BS=$2 ;; esac echo 1>&2 "Image $IMAGE...\c" VERIFYLIST="$VERIFYLIST $K" wait case $PRODLIST in "" ) ;; * ) case $IMAGE in INSTCTRL ) FILEDIR=$MERGEDIR ;; * ) eval `_U_Find_Dir $HOST $IMAGE "$DIRELIST"` case $FILEDIR in "") echo 1>&2 "Cannot find $IMAGE in any of the" \ "following directories:" echo 1>&2 "$DIRELIST" case $HOST in *:) ;; *) exit 1 esac echo 1>&2 "\nTrying again. . ." eval `_U_Find_Dir $HOST $IMAGE "$DIRELIST"` case $FILEDIR in "") echo 1>&2 "\07 $IMAGE not found in" \ "any of the following" \ "directories:" echo 1>&2 "$DIRELIST" exit 1 ;; esac ;; esac ;; esac ;; esac if [ $CHECK_ONLY -eq 0 ] then if [ "$FILEDIR" = "$MERGEDIR" ] then echo "dd if=$FILEDIR/$IMAGE of=$DEV bs=${BS}b" > $DD_ERRS dd if=$FILEDIR/$IMAGE of=$DEV bs=${BS}b 2>> $DD_ERRS else for try in 1 2 3 4 0 do echo "_U_Remote_dd $DISPHOST $FILEDIR/$IMAGE" \ " $DEV 'obs=${BS}b'" > $DD_ERRS _U_Remote_dd $HOST $FILEDIR/$IMAGE \ $DEV "obs=${BS}b" 2>> $DD_ERRS || { echo 1>&2 "\nError on copy:" sed 1>&2 's/^/ /' $DD_ERRS if [ ! "$DEV" = /dev/null ] then mt -f $DEV bsf mt -f $DEV fsf echo 1>&2 "\nRepositioning tape to retry write." fi if [ $try -ne 0 ] then sleep `expr $try \* 5` echo 1>&2 "Retrying $IMAGE...\c" else try="error" echo 1>&2 "giving up." fi continue } break done test "$try" != "error" fi || { echo 1>&2 "\07Failed:" sed 1>&2 's/^/ /' $DD_ERRS rm $DD_ERRS exit 1 } if [ "$DEBUG" ] then cat $DD_ERRS fi rm $DD_ERRS echo 1>&2 "done.\n" else echo 1>&2 "exists.\n" fi done THISVOL=$NEXTVOL # Done with this volume STAT=0 }GT_Verify_Tape() { (test $DEBUG && echo 1>&2 "DEBUG: GT_Verify_Tape($*)") if [ "$VERIFYLIST" = "" ] then return 0 fi DISPHOST=`echo $HOST | sed 's=\(.*/.*\)/.*=\1/password::='` case $THISVOL in "" | 0) echo 1>&2 "Verifying $KITCODE kit from $DISPHOST on $DEV" ;; *) echo 1>&2 "Verifying volume $THISVOL of $KITCODE from $DISPHOST on $DEV" ;; esac if test ! "$DEV" = "/dev/null" then mt -f $DEV rew & echo 1>&2 rewind. fi STAT=1 # reset to failure, will set to success at end case $PRODLIST in "") FILELOC=$HOST ;; * ) FILEDIR=$MERGEDIR FILELOC=local ;; esac CODE=`expr $KITCODE : '\([A-Z0-9][A-Z0-9][A-Z0-9]\)'` _U_Remote_Copy $FILELOC $FILEDIR/$CODE.image \ $LCL_DIR/lcl_$CODE.image$$ || { echo 1>&2 "\07$PROG: error accessing checksum file." exit 1 } for V in $VERIFYLIST do case $V in %%*) # volume change NEXTVOL=`expr $V : '%%\(.*\)'` THISVOL=`expr $NEXTVOL - 1` _U_Request_Device_Load $DEV "tape" \ "Mount $KITCODE volume $NEXTVOL on $DEV" read || exit 1 echo 1>&2 "Verifying volume $THISVOL of $KITCODE" \ "from $DISPHOST on $DEV" continue ;; esac OFS="$IFS" IFS='|' set $V IFS="$OFS" IMAGE=$1 case "$2" in "") BS=20 ;; *) BS=$2 ;; esac echo 1>&2 "Image $IMAGE...\c" wait case $IMAGE in *TK50* ) case $PRODLIST in "") ;; * ) eval `_U_Find_Dir $HOST $IMAGE "$DIRELIST"`\ 2> $LCL_DIR/finderrs$$ ;; esac case $FILEDIR in "" ) echo 1>&2 "\n$PROG: source ${IMAGE} not found. Reason:" sed 's/^/ /' $LCL_DIR/finderrs$$ rm $LCL_DIR/finderrs$$ if test ! "$DEV" = "/dev/null" then mt -f $DEV fsf || { echo 1>&2 "\07Tape positioning error." exit 1 } fi ;; * ) rm $LCL_DIR/finderrs$$ SUM1=$LCL_DIR/sum_a$$ SUM2=$LCL_DIR/sum_b$$ echo "dd if=$DEV bs=${BS}b" > ${DD_ERRS}-b dd if=$DEV bs=${BS}b 2>> ${DD_ERRS}-b | sum > $SUM2 & for try in 1 2 3 4 0 do echo "_U_Remote_dd $DISPHOST $FILEDIR/$IMAGE" \ "obs=${BS}b" > $DD_ERRS _U_Remote_dd $HOST $FILEDIR/$IMAGE "" \ "obs=${BS}b" 2>> $DD_ERRS | sum > $SUM1 & if grep "dcp:" $DD_ERRS then echo 1>&2 "\nError in checksum calculation:" sed 1>&2 's/^/ /' $SUM1 $DD_ERRS if [ $try -ne 0 ] then sleep `expr $try \* 5` echo 1>&2 "Retrying calculation. . ." else try="error" echo 1>&2 "giving up." break fi continue else break # checksum is correct fi done wait if [ "$DEBUG" ] then echo "IMAGE DD_ERRS:" cat $DD_ERRS echo "\nDEV DD_ERRS:" cat $DD_ERRS-b fi set -- xxx `cat $SUM1` shift ISUM=$1 ISIZE=$2 set -- xxx `cat $SUM2` shift DSUM=$1 DSIZE=$2 case "$ISUM$ISIZE" in $DSUM$DSIZE) ;; *) echo 1>&2 "\n\07$PROG: Image $IMAGE checksum" \ "does not match device checksum:\n" \ " $ISUM != $DSUM or\n" \ " $ISIZE != $DSIZE" echo 1>&2 "Verify failed!!\nExtra info:" \ "\nImage:" sed 1>&2 's/^/ /' $DD_ERRS echo 1>&2 "\nDevice:" sed 1>&2 's/^/ /' ${DD_ERRS}-b rm $DD_ERRS ${DD_ERRS}-b $SUM1 $SUM2 exit 1 ;; esac rm $DD_ERRS ${DD_ERRS}-b $SUM1 $SUM2 ;; esac echo 1>&2 "done." continue ;; esac grep $V $LCL_DIR/lcl_$CODE.image$$ > $LCL_DIR/sum$V$$ || { case $V in ROOT | [A-Z0-9][A-Z0-9][A-Z0-9]*[0-9][0-9][0-9]) echo 1>&2 "\nWarning: No checksum entry found for" \ "subset $V" ;; esac if test ! "$DEV" = "/dev/null" then mt -f $DEV fsf || { echo 1>&2 "\n\07Tape positioning error." exit } fi echo 1>&2 "done." continue } set XXX `cat $LCL_DIR/sum$V$$` shift SUM=$1 SIZE=$2 dd if=$DEV bs=${BS}b rbuf=0 2> $DD_ERRS | sum > $LCL_DIR/SUM$$ || { echo 1>&2 "\n\07$PROG: checksum error image $V." cat 1>&2 $DD_ERRS rm $DD_ERRS exit } test "$DEBUG" && { echo "\nDD_ERRS$$ file:" cat $DD_ERRS echo "\nDEBUG: kit sum file, $LCL_DIR/sum$V$$ is:" cat $LCL_DIR/sum$V$$ echo "DEBUG: sum file, $LCL_DIR/SUM$$ is:" cat $LCL_DIR/SUM$$ } rm $DD_ERRS set XXX `cat $LCL_DIR/SUM$$` shift DEVSUM=$1 DEVSIZE=$2 case "$DEVSUM$DEVSIZE" in $SUM$SIZE) ;; *) echo 1>&2 "\n\07$PROG: Image file checksum for $IMAGE does" \ "not match device checksum:\n" \ " $SUM != $DEVSUM or\n" \ " $SIZE != $DEVSIZE" exit esac rm -f $LCL_DIR/sum$V$$ rm -f $LCL_DIR/SUM$$ echo 1>&2 "done.\n" done echo 1>&2 rewind. if test ! "$DEV" = "/dev/null" then mt -f $DEV rew fi STAT=0 # Successful, conclusion }Gentapes_Mainline(){PROG=`basename $0`umask 022 # allow no group or world write accessSTAT=1 # assume failure, unless explicitly set to successTAPEDEV="mt" # for DEC: productionTHISVOL=0 NEXTVOL=LCL_DIR=/usr/tmpLCL_KITCAP=$LCL_DIR/lcl_kitcap$$DD_ERRS=$LCL_DIR/dd_errors$$MERGEDIR=${GENTAPE_MERGEDIR:-"/usr/tmp/merge"$$}WORKDIR=${GENTAPE_WORKDIR:-"$MERGEDIR/instctrl"}REM_KITCAP=${KITCAP_LOCATION:-"/etc/kitcap"}KITROOT=${KITCAP_KITROOT:-""}DEBUG=${GENTAPE_DEBUG-""}COMPLIST=PRODLIST=PRODCODE=DIRELIST=SUBSETLIST=STAT=1 # assume failuretrap ' exit $STAT' 0 1 2 3 15WRITE=0 VFY=0 HOST= KITCODE= DEV= DEVTYPE=eval `GT_Get_Arguments $*` || exit 1 # exit on failuretrap ' echo 1>&2 "Cleaning up. . ." rm -rf $MERGEDIR $WORKDIR $LCL_DIR/*$$ case $STAT in 0) echo 1>&2 "Operation successfully concluded" ;; *) echo 1>&2 "Error during operation" ;; esac exit $STAT' 0 1 2 3 15_K_Get_Local_Kitcap $HOST $REM_KITCAP $LCL_KITCAP $KITROOT || exit 1test -w $DEV || { echo 1>&2 "\07No write access to $DEV" exit 1 }case $DEV in /dev/null) ;; *) UD=`expr $DEV : '.*'${TAPEDEV}'\([0-9][0-9]*.*\)'` DEV=/dev/nr${TAPEDEV}$UD ;;esactest $DEBUG && echo 1>&2 "DEBUG: UD=$UD DEV=$DEV"if [ "$WRITE" -eq 1 ]then echo "Writeable?" | dd of=$DEV bs=1b conv=sync 2> /dev/null || { _U_Request_Device_Load $DEV "tape" \ "\nPlease mount a write-enabled volume 1 of $KITCODE on $DEV" \ write || exit 1 }else dd if=$DEV of=/dev/null bs=1b 2> /dev/null || { _U_Request_Device_Load $DEV "tape" \ "\nPlease mount volume 1 of $KITCODE on $DEV" read || exit 1 }fiK_NAME= NEWIMAGE= KITDESC= PRODLIST= KITDIRS= SUBSETLIST= NVOLS=eval `_K_Interpret_Kitcap "${KITCODE}${DEVTYPE}" "$LCL_KITCAP"` || exit 1set xxx $PRODLISTcase $# in 1 ) test $DEBUG && echo 1>&2 "DEBUG: we are a single product" PRODLIST=$KITCODE ;; * ) test $DEBUG && echo 1>&2 "DEBUG: we are a multiple products" ;;esacmkdir $MERGEDIRmkdir $WORKDIRcd $WORKDIRDIRELIST=if eval `_K_Unpack_Instctrls $HOST $KITCODE $LCL_KITCAP $DEVTYPE "$PRODLIST"`then if test "$DIRELIST" then _K_Image_Merge $NEWIMAGE "$SUBSETLIST" || exit 1 else echo 1>&2 "$PROG: DIRELIST is null. Internal error." exit 1 fielse exit 1ficase $WRITE$VFY in 01 ) # Verify only, set VERIFYLIST to all subsets VERIFYLIST=$SUBSETLIST GT_Verify_Tape || exit 1 ;; 10) # Create only, skip verify pass _K_Product_Merge $NEWIMAGE "$K_NAME" "$SUBSETLIST" || exit 1 GT_Create_Kit || exit 1 ;; 11) # Create & Verify, verify the current VERIFYLIST only _K_Product_Merge $NEWIMAGE "$K_NAME" "$SUBSETLIST" || exit 1 GT_Create_Kit || exit 1 GT_Verify_Tape || exit 1 ;; *) echo 1>&2 "$PROG: Internal error. " \ "Unexpected values for WRITE (=$WRITE) and/or VFY (=$VFY)" exit 1 ;;esacif [ $CHECK_ONLY -ne 0 ]then echo 1>&2 "Check of \c"fiecho 1>&2 "\07Kit $KITCODE done."exit $STAT}case $GENTAPES_NO_EXECUTE in "") Gentapes_Mainline $* ;;esac
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -