#!/bin/sh # # dahdi This shell script takes care of loading and unloading \ # DAHDI Telephony interfaces # chkconfig: 2345 9 92 # description: The DAHDI drivers allow you to use your linux \ # computer to accept incoming data and voice interfaces # # config: /etc/dahdi/init.conf ### BEGIN INIT INFO # Provides: dahdi # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Should-Start: $network $syslog # Should-Stop: $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: DAHDI kernel modules # Description: dahdi - load and configure DAHDI modules ### END INIT INFO initdir=/etc/init.d # Don't edit the following values. Edit /etc/dahdi/init.conf instead. DAHDI_CFG=/usr/sbin/dahdi_cfg DAHDI_CFG_CMD=${DAHDI_CFG_CMD:-"$DAHDI_CFG"} # e.g: for a custom system.conf location FXOTUNE=/usr/sbin/fxotune # The default syncer Astribank. Usually set automatically to a sane # value by xpp_sync(1) if you have an Astribank. You can set this to an # explicit Astribank (e.g: 01). XPP_SYNC=auto # The maximal timeout (seconds) to wait for udevd to finish generating # device nodes after the modules have loaded and before running dahdi_cfg. DAHDI_DEV_TIMEOUT=20 # A list of modules to unload when stopping. # All of their dependencies will be unloaded as well. DAHDI_UNLOAD_MODULES="dahdi" # # Determine which kind of configuration we're using # system=debian # assume debian if [ -f /etc/debian_version ]; then system=debian fi if [ -f /etc/gentoo-release ]; then system=debian fi if [ -f /etc/SuSE-release -o -f /etc/novell-release ] then system=debian fi # Source function library. if [ $system = debian ]; then . $initdir/functions || exit 0 fi DAHDI_MODULES_FILE="/etc/dahdi/modules" [ -r /etc/dahdi/init.conf ] && . /etc/dahdi/init.conf if [ $system = redhat ]; then LOCKFILE=/var/lock/subsys/dahdi fi # recursively unload a module and its dependencies, if possible. # where's modprobe -r when you need it? # inputs: module to unload. # returns: the result from unload_module() { module="$1" line=`lsmod 2>/dev/null | grep "^$1 "` if [ "$line" = '' ]; then return; fi # module was not loaded set -- $line # $1: the original module, $2: size, $3: refcount, $4: deps list mods=`echo $4 | tr , ' '` ec_modules="" # xpp_usb keeps the xpds below busy if an xpp hardware is # connected. Hence must be removed before them: case "$module" in xpd_*) mods="xpp_usb $mods";; esac for mod in $mods; do case "$mod" in dahdi_echocan_*) ec_modules="$mod $ec_modules" ;; *) # run in a subshell, so it won't step over our vars: (unload_module $mod) ;; esac done # Now that all the other dependencies are unloaded, we can unload the # dahdi_echocan modules. The drivers that register spans may keep # references on the echocan modules before they are unloaded. for mod in $ec_modules; do (unload_module $mod) done rmmod $module } unload_modules() { for module in $DAHDI_UNLOAD_MODULES; do unload_module $module done } # In (xpp) hotplug mode, the init script is also executed from the # hotplug hook. In that case it should not attempt to loade modules. # # This function only retunrs false (1) if we're in hotplug mode and # coming from the hotplug hook script. hotplug_should_load_modules() { if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" != '' ] then return 1 fi return 0 } # In (xpp) hotplug mode: quit after we loaded modules. # # In hotplug mode, the main run should end here, whereas the rest of the # script should be finished by the instance running from the hook. # Note that we only get here if there are actually Astribanks on the # system (otherwise noone will trigger the run of the hotplug hook # script). hotplug_exit_after_load() { if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" = '' ] then exit 0 fi } # Initialize the Xorcom Astribank (xpp/) using perl utiliites: xpp_startup() { if [ "$ASTERISK_SUPPORTS_DAHDI_HOTPLUG" = yes ]; then aas_param='/sys/module/dahdi/parameters/auto_assign_spans' aas=`cat "$aas_param" 2>/dev/null` if [ "$aas" = 0 ]; then echo 1>&2 "Don't wait for Astribanks (use Asterisk hotplug-support)" return 0 fi fi # do nothing if there are no astribank devices: if ! /usr/share/dahdi/waitfor_xpds; then return 0; fi hotplug_exit_after_load } hpec_start() { # HPEC license found if ! echo /var/lib/digium/licenses/HPEC-*.lic | grep -v '\*' | grep -q .; then return fi # dahdihpec_enable not installed in /usr/sbin if [ ! -f /usr/sbin/dahdihpec_enable ]; then echo -n "Running dahdihpec_enable: Failed" echo -n "." echo " The dahdihpec_enable binary is not installed in /usr/sbin." return fi # dahdihpec_enable not set executable if [ ! -x /usr/sbin/dahdihpec_enable ]; then echo -n "Running dahdihpec_enable: Failed" echo -n "." echo " /usr/sbin/dahdihpec_enable is not set as executable." return fi # dahdihpec_enable properly installed if [ $system = debian ]; then echo -n "Running dahdihpec_enable: " /usr/sbin/dahdihpec_enable 2> /dev/null elif [ $system = redhat ]; then action "Running dahdihpec_enable: " /usr/sbin/dahdihpec_enable fi if [ $? = 0 ]; then echo -n "done" echo "." else echo -n "Failed" echo -n "." echo " This can be caused if you had already run dahdihpec_enable, or if your HPEC license is no longer valid." fi } shutdown_dynamic() { if ! grep -q ' DYN/' /proc/dahdi/* 2>/dev/null; then return; fi # we should only get here if we have dynamic spans. Right? $DAHDI_CFG_CMD -s } load_modules() { # Some systems, e.g. Debian Lenny, add here -b, which will break # loading of modules blacklisted in modprobe.d/* unset MODPROBE_OPTIONS modules=`sed -e 's/#.*$//' $DAHDI_MODULES_FILE 2>/dev/null` #if [ "$modules" = '' ]; then # what? #fi echo "Loading DAHDI hardware modules:" modprobe dahdi for line in $modules; do if [ $system = debian ]; then echo -n " ${line}: " if modprobe $line 2> /dev/null; then echo -n "done" else echo -n "error" fi elif [ $system = redhat ]; then action " ${line}: " modprobe $line fi done echo "" } # Make sure that either dahdi is loaded or modprobe-able dahdi_modules_loadable() { modinfo dahdi >/dev/null 2>&1 || lsmod | grep -q -w ^dahdi } if [ ! -x "$DAHDI_CFG" ]; then echo "dahdi_cfg not executable" exit 0 fi RETVAL=0 # See how we were called. case "$1" in start) if ! dahdi_modules_loadable; then echo "No DAHDI modules on the system. Not starting" exit 0 fi if hotplug_should_load_modules; then load_modules fi TMOUT=$DAHDI_DEV_TIMEOUT # max secs to wait while [ ! -d /dev/dahdi ] ; do sleep 1 TMOUT=`expr $TMOUT - 1` if [ $TMOUT -eq 0 ] ; then echo "Error: missing /dev/dahdi!" exit 1 fi done xpp_startup # Assign all spans that weren't handled via udev + /etc/dahdi/assigned-spans.conf /usr/share/dahdi/dahdi_auto_assign_compat if [ $system = debian ]; then echo -n "Running dahdi_cfg: " $DAHDI_CFG_CMD 2> /dev/null && echo -n "done" echo "." elif [ $system = redhat ]; then action "Running dahdi_cfg: " $DAHDI_CFG_CMD fi RETVAL=$? if [ "$LOCKFILE" != '' ]; then [ $RETVAL -eq 0 ] && touch $LOCKFILE fi if [ -x "$FXOTUNE" ] && [ -r /etc/fxotune.conf ]; then # Allowed to fail if e.g. Asterisk already uses channels: $FXOTUNE -s || : fi # Do not try to call xpp_sync if there are no Astribank devices # installed. if test -e /sys/bus/astribanks; then # Set the right Astribanks ticker: LC_ALL=C xpp_sync "$XPP_SYNC" fi hpec_start ;; stop) # Unload drivers #shutdown_dynamic # FIXME: needs test from someone with dynamic spans echo -n "Unloading DAHDI hardware modules: " if unload_modules; then echo "done" else echo "error" fi if [ "$LOCKFILE" != '' ]; then [ $RETVAL -eq 0 ] && rm -f $LOCKFILE fi ;; unload) unload_modules ;; restart|force-reload) $0 stop $0 start ;; reload) if [ $system = debian ]; then echo -n "Rerunning dahdi_cfg: " $DAHDI_CFG_CMD 2> /dev/null && echo -n "done" echo "." elif [ $system = redhat ]; then action "Rerunning dahdi_cfg: " $DAHDI_CFG_CMD fi RETVAL=$? ;; status) if [ -d /proc/dahdi ]; then /usr/sbin/lsdahdi RETVAL=0 else RETVAL=3 fi ;; *) echo "Usage: dahdi {start|stop|restart|status|reload|unload}" exit 1 esac exit $RETVAL