X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=changer-src%2Fchg-lib.sh.in;h=a53c48a8cfff139732818a8be0e8b8d2ccbe148c;hb=refs%2Fheads%2Fmaster;hp=2df29bf0d1ab7b833f7ddfdd16da6395ade04166;hpb=d3b2175e084f88c8736ad7073eacbf4670147aec;p=debian%2Famanda diff --git a/changer-src/chg-lib.sh.in b/changer-src/chg-lib.sh.in index 2df29bf..a53c48a 100644 --- a/changer-src/chg-lib.sh.in +++ b/changer-src/chg-lib.sh.in @@ -17,53 +17,120 @@ MTF=@MT_FILE_FLAG@ # No user-level customization should be required beyond this point. ################################################################################ -#### -# Set up paths, including PATH for finding amanda executables - -PATH="$PATH:@sbindir@:@libexecdir@" prefix="@prefix@" exec_prefix="@exec_prefix@" sbindir="@sbindir@" libexecdir="@libexecdir@" +amlibexecdir="@amlibexecdir@" +. "${amlibexecdir}/amanda-sh-lib.sh" #### -# Gettext - -#+ -# Function to: -# Simplify gettext usage by allowing printf format -# strings for translators, use _() identifier for -# xgettext extraction similar to "C" usage and -# collapsing "printf `gettext fmt` ...", which is -# used everywhere, into one function. -#- -_() { - fmt=`gettext -d amanda "$1"` - shift - printf "$fmt" $* +# Eponymous functions to access various amanda apps +# TODO: move to amanda-sh-lib.sh + +amgetconf() { + "${sbindir}/amgetconf" "${@}" +} +amdevcheck() { + "${sbindir}/amdevcheck" "${@}" } -#### -# Eponymous functions to access various amanda apps +# This function tries to find a useable mt binary. If a fully-qualified path +# was provided at configure time or via a config file, we check that it +# exists and is executable. If an incomplete path was specified (e.g., "mt"), +# we ask the shell to search the path. Returns 0 on success, 1 on failure. + +try_find_mt() { + # Only do this once. + if test -n $mt_found; then + return 0 + fi + + if test -z $MT; then + MT=mt + fi + + if "`echo $MT | dd bs=1 count=1`" = "/"; then + if ! test -f "${MT}"; then + echo `_ "mt binary at '%s' not found" "$MTX"` + return 1 + fi + if ! test -x "${MT}"; then + echo `_ "mt binary at '%s' is not executable" "$MTX"` + return 1 + fi + else + # try running it to see if the shell can find it + "$MT" >/dev/null 2>/dev/null + if test $? -eq 127 -o $? -eq 126; then + echo `_ "Could not run mt binary at '%s'" "$MTX"` + return 1 + fi + fi + + mt_found=yes + return 0 +} + +# This function strips the tape: from the front of device names. +# Capture its output with ``. +tape_device_filename() { + if echo "$1"|grep '^tape:' >/dev/null; then + echo "$1" | sed 's/^tape://' + else + if echo "$1"|grep '^/' >/dev/null; then + echo "$1" + fi + fi +} + +# Invoke amdevcheck to determine whether the device is ready for use. +# +# @return 0 if a tape is loaded or error +# @return 1 if a tape is tape offline or busy +# +# @side-effect: $amdevcheck_message is the contents of all MESSAGE lines from +# amdevcheck, suitable for use in higher-level error messages +amdevcheck_status() { + amdevcheck_message= + local amdevcheck_output=`amdevcheck . $@` + local amdevcheck_status=$? + + test "$amdevcheck_status" -ne 0 && return 0 + + # extract any messages + amdevcheck_message=`echo "$amdevcheck_output" | sed -n -e '/^MESSAGE /{' -e 's/^MESSAGE //' -e 'p' -e 'q' -e '}'` -if test "@USE_VERSION_SUFFIXES@" = "yes"; then - amgetconf() { - "${sbindir}/amgetconf-@VERSION@" "${@}" - } - ammt() { - "${sbindir}/ammt-@VERSION@" "${@}" - } - amdd() { - "${sbindir}/amdd-@VERSION@" "${@}" - } -else - amgetconf() { - "${sbindir}/amgetconf" "${@}" - } - amdd() { - "${sbindir}/amdd" "${@}" - } - amdd() { - "${sbindir}/amdd" "${@}" - } -fi + # Return 1 if it's possible that the device is offline or busy; if the device cannot + # distinguish this state from an error condition, then our caller will just have to + # time out + if echo "$amdevcheck_output" | $EGREP "VOLUME_MISSING|DEVICE_BUSY" > /dev/null; then + return 1 + else + return 0 + fi +} + +# This attempts to eject a device using whatever system tools are available. +# At the moment, that means mt for tapes, and nothing otherwise, but might +# be extended at some later time. + +try_eject_device() { + if echo "$1" | grep '^tape:' > /dev/null; then + try_eject_device_tape="`echo \"$1\" | cut -b6-`" + elif echo "$1" | grep -v : > /dev/null; then + try_eject_device_tape="$1" + else + try_eject_device_tape= + fi + + if test -n "$try_eject_device_tape"; then + if try_find_mt; then + $MT $MTF "$try_eject_device_tape" offline + fi + else + # Technically we failed to eject the device, but we presume that's + # because it doesn't require ejection. + return 0 + fi +}