#!/bin/bash #.Y / 70 83 / / / / 105 / / / / / / ;A4_QUER.Y #.YT 3 2 0 0 3 3 1 / / / #.H!a!0:linux//io/tape_/THIS!0.!c # # copyright : (C) 2009 by Thomas Bruecker =: tbrue # email : public0x05bf@bluewin.ch # # tbrue 12jun2006 # # tape_ THIS : tape functions #++++++++++++++++++++++++++++ # # called without any parameters. # # MyHash("linux//io/tape_/THIS") = 0x0A87 # # * for every function: # * if returned result is not commented, the function returns 0 on no-error. # # * pendent: # * tape_vtblModify actually ok, but problems if name with spaces??? SCRIPTS=root/bin . /$SCRIPTS/io/f_/THIS . /$SCRIPTS/math/THIS tape_DeviceOk() # $1: device # * returns 0 if device is ok. { local Message0x0A87 if [ -x $(f_ToFinalTarget $1) ]; then # device is an executable # file. # if magic-number is ok: # get line# 5: # # get first 5 lines: # get last line of 5 lines: # match magic-number: if \ head -5 $1 | \ tail -1l - | \ grep -q "0xCB5853FF-382E-11DA-BABF-0000C00A45A9"; then return # device is ok; grep returns 0 on else # a match. Message0x0A87="invalid magic-number in '$1'." fi else Message0x0A87="file-type of '$1' is invalid." fi # else # else echo "$0 --> tape_DeviceOk: '$1' is not a character special file:" >&2 echo " $Message0x0A87" >&2 return 1 } tape_ASF() # $1: device, $2: count # * count = 0 --> first file=volume. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_asf $1 $2 # do it. return } tape_BadSectors() # $1: device { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_badSectors $1 # do it. return } tape_BS() # $1: device, $2: device-specifier in {N, NRAW, R, RAW} . # * set block-size. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_bs $1 $2 # do it. return } tape_CONTENTS() # $1: device. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_contents $1 # do it. return } tape_DDFrom() # $1: device, $2...: parameters # * dd with input=device --> output from tape. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_ddFrom $1 $* # do it. return } tape_ddParameterError() # $1: in {from, to}; from: fixed if, to: fixed of; $*: parameters. { local Selector0x0A87 Selector0x0A87=$1 shift 1 # parameter must not contain "bs=": echo $* | grep -q "bs=" if [ "$?" = "0" ]; then # some matching. echo "$0 --> tape_ddParameterError: parameters should not\ contain \"bs=\"." return 1 fi # else # reject according to "from", "to": case "$Selector0x0A87" in from) # parameter must not contain "if=": echo $* | grep -q "if=" if [ "$?" = "0" ]; then # some matching. echo "$0 --> tape_ddParameterError: parameters should\ not contain \"if=\"." return 1 fi # else # parameter must not contain "skip=": echo $* | grep -q "skip=" if [ "$?" = "0" ]; then # some matching. echo "$0 --> tape_ddParameterError: parameters should\ not contain \"skip=\"." return 1 fi # else ;; to) # parameter must not contain "of=": echo $* | grep -q "of=" if [ "$?" = "0" ]; then # some matching. echo "$0 --> tape_ddParameterError: parameters should\ not contain \"of=\"." return 1 fi # else # parameter must not contain "seek=": echo $* | grep -q "seek=" if [ "$?" = "0" ]; then # some matching. echo "$0 --> tape_ddParameterError: parameters should\ not contain \"seek=\"." return 1 fi # else ;; esac } tape_DDTo() # $1: device, $2...: parameters # * dd with output=device --> output to tape. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_ddTo $1 $* # do it. return } tape_DELETE() # $1: device. # * delete last file=volume . { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_delete $1 # do it. return } tape_EmptyQ() # Empty? # $1: device # * print # 0 to stdout if tape is empty. # 1 to stdout else. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_emptyQ $1 # do it. return } tape_EOM() # $1: device. # * advance to the end of recorded area, ready to append another # file=volume. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_eom $1 # do it. return } tape_ERASE() # $1: device. { local Answer0x0A87 echo -e "\nERASING THE TAPE :" echo " ALL DATA ON THE TAPE WILL BE DESTROYED !!!" echo " DO YOU REALLY WANT TO ERASE THE TAPE ?" echo " type \"yes\" to confirm erasing." read Answer0x0A87 if [ "$Answer0x0A87" != "yes" ]; then return; fi # else if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. echo "'$1' is beeing erased now." tape_erase $1 return } tape_FLF() # $1: device. # * advance to the begin of the last recorded file=volume. ready to read it. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_flf $1 # do it. return } tape_FORMAT120() # $1: device { local EmptyQ0x0A87 I0x0A87 Result0x0A87 if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. echo " check if '$1' is empty." EmptyQ0x0A87=$(tape_EmptyQ $1); Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else if [ $EmptyQ0x0A87 != "0" ]; then echo "$0 --> tape_FORMAT: strictly refusing to format a not-empty\ tape !!!" >&2 return 1 fi # else echo " retension '$1'." for (( I0x0A87 = 0; 5 > I0x08A7; I0x08A7++ )) do echo -n " $I0x08A7" tape_retension $1 done echo " rewind '$1'." tape_rewind $1 NRAW echo " format '$1'." tape_format120 $1 return } tape_GetBS() # $1: device. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_getBS $1 # do it. return } tape_QKDatVolume() #?KDatVolume # $1: device # * if tape is emtpy and if not already present, write the KDat file=volume # to the tape. { local EmptyQ0x0A87 Result0x0A87 # no need to test by "tape_DeviceOk", tested later by "tape_Empty?" . . $1 SCRIPT # get device-script. EmptyQ0x0A87=$(tape_EmptyQ $1); Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else if [ "$EmptyQ0x0A87" = "0" ]; then tape_asf $1 0 Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else echo " write kDatVolume." tape_ddTo $1 if=/etc/tape/kdat.id Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else tape_rewind $1 N Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else tape_vtblModify $1 KDatId # use current date. return fi # else return 0 } tape_MD5BlockSums() { echo $1 | mathMD5BlockSums } tape_md5sum() # $1: device. # * sum over current file=volume, print sum to stdout. { tape_ddFrom $1 | md5sum -b return } tape_MD5SUM() # $1: device. # * sum over current file=volume, print sum to stdout. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_md5sum $1 return } tape_RETENSION() # $1: device { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_retension $1 # do it. return } tape_REWIND() # $1: device, $2: device-specifier in {N, NRAW, R, RAW} . { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_rewind $1 $2 # do it. return } tape_SIZE() # print size of current file=volume to stdout. # $1 in { b,... } : unit, $2: device. { local Result0x0A87 Size0x0A87 if ! tape_DeviceOk $2; then return 1 # error message is done by fi # tape_DeviceOk . # else . $2 SCRIPT # get device-script. Size0x0A87=$(tape_size $2) Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else # if we are copying the current file=volume to somewhere, we want to grant # enough space on somewhere, so we round up --> "U" . mathToUnit $1 U $Size0x0A87 if [ $? -eq 2 ]; then # invalid unit. math_toUnitError "$0 --> tape_SIZE " "" TAPE-DEVICE return 1 fi # else return 0 } tape_SPACE() # print free space on tape to stdout. # $1 in { b,... } : unit, $2: device. { if ! tape_DeviceOk $2; then return 1 # error message is done by fi # tape_DeviceOk . # else . $2 SCRIPT # get device-script. tape_space $1 $2 # do it. return } tape_SpaceQ() # Space? # $1: source-file, $2: destination-tape-device. # * print # 0 to stdout if there is enough space for source-file on tape. # 1 to stdout else. { local Result0x0A87 TapeSpace0x0A87 SizeOfSource0x0A87 # no need to test by "tape_DeviceOk", tested later by "tape_SPACE" . . $2 SCRIPT # get device-script. SizeOfSource0x0A87=$(f_SIZE b $1) Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else TapeSpace0x0A87=$(tape_SPACE b $2) Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else if ! [ $TapeSpace0x0A87 -lt $SizeOfSource0x0A87 ]; then echo 0 else echo 1 fi return 0 } tape_STATISTICS() # $1: device { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_statistics $1 # do it. return } tape_STATUS() # $1: device. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_status $1 # do it. return } tape_ToTHIS() # $1: source-file, $2: destination-tape-device. # * copy source-file to new tape file=volume at the end of the tape. # * if source-file is a link, # * the name of the file=volume on the tape is the name of the link. # * the date and time of the file=volume on the tape is the date of the # actual file, pointed at by the link. { local Result0x0A87 SpaceQ0x0A87 TmpFile0x0A87 if ! tape_DeviceOk $2; then return 1 # error message is done by fi # tape_DeviceOk . # else . $2 SCRIPT # get device-script. if [ ! -d /mnt/tmpfs ]; then echo "$0 --> tape_ToThis: \"/mnt/tmpfs\" does not exist." return 1 fi # else echo -e " retension '$2'." tape_retension $2 # we should do it, the sour- Result0x0A87=$? # ce-file may be large. if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else # must be checked before space-checking, because the kDat-volume needs some # space too. echo -e " check for kDat-volume on '$2'." tape_QKDatVolume $2 Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else echo -e " check for enough space on '$2'." SpaceQ0x0A87=$(tape_SpaceQ $1 $2); # Space?0x0A87 Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else if [ $SpaceQ0x0A87 != "0" ]; then echo "$0 --> tape_ToThis: not enough space on '$2'." >&2 return 1 fi # else TmpFile0x0A87=$(mktemp /mnt/tmpfs/$1.XXXXXX) Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else echo -e "\n copy '$1' to '/mnt/tmpfs'." dd if=$1 of=$TmpFile0x0A87 bs=$(tape_getBS $2) Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else echo -e "\n copy from '/mnt/tmpfs' to '$2'." tape_eom $2 # move to free area. Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else tape_ddTo $2 if=$TmpFile0x0A87 Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else tape_statistics $2 > $1.wstat tape_rewind $2 N Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else rm -f $TmpFile0x0A87 Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else echo -e "\n adjust volume-table-entry." tape_vtblModify $2 $(f_PathToName $1) \ $( f_TimeTD $(f_ToFinalTarget $1) ) Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else # calculate md5-sum. echo -e "\n retension '$2'." tape_retension $2 Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else echo -e " calculate md5-sum." tape_flf $2 Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else tape_md5sum $2 > $1.md5 Result0x0A87=$? tape_statistics $2 > $1.rstat return $Result0x0A87 } tape_VERIFY() # $1: device { local EmptyQ0x0A87 Result0x0A87 if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. echo " check if '$1' is empty." EmptyQ0x0A87=$(tape_EmptyQ $1); Result0x0A87=$? if [ ! "$Result0x0A87" = "0" ]; then return $Result0x0A87; fi # else if [ $EmptyQ0x0A87 != "0" ]; then echo "$0 --> tape_VERIFY: strictly refusing to verify a not-empty\ tape !!!" >&2 return 1 fi # else echo " retension '$1'." tape_retension $1 echo " rewind '$1'." tape_rewind $1 NRAW echo " verify '$1'." tape_verify $1 return } tape_VTblModify() # $1: device, $2: name, $3, $4: date. # * modify the last entry of the volume-table. # * if $3... are not specified, modify to current date. { if ! tape_DeviceOk $1; then return 1 # error message is done by fi # tape_DeviceOk . # else . $1 SCRIPT # get device-script. tape_vtblModify $* # do it. return }