#!/bin/bash ################################################################################ # # misdn-init init script # # Copyright (C) 2005, Nadi Sarrar # # Nadi Sarrar # # This program is free software, distributed under the terms of # the GNU General Public License # # # USAGE: # # /usr/sbin/misdn-init start|stop|restart|config|scan|help # # chkconfig: 2345 35 60 # description: mISDN Kernel Modules # # CONFIGURATION: # # Path to your misdn-init.conf: # misdn_init_conf="/etc/misdn-init.conf" # ################################################################################ # # change this to modify the user/group settings of /dev/mISDN # USER=asterisk GROUP=asterisk # HFC 8/4 (S0) Options master_clock=17 # HFC-E1 Options optical=17 los=19 ais=20 slip=21 nocrc4=24 # Card Settings ulaw=9 dtmf=10 pcm_slave=12 ignore_pcm_frameclock=13 rxclock=14 crystalclock=19 watchdog=20 #dsp defaults dsp_options=0 poll_option= dsp_poll_option= dtmfthreshold_option= function check_cmd { if ! which "${1}" > /dev/null; then if [ "$(id -u)" != "0" ]; then echo "[!!] FATAL: $1 not in path, please install and/or be root." else echo "[!!] FATAL: $1 not in path, please install." fi if [ "${2}" != "notfatal" ] ; then exit 1 fi else var=$(echo ${1} | tr a-z A-Z) eval "$var=`which ${1}`" fi } check_cmd modprobe check_cmd rmmod check_cmd insmod check_cmd lspci check_cmd lsusb notfatal check_cmd mknod check_cmd bc check_cmd cut check_cmd wc check_cmd seq check_cmd sed function check_asterisk { if ps ax | grep -v grep | grep asterisk > /dev/null ; then asterisk -rx "stop now" ; fi } function create_card_db { cardline="" cardcount=1 skipnext=0 IFS=$'\n' NL=" " function addcard { cardline="${cardline}${cardcount},${1}${NL}" let "cardcount = ${cardcount} + 1" } function addport { let "portcount = ${portcount} + ${1}" } for line in $(${LSPCI} -n -d 0xd161:b410); do addcard "4,0x4" 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 "1,0x1" ;; *) if [ $(${LSPCI} -n -s ${line:5:3} -d 0x1397:30b1 | ${WC} -l) -eq 2 ]; then addcard "2,2E1" skipnext=1 else addcard "1,0x1" fi ;; esac ;; 16b8*) addcard "8,0x8" ;; 08b4*) if ${LSPCI} -n -v -s "${line:5}" | grep "Subsystem" | grep "1397:b567" > /dev/null ; then addcard "1,0x4" elif ${LSPCI} -n -v -s "${line:5}" | grep "Subsystem" | grep "1397:b566\|1397:b569" > /dev/null ; then addcard "2,0x4" else addcard "4,0x4" 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 "1,hfcpci" done for line in $(${LSPCI} -n | grep "1244:\(0a00\|0e00\)"); do addcard "1,avmfritz" done for line in $(${LSPCI} -n -d 1050:6692); do addcard "1,w6692pci" done if [ -e ${LSUSB} ]; then for line in $(${LSUSB} | grep "0959:2bd0\|0675:1688\|07b0:000\(6\|7\)\|0742:200\(7\|8\|9\|A\)\|08e3:0301\|07fa:084\(7\|8\)\|07ba:0006"); do addcard "1,hfcsusb" done fi echo "${cardline}" } function expand { local IFS=$',' for tok in $1; do if [ "$(echo $tok | ${SED} -ne 's/\([0-9]*\)-\([0-9]*\)/\1 \2/p')" != "" ]; then ${SEQ} $(echo $tok | ${SED} -ne 's/\([0-9]*\)-[0-9]*/\1/p') $(echo $tok | ${SED} -ne 's/[0-9]*-\([0-9]*\)/\1/p') else echo $tok fi done } function load_card_modules { carddb=$(create_card_db) function find_carddb_line { i=1 for l in ${carddb} ; do if [ $i -eq $1 ] ; then echo $l return fi let "i=$i+1" done } if [ ! -z "$1" ] ; then echo "Loading only $1" fi IFS=$'\n' skipnr=0 for line in $(${SED} -n -e '/^[^#]/p' ${misdn_init_conf}); do var=$(echo "${line}" | ${CUT} -d "=" -f1) val=$(echo "${line}" | ${CUT} -d "=" -f2) case "${var}" in card) #echo "processing line: $val" nr=$(echo "${val}" | ${CUT} -d "," -f1) mod=$(echo "${val}" | ${CUT} -d "," -f2) opns=$(echo "${val}" | ${CUT} -d "," -f3-) #getting portcount from carddb ports=$(find_carddb_line $nr | ${CUT} -d "," -f2) let "nr = ${nr} + ${skipnr}" #echo "nr $nr ports $ports mod $mod opns: $opns" case "${mod}" in 2E1) hfcmulti[${nr}]=1 hfcmulti[$((${nr} + 1))]=1 let "hfcports = ${hfcports} + ${ports}" IFS=$',' for li in ${opns}; do hfcmulti[${nr}]=$(echo "obase=10;2^(${!li}-1)+${hfcmulti[${nr}]}" | ${BC}) if [ "${li}" != "pcm_slave" ]; then hfcmulti[$((${nr} + 1))]=$(echo "obase=10;2^(${!li}-1)+${hfcmulti[$((${nr}+1))]}" | ${BC}) fi done IFS=$'\n' hfcmulti[$((${nr} + 1))]=$(echo "obase=10;2^(${pcm_slave}-1)+${hfcmulti[$((${nr}+1))]}" | ${BC}) let "skipnr = ${skipnr} + 1" ;; 0x*) hfcmulti[${nr}]=$(echo ${mod} | ${SED} -e "s/^0x\([0-9]*\)/\1/") let "hfcports = ${hfcports} + ${ports}" IFS=$',' for li in ${opns}; do hfcmulti[${nr}]=$(echo "obase=10;2^(${!li}-1)+${hfcmulti[${nr}]}" | ${BC}) done IFS=$'\n' ;; *) other_card[${nr}]=${mod} ;; esac ;; te_ptp) for li in $(expand "${val}"); do layermask[${li}]="0xf" protocol[${li}]=34 # 0x22 == 34 done ;; te_ptmp) for li in $(expand "${val}"); do layermask[${li}]="0xf" protocol[${li}]=2 # 0x2 == 2 done ;; nt_*) for li in $(expand "${val}"); do layermask[${li}]="0x3" protocol[${li}]=18 # 0x12 == 18 done ;; te_capi_ptp) for li in $(expand "${val}"); do layermask[${li}]="0x0" protocol[${li}]=34 # 0x22 == 34 done export addcapi=1 ;; te_capi_ptmp) for li in $(expand "${val}"); do layermask[${li}]="0x0" protocol[${li}]=2 # 0x2 == 2 done export addcapi=1 ;; option) port=`echo "${val}" | ${SED} -e "s/^\([0-9]*\),.*/\1/"` opt=`echo "${val}" | ${SED} -e "s/^[0-9]*,\(.*\)/\1/"` if [ -z ${protocol[${port}]} ]; then protocol[${port}]="0" fi IFS=$',' for li in ${opt}; do protocol[${port}]=$(echo "obase=10;2^(${!li}-1)+${protocol[${port}]}" | ${BC}) done IFS=$'\n' ;; poll) poll=${val} poll_option=poll=${val} ;; dsp_poll) dsp_poll_option=poll=${val} ;; pcm) pcm=${val} ;; dsp_options) export dsp_options=${val} ;; dtmfthreshold) export dtmfthreshold_option="dtmfthreshold=${val}" ;; debug) debug=${val} ;; timer) timer=${val} ;; *) echo "unknown variable: ${var}" ;; esac done echo "-----------------------------------------" echo " Loading module(s) for your misdn-cards:" echo "-----------------------------------------" card_index=1 port_index=1 while [ ! -z ${hfcmulti[${card_index}]} ] || [ ! -z ${other_card[${card_index}]} ]; do if [ ! -z ${hfcmulti[${card_index}]} ]; then # MODPROBE COMMAND FOR hfcmulti CARD hfcmulti_type="type=" hfcmulti_prot="protocol=" hfcmulti_layer="layermask=" while [ ! -z ${hfcmulti[${card_index}]} ]; do hfcmulti_type="${hfcmulti_type}$(echo "obase=16;\"0x\";${hfcmulti[${card_index}]}" | ${BC} )," let "card_index = ${card_index} + 1" done while [ ${hfcports} -gt 0 ]; do if [ ! -z ${protocol[${port_index}]} ]; then hfcmulti_prot="${hfcmulti_prot}$(echo "obase=16;\"0x\";${protocol[${port_index}]}" | ${BC})," else hfcmulti_prot="${hfcmulti_prot}0x2," fi if [ ! -z ${layermask[${port_index}]} ]; then hfcmulti_layer="${hfcmulti_layer}${layermask[${port_index}]}," else hfcmulti_layer="${hfcmulti_layer}0xf," fi let "port_index = ${port_index} + 1" let "hfcports = ${hfcports} - 1" done hfcmulti_type="$(echo ${hfcmulti_type} | ${SED} -e 's/^\(.*\),$/\1/')" hfcmulti_prot="$(echo ${hfcmulti_prot} | ${SED} -e 's/^\(.*\),$/\1/')" hfcmulti_layer="$(echo ${hfcmulti_layer} | ${SED} -e 's/^\(.*\),$/\1/')" hfcmulti_cmd="${MODPROBE} --ignore-install hfcmulti ${hfcmulti_type} ${hfcmulti_prot} ${hfcmulti_layer}" if [ ! -z ${poll} ]; then hfcmulti_cmd="${hfcmulti_cmd} poll=${poll}" fi if [ ! -z ${pcm} ]; then hfcmulti_cmd="${hfcmulti_cmd} pcm=${pcm}" fi if [ ! -z ${debug} ]; then hfcmulti_cmd="${hfcmulti_cmd} debug=${debug}" fi if [ ! -z ${timer} ]; then hfcmulti_cmd="${hfcmulti_cmd} timer=${timer}" fi if [ -z "$1" ] ; then echo ${hfcmulti_cmd} eval ${hfcmulti_cmd} else if [ "$1" = "hfcmulti" ] ; then echo ${hfcmulti_cmd} eval ${hfcmulti_cmd} fi fi else # MODPROBE COMMAND FOR _NON_ hfcmulti CARD other_mod="${other_card[${card_index}]}" other_cmd="${MODPROBE} --ignore-install ${other_mod}" if [ ! -z ${protocol[${port_index}]} ]; then other_prot="protocol=$(echo "obase=16;\"0x\";${protocol[${port_index}]}" | ${BC})," else other_prot="protocol=0x2," fi if [ ! -z ${layermask[${port_index}]} ]; then other_layer="layermask=${layermask[${port_index}]}," else other_layer="layermask=0xf," fi other_extra="" modinfo $other_mod | egrep -q 'parm: *poll' && other_extra="$other_extra ${poll_option}" let "prev = ${card_index}" let "card_index = ${card_index} + 1" let "port_index = ${port_index} + 1" while [ "${other_card[${card_index}]}" == "${other_card[${prev}]}" ]; do if [ ! -z ${protocol[${port_index}]} ]; then other_prot="${other_prot}$(echo "obase=16;\"0x\";${protocol[${port_index}]}" | ${BC})," else other_prot="${other_prot}0x2," fi if [ ! -z ${layermask[${port_index}]} ]; then other_layer="${other_layer}${layermask[${port_index}]}," else other_layer="${other_layer}0xf," fi let "prev = ${card_index}" let "card_index = ${card_index} + 1" let "port_index = ${port_index} + 1" done other_prot="$(echo ${other_prot} | ${SED} -e 's/^\(.*\),$/\1/')" other_layer="$(echo ${other_layer} | ${SED} -e 's/^\(.*\),$/\1/')" other_cmd="${other_cmd} ${other_prot} ${other_layer} ${other_extra}" if [ -z "$1" ] ; then echo "${other_cmd}" eval ${other_cmd} else if [ "$1" = "${other_card[${prev}]}" ] ; then echo ${other_cmd} eval ${other_cmd} fi fi fi done } function unload_card_modules { IFS=$'\n' for line in $(${SED} -ne '/^[^#]/p' ${misdn_init_conf}); do var=$(echo "${line}" | ${CUT} -d "=" -f 1) val=$(echo "${line}" | ${CUT} -d "=" -f 2) case "${var}" in card) nr=$(echo "${val}" | ${CUT} -d "," -f 1) mod=$(echo "${val}" | ${CUT} -d "," -f 2) case "${mod}" in 2E1) modulelist[${nr}]=hfcmulti ;; 0x*) modulelist[${nr}]=hfcmulti ;; *) modulelist[${nr}]=${mod} ;; esac ;; esac done echo "-------------------------------------------" echo " Unloading module(s) for your misdn-cards:" echo "-------------------------------------------" rmmod_cmd="${RMMOD} ${modulelist[1]}" echo "${rmmod_cmd}" eval ${rmmod_cmd} index=2 prev=1 while [ ! -z ${modulelist[${index}]} ]; do if [ ${modulelist[${index}]} != ${modulelist[${prev}]} ]; then rmmod_cmd="${RMMOD} ${modulelist[${index}]}" echo "${rmmod_cmd}" eval ${rmmod_cmd} fi let "prev = ${index}" let "index = ${index} + 1" done } function create_misdn_init_conf { cardline="" cardcount=1 portcount=0 cardconf="" IFS=$'\n' NL=" " carddb=$(create_card_db) for line in $carddb ; do tmp="card=$(echo $line | ${CUT} -d, -f1,3)" let "portcount = ${portcount} + $(echo $line | ${CUT} -d, -f2)" cardline="${cardline}${tmp}${NL}" done function die { echo "[!!] ${1}" exit 1 } if [ "${1}" == "scan" ]; then echo "[OK] found the following devices:" echo "${cardline}[ii] run \"/usr/sbin/misdn-init config\" to store this information to ${misdn_init_conf}" else index=1 portline="te_ptmp=" while [ ${index} -le ${portcount} ]; do portline="${portline}${index}," let "index = ${index} + 1" done portline="$(echo ${portline} | ${SED} -e 's/^\(.*\),$/\1/')" misdn_cfg_pt1="# # Configuration file for your misdn hardware # # Usage: /usr/sbin/misdn-init start|stop|restart|config|scan|help # # # Card Settings # # Syntax: card=,[,