4 REM Bacula interface to mtx autoloader
\r
6 REM $Id: mtx-changer.cmd 3718 2006-12-01 08:45:40Z robertnelson $
\r
8 REM If you set in your Device resource
\r
10 REM Changer Command = "mtx-changer %c %o %S %a %d"
\r
11 REM you will have the following input to this script:
\r
13 REM Bacula will always call with all the following arguments, even though
\r
14 REM in some cases, not all are used.
\r
16 REM mtx-changer "changer-device" "command" "slot" "archive-device" "drive-index"
\r
21 REM mtx-changer Changer0 load 1 Tape0 0
\r
23 REM will request to load the first cartidge into drive 0, where
\r
24 REM the changer device is Changer0, and the read/write device
\r
27 REM If you need to an offline, refer to the drive as %4
\r
28 REM e.g. mt -f %4 offline
\r
30 REM Many changers need an offline after the unload. Also many
\r
31 REM changers need a sleep 60 after the mtx load.
\r
33 REM N.B. If you change the script, take care to return either
\r
34 REM the mtx exit code or a 0. If the script exits with a non-zero
\r
35 REM exit code, Bacula will assume the request failed.
\r
38 SET MTX="@bin_dir_cmd@\mtx.exe"
\r
39 SET MT="@bin_dir_cmd@\mt.exe"
\r
40 SET working_dir=@working_dir_cmd@
\r
42 SET dbgfile="%working_dir%\mtx.log"
\r
44 REM to turn on logging, uncomment the following line
\r
45 REM copy nul "%working_dir%\mtx.log"
\r
48 REM check parameter count on commandline
\r
50 REM Check for special cases where only 2 arguments are needed,
\r
51 REM all others are a minimum of 5
\r
53 IF "%1" EQU "" goto :param_count_invalid
\r
54 IF "%2" EQU "" goto :param_count_invalid
\r
55 IF "%2" EQU "list" goto :param_count_valid
\r
56 IF "%2" EQU "slots" goto :param_count_valid
\r
57 IF "%3" EQU "" goto :param_count_invalid
\r
58 IF "%4" EQU "" goto :param_count_invalid
\r
59 IF "%5" EQU "" goto :param_count_invalid
\r
60 GOTO :param_count_valid
\r
62 :param_count_invalid
\r
63 echo Insufficient number of arguments given.
\r
65 echo At least two arguments must be specified.
\r
66 ) else echo Command expected 5 arguments.
\r
69 ECHO usage: mtx-changer ctl-device command [slot archive-device drive-index]
\r
70 ECHO Valid commands are: unload, load, list, loaded, and slots.
\r
82 CALL :debug "Parms: %ctl% %cmd% %slot% %device% %drive%"
\r
83 IF "%cmd%" EQU "unload" GOTO :cmdUnload
\r
84 IF "%cmd%" EQU "load" GOTO :cmdLoad
\r
85 IF "%cmd%" EQU "list" GOTO :cmdList
\r
86 IF "%cmd%" EQU "loaded" GOTO :cmdLoaded
\r
87 IF "%cmd%" EQU "slots" GOTO :cmdSlots
\r
91 CALL :debug "Doing mtx -f %ctl% unload %slot% %drive%"
\r
92 %MT% -f %device% eject
\r
93 %MTX% -f %ctl% unload %slot% %drive%
\r
94 SET rtn=%ERRORLEVEL%
\r
98 CALL :debug "Doing mtx -f %ctl% load %slot% %drive%"
\r
99 %MTX% -f %ctl% load %slot% %drive%
\r
100 SET rtn=%ERRORLEVEL%
\r
101 IF ERRORLEVEL 1 GOTO :cmdExit
\r
102 REM %MT% -f %device% load
\r
104 CALL :wait_for_drive %device%
\r
105 REM Force block size to 0 for variable
\r
106 %MT% -f %device% setblk 0
\r
110 CALL :debug "Doing mtx -f %ctl% -- to list volumes"
\r
111 CALL :make_temp_file
\r
112 REM Enable the following if you are using barcodes and need an inventory
\r
113 REM %MTX% -f %ctl% inventory
\r
114 %MTX% -f %ctl% status >%TMPFILE%
\r
115 SET rtn=%ERRORLEVEL%
\r
116 IF ERRORLEVEL 1 GOTO :cmdExit
\r
117 FOR /F "usebackq tokens=3,6 delims==: " %%i in ( `findstr /R /C:" *Storage Element [0-9]*:.*Full" %TMPFILE%` ) do echo %%i:%%j
\r
118 FOR /F "usebackq tokens=7,10" %%i in ( `findstr /R /C:"^Data Transfer Element [0-9]*:Full (Storage Element [0-9]" %TMPFILE%` ) do echo %%i:%%j
\r
119 DEL /F %TMPFILE% >nul 2>&1
\r
121 REM If you have a VXA PacketLoader and the above does not work, try
\r
122 REM turning it off and enabling the following line.
\r
123 REM %MTX% -f %ctl% status | grep " *Storage Element [0-9]*:.*Full" | sed "s/*Storage Element //" | sed "s/Full :VolumeTag=//"
\r
128 CALL :debug "Doing mtx -f %ctl% %drive% -- to find what is loaded"
\r
129 CALL :make_temp_file
\r
130 %MTX% -f %ctl% status >%TMPFILE%
\r
131 SET rtn=%ERRORLEVEL%
\r
132 IF ERRORLEVEL 1 GOTO :cmdExit
\r
133 FOR /F "usebackq tokens=7" %%i in ( `findstr /R /C:"^Data Transfer Element %drive%:Full" %TMPFILE%` ) do echo %%i
\r
134 findstr /R /C:"^Data Transfer Element %drive%:Empty" %TMPFILE% >nul && echo 0
\r
135 DEL /F %TMPFILE% >nul 2>&1
\r
139 CALL :debug "Doing mtx -f %ctl% -- to get count of slots"
\r
140 CALL :make_temp_file
\r
141 %MTX% -f %ctl% status >%TMPFILE%
\r
142 SET rtn=%ERRORLEVEL%
\r
143 IF ERRORLEVEL 1 GOTO :cmdExit
\r
144 FOR /F "usebackq tokens=5" %%i in ( `findstr /R /C:" *Storage Changer" %TMPFILE%` ) do echo %%i
\r
145 DEL /F %TMPFILE% >nul 2>&1
\r
152 ECHO '%cmd%' is an invalid command.
\r
159 IF NOT EXIST %dbgfile% GOTO :EOF
\r
160 FOR /F "usebackq tokens=2-4,5-7 delims=/:. " %%i in ( '%DATE% %TIME%' ) do SET TIMESTAMP=%%k%%i%%j-%%l:%%m:%%n
\r
161 ECHO %TIMESTAMP% %*>> %dbgfile%
\r
165 REM Create a temporary file
\r
168 SET TMPFILE="%working_dir%\mtx.tmp"
\r
169 IF EXIST %TMPFILE% (
\r
170 ECHO Temp file security problem on: %TMPFILE%
\r
176 REM The purpose of this function to wait a maximum
\r
177 REM time for the drive. It will return as soon as
\r
178 REM the drive is ready, or after waiting a maximum
\r
179 REM of 300 seconds.
\r
182 FOR /L %%i IN ( 1, 1, 300 ) DO (
\r
183 %MT% -f %1 status | findstr ONLINE >NUL 2>&1
\r
184 IF %ERRORLEVEL%==0 GOTO :EOF
\r
185 CALL :debug "Device %1 - not ready, retrying..."
\r
188 CALL :debug "Device %1 - not ready, timed out..."
\r