From cacd47333cdb86f9c6dcf781e4c767a0d44dd685 Mon Sep 17 00:00:00 2001 From: Nadi Sarrar Date: Thu, 14 Dec 2006 12:51:41 +0000 Subject: [PATCH] initial commit of the new xml way for card configuration and module loading. caution: does not support everything misdn-init does, yet. --- config/Makefile | 11 ++ config/mISDN | 333 ++++++++++++++++++++++++++++++++ config/mISDN.conf | 13 ++ config/mISDN.conf.bnx.xsl | 230 ++++++++++++++++++++++ config/mISDN.conf.hfcmulti.xsl | 33 ++++ config/mISDN.conf.inc.xsl | 41 ++++ config/mISDN.conf.mISDN_dsp.xsl | 38 ++++ config/mISDN.conf.xsl | 89 +++++++++ 8 files changed, 788 insertions(+) create mode 100644 config/Makefile create mode 100755 config/mISDN create mode 100644 config/mISDN.conf create mode 100644 config/mISDN.conf.bnx.xsl create mode 100644 config/mISDN.conf.hfcmulti.xsl create mode 100644 config/mISDN.conf.inc.xsl create mode 100644 config/mISDN.conf.mISDN_dsp.xsl create mode 100644 config/mISDN.conf.xsl diff --git a/config/Makefile b/config/Makefile new file mode 100644 index 0000000..0449fc5 --- /dev/null +++ b/config/Makefile @@ -0,0 +1,11 @@ + +all: + @echo "Please run 'make install'." + +install: + install -D -m755 mISDN $(INSTALL_PREFIX)/usr/sbin/mISDN + for file in $(shell echo *.xsl); do install -D -m644 $${file} $(INSTALL_PREFIX)/usr/lib/mISDN/$${file}; done + if [ -d $(INSTALL_PREFIX)/etc/init.d ]; then \ + if [ -e $(INSTALL_PREFIX)/etc/init.d/mISDN ]; then rm -rf $(INSTALL_PREFIX)/etc/init.d/mISDN; fi; \ + ln -s $(INSTALL_PREFIX)/usr/sbin/mISDN $(INSTALL_PREFIX)/etc/init.d/mISDN; \ + fi diff --git a/config/mISDN b/config/mISDN new file mode 100755 index 0000000..19e62c0 --- /dev/null +++ b/config/mISDN @@ -0,0 +1,333 @@ +#!/bin/bash + +#---------------------------------------------- +# +# CONFIGURATION: +# +MISDN_CONF="/etc/mISDN.conf" +MISDN_CONF_XSL="/usr/lib/mISDN/mISDN.conf.xsl" +# +#---------------------------------------------- + +SELF="${0}" +USAGE="Usage: ${SELF} start|stop|restart|config|scan|help" + +function die { + echo "[!!] ${1}" + exit 1 +} + +function check_cmd +{ + if ! which "${1}" > /dev/null; then + if [ "${2}" = "opt" ]; then + return + fi + if [ "$(id -u)" != "0" ]; then + die "$1 not in path, please install and/or be root." + else + die "$1 not in path, please install." + fi + exit 1 + else + local var=$(echo ${1} | tr a-z A-Z) + eval "$var=`which ${1}`" + fi +} + +function check_misdn_conf +{ + if [ ! -f ${MISDN_CONF} ]; then + die "${MISDN_CONF} not found. Please run: ${SELF} config" + fi +} + +check_cmd sed +check_cmd cut +check_cmd cp +check_cmd wc +check_cmd grep +check_cmd xsltproc +check_cmd modprobe +check_cmd sleep +check_cmd lspci +check_cmd lsusb opt + +declare -a START_COMMANDS +declare -a STOP_COMMANDS + +declare -a HFCMULTI_card +declare -a HFCMULTI_type +declare -a HFCMULTI_protocol +declare -a HFCMULTI_layermask +HFCMULTI_options='' +MISDNDSP_options='' + +declare -a SCAN_card +declare -a SCAN_opts +declare -a SCAN_num_ports +declare -a SCAN_port_opts + +function parse_config +{ + local CONFIG=$(${XSLTPROC} ${MISDN_CONF_XSL} ${MISDN_CONF}) + local t p l line i tmpcmd + local IFS=$'\n' + for line in ${CONFIG}; do + case "${line}" in + MODULE:hfcmulti*) + HFCMULTI_options=${line:16} + ;; + MODULE:mISDN_dsp*) + MISDNDSP_options=${line:17} + ;; + CARD:BN*) + i=${#HFCMULTI_type[@]} + let "t = $(echo $line | ${SED} -n 's/.*type:\([^,]*\).*/\1/p')" + HFCMULTI_type[${i}]=$(printf "0x%x" ${t}) + +# this is for the BN2E1 card that needs two type numbers + t=$(echo $line | ${SED} -n 's/.*type:[^,]*,\([^ ]*\).*/\1/p') + if [ ! -z "${t}" ]; then + let "t = ${t}" + HFCMULTI_type[${i}]="${HFCMULTI_type[${i}]},$(printf "0x%x" ${t})" + fi + + HFCMULTI_card[${i}]=$(echo ${line:5} | ${CUT} -d" " -f1) + ;; + PORT*) + let "p = $(echo $line | ${SED} -n 's/.*protocol:\([^ ]*\).*/\1/p')" + HFCMULTI_protocol[${i}]="${HFCMULTI_protocol[${i}]:+"${HFCMULTI_protocol[${i}]},"}$(printf "0x%x" ${p})" + let "l = $(echo $line | ${SED} -n 's/.*layermask:\([^ ]*\).*/\1/p')" + HFCMULTI_layermask[${i}]="${HFCMULTI_layermask[${i}]:+"${HFCMULTI_layermask[${i}]},"}$(printf "0x%x" ${l})" + ;; + esac + done + + START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install capi" + START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_core debug=0" + START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_l1 debug=0" + START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_l2 debug=0" + START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install l3udss1 debug=0" + START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_capi" + tmpcmd="${MODPROBE} --ignore-install hfcmulti type=${HFCMULTI_type[0]}" + i=1 + while [ ! -z "${HFCMULTI_type[${i}]}" ]; do + tmpcmd="${tmpcmd},${HFCMULTI_type[${i}]}" + let "i = ${i} + 1" + done + tmpcmd="${tmpcmd} protocol=${HFCMULTI_protocol[0]}" + i=1 + while [ ! -z "${HFCMULTI_protocol[${i}]}" ]; do + tmpcmd="${tmpcmd},${HFCMULTI_protocol[${i}]}" + let "i = ${i} + 1" + done + tmpcmd="${tmpcmd} layermask=${HFCMULTI_layermask[0]}" + i=1 + while [ ! -z "${HFCMULTI_layermask[${i}]}" ]; do + tmpcmd="${tmpcmd},${HFCMULTI_layermask[${i}]}" + let "i = ${i} + 1" + done + START_COMMANDS[${#START_COMMANDS[@]}]="${tmpcmd} ${HFCMULTI_options}" + START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_dsp ${MISDNDSP_options}" +} + +function run_start_commands +{ + local i=0 + + echo "-- Loading mISDN modules --" + while [ ! -z "${START_COMMANDS[${i}]}" ]; do + echo ">> ${START_COMMANDS[${i}]}" + eval "${START_COMMANDS[${i}]}" + let "i = ${i} + 1" + done +} + +function run_stop_commands +{ + local mod i=0 + + for mod in $(lsmod | ${SED} -ne '/Module/!{s/\([^ ]*\).*/\1/;p}'); do + case "${mod}" in + mISDN_capi | mISDN_dsp | l3udss1 | mISDN_l2 | mISDN_l1 | mISDN_isac | hfcmulti) + STOP_COMMANDS[0]="${STOP_COMMANDS[0]:-"${MODPROBE} -r --ignore-remove"} ${mod}" + ;; + mISDN_core) + STOP_COMMANDS[1]="${MODPROBE} -r --ignore-remove mISDN_core" + ;; + esac + done + + echo "-- Unloading mISDN modules --" + while [ ! -z "${STOP_COMMANDS[${i}]}" ]; do + echo ">> ${STOP_COMMANDS[${i}]}" + eval "${STOP_COMMANDS[${i}]}" + let "i = ${i} + 1" + done +} + +function scan_devices +{ + local skipnext=0 IFS=$'\n' + local NL=" +" + + function addcard { + SCAN_card[${#SCAN_card[@]}]="${1}" + SCAN_opts[${#SCAN_opts[@]}]="${2}" + SCAN_num_ports[${#SCAN_num_ports[@]}]="${3}" + SCAN_port_opts[${#SCAN_port_opts[@]}]="${4}" + } + + for line in $(${LSPCI} -n -d 0xd161:b410); do + addcard "BN4S0" "" 4 'mode="te" link="ptmp"' + done + + for line in $(${LSPCI} -n | ${SED} -n 's/^\(0000:\|\)\([0-9a-f]\{2\}:[0-9a-f]\{2\}.[0-9a-f]\{1\}\)\( Class \| \)[0-9a-f]\{4\}: 1397:\([0-9a-f]\{4\}\).*$/\4 \2/p'); do + if [ ${skipnext} -eq 1 ]; then + skipnext=0 + continue + fi + case "${line}" in + 30b1*) + case "${line:5}" in + 00*) + addcard "BN1E1" "" 1 'mode="nt" link="ptp"' + ;; + *) + if [ $(${LSPCI} -n -s "${line:5:3}" | ${WC} -l) -eq 2 ]; then + addcard "BN2E1" "" 2 'mode="nt" link="ptp"' + skipnext=1 + else + addcard "BN1E1" "" 1 'mode="nt" link="ptp"' + fi + ;; + esac + ;; + 16b8*) + addcard "BN8S0" "" 8 'mode="te" link="ptmp"' + ;; + 08b4*) + if ${LSPCI} -n -v -s "${line:5}" | ${GREP} "Subsystem" | ${GREP} "1397:b567" > /dev/null ; then + addcard "BN1S0" "" 1 'mode="te" link="ptmp"' + elif ${LSPCI} -n -v -s "${line:5}" | ${GREP} "Subsystem" | ${GREP} "1397:b566\|1397:b569" > /dev/null ; then + addcard "BN2S0" "" 2 'mode="te" link="ptmp"' + else + addcard "BN4S0" "" 4 'mode="te" link="ptmp"' + fi + ;; + esac + done + for line in $(${LSPCI} -n | ${GREP} "1397:\(2bd\(0\|6\|7\|8\|9\|a\|b\|c\)\|b100\)\|1043:0675\|0871:ffa\(1\|2\)\|1051:0100\|15b0:2bd0\|114f:007\(0\|1\|2\|3\)\|13d1:2bd1\|182d:3069"); do + addcard "hfcpci" "" 1 'mode="te" link="ptmp"' + done + for line in $(${LSPCI} -n | ${GREP} "1244:\(0a00\|0e00\)"); do + addcard "avmfritz" "" 1 'mode="te" link="ptmp"' + done + for line in $(${LSPCI} -n -d 1050:6692); do + addcard "w6692pci" "" 1 'mode="te" link="ptmp"' + done + if [ -e ${LSUSB} ]; then + for line in $(${LSUSB} | ${GREP} "0959:2bd0\|0675:1688\|07b0:0007\|0742:200\(7\|8\|9\|A\)\|08e3:0301\|07fa:084\(7\|8\)\|07ba:0006"); do + addcard "hfcsusb" "" 1 'mode="te" link="ptmp"' + done + fi +} + +function write_mISDN_conf +{ + local NL=" +" + local TAB=" " + local HEADER=" + +${TAB}hfcmulti +${TAB}mISDN_dsp" + local FOOTER="" + local i=0 j=0 MAIN="" + + echo "Writing ${MISDN_CONF} for ${#SCAN_card[@]} mISDN compatible device(s):" + while [ ! -z "${SCAN_card[${i}]}" ]; do + echo ">> ${SCAN_card[${i}]}" + MAIN="${MAIN}${NL}${TAB}" + j=1 + while [ ${j} -le ${SCAN_num_ports[${i}]} ]; do + MAIN="${MAIN}${NL}${TAB}${TAB}${j}" + let "j = ${j} + 1" + done + MAIN="${MAIN}${NL}${TAB}" + let "i = ${i} + 1" + done + + if [ -f ${MISDN_CONF} ]; then + echo "${MISDN_CONF} already present, saving a backup: ${MISDN_CONF}.bak" + ${CP} "${MISDN_CONF}" "${MISDN_CONF}.bak" || die "Could not backup your existing ${MISDN_CONF}!" + fi + echo "${HEADER}${MAIN}${NL}${FOOTER}" > ${MISDN_CONF} +} + +function print_scan_results +{ + local i=0 + + echo "${#SCAN_card[@]} mISDN compatible device(s) found:" + while [ ! -z "${SCAN_card[${i}]}" ]; do + echo ">> ${SCAN_card[${i}]}" + let "i = ${i} + 1" + done +} + +# +# MAIN +# + +case "${1}" in + + start|--start) + + check_misdn_conf + parse_config + run_start_commands + ;; + + stop|--stop) + + check_misdn_conf + parse_config + run_stop_commands + ;; + + restart|--restart) + + check_misdn_conf + parse_config + run_stop_commands + ${SLEEP} 2 + run_start_commands + ;; + + config|--config) + + scan_devices + write_mISDN_conf + ;; + + scan|--scan) + + scan_devices + print_scan_results + ;; + + help|--help) + echo "${USAGE}" + exit 0 + ;; + + *) + echo "${USAGE}" + exit 2 + ;; + +esac + diff --git a/config/mISDN.conf b/config/mISDN.conf new file mode 100644 index 0000000..d4c2c2d --- /dev/null +++ b/config/mISDN.conf @@ -0,0 +1,13 @@ + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + + diff --git a/config/mISDN.conf.bnx.xsl b/config/mISDN.conf.bnx.xsl new file mode 100644 index 0000000..2487249 --- /dev/null +++ b/config/mISDN.conf.bnx.xsl @@ -0,0 +1,230 @@ + + + + + + +no + + + + (2**8) + ++ + + + (2**9) + ++ + + + (2**11) + + + + + (2**11) + + + ++ + + + (2**12) + ++ + + + (2**13) + ++ + + + (2**18) + ++ + + + (2**19) + + + + +4 + + + + + + + + + layermask: + + + 3 + + + 0 + + + 15 + + + + protocol: + + + te + nt + 34 + 18 + 34 + ++ + + + + ptp + ptmp + 0 + (-32) + (-32) + + + + + + + (2**16) + + + capi: + + + yes + no + no + + + + + + + + + 4 + + + + + + + + + + 8 + + + + + + + + + + type:1+ + +,1+ + + yes + + + + + + + layermask: + + + 3 + + + 0 + + + 15 + + + + protocol: + + + te + nt + 34 + 18 + 34 + ++ + + + + ptp + ptmp + 0 + (-32) + (-32) + + + + + + + (2**16) + ++ + + + (2**18) + ++ + + + (2**19) + ++ + + + (2**21) + ++ + + + (2**23) + + + capi: + + + yes + no + no + + + + + + + diff --git a/config/mISDN.conf.hfcmulti.xsl b/config/mISDN.conf.hfcmulti.xsl new file mode 100644 index 0000000..2d0a5c8 --- /dev/null +++ b/config/mISDN.conf.hfcmulti.xsl @@ -0,0 +1,33 @@ + + + + + + + + + poll= + + 128 + + + + pcm= + + + + + debug= + + 0 + + + + + + + + diff --git a/config/mISDN.conf.inc.xsl b/config/mISDN.conf.inc.xsl new file mode 100644 index 0000000..697563d --- /dev/null +++ b/config/mISDN.conf.inc.xsl @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + no + 0 + 0 + 0 + yes + no + + + + + + + + + + + + + + diff --git a/config/mISDN.conf.mISDN_dsp.xsl b/config/mISDN.conf.mISDN_dsp.xsl new file mode 100644 index 0000000..8ddcf24 --- /dev/null +++ b/config/mISDN.conf.mISDN_dsp.xsl @@ -0,0 +1,38 @@ + + + + + + + + + debug= + + 0 + + + + options= + + 0 + + + + poll= + + + + + dtmfthreshold= + + + + + + + + + diff --git a/config/mISDN.conf.xsl b/config/mISDN.conf.xsl new file mode 100644 index 0000000..323f296 --- /dev/null +++ b/config/mISDN.conf.xsl @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PORT: + + + + + + + + + + + PORT: + + + + + + + + + + + PORT: + + + + + + + + + + + PORT: + + + + + + + + + +