From 7e879a97f91b021be59190b7106e3ce0647d65cb Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 15 Jun 2024 14:49:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8A=93=E5=8C=85=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E6=94=B9=E7=94=A8=E7=BD=91=E5=85=83=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E9=85=8D=E7=BD=AE=E7=9A=84=E7=BB=88=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/trace/service/tcpdump.impl.go | 57 +++++++++++++---------- src/modules/trace/trace.go | 4 +- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/modules/trace/service/tcpdump.impl.go b/src/modules/trace/service/tcpdump.impl.go index 5fb1c2ea..005ee2b8 100644 --- a/src/modules/trace/service/tcpdump.impl.go +++ b/src/modules/trace/service/tcpdump.impl.go @@ -5,9 +5,7 @@ import ( "strings" "time" - "be.ems/src/framework/config" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/cmd" "be.ems/src/framework/utils/date" neService "be.ems/src/modules/network_element/service" ) @@ -28,23 +26,26 @@ type TcpdumpImpl struct { // DumpStart 触发tcpdump开始抓包 filePcapName, err func (s *TcpdumpImpl) DumpStart(neType, neId, cmdStr string) (string, error) { - // 检查网元信息 + // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { + if neInfo.NeId != neId || neInfo.IP == "" { return "", fmt.Errorf("noData") } - // SSH命令 - usernameNe := config.Get("ne.user").(string) // 网元统一用户 - sshHost := fmt.Sprintf("%s@%s", usernameNe, neInfo.IP) + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return "", err + } + defer sshClient.Close() // 是否拥有sudo权限并拼接 withSudo := "" - if _, err := cmd.ExecWithCheck("ssh", sshHost, "sudo -n uname"); err == nil { + if _, err := sshClient.RunCMD("sudo -n uname"); err == nil { withSudo = "sudo " } - if msg, err := cmd.ExecWithCheck("ssh", sshHost, fmt.Sprintf("%s tcpdump --version", withSudo)); err != nil { + if msg, err := sshClient.RunCMD(fmt.Sprintf("%s tcpdump --version", withSudo)); err != nil { // stderr: bash: tcpdump:未找到命令 => exit status 127 msg = strings.TrimSpace(msg) logger.Warnf("DumpStart err: %s => %s", msg, err.Error()) @@ -58,7 +59,7 @@ func (s *TcpdumpImpl) DumpStart(neType, neId, cmdStr string) (string, error) { sendCmd := fmt.Sprintf("cd /tmp \n %s nohup timeout 30m tcpdump -i any %s -s0 -w %s.pcap > %s.log 2>&1 & \necho $!", withSudo, cmdStr, fileName, fileName) // cd /tmp // sudo nohup timeout 60m tcpdump -i any -n -s 0 -v -w -s0 -w 20240115140822_UDM_001.pcap > 20240115140822_UDM_001.log 2>&1 & echo $! - msg, err := cmd.ExecWithCheck("ssh", sshHost, sendCmd) + msg, err := sshClient.RunCMD(sendCmd) msg = strings.TrimSpace(msg) if err != nil || strings.HasPrefix(msg, "stderr:") { logger.Warnf("DumpStart err: %s => %s", msg, err.Error()) @@ -73,19 +74,22 @@ func (s *TcpdumpImpl) DumpStart(neType, neId, cmdStr string) (string, error) { // DumpStop 停止已存在抓包句柄 func (s *TcpdumpImpl) DumpStop(neType, neId, fileName string) (string, error) { - // 检查网元信息 + // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { + if neInfo.NeId != neId || neInfo.IP == "" { return "", fmt.Errorf("noData") } - // SSH命令 - usernameNe := config.Get("ne.user").(string) // 网元统一用户 - sshHost := fmt.Sprintf("%s@%s", usernameNe, neInfo.IP) + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return "", err + } + defer sshClient.Close() // 是否拥有sudo权限并拼接 withSudo := "" - if _, err := cmd.ExecWithCheck("ssh", sshHost, "sudo -n uname"); err == nil { + if _, err := sshClient.RunCMD("sudo -n uname"); err == nil { withSudo = "sudo " } @@ -104,7 +108,7 @@ func (s *TcpdumpImpl) DumpStop(neType, neId, fileName string) (string, error) { // 拼装命令 sendCmd := fmt.Sprintf("cd /tmp \n %s kill %s %s", withSudo, pid, viewLogFile) - msg, err := cmd.ExecWithCheck("ssh", sshHost, sendCmd) + msg, err := sshClient.RunCMD(sendCmd) delete(s.tcpdumpPIDMap, neTypeID) if err != nil || strings.HasPrefix(msg, "stderr:") { logger.Warnf("DumpStop err: %s => %s", strings.TrimSpace(msg), err.Error()) @@ -115,23 +119,26 @@ func (s *TcpdumpImpl) DumpStop(neType, neId, fileName string) (string, error) { // DumpUPF UPF标准版抓包 func (s *TcpdumpImpl) DumpUPF(neType, neId, cmdStr string) (string, string, error) { - // 检查网元信息 + // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { + if neInfo.NeId != neId || neInfo.IP == "" { return "", "", fmt.Errorf("noData") } - // SSH命令 - usernameNe := config.Get("ne.user").(string) // 网元统一用户 - sshHost := fmt.Sprintf("%s@%s", usernameNe, neInfo.IP) + // 网元主机的SSH客户端 + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return "", "", err + } + defer sshClient.Close() // 是否拥有sudo权限并拼接 withSudo := "" - if _, err := cmd.ExecWithCheck("ssh", sshHost, "sudo -n uname"); err == nil { + if _, err := sshClient.RunCMD("sudo -n uname"); err == nil { withSudo = "sudo " } - if msg, err := cmd.ExecWithCheck("ssh", sshHost, fmt.Sprintf("%s expect -version", withSudo)); err != nil { + if msg, err := sshClient.RunCMD(fmt.Sprintf("%s expect -version", withSudo)); err != nil { // stderr: bash: expect:未找到命令 => exit status 127 msg = strings.TrimSpace(msg) logger.Warnf("DumpUPF err: %s => %s", msg, err.Error()) @@ -160,7 +167,7 @@ func (s *TcpdumpImpl) DumpUPF(neType, neId, cmdStr string) (string, string, erro // sudo chmod +x pcapUPF.sh // expect ./cap.sh 'pcap dispatch trace off' > 20240115165701_UDM_001.log 2>&1 // cat 20240115165701_UDM_001.log - msg, err := cmd.ExecWithCheck("ssh", sshHost, sendCmd) + msg, err := sshClient.RunCMD(sendCmd) msg = strings.TrimSpace(msg) if err != nil || strings.HasPrefix(msg, "stderr:") { logger.Warnf("DumpUPF err: %s => %s", msg, err.Error()) diff --git a/src/modules/trace/trace.go b/src/modules/trace/trace.go index f045f708..dd38c724 100644 --- a/src/modules/trace/trace.go +++ b/src/modules/trace/trace.go @@ -13,8 +13,10 @@ import ( func Setup(router *gin.Engine) { logger.Infof("开始加载 ====> trace 模块路由") + traceGroup := router.Group("/trace") + // 信令抓包 - tcpdumpGroup := router.Group("/tcpdump") + tcpdumpGroup := traceGroup.Group("/tcpdump") { tcpdumpGroup.POST("/start", middleware.PreAuthorize(nil),