feat: 移除ssh客户端改为本地bash

This commit is contained in:
TsMask
2025-05-13 17:22:04 +08:00
parent 552abb411c
commit f7f63f1950
21 changed files with 526 additions and 590 deletions

View File

@@ -8,8 +8,8 @@ import (
"sync"
"time"
"be.ems/src/framework/cmd"
"be.ems/src/framework/logger"
"be.ems/src/framework/ssh"
neService "be.ems/src/modules/network_element/service"
)
@@ -33,20 +33,20 @@ func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) {
return "", fmt.Errorf("command cannot contain -w")
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeTypeAndNeID(neType, neId)
if neInfo.NeId != neId || neInfo.IP == "" {
return "", fmt.Errorf("app.common.noNEInfo")
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId)
if err != nil {
return "", err
}
defer sshClient.Close()
// // 查询网元获取IP
// neInfo := s.neInfoService.FindByNeTypeAndNeID(neType, neId)
// if neInfo.NeId != neId || neInfo.IP == "" {
// return "", fmt.Errorf("app.common.noNEInfo")
// }
// // 网元主机的SSH客户端
// sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId)
// if err != nil {
// return "", err
// }
// defer sshClient.Close()
// 检查是否安装tcpdump
if msg, err := sshClient.RunCMD("sudo tcpdump --version"); err != nil {
if msg, err := cmd.Exec("sudo tcpdump --version"); err != nil {
// bash: tcpdump: command not found
msg = strings.TrimSpace(msg)
logger.Errorf("DumpStart err: %s => %s", msg, err.Error())
@@ -55,8 +55,8 @@ func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) {
taskCode := time.Now().Format("20060102150405")
// 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241
neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode)
sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo chmod 777 -R /tmp/omc", neDirTemp))
neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neType), neId, taskCode)
cmd.Exec(fmt.Sprintf("mkdir -p %s && sudo chmod 777 -R /tmp/omc", neDirTemp))
// 命令拼装
logPath := fmt.Sprintf("%s/tcpdump.log", neDirTemp)
@@ -71,7 +71,7 @@ func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) {
// timeout 超时60分钟后发送kill命令1分钟后强制终止命令。tcpdump -G 文件轮转间隔时间(秒) -W 文件轮转保留最近数量
// sudo timeout --kill-after=1m 60m sudo tcpdump -i any -n -s 0 -v -G 10 -W 7 -w /tmp/part_%Y%m%d%H%M%S.pcap > /tmp/part.log 2>&1 & echo $!
// sudo kill $(pgrep -P 722729)
outputPID, err := sshClient.RunCMD(sendCmd)
outputPID, err := cmd.Exec(sendCmd)
outputPID = strings.TrimSpace(outputPID)
if err != nil || strings.HasPrefix(outputPID, "stderr:") {
logger.Errorf("DumpStart err: %s => %s", outputPID, err.Error())
@@ -79,36 +79,36 @@ func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) {
}
// 日志文件行号
PIDMap := s.logFileLastLine(neType, sshClient)
PIDMap["neType"] = neInfo.NeType
PIDMap["neId"] = neInfo.NeId
PIDMap := s.logFileLastLine(neType)
PIDMap["neType"] = neType
PIDMap["neId"] = neId
PIDMap["taskCode"] = taskCode
PIDMap["pid"] = outputPID
PIDMap["cmd"] = sendCmd
// 检查进程 ps aux | grep tcpdump
// 强杀 sudo pkill tcpdump
pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode)
pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neType), neId, taskCode)
dumpPIDMap.Store(pidKey, PIDMap)
return taskCode, err
}
// DumpStop 停止已存在抓包句柄
func (s *TCPdump) DumpStop(neType, neId, taskCode string) ([]string, error) {
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeTypeAndNeID(neType, neId)
if neInfo.NeId != neId || neInfo.IP == "" {
return []string{}, fmt.Errorf("app.common.noNEInfo")
}
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId)
if err != nil {
return []string{}, err
}
defer sshClient.Close()
// // 查询网元获取IP
// neInfo := s.neInfoService.FindByNeTypeAndNeID(neType, neId)
// if neInfo.NeId != neId || neInfo.IP == "" {
// return []string{}, fmt.Errorf("app.common.noNEInfo")
// }
// // 网元主机的SSH客户端
// sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId)
// if err != nil {
// return []string{}, err
// }
// defer sshClient.Close()
// 是否存在执行过的进程
pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode)
pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neType), neId, taskCode)
PIDMap, ok := dumpPIDMap.Load(pidKey)
if !ok || PIDMap == nil {
return []string{}, fmt.Errorf("tcpdump is not running")
@@ -117,14 +117,14 @@ func (s *TCPdump) DumpStop(neType, neId, taskCode string) ([]string, error) {
if !ok || pid == "" {
return []string{}, fmt.Errorf("tcpdump is not running")
}
s.logFileLastLineToFile(PIDMap.(map[string]string), sshClient)
s.logFileLastLineToFile(PIDMap.(map[string]string))
// 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241
neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode)
neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neType), neId, taskCode)
// 命令拼装
sendCmd := fmt.Sprintf("pids=$(pgrep -P %s) && [ -n \"$pids\" ] && sudo kill $pids;sudo timeout 2s ls %s", pid, neDirTemp)
// pids=$(pgrep -P 1914341) && [ -n "$pids" ] && sudo kill $pids;sudo timeout 2s ls /tmp/omc/tcpdump/udm/001/20240817104241
output, err := sshClient.RunCMD(sendCmd)
output, err := cmd.Exec(sendCmd)
output = strings.TrimSpace(output)
if err != nil || strings.HasPrefix(output, "ls: ") {
logger.Errorf("DumpStop err: %s => %s", output, err.Error())
@@ -136,7 +136,7 @@ func (s *TCPdump) DumpStop(neType, neId, taskCode string) ([]string, error) {
}
// logFileLastLine 日志文件最后行号
func (s *TCPdump) logFileLastLine(neType string, sshClient *ssh.ConnSSH) map[string]string {
func (s *TCPdump) logFileLastLine(neType string) map[string]string {
logFileArr := make([]string, 0)
mapFile := make(map[string]string, 0)
@@ -158,7 +158,7 @@ func (s *TCPdump) logFileLastLine(neType string, sshClient *ssh.ConnSSH) map[str
}
for _, v := range logFileArr {
lastLine, err := sshClient.RunCMD(fmt.Sprintf("sed -n '$=' %s", v))
lastLine, err := cmd.Exec(fmt.Sprintf("sed -n '$=' %s", v))
lastLine = strings.TrimSpace(lastLine)
if err != nil || strings.HasPrefix(lastLine, "sed: can't") {
logger.Errorf("logFileLastLine err: %s => %s", lastLine, err.Error())
@@ -170,22 +170,22 @@ func (s *TCPdump) logFileLastLine(neType string, sshClient *ssh.ConnSSH) map[str
}
// logFileLastLine 日志文件最后行号
func (s *TCPdump) logFileLastLineToFile(PIDMap map[string]string, sshClient *ssh.ConnSSH) error {
// 网元主机的SSH客户端进行文件传输
sftpClient, err := sshClient.NewClientSFTP()
if err != nil {
return fmt.Errorf("ne info sftp client err")
}
defer sftpClient.Close()
func (s *TCPdump) logFileLastLineToFile(PIDMap map[string]string) error {
// // 网元主机的SSH客户端进行文件传输
// sftpClient, err := sshClient.NewClientSFTP()
// if err != nil {
// return fmt.Errorf("ne info sftp client err")
// }
// defer sftpClient.Close()
neType := PIDMap["neType"]
neId := PIDMap["neId"]
taskCode := PIDMap["taskCode"]
// 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241
sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc")
cmd.Exec("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc")
neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neType), neId, taskCode)
lastLineMap := s.logFileLastLine(neType, sshClient)
lastLineMap := s.logFileLastLine(neType)
for lastLogFile, lastFileLine := range lastLineMap {
for startLogFile, startFileLine := range PIDMap {
if lastLogFile == startLogFile && lastFileLine != "" {
@@ -195,7 +195,7 @@ func (s *TCPdump) logFileLastLineToFile(PIDMap map[string]string, sshClient *ssh
outputFile := fmt.Sprintf("%s/%s", neDirTemp, filepath.Base(lastLogFile))
sendCmd := fmt.Sprintf("sed -n \"%s,%sp\" \"%s\" > \"%s\"", startFileLine, lastFileLine, lastLogFile, outputFile)
// sed -n "1,5p" "/var/log/amf.log" > "/tmp/omc/tcpdump/amf/001/20241008141336/amf.log"
output, err := sshClient.RunCMD(sendCmd)
output, err := cmd.Exec(sendCmd)
if err != nil || strings.HasPrefix(output, "stderr:") {
logger.Errorf("logFileLastLineToFile err: %s => %s", strings.TrimSpace(output), err.Error())
continue