Asterisk PBX 有一套自定义的配置文件格式,通过一个内置的配置文件解析器(Parser)进行配置文件的读写操作。从 Asterisk 1.2 版本以后,配置文件的格式有了一些改进,增加了配置模板(template configuration)的支持。配置模板(template configuration)极大的提高了配置的灵活性和可扩展性。
配置文件的改进是在通用配置解析器层次实现的,因此,本文件介绍的这 种特性适用于 Asterisk PBX 各个配块的配置文件。本文将简要介绍 Asterisk PBX配置文件的格式。
基本语法
Asterisk 配置文件的基本格式类似下面的样子:
[section] label1 = value1 label2 = value2
在某些文件中(如: mgcp.conf, zapata.conf 和 agents.conf),格式略有一些差别。这些文件中,配置文件类似如下的样子:
[section] label1 = value1 label2 = value2 object1 => name1 label3 = value3 label4 = value4 object2 => name2
这 个配置文件可以说是配置模板的原型,简单的说,上面的配置生成了两个配置 对像,第一个object1包含了从label1到label2的配置属性(不包括 label3/label4);第二个object2包含了从label1到label4的配置属性。这样配置显然比重复的写两段配置看上去要优秀一些, 但不难看出,如果需要配置更多有不同属性的配置对像,这种配置方法还是显得比较困难了。
基于模板的新配置文件则可以更好的支持这种需求。 配置模板相当于C++中的一个基本类,你可用该基类来创建一个对像,也可以继承这个类,增加基类属性/方法和重载基类的属性/方法等。简单的说,如果你需 要配置十个SIP用户,这些用户大部份均是 friend 类型,非固定IP接入,使用GSM divc,那么,你可以把这些属性定义为一个模板,当实际配置一个用户时,引用这个模板,就不需要再重复定义上面这些属性了。
模板化的配 置文件在原来的配置文件格式上略有改变,一个模板化配置文件类似如下的样子:
[section](options) label = value …
很明显,新的配置文件在原来的 section 的行增加了一个 options 选项参数,这个选项用于定义模板,引用模板或隐藏模板。所有已定义的对像都可以被看作一个模板来引用。
注意:在节名称中括号”]”与配置 的小括号”(“间不能有空格。
注释行
在Asterisk PBX的配置文件中,以分号”;”开始的行都被当作注释行来处理。新的配置文件引入了多行注释的支持,多行注释由分号和两个减号 “;–”开始,以两个减号加分号”–;”结束。除了支持多行注释处,这种注释还支持行内注释,即,在同一行中,位于 “;–”和”–;”以外的内容不会被当成注释,而是当成正常的配置内容来对待。了解C语言的用户更容易理解这种注释,因为它与C++中”//”注释 和”/* */”注释的功能和差别是一样的。配置文件中的注释行类似如下的样子:
; 这是Asterisk 配置文件单行注释,这一整行都是,直到回车,下一行是配置内容 label = value ;– 这是一个 Asterisk PBX 配置的多行注释,回车, 嗯,就像这样,也没有关系,没有遇到结束标志,Asterisk config parser会一 直把所有内容都 当成是注释,直到它的出现 –; ;– 也可以这样把注释和配置混到一起 –; extern => 119,1,Dial(Zap/1)
包含其它配置文件
Asterisk PBX 所有配置文件都可以通过 #include来包含其它配置文件的内容,被包含文件的内容将被加入到当前配置文件中include所在位置,例如:
#include sip.conf
改 进后的配置文件解析器还允许把一个可执行文件的输出内容包含到当前配置文件中。这可以说是一个非常有用的改进,因为这 使得用户可以根据当前系统状况作出一些处理后,再生成相应的配置段,例如,你可以从一个XML文件来生成当前的 sip 用户配置,也可以从数据读取用户信息以生成配置文件。允许这个新的特性需要在 asterisk.conf中设置 execincludes 属性:
[options] execincludes=yes
当 设置了允许 execincludes 后,可以用类似下面的方法来添加一个 exec 包含:
#exec /usr/local/bin/generate-sip-config.sh
向已经定义的节添加内容
[section] label = value [section](+) label2 = value2
在 这个例子里,加号表示同名的第二个 配置节点的内容是对第一个节点的补充。后一个配置节点可以存在于另一个文件中(通过#include包含)。需要注意的是,包含加号的这个配置项不是一个 独立的项目,也就是说,它的存在必需依赖于前面已定义的同名节点,如果那个节点不存在,那么Asterisk PBX的配置解析器在解析带”+”节点时就会发生错误而中止。
定义一个模板节点
[section](!) label = value
在这个 例子中,节点后面加上了一个叹号,表示这是一个模板节点,模板节点本身并不代表一个实质生效的配置,模板只能被其它节点引用,作为其它节点的一部份来使 用。引用关系(下面要介绍)类似于C++的继承,而模板则类似于C++中的虚类。
引用配置模板或另一个配置
[section](name[,name1]) label = value
在 这个示例中,括号里面的名称 name, name1…是一个配置模板或另一个配置节点的名称。这种配置方式表示,将括号中节点的名称加入到当前配置节点配置项的前面。也就是说,这个配置节点 中的配置项目会包括name, name1的内容,然后再是这个节点下面的配置项。这有点像C++或其它面向对象程序语言中对象的继承,而且与之相类似,这个节点本身还可以被其它节点引 用(继承)。例如下面的配置:
[foo] permit=192.168.0.2 host=asdf deny=192.168.0.1 [bar] permit=192.168.1.2 host=jkl deny=192.168.1.1 [baz](foo,bar) permit=192.168.3.1 host=bnm
在 这个例子里面,节点 baz引用了节点foo和节点bar,因此被解析成如下的样子:
[baz] permit=192.168.0.2 host=asdf deny=192.168.0.1 permit=192.168.1.2 host=jkl deny=192.168.1.1 permit=192.168.3.1 host=bnm
示例
下面我们给出一个Asterisk PBX中SIP配置示例,并简单说明其作用。在 sip.conf 中的定义如下:
[defaults](!) type=friend nat=yes qualify=on dtmfmode=rfc2833 disallow=all allow=alaw #include accounts/*/sip.conf
在这个配置文件中,定义了一个模板 default,然后通过 #include 引用了account目录下所有子目录中的sip.conf。其中一个子目录 account/redice/sip.conf 的内容如下:
[redice_tmpl](!,defaults) secret=this_is_not_secret context=from-redice-grp callerid=RediceGrp <300> accountcode=0001 [redice](redice_tmpl) [email protected] [redice1](redice_tmpl) [email protected]
这 个配置文件 sip.conf 中定义了两个SIP电话,redice和redice1,其配置都来自于模板 redice_tmpl,唯一不同是的使用了不相同的语音邮箱。而模板 redice_tmpl 则是包含另一个模板defaults(定义于主目录中的 sip.conf 中)的模板。
从这个示例不难看出,新的Asterisk PBX 配置能力大大增强了,配置可以写得更加简单和灵活,而通过第三方软件来对 Asterisk PBX 进行配置也会变得更加容易。
Asterisk配置文件语法