3 #----------------------------------------------
7 MISDN_CONF
="/etc/mISDN.conf"
8 MISDN_CONF_XSL
="/usr/lib/mISDN/mISDN.conf.xsl"
10 #----------------------------------------------
13 USAGE
="Usage: ${SELF} start|stop|restart|config|scan|help"
22 if ! type -p "${1}" > /dev
/null
; then
23 if [ "${2}" = "opt" ]; then
26 if [ "$(id -u)" != "0" ]; then
27 die
"$1 not in path, please install and/or be root."
29 die
"$1 not in path, please install."
33 local var
=$
(echo ${1} |
tr a-z A-Z
)
34 eval "$var=`type -p ${1}`"
38 function check_misdn_conf
40 if [ ! -f ${MISDN_CONF} ]; then
41 die
"${MISDN_CONF} not found. Please run: ${SELF} config"
59 declare -a START_COMMANDS
60 declare -a STOP_COMMANDS
62 declare -a HFCMULTI_card
63 declare -a HFCMULTI_type
64 declare -a HFCMULTI_protocol
65 declare -a HFCMULTI_layermask
92 declare -a SCAN_num_ports
93 declare -a SCAN_port_opts
97 local CONFIG
=$
(${XSLTPROC} ${MISDN_CONF_XSL} ${MISDN_CONF})
98 local t p l line i tmpcmd curr tmpstr val
101 START_COMMANDS
[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install capi"
102 START_COMMANDS
[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_core debug=0"
103 START_COMMANDS
[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_l1 debug=0"
104 START_COMMANDS
[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_l2 debug=0"
105 START_COMMANDS
[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install l3udss1 debug=0"
106 START_COMMANDS
[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_capi"
108 for line
in ${CONFIG}; do
111 tmpstr
=$
(echo ${line} |
${SED} -n 's/.*user:\([^ ]*\).*/\1/p')
112 if [ ! -z "${tmpstr}" ]; then
113 DEVNODE_user
="${tmpstr}"
115 tmpstr
=$
(echo ${line} |
${SED} -n 's/.*group:\([^ ]*\).*/\1/p')
116 if [ ! -z "${tmpstr}" ]; then
117 DEVNODE_group
="${tmpstr}"
119 tmpstr
=$
(echo ${line} |
${SED} -n 's/.*mode:\([^ ]*\).*/\1/p')
120 if [ ! -z "${tmpstr}" ]; then
121 DEVNODE_mode
="${tmpstr}"
125 HFCMULTI_options
=${line:16}
128 MISDNDSP_options
=${line:17}
131 L1OIP_options
=${line:13}
135 i
=${#HFCMULTI_type[@]}
136 let "t = $(echo ${line} | ${SED} -n 's/.*type:\([^,]*\).*/\1/p')"
137 HFCMULTI_type
[${i}]=$
(printf "0x%x" ${t})
139 # this is for the BN2E1 card that needs two type numbers
140 t
=$
(echo ${line} |
${SED} -n 's/.*type:[^,]*,\([^ ]*\).*/\1/p')
141 if [ ! -z "${t}" ]; then
143 HFCMULTI_type
[${i}]="${HFCMULTI_type[${i}]},$
(printf "0x%x" ${t})"
146 HFCMULTI_card[${i}]=$(echo ${line:5} | ${CUT} -d" " -f1)
160 let "p
= $
(echo ${line} |
${SED} -n 's/.*protocol:\([^ ]*\).*/\1/p')"
161 HFCMULTI_protocol[${i}]="${HFCMULTI_protocol[${i}]:+"${HFCMULTI_protocol[${i}]},"}$
(printf "0x%x" ${p})"
162 let "l
= $
(echo ${line} |
${SED} -n 's/.*layermask:\([^ ]*\).*/\1/p')"
163 HFCMULTI_layermask[${i}]="${HFCMULTI_layermask[${i}]:+"${HFCMULTI_layermask[${i}]},"}$
(printf "0x%x" ${l})"
166 let "p
= $
(echo ${line} |
${SED} -n 's/.*protocol:\([^ ]*\).*/\1/p')"
167 HFCPCI_protocol="${HFCPCI_protocol:+"${HFCPCI_protocol},"}$
(printf "0x%x" ${p})"
168 let "l
= $
(echo ${line} |
${SED} -n 's/.*layermask:\([^ ]*\).*/\1/p')"
169 HFCPCI_layermask="${HFCPCI_layermask:+"${HFCPCI_layermask},"}$
(printf "0x%x" ${l})"
172 let "p
= $
(echo ${line} |
${SED} -n 's/.*protocol:\([^ ]*\).*/\1/p')"
173 AVMFRITZ_protocol="${AVMFRITZ_protocol:+"${AVMFRITZ_protocol},"}$
(printf "0x%x" ${p})"
174 let "l
= $
(echo ${line} |
${SED} -n 's/.*layermask:\([^ ]*\).*/\1/p')"
175 AVMFRITZ_layermask="${AVMFRITZ_layermask:+"${AVMFRITZ_layermask},"}$
(printf "0x%x" ${l})"
178 let "val
= $
(echo ${line} |
${SED} -n 's/.*type:\([^ ]*\).*/\1/p')"
179 L1OIP_type="${L1OIP_type:+"${L1OIP_type},"}$
(printf "0x%x" ${val})"
180 let "val
= $
(echo ${line} |
${SED} -n 's/.*protocol:\([^ ]*\).*/\1/p')"
181 L1OIP_protocol="${L1OIP_protocol:+"${L1OIP_protocol},"}$
(printf "0x%x" ${val})"
182 let "val
= $
(echo ${line} |
${SED} -n 's/.*layermask:\([^ ]*\).*/\1/p')"
183 L1OIP_layermask="${L1OIP_layermask:+"${L1OIP_layermask},"}$
(printf "0x%x" ${val})"
184 val="$
(echo ${line} |
${SED} -n 's/.*codec:\([^ ]*\).*/\1/p')"
185 L1OIP_codec="${L1OIP_codec:+"${L1OIP_codec},"}${val}"
186 val="$
(echo ${line} |
${SED} -n 's/.*ip:\([^ ]*\).*/\1/p')"
187 L1OIP_ip="${L1OIP_ip:+"${L1OIP_ip},"}${val}"
188 val="$
(echo ${line} |
${SED} -n 's/.*port:\([^ ]*\).*/\1/p')"
189 L1OIP_port="${L1OIP_port:+"${L1OIP_port},"}${val}"
190 val="$
(echo ${line} |
${SED} -n 's/.*localport:\([^ ]*\).*/\1/p')"
191 L1OIP_localport="${L1OIP_localport:+"${L1OIP_localport},"}${val}"
192 val="$
(echo ${line} |
${SED} -n 's/.*ondemand:\([^ ]*\).*/\1/p')"
193 L1OIP_ondemand="${L1OIP_ondemand:+"${L1OIP_ondemand},"}${val}"
194 val="$
(echo ${line} |
${SED} -n 's/.*id:\([^ ]*\).*/\1/p')"
195 L1OIP_id="${L1OIP_id:+"${L1OIP_id},"}${val}"
202 if [ ! -z "${HFCMULTI_protocol[0]}" ]; then
203 tmpcmd="${MODPROBE} --ignore-install hfcmulti
type=${HFCMULTI_type[0]}"
205 while [ ! -z "${HFCMULTI_type[${i}]}" ]; do
206 tmpcmd="${tmpcmd},${HFCMULTI_type[${i}]}"
209 tmpcmd="${tmpcmd} protocol
=${HFCMULTI_protocol[0]}"
211 while [ ! -z "${HFCMULTI_protocol[${i}]}" ]; do
212 tmpcmd="${tmpcmd},${HFCMULTI_protocol[${i}]}"
215 tmpcmd="${tmpcmd} layermask
=${HFCMULTI_layermask[0]}"
217 while [ ! -z "${HFCMULTI_layermask[${i}]}" ]; do
218 tmpcmd="${tmpcmd},${HFCMULTI_layermask[${i}]}"
221 START_COMMANDS[${#START_COMMANDS[@]}]="${tmpcmd} ${HFCMULTI_options}"
224 if [ ! -z "${HFCPCI_protocol}" ]; then
225 START_COMMANDS
[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install hfcpci protocol=${HFCPCI_protocol} layermask=${HFCPCI_layermask}"
228 if [ ! -z "${AVMFRITZ_protocol}" ]; then
229 START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install avmfritz protocol=${AVMFRITZ_protocol} layermask=${AVMFRITZ_layermask}"
232 if [ ! -z "${L1OIP_type}" ]; then
233 START_COMMANDS
[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install l1oip type=${L1OIP_type} protocol=${L1OIP_protocol} layermask=${L1OIP_layermask} codec=${L1OIP_codec} ip=${L1OIP_ip} port=${L1OIP_port} localport=${L1OIP_localport} ondemand=${L1OIP_ondemand} id=${L1OIP_id} ${L1OIP_options}"
236 START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install mISDN_dsp ${MISDNDSP_options}"
239 function run_start_commands
243 echo "-- Loading mISDN modules --"
244 while [ ! -z "${START_COMMANDS[${i}]}" ]; do
245 echo ">> ${START_COMMANDS[${i}]}"
246 eval "${START_COMMANDS[${i}]}"
251 function run_stop_commands
255 for mod
in $
(lsmod |
${SED} -ne '/Module/!{s/\([^ ]*\).*/\1/;p}'); do
257 mISDN_capi | mISDN_dsp | l3udss1 | mISDN_l2 | mISDN_l1 | mISDN_isac | hfcmulti | avmfritz | l1oip
)
258 STOP_COMMANDS
[0]="${STOP_COMMANDS[0]:-"${MODPROBE} -r --ignore-remove"} ${mod}"
261 STOP_COMMANDS
[1]="${MODPROBE} -r --ignore-remove mISDN_core"
266 echo "-- Unloading mISDN modules --"
267 while [ ! -z "${STOP_COMMANDS[${i}]}" ]; do
268 echo ">> ${STOP_COMMANDS[${i}]}"
269 eval "${STOP_COMMANDS[${i}]}"
274 function scan_devices
276 local skipnext
=0 IFS
=$
'\n'
281 SCAN_card
[${#SCAN_card[@]}]="${1}"
282 SCAN_opts
[${#SCAN_opts[@]}]="${2}"
283 SCAN_num_ports
[${#SCAN_num_ports[@]}]="${3}"
284 SCAN_port_opts
[${#SCAN_port_opts[@]}]="${4}"
287 for line
in $
(${LSPCI} -n -d 0xd161:b410
); do
288 addcard
"BN4S0" "" 4 'mode="te" link="ptmp"'
291 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
292 if [ ${skipnext} -eq 1 ]; then
300 addcard "BN1E1" "" 1 'mode
="nt" link
="ptp"'
303 if [ $(${LSPCI} -n -s "${line:5:3}" | ${WC} -l) -eq 2 ]; then
304 addcard "BN2E1" "" 2 'mode
="nt" link
="ptp"'
307 addcard "BN1E1" "" 1 'mode
="nt" link
="ptp"'
313 addcard "BN8S0" "" 8 'mode
="te" link
="ptmp"'
316 if ${LSPCI} -n -v -s "${line:5}" | ${GREP} "Subsystem" | ${GREP} "1397:b567" > /dev/null ; then
317 addcard "BN1S0" "" 1 'mode
="te" link
="ptmp"'
318 elif ${LSPCI} -n -v -s "${line:5}" | ${GREP} "Subsystem" | ${GREP} "1397:b566\|1397:b569" > /dev/null ; then
319 addcard "BN2S0" "" 2 'mode
="te" link
="ptmp"'
321 addcard "BN4S0" "" 4 'mode
="te" link
="ptmp"'
326 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
327 addcard "hfcpci" "" 1 'mode
="te" link
="ptmp"'
329 for line in $(${LSPCI} -n | ${GREP} "1244:\(0a00\|0e00\)"); do
330 addcard "avmfritz" "" 1 'mode
="te" link
="ptmp"'
332 for line in $(${LSPCI} -n -d 1050:6692); do
333 addcard "w6692pci" "" 1 'mode
="te" link
="ptmp"'
335 if [ -e ${LSUSB} ]; then
336 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
337 addcard "hfcsusb" "" 1 'mode
="te" link
="ptmp"'
342 function write_mISDN_conf
347 local HEADER="<?xml version=\"1.0\"?>
349 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
350 Card Type: BN2S0, BN4S0, BN8S0
351 Card Attributes: ulaw=(yes|no), dtmf=(yes|no), pcm_slave=(yes|no),
352 ignore_pcm_frameclock=(yes|no), rxclock=(yes|no),
353 crystalclock=(yes|no), watchdog=(yes|no)
354 Port Attributes: mode=(te|nt), link=(ptp|ptmp), master-clock=(yes|no),
356 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
358 Card Attributes: ulaw=(yes|no), dtmf=(yes|no), pcm_slave=(yes|no),
359 ignore_pcm_frameclock=(yes|no), rxclock=(yes|no),
360 crystalclock=(yes|no), watchdog=(yes|no)
361 Port Attributes: mode=(te|nt), link=(ptp|ptmp), optical=(yes|no), los=(yes|no),
362 ais=(yes|no), slip=(yes|no), nocrc4=(yes|no), capi=(yes|no)
363 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
364 Card Type: hfcmulti, avmfritz, w6692pci
365 Port Attributes: mode=(te|nt), link=(ptp|ptmp), capi=(yes|no)
366 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
368 Options: poll=<number>, pcm=<number>, debug=<number>, timer=(yes|no)
369 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
371 Options: debug=<number>, options=<number>, poll=<number>,
372 dtmfthreshold=<number>
373 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
376 ${TAB}<module poll=\"128\" debug=\"0\" timer=\"no\">hfcmulti</module>
377 ${TAB}<module debug=\"0\" options=\"0\">mISDN_dsp</module>
378 ${TAB}<devnode user=\"root\" group=\"root\" mode=\"644\">mISDN</devnode>"
379 local FOOTER="</mISDNconf>"
380 local i=0 j=0 MAIN=""
382 echo "Writing ${MISDN_CONF} for ${#SCAN_card[@]} mISDN compatible device(s):"
383 while [ ! -z "${SCAN_card[${i}]}" ]; do
384 echo ">> ${SCAN_card[${i}]}"
385 MAIN="${MAIN}${NL}${TAB}<card type=\"${SCAN_card[${i}]}\"${SCAN_opts[${i}]:+" ${SCAN_opts[${i}]}"}>"
387 while [ ${j} -le ${SCAN_num_ports[${i}]} ]; do
388 MAIN="${MAIN}${NL}${TAB}${TAB}<port${SCAN_port_opts[${i}]:+" ${SCAN_port_opts[${i}]}"}>${j}</port>"
391 MAIN="${MAIN}${NL}${TAB}</card>"
395 if [ -f ${MISDN_CONF} ]; then
396 echo "${MISDN_CONF} already present, saving a backup: ${MISDN_CONF}.bak"
397 ${CP} "${MISDN_CONF}" "${MISDN_CONF}.bak" || die "Could not backup your existing ${MISDN_CONF}!"
399 echo "${HEADER}${MAIN}${NL}${FOOTER}" > ${MISDN_CONF}
402 function print_scan_results
406 echo "${#SCAN_card[@]} mISDN compatible device(s) found:"
407 while [ ! -z "${SCAN_card[${i}]}" ]; do
408 echo ">> ${SCAN_card[${i}]}"
413 function mk_misdn_dev
415 if [ ! -e /dev/mISDN ]; then
416 echo "creating device node: /dev/mISDN"
417 ${MKNOD} /dev/mISDN c 46 0
419 ${CHOWN} ${DEVNODE_user}:${DEVNODE_group} /dev/mISDN
420 ${CHMOD} ${DEVNODE_mode} /dev/mISDN