#!/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: # # /etc/init.d/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 MODPROBE=modprobe RMMOD=rmmod INSMOD=insmod LSPCI=lspci LSUSB=`which lsusb 2> /dev/null` MKNOD=mknod # 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 #dsp defaults dsp_options=0 function remove_preloaded_modules { tmp=$(lsmod) cards="hfcmulti hfcpci avmfritz w6692 hfcsusb" for i in $cards ; do echo $tmp | grep $i >/dev/null && (echo "$i already loaded, removing it"; modprobe -r $i) done } function load_card_modules { 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' addcapi=1 ;; te_capi_ptmp) IFS=$',' for li in ${val}; do layermask[${li}]="0x0" protocol[${li}]=2 # 0x2 == 2 done IFS=$'\n' 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} ;; pcm) pcm=${val} ;; dsp_options) export dsp_options=${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 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 echo ${hfcmulti_cmd} eval ${hfcmulti_cmd} else # MODPROBE COMMAND FOR _NON_ hfcmulti CARD other_cmd="modprobe ${other_card[${card_index}]}" 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 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}" echo "${other_cmd}" eval ${other_cmd} 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 1397:30b1); do addcard "0x1" addport 1 done for line in $(${LSPCI} -n -d 1397:08b4); do for l in $( ${LSPCI} -n -v -d 1397:08b4|grep Subsystem); do if echo $l | grep "1397:b566" ; then addcard "0x2" addport 2 else addcard "0x4" addport 4 fi done done for line in $(${LSPCI} -n -d 1397:16b8); do addcard "0x8" addport 8 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 \"/etc/init.d/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: /etc/init.d/misdn-init start|stop|restart|config|scan|help # # # Card Settings # # Syntax: card=,[,