From 5440476eed9b005591a48fe697cc7b0006a56e6a Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Tue, 8 Jun 2004 08:44:05 +0000 Subject: [PATCH] Fix moving from one Pool to another git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1388 91ce42f0-d328-0410-95d8-f526ca767f89 --- .../examples/autochangers/locking-mtx-changer | 27 +++-- .../autochangers/mtx-changer.Adic-Scalar-24 | 111 +++++++++++++++--- bacula/kernstodo | 4 + bacula/src/dird/ua_cmds.c | 16 ++- bacula/src/win32/README.win32 | 3 + 5 files changed, 126 insertions(+), 35 deletions(-) diff --git a/bacula/examples/autochangers/locking-mtx-changer b/bacula/examples/autochangers/locking-mtx-changer index 451a36de98..8c43621b92 100644 --- a/bacula/examples/autochangers/locking-mtx-changer +++ b/bacula/examples/autochangers/locking-mtx-changer @@ -10,7 +10,7 @@ # you will have the following input to this script: # # mtx-changer "changer-device" "command" "slot" "archive-device" "drive-index" -# $1 $2 $3 $4 $5 +# $1 $2 $3 $4 $5 # # for example: # @@ -51,8 +51,8 @@ fi wait_for_drive() { while ! mt -f $1 status >/dev/null 2>/dev/null; do -# echo "Device $1 - not ready, retrying..." - sleep 5 +# echo "Device $1 - not ready, retrying..." + sleep 5 done } @@ -72,9 +72,10 @@ changer_lock() { changer_unlock() { LOCKPID="`cat $LOCKFILE 2>/dev/null`" if [ "$LOCKPID" != $$ ]; then - echo "$0: Invalid lock file (${LOCKFILE}) - not owned by us!" - exit 1 + echo "$0: Invalid lock file (${LOCKFILE}) - not owned by us!" + exit 1 fi + rm -f $LOCKFILE } @@ -93,10 +94,10 @@ case $cmd in ;; *) if test $# -lt 3; then - echo "usage: mtx-changer ctl-device command slot archive-device drive" - echo " Insufficient number of arguments arguments given." - echo " Mimimum usage is first three arguments ..." - exit 1 + echo "usage: mtx-changer ctl-device command slot archive-device drive" + echo " Insufficient number of arguments arguments given." + echo " Mimimum usage is first three arguments ..." + exit 1 fi ;; esac @@ -110,11 +111,11 @@ case $cmd in # enable the following line if you need to eject the cartridge mt -f $device offline if test x$slot = x; then - ${MTX} -f $ctl unload - rtn=$? + ${MTX} -f $ctl unload + rtn=$? else - ${MTX} -f $ctl unload $slot $drive - rtn=$? + ${MTX} -f $ctl unload $slot $drive + rtn=$? fi ;; diff --git a/bacula/examples/autochangers/mtx-changer.Adic-Scalar-24 b/bacula/examples/autochangers/mtx-changer.Adic-Scalar-24 index 16577cd605..8f0dc9d580 100755 --- a/bacula/examples/autochangers/mtx-changer.Adic-Scalar-24 +++ b/bacula/examples/autochangers/mtx-changer.Adic-Scalar-24 @@ -2,39 +2,116 @@ # # Bacula interface to mtx autoloader # -# mtx-changer "changer-device" "command" "slot" +# $Id$ # -# Modified for Adic Scalar 24 with one LTO drive by -# M. Ludovic Strappozon +# If you set in your Device resource # -case "$2" in +# Changer Command = "path-to-this-script/mtx-changer" %c %o %S %a %d +# you will have the following input to this script: +# +# mtx-changer "changer-device" "command" "slot" "archive-device" "drive-index" +# $1 $2 $3 $4 $5 +# +# for example: +# +# mtx-changer /dev/sg0 load 1 /dev/nst0 0 (on a Linux system) +# +# If you need to an offline, refer to the drive as $4 +# e.g. mt -f $4 offline +# +# Many changers need an offline after the unload. Also many +# changers need a sleep 60 after the mtx load. +# +# N.B. If you change the script, take care to return either +# the mtx exit code or a 0. If the script exits with a non-zero +# exit code, Bacula will assume the request failed. +# + +MTX=/usr/sbin/mtx + +if test $# -lt 2 ; then + echo "usage: mtx-changer ctl-device command slot archive-device drive" + echo " Insufficient number of arguments arguments given." + echo " Mimimum usage is first two arguments ..." + exit 1 +fi + +# Setup arguments +ctl=$1 +cmd="$2" +slot=$3 +device=$4 +# If drive not given, default to 0 +if test $# = 5 ; then + drive=$5 +else + drive=0 +fi + +${MTX} -f $1 inventory + +# +# Check for special cases where only 2 arguments are needed, +# all others are a minimum of 3 +case $cmd in + loaded) + ;; + unload) + ;; + list) + ;; + slots) + ;; + *) + if test $# -lt 3; then + echo "usage: mtx-changer ctl-device command slot archive-device drive" + echo " Insufficient number of arguments arguments given." + echo " Mimimum usage is first three arguments ..." + exit 1 + fi + ;; +esac + + +case $cmd in unload) -# echo "Doing mtx -f $1 $2" - mtx -f $1 $2 +# echo "Doing mtx -f $ctl unload $slot $drive" +# +# enable the following line if you need to eject the cartridge +# mt -f $device offline + if test x$slot = x; then + ${MTX} -f $ctl unload + else + ${MTX} -f $ctl unload $slot $drive + fi ;; load) -# echo "Doing mtx -f $1 $2 $3" - mtx -f $1 $2 $3 - sleep 20 +# echo "Doing mtx -f $ctl load $slot $drive" + ${MTX} -f $ctl load $slot $drive + rtn=$? +# +# Increase the sleep time if you have a slow device + sleep 15 + exit $rtn ;; - list) + list) # echo "Requested list" -# mtx -f $1 status | grep " *Storage Element [0-9]*:.*Full" | awk "{print \$3}" | sed "s/:.*$/ /g" | tr -d "[\r\n]" - mtx -f $1 status | grep " *Storage Element [0-9]*:.*Full" | awk "{print \$3 \$4}" | sed "s/Full *\(:VolumeTag=\)*//" + ${MTX} -f $ctl status | grep " *Storage Element [0-9]*:.*Full" | awk '{print $3 $4}' | sed "s/Full *\(:VolumeTag=\)*//" ;; loaded) -# echo "Request loaded" - mtx -f $1 status >/tmp/mtx.$$ - cat /tmp/mtx.$$ | grep "^Data Transfer Element 0:Full" | awk "{print \$7}" - cat /tmp/mtx.$$ | grep "^Data Transfer Element 0:Empty" | awk "{print 0}" + ${MTX} -f $ctl status >/tmp/mtx.$$ + rtn=$? + cat /tmp/mtx.$$ | grep "^Data Transfer Element $drive:Full" | awk '{print $7}' + cat /tmp/mtx.$$ | grep "^Data Transfer Element $drive:Empty" | awk '{print 0}' rm -f /tmp/mtx.$$ + exit $rtn ;; slots) # echo "Request slots" - mtx -f $1 status | grep " *Storage Changer" | awk "{print \$5}" + ${MTX} -f $ctl status | grep " *Storage Changer" | awk '{print $5}' ;; esac diff --git a/bacula/kernstodo b/bacula/kernstodo index b4b2113438..521c9cf2db 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -42,6 +42,8 @@ For 1.33 Testing/Documentation: 1.34 Cleanup - Add multiple-media-types.txt - look at mxt-changer.html +- Document a get out of jail procedure if everything breaks if you lost/broke + the Catalog. 1.34.3 Items: - Document dbcheck conf changes. @@ -51,6 +53,8 @@ For 1.33 Testing/Documentation: - Document vendor database repair. For version 1.35: +- Implement "label slots=1,2... pool=yyy barcodes" +- Make ? do a help command (no return needed). - Do tape alerts -- see tapealert.txt - Implement restore directory. - Add All Local Partitions = yes to new style saves. diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index bf654b3e67..2baa3438e3 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -796,6 +796,7 @@ static void update_volrecycle(UAContext *ua, char *val, MEDIA_DBR *mr) static void update_volpool(UAContext *ua, char *val, MEDIA_DBR *mr) { POOL_DBR pr; + POOLMEM *query; memset(&pr, 0, sizeof(pr)); bstrncpy(pr.Name, val, sizeof(pr.Name)); @@ -804,14 +805,19 @@ static void update_volpool(UAContext *ua, char *val, MEDIA_DBR *mr) } mr->PoolId = pr.PoolId; /* set new PoolId */ /* - * Make sure to use db_update... rather than doing this directly, - * so that any Slot is handled correctly. */ - if (!db_update_media_record(ua->jcr, ua->db, mr)) { - bsendmsg(ua, _("Error updating media record Pool: ERR=%s"), db_strerror(ua->db)); - } else { + query = get_pool_memory(PM_MESSAGE); + db_lock(ua->db); + Mmsg(&query, "UPDATE Media SET PoolId=%d WHERE MediaId=%u", + mr->PoolId, mr->MediaId); + if (!db_sql_query(ua->db, query, NULL, NULL)) { + bsendmsg(ua, "%s", db_strerror(ua->db)); + } else { bsendmsg(ua, _("New Pool is: %s\n"), pr.Name); } + db_make_inchanger_unique(ua->jcr, ua->db, mr); + db_unlock(ua->db); + free_pool_memory(query); } static void update_volfrompool(UAContext *ua, MEDIA_DBR *mr) diff --git a/bacula/src/win32/README.win32 b/bacula/src/win32/README.win32 index 23e2098b4b..599666f5a9 100644 --- a/bacula/src/win32/README.win32 +++ b/bacula/src/win32/README.win32 @@ -91,3 +91,6 @@ Instructions if you want to build wx-console : - Additional information on using the free Micrsosoft C++ see http://sapdb.2scale.net/moin.cgi/MS_20C_2b_2b_20Toolkit + +NOTE! I (Kern) cannot build wxWindows with the Makefile -- I had to use +VC Studio directly to do so following their instructions. -- 2.39.5