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。