http://bbs.voip88.com/thread-23844-1-1.html 看到的帖子
最近在学习Elastix的DialPlan,还有经常去客户那里解决电话呼入呼出故障,不可避免的要打开asterisk的CLI,查看呼叫的时候asterisk的控制台输出,以便排错。有时候客户用的都是基于Elastix的freePBX生成的DialPlan,实在是过于复杂,甚至涉及到AGI方面的调试,那种上级Context 通过”Include =>”包含下级Context的语句实在是让人找的蛋疼,而Asterisk控制台输出的调试信息又都是这样的格式:[分机@父上下文:优先级,而不是我们所需要的:[分机@子上下文:优先级,所以有时候找哪个分机在哪个地方出现就很头痛,具体表现如下:
-- Executing [10086@from-internal:4] Macro("SIP/807-09d434e0", "dialout-trunk|3|10086||") in new stack
-- Executing [s@macro-dialout-trunk:1] Set("SIP/807-09d434e0", "DIAL_TRUNK=3") in new stack
-- Executing [s@macro-dialout-trunk:2] GosubIf("SIP/807-09d434e0", "0?sub-pincheck|s|1") in new stack
-- Executing [s@macro-dialout-trunk:3] GotoIf("SIP/807-09d434e0", "0?disabletrunk|1") in new stack
-- Executing [s@macro-dialout-trunk:4] Set("SIP/807-09d434e0", "DIAL_NUMBER=10086") in new stack
大家常用的asterisk -rx'dialplan show' 把拨号计划重定向到文件,文件里面组织方式改进一下可能就好多了。有时候坐地铁去客户那里的时候也在想这个问题,今天也是上午去客户那里回来,想到这个事情,花了一个下午的时间调试成功这个shell脚本,下面把我自己的方法和大家分享一下,写的不好,但是可以自己看明白,将就着用就行了,O(∩_∩)O哈哈~。
源代码如下:
cat /tmp/dp2.sh
#!/bin/bash
#函数------->将/tmp/dp.txt中的各个context分解成小文件
function explode_context(){
while [ $# -gt 1 ];do
sed -e "0,/Context '$1'/d" -e "/Context '$2'/,\$d" dp.txt >son_context/$1.txt #结尾符号要转义——"\d"
shift
done
sed "0,/Context '$1'/d" dp.txt >son_context/$1.txt
}
#########算法第1部分:分解context文件dp.txt
cd /tmp
#------->通过asterisk,显示拨号计划
asterisk -rx'dialplan show' >dp.txt
#------->提取要将dp.txt文件分解成小文件的context片段,然后在作为参数传递给explode_context()函数
Parameters=$(grep Context dp.txt |cut -d"'" -f2)
rm -rf son_context
mkdir son_context
#函数调用------->
explode_context $Parameters
#########算法第2部分:不断地循环整理,直到每个小的context文件的"Include =>" 子句都被替换为止
#------->函数:把有Include的一行内容替换成一个文件中的内容
function replace_Include(){
f=$1
while grep "Include =>" $f >/dev/null
do
lines=$(wc -l $f|cut -d" " -f1) #文件行数
i=1
while [ $i -le $lines ]
do
if sed -n "${i}p" $f|grep "Include =>" >/dev/null;then
ff=$(sed -n "${i}p" $f|grep "Include =>"|cut -d"'" -f2) #找到Include子句包含的Context名字
[ -f $ff.txt ]&& cat $ff.txt
else
sed -n "${i}p" $f
fi
i=$[i+1]
done >$f.tmp
mv $f.tmp $f #覆盖掉以前有Include的文件,覆盖后可能还有Include,所以要继续循环
done
}
cd son_context
for file in *
do
replace_Include $file #函数调用
done
#########算法第3部分:经过上面的整理,所有的小context,的Include子句都被相关内容替换了,现在合并所有的子context
for file in *
do
echo "================>$file"
cat $file #函数调用
done >/tmp/dp2.txt
其中的 /tmp/dp2.txt就是我们看起来比较直观一点的DialPlan了。
下面附上我的源程序和执行结果
(图片贴不过来,唉~)
说明:Asterisk必须运行起来,shell源代码在dp2.sh中,shell程序执行完成后,生成的dp2.txt就是我们要的结果,只需下载出来,在Notepad++中打开查看即可。本程序仅用于个人学习、分析Elastix,希望也能对您学习DialPlan和调试asterisk有所帮助。/tmp打包文件在本帖附件中。