1#!@SHELL@ 2# 3# Exit Status: 4# 0 Alles Ok 5# 1 Illegal Request 6# 2 Fatal Error 7# 8 9prefix=@prefix@ 10exec_prefix=@exec_prefix@ 11amlibexecdir=@amlibexecdir@ 12. ${amlibexecdir}/chg-lib.sh 13 14# 15# Changer config file (changerfile) 16# 17# resend_mail=900 # 15 minutes 18# timeout_mail=604800 # 7 days 19# request="tty" # Use the tty to ask the user to change tape. 20# # Can't be use by cron 21# request="email" # Send an email to ask the user to change tape. 22# request="tty_email" # Use the tty if it exist or send an email. 23# #Default is "tty_email" 24# mtx_binary="/path/to/mtx" # path of 'mtx'; default is value discovered by 25# # configure 26# 27# 28 29if [ -d "@AMANDA_DBGDIR@" ]; then 30 logfile=@AMANDA_DBGDIR@/changer.debug 31else 32 logfile=/dev/null 33fi 34 35myname=`basename $0` 36 37EGREP='@EGREP@' 38 39if ! error=`try_find_mt`; then 40 echo <none> $error 41 exit 2 42fi 43 44ONLINEREGEX="ONLINE|READY|sense[_ ]key[(]0x0[)]|sense key error = 0|^er=0$|, mt_erreg: 0x0|^Current Driver State: at rest$" 45REPORTTO=`amgetconf mailto` 46MAILER=`amgetconf mailer` 47tape=`amgetconf tapedev` 48 49if [ -z "$tape" ]; then 50 echo `_ '<none> tapedev not specified in amanda.conf.'` 51 exit 2 52fi 53 54ORG=`amgetconf ORG` 55 56firstslot=1 57lastslot=99 58resend_mail=900 # 15 minutes 59timeout_mail=604800 # 7 days 60abort_file="chg-manual.abort" 61abort_dir=`pwd` 62 63changerfile=`amgetconf changerfile` 64 65conf_match=`expr "$changerfile" : .\*\.conf\$` 66if [ $conf_match -ge 6 ]; then 67 configfile=$changerfile 68 changerfile=`echo $changerfile | sed 's/.conf$//g'` 69else 70 configfile=$changerfile.conf 71fi 72 73cleanfile=$changerfile-clean 74accessfile=$changerfile-access 75slotfile=$changerfile-slot 76[ ! -f $cleanfile ] && echo 0 > $cleanfile 77[ ! -f $accessfile ] && echo 0 > $accessfile 78[ ! -f $slotfile ] && echo $firstslot > $slotfile 79cleancount=`cat $cleanfile` 80accesscount=`cat $accessfile` 81slot=`cat $slotfile` 82 83# define these functions early so that they can be overridden in changerfile.conf 84 85request_tty() { 86 if > /dev/tty; then 87 echo "$amdevcheck_message" >> /dev/tty 88 # message parsed by ZMC: 89 echo `_ 'Insert tape into slot %s and press return' "$1"` > /dev/tty 90 echo `_ ' or type "NONE" to abort'` > /dev/tty 91 read ANSWER < /dev/tty 92 if [ X"$ANSWER" = X"NONE" ]; then 93 echo `_ 'Aborting by user request'` > /dev/tty 94 answer=`_ '<none> Aborting by user request'` 95 echo `_ 'Exit ->'` $answer >> $logfile 96 echo $answer 97 exit 2 98 fi 99 else 100 answer=`_ '<none> no /dev/tty to ask to change tape'` 101 echo `_ 'Exit ->'` $answer >> $logfile 102 echo $answer 103 exit 2 104 fi 105} 106 107### 108# If $changerfile exists, source it into this script. One reason is to 109# override the request() function above which gets called to request 110# that a tape be mounted. Here is an alternate versions of request() 111# that does things more asynchronous: 112# 113request_email() { 114 # Send E-mail about the mount request and wait for the drive 115 # to go ready by checking the status once a minute. Repeat 116 # the E-mail once an hour in case it gets lost. 117 timeout=0 118 gtimeout=$timeout_mail 119 rm -f $abort_filename 120 while true;do 121 if [ $gtimeout -le 0 ]; then 122 answer=`_ '%s %s: timeout waiting for tape online' "$load" "$myname"` 123 echo `_ 'Exit ->'` $answer >> $logfile 124 echo $answer 125 exit 2; 126 fi 127 if [ -f $abort_filename ]; then 128 rm -f $abort_filename 129 answer=`_ '<none> Aborting by user request'` 130 echo `_ 'Exit ->'` $answer >> $logfile 131 echo $answer 132 exit 2 133 fi 134 if [ $timeout -le 0 ]; then 135 msg=`_ '%s\nInsert Amanda tape into slot %s (%s)\nor \`touch %s\` to abort.' "$amdevcheck_message" "$1" "$tape" "$abort_filename"` 136 subject=`_ '%s AMANDA TAPE MOUNT REQUEST FOR SLOT %s' "$ORG" "$1"` 137 echo "$msg" | $MAILER -s "$subject" $REPORTTO 138 timeout=$resend_mail 139 fi 140 echo `_ ' -> status %s' "$tape"` >> $logfile 141 if amdevcheck_status $tape; then 142 break 143 fi 144 sleep 60 145 timeout=`expr $timeout - 60` 146 gtimeout=`expr $gtimeout - 60` 147 done 148} 149 150request_tty_email() { 151 if > /dev/tty; then 152 request_tty "$1" 153 else 154 request_email "$1" 155 fi 156} 157 158request() { 159 if [ X"$request" = X"tty" ]; then 160 request_tty "$1" 161 else if [ X"$request" = X"email" ]; then 162 request_email "$1" 163 else 164 request_tty_email "$1" 165 fi 166 fi 167} 168 169# source the changer configuration file (see description, top of file) 170if [ -f $configfile ]; then 171 . $configfile 172fi 173 174# adjust MTX, if necessary 175test -n "${mtx_binary}" && MTX="${mtx_binary}" 176 177# check that MAILER is defined 178if test -z "$MAILER"; then 179 if test x"$request" = x"email" || test x"$request" = x"tty-email"; then 180 answer=`_ "<none> %s: Can't send email because MAILER is not defined" "$myname"` 181 echo `_ 'Exit ->'` $answer >> $logfile 182 echo $answer 183 exit 2 184 fi 185fi 186 187# 188 189eject() { 190 echo `_ ' -> status %s' "$tape"` >> $logfile 191 if amdevcheck_status $tape; then 192 echo `_ ' -> offline %s' "$tape"` >> $logfile 193 try_eject_device $tape 194 answer="$slot $tape" 195 code=0 196 else 197 answer=`_ '<none> %s: %s' "$myname" "$amdevcheck_message"` 198 code=1 199 fi 200 echo `_ 'Exit ->'` $answer >> $logfile 201 echo $answer 202 exit $code 203} 204 205abort_filename="$abort_dir/$abort_file" 206 207# 208 209reset() { 210 echo `_ ' -> status %s' "$tape"` >> $logfile 211 if amdevcheck_status $tape; then 212 answer="$slot $tape" 213 else 214 answer="0 $tape $amdevcheck_message" 215 fi 216 echo `_ 'Exit ->'` $answer >> $logfile 217 echo $answer 218 exit 0 219} 220 221# load # 222 223loadslot() { 224 echo `_ ' -> status %s' "$tape"` >> $logfile 225 # amdevcheck returns zero if the tape exists. 226 amdevcheck_status $tape; 227 tape_status=$? 228 229 whichslot=$1 230 case $whichslot in 231 current) 232 load=$slot 233 ;; 234 next|advance) 235 load=`expr $slot + 1` 236 [ $load -gt $lastslot ] && load=$firstslot 237 ;; 238 prev) 239 load=`expr $slot - 1` 240 [ $load -lt $firstslot ] && load=$lastslot 241 ;; 242 first) 243 load=$firstslot 244 ;; 245 last) 246 load=$lastslot 247 ;; 248 [0-9]|[0-9][0-9]) 249 if [ $1 -lt $firstslot -o $1 -gt $lastslot ]; then 250 answer=`_ '<none> %s: slot must be %s .. %s' "$myname" "firstslot" "$lastslot"` 251 echo `_ 'Exit ->'` $answer >> $logfile 252 echo $answer 253 exit 1 254 fi 255 load=$1 256 ;; 257 *) 258 answer=`_ '<none> %s: illegal slot: %s' "$myname" "$1"` 259 echo `_ 'Exit ->'` $answer >> $logfile 260 echo $answer 261 exit 1 262 ;; 263 esac 264 # 265 if [ $tape_status -eq 0 -a $load = $slot ];then 266 # already loaded 267 answer="$slot $tape" 268 echo `_ 'Exit ->'` $answer >> $logfile 269 echo $answer 270 exit 0 271 fi 272 273 if [ X"$whichslot" = X"current" ]; then 274 answer="<none> Current slot not loaded" 275 echo `_ 'Exit ->'` $answer>> $logfile 276 echo $answer 277 exit 1 278 fi 279 280 expr $accesscount + 1 > $accessfile 281 282 if [ $tape_status -eq 0 ]; then 283 echo `_ " -> offline %s" "$tape"` >> $logfile 284 try_eject_device $tape 285 tape_status=1 286 fi 287 if [ $whichslot = advance ]; then 288 tape=/dev/null 289 else 290 echo `_ ' -> load %s' "$load"` >> $logfile 291 while true; do 292 request $load 293 echo `_ ' -> status %s' "$tape"` >> $logfile 294 if amdevcheck_status $tape; then 295 break; 296 fi 297 done 298 fi 299 echo $load > $slotfile 300 answer="$load $tape" 301 echo `_ 'Exit ->'` $answer >> $logfile 302 echo $answer 303 exit 0 304} 305 306# 307 308info() { 309 echo `_ ' -> status %s' "$tape"` >> $logfile 310 if amdevcheck_status $tape; then 311 answer="$slot $lastslot 1" 312 else 313 answer="0 $lastslot 1" 314 fi 315 echo `_ 'Exit ->'` $answer >> $logfile 316 echo $answer 317 exit 0 318} 319 320# 321# main part 322# 323 324echo `gettext "args ->"` "$@" >> $logfile 325while [ $# -ge 1 ];do 326 case $1 in 327 -slot) 328 shift 329 loadslot $* 330 ;; 331 -info) 332 shift 333 info 334 ;; 335 -reset) 336 shift 337 reset 338 ;; 339 -eject) 340 shift 341 eject 342 ;; 343 *) 344 fmt=`gettext "<none> %s: Unknown option %s\n"` 345 printf $fmt $myname $1 346 exit 2 347 ;; 348 esac 349done 350 351exit 0 352