]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/initscripts/init.d/mISDN
Add new lcr & mISDN initskript
[ipfire-2.x.git] / src / initscripts / init.d / mISDN
index bbe054a0a2ed3df0ce07c42029a5357f7411698a..1d599ae4bff40edf5fa139c01cd72f3ffa03c2d5 100644 (file)
-#!/bin/bash
-
-#----------------------------------------------
+#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/mISDN
 #
-# CONFIGURATION:
+# Description : Start mISDN v2
 #
-MISDN_CONF="/etc/mISDN.conf"
-MISDN_CONF_XSL="/usr/lib/mISDN/mISDN.conf.xsl"
+# Authors     : Arne Fitzenreiter - arne_f@ipfire.org
 #
-#----------------------------------------------
-
-SELF="${0}"
-USAGE="Usage: ${SELF} start|stop|restart|config|scan|help"
-
-function die {
-       echo "[!!] ${1}"
-       exit 1
-}
-
-function check_cmd
-{
-       if ! type -p "${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=`type -p ${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
-check_cmd mknod
-check_cmd chown
-check_cmd chmod
-
-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=''
-L1OIP_options=''
-
-AVMFRITZ_protocol=''
-AVMFRITZ_layermask=''
-
-HFCPCI_protocol=''
-HFCPCI_layermask=''
-
-L1OIP_type=''
-L1OIP_protocol=''
-L1OIP_layermask=''
-L1OIP_codec=''
-L1OIP_ip=''
-L1OIP_port=''
-L1OIP_localport=''
-L1OIP_ondemand=''
-L1OIP_id=''
-
-DEVNODE_user='root'
-DEVNODE_group='root'
-DEVNODE_mode='0644'
-
-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 curr tmpstr val
-       local IFS=$'\n'
-       
-       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"
-       
-       for line in ${CONFIG}; do
-               case "${line}" in
-                       DEVNODE:mISDN*)
-                               tmpstr=$(echo ${line} | ${SED} -n 's/.*user:\([^ ]*\).*/\1/p')
-                               if [ ! -z "${tmpstr}" ]; then
-                                       DEVNODE_user="${tmpstr}"
-                               fi
-                               tmpstr=$(echo ${line} | ${SED} -n 's/.*group:\([^ ]*\).*/\1/p')
-                               if [ ! -z "${tmpstr}" ]; then
-                                       DEVNODE_group="${tmpstr}"
-                               fi
-                               tmpstr=$(echo ${line} | ${SED} -n 's/.*mode:\([^ ]*\).*/\1/p')
-                               if [ ! -z "${tmpstr}" ]; then
-                                       DEVNODE_mode="${tmpstr}"
-                               fi
-                               ;;
-                       MODULE:hfcmulti*)
-                               HFCMULTI_options=${line:16}
-                               ;;
-                       MODULE:mISDN_dsp*)
-                               MISDNDSP_options=${line:17}
-                               ;;
-                       MODULE:l1oip*)
-                               L1OIP_options=${line:13}
-                               ;;
-                       CARD:BN*)
-                               curr='hfcmulti'
-                               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)
-                               ;;
-                       CARD:hfcpci*)
-                               curr='hfcpci'
-                               ;;
-                       CARD:avmfritz*)
-                               curr='avmfritz'
-                               ;;
-                       CARD:l1oip*)
-                               curr='l1oip'
-                               ;;
-                       PORT*)
-                               case "${curr}" in
-                                       hfcmulti)
-                                               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})"
-                                               ;;
-                                       hfcpci)
-                                               let "p = $(echo ${line} | ${SED} -n 's/.*protocol:\([^ ]*\).*/\1/p')"
-                                               HFCPCI_protocol="${HFCPCI_protocol:+"${HFCPCI_protocol},"}$(printf "0x%x" ${p})"
-                                               let "l = $(echo ${line} | ${SED} -n 's/.*layermask:\([^ ]*\).*/\1/p')"
-                                               HFCPCI_layermask="${HFCPCI_layermask:+"${HFCPCI_layermask},"}$(printf "0x%x" ${l})"
-                                               ;;
-                                       avmfritz)
-                                               let "p = $(echo ${line} | ${SED} -n 's/.*protocol:\([^ ]*\).*/\1/p')"
-                                               AVMFRITZ_protocol="${AVMFRITZ_protocol:+"${AVMFRITZ_protocol},"}$(printf "0x%x" ${p})"
-                                               let "l = $(echo ${line} | ${SED} -n 's/.*layermask:\([^ ]*\).*/\1/p')"
-                                               AVMFRITZ_layermask="${AVMFRITZ_layermask:+"${AVMFRITZ_layermask},"}$(printf "0x%x" ${l})"
-                                               ;;
-                                       l1oip)
-                                               let "val = $(echo ${line} | ${SED} -n 's/.*type:\([^ ]*\).*/\1/p')"
-                                               L1OIP_type="${L1OIP_type:+"${L1OIP_type},"}$(printf "0x%x" ${val})"
-                                               let "val = $(echo ${line} | ${SED} -n 's/.*protocol:\([^ ]*\).*/\1/p')"
-                                               L1OIP_protocol="${L1OIP_protocol:+"${L1OIP_protocol},"}$(printf "0x%x" ${val})"
-                                               let "val = $(echo ${line} | ${SED} -n 's/.*layermask:\([^ ]*\).*/\1/p')"
-                                               L1OIP_layermask="${L1OIP_layermask:+"${L1OIP_layermask},"}$(printf "0x%x" ${val})"
-                                               val="$(echo ${line} | ${SED} -n 's/.*codec:\([^ ]*\).*/\1/p')"
-                                               L1OIP_codec="${L1OIP_codec:+"${L1OIP_codec},"}${val}"
-                                               val="$(echo ${line} | ${SED} -n 's/.*ip:\([^ ]*\).*/\1/p')"
-                                               L1OIP_ip="${L1OIP_ip:+"${L1OIP_ip},"}${val}"
-                                               val="$(echo ${line} | ${SED} -n 's/.*port:\([^ ]*\).*/\1/p')"
-                                               L1OIP_port="${L1OIP_port:+"${L1OIP_port},"}${val}"
-                                               val="$(echo ${line} | ${SED} -n 's/.*localport:\([^ ]*\).*/\1/p')"
-                                               L1OIP_localport="${L1OIP_localport:+"${L1OIP_localport},"}${val}"
-                                               val="$(echo ${line} | ${SED} -n 's/.*ondemand:\([^ ]*\).*/\1/p')"
-                                               L1OIP_ondemand="${L1OIP_ondemand:+"${L1OIP_ondemand},"}${val}"
-                                               val="$(echo ${line} | ${SED} -n 's/.*id:\([^ ]*\).*/\1/p')"
-                                               L1OIP_id="${L1OIP_id:+"${L1OIP_id},"}${val}"
-                                               ;;
-                               esac
-                               ;;
-               esac
-       done
-
-       if [ ! -z "${HFCMULTI_protocol[0]}" ]; then
-               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}"
-       fi
-
-       if [ ! -z "${HFCPCI_protocol}" ]; then
-               START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install hfcpci protocol=${HFCPCI_protocol} layermask=${HFCPCI_layermask}"
-       fi
-
-       if [ ! -z "${AVMFRITZ_protocol}" ]; then
-               START_COMMANDS[${#START_COMMANDS[@]}]="${MODPROBE} --ignore-install avmfritz protocol=${AVMFRITZ_protocol} layermask=${AVMFRITZ_layermask}"
-       fi
-
-       if [ ! -z "${L1OIP_type}" ]; then
-               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}"
-       fi
-
-       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 | avmfritz | l1oip)
-                               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="<?xml version=\"1.0\"?>
-<!--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Card Type: BN2S0, BN4S0, BN8S0
-Card Attributes: ulaw=(yes|no), dtmf=(yes|no), pcm_slave=(yes|no),
-                 ignore_pcm_frameclock=(yes|no), rxclock=(yes|no),
-                 crystalclock=(yes|no), watchdog=(yes|no)
-Port Attributes: mode=(te|nt), link=(ptp|ptmp), master-clock=(yes|no),
-                 capi=(yes|no)
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Card Type: BN2E1
-Card Attributes: ulaw=(yes|no), dtmf=(yes|no), pcm_slave=(yes|no),
-                 ignore_pcm_frameclock=(yes|no), rxclock=(yes|no),
-                 crystalclock=(yes|no), watchdog=(yes|no)
-Port Attributes: mode=(te|nt), link=(ptp|ptmp), optical=(yes|no), los=(yes|no),
-                 ais=(yes|no), slip=(yes|no), nocrc4=(yes|no), capi=(yes|no)
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Card Type: hfcmulti, avmfritz, w6692pci
-Port Attributes: mode=(te|nt), link=(ptp|ptmp), capi=(yes|no)
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Module: hfcmulti
-Options: poll=<number>, pcm=<number>, debug=<number>, timer=(yes|no)
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Module: mISDN_dsp
-Options: debug=<number>, options=<number>, poll=<number>,
-         dtmfthreshold=<number>
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
--->
-<mISDNconf>
-${TAB}<module poll=\"128\" debug=\"0\" timer=\"no\">hfcmulti</module>
-${TAB}<module debug=\"0\" options=\"0\">mISDN_dsp</module>
-${TAB}<devnode user=\"root\" group=\"root\" mode=\"644\">mISDN</devnode>"
-       local FOOTER="</mISDNconf>"
-       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}<card type=\"${SCAN_card[${i}]}\"${SCAN_opts[${i}]:+" ${SCAN_opts[${i}]}"}>"
-               j=1
-               while [ ${j} -le ${SCAN_num_ports[${i}]} ]; do
-                       MAIN="${MAIN}${NL}${TAB}${TAB}<port${SCAN_port_opts[${i}]:+" ${SCAN_port_opts[${i}]}"}>${j}</port>"
-                       let "j = ${j} + 1"
-               done
-               MAIN="${MAIN}${NL}${TAB}</card>"
-               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
-}
-
-function mk_misdn_dev
-{
-       if [ ! -e /dev/mISDN ]; then
-               echo "creating device node: /dev/mISDN"
-               ${MKNOD} /dev/mISDN c 46 0
-       fi
-       ${CHOWN} ${DEVNODE_user}:${DEVNODE_group} /dev/mISDN
-       ${CHMOD} ${DEVNODE_mode} /dev/mISDN
-}
-
+# Version     : 00.00
 #
-# MAIN
+# Notes       :
 #
+########################################################################
 
-case "${1}" in
-
-       start|--start)
-
-               check_misdn_conf
-               parse_config
-               run_start_commands
-               mk_misdn_dev
-               ;;
+. /etc/sysconfig/rc
+. ${rc_functions}
 
-       stop|--stop)
+case "${1}" in
+       start)
 
-               run_stop_commands
-               ;;
+               boot_mesg "Starting mISDNv2 ... "
 
-       restart|--restart)
+               # load mISDN modules
+               for module in mISDN_core hfcpci hfcsusb hfcmulti xhfc; do
+                   modprobe $module > /dev/null 2>&1;
+               done
 
-               check_misdn_conf
-               parse_config
-               run_stop_commands
-               ${SLEEP} 2
-               run_start_commands
-               mk_misdn_dev
+               modprobe mISDN_dsp
+               if [ ${?} = 0 ]; then
+                   echo_ok;
+               else
+                   echo_failure;
+               fi
+               exit 0;
                ;;
 
-       config|--config)
-               
-               scan_devices
-               write_mISDN_conf
-               ;;
+       stop)
 
-       scan|--scan)
+               boot_mesg "Stopping mISDNv2 ... "
 
-               scan_devices
-               print_scan_results
-               ;;
+               # unload mISDN hardware modules
+               for module in mISDN_dsp hfcpci hfcsusb hfcmulti xhfc; do
+                   rmmod $module > /dev/null 2>&1;
+               done
 
-       help|--help)
-               echo "${USAGE}"
-               exit 0
+               rmmod mISDN_core
+               if [ ${?} = 0 ]; then
+                   echo_ok;
+               else
+                   echo_failure;
+               fi
+               exit 0;
                ;;
 
        *)
-               echo "${USAGE}"
-               exit 2
+               echo "Usage: ${0} {start}{stop}"
+               exit 1
                ;;
-
 esac
 
+# End $rc_base/init.d/mISDN