FreeSWITCH中文 FreeSWITCH参考手册
← 目录

mod_cdr_csv

mod_cdr_csv是FreeSWITCH中写话单的模块。该模块会以CSV(Comma-Separated Values,即以逗号分隔的值)格式写话单,当然,其它也可以通过配置模板选择将话单写成任何格式。

话单文件的默认存储位置是在/usr/local/freeswitch/log/cdr-csv目录下,当话单文件增长到一定程度,便会发生轮转(rotate),即,关闭原来的话单文件,重新生成新的话单文件。旧的话单文件会以日期时间的文件名格式保存,如:

1003.csv.2014-01-24-19-22-57

当然,如果话单文件还没有增长到一定程序时,也可以手工触发话单rotate,如在FreeSWITCH控制台上执行如下命令:

freeswitch> cdr_csv rotate

该模块本身没有什么值得多说的,下面说一下话单文件的处理。其实我想说的也不是如何处理话单,而是如何及时有效地处理话单。

笔者以前处理话单一直使用一个叫iwatch的工具,该工具是一个perl写的工具,通过配置正确的XML文件,可以让iwatch监听一个目录,iwatch使用Linux文件系统的的inotify机制监视文件系统,一旦文件系统发生变化,便可以执行相应的脚本。

但是,该工具在CentOS上装起来特别麻烦,而且,它又依赖于无数的Perl模块,因此,对于一些上网不方便的环境部署起来特别麻烦。后来,又找到一个C语言写的工具:https://github.com/rvoicilas/inotify-tools/wiki ,该工具看起来也不错,装起来也简单。安装后,我写了如下的脚本:

#!/bin/sh

CURPATH=`pwd`
FSPATH=/usr/local/freeswitch/log/cdr-csv

inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write $FSPATH | while read date time dir file
do
       FILECHANGE=${dir}${file}
       # convert absolute path to relative
       FILECHANGEREL=`echo "$FILECHANGE" | sed 's_'$CURPATH'/__'`

       echo "At ${time} on ${date}, file $FILECHANGE was backed up to ..."
       echo mv $FILECHANGE /tmp/
done

当然,该脚本仅仅是个简单的例子,它使用了inotifywait监视一个目录(即/usr/local/freeswitch/log/cdr-dsv),当该目录中发生了close_write事件(即当文件被以写入方式打开又关闭时)时,即话单写完了,我们可以执行一个命令把它移动(或复制)到其它的目录中去。当然,没有人阻止你修改该脚本,解析CDR再写入数据库之类的。

总之,笔者认为这是很简单而又灵活的实现方式。UNIX的哲学就是KISS嘛——Keep It Simple, Stupid。


本书版权所有 © 杜金房及各位贡献者 2016-2023,仅供在线阅读,谢绝一切形式转载。