dahdi_cfg: minor: Rename fo_real to dry_run
[dahdi/tools.git] / dahdi.init
1 #!/bin/sh
2 #
3 # dahdi         This shell script takes care of loading and unloading \
4 #               DAHDI Telephony interfaces
5 # chkconfig: 2345 9 92
6 # description: The DAHDI drivers allow you to use your linux \
7 # computer to accept incoming data and voice interfaces
8 #
9 # config: /etc/dahdi/init.conf
10
11 ### BEGIN INIT INFO
12 # Provides:        dahdi
13 # Required-Start:  $local_fs $remote_fs
14 # Required-Stop:   $local_fs $remote_fs
15 # Should-Start:    $network $syslog
16 # Should-Stop:     $network $syslog
17 # Default-Start:   2 3 4 5
18 # Default-Stop:    0 1 6
19 # Short-Description: DAHDI kernel modules
20 # Description:     dahdi - load and configure DAHDI modules
21 ### END INIT INFO
22
23 initdir=/etc/init.d
24
25 # Don't edit the following values. Edit /etc/dahdi/init.conf instead.
26
27 DAHDI_CFG=/usr/sbin/dahdi_cfg
28 DAHDI_CFG_CMD=${DAHDI_CFG_CMD:-"$DAHDI_CFG"} # e.g: for a custom system.conf location
29
30 FXOTUNE=/usr/sbin/fxotune
31
32 # The default syncer Astribank. Usually set automatically to a sane
33 # value by xpp_sync(1) if you have an Astribank. You can set this to an
34 # explicit Astribank (e.g: 01).
35 XPP_SYNC=auto
36
37 # The maximal timeout (seconds) to wait for udevd to finish generating
38 # device nodes after the modules have loaded and before running dahdi_cfg.
39 DAHDI_DEV_TIMEOUT=20
40
41 # A list of modules to unload when stopping.
42 # All of their dependencies will be unloaded as well.
43 DAHDI_UNLOAD_MODULES="dahdi"
44
45 #
46 # Determine which kind of configuration we're using
47 #
48 system=redhat  # assume redhat
49 if [ -f /etc/debian_version ]; then
50     system=debian
51 fi
52
53 if [ -f /etc/gentoo-release ]; then
54     system=debian
55 fi
56
57 if [ -f /etc/SuSE-release -o -f /etc/novell-release ]
58 then
59     system=debian
60 fi
61
62 # Source function library.
63 if [ $system = redhat ]; then
64     . $initdir/functions || exit 0
65 fi
66
67 DAHDI_MODULES_FILE="/etc/dahdi/modules"
68
69 [ -r /etc/dahdi/init.conf ] && . /etc/dahdi/init.conf
70
71 if [ $system = redhat ]; then
72         LOCKFILE=/var/lock/subsys/dahdi
73 fi
74
75 # recursively unload a module and its dependencies, if possible.
76 # where's modprobe -r when you need it?
77 # inputs: module to unload.
78 # returns: the result from
79 unload_module() {
80         module="$1"
81         line=`lsmod 2>/dev/null | grep "^$1 "`
82         if [ "$line" = '' ]; then return; fi # module was not loaded
83
84         set -- $line
85         # $1: the original module, $2: size, $3: refcount, $4: deps list
86         mods=`echo $4 | tr , ' '`
87         ec_modules=""
88         # xpp_usb keeps the xpds below busy if an xpp hardware is
89         # connected. Hence must be removed before them:
90         case "$module" in xpd_*) mods="xpp_usb $mods";; esac
91
92         for mod in $mods; do
93                 case "$mod" in
94                 dahdi_echocan_*)
95                         ec_modules="$mod $ec_modules"
96                         ;;
97                 *)
98                         # run in a subshell, so it won't step over our vars:
99                         (unload_module $mod)
100                         ;;
101                 esac
102         done
103         # Now that all the other dependencies are unloaded, we can unload the
104         # dahdi_echocan modules.  The drivers that register spans may keep
105         # references on the echocan modules before they are unloaded.
106         for mod in $ec_modules; do
107                 (unload_module $mod)
108         done
109         rmmod $module
110 }
111
112 unload_modules() {
113         for module in $DAHDI_UNLOAD_MODULES; do
114                 unload_module $module
115         done
116 }
117
118 # In (xpp) hotplug mode, the init script is also executed from the
119 # hotplug hook. In that case it should not attempt to loade modules.
120 #
121 # This function only retunrs false (1) if we're in hotplug mode and
122 # coming from the hotplug hook script.
123 hotplug_should_load_modules() {
124         if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" != '' ]
125         then
126                 return 1
127         fi
128         return 0
129 }
130
131 # In (xpp) hotplug mode: quit after we loaded modules.
132 #
133 # In hotplug mode, the main run should end here, whereas the rest of the
134 # script should be finished by the instance running from the hook.
135 # Note that we only get here if there are actually Astribanks on the
136 # system (otherwise noone will trigger the run of the hotplug hook
137 # script).
138 hotplug_exit_after_load() {
139         if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" = '' ]
140         then
141                 exit 0
142         fi
143 }
144
145 # Initialize the Xorcom Astribank (xpp/) using perl utiliites:
146 xpp_startup() {
147         # do nothing if there are no astribank devices:
148         if ! /usr/share/dahdi/waitfor_xpds; then return 0; fi
149
150         hotplug_exit_after_load
151 }
152
153
154 hpec_start() {
155         # HPEC license found
156         if ! echo /var/lib/digium/licenses/HPEC-*.lic | grep -v '\*' | grep -q .; then
157                 return
158         fi
159
160         # dahdihpec_enable not installed in /usr/sbin
161         if [ ! -f /usr/sbin/dahdihpec_enable ]; then
162                 echo -n "Running dahdihpec_enable: Failed"
163                 echo -n "."
164                 echo "  The dahdihpec_enable binary is not installed in /usr/sbin."
165                 return
166         fi
167
168         # dahdihpec_enable not set executable
169         if [ ! -x /usr/sbin/dahdihpec_enable ]; then
170                 echo -n "Running dahdihpec_enable: Failed"
171                 echo -n "."
172                 echo "  /usr/sbin/dahdihpec_enable is not set as executable."
173                 return
174         fi
175
176         # dahdihpec_enable properly installed
177         if [ $system = debian ]; then
178                 echo -n "Running dahdihpec_enable: "
179                 /usr/sbin/dahdihpec_enable 2> /dev/null
180         elif [ $system = redhat ]; then
181                 action "Running dahdihpec_enable: " /usr/sbin/dahdihpec_enable
182         fi
183         if [ $? = 0 ]; then
184                 echo -n "done"
185                 echo "."
186         else
187                 echo -n "Failed"
188                 echo -n "."
189                 echo "  This can be caused if you had already run dahdihpec_enable, or if your HPEC license is no longer valid."
190         fi
191 }
192
193 shutdown_dynamic() {
194         if ! grep -q ' DYN/' /proc/dahdi/* 2>/dev/null; then return; fi
195
196         # we should only get here if we have dynamic spans. Right?
197         $DAHDI_CFG_CMD -s
198 }
199
200 load_modules() {
201         # Some systems, e.g. Debian Lenny, add here -b, which will break
202         # loading of modules blacklisted in modprobe.d/*
203         unset MODPROBE_OPTIONS
204         modules=`sed -e 's/#.*$//' $DAHDI_MODULES_FILE 2>/dev/null`
205         #if [ "$modules" = '' ]; then
206                 # what?
207         #fi
208         echo "Loading DAHDI hardware modules:"
209         modprobe dahdi
210         for line in $modules; do
211                 if [ $system = debian ]; then
212                         echo -n "   ${line}: "
213                         if modprobe $line 2> /dev/null; then
214                                 echo -n "done"
215                         else
216                                 echo -n "error"
217                         fi
218                 elif [ $system = redhat ]; then
219                         action "  ${line}: " modprobe $line
220                 fi
221         done
222         echo ""
223 }
224
225 # Make sure that either dahdi is loaded or modprobe-able
226 dahdi_modules_loadable() {
227         modinfo dahdi >/dev/null 2>&1 || lsmod | grep -q -w ^dahdi
228 }
229
230 if [ ! -x "$DAHDI_CFG" ]; then
231        echo "dahdi_cfg not executable"
232        exit 0
233 fi
234
235 RETVAL=0
236
237 # See how we were called.
238 case "$1" in
239   start)
240         if ! dahdi_modules_loadable; then
241                 echo "No DAHDI modules on the system. Not starting"
242                 exit 0
243         fi
244         if hotplug_should_load_modules; then
245                 load_modules
246         fi
247
248         TMOUT=$DAHDI_DEV_TIMEOUT # max secs to wait
249
250         while [ ! -d /dev/dahdi ] ; do
251                 sleep 1
252                 TMOUT=`expr $TMOUT - 1`
253                 if [ $TMOUT -eq 0 ] ; then
254                         echo "Error: missing /dev/dahdi!"
255                         exit 1
256                 fi
257         done
258
259         xpp_startup
260
261         # Assign all spans that weren't handled via udev + /etc/dahdi/assigned-spans.conf
262         /usr/share/dahdi/dahdi_auto_assign_compat
263
264         if [ $system = debian ]; then
265             echo -n "Running dahdi_cfg: "
266             $DAHDI_CFG_CMD 2> /dev/null && echo -n "done"
267             echo "."
268         elif [ $system = redhat ]; then
269             action "Running dahdi_cfg: " $DAHDI_CFG_CMD
270         fi
271         RETVAL=$?
272
273         if [ "$LOCKFILE" != '' ]; then
274                 [ $RETVAL -eq 0 ] && touch $LOCKFILE
275         fi
276
277         if [ -x "$FXOTUNE" ] && [ -r /etc/fxotune.conf ]; then
278                 # Allowed to fail if e.g. Asterisk already uses channels:
279                 $FXOTUNE -s || :
280         fi
281
282         # Do not try to call xpp_sync if there are no Astribank devices
283         # installed.
284         if test -e /sys/bus/astribanks; then 
285                 # Set the right Astribanks ticker:
286                 LC_ALL=C xpp_sync "$XPP_SYNC"
287         fi
288
289         hpec_start
290         ;;
291   stop)
292         # Unload drivers
293         #shutdown_dynamic # FIXME: needs test from someone with dynamic spans
294         echo -n "Unloading DAHDI hardware modules: "
295         if unload_modules; then
296                 echo "done"
297         else
298                 echo "error"
299         fi
300         if [ "$LOCKFILE" != '' ]; then
301                 [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
302         fi
303         ;;
304   unload)
305         unload_modules
306         ;;
307   restart|force-reload)
308         $0 stop
309         $0 start
310         ;;
311   reload)
312         if [ $system = debian ]; then
313             echo -n "Rerunning dahdi_cfg: "
314             $DAHDI_CFG_CMD 2> /dev/null && echo -n "done"
315             echo "."
316         elif [ $system = redhat ]; then
317             action "Rerunning dahdi_cfg: " $DAHDI_CFG_CMD
318         fi
319         RETVAL=$?
320         ;;
321   status)
322         if [ -d /proc/dahdi ]; then
323                 /usr/sbin/lsdahdi
324                 RETVAL=0
325         else
326                 RETVAL=3
327         fi
328         ;;
329   *)
330         echo "Usage: dahdi {start|stop|restart|status|reload|unload}"
331         exit 1
332 esac
333
334 exit $RETVAL
335