python3使用libpcap给ESL命令添加日志记录

操作系统 :CentOS 7.6_x64
FreeSWITCH版本 :1.10.9
python版本:3.9.12
libpcap版本:1.11.0b7
FreeSWITCH的ESL模块用起来很方便,可以控制FreeSWITCH实现具体业务需求,但该模块没有提供ESL命令执行日志,不便于排查问题,本文展示一种使用python3基于libpcap实现ESL命令执行日志的方法,并提供示例代码及相关资源下载途径。

一、背景描述

日常开发过程中观察到:通过ESL发送给FreeSWITCH的命令,在freeswitch.log中找不到记录。

查看代码发现,确实没有相关记录(mod_event_socket.c文件):

static void *SWITCH_THREAD_FUNC api_exec(switch_thread_t *thread, void *obj)

分析后发现,大概有以下几个方法:

  • 1、通过修改FreeSWITCH源代码实现

文件: mod_event_socket.c
入口: api_exec

可通过switch_log_printf函数来实现。

  • 2、使用tcpdump抓取
    因EventSocket模块使用的是基于TCP的文本协议,且未加密,默认端口8021,可以通过tcpdump抓取event socket服务端口获取命令记录。

示例如下:

复制代码
tcpdump tcp dst port 8021 -w test1.pcap
  • 3、使用python3基于libpcap实现
    底层原理和tcpdump一样,只是基于libpcap使用python3进行实现,会灵活很多,这也是本文终点描述的方法,具体实现在后续展开。

二、具体实现

本文基于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):

完整代码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20231125 获取。

三、运行效果

可使用ESL发送命令,然后用python脚本进行记录。发送ESL命令可使用ESL库,python3.9.12版本的ESL编译及使用,可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/py39esl-20230424.html
也可直接使用socket,示例如下(sendcmd1.py):

复制代码
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')

发送命令后,使用python实时记录的运行效果如下:

运行效果视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2023112501 获取。

四、资源获取

本文涉及资源,可以从如下途径获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20231125 获取。

好,就这么多了,希望对你有帮助。

相关推荐
无须logic ᭄4 分钟前
CrypTen项目实践
python·机器学习·密码学·同态加密
Channing Lewis17 分钟前
flask常见问答题
后端·python·flask
Channing Lewis18 分钟前
如何保护 Flask API 的安全性?
后端·python·flask
水兵没月1 小时前
钉钉群机器人设置——python版本
python·机器人·钉钉
我想学LINUX2 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
数据小爬虫@5 小时前
深入解析:使用 Python 爬虫获取苏宁商品详情
开发语言·爬虫·python
健胃消食片片片片5 小时前
Python爬虫技术:高效数据收集与深度挖掘
开发语言·爬虫·python
ℳ₯㎕ddzོꦿ࿐8 小时前
解决Python 在 Flask 开发模式下定时任务启动两次的问题
开发语言·python·flask
CodeClimb8 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
一水鉴天8 小时前
为AI聊天工具添加一个知识系统 之63 详细设计 之4:AI操作系统 之2 智能合约
开发语言·人工智能·python