#!/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= dtmftreshold_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 exit 1 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 check_cmd mknod check_cmd bc function check_asterisk { if ps ax | grep -v grep | grep asterisk > /dev/null ; then asterisk -rx "stop now" ; fi } function load_card_modules { if [ ! -z "$1" ] ; then echo "Loading only $1" fi IFS=$'\n' for line in $(sed -n -e '/^[^#]/p' ${misdn_init_conf}); do var=`echo "${line}" | sed -e "s/^\(.*\)=.*/\1/"` val=`echo "${line}" | sed -e "s/^.*=\(.*\)/\1/"` case "${var}" in card) nr=`echo "${val}" | sed -e "s/^\([0-9]*\),.*/\1/"` mod=`echo "${val}" | sed -e "s/^[^,]*,\([^,]*\).*/\1/"` if [ ${#val} -gt $(echo "obase=10;${#nr}+${#mod}+1" | ${BC}) ]; then opns=`echo "${val}" | sed -e "s/^[^,]*,[^,]*,\(.*\)/\1/"` else opns="" fi case "${mod}" in 0x*) hfcmulti[${nr}]=$(echo ${mod} | sed -e "s/^0x\([0-9]*\)/\1/") let "hfcports = ${hfcports} + ${hfcmulti[${nr}]}" 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) IFS=$',' for li in ${val}; do layermask[${li}]="0xf" protocol[${li}]=34 # 0x22 == 34 done IFS=$'\n' ;; te_ptmp) IFS=$',' for li in ${val}; do layermask[${li}]="0xf" protocol[${li}]=2 # 0x2 == 2 done IFS=$'\n' ;; nt_*) IFS=$',' for li in ${val}; do layermask[${li}]="0x3" protocol[${li}]=18 # 0x12 == 18 done IFS=$'\n' ;; te_capi_ptp) IFS=$',' for li in ${val}; do layermask[${li}]="0x0" protocol[${li}]=34 # 0x22 == 34 done IFS=$'\n' export addcapi=1 ;; te_capi_ptmp) IFS=$',' for li in ${val}; do layermask[${li}]="0x0" protocol[${li}]=2 # 0x2 == 2 done IFS=$'\n' 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} ;; pcm) pcm=${val} ;; dsp_options) export dsp_options=${val} ;; dtmftreshold) export dtmftreshold_option="dtmftreshold=${val}" ;; debug) debug=${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 "$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}" | sed -e "s/^\(.*\)=.*/\1/"` val=`echo "${line}" | sed -e "s/^.*=\(.*\)/\1/"` case "${var}" in card) nr=`echo "${val}" | sed -e "s/^\([0-9]*\),.*/\1/"` mod=`echo "${val}" | sed -e "s/^[^,]*,\([^,]*\).*/\1/"` case "${mod}" in 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 { cardcount=1 cardconf="" IFS=$'\n' NL=" " function die { echo "[!!] ${1}" exit 1 } function addcard { cardline="${cardline}card=${cardcount},${1}${NL}" let "cardcount = ${cardcount} + 1" } function addport { let "portcount = ${portcount} + ${1}" } portcount=0 for line in $(${LSPCI} -n -d 0xd161:b410); do addcard "0x4" addport 4 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 case "${line}" in 30b1*) addcard "0x1" addport 1 ;; 16b8*) addcard "0x8" addport 8 ;; 08b4*) if ${LSPCI} -n -v -s "${line:5}" | grep "Subsystem" | grep "1397:b566\|1397:b569" > /dev/null ; then addcard "0x2" addport 2 else addcard "0x4" addport 4 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" addport 1 done for line in $(${LSPCI} -n | grep "1244:\(0a00\|0e00\)"); do addcard "avmfritz" addport 1 done for line in $(${LSPCI} -n -d 1050:6692); do addcard "w6692pci" addport 1 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" addport 1 done fi 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=,[,