前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >黑名单(mod_blacklist)

黑名单(mod_blacklist)

作者头像
Seven Du
发布2020-12-21 15:07:17
1.3K0
发布2020-12-21 15:07:17
举报

前几天有网友问黑名单怎么做,我说自己写个Lua脚本查数据库吧。后来又查了一下,FreeSWITCH竟然有一个mod_blacklist,这不就是黑名单嘛。

说实话我以前从来没注意过这个模块。遇到一个新模块怎么办呢?当然是查FreeSWITCH的Wiki。那如果Wiki上也没有呢?Wiki上一搬都会有,如果没有的话,也不怕,下面,我就带大家在不看Wiki的情况下如何了解一个模块。

当然,这个模块比较简单。首先,这个模块默认是不编译的,要手动编译

$ cd src/mod/applications/mod_blacklist

$ make install

然后,就可以在FreeSWITCH里加载模块了:

freeswitch> load mod_blacklist

显示日志如下:

2016-04-28 09:12:29.508192 [CONSOLE] switch_loadable_module.c:1538 Successfully Loaded [mod_blacklist]

2016-04-28 09:12:29.508192 [NOTICE] switch_loadable_module.c:338 Adding API Function 'blacklist'

从日志中可以看出,该模块好像仅实现了一个API: blacklist

直接输入这个命令试下

freeswitch@seven.local> blacklist

2016-04-28 16:53:23.913138 [ERR] mod_blacklist.c:182 Invalid usage

出错啦,继续试:

freeswitch@seven.local> blacklist test

-ERR: No such command: test (see 'blacklist help')

有门,继续:

freeswitch@seven.local> blacklist help

blacklist check <listname> <item>

blacklist add <listname> <item>

blacklist del <listname> <item>

blacklist save <listname>

blacklist reload

blacklist help

+OK

从命令行中看,它好像支持多个列表(listname),每个列表中都有相关的条目(item)。看配置文件,blacklist.conf.xml里有这么一行:

<list name="example" filename="$${conf_dir}/blacklists/example.list"/>

创建 /usr/local/freeswitch/conf/blacklists/example.list

里面的内容怎么写呢?不知道,蒙一把,输入

1000

1001

就是把电话号码每个一行。至于蒙的对不对,实际上可以看源代码的。在源代码中,有一个load_list()函数,看样子是用于加载这个列表的,主要内容如下:

while (fgets(buf, 1024, f)) {

trim(buf);

switch_core_hash_insert(bl->list, buf, (void *)SWITCH_TRUE);

}

很明显,它加从文件中依次读取每一行,然后插入一个内容哈希表中。看样子我们蒙的还比较靠谱。

重新加载一下模块:

freeswitch@seven.local> reload mod_blacklist

2016-04-28 15:09:18.868148 [INFO] mod_blacklist.c:104 Loaded list [example]

2016-04-28 15:09:18.868148 [CONSOLE] switch_loadable_module.c:1538 Successfully Loaded [mod_blacklist]

哈哈,Loaded list [example] 显示名为 example 的列表已经加载了。试试检查(check)命令

freeswitch@seven.local> blacklist check example 1000

true

freeswitch@seven.local> blacklist check example 1001

true

freeswitch@seven.local> blacklist check example 1002

false

由于1002不在列表中,返回了false。

看看能不能手工加

freeswitch@seven.local> blacklist add example 1002

+OK

2016-04-28 16:54:02.593169 [INFO] mod_blacklist.c:228 Added [1002] to list [example]

freeswitch@seven.local> blacklist check example 1002

true

这次是true了。试试save命令:

freeswitch@seven.local> blacklist save example

2016-04-28 16:54:17.973176 [INFO] mod_blacklist.c:280 Saving example to /usr/local/freeswitch/conf/blacklists/example.list

+OK

$ cat /usr/local/freeswitch/conf/blacklists/example.list

1000

1002

1001

可以看到1002已经加到列表里了。但由于内部实现是哈希表,没有排序,因次并没有特定的次序。

好了,但在实际打电话时怎么用呢?

创建如下Dialplan,这个例子来自FreeSWITCH的Wiki

<extension name="blacklist_check">

<condition field="

<action application="bridge" data="sofia/external/sip:lenny@sip.itslenny.com:5060"/>

</condition>

</extension>

上面的意思是说,测试条件是一个动态条件,该动态条件是由blacklist check listname item完成的。上面的例子测试了被叫号码(destination_number)是否在黑名单,若否则继续呼。

我们再来个稍复杂点的例子:

<extension name="echo">

<condition field="destination_number" expression="^9196$">

<condition field="

<action application="answer"/>

<action application="echo"/>

</condition>

</condition>

</extension>

其实很简单,我们只不过是在默认的9196基础上增加了一层blacklist的判断。如果主叫号码是一个不在名单中的号码,则匹配失败,呼叫失败,打印日志如下:

Dialplan: sofia/internal/1004@192.168.7.6 Regex (PASS) [echo] destination_number(9196) =~ /^9196$/ break=on-false

|--- Dialplan: Processing recursive conditions level:1 [echo_recur_1] require-nested=TRUE

|--- Dialplan: sofia/internal/1004@192.168.7.6 Regex (FAIL) [echo_recur_1] ${blacklist(check example ${caller_id_number})}(false) =~ /^true$/ break=on-false

如果是在名单中的号码,则呼叫成功,日志显示如下:

Dialplan: sofia/internal/1000@192.168.7.6 Regex (PASS) [echo] destination_number(9196) =~ /^9196$/ break=on-false

|--- Dialplan: Processing recursive conditions level:1 [echo_recur_1] require-nested=TRUE

|--- Dialplan: sofia/internal/1000@192.168.7.6 Regex (PASS) [echo_recur_1] ${blacklist(check example ${caller_id_number})}(true) =~ /^true$/ break=on-false

|--- Dialplan: sofia/internal/1000@192.168.7.6 Action answer()

|--- Dialplan: sofia/internal/1000@192.168.7.6 Action echo()

读到这里,细心的读者可能会问:你上面说错了吧?明明上面的逻辑是白名单……,呵呵,是的,天使跟恶魔只是一念之差,你也可以用黑名单来做白名单 ? 。当然,如果你确实需要黑名单,试试把上面的 true 改成 false 就行了,这个,留给读者自己练习吧?

点『阅读原文』查看该模块相关的Wiki页面。

这篇的信息里还是挺大的,除了黑名单,告诉我你还学到了什么?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeSWITCH中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档