用shell生成直观的Elastix DialPlan方便调试asterisk故障

http://bbs.voip88.com/thread-23844-1-1.html 看到的帖子


     最近在学习ElastixDialPlan,还有经常去客户那里解决电话呼入呼出故障,不可避免的要打开asteriskCLI,查看呼叫的时候asterisk的控制台输出,以便排错。有时候客户用的都是基于ElastixfreePBX生成的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打包文件在本帖附件中。


你可能感兴趣的:(算法,shell,function,File,Parameters,include)