summaryrefslogtreecommitdiff
path: root/xpp/utils/genzaptelconf
diff options
context:
space:
mode:
authortzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-06-17 12:00:29 +0000
committertzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-06-17 12:00:29 +0000
commitb5755da0d40e72fad44756bc009fcf688c3380cc (patch)
tree1073a67c87fd3d3ca40c7bebd174d46a10c520a7 /xpp/utils/genzaptelconf
parentc364b65eed9ab9232e9306052450f8fc19ae4a74 (diff)
moving genzaptelconf to utils
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@1113 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'xpp/utils/genzaptelconf')
-rwxr-xr-xxpp/utils/genzaptelconf929
1 files changed, 929 insertions, 0 deletions
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 <support@xorcom.com>
+#
+# 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 <tzafrir.cohen@xorcom.com>
+#
+
+# 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 <country_code>] [-r |-e <base_exten>] "
+ 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 <<EOF
+# Autogenerated by $0 -- do not hand edit
+# Zaptel Configuration File
+#
+# This file is parsed by the Zaptel Configurator, ztcfg
+#
+
+# It must be in the module loading order
+
+EOF
+ ;;
+ zapata)
+ cat <<EOF
+; Autogenerated by $0 -- do not hand edit
+; Zaptel Channels Configurations (zapata.conf)
+;
+; This is not intended to be a complete zapata.conf. Rather, it is intended
+; to be #include-d by /etc/zapata.conf that will include the global settings
+;
+EOF
+ ;;
+ esac
+
+ # For each line in the spanlist: see if it represents a channel.
+ # if it does, test that the channel is usable.
+ # we do that by configuring it (using ztcfg with a 1-line config file)
+ # and then trying to read 1 byte from the device file.
+ #
+ # The '<(command)' syntax creates a temporary file whose content is is the
+ # output of 'command'.
+ #
+ # This approach failed with the T1 card we have: the read operation simply
+ # hung.
+ #
+ # Another problem with such an approach is how to include an existing
+ # configuration file. For instance: how to include some default settings.
+ #
+ # Maybe an 'include' directive should be added to zaptel.conf ?
+ #cat $spanlist |
+ for procfile in $spanlist
+ do
+ span_num=`basename $procfile`
+ # the first line is the title line. It states the model name
+ # the second line is empty
+ title=`head -n 1 $procfile`
+ echo ""
+ # stuff that needs to be remembered accross lines (for PRI support)
+ echo "$rem_char $title"
+ echo '-1' >$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 <<EOF
+
+# Global data
+
+EOF
+ echo "loadzone = $loadzone"
+ echo "defaultzone = $defaultzone"
+ fi
+
+ if [ "$mode" = 'zapata' ] || [ "$mode" = 'list' ]
+ then
+ update_extensions_defs
+ fi
+}
+
+while getopts 'c:de:Fhlm:Mrsuv' arg
+do
+ case "$arg" in
+ e) # guarantee that it is a number:
+ new_base_exten=`echo $OPTARG | tr -d -c 0-9`
+ if [ "x$new_base_exten" != x ]; then base_exten=$new_base_exten; fi
+ ;;
+ c) lc_country=`echo $OPTARG | tr -d -c a-z` ;;
+ d) do_detect=yes ;;
+ F) fxsdisable=yes;;
+ u) do_unload=yes ;;
+ v) verbose=yes ;;
+ l) mode='list' ;;
+ M) do_module_list=yes; do_detect=yes ;;
+ s) force_stop_ast=yes ;;
+ r)
+ rapid_conf_mode=yes
+ ;;
+ h) usage; exit 0;;
+ *) echo >&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: