#!/bin/sh # # zaptel This shell script takes care of loading and unloading \ # Zapata Telephony interfaces # chkconfig: 2345 9 92 # description: The zapata telephony drivers allow you to use your linux \ # computer to accept incoming data and voice interfaces # # config: /etc/sysconfig/zaptel initdir=/etc/init.d # Don't edit the following values. Edit /etc/sysconfig/zaptel or # /etc/defualt/zaptel (depending on your system) instead. ZTCFG=/sbin/ztcfg ZTCFG_CMD="$ZTCFG" # e.g: for a custom zaptel.conf location # 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 ztcfg. ZAP_DEV_TIMEOUT=20 # # Determine which kind of configuration we're using # system=redhat # assume redhat if [ -f /etc/debian_version ]; then system=debian fi # Source function library. if [ $system = redhat ]; then . $initdir/functions || exit 0 fi # Source zaptel configuration. if [ $system = debian ]; then [ -f /etc/default/zaptel ] && . /etc/default/zaptel LOCKFILE=/var/lock/zaptel elif [ $system = redhat ]; then [ -f /etc/sysconfig/zaptel ] && . /etc/sysconfig/zaptel LOCKFILE=/var/lock/subsys/zaptel fi if [ -z "${MODULES}" ]; then # Populate defaults if not present MODULES="tor2 wct4xxp wct1xxp wcte11xp wcfxo wctdm wctdm24xxp" 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 , ' '` # 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 # run in a subshell, so it won't step over our vars: (unload_module $mod) # TODO: the following is probably the error handling we want: # if [ $? != 0 ]; then return 1; fi done rmmod $module } # Initialize the Xorcom Astribank (xpp/) using perl utiliites: # intended to replace all the the three functions below if user has # installed the zaptel-perl utilities. xpp_startup() { # do nothing if there are no astribank devices: if ! grep -q connected /proc/xpp/xbuses 2>/dev/null; then return 0; fi echo "Waiting for Astribank devices to initialize:" cat /proc/xpp/XBUS-[0-9]*/waitfor_xpds 2>/dev/null || true # overriding locales for the above two, as perl can be noisy # when locales are missing. # No register all the devices if they didn't auto-register: LC_ALL=C zt_registration on # this one could actually be run after ztcfg: LC_ALL=C xpp_sync "$XPP_SYNC" } hpec_start() { # check for HPEC licenses for f in /var/lib/digium/licenses/HPEC*.lic; do if [ -f ${f} ]; then haveHPEC=1 fi done if [ -z "${haveHPEC}" ]; then return; fi # If we got here, HPEC license was found # zaphpec_enable not installed in /usr/sbin if [ ! -f /usr/sbin/zaphpec_enable ]; then echo -n "Running zaphpec_enable: Failed" echo -n "." echo " The zaphpec_enable binary is not installed in /usr/sbin." return fi # zaphpec_enable not set executable if [ ! -x /usr/sbin/zaphpec_enable ]; then echo -n "Running zaphpec_enable: Failed" echo -n "." echo " /usr/sbin/zaphpec_enable is not set as executable." return fi # zaphpec_enable properly installed if [ $system = debian ]; then echo -n "Running zaphpec_enable: " /usr/sbin/zaphpec_enable 2> /dev/null elif [ $system = redhat ]; then action "Running zaphpec_enable: " /usr/sbin/zaphpec_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 zaphpec_enable, or if your HPEC license is no longer valid." fi } shutdown_dynamic() { if ! grep -q ' ZTD/' /proc/* 2>/dev/null; then return; fi # we should only get here if we have dynamic spans. Right? $ZTCFG -s } # Check that telephony is up. [ "${TELEPHONY}" = "yes" ] || exit 0 [ -x "$ZTCFG" ] || exit 0 [ -f /etc/zaptel.conf ] || exit 0 if [ "${DEBUG}" = "yes" ]; then ARGS="debug=1" fi run_ztcfg() { if [ $system = debian ]; then echo -n "Running ztcfg: " $ZTCFG_CMD && echo -n "done" RETVAL=$? echo "." elif [ $system = redhat ]; then action "Running ztcfg: " $ZTCFG_CMD RETVAL=$? fi } RETVAL=0 # See how we were called. case "$1" in start) #if [ $system = debian ]; then # echo -n "Loading zaptel framework: " # modprobe zaptel ${ARGS} 2> /dev/null && echo -n "done" # echo "." #elif [ $system = redhat ]; then # action "Loading zaptel framework: " modprobe zaptel ${ARGS} #fi echo -n "Loading zaptel hardware modules:" for x in $MODULES; do eval localARGS="\$${x}_ARGS" if modprobe ${x} ${ARGS} ${localARGS} 2> /dev/null; then echo -n " $x" fi done xpp_startup echo -n "Waiting for zap to come online..." TMOUT=$ZAP_DEV_TIMEOUT # max secs to wait while [ ! -d /dev/zap ] ; do sleep 1 TMOUT=`expr $TMOUT - 1` if [ $TMOUT -eq 0 ] ; then echo "Error: missing /dev/zap!" exit 1 fi done echo "OK" #sleep 3 # TODO: remove it if head -c 0 /dev/zap/pseudo; then echo "No Zaptel timing source sound. loading ztdummy" modprobe ztdummy fi run_ztcfg RETVAL=$? [ $RETVAL -eq 0 ] && touch $LOCKFILE hpec_start ;; stop) # Unload drivers shutdown_dynamic # FIXME: needs test from someone with dynamic spans echo -n "Unloading zaptel hardware drivers:" unload_module zaptel RETVAL=$? echo "." [ $RETVAL -eq 0 ] && rm -f $LOCKFILE ;; unload) # We don't have zaptel helper, so let's not replicate too much code: # allow others to use the unload command. unload_module zaptel ;; restart) $0 stop $0 start ;; reload) run_ztcfg ;; *) echo "Usage: zaptel {start|stop|restart|reload}" exit 1 esac exit $RETVAL