[svn-commits] trunk r1000 - in /trunk/xpp: genzaptelconf genzaptelconf.8

svn-commits at lists.digium.com svn-commits at lists.digium.com
Mon Apr 10 12:50:15 MST 2006


Author: tzafrir
Date: Mon Apr 10 14:50:08 2006
New Revision: 1000

URL: http://svn.digium.com/view/zaptel?rev=1000&view=rev
Log:
adding genzaptelconf: a zaptel hardware detection script

Added:
    trunk/xpp/genzaptelconf   (with props)
    trunk/xpp/genzaptelconf.8   (with props)

Added: trunk/xpp/genzaptelconf
URL: http://svn.digium.com/view/zaptel/trunk/xpp/genzaptelconf?rev=1000&view=auto
==============================================================================
--- trunk/xpp/genzaptelconf (added)
+++ trunk/xpp/genzaptelconf Mon Apr 10 14:50:08 2006
@@ -1,0 +1,900 @@
+#! /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 at 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 at 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.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.0
+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 wctdm wctdm24xxp wcfxo wcfxs pciradio tor2 torisa wct1xxp wct4xxp wcte11xp wcusb ztd_eth 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 at 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 , ' '`
+	# xpd_fxs actually sort of depends on xpp, but forgets 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 ''
+}
+
+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
+}
+
+# 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
+	
+	$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*/*|*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
+						;;
+					*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
+			3|24) #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:

Propchange: trunk/xpp/genzaptelconf
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: trunk/xpp/genzaptelconf
------------------------------------------------------------------------------
    svn:executable = *

Propchange: trunk/xpp/genzaptelconf
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: trunk/xpp/genzaptelconf
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: trunk/xpp/genzaptelconf.8
URL: http://svn.digium.com/view/zaptel/trunk/xpp/genzaptelconf.8?rev=1000&view=auto
==============================================================================
--- trunk/xpp/genzaptelconf.8 (added)
+++ trunk/xpp/genzaptelconf.8 Mon Apr 10 14:50:08 2006
@@ -1,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 <country_code>] [-r |-e <base_exten>] [ -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 <tzafrir.cohen at xorcom.com> 
+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. 

Propchange: trunk/xpp/genzaptelconf.8
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: trunk/xpp/genzaptelconf.8
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: trunk/xpp/genzaptelconf.8
------------------------------------------------------------------------------
    svn:mime-type = text/plain



More information about the svn-commits mailing list