#!/sbin/openrc-run # Copyright 1999-2011 Ultimate Linux Solutions CC # Distributed under the terms of the GNU General Public License v2 depend() { before dahdi } dahdi_load_modules() { local hwlist loc status mod mod_vname pciid desc hwlist=$(/usr/sbin/dahdi_hardware) if [ -z "${hwlist}" ]; then einfo "No digium hardware found." ebegin "Loading module dahdi_dummy" /sbin/modprobe dahdi_dummy eend $? return fi echo "${hwlist}" | while read loc mod pciid desc; do status="${mod:${#mod}-1:1}" mod="${mod%[+-]}" mod_vname="mod_${mod}" einfo "Found $desc at $loc (module: $mod)" if [ "${status}" = "-" -a "${!mod_vname-notloaded}" = "notloaded" ]; then ebegin "Loading module $mod" /sbin/modprobe $mod eend [ $? -eq 0 ] && eval "$mod_vname=loaded" fi done } dahdi_module_unload() { local mod=$1 s [ -d /sys/module/${mod} ] || return 0 for s in $(find /sys/module/${mod}/holders -type l); do dahdi_module_unload $(basename $s) done ebegin "Removing dahdi module: $mod" /sbin/rmmod $mod eend $? } dahdi_gen_fxo_config() { local port=$1 echo "fxs${DAHDI_FXO_SIGNALLING-ks}=${port}" [ "${DAHDI_FXO_ECHOCAN-yes}" = yes ] && echo "echocanceller=${DAHDI_ECHOCAN-mg2},${port}" } dahdi_gen_fxs_config() { local port=$1 echo "fxo${DAHDI_FXO_SIGNALLING-ks}=${port}" [ "${DAHDI_FXS_ECHOCAN-yes}" = yes ] && echo "echocanceller=${DAHDI_ECHOCAN-mg2},${port}" } dahdi_gen_bri_te_config() { span=$1 port=$2 basechan=$3 echo "span=${span},${port},0,${DAHDI_BRI_FRAMING-CSS},${DAHDI_BRI_CODING-AMI}" echo "bchan=${basechan}-$(( basechan + 1 ))" echo "hardhdlc=$(( basechan + 2 ))" [ "${DAHDI_BRI_TE_ECHOCAN-yes}" = yes ] && echo "echocanceller=${DAHDI_ECHOCAN-mg2},${basechan}-$(( basechan + 1 ))" } dahdi_gen_bri_nt_config() { span=$1 port=$2 basechan=$3 echo "span=${span},0,0,${DAHDI_BRI_FRAMING-CSS},${DAHDI_BRI_CODING-AMI}" echo "bchan=${basechan}-$(( basechan + 1 ))" echo "hardhdlc=$(( basechan + 2 ))" [ "${DAHDI_BRI_NT_ECHOCAN-yes}" = yes ] && echo "echocanceller=${DAHDI_ECHOCAN-mg2},${basechan}-$(( basechan + 1 ))" } dahdi_gen_e1_cpe_config() { span=$1 port=$2 basechan=$3 echo "span=${span},${port},0,${DAHDI_E1_FRAMING-CCS},${DAHDI_E1_CODING-HDB3,CRC4}" bchans="${basechan}-$(( basechan + 14 )),$(( basechan + 16 ))-$(( basechan + 30 ))" echo "bchan=${bchans}" echo "dchan=$(( basechan + 15 ))" [ "${DAHDI_E1_CPE_ECHOCAN-yes}" = yes ] && echo "echocanceller=${DAHDI_ECHOCAN-mg2},${bchans}" } dahdi_gen_e1_net_config() { span=$1 port=$2 basechan=$3 echo "span=${span},0,0,${DAHDI_E1_FRAMING-CCS},${DAHDI_E1_CODING-HDB3,CRC4}" bchans="${basechan}-$(( basechan + 14 )),$(( basechan + 16 ))-$(( basechan + 30 ))" echo "bchan=${bchans}" echo "dchan=$(( basechan + 15 ))" [ "${DAHDI_E1_NET_ECHOCAN-yes}" = yes ] && echo "echocanceller=${DAHDI_ECHOCAN-mg2},${bchans}" } dahdi_gen_t1_cpe_config() { span=$1 port=$2 basechan=$3 echo "span=${span},${port},0,${DAHDI_T1_FRAMING-ESF},${DAHDI_T1_CODING-B8ZS}" bchans="${basechan}-$(( basechan + 22 ))" echo "bchan=${bchans}" echo "dchan=$(( basechan + 23 ))" [ "${DAHDI_T1_CPE_ECHOCAN-yes}" = yes ] && echo "echocanceller=${DAHDI_ECHOCAN-mg2},${bchans}" } dahdi_gen_t1_net_config() { span=$1 port=$2 basechan=$3 echo "span=${span},0,0,${DAHDI_T1_FRAMING-ESF},${DAHDI_T1_CODING-B8ZS}" bchans="${basechan}-$(( basechan + 22 ))" echo "bchan=${bchans}" echo "dchan=$(( basechan + 23 ))" [ "${DAHDI_T1_NET_ECHOCAN-yes}" = yes ] && echo "echocanceller=${DAHDI_ECHOCAN-mg2},${bchans}" } dahdi_conf_span() { local span=$1 local type=$2 local desc=$3 local port=$4 local basechan=$5 local vname="PRI_SPAN_${span}_NET" local cfunc="dahdi_gen_" # Analog we need to deal with on a port-by-port basis. [ "${type}" = "analog" ] && return 0 echo "" echo "# ${desc}" case "${type}" in digital-TE) cfunc="${cfunc}bri_te" ;; digital-NT) cfunc="${cfunc}bri_nt" ;; digital-[TE]1) cfunc="${cfunc}$(echo "${type##*-}" | tr 'TE' 'te')" # Use CPE by default. Unfortunately there is no easy # way to detect CPE vs NET as far as I know and specifying # in a config that you want NET mode seems the sanest way. if yesno "${vname}"; then cfunc="${cfunc}_net" else cfunc="${cfunc}_cpe" fi ;; *) echo "# Don't know how to configure this (type=${type})." echo "# Please file a bug on bugs.gentoo.org and add jaco@uls.co.za as CC." return 1 ;; esac "${cfunc}_config" "${span}" "${port}" "${basechan}" } dahdi_gen_config() { local type manufacturer devicetype basechan aport atype local span= local tfile="$(mktemp)" local sfile="$(mktemp)" local plocation="" local isdnport=0 /usr/sbin/dahdi_scan > "${sfile}" exec 3<"${sfile}" exec 4>"${tfile}" echo "# Automatically dahdi-autoconf generated file ($(date))." >&4 echo "# This file WILL get regenerated whenever you restart dahdi-autoconf." >&4 while read LINE <&3; do case "$LINE" in \[*\]) if [ -n "${span}" ]; then ebegin "Configuring ${manufacturer} ${devicetype} (${name})" dahdi_conf_span "${span}" "${type}" "${manufacturer} ${devicetype} (${name})" "${isdnport}" "${basechan}" >&4 eend $? fi span="${LINE%?}" span="${span#?}" ;; type=*|manufacturer=*|devicetype=*|basechan=*|name=*) eval "${LINE%%=*}='${LINE#*=}'" ;; location=*) eval "${LINE%%=*}='${LINE#*=}'" if [ "${location}" = "${plocation}" ]; then isdnport=$(( isdnport + 1 )) else plocation="${location}" isdnport=1 fi ;; port=*) # For analog cards only. aport="${LINE#*=}"; aport="${aport%,*}" atype="${LINE#*,}" if [ "${aport}" -eq "${basechan}" ]; then echo "" >&4 echo "# ${manufacturer} ${devicetype} (${name})" >&4 fi case "${atype}" in FXO) dahdi_gen_fxo_config $aport >&4 ;; FXS) dahdi_gen_fxs_config $aport >&4 ;; esac ;; esac done if [ -n "${span}" ]; then ebegin "Configuring ${manufacturer} ${devicetype} (${name})" dahdi_conf_span "${span}" "${type}" "${manufacturer} ${devicetype} (${name})" "${isdnport}" "${basechan}" >&4 eend $? fi echo "" >&4 echo "loadzone = ${DAHDI_ZONE}" >&4 echo "defaultzone = ${DAHDI_ZONE}" >&4 echo "## END OF AUTOCONFIGURED FILE ##" >&4 exec 3<&- exec 4<&- rm -f "${sfile}" [ -r /etc/dahdi/system.conf ] && mv /etc/dahdi/system.conf /etc/dahdi/system.conf.bck mv "${tfile}" /etc/dahdi/system.conf } start() { dahdi_load_modules if [ ! -r /dev/dahdi/ctl ]; then eerror "No DAHDI compatible cards detected." return 1 fi ebegin "Generating DAHDI Configuration" dahdi_gen_config eend $? } stop() { dahdi_module_unload dahdi }