]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/win32/scripts/mtx-changer.cmd
Separate object/binaries in Win32 and Win64 builds. More to be done.
[bacula/bacula] / bacula / src / win32 / scripts / mtx-changer.cmd
1 @echo off\r
2 REM\r
3 REM\r
4 REM Bacula interface to mtx autoloader\r
5 REM\r
6 REM  $Id: mtx-changer.cmd 3718 2006-12-01 08:45:40Z robertnelson $\r
7 REM\r
8 REM  If you set in your Device resource\r
9 REM\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
12 REM\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
15 REM\r
16 REM  mtx-changer "changer-device" "command" "slot" "archive-device" "drive-index"\r
17 REM                     %1           %2       %3          %4             %5\r
18 REM\r
19 REM  for example:\r
20 REM\r
21 REM  mtx-changer Changer0 load 1 Tape0 0\r
22 REM \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
25 REM   is Tape0.\r
26 REM\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
29 REM\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
32 REM\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
36 REM\r
37 \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
41 \r
42 SET dbgfile="%working_dir%\mtx.log"\r
43 \r
44 REM to turn on logging, uncomment the following line\r
45 REM copy nul "%working_dir%\mtx.log"\r
46 \r
47 REM\r
48 REM check parameter count on commandline\r
49 REM\r
50 REM Check for special cases where only 2 arguments are needed, \r
51 REM  all others are a minimum of 5\r
52 REM\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
61 \r
62 :param_count_invalid\r
63    echo Insufficient number of arguments given.\r
64    IF "%2" EQU "" (\r
65       echo   At least two arguments must be specified.\r
66    ) else echo   Command expected 5 arguments.\r
67 :usage\r
68    ECHO.\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
71    EXIT /B 1\r
72 \r
73 :param_count_valid\r
74 \r
75 REM Setup arguments\r
76 SET ctl=%1\r
77 SET cmd=%2\r
78 SET slot=%3\r
79 SET device=%4\r
80 SET drive=%5\r
81 \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
88 GOTO :cmdUnknown\r
89 \r
90 :cmdUnload\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
95    GOTO :cmdExit\r
96 \r
97 :cmdLoad\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
103 REM bsleep 5\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
107    GOTO :cmdExit\r
108 \r
109 :cmdList\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
120 REM\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
124 \r
125    GOTO :cmdExit\r
126 \r
127 :cmdLoaded\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
136    GOTO :cmdExit\r
137 \r
138 :cmdSlots\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
146    GOTO :cmdExit\r
147 \r
148 :cmdExit\r
149    EXIT /B %rtn%\r
150 \r
151 :cmdUnknown\r
152    ECHO '%cmd%' is an invalid command.\r
153    GOTO :usage\r
154 \r
155 REM\r
156 REM log whats done\r
157 REM\r
158 :debug\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
162    GOTO :EOF\r
163 \r
164 REM\r
165 REM Create a temporary file\r
166 REM\r
167 :make_temp_file\r
168    SET TMPFILE="%working_dir%\mtx.tmp"\r
169    IF EXIST %TMPFILE% (\r
170       ECHO Temp file security problem on: %TMPFILE%\r
171       EXIT /B 1\r
172    )\r
173    GOTO :EOF\r
174 \r
175 REM\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
180 REM\r
181 :wait_for_drive\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
186       bsleep 1\r
187    )\r
188    CALL :debug "Device %1 - not ready, timed out..."\r
189    GOTO :EOF\r