I didn't since there wasn't anything in the changelog for 2.4.2p1 that said 
it was updated, and since it errored out for me in the same fashion as the one
I used, I assumed it hadn't changed.  My bad for assuming, I guess.

I will migrate mine to the newer version this coming week.  By the way, what was the 
First of which?


On Sun, 11 Feb 2001, Joe Rhett wrote:

> Second of which, why don't you match this patch relative to the latest
> version of chg-zd-mtx, which fixes lots of the error handling. Your script
> retains 90% of the bugs of the original version.
> 
> An updated version of the .sh.in file is at
>       http://www.noc.isite.net/?Projects
> 
> On Fri, Feb 09, 2001 at 11:38:45AM -0500, Jason Hollinden wrote:
> > Note: This has only been tested on an ADIC Scalar 100.  If you find
> > something broken, or not clearly commented, tell me.  Also, this is my
> > 1st public showing of any code, so please, be gentle... ;)
> > 
> > The attached file is a replacement for chg-zd-mtx.  I have added support
> > for barcode readers, and also for libraries between 1-999 slots (I
> > would so love to hear from someone that has a honking big library like
> > that say it works).  All amanda utils can work with this for barcode
> > database lookups (amcheck can load the appropriate tape all by itself,
> > etc.)
> > 
> > The main thing to do it be sure to update the barcode database after any
> > new tapes are added, or removed from cycle.  To do this, make a backup
> > of the old barcodes file, then run 'amtape <conf> update'.  This will
> > cycle through all your tape slots, and put them in your barcodes file
> > like this:
> > 
> > <tape amlabel> <barcode>
> > 
> > Be sure to modify the top part of the script to fit your needs, and also 
> > check out the comments on what 'mt status' should return for your tape
> > device.
> > 
> > 
> > Some changes to come:
> > 
> > - make it completely independent of what slot the tapes are in, since
> >   certain loaders may unload to the wrong slot depending on circumstances.
> > 
> > - Better error handling, which right now is crappy to say the least.
> > 
> > - Anything brought ot my attention by you peoples
> > 
> > Enjoy...
> > 
> > --
> >    Jason Hollinden
> > 
> >    SMG Systems Admin
> 
> > #!/bin/sh
> > #
> > # Exit Status:
> > # 0 Alles Ok
> > # 1 Illegal Request
> > # 2 Fatal Error
> > #
> > # Contributed by Eric DOUTRELEAU <[EMAIL PROTECTED]>
> > # This is supposed to work with Zubkoff/Dandelion version of mtx
> > #
> > # Modified by Joe Rhett <[EMAIL PROTECTED]>
> > # to work with MTX 1.2.9 by Eric Lee Green http://mtx.sourceforge.net
> > #
> > # Modified by Jason Hollinden <[EMAIL PROTECTED]> on 6-Feb-2001
> > # to work with MTX 1.2.10, up to 999 slots, and added barcode support.
> > # NOTE:  Only tested the 2 additions with an ADIC Scalar 100.
> > # All my additions have a '#### Comment' close by.
> > 
> > # You may need to customize these things
> > MT=/bin/mt
> > MTF=-f
> > MTX=/sbin/mtx
> > DD=/bin/dd
> > firstslot=2
> > lastslot=9
> > #### Clean function just loads the tape, and may not necessarily eject it.
> > #### If not, just issue an eject afterwards.
> > cleanslot=31
> > accessbeforeclean=119
> > 
> > #### If you have a barcode reader, set to 1.  Otherwise set to 0.
> > havereader=1
> > 
> > #### Email of who should get severe library errors, and mailer to use.
> > #### All other errors are in the $DBGFILE.
> > [EMAIL PROTECTED]
> > mailer=/bin/mail
> > 
> > #### Check the 'readyError' section if mt acts differently for you 
> > #### as stated below.
> > #### See the 'readstatus' section below if using a different drive than 0.
> > 
> > ########## No (hopefully) user-level customized required beyond this point.
> > 
> > 
> > # try to hit all the possibilities here
> > prefix=/opt/amanda
> > exec_prefix=${prefix}
> > sbindir=${exec_prefix}/sbin
> > libexecdir=${exec_prefix}/libexec
> >      
> > PATH=$sbindir:$libexecdir:/usr/bin:/bin:/usr/sbin:/sbin:/usr/ucb:/usr/local/bin
> > export PATH
> >      
> > if [ -d "/tmp/amanda" ]; then
> >         DBGFILE=/tmp/amanda/changer.debug
> > else
> >         DBGFILE=/dev/null
> > fi
> >      
> > USE_VERSION_SUFFIXES="no"
> > if test "$USE_VERSION_SUFFIXES" = "yes"; then
> >         SUF="-2.4.2b2"
> > else
> >         SUF=
> > fi
> >     
> > myname=$0
> > tape=`amgetconf$SUF tapedev`
> > TAPE=`amgetconf$SUF changerdev`; export TAPE # for mtx command
> > if [ "$tape" = "/dev/null" -o "$TAPE" = "/dev/null" ]; then
> >         echo "Both tapedev and changerdev must be specified in config file";
> >         exit 2;
> > fi
> > 
> > changerfile=`amgetconf$SUF changerfile`
> > 
> > cleanfile=$changerfile-clean
> > accessfile=$changerfile-access
> > slotfile=$changerfile-slot
> > labelfile=$changerfile-barcodes
> > [ ! -f $cleanfile ] && echo 0 > $cleanfile
> > [ ! -f $accessfile ] && echo 0 > $accessfile
> > [ ! -f $slotfile ] && echo 0 > $slotfile
> > [ ! -f $labelfile ] && echo 0 > $labelfile
> > cleancount=`cat $cleanfile`
> > accesscount=`cat $accessfile`
> > 
> > # Routines start here
> > #### If using a different drive than /dev/nst0 (or whatever your OS 
> > #### calls the 0'th drive) change the 'Data Transfer Element 0' (there 
> > #### are 5 below) to 'Data Transfer Element #' where # = /dev/nst# 
> > #### (or whatever for your OS).
> > 
> > readstatus() {
> >     tmpslot=`$MTX status | grep "Data Transfer Element 0"`
> > 
> >     #### The horrid sed statement below returns the slot number.
> >         #### The origional was in shell script, so I didn't want to change that, 
> >         #### Which give the below puke for a number between 1-999.
> >                     
> >         usedslot=`echo $tmpslot |
> >             sed -n 's/Data Transfer Element 0:Empty/-1/p;s/Data Transfer Element 
>0:Full (Storage Element \(\([1-9]\)\|\([1-9][0-9]\)\|\([1-9][0-9][0-9]\)\) 
>Loaded)\(.*\)/\1/p'`
> >     barcode=`echo $tmpslot | 
> >             sed -n 's/Data Transfer Element 0:Empty/-1/p;s/Data Transfer Element 
>0:Full (Storage Element \(.\) Loaded):VolumeTag = \(.*\)/\2/p'`
> >         if [ "$usedslot" -eq "-1" ]; then
> >                 echo '-1' > $slotfile
> >         fi
> >         echo "STATUS -> currently loaded slot = $usedslot" >> $DBGFILE
> > }
> >    
> > 
> > eject() {
> >         readstatus
> >         echo "EJECT -> ejecting tape from slot $usedslot" >> $DBGFILE
> >         if [ $usedslot -gt 0 ]; then
> >                 $MTX unload $usedslot 2>/dev/null
> >                 echo "0 $tape"
> >                 exit 0
> >         else
> >                 echo "0 Drive was not loaded"
> >                 exit 1
> >         fi
> > }
> > 
> > reset() {
> >         readstatus
> >         if [ $usedslot -gt 0 ]; then
> >                 echo "RESET -> ejecting tape from slot $usedslot" >> $DBGFILE
> >                 $MTX unload $usedslot 2>/dev/null
> >         fi
> > 
> >         echo "RESET -> loading tape from slot 1" >> $DBGFILE
> >         result=`$MTX load 1 2>&1`
> >         if [ $? -eq 0 ]; then
> >                 echo "1 $tape"
> >                 exit 0
> >         else
> >                 echo "1 $result"
> >                 exit 1
> >         fi
> > }
> > 
> > loadslot() {
> >         readstatus
> > 
> >         whichslot=$1
> > 
> >         echo "LOADSLOT -> load tape from slot $whichslot" >> $DBGFILE
> >         case $whichslot in
> >                 $[${whichslot}])
> > 
> >                     if [ $whichslot -gt $lastslot ] || [ $whichslot -lt $firstslot 
>]; then
> >                             echo "0 Slot $whichslot is out of range ($firstslot - 
>$lastslot)"
> >                             exit 1
> >                             else
> >                             loadslot=$whichslot
> >                     fi
> >                     ;;
> >                 current)
> >                         if [ $usedslot -lt 0 ]; then
> >                                 loadslot=$firstslot
> >                         else
> >                                 echo "$usedslot $tape"
> >                                 exit 0
> >                         fi
> >                         ;;
> >                 next|advance)
> >                         if [ $usedslot -lt 0 ]; then
> >                                 loadslot=$firstslot
> >                         else
> >                                 loadslot=`expr $usedslot + 1`
> >                                 if [ $loadslot -gt $lastslot ]; then
> >                                         loadslot=$firstslot
> >                                 fi
> >                         fi
> >                         ;;
> >                 prev)
> >                         loadslot=`expr $usedslot - 1`
> >                         if [ $loadslot -lt $firstslot ]; then
> >                                 loadslot=$lastslot
> >                         fi
> >                         ;;
> >                 first)
> >                         loadslot=$firstslot
> >                         ;;
> >                 last)
> >                         loadslot=$lastslot
> >                         ;;
> >             clean)
> >                     loadslot=$cleanslot
> >                     ;;
> >                 *)
> >                         echo "0 illegal request"
> >                         exit 1
> >                         ;;
> >         esac
> >         
> >         # Is this already the current slot?
> >         if [ $loadslot = $usedslot ]; then
> >                 echo "$usedslot $tape"
> >                 exit 0
> >         fi
> >         
> >         # Is this a cleaning request?
> >         if [ $loadslot = $cleanslot ]; then
> >                 expr $cleancount + 1 > $cleanfile
> >                 echo 0 > $accessfile
> >         else
> >                 expr $accesscount + 1 > $accessfile
> >                 if [ $accesscount -gt $accessbeforeclean ]; then
> >                         $myname -slot clean >/dev/null
> > 
> >                         # Slot $cleanslot might contain an ordinary tape rather 
>than a cleaning
> >                         # tape. A cleaning tape *MIGHT* auto-eject; an ordinary 
>tape does not.
> >                         # We therefore have to read the status again to check what 
>actually happened.
> >                         readstatus
> >                 fi
> >         fi
> >         
> >         # Unload any previous tape
> >         if [ $usedslot -ne "-1" ]; then
> >                 echo "         -> unload $usedslot" >> $DBGFILE
> >                 result=`$MTX unload $usedslot 2>&1`
> >                 status=$?
> >                 echo "         -> status $status, result '$result'" >> $DBGFILE
> >                 if [ $status -ne 0 ]; then
> >                         echo "$loadslot $result"
> >                         exit 2
> >                 fi
> >         fi
> >                         
> >         # Load the tape, finally!
> >         echo "         -> loading tape from slot $loadslot" >> $DBGFILE
> >         result=`$MTX load $loadslot 2>&1`
> >         status=$?
> >         echo "         -> status $status, result '$result'" >> $DBGFILE
> >                         
> >         # If there is an error, abort unless the slot is simply empty
> >         if [ $status -ne 0 ]; then
> >                 empty=`echo $result | grep "Empty"`
> >                 if [ -z "$empty" ]; then
> >                         echo "$loadslot $result"
> >                         exit 2
> >                 else
> >                         loadslot next
> >                 fi
> >         else
> >                 #### The origional test if the drive is offline.  This depends on 
>what
> >                 #### 'mt -f <device> status returns different between being 
>offline and
> >                 #### online.  Aparently some drives report an 'offline' when 
>offline, and
> >                 #### it goes away when online.
> >             #readyError="offline"
> >                 #while [ -n "$readyError" ]; do
> >                 #        readyStatus=`$MT $MTF $tape status 2>&1`
> >                 #        readyError=`echo $readyStatus | grep "offline"`
> >                 
> >             #### ADIC doesn't report an 'offline', rather an 'ONLINE' when it's up.
> >                 #### Don't assume the drive is ready until we get an ONLINE
> >             readyError=""
> >                 while [ -z "$readyError" ]; do
> >                         readyStatus=`$MT $MTF $tape status 2>&1`
> >                         readyError=`echo $readyStatus | grep "ONLINE"`
> >                 done
> >                 echo "         -> readyStatus = $readyStatus" >> $DBGFILE
> >                         
> >                 # Now rewind and check
> >                 echo "         -> rewind $loadslot" >> $DBGFILE
> >                 $MT $MTF $tape rewind
> >                 echo "$loadslot" > $slotfile
> >                 echo "$loadslot $tape"
> >                 exit 0
> >         fi
> > }       
> > 
> > info() {
> >         readstatus
> >         echo "INFO -> current slot $usedslot, last slot $lastslot, can go 
>backwards 1" >> $DBGFILE
> >     #### Checks if you have a barcode reader or not.  If so, it passes the 4th 
>item in the echo
> >     #### back to amtape signifying it can search based on barcodes.
> >     if [ $havereader -eq 1 ]; then
> >             if [ $usedslot -lt 0 ]; then
> >                     #### added a variable to the end of the following 2 echos.  
>This indicates to amtape that 
> >                     #### it can/cannot read barcodes.
> >                     echo "0 $lastslot 1 1"
> >             else
> >                     echo "$usedslot $lastslot 1 1"
> >             fi
> >             exit 0
> >     else
> >                 if [ $usedslot -lt 0 ]; then
> >                         echo "0 $lastslot 1"
> >                 else
> >                         echo "$usedslot $lastslot 1"
> >                 fi
> >                 exit 0
> >     fi
> >                                                                                    
>                                                                         
> > }
> > 
> > #### Adds the amlabel and the barcode to the barcode file specified above.
> > #### If the database is messed up, it kills amtape (rather abruptly) and 
> > #### dumps a message into changer.debug on what to do, then sends an email
> > #### of the changer.debug to the above set email addr.
> > addlabel() {
> >     readstatus
> >     tapelabel=$1
> >     labelfilesize=`ls -l $labelfile | awk '{print $5}'`
> >     case $tapelabel in 
> >     $tapelabel)
> >             echo "LABEL -> Adding Barcode $barcode and amlabel $tapelabel for Slot 
>$usedslot into $labelfile" >> $DBGFILE
> >             if [ $labelfilesize -eq 2 ]; then
> >                     echo "$tapelabel $barcode" > $labelfile
> >                     echo "0 $usedslot $tape"
> >             else 
> >                     included=`grep $tapelabel $labelfile | awk '{print $1}'`
> >                     if [ -z $included ]; then
> >                             echo "$tapelabel $barcode" >> $labelfile
> >                             echo "0 $usedslot $tape"
> >                     else
> >                             oldbarcode=`grep $tapelabel $labelfile | awk '{print 
>$2}'`
> >                             if [ $oldbarcode -eq $barcode ]; then
> >                                     echo "      -> Barcode $barcode $oldbarcode 
>already synced for $tapelabel" >> $DBGFILE
> >                                     echo "0 $usedslot $tape"
> >                                     
> >                             else
> >                                     echo "      -> WARNING!!!  Label database 
>corrupted!!!" >> $DBGFILE
> >                                     echo "      -> $tapelabel $oldbarcode 
>conflicts with new barcode $barcode" >> $DBGFILE
> >                                     echo "      -> Remove file $labelfile and run 
>/usr/sbin/amtape <config> update" >> $DBGFILE
> >                                     `cat $DBGFILE | $mailer -s "Error with barcode 
>reader on \`date\`" $email`
> >                                     `killall amtape`
> >                             fi
> >                     fi
> >             fi
> >             ;;
> >     esac
> >     exit 0
> > }
> > 
> > #### Looks for the amlabel in the barcode file.  If found, it locates the 
> > #### slot it's in by looking for the barcode in the mtx output.  It then 
> > #### loads that tape, and returns to amtape the device the tape is loaded in.  
> > #### If the amlabel is not found, it kills amtape and dumps a message to 
> > #### changer.debug on what to do, then sends an email of the changer.debug
> > #### to the above set email addr.
> > searchtape() {
> >     # readstatus
> >     tapelabel=$1
> >     includedtag=`grep $tapelabel $labelfile | awk '{print $1}'`
> >     includedbar=`grep $tapelabel $labelfile | awk '{print $2}'`
> >     tmpincludedslot=`$MTX status | grep $includedbar`
> >     #### The horrid sed statement below returns the slot number.
> >     #### The origional was in shell script, so I didn't want to change that,
> >     #### Which give the below puke for a number between 1-999.
> >     includedslot=`echo $tmpincludedslot | sed -n 's/\(.*\)Storage Element 
>\(\([1-9]\)\|\([1-9][0-9]\)\|\([1-9][0-9][0-9]\)\):\(.*\)/\2/p;s/Data Transfer 
>Element 0:Full (Storage Element \(.\) Loaded)\(.*\)/\1/p'`
> >         case $tapelabel in
> >         $tapelabel)
> >             if [ $tapelabel == $includedtag ]; then
> >                     shift 
> >                     loadslot $includedslot
> >                     echo "$tape"
> >             else
> >                     echo "SEARCH -> WARNING!!!  $tapelabel not found in current 
>ADIC-barcodes database." >> $DBGFILE
> >                     echo "       -> WARNING!!!  Check your typing, and/or update 
>the database." >> $DBGFILE
> >                     `cat $DBGFILE | $mailer -s "Error with barcode reader on 
>\`date\`" $email`
> >                     `killall amtape`
> >             fi
> >             exit 0
> >     esac
> > }
> > 
> > # Program invocation begins here
> > echo "`date` Invoked with args '$@'" >> $DBGFILE
> > while [ $# -ge 1 ];do
> >         case $1 in
> >                 -slot)
> >                         shift
> >                         loadslot $*
> >                         ;;
> >                 -info)
> >                         shift
> >                         info
> >                         ;;
> >                 -reset)
> >                         shift
> >                         reset
> >                         ;;
> >                 -eject)
> >                         shift
> >                         eject
> >                         ;;
> > #### Added the below flags, for barcode support
> >             -label) 
> >                     shift
> >                     addlabel $*
> >                     ;;
> >             -search)
> >                     shift
> >                     searchtape $*
> >                     ;;
> >             -clean)
> >                     shift
> >                     loadslot $cleanslot
> >                     ;;
> >                 *)
> >                         echo "Unknown option $1"
> >                         exit 2
> >                         ;;
> >         esac            
> > done
> 
> 
> -- 
> Joe Rhett                                         Chief Technology Officer
> [EMAIL PROTECTED]                                      ISite Services, Inc.
> 
> PGP keys and contact information:          http://www.noc.isite.net/Staff/
--
   Jason Hollinden

   SMG Systems Admin

Reply via email to