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/utils/genzaptelconf | 929 ++++++++++++++++++++++++++++++++++++++++++++++ xpp/utils/genzaptelconf.8 | 258 +++++++++++++ 2 files changed, 1187 insertions(+) create mode 100755 xpp/utils/genzaptelconf create mode 100644 xpp/utils/genzaptelconf.8 (limited to 'xpp/utils') 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