| #!/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 |
| |