python3使用libpcap给ESL命令添加日志记录
source link: https://www.cnblogs.com/MikeZhang/p/pyESLCapLog20211125.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
一、背景描述
日常开发过程中观察到:通过ESL发送给FreeSWITCH的命令,在freeswitch.log中找不到记录。
查看代码发现,确实没有相关记录(mod_event_socket.c文件):
static void *SWITCH_THREAD_FUNC api_exec(switch_thread_t *thread, void *obj)
分析后发现,大概有以下几个方法:
- 1、通过修改FreeSWITCH源代码实现
- 2、使用tcpdump抓取
示例如下:
tcpdump tcp dst port 8021 -w test1.pcap
- 3、使用python3基于libpcap实现
二、具体实现
本文基于python3.9.12实现,CentOS 7环境编译及使用python3.9.12,可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/centos7-install-py39-20220704.html
关键点如下:
1、实时抓取网卡数据
可基于libpcap实时抓取网卡数据,具体可参考我之前写的文章:
https://www.cnblogs.com/MikeZhang/p/pythonUseLibpcap20221029.html
2、解析IP头获取源地址
需要获取发送ESL命令机器的源地址以便排查问题,IP数据包里面包含有源地址,python中解析IP头的示例如下:
ipInfo = struct.unpack('!BBHHHBBH4s4s',bytes(p[14:34])) srcIp = socket.inet_ntoa(ipInfo[-2]) dstIp = socket.inet_ntoa(ipInfo[-1])
3、解析TCP头获取具体数据
具体的ESL命令在TCP的数据部分保存,可通过解析TCP头获取ESL数据的起始下标,进而获取数据,示例如下:
tcpInfo = struct.unpack('!HHLLBBH',bytes(p[34:50])) tcpHdrLen = (tcpInfo[4] >> 4) * 4 offset = 34 + tcpHdrLen data = bytes(p[offset:tlen])
4、使用logging模块进行记录
可使用python自带的日志模块记录ESL命令记录,并进行存盘,便于后续查看。
示例如下:
logger.info("(%s,%s)" % (srcIp,data))
logger可在main函数中实现,指定具体的存盘文件,如果只是想控制台查看,则可以这样实现:
logger = logging.getLogger() ... logging.basicConfig( level=logging.DEBUG, # DEBUG,INFO,WARNING,ERROR,CRITICAL format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S' )
基于上述关键点,可以实现ESL命令的日志记录,示例如下(eslLogTest1.py):
完整代码可从如下渠道获取:
三、运行效果
可使用ESL发送命令,然后用python脚本进行记录。发送ESL命令可使用ESL库,python3.9.12版本的ESL编译及使用,可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/py39esl-20230424.html
import socket,time def doCmd(sock,cmd): print(cmd) sock.send(cmd + b'\r\n\r\n') sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('192.168.137.32', 8021)) sock.send(b'auth ClueCon\r\n\r\n') doCmd(sock,b'bgapi originate user/1000 &echo') time.sleep(10) doCmd(sock,b'bgapi hupall')
运行效果视频可从如下渠道获取:
四、资源获取
本文涉及资源,可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20231125 获取。
好,就这么多了,希望对你有帮助。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK