Imported Upstream version 2.4.4p3
[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 CHANGERFILE=`amgetconf$SUF changerfile`
81 ACCESSFILE=$CHANGERFILE-access
82 CLEANFILE=$CHANGERFILE-clean
83 SLOTFILE=$CHANGERFILE-slot
84 [ ! -f $ACCESSFILE ] && echo 0 > $ACCESSFILE
85 [ ! -f $CLEANFILE ] && echo 0 > $CLEANFILE
86 [ ! -f $SLOTFILE ] && echo 0 > $SLOTFILE
87 ACCESSCOUNT=`cat $ACCESSFILE`
88 CLEANCOUNT=`cat $CLEANFILE`
89
90 FIRSTSLOT=1
91 LASTSLOT=`amgetconf$SUF tapecycle`
92 CURSLOT=0
93 CLEANSLOT=$LASTSLOT
94
95 load() {
96   WHICHSLOT=$1;
97   ln -s $SLOTDIR/slot$WHICHSLOT $SLOTDIR/data
98   echo $WHICHSLOT > $SLOTFILE
99 }
100
101 unload() {
102   rm -f $SLOTDIR/data
103   echo "0" > $SLOTFILE
104 }
105
106 readstatus() {
107   CURSLOT=`cat $SLOTFILE`
108 }
109
110 loadslot() {
111   WHICHSLOT=$1
112
113   case $WHICHSLOT in
114     [0-9]*) TYPE="digit";;
115     *) TYPE="string";;
116   esac
117
118   readstatus
119   NEWSLOT=0
120   if [ $WHICHSLOT = "current" ]; then
121     if [ $CURSLOT -le 0 ]; then
122       load $FIRSTSLOT
123       echo "$FIRSTSLOT $TAPE"
124       exit 0
125     else
126       echo "$CURSLOT $TAPE"
127       exit 0
128     fi
129   elif [ $WHICHSLOT = "next" -o $WHICHSLOT = "advance" ]; then
130     NEWSLOT=`expr $CURSLOT + 1`
131     [ $NEWSLOT -gt $LASTSLOT ] && NEWSLOT=$FIRSTSLOT
132   elif [ $WHICHSLOT = "prev" ]; then
133       NEWSLOT=`expr $CURSLOT - 1`
134       [ $NEWSLOT -lt $FIRSTSLOT ] && NEWSLOT=$LASTSLOT
135   elif [ $WHICHSLOT = "first" ]; then
136       NEWSLOT=$FIRSTSLOT
137   elif [ $WHICHSLOT = "last" ]; then
138       NEWSLOT=$LASTSLOT
139   elif [ $TYPE = "digit" ]; then
140     if [ $WHICHSLOT -ge $FIRSTSLOT -a $WHICHSLOT -le $LASTSLOT ]; then
141       NEWSLOT=$WHICHSLOT
142     else
143       echo "0 illegal request"
144       exit 1
145     fi
146   elif [ $WHICHSLOT = "clean" ]; then
147     NEWSLOT=$CLEANSLOT
148   else
149     echo "0 illegal request"
150     exit 1
151   fi
152   if [ $NEWSLOT = $CURSLOT ]; then
153     echo "$CURSLOT $TAPE"
154     exit 0
155   fi
156   if [ $NEWSLOT = $CLEANSLOT ]; then
157     expr $CLEANCOUNT + 1 > $CLEANFILE
158     echo 0 > $ACCESSFILE
159   else
160     expr $ACCESSCOUNT + 1 > $ACCESSFILE
161     if [ $ACCESSCOUNT -gt $LASTSLOT ]; then
162       $MYNAME -slot clean >/dev/null
163     fi
164   fi
165
166   readstatus
167   if [ $CURSLOT -ne 0 ]; then
168     unload
169   fi
170
171   if [ $WHICHSLOT = "advance" ]; then
172     echo "$NEWSLOT /dev/null"
173     exit 0
174   fi
175   load $NEWSLOT
176   echo "$NEWSLOT $TAPE"
177   exit 0
178 }
179
180 info() {
181   readstatus
182   echo "$CURSLOT $LASTSLOT $FIRSTSLOT"
183   exit 0
184 }
185
186 reset() {
187   readstatus
188   [ $CURSLOT -gt 0 ] && unload
189   load $FIRSTSLOT
190   echo "$FIRSTSLOT $tape"
191   exit 0
192 }
193
194 eject() {
195   readstatus
196   if [ $CURSLOT -le 0 ]; then
197     echo "0 Drive was not loaded"
198     exit 1
199   else
200     unload
201     echo $CURSLOT
202     exit 0
203   fi
204 }
205
206
207 while [ $# -ge 1 ];do
208   case $1 in
209     -slot)
210            shift
211            loadslot $*
212            ;;
213     -clean)
214            shift
215            loadslot clean
216            ;;
217     -current)
218            shift
219            loadslot current
220            ;;
221     -next)
222            shift
223            loadslot next
224            ;;
225     -advance)
226            shift
227            loadslot advance
228            ;;
229     -prev)
230            shift
231            loadslot prev
232            ;;
233     -first)
234            shift
235            loadslot first
236            ;;
237     -last)
238            shift
239            loadslot last
240            ;;
241     -info)
242            shift
243            info
244            ;;
245     -reset)
246             shift
247             reset
248             ;;
249     -eject)
250             shift
251             eject
252             ;;
253     *)
254        echo "Unknown option $1"
255        exit 2
256        ;;
257   esac
258 done
259