日常開發過程中觀察到:通過ESL傳送給FreeSWITCH的命令,在freeswitch.log中找不到記錄。
檢視程式碼發現,確實沒有相關記錄(mod_event_socket.c檔案):
static void *SWITCH_THREAD_FUNC api_exec(switch_thread_t *thread, void *obj)
分析後發現,大概有以下幾個方法:
範例如下:
tcpdump tcp dst port 8021 -w test1.pcap
本文基於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 獲取。
好,就這麼多了,希望對你有幫助。