perf: tcpdump功能优化提升稳定性

This commit is contained in:
TsMask
2024-08-20 15:47:46 +08:00
parent 4f924a943f
commit e4ad2088a1
4 changed files with 217 additions and 155 deletions

View File

@@ -1,9 +1,12 @@
package controller
import (
"path/filepath"
"be.ems/src/framework/i18n"
"be.ems/src/framework/utils/ctx"
"be.ems/src/framework/vo/result"
neService "be.ems/src/modules/network_element/service"
traceService "be.ems/src/modules/trace/service"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
@@ -12,6 +15,7 @@ import (
// 实例化控制层 TcpdumpController 结构体
var NewTcpdump = &TcpdumpController{
TcpdumpService: traceService.NewTcpdumpImpl,
neInfoService: neService.NewNeInfoImpl,
}
// 信令抓包请求
@@ -20,6 +24,8 @@ var NewTcpdump = &TcpdumpController{
type TcpdumpController struct {
// 信令抓包服务
TcpdumpService traceService.ITcpdump
// 网元信息服务
neInfoService neService.INeInfo
}
// 网元抓包PACP 开始
@@ -30,7 +36,7 @@ func (s *TcpdumpController) DumpStart(c *gin.Context) {
var body struct {
NeType string `json:"neType" binding:"required"` // 网元类型
NeId string `json:"neId" binding:"required"` // 网元ID
Cmd string `json:"cmd" binding:"required"` // 命令 "-n -s 0 -v -w"
Cmd string `json:"cmd" binding:"required"` // 命令 "-n -s 0 -v"
}
err := c.ShouldBindBodyWith(&body, binding.JSON)
if err != nil {
@@ -38,21 +44,12 @@ func (s *TcpdumpController) DumpStart(c *gin.Context) {
return
}
fileName, err := s.TcpdumpService.DumpStart(body.NeType, body.NeId, body.Cmd)
taskCode, err := s.TcpdumpService.DumpStart(body.NeType, body.NeId, body.Cmd)
if err != nil {
msg := err.Error()
if msg == "noData" {
// 找不到 %s %s 对应网元信息
msg = i18n.TTemplate(language, "trace.tcpdump.noData", map[string]any{"type": body.NeType, "id": body.NeId})
}
c.JSON(200, result.ErrMsg(msg))
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
return
}
c.JSON(200, result.OkData(map[string]any{
"msg": "tcpdump started",
"out": fileName,
"log": "",
}))
c.JSON(200, result.OkData(taskCode))
}
// 网元抓包PACP 结束
@@ -61,9 +58,9 @@ func (s *TcpdumpController) DumpStart(c *gin.Context) {
func (s *TcpdumpController) DumpStop(c *gin.Context) {
language := ctx.AcceptLanguage(c)
var body struct {
NeType string `json:"neType" binding:"required"` // 网元类型
NeId string `json:"neId" binding:"required"` // 网元ID
FileName string `json:"fileName"` // 文件名 查看日志信息
NeType string `json:"neType" binding:"required"` // 网元类型
NeId string `json:"neId" binding:"required"` // 网元ID
TaskCode string `json:"taskCode" binding:"required"` // 任务码,停止任务并查看日志信息
}
err := c.ShouldBindBodyWith(&body, binding.JSON)
if err != nil {
@@ -71,29 +68,41 @@ func (s *TcpdumpController) DumpStop(c *gin.Context) {
return
}
logMsg, err := s.TcpdumpService.DumpStop(body.NeType, body.NeId, body.FileName)
taskLog, err := s.TcpdumpService.DumpStop(body.NeType, body.NeId, body.TaskCode)
if err != nil {
msg := err.Error()
if msg == "noData" {
// 找不到 %s %s 对应网元信息
msg := i18n.TTemplate(language, "trace.tcpdump.noData", map[string]any{"type": body.NeType, "id": body.NeId})
c.JSON(200, result.ErrMsg(msg))
return
}
c.JSON(200, result.ErrMsg(msg))
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
return
}
c.JSON(200, result.OkData(map[string]any{
"msg": "tcpdump stopped",
"out": body.FileName,
"log": logMsg,
}))
c.JSON(200, result.OkMsg(taskLog))
}
// 网元抓包PACP 下载
//
// GET /download
func (s *TcpdumpController) DumpDownload(c *gin.Context) {
language := ctx.AcceptLanguage(c)
var query struct {
NeType string `form:"neType" binding:"required"` // 网元类型
NeID string `form:"neId" binding:"required"` // 网元ID
TaskCode string `form:"taskCode" binding:"required"` // 任务码,停止任务并查看日志信息
}
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
zipFilePath, err := s.TcpdumpService.DumpDownload(query.NeType, query.NeID, query.TaskCode)
if err != nil {
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
return
}
c.FileAttachment(zipFilePath, filepath.Base(zipFilePath))
}
// UPF标准版内部抓包
//
// POST /traceUPF
func (s *TcpdumpController) TraceUPF(c *gin.Context) {
// POST /upf
func (s *TcpdumpController) UPFTrace(c *gin.Context) {
language := ctx.AcceptLanguage(c)
var body struct {
NeType string `json:"neType" binding:"required"` // 网元类型
@@ -106,19 +115,10 @@ func (s *TcpdumpController) TraceUPF(c *gin.Context) {
return
}
fileName, logMsg, err := s.TcpdumpService.DumpUPF(body.NeType, body.NeId, body.Cmd)
msg, err := s.TcpdumpService.UPFTrace(body.NeType, body.NeId, body.Cmd)
if err != nil {
msg := err.Error()
if msg == "noData" {
// 找不到 %s %s 对应网元信息
msg = i18n.TTemplate(language, "trace.tcpdump.noData", map[string]any{"type": body.NeType, "id": body.NeId})
}
c.JSON(200, result.ErrMsg(msg))
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
return
}
c.JSON(200, result.OkData(map[string]any{
"msg": "trace UPF dump pacp",
"out": fileName,
"log": logMsg,
}))
c.JSON(200, result.OkData(msg))
}