📄 chg-mcutil.sh
字号:
#!@SHELL@ ## Author: Robert Dege### version 1.2# -----------# fixed last_cleaned file so that if it doesn't exist, it gets created with current date, not '0,0'# fixed a bug that was reporting the wrong slot # to amcheck## version 1.1# -----------# amverify was failing when using -slot current. Fixed exit $code from 1 -> 0.# removed useless $current variables from movetape() function.#### Exit Status:# 0 Alles Ok# 1 Illegal Request# 2 Fatal Error### Set Path so that it includes Amanda binaries, and access to tapechanger & drive programs#prefix="@prefix@"exec_prefix="@exec_prefix@"sbindir="@sbindir@"amlibexecdir="@amlibexecdir@". "${amlibexecdir}/amanda-sh-lib.sh"# add sbin and ucb dirsPATH="$PATH:/usr/sbin:/sbin:/usr/ucb"export PATH## Define Suffix for amanda binaries#USE_VERSION_SUFFIXES="@USE_VERSION_SUFFIXES@"if test "$USE_VERSION_SUFFIXES" = "yes"; then SUF="-@VERSION@"else SUF=fi## Load configuration data from the config file#ourconf=`amgetconf$SUF changerfile`myname=$0if [ ! -f "$ourconf" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): %s not found as listed in amanda.conf' "$code" "$ourconf"` 1>&2 exit $codefi# grab mcutil infotmpval1=`grep ^mcutil $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^mcutil $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): mcutil not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then MCUTIL=$tmpval2else MCUTIL=$tmpval1fi# grab tape infotmpval1=`grep ^tape $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^tape $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): tape not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then tape=$tmpval2else tape=$tmpval1fi# grab firstslot infotmpval1=`grep ^firstslot $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^firstslot $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): firstslot not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then firstslot=$tmpval2else firstslot=$tmpval1fi# grab lastslot infotmpval1=`grep ^lastslot $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^lastslot $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): lastslot not specified in %s' "$code" "$ourconf"` 1>&2elif [ -z "$tmpval1" ]; then lastslot=$tmpval2else lastslot=$tmpval1fi# grab use_cleaning infotmpval1=`grep ^use_cleaning $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^use_cleaning $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): use_cleaning not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then use_cleaning=$tmpval2else use_cleaning=$tmpval1fi# grab cleanslot infotmpval1=`grep ^cleanslot $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^cleanslot $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): cleanslot not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then cleanslot=$tmpval2else cleanslot=$tmpval1fi# grab cleansleep infotmpval1=`grep ^cleansleep $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^cleansleep $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): cleansleep not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then cleansleep=$tmpval2else cleansleep=$tmpval1fi# grab cleanme infotmpval1=`grep ^cleanme $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^cleanme $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): cleanme not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then cleanme=$tmpval2else cleanme=$tmpval1fi# grab cleanfile infotmpval1=`grep ^cleanfile $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^cleanfile $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): cleanfile not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then cleanfile=$tmpval2else cleanfile=$tmpval1fi# grab lastfile infotmpval1=`grep ^lastfile $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^lastfile $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): lastfile not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then lastfile=$tmpval2else lastfile=$tmpval1fi# grab currentslot infotmpval1=`grep ^currentslot $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^currentslot $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): currentslot not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then currentslot=$tmpval2else currentslot=$tmpval1fi# grab logfile infotmpval1=`grep ^logfile $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^logfile $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): logfile not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then logfile=$tmpval2else logfile=$tmpval1fi[ ! -w $logfile ] && logfile=/dev/null# grab slot0source infotmpval1=`grep ^slot0source $ourconf | awk -F\ '{print $2}'`tmpval2=`grep ^slot0source $ourconf | awk -F= '{print $2}'`if [ -z "$tmpval1" ] && [ -z "$tmpval2" ]; then code=2 echo `_ 'Command Line ->'` $myname $@ echo `_ 'Exit(%s): slot0source not specified in %s' "$code" "$ourconf"` 1>&2 exit $codeelif [ -z "$tmpval1" ]; then slot0source=$tmpval2else slot0source=$tmpval1fi## Verify currentslot contains a value#if [ ! -f $currentslot ] || [ `cat $currentslot` -lt $firstslot ];then readstatus echo $used > $currentslotficurrent=`cat $currentslot`# Start logging to $logfileecho "\n\n==== `date` ====" >> $logfileecho `_ 'Command Line ->'` $myname $@ >> $logfile## is Use Cleaning activated?#if [ $use_cleaning -eq 1 ]; then curday=`date +%j` curyear=`date +%Y` [ ! -f $cleanfile ] && echo 0 > $cleanfile [ ! -f $lastfile ] && echo $curday,$curyear > $lastfile## Check to see when tape drive was last cleaned# output warning message if it's been too long# Currently, if it's been more than 45days, then# an error message is displayed everytime the# script is called, until the clean parameter# is run# cleaned=`cat $cleanfile` lastcleaned=`cut -d, -f1 $lastfile` yearcleaned=`cut -d, -f2 $lastfile` if [ `expr $curday - $lastcleaned` -lt 0 ];then diffday=`expr $curday - $lastcleaned + 365` diffyear=`expr $curyear - $yearcleaned - 1` else diffday=`expr $curday - $lastcleaned` diffyear=`expr $curyear - $yearcleaned` fi if [ $diffday -gt $cleanme ] || [ $diffyear -ge 1 ];then if [ $diffyear -ge 1 ];then echo `_ "Warning, it's been %s year(s) & %s day(s) since you last cleaned the tape drive!" "$diffyear" "$diffday"` else echo `_ "Warning, it's been %s day(s) since you last cleaned the tape drive!" "$diffday"` fi fifi## Read if there is a tape in the tape drive# If so, determine what slot is the tape from#readstatus() { echo `_ "querying tape drive....."` >> $logfile used=`expr \`$MCUTIL -e drive | tr = \] | cut -d\] -f2\` - $slot0source` echo `_ " Done"` >> $logfile # Give changer a chance to reset itself sleep 3}## If tape is in the drive, eject it#eject() { echo `_ "tape drive eject was called"` >> $logfile readstatus if [ $used -ge $firstslot ];then $MCUTIL -m drive slot:$used code=$? else code=1 fi if [ $code -eq 0 ];then answer=`_ 'Cartridge %s successfully ejected from %s' "$used" "$tape"` echo `_ "Exit(%s): %s" "$code" "$answer"` >> $logfile echo $current $answer #For amtape output return $code elif [ $code -eq 1 ];then answer=`_ "No Cartridge in Tape Drive"` echo `_ 'Exit(%s): %s' "$code" "$answer"` >> $logfile echo $current $answer #For amtape output exit $code else answer=`_ 'Tape abnormally failed'` echo `_ 'Exit(%s): %s' "$code" "$answer"` >> $logfile echo $current $answer #For amtape output exit $code fi}## reset tape drive to a current state.# This involves ejecting the current tape (if occupied)# and inserting the tape in $firstslot#reset() { echo `_ 'tape drive reset was called'` >> $logfile readstatus if [ $used -ge $firstslot ];then eject fi res=`$MCUTIL -m slot:$firstslot drive` code=$? if [ $code -eq 0 ];then echo $firstslot > $currentslot answer=`_ '%s - Tape drive was successfully reset' "$firstslot"` elif [ $code -eq 1 ];then answer=`_ '%s - Tape drive reset failed\nCommand -> %s' "$firstslot" "$res"` else code=2 answer=`_ '%s - Tape abnormally failed -> %s' "$firstslot" "$res"` fi echo `_ 'Exit(%s): slot %s' "$code" "$answer"` >> $logfile echo $firstslot #For amtape output exit $code}## Load a specific cartridge into the changer#loadslot() { echo `_ "loadslot was called"` >> $logfile readstatus whichslot=$1 case $whichslot in current) if [ $current -ge $firstslot ];then load=$current else load=$used fi movetape ;; next|advance) [ $used -lt $firstslot ] && used=$current load=`expr $used + 1` [ $load -gt $lastslot ] && load=$firstslot if [ $whichslot = advance ];then echo $load > $currentslot code=0 answer=`_ 'advancing to slot %s' "$load"` echo `_ 'Exit(%s): %s' "$code" "$answer"` >> $logfile echo $load $code exit $code else movetape fi ;; prev) [ $used -lt $firstslot ] && used=$current load=`expr $used - 1` [ $load -lt $firstslot ] && load=$lastslot movetape ;; first) load=$firstslot movetape ;; last) load=$lastslot movetape ;; [$firstslot-$lastslot]) load=$1 movetape ;; clean) if [ use_cleaning -eq 1 ];then current=$cleanslot eject $MCUTIL slot:$cleanslot drive sleep $cleansleep echo "$curday,$curyear" > $lastfile echo `expr $cleaned + 1` > $cleanfile reset else code=1 answer=`_ "Cleaning not enabled in config"` echo `_ 'Exit(%s): %s' "$code" "$answer"` >> $logfile echo $cleanslot $answer exit $code fi ;; *) code=1 answer=`_ '"%s" invalid menu option' "$whichslot"` echo `_ 'Exit(%s): %s' "$code" "$answer"` >> $logfile echo "$answer" exit $code ;; esac}## sub-function that slot calls to actually eject the tape# & load in the correct slot cartridge#movetape() { # If the requested slot is already loaded in the tape drive if [ $load -eq $used ]; then code=0 answer=`_ 'slot %s is already loaded' "$load"` echo `_ 'Exit(%s): %s' "$code" "$answer"` >> $logfile echo $load $tape # For amtape output exit $code elif [ $used -ge $firstslot ];then current=$load eject else echo $load $tape # For amtape output fi echo `_ 'Loading slot %s into Tape drive' "$load"` >> $logfile $MCUTIL -m slot:$load drive code=$? if [ $code -eq 0 ];then echo $load > $currentslot answer=`_ 'Cartridge %s successfully loaded in Tape drive' "$load"` else answer=`_ 'Cartridge %s failed to load in Tape drive' "$load"` fi echo `_ 'Exit(%s): %s' "$code" "$answer"` >> $logfile exit $code}info() { echo `_ 'tape drive info was called'` >> $logfile readstatus if [ $used -lt 0 ];then used=0 fi code=0 answer="$used $lastslot 1" echo `_ 'Exit(%s): %s' "$code" "$answer"` >> $logfile echo "$answer" exit $code} case $1 in -slot) shift loadslot $* ;; -device) echo $tape ;; -info) shift info ;; -reset) shift reset ;; -eject) shift eject ;; --help|-help) echo `_ '-slot {current|next|previous|first|last|%s-%s|clean}' "$firstslot" "$lastslot"` echo `_ ' current - show contents of current slot'` echo `_ ' next - load tape from next slot'` echo `_ ' previous - load tape from previous slot'` echo `_ ' first - load tape from first slot'` echo `_ ' last - load tape from last slot'` echo `_ ' %s - %s - load tape from slot <slot #>' "$firstslot" "$lastslot"` echo `_ ' clean - Clean the drive'` echo `_ '-device : Show current tape device'` echo `_ '-reset : Reset changer to known state'` echo `_ '-eject : Eject current tape from drive'` echo `_ '-info : Output {current slot | # of slots | can changer go backwards}'` echo `_ '-help : Display this help'` ;; *) echo `_ "<usage> %s -{slot|device|reset|eject|help}" "$myname"` ;; esac
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -