跳转到主要内容

分布式电话测试程序

项目描述

此程序连接到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 以获取预先填充默认值的副本。

调用

调用 包含多个(命名)测试。

  • src: 要使用的源链接,即发起调用。

  • dst: 要使用的目的地,即应答调用。

  • mode: 如何执行测试。请参见下文。

  • timeout: 调用的持续时间硬限制。如果调用超过此限制,则终止并测试失败。

  • url: 对于仅应答模式,需要一种方式来发起调用。目前这是通过获取此URL的数据来实现的。

    此字段可以是简单的URL,也可以是具有以下属性的字典

    • url

    • method (GET POST PUT)

    • query

    • body

    querybody 可以包含一个 {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

待办事项。

仅发起:调用此号码。通话可能无法接通。它必须在ringtimetimeout秒后之间被挂断。

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 (28.8 kB 查看哈希值)

上传时间 源代码

由以下组织支持