简介
基本的 FreeSWITCH 安装使用 XML 文件来配置核心以及所有模块。您可以想象,配置可能会变得非常大和复杂。默认的配置为新用户提供了一个良好的起点,让他们可以从工作系统开始。如果您只想跳入并开始使用 FreeSWITCH,请参阅配置 FreeSWITCH,快速了解默认配置以及启动切换之前需要进行的更改。但是,如果您想使用 FreeSWITCH 进行任何严肃的项目,我们强烈建议您花时间更深入地了解配置文件的工作原理。在本页中,我们将深入概述配置系统。获得更多经验后,您可能希望完全删除默认配置,然后从头开始使用框架文件。
高级 FreeSWITCH 安装可以通过数据库查找检索一些动态配置,如拨号计划和用户扩展目录。
XML
配置文件以 XML 格式写入。如果您不熟悉 XML,请花时间阅读“XML 基础知识”页。有关执行配置的更高级方法,请参阅下面的“配置模块”部分。该配置名为 freeswitch.xml默认情况下,它位于软件包安装和从源代码编译的安装的位置,尽管您可以指定备用文件路径作为命令行参数。/etc/freeswitch/usr/local/freeswitch/conf
XML 文件分为多个部分,如下面配置文件的基本架构所示。每个部分都有自己的子部分和架构,在以下部分中,我们将探讨每个单独部分的架构。这些文件没有 DTD(文档类型定义)。
配置文件结构
<document type="freeswitch/xml">
<section name="configuration" description="Various Configuration">
<!-- 配置各个模块的配置信息 -->
</section>
<section name="dialplan" description="Regex/XML Dialplan">
<!-- 配置如何路由来电 -->
</section>
<section name="chatplan" description="Regex/XML Chatplan">
<!-- 配置如何路由短消息 -->
</section>
<section name="directory" description="User Directory">
<!-- 配置用户信息 -->
</section>
<section name="languages" description="Language Management">
<!-- 配置不同的系统语音支持 -->
</section>
</document>
Configuration
在配置部分,您可以配置 FreeSWITCH 核心和大多数模块。配置部分内有许多配置元素,通常每个模块一个。大多数配置元素使用以下 XML 架构。
配置示例
<section name="configuration" description="Various Configuration">
<configuration Name="模块名.conf" Description="我的模块参数设置描述">
<settings>
<param name="自定义参数" value="参数的值" />
</settings>
</configuration>
<configuration Name="另一个模块名" Description="我的另一个模块参数设置描述">
<settings>
<param name="自定义参数" value="参数的值" />
</settings>
</configuration>
</section>
除了单个模块的配置元素外,还有 2 个特殊的配置元素用于配置 FreeSWITCH 内核本身。
switch.conf
这是您配置 FreeSWITCH 核心设置的地方。完整的参数列表记录在“XML 交换机配置”页上。
modules.conf
告诉 FreeSWITCH 在启动时要加载哪些模块。您始终可以在以后从命令行加载其他模块。有关详细信息,请参阅模块配置页。当FreeSWITCH启动时,它首先加载switch.conf,然后加载modes.conf。加载每个模块时,FreeSWITCH 将解析并加载该模块使用的配置元素。
Dialplan
拨号计划部分是设置所有呼叫路由规则的位置。有关详细信息,请参阅拨号计划页面。
Chatplan
在这里,您可以为SMS和其他聊天拖曳设置路由规则。有关详细信息,请参阅mod_sms。
Directory
用户目录定义了将注册到FreeSWITCH™的扩展,通常是手机。
Languages
FreeSWITCH语音提示可以用多种人类语言播放。每个语言系列都位于声音目录下。
预处理指令
XML文件是纯文本,没有内置于XML中的编程逻辑功能。虽然它具有易于阅读的优点,但也有一些缺点。
- 对于像FreeSWITCH这样庞大而灵活的系统,配置文件可能会变得庞大。默认freeswitch.xml.fsxml配置总共接近 15000 行。
- 如果要在配置中的许多位置使用特殊值,则必须手动复制它。当您要更改它时,这可能会导致问题。
- 不能运行脚本来动态计算静态 XML 配置的值。
为了解决这些问题,FreeSWITCH 使用自定义预处理器指令。有一个预处理器引擎在系统启动(和 reloadxml)时在原始配置文件上运行,以使用预处理器指令的结果创建新的配置文件。输出的freeswitch.xml.fsxml
文件存储在日志目录中(默认情况下对于软件包是/var/log/freeswitch
, 如果 FreeSWITCH 是从源代码编译的则为/usr/local/freeswitch/log
)。这是FreeSWITCH在启动时实际加载的文件。预处理器在启动时以及重新加载配置文件时运行。如果遇到预处理器指令的问题,查看已处理的文件会很有帮助。
每当FreeSWITCH报告配置文件错误时,错误行号实际上是指巨大的freeswitch.xml.fsxml
文件,因此这是首先要查看的地方。确定哪个单独的配置文件生成了错误后,必须编辑该单个 XML 文件,而不是已编译的freeswitch.xml.fsxml
日志文件。
有 2 种方法可以指定预处理器指令。
- 自定义
X-PRE-PROCESS
XML 标记 - 在 XML 注释中,可以在指令前面加上 #前缀。
预处理示例
<!--Using the X-PRE-PROCESS custom XML tag-->
<X-PRE-PROCESS cmd="set" data="my_variable='value'"/>
<!--Using an XML comment with a #-->
<!--#set my_variable='value'-->
标准 XML 注释对预处理命令没有影响。如果想要注释掉预处理命令,可以将 X-PRE-PROCESS 替换为 X-NO-PRE-PROCESS
<!--This is a standard XML comment, the Pre-Process command WILL be processed--> <!--<X-PRE-PROCESS cmd="set" data="my_global_var='some value'"/>--> <!--This pre-process command will NOT run--> <X-NO-PRE-PROCESS cmd="set" data="my_global_var='some value'"/>
以下是所有可用的预处理指令。 并且是迄今为止最常用的
include
此预处理命令允许我们将配置分解为多个文件。include 指令指定附加文件的路径,预处理器将在出现包含的行处将包含指令替换为指定文件的内容。路径可以是单个文件,也可以是通配符;通过使用通配符,您可以拉入目录中的所有文件。在默认配置中,主配置文件(freeswitch.xml)只是一组包含指令,一个用于vars.xml(稍后会详细介绍),一个用于每个配置部分。这使我们能够为各种系统配置构建干净的目录层次结构。
include示例
<!--这个默认的include用于加载vars.xml文件至主配置文件--> <X-PRE-PROCESS cmd="include" data="vars.xml"/> <!-- 这个默认的include指令用于从autoload_configs文件夹加载所有的模块配置文件,这允许我们为每个模块使用单独的配置文件。--> <section name="configuration" description="Various Configuration"> <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/> </section>
在include文件中,预处理将仅包含包含在include标记中的子 XML,如本示例所示
include标记
<include> <!--这里是要包含的内容--> </include>
set
set 指令允许我们为全局变量名称赋值,然后我们可以使用语法 {variable_name} 语法的所有文本执行静态替换。该文本将替换为预处理器运行时变量的值。由于它是静态替换,因此必须在调用变量之前执行 set 指令。此外,如果在运行时更改全局变量的值,则配置仍将具有旧值。
set 指令对于在配置中调用多次,但预计不会更改的值(如 IP 地址和域)很有用。
通过set和include指令,我们可以创建一个用来设置所有变量的文件。这样我们可以在许多服务器上共享同这一配置文件,并且只需要更改一个文件即可包含特定于服务器的设置。实际上,这就是默认配置的设置方式:include指令加载了一个名为vars.xml的文件,其中设置了IP地址和域等值。使用 Set 指令
<!--使用set指令设置全局变量--> <X-PRE-PROCESS cmd="set" data="domain=example.com"/> <!--使用$${variable_name}语法查询变量的值--> <action application="bridge" data="sofia/$${domain}/1234@example.com"/> <!-- 这就是已预先执行set指令后配置文件中实际显示的xml代码 (freeswitch.xml.fsxml文件中) --> <!-- 请注意,此时对变量的引用已消失 --> <action application="bridge" data="sofia/example.com/1234@example.com"/>
exec
如果您有一些非常复杂的配置规则,则可以使用一个脚本来生成部分配置文件。exec 指令将作为 shell 命令运行,并将输出包含在配置文件中。
exec示例
<X-PRE-PROCESS cmd="exec" data="/path/to/my_script_that_dumps_all_configs_to_stdout.pl"/>
exec-set
这类似于 exec,但它不会将输出包含在配置文件中,而是在输出中设置一个全局变量。
exec-set示例
<!-- Set local_ip_v4 to eth1 address --> <X-PRE-PROCESS cmd="exec-set" data="local_ip_v4=ip addr show eth1 | awk '/inet /{print $2}' | head -n 1 | cut -d '/' -f 1"/>
Comment
如果不希望注释出现在最终的 XML 文件中,则可以使用预处理注释。
<X-PRE-PROCESS cmd="comment" data="预处理器将删除此文本" />
配置模块
我们稍后会看到,除了使用纯 XML 文件之外,还有其他选择,但是您仍然需要一些 XML 来启动 FreeSWITCH 并指示它加载不同的配置提供程序。