#!/bin/sh # chg-juke # # This assumes we have possibly rait-striped drives in several # jukeboxes, controlled by the Fermilab "juke" package # # So we could have 3 drives in 3 jukeboxes: # changerscript="chg-juke" # changerfile=/some/file # tapedev="rait:/dev/nst{1,2,3}" # changerdev="myjuke{0,1,2}" # Or, if the jukebox has multiple drives: # changerscript="chg-juke" # changerfile=/some/file # tapedev="rait:/dev/nst{1,2,3}" # changerdev="myjuke" # We need therefore to generate lists with csh to expand the tapedev # and changerdev, and deal with the possibility that there are several # jukeboxes and several drives in each jukebox involved. # # debugging... # if [ -d "@AMANDA_DBGDIR@" ]; then DBGFILE=@AMANDA_DBGDIR@/changer.debug else DBGFILE=/dev/null fi exec 2>$DBGFILE echo "args: $0 $*" >&2 set -x # # the usual config fun # prefix=@prefix@ exec_prefix=@exec_prefix@ sbindir=@sbindir@ libexecdir=@libexecdir@ MT=ammt USE_VERSION_SUFFIXES="@USE_VERSION_SUFFIXES@" if test "$USE_VERSION_SUFFIXES" = "yes"; then SUF="-@VERSION@"; else SUF= fi getconf=$sbindir/amgetconf$SUF # # make sure we can find JUKE later # JUKE_DIR=/usr/local # Fermilab specific if [ -f /usr/local/etc/setups.sh ] then . /usr/local/etc/setups.sh setup juke fi PATH=$sbindir:$libexecdir:$JUKE_DIR/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/ucb export PATH JUKE_DIR build_drivelists() { # # figure out which drives are in which jukebox # count=0 for juke in $jlist do for d in $dlist do if juke list -j $juke drive $d | grep 'drive [0-9]' >&2 then eval "drives_in_$juke=\"\$drives_in_$juke $d\"" fi done done } unload_drive_n_clean() { # # $1 is whether to clean it # cleanit=$1 # # if the drive is ONLINE, mt unload it # if $MT -t $tapedev status | egrep "$ONLINEREGEX" >&2 then $MT -t $tapedev offline >&2 || true fi # # unload any tapes present, maybe load/unload a cleaning cartridge # for juke in $jlist do eval "jdlist=\"\$drives_in_$juke\"" for drive in $jdlist do juke unload -j $juke drive $drive >&2 || true if juke list -j $juke drive $drive | grep '(empty)' >&2 then : else echo "$slot $tapedev unable to empty preceding tape from drive $drive" exit 1 fi if $cleanit then juke load -j $juke drive $drive clean sleep 120 juke unload -j $juke drive $drive fi done done } load_drives() { # # load slots. If it's a stripe, load several... # for juke in $jlist do eval "jdlist=\"\$drives_in_$juke\"" jndrives=`echo $jdlist | wc -w` count=0 for drive in $jdlist do rslot=`expr $newslot '*' $jndrives + $count` juke load -j $changerdev drive $drive slot $rslot >&2 if juke list -j $changerdev drive $drive | grep '(empty)' >&2 then echo "$slot $tapedev unable to load tape into drive" exit 1 fi count=`expr $count + 1` done done # # wait for drive(s) to come online # count=0 until $MT -t $tapedev status | egrep "$ONLINEREGEX" >&2 do count=`expr $count + 1` if [ $count -gt 24 ] then echo "$slot $tapedev never came online" exit 1 fi sleep 5 done } ONLINEREGEX="ONLINE|READY|sense[_ ]key[(]0x0[)]|sense key error = 0|^er=0$" # # get config variables # changerfile=`$getconf changerfile` tapedev=`$getconf tapedev` changerdev=`$getconf changerdev` dlist=`csh -c "echo $tapedev" | sed -e 's/rait://g' -e 's/tape://g'` ndrives=`echo $dlist | wc -w` jlist=`csh -c "echo $changerdev"` njukes=`echo $jlist | wc -w` totalslots=`for juke in $jlist ; do juke list -j $juke; done | grep -v '^clean' | grep 'slot [0-9]' | wc -l` if [ $ndrives -gt 1 ] then # # if it's a 3 tape stripe and we have 30 actual slots # we only have 10 virtual slots... # totalslots=`expr $totalslots / $ndrives` fi build_drivelists # # get current slot if we have one # if [ -f "$changerfile" ] then slot="`cat $changerfile`" else slot=0 echo $slot > $changerfile fi # # We treat -reset just like -slot 0 # if [ x$1 = 'x-reset' ] then set : -slot 0 shift fi case x$1 in x-slot) # # handle special slots... # case "$2" in current) newslot=$slot ; load=true;; next) newslot=`expr $slot + 1`; load=true;; advance) newslot=`expr $slot + 1`; load=false;; prev) newslot=`expr $slot - 1`; load=true;; first) newslot=0 ; load=true;; last) newslot=-1 ; load=true;; *) newslot=$2 ; load=true;; esac if [ $newslot = "clean" ] then unload_drive_n_clean true else if [ 0 -gt $newslot ] then newslot=`expr $totalslots - 1` fi if [ $totalslots -le $newslot ] then newslot=0 fi echo $newslot > $changerfile slot=$newslot if $load then unload_drive_n_clean false load_drives fi fi echo $slot $tapedev ;; x-info) echo $slot $totalslots 1 exit 0 ;; x-eject) unload_drive_n_clean false echo $slot $tapedev ;; esac exit $rc