Imported Upstream version 2.5.0
[debian/amanda] / changer-src / chg-disk.sh.in
1 #! /bin/sh
2 #
3 # Amanda, The Advanced Maryland Automatic Network Disk Archiver
4 # Copyright (c) 1991-1999 University of Maryland at College Park
5 # All Rights Reserved.
6 #
7 # Permission to use, copy, modify, distribute, and sell this software and its
8 # documentation for any purpose is hereby granted without fee, provided that
9 # the above copyright notice appear in all copies and that both that
10 # copyright notice and this permission notice appear in supporting
11 # documentation, and that the name of U.M. not be used in advertising or
12 # publicity pertaining to distribution of the software without specific,
13 # written prior permission.  U.M. makes no representations about the
14 # suitability of this software for any purpose.  It is provided "as is"
15 # without express or implied warranty.
16 #
17 # U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
18 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
19 # BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
21 # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 #
24 # Author: Jean-Christian SIMONETTI, System and Network Engineer
25 #                                   Wanadoo Portails
26 #                                   Sophia Antipolis, France
27 #
28 #       This changer script is based on a directory structure like:
29 #       slot_root_dir -|
30 #                      |- info
31 #                      |- data -> slot1
32 #                      |- slot1
33 #                      |- slot2
34 #                      |- ...
35 #                      |- slotn
36 #       where 'slot_root_dir' is the tapedev 'file:xxx' parameter and 'n'
37 #       is the tapecycle parameter.
38 #       
39 #       To use this driver, just put the line 'tpchanger "chg-disk"' in your
40 #       amanda.conf.
41 #
42 #       Example of use:
43 #       --- cut here ---
44 #       tapedev  "file:/BACKUP2/slots/"
45 #       rawtapedev "file:/BACKUP2/slots/"
46 #       changerdev "/dev/null"
47 #       tpchanger "chg-disk"
48 #       changerfile "/usr/local/amanda/etc/changer"
49 #       tapetype HARD-DISK
50 #       define tapetype HARD-DISK {
51 #           length 12000 mbytes
52 #       }
53 #       --- cut here ---
54 #
55 #       The number of slot is equal to your tapecyle.
56 #       You must create the slots and data directory.
57 #
58
59
60 prefix=@prefix@
61 exec_prefix=@exec_prefix@
62 sbindir=@sbindir@
63 libexecdir=@libexecdir@
64  
65 PATH=$sbindir:$libexecdir:/usr/bin:/bin:/usr/sbin:/sbin:/usr/ucb:/usr/local/bin
66 export PATH
67
68 USE_VERSION_SUFFIXES="@USE_VERSION_SUFFIXES@"
69 if test "$USE_VERSION_SUFFIXES" = "yes"; then
70     SUF="-@VERSION@"
71 else
72     SUF=
73 fi
74
75 MYNAME=$0
76
77 TAPE=`amgetconf$SUF tapedev`
78 SLOTDIR=`echo $TAPE | sed 's/^file://'`
79
80 isinteger() {
81             # should be exactly one arg
82         [ $# = 1 ]  || return 1
83             # if arg is null, no expr needed
84         [ "${1}" = '' ] && return 1
85             # expr will return 0 on match
86         expr "$1" : '[0-9][0-9]*$' > /dev/null 2>&1
87 }
88
89 # need rwx access to directory of changer file
90 CHANGERFILE=`amgetconf$SUF changerfile`
91 CFDir=`dirname ${CHANGERFILE}`
92 [ -d ${CFDir} -a -r ${CFDir} -a -w ${CFDir} -a -x ${CFDir} ] ||
93         { echo "$MYNAME: need 'rwx' access to '$CFDir'" ; exit 2 ; }
94
95 # check or create changer metadata files
96 ACCESSFILE=$CHANGERFILE-access
97 [ -f $ACCESSFILE -a -r $ACCESSFILE -a -w $ACCESSFILE ] ||
98         echo 0 > $ACCESSFILE ||
99         { echo "$MYNAME: could not access or create '$ACCESSFILE'" ; exit 2 ; }
100 CLEANFILE=$CHANGERFILE-clean
101 [ -f $CLEANFILE -a -r $CLEANFILE -a -w $CLEANFILE ] ||
102         echo 0 > $CLEANFILE ||
103         { echo "$MYNAME: could not access or create '$CLEANFILE'" ; exit 2 ; }
104 SLOTFILE=$CHANGERFILE-slot
105 [ -f $SLOTFILE -a -r $SLOTFILE -a -w $SLOTFILE ] ||
106         echo 0 > $SLOTFILE ||
107         { echo "$MYNAME: could not access or create '$SLOTFILE'" ; exit 2 ; }
108
109 # read and check metadata
110 ACCESSCOUNT=`cat $ACCESSFILE`
111 isinteger $ACCESSCOUNT || { ACCESSCOUNT=0 ; echo 0 > $ACCESSFILE ; }
112 CLEANCOUNT=`cat $CLEANFILE`
113 isinteger $CLEANCOUNT || { CLEANCOUNT=0 ; echo 0 > $CLEANFILE ; }
114
115 FIRSTSLOT=1
116 LASTSLOT=`amgetconf$SUF tapecycle`
117 CURSLOT=0
118 CLEANSLOT=$LASTSLOT
119
120 load() {
121   WHICHSLOT=$1;
122   # unload should have been called, but just in case ...
123   [ -h $SLOTDIR/data ] && unload
124   ln -s $SLOTDIR/slot$WHICHSLOT $SLOTDIR/data
125   echo $WHICHSLOT > $SLOTFILE
126 }
127
128 unload() {
129   rm -f $SLOTDIR/data
130   echo "0" > $SLOTFILE
131 }
132
133 readstatus() {
134   CURSLOT=`cat $SLOTFILE`
135 }
136
137 loadslot() {
138   WHICHSLOT=$1
139
140   TYPE=string   # default if not numeric
141   isinteger $WHICHSLOT && TYPE=digit
142
143   readstatus
144   NEWSLOT=0
145   if [ $WHICHSLOT = "current" ]; then
146     if [ $CURSLOT -le 0 ]; then
147       load $FIRSTSLOT
148       echo "$FIRSTSLOT $TAPE"
149       exit 0
150     else
151       echo "$CURSLOT $TAPE"
152       exit 0
153     fi
154   elif [ $WHICHSLOT = "next" -o $WHICHSLOT = "advance" ]; then
155     NEWSLOT=`expr $CURSLOT + 1`
156     [ $NEWSLOT -gt $LASTSLOT ] && NEWSLOT=$FIRSTSLOT
157   elif [ $WHICHSLOT = "prev" ]; then
158       NEWSLOT=`expr $CURSLOT - 1`
159       [ $NEWSLOT -lt $FIRSTSLOT ] && NEWSLOT=$LASTSLOT
160   elif [ $WHICHSLOT = "first" ]; then
161       NEWSLOT=$FIRSTSLOT
162   elif [ $WHICHSLOT = "last" ]; then
163       NEWSLOT=$LASTSLOT
164   elif [ $TYPE = "digit" ]; then
165     if [ $WHICHSLOT -ge $FIRSTSLOT -a $WHICHSLOT -le $LASTSLOT ]; then
166       NEWSLOT=$WHICHSLOT
167     else
168       echo "0 illegal request"
169       exit 1
170     fi
171   elif [ $WHICHSLOT = "clean" ]; then
172     NEWSLOT=$CLEANSLOT
173   else
174     echo "0 illegal request"
175     exit 1
176   fi
177   if [ $NEWSLOT = $CURSLOT ]; then
178     echo "$CURSLOT $TAPE"
179     exit 0
180   fi
181   if [ $NEWSLOT = $CLEANSLOT ]; then
182     expr ${CLEANCOUNT:=0} + 1 > $CLEANFILE
183     echo 0 > $ACCESSFILE
184   else
185     expr ${ACCESSCOUNT:=0} + 1 > $ACCESSFILE
186     if [ $ACCESSCOUNT -gt $LASTSLOT ]; then
187       $MYNAME -slot clean >/dev/null
188     fi
189   fi
190
191   readstatus
192   if [ $CURSLOT -ne 0 ]; then
193     unload
194   fi
195
196   if [ $WHICHSLOT = "advance" ]; then
197     echo "$NEWSLOT /dev/null"
198     exit 0
199   fi
200   load $NEWSLOT
201   echo "$NEWSLOT $TAPE"
202   exit 0
203 }
204
205 info() {
206   readstatus
207   echo "$CURSLOT $LASTSLOT $FIRSTSLOT"
208   exit 0
209 }
210
211 reset() {
212   readstatus
213   [ $CURSLOT -gt 0 ] && unload
214   load $FIRSTSLOT
215   echo "$FIRSTSLOT $tape"
216   exit 0
217 }
218
219 eject() {
220   readstatus
221   if [ $CURSLOT -le 0 ]; then
222     echo "0 Drive was not loaded"
223     exit 1
224   else
225     unload
226     echo $CURSLOT
227     exit 0
228   fi
229 }
230
231
232 while [ $# -ge 1 ];do
233   case $1 in
234     -slot)
235            shift
236            loadslot $*
237            ;;
238     -clean)
239            shift
240            loadslot clean
241            ;;
242     -current)
243            shift
244            loadslot current
245            ;;
246     -next)
247            shift
248            loadslot next
249            ;;
250     -advance)
251            shift
252            loadslot advance
253            ;;
254     -prev)
255            shift
256            loadslot prev
257            ;;
258     -first)
259            shift
260            loadslot first
261            ;;
262     -last)
263            shift
264            loadslot last
265            ;;
266     -info)
267            shift
268            info
269            ;;
270     -reset)
271             shift
272             reset
273             ;;
274     -eject)
275             shift
276             eject
277             ;;
278     *)
279        echo "Unknown option $1"
280        exit 2
281        ;;
282   esac
283 done
284