Add support for Digium's new te13x line of cards
[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         # overriding locales for the above two, as perl can be noisy
153         # when locales are missing.
154         # No register all the devices if they didn't auto-register:
155         LC_ALL=C dahdi_registration on
156 }
157
158
159 hpec_start() {
160         # HPEC license found
161         if ! echo /var/lib/digium/licenses/HPEC-*.lic | grep -v '\*' | grep -q .; then
162                 return
163         fi
164
165         # dahdihpec_enable not installed in /usr/sbin
166         if [ ! -f /usr/sbin/dahdihpec_enable ]; then
167                 echo -n "Running dahdihpec_enable: Failed"
168                 echo -n "."
169                 echo "  The dahdihpec_enable binary is not installed in /usr/sbin."
170                 return
171         fi
172
173         # dahdihpec_enable not set executable
174         if [ ! -x /usr/sbin/dahdihpec_enable ]; then
175                 echo -n "Running dahdihpec_enable: Failed"
176                 echo -n "."
177                 echo "  /usr/sbin/dahdihpec_enable is not set as executable."
178                 return
179         fi
180
181         # dahdihpec_enable properly installed
182         if [ $system = debian ]; then
183                 echo -n "Running dahdihpec_enable: "
184                 /usr/sbin/dahdihpec_enable 2> /dev/null
185         elif [ $system = redhat ]; then
186                 action "Running dahdihpec_enable: " /usr/sbin/dahdihpec_enable
187         fi
188         if [ $? = 0 ]; then
189                 echo -n "done"
190                 echo "."
191         else
192                 echo -n "Failed"
193                 echo -n "."
194                 echo "  This can be caused if you had already run dahdihpec_enable, or if your HPEC license is no longer valid."
195         fi
196 }
197
198 shutdown_dynamic() {
199         if ! grep -q ' DYN/' /proc/dahdi/* 2>/dev/null; then return; fi
200
201         # we should only get here if we have dynamic spans. Right?
202         $DAHDI_CFG_CMD -s
203 }
204
205 load_modules() {
206         # Some systems, e.g. Debian Lenny, add here -b, which will break
207         # loading of modules blacklisted in modprobe.d/*
208         unset MODPROBE_OPTIONS
209         modules=`sed -e 's/#.*$//' $DAHDI_MODULES_FILE 2>/dev/null`
210         #if [ "$modules" = '' ]; then
211                 # what?
212         #fi
213         echo "Loading DAHDI hardware modules:"
214         modprobe dahdi
215         for line in $modules; do
216                 if [ $system = debian ]; then
217                         echo -n "   ${line}: "
218                         if modprobe $line 2> /dev/null; then
219                                 echo -n "done"
220                         else
221                                 echo -n "error"
222                         fi
223                 elif [ $system = redhat ]; then
224                         action "  ${line}: " modprobe $line
225                 fi
226         done
227         echo ""
228 }
229
230 # Make sure that either dahdi is loaded or modprobe-able
231 dahdi_modules_loadable() {
232         modinfo dahdi >/dev/null 2>&1 || lsmod | grep -q -w ^dahdi
233 }
234
235 if [ ! -x "$DAHDI_CFG" ]; then
236        echo "dahdi_cfg not executable"
237        exit 0
238 fi
239
240 if [ ! -f /etc/dahdi/system.conf ]; then
241         echo "/etc/dahdi/system.conf not found. Nothing to do."
242        exit 0
243 fi
244
245 RETVAL=0
246
247 # See how we were called.
248 case "$1" in
249   start)
250         if ! dahdi_modules_loadable; then
251                 echo "No DAHDI modules on the system. Not starting"
252                 exit 0
253         fi
254         if hotplug_should_load_modules; then
255                 load_modules
256         fi
257
258         TMOUT=$DAHDI_DEV_TIMEOUT # max secs to wait
259
260         while [ ! -d /dev/dahdi ] ; do
261                 sleep 1
262                 TMOUT=`expr $TMOUT - 1`
263                 if [ $TMOUT -eq 0 ] ; then
264                         echo "Error: missing /dev/dahdi!"
265                         exit 1
266                 fi
267         done
268
269         xpp_startup
270
271         if [ $system = debian ]; then
272             echo -n "Running dahdi_cfg: "
273             $DAHDI_CFG_CMD 2> /dev/null && echo -n "done"
274             echo "."
275         elif [ $system = redhat ]; then
276             action "Running dahdi_cfg: " $DAHDI_CFG_CMD
277         fi
278         RETVAL=$?
279
280         if [ "$LOCKFILE" != '' ]; then
281                 [ $RETVAL -eq 0 ] && touch $LOCKFILE
282         fi
283
284         if [ -x "$FXOTUNE" ] && [ -r /etc/fxotune.conf ]; then
285                 # Allowed to fail if e.g. Asterisk already uses channels:
286                 $FXOTUNE -s || :
287         fi
288
289         # Set the right Astribanks ticker:
290         LC_ALL=C xpp_sync "$XPP_SYNC"
291
292         hpec_start
293         ;;
294   stop)
295         # Unload drivers
296         #shutdown_dynamic # FIXME: needs test from someone with dynamic spans
297         echo -n "Unloading DAHDI hardware modules: "
298         if unload_modules; then
299                 echo "done"
300         else
301                 echo "error"
302         fi
303         if [ "$LOCKFILE" != '' ]; then
304                 [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
305         fi
306         ;;
307   unload)
308         unload_modules
309         ;;
310   restart|force-reload)
311         $0 stop
312         $0 start
313         ;;
314   reload)
315         if [ $system = debian ]; then
316             echo -n "Rerunning dahdi_cfg: "
317             $DAHDI_CFG_CMD 2> /dev/null && echo -n "done"
318             echo "."
319         elif [ $system = redhat ]; then
320             action "Rerunning dahdi_cfg: " $DAHDI_CFG_CMD
321         fi
322         RETVAL=$?
323         ;;
324   status)
325         if [ -d /proc/dahdi ]; then
326                 /usr/sbin/lsdahdi
327                 RETVAL=0
328         else
329                 RETVAL=3
330         fi
331         ;;
332   *)
333         echo "Usage: dahdi {start|stop|restart|status|reload|unload}"
334         exit 1
335 esac
336
337 exit $RETVAL
338