分布式电话测试程序
项目描述
此程序连接到Asterisk服务器并执行电话测试,即导致一个通道呼叫另一个通道并验证通话是否成功。
CallTest实现了一个小的JSON服务器。您可以使用它与您的 favorite 监控系统来检查测试结果,或者从某些网站或通过 curl 手动触发测试。
此软件包仍在开发中。一些计划中的功能尚未实现。此外,此README需要扩展并拆分。欢迎志愿者。
配置
配置是一个YAML文件,基本看起来像这样
links: foo: channel: "SIP/foo/{number}" number: "+49123456789" bar: channel: "SIP/bar/{number}" number: "+49987654321" calls: ':default:': mode: dtmf foobar: src: foo dst: bar info: "Check that calling bar from foo works"
请参阅 example.cfg 以获取工作版本。运行 ./ct -c example.cfg dumpcfg 以获取预先填充默认值的副本。
链接
links 包含CallTest可以使用的Asterisk通道。
这些参数用于在链路上发起呼叫
channel:用于在此通道上拨出的拨号字符串。 {number} 是目标电话号码的占位符。
这些参数用于接听电话
number:当拨打此链接时,要拨打的号码。
使用 prio 值来避免在获取双向测试的链路时出现死锁。如果相同,则使用链路的名称。
‘:default:’值应用于所有其他条目(除非被覆盖),这样可以节省您更改999个相同条目的时间。
调用
调用 包含多个(命名)测试。
src: 要使用的源链接,即发起调用。
dst: 要使用的目的地,即应答调用。
mode: 如何执行测试。请参见下文。
timeout: 调用的持续时间硬限制。如果调用超过此限制,则终止并测试失败。
url: 对于仅应答模式,需要一种方式来发起调用。目前这是通过获取此URL的数据来实现的。
此字段可以是简单的URL,也可以是具有以下属性的字典
url
method (GET POST PUT)
query
body
query 和 body 可以包含一个 {number} 替换。
check_callerid: 设置为 false 以禁用Caller ID验证。
‘:default:’值应用于所有其他条目(除非被覆盖),这样可以节省您更改999个相同条目的时间。
“测试”子标题包含与在后台运行重复测试相关的值
retry, repeat: 重复调用前的延迟秒数,取决于前一个尝试是失败还是成功。
warn: 测试进入“警告”状态时的连续失败次数。
fail: 测试进入“失败”状态时的连续失败次数。
skip: 如果为True,则此测试只能手动触发。
模式
“mode”值配置了CallTest如何处理调用。
dtmf
应答通道发送一系列随机的DTMF音调。发起者随后执行相同操作。接收者验证代码是否正确。
当dtmf.may_repeat被设置时,接收者允许读取重复的DTMF音调。此标志可能在与带内信号一起使用时是必要的。
dtmf.len是要测试的数字数量。通常,一个数字将被重复。序列的其他部分是随机的。
call
应答通道将确认它正在响铃,然后简单地挂断。
audio
与DTMF类似,但双方都发送一个声音文件。这些声音被记录下来。它们应该有一定的相似性,但尚未测试。
ring
仅发起:调用此号码。它应该处于响铃状态。然后挂断。
play
仅发起:调用此号码。它应该应答。播放声音,然后挂断。
如果没有指定audio.src_out声音,则简单地挂断。
可选地,audio.dst_in在通话期间记录传入的音频。录制在播放传出声音的同时进行。
fail
待办事项。
仅发起:调用此号码。通话可能无法接通。它必须在ringtime之前被拒绝。
也待办:添加一个标志以确定是否允许/需要/禁止中间的Ringing状态。
timeout
待办事项。
仅发起:调用此号码。通话可能无法接通。它必须在ringtime和timeout秒后之间被挂断。
wait
仅应答:等待传入的调用,将其设置为响铃,等待几秒钟,然后挂断。
answer
仅应答:等待传入的调用,应答它,可选地播放声音,可选地²在播放声音的同时记录音频,然后挂断。
record
仅应答:等待传入的调用,应答它,可选地播放声音,可选地记录传入的音频,直到发起者挂断或按下#。
录制将在传出声音上叠加。这是Asterisk的限制。
数字格式
CallTest识别两种电话号码:站点本地分机,以及其他所有号码。CallTest通过初始的‘+’来区分这些号码。
出局
出局Asterisk通道应能直接处理这两种号码。如果不能,您需要编写一个“本地”通道来处理拨打的号码。例如,如果您需要删除‘+’,请使用此宏
context mangle { _+! => Dial(SIP/broken/${EXTEN:1}); }
然后调用 Local/{number}@mangle。另一个例子,如果您需要使用本地号码格式进行拨打
context mangle { _X! => Dial(SIP/broken/${EXTEN}); // pass-thru for local extensions _+49123! => Dial(SIP/broken/${EXTEN:6}); // 49123: country+city _+49! => Dial(SIP/broken/0${EXTEN:3}); // 49: country; 0: national prefix // _+! => Dial(SIP/broken/00${EXTEN:1}); // 00: international prefix _+! => Congestion(); }
尽管您可能只需使用前两行。
如果您在美国或加拿大,您可能想使用此宏代替
context mangle { _N! => Dial(SIP/broken/1888${EXTEN}); // 888 is your area code _[01]! => Dial(SIP/broken/${EXTEN}); // pass-thru for operator and long-distance _+1! => Dial(SIP/broken/${EXTEN:1}); // long distance // _+! => Dial(SIP/broken/011${EXTEN:1}); // international _+! => Congestion(); }
最后一行会引发一个“拥塞”拦截器,以防止错误导致国际费用。
入局
CallTest将验证入局电话的号码是否与测试配置的源链接中的号码匹配。如果该号码以‘+’开头,则入局号码将转换为国际格式,并且需要完全匹配。否则,假设配置的号码是本地分机,并且必须仅位于呼叫者号码的末尾。
这确保了没有无效的入局,同时承认站点本地号码往往无法干净传输。
如果您需要Asterisk处理呼叫者的号码,使其对CallTest足够合理,请将其添加到calltest宏中。例如,如果您的电话系统给入局电话添加一个开头的“获取中继线路”零(在NANP中通常是9),您将这样做
macro calltest(typ) { SET(cid=${CALLERID(num)}) switch(cid) { pattern 0.: set(CALLERID(num)=${cid:1}); break; default: break; } Stasis("calltest", ${typ}); Hangup(); return; }
我们知道必须玩Asterisk的拨号计划来处理这个问题很烦人。如果您想向CallTest添加一个基于模式匹配的号码处理方案,我们很高兴接受一个拉取请求。然而,“合理”的现代电话系统应该与默认设置配合得很好。
Asterisk配置
服务器连接
asterisk部分的一些参数需要进一步解释。
app
audio: Asterisk将使用其来查找测试的出局声音文件的“声音”URL的基础。应该是sound:/some/absolute/path。
测试设置
Asterisk需要知道如何将入局电话引导到测试者。这通常是通过一个Stasis宏来完成的。这是用于extensions.ael。
macro calltest(link,nr) { Stasis(calltest,${link},${number}); Hangup(); return; }
calltest: asterisk.app配置参数。
link: 链接的名称,在asterisk.link中。
nr: 入局目的电话号码。
您将从上下文中调用此宏
1234 => &calltest(foo,${EXTEN});
如果您想将一个通道上的所有入局电话路由到这个宏,请使用以下上下文
context ext_bar { s => &calltest(bar,); i => &calltest(bar,${INVALID_EXTEN}); _+! => &calltest(bar,${EXTEN}); _X! => &calltest(bar,${EXTEN}); h => Hangup(); }
警告
These calls all have no spaces after the argument-separating commas. This is important.
线路设置
PJSIP并不宽容。示例配置:待办。
由于该系统尚未进行语音质量检查,您可能想简单地设置端点的DTMF模式为“inband”。在此操作时不要使用压缩编解码器。您可能需要设置测试的dtmf_may_repeat选项。然而,带内DTMF不太可靠,可能会随机中断。
随机的DTMF序列只使用数字,因为字母并非普遍传递,而#和*可能会被解释并被中间系统吞没。
测试
此软件包包含一个example.cfg配置文件。要使用它,您的asterisk.ael文件应包含以下行
macro calltest(link, nr) { Stasis(calltest,${link},${number}); Hangup(); return; } context direct { _.! => &calltest(${EXTEN},); answer => { Wait(1); Answer(); Wait(5); Hangup(); } ringing => { Wait(1); Ringing(); Wait(5); Hangup(); } progress => { Wait(1); Progress(); Wait(5); Hangup(); } }
将此添加到您的ari.conf
[example] type = user password = oh_no_you_do_not password_format = plain
最后,将enabled=yes添加到http.conf的[general]部分。
完成所有这些操作并重新启动Asterisk(重新加载“ael”,“http”和“res_ari”也应该可以工作),命令 ./ct -c example.cfg run 应该可以成功通过。
Web服务端点
/
列出状态和失败的测试。
/list
与 / 类似,但还会列出成功的测试。
/test/name
此测试的状态。
/test/name/start (PUT)
启动此测试。
/test/name/stop (PUT)
中断此测试。
/test/name/fail (PUT)
中断此测试,并将运行标记为失败。
/ws (web socket)
监控测试器。Websocket上的输入会被丢弃。
项目详情
calltest-0.7.4.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c5c735a5cb4b8bec814b81ee6eb006e634cfbe2d589005d29c47d3fdca11309e |
|
MD5 | ee6ec6190aaa2f05caa55a1110d260ad |
|
BLAKE2b-256 | 0a1d1efc84f0ff26c511a4b888740846b0253aa4a1fb0ea9a4e1dee90fe687e9 |