122 lines
3.3 KiB
Go
122 lines
3.3 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"time"
|
|
|
|
"be.ems/src/framework/utils/file"
|
|
neService "be.ems/src/modules/network_element/service"
|
|
)
|
|
|
|
// 实例化数据层 AMF 结构体
|
|
var NewAMF = &AMF{
|
|
neInfoService: neService.NewNeInfo,
|
|
}
|
|
|
|
// AMF 备份相关 服务层处理
|
|
type AMF struct {
|
|
neInfoService *neService.NeInfo // 网元信息服务
|
|
}
|
|
|
|
// FTPConfigInfo 获取FTP配置信息
|
|
func (r AMF) GetAuditLog(neId string) ([]map[string]any, error) {
|
|
// 网管本地路径
|
|
omcPath := "/usr/local/omc/backup/log"
|
|
if runtime.GOOS == "windows" {
|
|
omcPath = fmt.Sprintf("C:%s", omcPath)
|
|
}
|
|
localDirPath := fmt.Sprintf("%s/%s/%s", omcPath, "amf", neId)
|
|
|
|
// 网元主机的SSH客户端
|
|
sshClient, err := r.neInfoService.NeRunSSHClient("AMF", neId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer sshClient.Close()
|
|
// 网元主机的SSH客户端进行文件传输
|
|
sftpClient, err := sshClient.NewClientSFTP()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("ne info sftp client err")
|
|
}
|
|
defer sftpClient.Close()
|
|
// 网元端文件路径
|
|
neFilePath := "/var/log/amf-audit.log"
|
|
localFilePath := filepath.Join(localDirPath, filepath.Base(neFilePath))
|
|
// 网元端复制到本地
|
|
if err = sftpClient.CopyFileRemoteToLocal(neFilePath, localFilePath); err != nil {
|
|
return nil, fmt.Errorf("copy amf audit log err")
|
|
}
|
|
|
|
// 读取本地文件
|
|
arr := file.ReadFileTXTLine(",", localFilePath)
|
|
if len(arr) == 0 {
|
|
return nil, fmt.Errorf("read file err")
|
|
}
|
|
// 解析日志
|
|
data := make([]map[string]any, 0)
|
|
for _, item := range arr {
|
|
arrLen := len(item)
|
|
if arrLen < 6 {
|
|
continue
|
|
}
|
|
timeStr := item[0]
|
|
timeStr = timeStr[0:10] + " " + timeStr[11:] // 将破折号替换成空格,方便解析
|
|
t, err := time.Parse(time.DateTime, timeStr)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
supi := strings.TrimPrefix(item[1], "SUPI:imsi-")
|
|
amfUeNgapId := strings.TrimPrefix(item[2], "AMF-UE-NGAP-ID:")
|
|
ranUeNgapId := strings.TrimPrefix(item[3], "RAN-UE-NGAP-ID:")
|
|
gnbId := strings.TrimPrefix(item[4], "GNB-ID:")
|
|
gnbAddr := strings.TrimPrefix(item[5], "GNB-ADDR:")
|
|
tai := ""
|
|
opType := ""
|
|
regType := ""
|
|
result := ""
|
|
switch arrLen {
|
|
case 8:
|
|
opType = strings.TrimPrefix(item[6], "OP-TYPE:")
|
|
result = strings.TrimPrefix(item[7], "CAUSE:")
|
|
case 9:
|
|
opType = strings.TrimPrefix(item[6], "OP-TYPE:")
|
|
regType = strings.TrimPrefix(item[7], "DEREG-TYPE:")
|
|
result = strings.TrimPrefix(item[8], "RESULT:")
|
|
case 10:
|
|
tai = strings.TrimPrefix(item[6], "TAI:")
|
|
opType = strings.TrimPrefix(item[7], "OP-TYPE:")
|
|
if opType == "REGISTRATION" {
|
|
regType = strings.TrimPrefix(item[8], "REG-TYPE:")
|
|
}
|
|
if opType == "SERVICE-REO" {
|
|
regType = strings.TrimPrefix(item[8], "SERVICE-TYPE:")
|
|
}
|
|
result = strings.TrimPrefix(item[9], "RESULT:")
|
|
default:
|
|
fmt.Printf("Warning: unexpected log format, arrLen=%d, item=%v\n", arrLen, item)
|
|
continue
|
|
}
|
|
|
|
data = append(data, map[string]any{
|
|
"time": t.Format(time.DateTime),
|
|
"supi": supi,
|
|
"amf_ue_ngap_id": amfUeNgapId,
|
|
"ran_ue_ngap_id": ranUeNgapId,
|
|
"gnb_id": gnbId,
|
|
"gnb_addr": gnbAddr,
|
|
"tai": tai,
|
|
"op_type": opType,
|
|
"reg_type": regType,
|
|
"result": result,
|
|
})
|
|
}
|
|
|
|
os.Remove(localFilePath)
|
|
return data, nil
|
|
}
|