#!/bin/sh # chg-rait # # This assumes we have rait-striped drives in several # other amanda changer configs. # # so we have a changerfile that lists other changers and # changer files. # nchangers=3 # tpchanger_1="chg-mtx" # changerdev_1="/dev/mtx1" # changerfile_1="/some/file1" # tapedev_1="/some/dev" # tpchanger_2="chg-mtx" # changerdev_2="/dev/mtx2" # changerfile_2="/some/file2" # tapedev_2="/some/dev" # tpchanger_3="chg-mtx" # changerdev_3="/dev/mtx3" # changerfile_3="/some/file3" # tapedev_3="/some/dev" # # the tapedev_n entries are only needed if the changer script in question # uses tapedev. # # # debugging... # if [ -d "@AMANDA_DBGDIR@" ]; then DBGFILE=@AMANDA_DBGDIR@/rait-changer.debug KIDDEBUG=@AMANDA_DBGDIR@/changer.debug WORK=@AMANDA_DBGDIR@/chgwork$$ else DBGFILE=/dev/null KIDDEBUG=/dev/null WORK=/tmp/chgwork$$ fi exec 2>$DBGFILE echo "args: $0 $*" >&2 set -x # # the usual config fun # prefix=@prefix@ exec_prefix=@exec_prefix@ sbindir=@sbindir@ libexecdir=@libexecdir@ USE_VERSION_SUFFIXES="@USE_VERSION_SUFFIXES@" if test "$USE_VERSION_SUFFIXES" = "yes"; then SUF="-@VERSION@"; else SUF= fi getconf=$sbindir/amgetconf$SUF PATH=$sbindir:$libexecdir:/usr/bin:/bin:/usr/sbin:/sbin:/usr/ucb export PATH changerfile=`$getconf changerfile` . $changerfile # # get config items that other changers use to put in our # fake amanda.conf files. # org=`$getconf ORG` mailto=`$getconf mailto` # # make a working directory (with amanda.conf) for each changer, and start the # changer script in background for each one # i=1 while [ $i -le $nchangers ] do eval tpchanger=\$tpchanger_$i eval changerdev=\$changerdev_$i eval changerfile=\$changerfile_$i eval tapedev=\$tapedev_$i mkdir -p $WORK/$i cd $WORK/$i cat >> amanda.conf < exitcode ) > stdout 2>stderr & i=`expr $i + 1` done wait # # once they've all finished, collect up the results # myexit=0 myslot=-1 mymax=65536 myflag=1 mydev="" mysep="{" case x$1 in x-slot|x-reseti|x-eject|x-search|x-label) # # read slot number and device from each # slot numbers must match(?!), and is our resulting slot number # resulting device is {dev1,dev2,...} from each one # i=1 while [ $i -le $nchangers ] do read exitcode < $WORK/$i/exitcode read n dev < $WORK/$i/stdout echo -------------- >&2 cat $WORK/$i/stderr >&2 cat $KIDDEBUG >&2 echo -------------- >&2 if [ "$exitcode" != 0 ] then myexit=$exitcode fi if [ $myslot = -1 ] then myslot=$n fi if [ $n != $myslot ] then # synch error! myexit=1 echo "stackers are out of synch, issue a reset" >&2 fi mydev="$mydev$mysep$dev" mysep="," i=`expr $i + 1` done mydev="rait:$mydev}" echo $myslot $mydev ;; x-info) # # read info from each # slot numbers must match(?!), and is our resulting slot number # minimum max slots is our resulting max slots # if any can't go backwards, the aggregate can't either # i=1 while [ $i -le $nchangers ] do read exitcode < $WORK/$i/exitcode read n max flag < $WORK/$i/stdout echo -------------- >&2 cat $WORK/$i/stderr >&2 cat $KIDDEBUG >&2 echo -------------- >&2 if [ "$exitcode" != 0 ] then myexit=$exitcode fi if [ $myslot = -1 ] then myslot=$n fi if [ $n != $myslot ] then # synch error! myexit=1 echo "stackers are out of synch, issue a -reset" >&2 fi if [ $max -lt $mymax ] then mymax=$max fi if [ $flag = 0 ] then myflag=0 fi i=`expr $i + 1` done echo $myslot $mymax $myflag esac # # clean up work directories # rm -rf $WORK exit $myexit