Imported Upstream version 2.6.0
[debian/amanda] / changer-src / chg-lib.sh.in
1 ################################################################################
2 # You may want to customize these values
3 ################################################################################
4
5 # These are the defaults discovered by configure when Amanda was installed.
6 # They can be overridden here, or by by 'mt_binary' and 'mtx_binary', 
7 # respectively, in the changerfile (currently only for chg-zd-mtx.sh and
8 # chg-manual.sh).
9
10 MT=@MT@
11 MTX=@MTX@
12
13 # This is the flag used to specify a device filename to 'mt', usually '-f'
14 MTF=@MT_FILE_FLAG@
15
16 ################################################################################
17 # No user-level customization should be required beyond this point.
18 ################################################################################
19
20 prefix="@prefix@"
21 exec_prefix="@exec_prefix@"
22 sbindir="@sbindir@"
23 libexecdir="@libexecdir@"
24 amlibexecdir="@amlibexecdir@"
25 . "${amlibexecdir}/amanda-sh-lib.sh"
26
27 ####
28 # Eponymous functions to access various amanda apps
29 # TODO: move to amanda-sh-lib.sh
30
31 if test "@USE_VERSION_SUFFIXES@" = "yes"; then
32     amgetconf() {
33         "${sbindir}/amgetconf-@VERSION@" "${@}"
34     }
35     amdevcheck() {
36         "${sbindir}/amdevcheck-@VERSION@" "${@}"
37     }
38 else
39     amgetconf() {
40         "${sbindir}/amgetconf" "${@}"
41     }
42     amdevcheck() {
43         "${sbindir}/amdevcheck" "${@}"
44     }
45 fi
46
47 # This function tries to find a useable mt binary. If a fully-qualified path
48 # was provided at configure time or via a config file, we check that it
49 # exists and is executable. If an incomplete path was specified (e.g., "mt"),
50 # we ask the shell to search the path. Returns 0 on success, 1 on failure.
51
52 try_find_mt() {
53     # Only do this once.
54     if test -n $mt_found; then
55         return 0
56     fi
57
58     if test -z $MT; then
59         MT=mt
60     fi
61
62     if "`echo $MT | dd bs=1 count=1`" = "/"; then
63         if ! test -f "${MT}"; then
64             echo `_ "mt binary at '%s' not found" "$MTX"`
65             return 1
66         fi
67         if ! test -x "${MT}"; then
68             echo `_ "mt binary at '%s' is not executable" "$MTX"`
69             return 1
70         fi
71     else
72         # try running it to see if the shell can find it
73         "$MT" >/dev/null 2>/dev/null
74         if test $? -eq 127 -o $? -eq 126; then
75             echo `_ "Could not run mt binary at '%s'" "$MTX"`
76             return 1
77         fi
78     fi
79
80     mt_found=yes
81     return 0
82 }
83
84 # This function strips the tape: from the front of device names.
85 # Capture its output with ``.
86 tape_device_filename() {
87     # Easy (?) to express this in Perl.
88     perl -e '$ARGV[0] =~ /^(?:([^:]+):)?(.*)$/;
89              print $2 if ($1 || "tape") eq "tape"' "$1"
90 }
91
92 # Runs amdevcheck to find out if a particular device is usable. Finds the
93 # config name based on pwd, so run it from the config directory. The sole
94 # argument should be the device name to check. Note that amdevcheck can FP
95 # on device status, since some devices can't differentiate between device
96 # problems and an unlabeled volume.
97 amdevcheck_status() {
98     amdevcheck_config_dir=`pwd`
99     amdevcheck_config_name=`basename $amdevcheck_config_dir`
100     amdevcheck_output=`amdevcheck $amdevcheck_config_name $@`
101
102     if test $? -eq 0 || \
103         echo $amdevcheck_output | grep UNLABELED > /dev/null; then
104         return 0
105     else
106         return 1
107     fi
108 }
109
110 # This attempts to eject a device using whatever system tools are available.
111 # At the moment, that means mt for tapes, and nothing otherwise, but might
112 # be extended at some later time.
113
114 try_eject_device() {
115     if echo "$1" | grep -e '^tape:' > /dev/null; then
116         try_eject_device_tape="`echo \"$1\" | cut -b6-`"
117     elif echo "$1" | grep -v : > /dev/null; then
118         try_eject_device_tape="$1"
119     else
120         try_eject_device_tape=
121     fi
122
123     if test -n "$try_eject_device_tape"; then
124         if try_find_mt; then
125             $MT $MTF "$try_eject_device_tape" eject
126         fi
127     else
128         # Technically we failed to eject the device, but we presume that's
129         # because it doesn't require ejection.
130         return 0
131     fi
132 }