From b5755da0d40e72fad44756bc009fcf688c3380cc Mon Sep 17 00:00:00 2001 From: tzafrir Date: Sat, 17 Jun 2006 12:00:29 +0000 Subject: moving genzaptelconf to utils git-svn-id: http://svn.digium.com/svn/zaptel/trunk@1113 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- xpp/genzaptelconf | 929 ---------------------------------------------- xpp/genzaptelconf.8 | 258 ------------- xpp/utils/genzaptelconf | 929 ++++++++++++++++++++++++++++++++++++++++++++++ xpp/utils/genzaptelconf.8 | 258 +++++++++++++ 4 files changed, 1187 insertions(+), 1187 deletions(-) delete mode 100755 xpp/genzaptelconf delete mode 100644 xpp/genzaptelconf.8 create mode 100755 xpp/utils/genzaptelconf create mode 100644 xpp/utils/genzaptelconf.8 diff --git a/xpp/genzaptelconf b/xpp/genzaptelconf deleted file mode 100755 index 7bcc20e..0000000 --- a/xpp/genzaptelconf +++ /dev/null @@ -1,929 +0,0 @@ -#! /bin/bash - -# genzaptelconf: generate as smartly as you can: -# /etc/zaptel.conf -# /etc/asterisk/zapata-channels.conf (to be #include-d into zapata.conf) -# update: -# With '-M' /etc/modules (list of modules to load) -# -# Copyright (C) 2005 by Xorcom -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# If you have any technical questions, contact -# Tzafrir Cohen -# - -# The script uses a number of bash-specific features -# TODO: either ditch them or convert to perl -# Don't override variables here. Override them in /etc/default/zaptel -# -# 0.5.1: -# * Initial support for ztgsm (Junghanns's PCI GSM card) -# * Wait for the xpp module to register if just loaded -# 0.5.0: -# * Not trying to read from zaptel channels: we can run genzaptelconf even -# with asterisk up. -# * Don't add ztdummy to the list of detected modules -# 0.4.4: -# * remove ztdummy when rewriting modules file -# * Better ISDN PRI behaviour in Israel (il) -# 0.4.3: -# * Added -F: to disable writing about FXS ports in zapata.conf -# * if we have an astribank: start zaptel rather than simple ztcfg (xpd sync) -# 0.4.2: -# * support for digital input/output ports of Astribank -# * Different ISDN parameters for the Netherlands (nl) -# * unload zaptel and its dependencies, not a hard-coded list -# * hence we can reduce the list of modules - -# /etc/default/zaptel may override the following variables -VERSION=0.5.1 -VERSION_FULL="$VERSION $Id$" -lc_country=us -base_exten=6000 -# If set: no context changes are made in zapata-channels.conf -#context_manual=yes -context_lines=from-pstn # context into which PSTN calls go -context_phones=from-internal # context for internal phones calls. -# The two below apply to input and output ports of the Xorcom Astribank: -context_input=astbank-input -context_output=astbank-output # useless, but helps marking the channels :-) -# TODO: what about PRI/BRI? -# If set: no group changes are made in zapata-channels.conf -#group_manual=yes -group_phones=5 # group for phones -group_lines=0 # group for lines -# set 'immediate=yes' for Asteribank input channels and 'immediate=no' -# for others. Note that if an Astribank is not detected, the script -# will set this to "no", so you can safely leave it as "yes". -set_immediate=yes - -ZAPCONF_FILE=/etc/zaptel.conf -ZAPATA_FILE=/etc/asterisk/zapata-channels.conf -ZAPTEL_BOOT=/etc/default/zaptel -MODLIST_FILE=/etc/modules -exten_base_dir=/etc/asterisk/extensions-phones.d -exten_defs_file=/etc/asterisk/extensions-defs.conf -ZTCFG=/sbin/ztcfg - -# a temporary directory. Created when the switch -r is parsed on getopts -# and deleted in the end on update_extensions_defs -tmp_dir= - -# A list of all modules: -# - the list of modules which will be probed (in this order) if -d is used -# - The module that will be deleted from /etc/modules , if -d -M is used -ALL_MODULES="zaphfc qozap ztgsm wctdm wctdm24xxp wcfxo wcfxs pciradio tor2 torisa wct1xxp wct4xxp wcte11xp wcusb xpp_usb" - -# read default configuration from /etc/default/zaptel -if [ -r $ZAPTEL_BOOT ]; then . $ZAPTEL_BOOT; fi - -# it is safe to use -c twice: the last one will be used. -ztcfg_cmd="$ZTCFG -c $ZAPCONF_FILE" - -# work around a bug (that was already fixed) in the installer: -if [ "$lc_country" = '' ]; then lc_country=us; fi - -force_stop_ast=no -do_detect=no -do_unload=no -do_module_list=no -verbose=no -fxsdisable=no -rapid_extens='' -# global: current extension number in extensions list. Should only be -# changed in print_pattern: -rapid_cur_exten=1 -# set the TRUNK in extensidialplan dialplan defs file rapid_conf_mode=no - -die() { - echo "$@" >&2 - exit 1 -} - -say() { - if [ "$verbose" = no ]; then - return - fi - echo "$@" >&2 -} - -run_ztcfg() { - if [ "$verbose" = no ]; then - $ztcfg_cmd "$@" - else - say "Reconfiguring identified channels" - $ztcfg_cmd -vv "$@" - fi -} - -update_module_list() { - del_args=`for i in $ALL_MODULES ztdummy - do - echo "$i" | sed s:.\*:-e\ '/^&/d': - done` - add_args=`for i in $* - do - echo "$i" | sed s:.\*:-e\ '\$a&': - done` - - sed -i.bak $del_args "$MODLIST_FILE" - for i in $* - do - echo "$i" - done >> "$MODLIST_FILE" -} - -do_update() { - if [ ! -d `dirname ${ZAPTEL_BOOT}` ] - then - return - fi - sed -i.bak "s/^$1=.*\$/$1=\"$2\"/" ${ZAPTEL_BOOT} - if ! grep -q "^$1=" ${ZAPTEL_BOOT}; then - echo "$1=\"$2\"" >> ${ZAPTEL_BOOT} - fi -} - -update_extensions_defs() { - if [ "$rapid_conf_mode" = 'yes' ] - then - say "DEBUG: Updating dialplan defs file $exten_defs_file" - if [ "`echo $tmp_dir/fxo_* | grep -v '*'`" != '' ] - then - trunk_nums=`cat $tmp_dir/fxo_* | sort -n | xargs` - say "Configuring TRUNK to be [first of] zaptel channels: $trunk_nums" - trunk_dev=`echo $trunk_nums| sed -e 's/ /\\\\\\&/g' -e 's/[0-9a-zA-Z]\+/Zap\\\\\\/&/g'` - echo >&2 sed -i "s/^TRUNK.*=>.*/TRUNK => $trunk_dev/" $exten_defs_file - sed -i "s/^TRUNK.*=>.*/TRUNK => $trunk_dev/" $exten_defs_file - if ! grep -q "^TRUNK =>" $exten_defs_file; then - trunk_dev=`echo $trunk_nums| sed -e 's/ /&/g' -e 's/[0-9a-zA-Z]*/Zap\\/&/g'` - echo "TRUNK => $trunk_dev" >> $exten_defs_file - fi - else - say "Warning: No FXO channel for trunk. Moving on." - fi - if [ "`echo $tmp_dir/fxs_* | grep -v '*'`" != '' ] - then - fxs_nums=`cat $tmp_dir/fxs_* | sort -n | xargs` - zap_nums=`grep '^[^;].*Zap/\${CHAN_ZAP_' $exten_base_dir/*.conf | \ - sed -e 's/.*Zap\/\${CHAN_ZAP_\([0-9]*\)}.*/\1/' | sort -u | xargs` - say "Configuring channels: $fxs_nums as channel placeholders: $zap_nums" - j=1 - for i in $zap_nums - do - chan=`echo $fxs_nums | awk "{print \\$$i}"` - if [ "$chan" = '' ] - then - # if the result is empty, we probably got past the last one. - # bail out. - say "Warning: No FXS channel for CHAN_ZAP_$i. Moving on" - break - fi - say "DEBUG: setting channel $chan to placeholder $i" - if grep -q "^CHAN_ZAP_$i " $exten_defs_file - then - sed -i -e "s/^CHAN_ZAP_$i .*/CHAN_ZAP_$i => Zap\/$chan/" $exten_defs_file - else - echo "CHAN_ZAP_$i => Zap/$chan" >> $exten_defs_file - fi - done - fi - # cleaning up the temp dir - fi - if [ -d "$tmp_dir" ]; then rm -rf "$tmp_dir"; fi -} - -check_for_astribank(){ - if ! grep -q XPP_IN/ /proc/zaptel/* 2>/dev/null - then - # we only get here is if we find no Astribank input channels - # in /proc/zaptel . Hence we can safely disable their special settings: - set_immediate=no - fi -} - -usage() { - program=`basename $0` - - echo >&2 "$program: generate zaptel.conf and zapata.conf" - echo >&2 "(version $VERSION_FULL)" - echo >&2 "usage:" - echo >&2 " $program [-sdv] [-m k|l|g] [-c ] [-r |-e ] " - echo >&2 " $program [-sdv] -l" - echo >&2 " $program -su" - echo >&2 " $program -h (this screen)" - echo >&2 "" - echo >&2 "Options:" - echo >&2 " -c CODE: set the country code (default: $lc_country)" - echo >&2 " -e NUM: set the base extension number (default: $base_exten)" - echo >&2 " -F: Don't print FXSs in zapata.conf" - echo >&2 " -l: output a list of detected channels instead of zaptel.conf" - echo >&2 " -d: Perform hardware detection" - echo >&2 " -u: Unload zaptel modules" - echo >&2 " -v: verbose" - echo >&2 " -s: Don't fail if asterisk is running. Stop it" - echo >&2 " -r: rapid configuration mode: configure Zaptel FXS channels from " - echo >&2 " existing Rapid extension files. FXOs will all be TRUNK " -} - -# $1: channel number -print_pattern() { - local astbank_type='' - OPTIND=1 - while getopts 'a:' arg - do - case "$arg" in - a) case "$OPTARG" in input|output) astbank_type=$OPTARG;;esac ;; - esac - done - shift $(( $OPTIND-1 )) - - - local chan=$1 - local sig=$2 #fxs/fxo - local mode=$3 - local method='ks' - if [ "$lc_country" = il ] && [ "$sig" = 'fxs' ] - then method=ls - fi - case "$mode" in - zaptel) - # sadly, both input ports and output ports go into the same span as - # the FXS ports. Thus we need to separate between them. See also - # the zapata.conf section: - if [ "$astbank_type" != '' ]; then echo "# astbanktype: $astbank_type"; fi - echo "${sig}$method=$chan" - ;; - list) echo $chan $sig $astbanktype;; - zapata) - # zap2amp will rewrite those from zaptel.conf and hints there - if [ "$fxsdisable" = 'yes' ] && [ $sig = 'fxo' ]; then return; fi - - echo "signalling=${sig}_$method" - if [ "$sig" = 'fxo' ] - then - # to preconfigure channel 1's extension to 550, set - # chan_1_exten=550 - # in, e.g, /etc/default/zaptel - var_name=`echo chan_${chan}_exten` - cfg_exten=`echo ${!var_name} | tr -d -c 0-9` - var_name=`echo chan_${chan}_vmbox` - cfg_vmbox=`echo ${!var_name} | tr -d -c 0-9` - var_name=`echo chan_${chan}_cntxt` - cfg_cntxt=`echo ${!var_name} | tr -d -c 0-9` - - # if option -E was given, get configuration from current extension - if [ "$rapid_conf_mode" = 'yes' ] - then - rap_exten=`echo $rapid_extens |awk "{print \\$$rapid_cur_exten}"` - if [ "$rap_exten" != '' ] - then - rap_cfgfile="$exten_base_dir/$rap_exten.conf" - if [ -r "$rap_exten" ] - then - cfg_exten=$rap_exten - # the vmbox is the third parameter to stdexten - rap_vmbox=`grep '^[^;].*Macro(stdexten' $rap_exten | cut -d, -f3 \ - | cut -d')' -f1 | tr -d -c '0-9@a-zA-Z'` - if [ "$rap_vmbox" ]!= '' ; then cfg_vmbox=$rap_vmbox; fi - fi - fi - rapid_cur_exten=$(($rapid_cur_exten + 1)) - fi - - if [ "$cfg_exten" = '' ] - then # No extension number set for this channel - exten=$(($chan+$base_exten)) - else # use the pre-configured extension number - exten=$cfg_exten - fi - # is there any real need to set 'mailbox=' ? - if [ "x$cfg_vmbox" = x ] - then # No extension number set for this channel - vmbox=$exten - else # use the pre-configured extension number - vmbox=$cfg_vmbox - fi - echo "callerid=\"Channel $chan\" <$exten>" - echo "mailbox=$exten" - if [ "$group_manual" != "yes" ] - then - echo "group=$group_phones" - fi - if [ "$context_manual" != "yes" ] - then - if [ "$astbank_type" != '' ]; - then - context_var_name=context_$astbank_type - echo context=${!context_var_name} - else - echo "context=$context_phones" - fi - fi - else # this is an FXO (trunk/phone: FXO signalling) - # we have may have set it. So reset it: - echo "callerid=\"\" <0>" - echo "mailbox=" - if [ "$group_manual" != "yes" ] - then - echo "group=$group_lines" - fi - if [ "$context_manual" != "yes" ] - then - echo "context=$context_lines" - fi - if [ "$lc_country" = 'uk' ] - then - echo "cidsignalling=v23" - case $line in - *WCFXO*) echo "cidstart=history";; - *) echo "cidstart=polarity";; #a TDM400 - esac - fi - echo ";;; line=\"$line\"" - # if kewlstart is not used, busydetect has to be employed: - if [ "$method" = 'ls' ] - then echo 'busydetect=yes' - else echo 'busydetect=no' - fi - fi - - if [ "$set_immediate" = 'yes' ] - then - if [ "$astbank_type" = 'input' ] - then echo 'immediate=yes' - else echo 'immediate=no' - fi - fi - echo "channel => $chan" - echo "" - - # Keep a note of what channels we have identified - say "DEBUG: adding to channels list: channel: $chan, sig: $sig" - case "$sig" in - fxs) - echo $chan >$tmp_dir/fxo_$chan - say "DEBUG: FXO list now contains: `cat $tmp_dir/fxo_* |xargs`" - ;; - fxo) - echo $chan >$tmp_dir/fxs_$chan - say "DEBUG: FXS list now contains: `cat $tmp_dir/fxs_* |xargs`" - ;; - esac - ;; - esac - -} - -# the number of channels from /proc/zaptel -# must always print a number as its output. -count_proc_zap_lines() { - # if zaptel is not loaded there are 0 channels: - if [ ! -d /proc/zaptel ]; then echo '0'; return; fi - - ( - for file in `echo /proc/zaptel/* |grep -v '\*'` - do sed -e 1,2d $file # remove the two header lines - done - ) | wc -l # the total number of lines -} - -load_modules() { - say "Test Loading modules:" - for i in zaptel $ALL_MODULES - do - if [ "$i" = ztdummy ]; then - continue # No hardware to detect - fi - lines_before=`count_proc_zap_lines` - args="${i}_args" - eval "args=\$$args" - # a module is worth listing if it: - # a. loaded successfully, and - # b. added channels lines under /proc/zaptel/* - if /sbin/modprobe $i $args 2> /dev/null && \ - [ $lines_before -lt `count_proc_zap_lines` ] - then - probed_modules="$probed_modules $i" - say " ok $i $args" - else - say " - $i $args" - fi - done -} - -# recursively unload a module and its dependencies, if possible. -# where's modprobe -r when you need it? -# inputs: module to unload. -# returns: the result from -unload_module() { - module="$1" - line=`lsmod 2>/dev/null | grep "^$1 "` - if [ "$line" = '' ]; then return; fi # module was not loaded - - set -- $line - # $1: the original module, $2: size, $3: refcount, $4: deps list - mods=`echo $4 | tr , ' '` - # old versions of xpd_fxs actually depend on xpp, but forget to tell it. - # bug has already been fixed but the code will remain here for a while - # just in case - case "$module" in xpd_*) mods="xpp_usb $mods";; esac - for mod in $mods; do - # run in a subshell, so it won't step over our vars: - (unload_module $mod) - # TODO: the following is probably the error handling we want: - # if [ $? != 0 ]; then return 1; fi - done - rmmod $module -} - -unload_modules() { - if - pids="$(pgrep asterisk)" - [ "$pids" != '' ] - then - die "Before unloading -- STOP asterisk (pids=$pids)." - fi - say "Unloading zaptel modules:" - unload_module zaptel - say '' -} - -# sleep a while until the xpp modules fully register -wait_for_xpp() { - if [ -d /proc/xpp ] && \ - [ "`cat /sys/module/xpp/parameters/zap_autoreg`" = 'Y' ] - then - # wait for the XPDs to register: - for i in `seq 10`; do - sleep 1 - if ! grep -q 0 /proc/xpp/*/*/zt_registration 2>/dev/null - then - # There are either no XPDs or all of them are - # registered. Nothing to do - break - fi - done - fi -} - -detect() { - unload_modules - load_modules - modlist="$probed_modules" - #for i in $ALL_MODULES - #do - # if lsmod | grep "^$i *" > /dev/null; then - # modlist="$modlist $i" - # fi - #done - modlist="$(echo $modlist)" # clean spaces - if [ "$do_module_list" = yes ] - then - say "Updating '${MODLIST_FILE}'" - update_module_list "$modlist" - fi - if echo $modlist | grep -q xpp_usb; then wait_for_xpp; fi -} - -# TODO: kill this function. It is now unreferenced from anywhere. -check_tdm_sigtype() { - chan_num=$1 - sig_type=$2 - mode=$3 - - case "$sig_type" in - fxs)chan_sig_type=fxo;; - fxo)chan_sig_type=fxs;; - esac - -# print_pattern $chan_num $chan_sig_type $mode - - # if you get syntax error from this line, make sure you use 'bash' - # rather than 'sh' - $ztcfg_cmd -c <(print_pattern $chan_num $chan_sig_type zaptel) 2>/dev/null \ - || return 1 - if head -c1 /dev/zap/$chan_num >/dev/null 2>/dev/null - then - print_pattern $chan_num $chan_sig_type $mode - return 0 - else - return 1 - fi -} - -# output a list of extensions that need a channel -get_rapid_extens() { - if [ "$rapid_conf_mode" = 'yes' ] - then - rapid_extens=`grep -l '^[^;].*Zap/\${CHAN_ZAP_' $exten_base_dir/*.conf 2>/dev/null | \ - rev | cut -d/ -f1 | cut -d. -f2- | rev | xargs` - say "Need to configure extensions: $rapid_extens" - fi -} - -genconf() { - local mode=$1 - - # reset FXO list (global) - #say "DEBUG: resetting channels lists" - rm -f $tmp_dir/fx{s,o}_* - - if [ "$mode" = 'zapata' ] - then - rem_char=';' - else - rem_char='#' - fi - - spanlist=`echo /proc/zaptel/* | grep -v '\*'` - - #if [ "$spanlist" == "" ]; then - # die "No zapata interfaces in /proc/zaptel" - #fi - - - case "$mode" in - zaptel) - cat <$tmp_dir/span_begin - echo '-1' >$tmp_dir/span_end - echo '1' >$tmp_dir/span_timing - echo '1' >$tmp_dir/span_lbo - echo '' >$tmp_dir/span_framing - echo 'ami' >$tmp_dir/span_coding - echo '' >$tmp_dir/span_switchtype - echo '' >$tmp_dir/span_signalling - - if echo $title | egrep -q '((quad|octo)BRI PCI ISDN Card.* \[NT\]\ |octoBRI \[NT\] |HFC-S PCI A ISDN.* \[NT\] )' - then - echo 'nt' >$tmp_dir/span_termtype - else - if echo $title | egrep -q '((quad|octo)BRI PCI ISDN Card.* \[TE\]\ |octoBRI \[TE\] |HFC-S PCI A ISDN.* \[TE\] )' - then - echo 'te' >$tmp_dir/span_termtype - fi - fi - # The rest of the lines are per-channel lines - sed -e 1,2d $procfile | \ - while read line - do - # in case this is a real channel. - chan_num=`echo $line |awk '{print $1}'` - case "$line" in - *WCTDM/*) - # this can be either FXS or FXO - maybe_fxs=0 - maybe_fxo=0 - $ztcfg_cmd -c <(print_pattern $chan_num fxo zaptel) &>/dev/null && maybe_fxs=1 - $ztcfg_cmd -c <(print_pattern $chan_num fxs zaptel) &>/dev/null && maybe_fxo=1 - if [ $maybe_fxs = 1 ] && [ $maybe_fxo = 1 ] - then - # An installed module won't accept both FXS and FXO signalling types: - # this is an empty slot. - echo "$rem_char channel $chan_num, WCTDM, no module." - continue - fi - - if [ $maybe_fxs = 1 ]; then print_pattern $chan_num fxo $mode; fi - if [ $maybe_fxo = 1 ]; then print_pattern $chan_num fxs $mode; fi - ;; - *WCFXO/*) - print_pattern $chan_num fxs $mode || \ - echo "$rem_char channel $chan_num, WCFXO, inactive." - ;; - *XPP_FXO/*) - print_pattern $chan_num fxs $mode - ;; - *XPP_FXS/*) - print_pattern $chan_num fxo $mode - ;; - *XPP_OUT/*) - print_pattern -a output $chan_num fxo $mode - ;; - *XPP_IN/*) - print_pattern -a input $chan_num fxo $mode - ;; - *ZTHFC*/*|*ztqoz*/*|*ztgsm/*|*WCT1/*) # should also be used for other PRI channels - if [ "`cat $tmp_dir/span_begin`" = "-1" ] - then - echo $chan_num >$tmp_dir/span_begin - echo $span_num >$tmp_dir/span_num - case "$line" in - *ZTHFC*/*|*ztqoz*/*) - echo 'ccs' >$tmp_dir/span_framing - echo 'euroisdn' >$tmp_dir/span_switchtype - if [ "`cat $tmp_dir/span_termtype`" = 'nt' 2>/dev/null ] - then - echo 'bri_net' >$tmp_dir/span_signalling - else - echo 'bri_cpe' >$tmp_dir/span_signalling - fi - ;; - *ztgsm*/*) - echo 'ccs' >$tmp_dir/span_framing - # what switch type? Any meaning to it? - echo 'gsm' >$tmp_dir/span_signalling - ;; - *WCT1/*) - echo 'esf' >$tmp_dir/span_framing - echo 'b8zs' >$tmp_dir/span_coding - echo 'national' >$tmp_dir/span_switchtype - echo 'pri_cpe' >$tmp_dir/span_signalling - # an example of country-specific setup. This is probably not accurate - # Contributions are welcome - case "$lc_country" in - nl) - # (Just an example for per-country info) - echo 'ami' >$tmp_dir/span_framing - echo 'ccs' >$tmp_dir/span_coding - #echo 'crc4' >$tmp_dir/span_yellow - #echo 'euroisdn' >$tmp_dir/span_switchtype - #echo 'pri_cpe' >$tmp_dir/span_signalling - ;; - il) - echo 'hdb3' >$tmp_dir/span_framing - echo 'ccs' >$tmp_dir/span_coding - echo 'crc4' >$tmp_dir/span_yellow - echo 'euroisdn' >$tmp_dir/span_switchtype - esac - ;; - esac - fi - # span_lastd is always the one before last - # channel. span_bchan is the last: - echo $chan_num >$tmp_dir/span_end - ;; - '') ;; # Empty line (after span header) - *) echo "$rem_char ??: $line";; - esac - done - if [ "`cat $tmp_dir/span_begin`" != -1 ] - then # write PRI span ocnfig: - # read files to variables: - for suffix in num begin end timing lbo framing \ - coding switchtype signalling yellow termtype - do - eval span_$suffix=`cat $tmp_dir/span_$suffix 2>/dev/null` - done - if [ "$span_yellow" != '' ]; then span_yellow=",$span_yellow"; fi - # exactly the same logic is used in asterisk's chan_zap.c. - # also not that $(( )) is bash-specific - case "$((1+ $span_end - $span_begin))" in - 2|3|24) #ztgsm, BRI or T1 - dchan=$span_end - bchans="$span_begin-$(($span_end-1))" - ;; - 31) #E1 - dchan="$(($span_begin+15))" - bchans="$span_begin-$(($span_begin+14)),$(($span_begin+16))-$span_end" - ;; - esac - case "$mode" in - zaptel) - echo span=$span_num,$span_timing,$span_lbo,$span_framing,$span_coding$span_yellow - if [ "$span_termtype" != '' ] - then echo "# termtype: $span_termtype" - fi - echo bchan=$bchans - echo dchan=$dchan - ;; - zapata) - if [ "$span_termtype" != '' ] - then - # an ISDN card's span that we know if it is in NT mode or TE mode. - # NT is the same as FXS for us and TE is the same as FXO - if [ "$span_termtype" = 'nt' ] - then - #echo "callerid=\"Channel $chan\" <$exten>" - #echo "mailbox=$exten" - if [ "$group_manual" != "yes" ] - then - echo "group=$group_phones" - fi - if [ "$context_manual" != "yes" ] - then - echo "context=$context_phones" - fi - else # we have may have set it. So reset it: - #echo "callerid=\"\" <0>" - #echo "mailbox=" - if [ "$group_manual" != "yes" ] - then - echo "group=$group_lines" - fi - if [ "$context_manual" != "yes" ] - then - echo "context=$context_lines" - fi - fi - fi - echo "switchtype = $span_switchtype" - echo "signalling = $span_signalling" - echo "channel => $bchans" - ;; - list) - echo BRI/PRI: chans: $bchans, control: $dchan - ;; - esac - fi - done - - if [ "$mode" = 'zaptel' ] - then - cat <&2 "unknown parameter -$arg, Aborting"; usage; exit 1;; - esac -done -shift $(( $OPTIND-1 )) -if [ $# != 0 ]; then - echo >&2 "$0: too many parameters" - usage - exit 1 -fi - -tmp_dir=`mktemp -d -t` || \ - die "$0: failed to create temporary directory. Aborting" - - -case "$lc_country" in - # the list was generated from the source of zaptel: - #grep '{.*[0-9]\+,.*"[a-z][a-z]"' zonedata.c | cut -d'"' -f 2 | xargs |tr ' ' '|' - us|au|fr|nl|uk|fi|es|jp|no|at|nz|it|gr|tw|cl|se|be|sg|il|br|hu|lt|pl|za|pt|ee|mx|in|de|ch|dk|cz|cn):;; - *) - lc_country=us - echo >&2 "unknown country-code $lc_country, defaulting to \"us\"" - ;; -esac -# any reason for loadzone and defaultzone to be different? If so, this is -# the place to make that difference -loadzone=$lc_country -defaultzone=$loadzone - -# make sure asterisk is not in our way -if [ "$force_stop_ast" = 'yes' ] -then - /etc/init.d/asterisk stop 1>&2 -else - # if asterisk is running and we wanted to detect modules - # or simply to unload modules, asterisk needs to go away. - if ( [ "$do_unload" = yes ] || [ "$do_detect" = yes ] ) && \ - pidof asterisk >/dev/null - then - echo >&2 "Asterisk is already running. Configuration left untouched" - echo >&2 "You can use the option -s to shut down Asterisk for the" - echo >&2 "duration of the detection." - exit 1 - fi -fi - -if [ "$do_unload" = yes ] -then - unload_modules - exit -fi - -if [ "$do_detect" = yes ] -then - detect -fi - -if [ "$mode" = list ]; then - genconf list -else - check_for_astribank - get_rapid_extens - say "Generating '${ZAPCONF_FILE}'" - mv "${ZAPCONF_FILE}" "${ZAPCONF_FILE}.bak" - genconf zaptel > "${ZAPCONF_FILE}" - say "Generating '${ZAPATA_FILE}'" - mv "${ZAPATA_FILE}" "${ZAPATA_FILE}.bak" - genconf zapata > "${ZAPATA_FILE}" - if [ "$set_immediate" = 'yes' ] && [ -x /etc/init.d/zaptel ] - then /etc/init.d/zaptel start - else run_ztcfg - fi -fi - -if [ "$tmp_dir" != '' ] -then - rm -rf "$tmp_dir" -fi - -if [ "$force_stop_ast" = 'yes' ] -then - if [ -x /etc/init.d/asterisk ] - then - /etc/init.d/asterisk start 1>&2 - fi -fi - -# if in verbose mode: verify that asterisk is running -if [ "$verbose" != 'no' ] && [ "$force_stop_ast" = 'yes' ] - then - say "Checking channels configured in Asterisk:" - sleep 1 # give it some time. This is enough on our simple test server - if [ -x ast-cmd ] - then - ast-cmd cmd "zap show channels" - else - asterisk -rx "zap show channels" - fi -fi - -# vim:ts=2: diff --git a/xpp/genzaptelconf.8 b/xpp/genzaptelconf.8 deleted file mode 100644 index 0ec62a2..0000000 --- a/xpp/genzaptelconf.8 +++ /dev/null @@ -1,258 +0,0 @@ -.TH GENZAPTELCONF 8 "July 18th, 2005" "Xorcom Rapid Asterisk" "Linux Programmer's Manual" -.SH "NAME" -.B genzaptelconf --- generates zaptel configuration (TDM adaptors) -.SH SYNOPSIS -.PP -.B genzaptelconf -[-sdv] [-c ] [-r |-e ] [ -F ] - -.B genzaptelconf -[-sdv] -l -- only list to standard output - -.B genzaptelconf --su -- only unload zaptel modules - -.B genzaptelconf --h -- Help screen - -.SH DESCRIPTION -.B genzaptelconf -is a script to detect zaptel devices (currently mostly TDM cards are -supported). It generates both -.I /etc/zaptel.conf -and -.I /etc/asterisk/zapata-channels.conf - -.I PRI -and -.I BRI -(HFC, with ZapBRI) cards are basically identified as well. However the span -configiration is a default that I only hope is sane. Looking for feedback - -.SH OPTIONS -.B -c -.I country_code -.RS -A two-letter country code. Sets the country-code for the zonezone -entries in -.I zaptel.conf -, The default is the value of -.I lc_country -from -.I /etc/default/zaptel -and failing that, "us". -.RE - -.B -d -.RS -Also try to detect modules. Unloads all zaptel modules and loads them -one by one. Considers a module useful if it loaded successfully and if -loading it has generated at least one zapata channel. - -The list of detected modules is written as the value of -.I ZAPTEL_MODS -in -.I /etc/default/zaptel -.RE - -.B -e -.I base_exten_num -.RS -Configure channel -.I i -as extension -.I exten_num -+ -.I i -. This is mostly for the caller-id values. Crude, but may be good enough. -See also -.I -r -.RE - -.B -F -.RS -Disable writing FXS extensions in zapata.conf -.RE - -.B -l -.RS -Only list deceted channels and their signalling. Don't write -configuration files. Note, however that -.I -ld -will still rewrite the modules line in -.I /etc/default/zaptel -(see -.I -d -above). -.RE - -.B -M -.RS -Update -.I /etc/modules -with a list of our modules, thereby -triggers their loading via modprobe on the next boot. - -This triggers the -.I -d -option as well. -.RE - -.B -r -.RS -Try to guess a useful -.I zapata-channels -configuration for Xorcom Rapid . -.RE - -.B -s -.RS -Stop asterisk for the duration of the test. The detection will only -work if nobody uses the zaptel channels: - -* To allow unloading of modules - -* to allow reading configuration files. - -By default the script will check if asterisk is running and alert if so. -This option tells the script to stop asterisk (if it was running) and to -try to start it after the end of the test. -.RE - -.B -v -.RS -Be verbose. lists the detected modules if -.I -d -is used. Lists detected channls. In the end tries to connect to asterisk -to get a list of configured zaptel channels. -.RE -.SH FILES -.I /etc/zaptel.conf -.RS -The configuration file used by -.I ztcfg -to configure zaptel devices. re-written by -.I genzaptelconf -.RE - -.I /etc/zaptel.conf.bak -.RS -When -.I zaptel.conf -The original zaptel.conf -.RE - -.I /etc/asterisk/zapata.conf -.RS -The configuration file of Asterisk's -.I chan_zap. -Not modified directly by -.I genzaptelconf. -If you want genzaptelconf's setting to take effect, add the following -line at the end of -.I zapata.conf: -.RS -#include "zapata-channels.conf" -.RE -.RE - -.I /etc/asterisk/zapata-channels.conf -.RS -This is the snippet of -.I chan_zap -configuration file that -.I genzaptelconf generates. -.RE - -.I /etc/asterisk/zapata-channels.conf.bak -.RS -The backup copy of -.I zapata-channels.conf -.RE - -.I /etc/default/zaptel -.RS -This file holds configuration for both -.I genzaptelconf -and -.I /etc/init.d/zaptel . -It is sourced by both scripts and can thus be used to override settings -of variables from those scripts. -Some of the variables that can be set in /etc/default/zaptel and affect -genzaptelconf: - -.I lc_country -.RS -The default country. Can be also overriden by the option -c -.RE - -.I base_exten -.RS -The base number used for automatic numbering -.RE - -.I context_manual -.RS -If set to 'yes', no context changes are made in zapata-channels.conf -.RE - -.I context_lines -.RS -The context into which calls will go from zaptel trunks. -.RE - -.I context_phones -.RS -The context into which calls will go from zaptel phones. -.RE - -.I context_manual -.RS -If set to 'yes', no group settings are made in zapata-channels.conf -.RE - -.I group_lines -.RS -The group number for zaptel trunks. -.RE - -.I group_phones -.RS -The group number for zaptel phones. -.RE - -.I ALL_MODULES -.RS -modules list. Used for unloading and modules detection. The order of modules -is the same for both. -.RE -.RE - -.I /etc/modules -.RS -A debian-specific list of kernel modules to be loaded by modprobe at -boot time. When the option -.I -d -(detect) is used, genzaptelconf will write in this file zaptel modules -to be loaded. If you want to use a different file, set -.I MOD_FILELIST -.RE - -.I /etc/modules.bak -.RS -The backup copy of -.I /etc/modules -.RE - -.SH "SEE ALSO" -ztcfg(8) asterisk(8). - -.SH "AUTHOR" -This manual page was written by Tzafrir Cohen -Permission is granted to copy, distribute and/or modify this document under -the terms of the GNU General Public License, Version 2 any -later version published by the Free Software Foundation. - -On Debian systems, the complete text of the GNU General Public -License can be found in /usr/share/common-licenses/GPL. diff --git a/xpp/utils/genzaptelconf b/xpp/utils/genzaptelconf new file mode 100755 index 0000000..7bcc20e --- /dev/null +++ b/xpp/utils/genzaptelconf @@ -0,0 +1,929 @@ +#! /bin/bash + +# genzaptelconf: generate as smartly as you can: +# /etc/zaptel.conf +# /etc/asterisk/zapata-channels.conf (to be #include-d into zapata.conf) +# update: +# With '-M' /etc/modules (list of modules to load) +# +# Copyright (C) 2005 by Xorcom +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# If you have any technical questions, contact +# Tzafrir Cohen +# + +# The script uses a number of bash-specific features +# TODO: either ditch them or convert to perl +# Don't override variables here. Override them in /etc/default/zaptel +# +# 0.5.1: +# * Initial support for ztgsm (Junghanns's PCI GSM card) +# * Wait for the xpp module to register if just loaded +# 0.5.0: +# * Not trying to read from zaptel channels: we can run genzaptelconf even +# with asterisk up. +# * Don't add ztdummy to the list of detected modules +# 0.4.4: +# * remove ztdummy when rewriting modules file +# * Better ISDN PRI behaviour in Israel (il) +# 0.4.3: +# * Added -F: to disable writing about FXS ports in zapata.conf +# * if we have an astribank: start zaptel rather than simple ztcfg (xpd sync) +# 0.4.2: +# * support for digital input/output ports of Astribank +# * Different ISDN parameters for the Netherlands (nl) +# * unload zaptel and its dependencies, not a hard-coded list +# * hence we can reduce the list of modules + +# /etc/default/zaptel may override the following variables +VERSION=0.5.1 +VERSION_FULL="$VERSION $Id$" +lc_country=us +base_exten=6000 +# If set: no context changes are made in zapata-channels.conf +#context_manual=yes +context_lines=from-pstn # context into which PSTN calls go +context_phones=from-internal # context for internal phones calls. +# The two below apply to input and output ports of the Xorcom Astribank: +context_input=astbank-input +context_output=astbank-output # useless, but helps marking the channels :-) +# TODO: what about PRI/BRI? +# If set: no group changes are made in zapata-channels.conf +#group_manual=yes +group_phones=5 # group for phones +group_lines=0 # group for lines +# set 'immediate=yes' for Asteribank input channels and 'immediate=no' +# for others. Note that if an Astribank is not detected, the script +# will set this to "no", so you can safely leave it as "yes". +set_immediate=yes + +ZAPCONF_FILE=/etc/zaptel.conf +ZAPATA_FILE=/etc/asterisk/zapata-channels.conf +ZAPTEL_BOOT=/etc/default/zaptel +MODLIST_FILE=/etc/modules +exten_base_dir=/etc/asterisk/extensions-phones.d +exten_defs_file=/etc/asterisk/extensions-defs.conf +ZTCFG=/sbin/ztcfg + +# a temporary directory. Created when the switch -r is parsed on getopts +# and deleted in the end on update_extensions_defs +tmp_dir= + +# A list of all modules: +# - the list of modules which will be probed (in this order) if -d is used +# - The module that will be deleted from /etc/modules , if -d -M is used +ALL_MODULES="zaphfc qozap ztgsm wctdm wctdm24xxp wcfxo wcfxs pciradio tor2 torisa wct1xxp wct4xxp wcte11xp wcusb xpp_usb" + +# read default configuration from /etc/default/zaptel +if [ -r $ZAPTEL_BOOT ]; then . $ZAPTEL_BOOT; fi + +# it is safe to use -c twice: the last one will be used. +ztcfg_cmd="$ZTCFG -c $ZAPCONF_FILE" + +# work around a bug (that was already fixed) in the installer: +if [ "$lc_country" = '' ]; then lc_country=us; fi + +force_stop_ast=no +do_detect=no +do_unload=no +do_module_list=no +verbose=no +fxsdisable=no +rapid_extens='' +# global: current extension number in extensions list. Should only be +# changed in print_pattern: +rapid_cur_exten=1 +# set the TRUNK in extensidialplan dialplan defs file rapid_conf_mode=no + +die() { + echo "$@" >&2 + exit 1 +} + +say() { + if [ "$verbose" = no ]; then + return + fi + echo "$@" >&2 +} + +run_ztcfg() { + if [ "$verbose" = no ]; then + $ztcfg_cmd "$@" + else + say "Reconfiguring identified channels" + $ztcfg_cmd -vv "$@" + fi +} + +update_module_list() { + del_args=`for i in $ALL_MODULES ztdummy + do + echo "$i" | sed s:.\*:-e\ '/^&/d': + done` + add_args=`for i in $* + do + echo "$i" | sed s:.\*:-e\ '\$a&': + done` + + sed -i.bak $del_args "$MODLIST_FILE" + for i in $* + do + echo "$i" + done >> "$MODLIST_FILE" +} + +do_update() { + if [ ! -d `dirname ${ZAPTEL_BOOT}` ] + then + return + fi + sed -i.bak "s/^$1=.*\$/$1=\"$2\"/" ${ZAPTEL_BOOT} + if ! grep -q "^$1=" ${ZAPTEL_BOOT}; then + echo "$1=\"$2\"" >> ${ZAPTEL_BOOT} + fi +} + +update_extensions_defs() { + if [ "$rapid_conf_mode" = 'yes' ] + then + say "DEBUG: Updating dialplan defs file $exten_defs_file" + if [ "`echo $tmp_dir/fxo_* | grep -v '*'`" != '' ] + then + trunk_nums=`cat $tmp_dir/fxo_* | sort -n | xargs` + say "Configuring TRUNK to be [first of] zaptel channels: $trunk_nums" + trunk_dev=`echo $trunk_nums| sed -e 's/ /\\\\\\&/g' -e 's/[0-9a-zA-Z]\+/Zap\\\\\\/&/g'` + echo >&2 sed -i "s/^TRUNK.*=>.*/TRUNK => $trunk_dev/" $exten_defs_file + sed -i "s/^TRUNK.*=>.*/TRUNK => $trunk_dev/" $exten_defs_file + if ! grep -q "^TRUNK =>" $exten_defs_file; then + trunk_dev=`echo $trunk_nums| sed -e 's/ /&/g' -e 's/[0-9a-zA-Z]*/Zap\\/&/g'` + echo "TRUNK => $trunk_dev" >> $exten_defs_file + fi + else + say "Warning: No FXO channel for trunk. Moving on." + fi + if [ "`echo $tmp_dir/fxs_* | grep -v '*'`" != '' ] + then + fxs_nums=`cat $tmp_dir/fxs_* | sort -n | xargs` + zap_nums=`grep '^[^;].*Zap/\${CHAN_ZAP_' $exten_base_dir/*.conf | \ + sed -e 's/.*Zap\/\${CHAN_ZAP_\([0-9]*\)}.*/\1/' | sort -u | xargs` + say "Configuring channels: $fxs_nums as channel placeholders: $zap_nums" + j=1 + for i in $zap_nums + do + chan=`echo $fxs_nums | awk "{print \\$$i}"` + if [ "$chan" = '' ] + then + # if the result is empty, we probably got past the last one. + # bail out. + say "Warning: No FXS channel for CHAN_ZAP_$i. Moving on" + break + fi + say "DEBUG: setting channel $chan to placeholder $i" + if grep -q "^CHAN_ZAP_$i " $exten_defs_file + then + sed -i -e "s/^CHAN_ZAP_$i .*/CHAN_ZAP_$i => Zap\/$chan/" $exten_defs_file + else + echo "CHAN_ZAP_$i => Zap/$chan" >> $exten_defs_file + fi + done + fi + # cleaning up the temp dir + fi + if [ -d "$tmp_dir" ]; then rm -rf "$tmp_dir"; fi +} + +check_for_astribank(){ + if ! grep -q XPP_IN/ /proc/zaptel/* 2>/dev/null + then + # we only get here is if we find no Astribank input channels + # in /proc/zaptel . Hence we can safely disable their special settings: + set_immediate=no + fi +} + +usage() { + program=`basename $0` + + echo >&2 "$program: generate zaptel.conf and zapata.conf" + echo >&2 "(version $VERSION_FULL)" + echo >&2 "usage:" + echo >&2 " $program [-sdv] [-m k|l|g] [-c ] [-r |-e ] " + echo >&2 " $program [-sdv] -l" + echo >&2 " $program -su" + echo >&2 " $program -h (this screen)" + echo >&2 "" + echo >&2 "Options:" + echo >&2 " -c CODE: set the country code (default: $lc_country)" + echo >&2 " -e NUM: set the base extension number (default: $base_exten)" + echo >&2 " -F: Don't print FXSs in zapata.conf" + echo >&2 " -l: output a list of detected channels instead of zaptel.conf" + echo >&2 " -d: Perform hardware detection" + echo >&2 " -u: Unload zaptel modules" + echo >&2 " -v: verbose" + echo >&2 " -s: Don't fail if asterisk is running. Stop it" + echo >&2 " -r: rapid configuration mode: configure Zaptel FXS channels from " + echo >&2 " existing Rapid extension files. FXOs will all be TRUNK " +} + +# $1: channel number +print_pattern() { + local astbank_type='' + OPTIND=1 + while getopts 'a:' arg + do + case "$arg" in + a) case "$OPTARG" in input|output) astbank_type=$OPTARG;;esac ;; + esac + done + shift $(( $OPTIND-1 )) + + + local chan=$1 + local sig=$2 #fxs/fxo + local mode=$3 + local method='ks' + if [ "$lc_country" = il ] && [ "$sig" = 'fxs' ] + then method=ls + fi + case "$mode" in + zaptel) + # sadly, both input ports and output ports go into the same span as + # the FXS ports. Thus we need to separate between them. See also + # the zapata.conf section: + if [ "$astbank_type" != '' ]; then echo "# astbanktype: $astbank_type"; fi + echo "${sig}$method=$chan" + ;; + list) echo $chan $sig $astbanktype;; + zapata) + # zap2amp will rewrite those from zaptel.conf and hints there + if [ "$fxsdisable" = 'yes' ] && [ $sig = 'fxo' ]; then return; fi + + echo "signalling=${sig}_$method" + if [ "$sig" = 'fxo' ] + then + # to preconfigure channel 1's extension to 550, set + # chan_1_exten=550 + # in, e.g, /etc/default/zaptel + var_name=`echo chan_${chan}_exten` + cfg_exten=`echo ${!var_name} | tr -d -c 0-9` + var_name=`echo chan_${chan}_vmbox` + cfg_vmbox=`echo ${!var_name} | tr -d -c 0-9` + var_name=`echo chan_${chan}_cntxt` + cfg_cntxt=`echo ${!var_name} | tr -d -c 0-9` + + # if option -E was given, get configuration from current extension + if [ "$rapid_conf_mode" = 'yes' ] + then + rap_exten=`echo $rapid_extens |awk "{print \\$$rapid_cur_exten}"` + if [ "$rap_exten" != '' ] + then + rap_cfgfile="$exten_base_dir/$rap_exten.conf" + if [ -r "$rap_exten" ] + then + cfg_exten=$rap_exten + # the vmbox is the third parameter to stdexten + rap_vmbox=`grep '^[^;].*Macro(stdexten' $rap_exten | cut -d, -f3 \ + | cut -d')' -f1 | tr -d -c '0-9@a-zA-Z'` + if [ "$rap_vmbox" ]!= '' ; then cfg_vmbox=$rap_vmbox; fi + fi + fi + rapid_cur_exten=$(($rapid_cur_exten + 1)) + fi + + if [ "$cfg_exten" = '' ] + then # No extension number set for this channel + exten=$(($chan+$base_exten)) + else # use the pre-configured extension number + exten=$cfg_exten + fi + # is there any real need to set 'mailbox=' ? + if [ "x$cfg_vmbox" = x ] + then # No extension number set for this channel + vmbox=$exten + else # use the pre-configured extension number + vmbox=$cfg_vmbox + fi + echo "callerid=\"Channel $chan\" <$exten>" + echo "mailbox=$exten" + if [ "$group_manual" != "yes" ] + then + echo "group=$group_phones" + fi + if [ "$context_manual" != "yes" ] + then + if [ "$astbank_type" != '' ]; + then + context_var_name=context_$astbank_type + echo context=${!context_var_name} + else + echo "context=$context_phones" + fi + fi + else # this is an FXO (trunk/phone: FXO signalling) + # we have may have set it. So reset it: + echo "callerid=\"\" <0>" + echo "mailbox=" + if [ "$group_manual" != "yes" ] + then + echo "group=$group_lines" + fi + if [ "$context_manual" != "yes" ] + then + echo "context=$context_lines" + fi + if [ "$lc_country" = 'uk' ] + then + echo "cidsignalling=v23" + case $line in + *WCFXO*) echo "cidstart=history";; + *) echo "cidstart=polarity";; #a TDM400 + esac + fi + echo ";;; line=\"$line\"" + # if kewlstart is not used, busydetect has to be employed: + if [ "$method" = 'ls' ] + then echo 'busydetect=yes' + else echo 'busydetect=no' + fi + fi + + if [ "$set_immediate" = 'yes' ] + then + if [ "$astbank_type" = 'input' ] + then echo 'immediate=yes' + else echo 'immediate=no' + fi + fi + echo "channel => $chan" + echo "" + + # Keep a note of what channels we have identified + say "DEBUG: adding to channels list: channel: $chan, sig: $sig" + case "$sig" in + fxs) + echo $chan >$tmp_dir/fxo_$chan + say "DEBUG: FXO list now contains: `cat $tmp_dir/fxo_* |xargs`" + ;; + fxo) + echo $chan >$tmp_dir/fxs_$chan + say "DEBUG: FXS list now contains: `cat $tmp_dir/fxs_* |xargs`" + ;; + esac + ;; + esac + +} + +# the number of channels from /proc/zaptel +# must always print a number as its output. +count_proc_zap_lines() { + # if zaptel is not loaded there are 0 channels: + if [ ! -d /proc/zaptel ]; then echo '0'; return; fi + + ( + for file in `echo /proc/zaptel/* |grep -v '\*'` + do sed -e 1,2d $file # remove the two header lines + done + ) | wc -l # the total number of lines +} + +load_modules() { + say "Test Loading modules:" + for i in zaptel $ALL_MODULES + do + if [ "$i" = ztdummy ]; then + continue # No hardware to detect + fi + lines_before=`count_proc_zap_lines` + args="${i}_args" + eval "args=\$$args" + # a module is worth listing if it: + # a. loaded successfully, and + # b. added channels lines under /proc/zaptel/* + if /sbin/modprobe $i $args 2> /dev/null && \ + [ $lines_before -lt `count_proc_zap_lines` ] + then + probed_modules="$probed_modules $i" + say " ok $i $args" + else + say " - $i $args" + fi + done +} + +# recursively unload a module and its dependencies, if possible. +# where's modprobe -r when you need it? +# inputs: module to unload. +# returns: the result from +unload_module() { + module="$1" + line=`lsmod 2>/dev/null | grep "^$1 "` + if [ "$line" = '' ]; then return; fi # module was not loaded + + set -- $line + # $1: the original module, $2: size, $3: refcount, $4: deps list + mods=`echo $4 | tr , ' '` + # old versions of xpd_fxs actually depend on xpp, but forget to tell it. + # bug has already been fixed but the code will remain here for a while + # just in case + case "$module" in xpd_*) mods="xpp_usb $mods";; esac + for mod in $mods; do + # run in a subshell, so it won't step over our vars: + (unload_module $mod) + # TODO: the following is probably the error handling we want: + # if [ $? != 0 ]; then return 1; fi + done + rmmod $module +} + +unload_modules() { + if + pids="$(pgrep asterisk)" + [ "$pids" != '' ] + then + die "Before unloading -- STOP asterisk (pids=$pids)." + fi + say "Unloading zaptel modules:" + unload_module zaptel + say '' +} + +# sleep a while until the xpp modules fully register +wait_for_xpp() { + if [ -d /proc/xpp ] && \ + [ "`cat /sys/module/xpp/parameters/zap_autoreg`" = 'Y' ] + then + # wait for the XPDs to register: + for i in `seq 10`; do + sleep 1 + if ! grep -q 0 /proc/xpp/*/*/zt_registration 2>/dev/null + then + # There are either no XPDs or all of them are + # registered. Nothing to do + break + fi + done + fi +} + +detect() { + unload_modules + load_modules + modlist="$probed_modules" + #for i in $ALL_MODULES + #do + # if lsmod | grep "^$i *" > /dev/null; then + # modlist="$modlist $i" + # fi + #done + modlist="$(echo $modlist)" # clean spaces + if [ "$do_module_list" = yes ] + then + say "Updating '${MODLIST_FILE}'" + update_module_list "$modlist" + fi + if echo $modlist | grep -q xpp_usb; then wait_for_xpp; fi +} + +# TODO: kill this function. It is now unreferenced from anywhere. +check_tdm_sigtype() { + chan_num=$1 + sig_type=$2 + mode=$3 + + case "$sig_type" in + fxs)chan_sig_type=fxo;; + fxo)chan_sig_type=fxs;; + esac + +# print_pattern $chan_num $chan_sig_type $mode + + # if you get syntax error from this line, make sure you use 'bash' + # rather than 'sh' + $ztcfg_cmd -c <(print_pattern $chan_num $chan_sig_type zaptel) 2>/dev/null \ + || return 1 + if head -c1 /dev/zap/$chan_num >/dev/null 2>/dev/null + then + print_pattern $chan_num $chan_sig_type $mode + return 0 + else + return 1 + fi +} + +# output a list of extensions that need a channel +get_rapid_extens() { + if [ "$rapid_conf_mode" = 'yes' ] + then + rapid_extens=`grep -l '^[^;].*Zap/\${CHAN_ZAP_' $exten_base_dir/*.conf 2>/dev/null | \ + rev | cut -d/ -f1 | cut -d. -f2- | rev | xargs` + say "Need to configure extensions: $rapid_extens" + fi +} + +genconf() { + local mode=$1 + + # reset FXO list (global) + #say "DEBUG: resetting channels lists" + rm -f $tmp_dir/fx{s,o}_* + + if [ "$mode" = 'zapata' ] + then + rem_char=';' + else + rem_char='#' + fi + + spanlist=`echo /proc/zaptel/* | grep -v '\*'` + + #if [ "$spanlist" == "" ]; then + # die "No zapata interfaces in /proc/zaptel" + #fi + + + case "$mode" in + zaptel) + cat <$tmp_dir/span_begin + echo '-1' >$tmp_dir/span_end + echo '1' >$tmp_dir/span_timing + echo '1' >$tmp_dir/span_lbo + echo '' >$tmp_dir/span_framing + echo 'ami' >$tmp_dir/span_coding + echo '' >$tmp_dir/span_switchtype + echo '' >$tmp_dir/span_signalling + + if echo $title | egrep -q '((quad|octo)BRI PCI ISDN Card.* \[NT\]\ |octoBRI \[NT\] |HFC-S PCI A ISDN.* \[NT\] )' + then + echo 'nt' >$tmp_dir/span_termtype + else + if echo $title | egrep -q '((quad|octo)BRI PCI ISDN Card.* \[TE\]\ |octoBRI \[TE\] |HFC-S PCI A ISDN.* \[TE\] )' + then + echo 'te' >$tmp_dir/span_termtype + fi + fi + # The rest of the lines are per-channel lines + sed -e 1,2d $procfile | \ + while read line + do + # in case this is a real channel. + chan_num=`echo $line |awk '{print $1}'` + case "$line" in + *WCTDM/*) + # this can be either FXS or FXO + maybe_fxs=0 + maybe_fxo=0 + $ztcfg_cmd -c <(print_pattern $chan_num fxo zaptel) &>/dev/null && maybe_fxs=1 + $ztcfg_cmd -c <(print_pattern $chan_num fxs zaptel) &>/dev/null && maybe_fxo=1 + if [ $maybe_fxs = 1 ] && [ $maybe_fxo = 1 ] + then + # An installed module won't accept both FXS and FXO signalling types: + # this is an empty slot. + echo "$rem_char channel $chan_num, WCTDM, no module." + continue + fi + + if [ $maybe_fxs = 1 ]; then print_pattern $chan_num fxo $mode; fi + if [ $maybe_fxo = 1 ]; then print_pattern $chan_num fxs $mode; fi + ;; + *WCFXO/*) + print_pattern $chan_num fxs $mode || \ + echo "$rem_char channel $chan_num, WCFXO, inactive." + ;; + *XPP_FXO/*) + print_pattern $chan_num fxs $mode + ;; + *XPP_FXS/*) + print_pattern $chan_num fxo $mode + ;; + *XPP_OUT/*) + print_pattern -a output $chan_num fxo $mode + ;; + *XPP_IN/*) + print_pattern -a input $chan_num fxo $mode + ;; + *ZTHFC*/*|*ztqoz*/*|*ztgsm/*|*WCT1/*) # should also be used for other PRI channels + if [ "`cat $tmp_dir/span_begin`" = "-1" ] + then + echo $chan_num >$tmp_dir/span_begin + echo $span_num >$tmp_dir/span_num + case "$line" in + *ZTHFC*/*|*ztqoz*/*) + echo 'ccs' >$tmp_dir/span_framing + echo 'euroisdn' >$tmp_dir/span_switchtype + if [ "`cat $tmp_dir/span_termtype`" = 'nt' 2>/dev/null ] + then + echo 'bri_net' >$tmp_dir/span_signalling + else + echo 'bri_cpe' >$tmp_dir/span_signalling + fi + ;; + *ztgsm*/*) + echo 'ccs' >$tmp_dir/span_framing + # what switch type? Any meaning to it? + echo 'gsm' >$tmp_dir/span_signalling + ;; + *WCT1/*) + echo 'esf' >$tmp_dir/span_framing + echo 'b8zs' >$tmp_dir/span_coding + echo 'national' >$tmp_dir/span_switchtype + echo 'pri_cpe' >$tmp_dir/span_signalling + # an example of country-specific setup. This is probably not accurate + # Contributions are welcome + case "$lc_country" in + nl) + # (Just an example for per-country info) + echo 'ami' >$tmp_dir/span_framing + echo 'ccs' >$tmp_dir/span_coding + #echo 'crc4' >$tmp_dir/span_yellow + #echo 'euroisdn' >$tmp_dir/span_switchtype + #echo 'pri_cpe' >$tmp_dir/span_signalling + ;; + il) + echo 'hdb3' >$tmp_dir/span_framing + echo 'ccs' >$tmp_dir/span_coding + echo 'crc4' >$tmp_dir/span_yellow + echo 'euroisdn' >$tmp_dir/span_switchtype + esac + ;; + esac + fi + # span_lastd is always the one before last + # channel. span_bchan is the last: + echo $chan_num >$tmp_dir/span_end + ;; + '') ;; # Empty line (after span header) + *) echo "$rem_char ??: $line";; + esac + done + if [ "`cat $tmp_dir/span_begin`" != -1 ] + then # write PRI span ocnfig: + # read files to variables: + for suffix in num begin end timing lbo framing \ + coding switchtype signalling yellow termtype + do + eval span_$suffix=`cat $tmp_dir/span_$suffix 2>/dev/null` + done + if [ "$span_yellow" != '' ]; then span_yellow=",$span_yellow"; fi + # exactly the same logic is used in asterisk's chan_zap.c. + # also not that $(( )) is bash-specific + case "$((1+ $span_end - $span_begin))" in + 2|3|24) #ztgsm, BRI or T1 + dchan=$span_end + bchans="$span_begin-$(($span_end-1))" + ;; + 31) #E1 + dchan="$(($span_begin+15))" + bchans="$span_begin-$(($span_begin+14)),$(($span_begin+16))-$span_end" + ;; + esac + case "$mode" in + zaptel) + echo span=$span_num,$span_timing,$span_lbo,$span_framing,$span_coding$span_yellow + if [ "$span_termtype" != '' ] + then echo "# termtype: $span_termtype" + fi + echo bchan=$bchans + echo dchan=$dchan + ;; + zapata) + if [ "$span_termtype" != '' ] + then + # an ISDN card's span that we know if it is in NT mode or TE mode. + # NT is the same as FXS for us and TE is the same as FXO + if [ "$span_termtype" = 'nt' ] + then + #echo "callerid=\"Channel $chan\" <$exten>" + #echo "mailbox=$exten" + if [ "$group_manual" != "yes" ] + then + echo "group=$group_phones" + fi + if [ "$context_manual" != "yes" ] + then + echo "context=$context_phones" + fi + else # we have may have set it. So reset it: + #echo "callerid=\"\" <0>" + #echo "mailbox=" + if [ "$group_manual" != "yes" ] + then + echo "group=$group_lines" + fi + if [ "$context_manual" != "yes" ] + then + echo "context=$context_lines" + fi + fi + fi + echo "switchtype = $span_switchtype" + echo "signalling = $span_signalling" + echo "channel => $bchans" + ;; + list) + echo BRI/PRI: chans: $bchans, control: $dchan + ;; + esac + fi + done + + if [ "$mode" = 'zaptel' ] + then + cat <&2 "unknown parameter -$arg, Aborting"; usage; exit 1;; + esac +done +shift $(( $OPTIND-1 )) +if [ $# != 0 ]; then + echo >&2 "$0: too many parameters" + usage + exit 1 +fi + +tmp_dir=`mktemp -d -t` || \ + die "$0: failed to create temporary directory. Aborting" + + +case "$lc_country" in + # the list was generated from the source of zaptel: + #grep '{.*[0-9]\+,.*"[a-z][a-z]"' zonedata.c | cut -d'"' -f 2 | xargs |tr ' ' '|' + us|au|fr|nl|uk|fi|es|jp|no|at|nz|it|gr|tw|cl|se|be|sg|il|br|hu|lt|pl|za|pt|ee|mx|in|de|ch|dk|cz|cn):;; + *) + lc_country=us + echo >&2 "unknown country-code $lc_country, defaulting to \"us\"" + ;; +esac +# any reason for loadzone and defaultzone to be different? If so, this is +# the place to make that difference +loadzone=$lc_country +defaultzone=$loadzone + +# make sure asterisk is not in our way +if [ "$force_stop_ast" = 'yes' ] +then + /etc/init.d/asterisk stop 1>&2 +else + # if asterisk is running and we wanted to detect modules + # or simply to unload modules, asterisk needs to go away. + if ( [ "$do_unload" = yes ] || [ "$do_detect" = yes ] ) && \ + pidof asterisk >/dev/null + then + echo >&2 "Asterisk is already running. Configuration left untouched" + echo >&2 "You can use the option -s to shut down Asterisk for the" + echo >&2 "duration of the detection." + exit 1 + fi +fi + +if [ "$do_unload" = yes ] +then + unload_modules + exit +fi + +if [ "$do_detect" = yes ] +then + detect +fi + +if [ "$mode" = list ]; then + genconf list +else + check_for_astribank + get_rapid_extens + say "Generating '${ZAPCONF_FILE}'" + mv "${ZAPCONF_FILE}" "${ZAPCONF_FILE}.bak" + genconf zaptel > "${ZAPCONF_FILE}" + say "Generating '${ZAPATA_FILE}'" + mv "${ZAPATA_FILE}" "${ZAPATA_FILE}.bak" + genconf zapata > "${ZAPATA_FILE}" + if [ "$set_immediate" = 'yes' ] && [ -x /etc/init.d/zaptel ] + then /etc/init.d/zaptel start + else run_ztcfg + fi +fi + +if [ "$tmp_dir" != '' ] +then + rm -rf "$tmp_dir" +fi + +if [ "$force_stop_ast" = 'yes' ] +then + if [ -x /etc/init.d/asterisk ] + then + /etc/init.d/asterisk start 1>&2 + fi +fi + +# if in verbose mode: verify that asterisk is running +if [ "$verbose" != 'no' ] && [ "$force_stop_ast" = 'yes' ] + then + say "Checking channels configured in Asterisk:" + sleep 1 # give it some time. This is enough on our simple test server + if [ -x ast-cmd ] + then + ast-cmd cmd "zap show channels" + else + asterisk -rx "zap show channels" + fi +fi + +# vim:ts=2: diff --git a/xpp/utils/genzaptelconf.8 b/xpp/utils/genzaptelconf.8 new file mode 100644 index 0000000..0ec62a2 --- /dev/null +++ b/xpp/utils/genzaptelconf.8 @@ -0,0 +1,258 @@ +.TH GENZAPTELCONF 8 "July 18th, 2005" "Xorcom Rapid Asterisk" "Linux Programmer's Manual" +.SH "NAME" +.B genzaptelconf +-- generates zaptel configuration (TDM adaptors) +.SH SYNOPSIS +.PP +.B genzaptelconf +[-sdv] [-c ] [-r |-e ] [ -F ] + +.B genzaptelconf +[-sdv] -l -- only list to standard output + +.B genzaptelconf +-su -- only unload zaptel modules + +.B genzaptelconf +-h -- Help screen + +.SH DESCRIPTION +.B genzaptelconf +is a script to detect zaptel devices (currently mostly TDM cards are +supported). It generates both +.I /etc/zaptel.conf +and +.I /etc/asterisk/zapata-channels.conf + +.I PRI +and +.I BRI +(HFC, with ZapBRI) cards are basically identified as well. However the span +configiration is a default that I only hope is sane. Looking for feedback + +.SH OPTIONS +.B -c +.I country_code +.RS +A two-letter country code. Sets the country-code for the zonezone +entries in +.I zaptel.conf +, The default is the value of +.I lc_country +from +.I /etc/default/zaptel +and failing that, "us". +.RE + +.B -d +.RS +Also try to detect modules. Unloads all zaptel modules and loads them +one by one. Considers a module useful if it loaded successfully and if +loading it has generated at least one zapata channel. + +The list of detected modules is written as the value of +.I ZAPTEL_MODS +in +.I /etc/default/zaptel +.RE + +.B -e +.I base_exten_num +.RS +Configure channel +.I i +as extension +.I exten_num ++ +.I i +. This is mostly for the caller-id values. Crude, but may be good enough. +See also +.I -r +.RE + +.B -F +.RS +Disable writing FXS extensions in zapata.conf +.RE + +.B -l +.RS +Only list deceted channels and their signalling. Don't write +configuration files. Note, however that +.I -ld +will still rewrite the modules line in +.I /etc/default/zaptel +(see +.I -d +above). +.RE + +.B -M +.RS +Update +.I /etc/modules +with a list of our modules, thereby +triggers their loading via modprobe on the next boot. + +This triggers the +.I -d +option as well. +.RE + +.B -r +.RS +Try to guess a useful +.I zapata-channels +configuration for Xorcom Rapid . +.RE + +.B -s +.RS +Stop asterisk for the duration of the test. The detection will only +work if nobody uses the zaptel channels: + +* To allow unloading of modules + +* to allow reading configuration files. + +By default the script will check if asterisk is running and alert if so. +This option tells the script to stop asterisk (if it was running) and to +try to start it after the end of the test. +.RE + +.B -v +.RS +Be verbose. lists the detected modules if +.I -d +is used. Lists detected channls. In the end tries to connect to asterisk +to get a list of configured zaptel channels. +.RE +.SH FILES +.I /etc/zaptel.conf +.RS +The configuration file used by +.I ztcfg +to configure zaptel devices. re-written by +.I genzaptelconf +.RE + +.I /etc/zaptel.conf.bak +.RS +When +.I zaptel.conf +The original zaptel.conf +.RE + +.I /etc/asterisk/zapata.conf +.RS +The configuration file of Asterisk's +.I chan_zap. +Not modified directly by +.I genzaptelconf. +If you want genzaptelconf's setting to take effect, add the following +line at the end of +.I zapata.conf: +.RS +#include "zapata-channels.conf" +.RE +.RE + +.I /etc/asterisk/zapata-channels.conf +.RS +This is the snippet of +.I chan_zap +configuration file that +.I genzaptelconf generates. +.RE + +.I /etc/asterisk/zapata-channels.conf.bak +.RS +The backup copy of +.I zapata-channels.conf +.RE + +.I /etc/default/zaptel +.RS +This file holds configuration for both +.I genzaptelconf +and +.I /etc/init.d/zaptel . +It is sourced by both scripts and can thus be used to override settings +of variables from those scripts. +Some of the variables that can be set in /etc/default/zaptel and affect +genzaptelconf: + +.I lc_country +.RS +The default country. Can be also overriden by the option -c +.RE + +.I base_exten +.RS +The base number used for automatic numbering +.RE + +.I context_manual +.RS +If set to 'yes', no context changes are made in zapata-channels.conf +.RE + +.I context_lines +.RS +The context into which calls will go from zaptel trunks. +.RE + +.I context_phones +.RS +The context into which calls will go from zaptel phones. +.RE + +.I context_manual +.RS +If set to 'yes', no group settings are made in zapata-channels.conf +.RE + +.I group_lines +.RS +The group number for zaptel trunks. +.RE + +.I group_phones +.RS +The group number for zaptel phones. +.RE + +.I ALL_MODULES +.RS +modules list. Used for unloading and modules detection. The order of modules +is the same for both. +.RE +.RE + +.I /etc/modules +.RS +A debian-specific list of kernel modules to be loaded by modprobe at +boot time. When the option +.I -d +(detect) is used, genzaptelconf will write in this file zaptel modules +to be loaded. If you want to use a different file, set +.I MOD_FILELIST +.RE + +.I /etc/modules.bak +.RS +The backup copy of +.I /etc/modules +.RE + +.SH "SEE ALSO" +ztcfg(8) asterisk(8). + +.SH "AUTHOR" +This manual page was written by Tzafrir Cohen +Permission is granted to copy, distribute and/or modify this document under +the terms of the GNU General Public License, Version 2 any +later version published by the Free Software Foundation. + +On Debian systems, the complete text of the GNU General Public +License can be found in /usr/share/common-licenses/GPL. -- cgit v1.2.3