feat: omc原始代码
This commit is contained in:
339
features/trace/tcpdump.go
Normal file
339
features/trace/tcpdump.go
Normal file
@@ -0,0 +1,339 @@
|
||||
package trace
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"nms_nbi/lib/core/conf"
|
||||
"nms_nbi/lib/core/utils/ctx"
|
||||
"nms_nbi/lib/core/vo/result"
|
||||
"nms_nbi/lib/dborm"
|
||||
"nms_nbi/lib/log"
|
||||
"nms_nbi/restagent/config"
|
||||
"nms_nbi/src/framework/utils/cmd"
|
||||
"nms_nbi/src/framework/utils/ssh"
|
||||
)
|
||||
|
||||
var (
|
||||
UriTcpdumpTask = config.DefaultUriPrefix + "/traceManagement/{apiVersion}/tcpdumpNeTask"
|
||||
CustomUriTcpdumpTask = config.UriPrefix + "/traceManagement/{apiVersion}/tcpdumpNeTask" // decode message api
|
||||
|
||||
UriTcpdumpPcapDownload = config.DefaultUriPrefix + "/traceManagement/{apiVersion}/tcpdumpPcapDownload"
|
||||
CustomUriTcpdumpPcapDownload = config.UriPrefix + "/traceManagement/{apiVersion}/tcpdumpPcapDownload" // decode message api
|
||||
|
||||
UriTcpdumpNeUPFTask = config.DefaultUriPrefix + "/traceManagement/{apiVersion}/tcpdumpNeUPFTask"
|
||||
CustomUriTcpdumpNeUPFTask = config.UriPrefix + "/traceManagement/{apiVersion}/tcpdumpNeUPFTask" // decode message api
|
||||
)
|
||||
|
||||
// NeInfo 网元信息
|
||||
func NeInfo(neType, neId string) (*dborm.NeInfo, error) {
|
||||
neInfo, err := dborm.XormGetNeInfo(neType, neId)
|
||||
if err != nil {
|
||||
log.Error("dborm.XormGetNeInfo is failed:", err)
|
||||
return nil, err
|
||||
}
|
||||
if neInfo == nil || neInfo.Ip == "" {
|
||||
return nil, fmt.Errorf("not ne_info or not IP")
|
||||
}
|
||||
return neInfo, nil
|
||||
}
|
||||
|
||||
// TcpdumpNeTask 网元发送执行 pcap
|
||||
func TcpdumpNeTask(w http.ResponseWriter, r *http.Request) {
|
||||
var body struct {
|
||||
NeType string `json:"neType"` // 网元类型
|
||||
NeId string `json:"neId"` // 网元ID
|
||||
Timeout int `json:"timeout"` // 超时时间
|
||||
Cmd string `json:"cmd"` // 命令
|
||||
}
|
||||
err := ctx.ShouldBindJSON(r, &body)
|
||||
if err != nil || body.NeType == "" || body.NeId == "" || body.Timeout < 5 || body.Cmd == "" {
|
||||
ctx.JSON(w, 400, result.CodeMsg(400, "parameter error"))
|
||||
return
|
||||
}
|
||||
|
||||
neInfo, err := NeInfo(body.NeType, body.NeId)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
filePcapName := fmt.Sprintf("tmp_%s_%s_%d.pcap", body.NeType, body.NeId, time.Now().UnixMilli())
|
||||
fileLogName := fmt.Sprintf("tmp_%s_%s_%d.log", body.NeType, body.NeId, time.Now().UnixMilli())
|
||||
writeLog := fmt.Sprintf(" >> %s 2>&1 \ncat %s", fileLogName, fileLogName) // 执行信息写入日志文件,放置弹出code 127
|
||||
cmdStr := fmt.Sprintf("cd /tmp \nsudo timeout %d tcpdump -i any %s -s0 -w %s", body.Timeout, body.Cmd, filePcapName)
|
||||
usernameNe := conf.Get("ne.user").(string) // 网元统一用户
|
||||
sshHost := fmt.Sprintf("%s@%s", usernameNe, neInfo.Ip)
|
||||
msg, err := cmd.ExecWithCheck("ssh", sshHost, cmdStr+writeLog)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
ctx.JSON(w, 200, result.OkData(map[string]any{
|
||||
"cmd": cmdStr,
|
||||
"msg": msg,
|
||||
"fileName": filePcapName,
|
||||
}))
|
||||
}
|
||||
|
||||
// TcpdumpPcapDownload 网元抓包pcap文件下载
|
||||
func TcpdumpPcapDownload(w http.ResponseWriter, r *http.Request) {
|
||||
var body struct {
|
||||
NeType string `json:"neType"` // 网元类型
|
||||
NeId string `json:"neId"` // 网元ID
|
||||
FileName string `json:"fileName"` // 文件名
|
||||
}
|
||||
err := ctx.ShouldBindJSON(r, &body)
|
||||
if err != nil || body.NeType == "" || body.NeId == "" || body.FileName == "" {
|
||||
ctx.JSON(w, 400, result.CodeMsg(400, "parameter error"))
|
||||
return
|
||||
}
|
||||
|
||||
neInfo, err := NeInfo(body.NeType, body.NeId)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
nePath := fmt.Sprintf("/tmp/%s", body.FileName)
|
||||
localPath := fmt.Sprintf("%s/tcpdump/pcap/%s", conf.Get("ne.omcdir"), body.FileName)
|
||||
err = ssh.FileSCPNeToLocal(neInfo.Ip, nePath, localPath)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
ctx.FileAttachment(w, r, localPath, body.FileName)
|
||||
}
|
||||
|
||||
// TcpdumpNeUPFTask 网元UPF发送执行 pcap
|
||||
func TcpdumpNeUPFTask(w http.ResponseWriter, r *http.Request) {
|
||||
var body struct {
|
||||
NeType string `json:"neType"` // 网元类型
|
||||
NeId string `json:"neId"` // 网元ID
|
||||
Cmd string `json:"cmd"` // 命令
|
||||
RunType string `json:"runType"` // 执行开始start还是停止stop
|
||||
}
|
||||
err := ctx.ShouldBindJSON(r, &body)
|
||||
if err != nil || body.NeType != "UPF" || body.NeId == "" || body.Cmd == "" {
|
||||
ctx.JSON(w, 400, result.CodeMsg(400, "parameter error"))
|
||||
return
|
||||
}
|
||||
|
||||
neInfo, err := NeInfo(body.NeType, body.NeId)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
// 开始telnet
|
||||
if body.RunType == "start_telnet" {
|
||||
// 创建TCP连接
|
||||
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", neInfo.Ip, 5002))
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
filePcapName := fmt.Sprintf("tmp_%s_%s.pcap", body.NeType, body.NeId)
|
||||
cmdStr := fmt.Sprintf("pcap dispatch trace on max 100000 file %s", filePcapName)
|
||||
|
||||
fmt.Fprintln(conn, cmdStr)
|
||||
|
||||
// 读取内容
|
||||
time.Sleep(time.Duration(200) * time.Millisecond)
|
||||
buf := make([]byte, 1024*8)
|
||||
n, err := conn.Read(buf)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
} else {
|
||||
str := string(buf[0:n])
|
||||
s := strings.Index(str, "pcap dispatch trace:")
|
||||
if s != -1 {
|
||||
e := strings.Index(str, "\r\nupfd1#")
|
||||
str = str[s:e]
|
||||
} else {
|
||||
str = fmt.Sprintf("Executed, please stop before proceeding %d", n)
|
||||
}
|
||||
ctx.JSON(w, 200, result.OkData(map[string]any{
|
||||
"cmd": cmdStr,
|
||||
"msg": str,
|
||||
"fileName": filePcapName,
|
||||
}))
|
||||
}
|
||||
conn.Close()
|
||||
return
|
||||
}
|
||||
// 停止telnet
|
||||
if body.RunType == "stop_telnet" {
|
||||
// 创建TCP连接
|
||||
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", neInfo.Ip, 5002))
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
filePcapName := fmt.Sprintf("tmp_%s_%s.pcap", body.NeType, body.NeId)
|
||||
cmdStr := "pcap dispatch trace off"
|
||||
|
||||
fmt.Fprintln(conn, cmdStr)
|
||||
|
||||
// 读取内容
|
||||
time.Sleep(time.Duration(200) * time.Millisecond)
|
||||
buf := make([]byte, 1024*8)
|
||||
n, err := conn.Read(buf)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
} else {
|
||||
str := string(buf[0:n])
|
||||
s := strings.Index(str, "pcap dispatch trace:")
|
||||
if s == -1 {
|
||||
s = strings.Index(str, "Write ")
|
||||
}
|
||||
if s != -1 {
|
||||
e := strings.Index(str, "\r\nupfd1#")
|
||||
str = str[s:e]
|
||||
} else {
|
||||
str = "No stoppable found"
|
||||
}
|
||||
|
||||
ctx.JSON(w, 200, result.OkData(map[string]any{
|
||||
"cmd": cmdStr,
|
||||
"msg": str,
|
||||
"fileName": filePcapName,
|
||||
}))
|
||||
}
|
||||
conn.Close()
|
||||
return
|
||||
}
|
||||
|
||||
// 开始 -脚本
|
||||
if body.RunType == "start2" {
|
||||
fileLogName := fmt.Sprintf("tmp_%s_%s.log", body.NeType, body.NeId)
|
||||
filePcapName := fmt.Sprintf("tmp_%s_%s.pcap", body.NeType, body.NeId)
|
||||
// 复制文件到网元上
|
||||
err := ssh.FileSCPLocalToNe(neInfo.Ip, "C:\\AMP\\Probject\\ems_backend\\restagent\\backup\\upf_pcap", "/tmp")
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
writeLog := fmt.Sprintf(" >> %s 2>&1 \ncat %s", fileLogName, fileLogName) // 执行信息写入日志文件,放置弹出code 127
|
||||
cmdStr := fmt.Sprintf("cd /tmp \nchmod +x upf_pcap\n./upf_pcap '192.168.4.139' 'root' 'Admin123@pl' 'pcap dispatch trace on max 100000 file %s' %s ", fileLogName, writeLog)
|
||||
|
||||
usernameNe := conf.Get("ne.user").(string) // 网元统一用户
|
||||
sshHost := fmt.Sprintf("%s@%s", usernameNe, neInfo.Ip)
|
||||
msg, err := cmd.ExecWithCheck("ssh", sshHost, cmdStr)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
} else {
|
||||
ctx.JSON(w, 200, result.OkData(map[string]any{
|
||||
"cmd": cmdStr,
|
||||
"msg": msg,
|
||||
"fileName": filePcapName,
|
||||
}))
|
||||
}
|
||||
return
|
||||
}
|
||||
// 停止 -脚本
|
||||
if body.RunType == "stop2" {
|
||||
fileLogName := fmt.Sprintf("tmp_%s_%s.log", body.NeType, body.NeId)
|
||||
filePcapName := fmt.Sprintf("tmp_%s_%s.pcap", body.NeType, body.NeId)
|
||||
// cmdStr := "cd /tmp \nexpect /tmp/cat.sh "
|
||||
err := ssh.FileSCPLocalToNe(neInfo.Ip, "C:\\AMP\\Probject\\ems_backend\\restagent\\backup\\upf_pcap", "/tmp")
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
writeLog := fmt.Sprintf(" >> %s 2>&1 \ncat %s", fileLogName, fileLogName) // 执行信息写入日志文件,放置弹出code 127
|
||||
cmdStr := fmt.Sprintf("cd /tmp \nchmod +x upf_pcap\n./upf_pcap '192.168.4.139' 'root' 'Admin123@pl' 'pcap dispatch trace off' %s ", writeLog)
|
||||
|
||||
usernameNe := conf.Get("ne.user").(string) // 网元统一用户
|
||||
sshHost := fmt.Sprintf("%s@%s", usernameNe, neInfo.Ip)
|
||||
msg, err := cmd.ExecWithCheck("ssh", sshHost, cmdStr)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
} else {
|
||||
ctx.JSON(w, 200, result.OkData(map[string]any{
|
||||
"cmd": cmdStr,
|
||||
"msg": msg,
|
||||
"fileName": filePcapName,
|
||||
}))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 开始-脚本字符串
|
||||
if body.RunType == "start_str" {
|
||||
fileLogName := fmt.Sprintf("tmp_%s_%s.log", body.NeType, body.NeId)
|
||||
filePcapName := fmt.Sprintf("tmp_%s_%s.pcap", body.NeType, body.NeId)
|
||||
scriptStr := "set capcmd [lindex $argv 0]\nspawn telnet localhost 5002\nexpect \"upfd1# \"\nsend \"$capcmd\\n\"\nexpect \"upfd1# \"\nsend \"quit\\n\"\nexpect \"eof\""
|
||||
writeLog := fmt.Sprintf(" > %s 2>&1 \ncat %s", fileLogName, fileLogName) // 执行信息写入日志文件输出,避免弹出code 127
|
||||
|
||||
capCmdStr := fmt.Sprintf("%s file %s", body.Cmd, filePcapName)
|
||||
|
||||
cmdStr := fmt.Sprintf("cd /tmp\n\necho '%s' > cap.sh\n\nchmod +x cap.sh\n\nexpect ./cap.sh '%s'%s", scriptStr, capCmdStr, writeLog)
|
||||
usernameNe := conf.Get("ne.user").(string) // 网元统一用户
|
||||
sshHost := fmt.Sprintf("%s@%s", usernameNe, neInfo.Ip)
|
||||
msg, err := cmd.ExecWithCheck("ssh", sshHost, cmdStr)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
} else {
|
||||
s := strings.Index(msg, "pcap dispatch trace:")
|
||||
if s != -1 {
|
||||
e := strings.Index(msg, "\r\nupfd1#")
|
||||
msg = msg[s:e]
|
||||
} else {
|
||||
msg = "Executed, please stop before proceeding"
|
||||
}
|
||||
ctx.JSON(w, 200, result.OkData(map[string]any{
|
||||
"cmd": capCmdStr,
|
||||
"msg": msg,
|
||||
"fileName": filePcapName,
|
||||
}))
|
||||
}
|
||||
return
|
||||
}
|
||||
// 停止-脚本字符串
|
||||
if body.RunType == "stop_str" {
|
||||
fileLogName := fmt.Sprintf("tmp_%s_%s.log", body.NeType, body.NeId)
|
||||
filePcapName := fmt.Sprintf("tmp_%s_%s.pcap", body.NeType, body.NeId)
|
||||
scriptStr := "set capcmd [lindex $argv 0]\nspawn telnet localhost 5002\nexpect \"upfd1# \"\nsend \"$capcmd\\n\"\nexpect \"upfd1# \"\nsend \"quit\\n\"\nexpect \"eof\""
|
||||
writeLog := fmt.Sprintf(" > %s 2>&1 \ncat %s", fileLogName, fileLogName) // 执行信息写入日志文件输出,避免弹出code 127
|
||||
|
||||
capCmdStr := body.Cmd
|
||||
|
||||
cmdStr := fmt.Sprintf("cd /tmp\n\necho '%s' > cap.sh\n\nchmod +x cap.sh\n\nexpect ./cap.sh '%s'%s", scriptStr, capCmdStr, writeLog)
|
||||
|
||||
usernameNe := conf.Get("ne.user").(string) // 网元统一用户
|
||||
sshHost := fmt.Sprintf("%s@%s", usernameNe, neInfo.Ip)
|
||||
msg, err := cmd.ExecWithCheck("ssh", sshHost, cmdStr)
|
||||
if err != nil {
|
||||
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
|
||||
} else {
|
||||
s := strings.Index(msg, "pcap dispatch trace:")
|
||||
if s == -1 {
|
||||
s = strings.Index(msg, "Write ")
|
||||
}
|
||||
if s != -1 {
|
||||
e := strings.Index(msg, "\r\nupfd1#")
|
||||
msg = msg[s:e]
|
||||
} else {
|
||||
msg = "No stoppable found"
|
||||
}
|
||||
ctx.JSON(w, 200, result.OkData(map[string]any{
|
||||
"cmd": capCmdStr,
|
||||
"msg": msg,
|
||||
"fileName": filePcapName,
|
||||
}))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
ctx.JSON(w, 200, result.ErrMsg("runType is start or stop"))
|
||||
}
|
||||
437
features/trace/trace.go
Normal file
437
features/trace/trace.go
Normal file
@@ -0,0 +1,437 @@
|
||||
package trace
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/go-resty/resty/v2"
|
||||
"github.com/gorilla/mux"
|
||||
|
||||
"nms_nbi/lib/dborm"
|
||||
"nms_nbi/lib/global"
|
||||
"nms_nbi/lib/log"
|
||||
"nms_nbi/lib/run"
|
||||
"nms_nbi/lib/services"
|
||||
"nms_nbi/restagent/config"
|
||||
)
|
||||
|
||||
var (
|
||||
UriTraceTaskV1 = config.DefaultUriPrefix + "/traceManagement/v1/subscriptions"
|
||||
UriTraceTask = config.DefaultUriPrefix + "/traceManagement/{apiVersion}/subscriptions"
|
||||
UriTraceRawMsg = config.DefaultUriPrefix + "/traceManagement/{apiVersion}/rawMessage/{id}"
|
||||
UriTraceDecMsg = config.DefaultUriPrefix + "/traceManagement/{apiVersion}/decMessage/{id}" // decode message api
|
||||
|
||||
CustomUriTraceTaskV1 = config.UriPrefix + "/traceManagement/v1/subscriptions"
|
||||
CustomUriTraceTask = config.UriPrefix + "/traceManagement/{apiVersion}/subscriptions"
|
||||
)
|
||||
|
||||
type TraceTask struct {
|
||||
Id int `json:"id" xorm:"pk 'id' autoincr"`
|
||||
TraceType string `json:"traceType"`
|
||||
StartTime string `json:"startTime"`
|
||||
EndTime string `json:"endTime"`
|
||||
Imsi string `json:"imsi"`
|
||||
Msisdn string `json:"msisdn"`
|
||||
SrcIp string `json:"srcIp"`
|
||||
DstIp string `json:"dstIp"`
|
||||
SignalPort int16 `json:"signalPort"`
|
||||
NeType string `json:"neType"`
|
||||
NeId string `json:"neId"`
|
||||
UeIp string `json:"ueIp"`
|
||||
Interfaces []string `json:"interfaces"`
|
||||
NotifyUrl string `json:"notifyUrl" xorm:"-"`
|
||||
Status string `json:"-" xorm:"status"`
|
||||
SuccNEs []string `json:"-" xorm:"succ_nes"`
|
||||
FailNEs []string `json:"-" xorm:"fail_nes"`
|
||||
AccountID string `json:"accountId" xorm:"account_id"`
|
||||
Comment string `json:"comment" xorm:"comment"`
|
||||
UpdateTime string `json:"-" xorm:"-"`
|
||||
}
|
||||
|
||||
var client = resty.New()
|
||||
|
||||
/*
|
||||
func init() {
|
||||
client.SetTimeout(3 * time.Second)
|
||||
}
|
||||
*/
|
||||
|
||||
// Post trace task to NF/NFs
|
||||
func PostTraceTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("PostTraceTaskToNF processing... ")
|
||||
|
||||
//vars := mux.Vars(r)
|
||||
|
||||
token, err := services.CheckFrontValidRequest(w, r)
|
||||
if err != nil {
|
||||
log.Error("Request error:", err)
|
||||
return
|
||||
}
|
||||
log.Debug("AccessToken:", token)
|
||||
|
||||
body, err := io.ReadAll(io.LimitReader(r.Body, int64(config.GetYamlConfig().Params.UriMaxLen)))
|
||||
if err != nil {
|
||||
log.Error("io.ReadAll is failed:", err)
|
||||
services.ResponseNotFound404UriNotExist(w, r)
|
||||
return
|
||||
}
|
||||
log.Trace("body:", string(body))
|
||||
|
||||
traceTask := new(TraceTask)
|
||||
_ = json.Unmarshal(body, traceTask)
|
||||
log.Debug("traceTask:", traceTask)
|
||||
|
||||
var neTypes []string
|
||||
// do not set device
|
||||
if traceTask.NeType == "" {
|
||||
// query neType by interface
|
||||
if len(traceTask.Interfaces) > 0 {
|
||||
err := dborm.XormGetSingleColStringArrayByIn("trace_info", "ne_type", "interface", traceTask.Interfaces, &neTypes)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormGetSingleCol:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
neTypes = []string{"AMF", "SMF", "UDM", "AUSF", "UPF"}
|
||||
}
|
||||
} else {
|
||||
neTypes = append(neTypes, traceTask.NeType)
|
||||
}
|
||||
log.Debug("neTypes:", neTypes)
|
||||
|
||||
traceTask.Status = "Inactive"
|
||||
_, err = dborm.XormInsertTableOne("trace_task", traceTask)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormInsertTableOne:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
traceTask.NotifyUrl = config.GetYamlConfig().OMC.GtpUri
|
||||
log.Trace("traceTask:", traceTask)
|
||||
|
||||
for _, neType := range neTypes {
|
||||
var neInfos []dborm.NeInfo
|
||||
if traceTask.NeId == "" {
|
||||
err := dborm.XormGetNeInfoByNeType(neType, &neInfos)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormGetNeInfoByNeType:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
neInfo, err := dborm.XormGetNeInfo(neType, traceTask.NeId)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormGetNeInfoByNeType:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
neInfos = append(neInfos, *neInfo)
|
||||
}
|
||||
for _, neInfo := range neInfos {
|
||||
hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port)
|
||||
requestURI2NF := fmt.Sprintf("%s%s", hostUri, UriTraceTaskV1)
|
||||
log.Debug("requestURI2NF:", requestURI2NF)
|
||||
|
||||
body, _ := json.Marshal(traceTask)
|
||||
log.Debug("body:", string(body))
|
||||
resp, err := client.R().
|
||||
EnableTrace().
|
||||
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
|
||||
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
|
||||
SetBody(body).
|
||||
Post(requestURI2NF)
|
||||
if err != nil {
|
||||
log.Error("Failed to Post:", err)
|
||||
failNE := fmt.Sprintf("%s.%s", neInfo.NeType, neInfo.NeId)
|
||||
traceTask.FailNEs = append(traceTask.FailNEs, failNE)
|
||||
} else {
|
||||
switch resp.StatusCode() {
|
||||
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
||||
succNE := fmt.Sprintf("%s.%s", neInfo.NeType, neInfo.NeId)
|
||||
traceTask.SuccNEs = append(traceTask.SuccNEs, succNE)
|
||||
default:
|
||||
log.Warnf("Post return code:%d, message:%s", resp.StatusCode(), string(resp.Body()))
|
||||
failNE := fmt.Sprintf("%s.%s", neInfo.NeType, neInfo.NeId)
|
||||
traceTask.FailNEs = append(traceTask.FailNEs, failNE)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if len(traceTask.SuccNEs) > 0 {
|
||||
traceTask.Status = "Active"
|
||||
_, err = dborm.XormUpdateTableById(traceTask.Id, "trace_task", traceTask)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormUpdateTableById:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
services.ResponseStatusOK204NoContent(w)
|
||||
} else {
|
||||
traceTask.Status = "Failed"
|
||||
_, err = dborm.XormUpdateTableById(traceTask.Id, "trace_task", traceTask)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormUpdateTableById:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
err = global.ErrTraceFailedDistributeToNEs
|
||||
log.Error(err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func PutTraceTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("PutTraceTaskToNF processing... ")
|
||||
|
||||
//vars := mux.Vars(r)
|
||||
|
||||
token, err := services.CheckFrontValidRequest(w, r)
|
||||
if err != nil {
|
||||
log.Error("Request error:", err)
|
||||
return
|
||||
}
|
||||
log.Debug("AccessToken:", token)
|
||||
|
||||
body, err := io.ReadAll(io.LimitReader(r.Body, int64(config.GetYamlConfig().Params.UriMaxLen)))
|
||||
if err != nil {
|
||||
log.Error("io.ReadAll is failed:", err)
|
||||
services.ResponseNotFound404UriNotExist(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
traceTask := new(TraceTask)
|
||||
_ = json.Unmarshal(body, traceTask)
|
||||
|
||||
traceTask.NotifyUrl = config.GetYamlConfig().OMC.GtpUri
|
||||
log.Debug("traceTask:", traceTask)
|
||||
|
||||
var neTypes []string
|
||||
// do not set device
|
||||
if traceTask.NeType == "" {
|
||||
// query neType by interface
|
||||
if len(traceTask.Interfaces) > 0 {
|
||||
err := dborm.XormGetSingleColStringArrayByIn("trace_info", "ne_type", "interface", traceTask.Interfaces, &neTypes)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormGetSingleColStringArrayByIn:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
neTypes = []string{"AMF", "SMF", "UDM", "AUSF", "UPF"}
|
||||
}
|
||||
|
||||
} else {
|
||||
neTypes = append(neTypes, traceTask.NeType)
|
||||
}
|
||||
log.Debug("neTypes:", neTypes)
|
||||
|
||||
for _, neType := range neTypes {
|
||||
var neInfos []dborm.NeInfo
|
||||
if traceTask.NeId == "" {
|
||||
err := dborm.XormGetNeInfoByNeType(neType, &neInfos)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormGetNeInfoByNeType:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
neInfo, err := dborm.XormGetNeInfo(neType, traceTask.NeId)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormGetNeInfoByNeType:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
neInfos = append(neInfos, *neInfo)
|
||||
}
|
||||
for _, neInfo := range neInfos {
|
||||
hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port)
|
||||
requestURI2NF := fmt.Sprintf("%s%s", hostUri, UriTraceTaskV1)
|
||||
log.Debug("requestURI2NF:", requestURI2NF)
|
||||
|
||||
body, _ := json.Marshal(traceTask)
|
||||
log.Debug("body:", string(body))
|
||||
resp, err := client.R().
|
||||
EnableTrace().
|
||||
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
|
||||
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
|
||||
SetBody(body).
|
||||
Put(requestURI2NF)
|
||||
if err != nil {
|
||||
log.Error("Failed to Put:", err)
|
||||
failNE := fmt.Sprintf("%s.%s", neInfo.NeType, neInfo.NeId)
|
||||
traceTask.FailNEs = append(traceTask.FailNEs, failNE)
|
||||
} else {
|
||||
switch resp.StatusCode() {
|
||||
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
||||
succNE := fmt.Sprintf("%s.%s", neInfo.NeType, neInfo.NeId)
|
||||
traceTask.SuccNEs = append(traceTask.SuccNEs, succNE)
|
||||
default:
|
||||
log.Warn("Post return code:%d, message:%s", resp.StatusCode(), string(resp.Body()))
|
||||
failNE := fmt.Sprintf("%s.%s", neInfo.NeType, neInfo.NeId)
|
||||
traceTask.FailNEs = append(traceTask.FailNEs, failNE)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if len(traceTask.SuccNEs) > 0 {
|
||||
traceTask.Status = "Active"
|
||||
_, err = dborm.XormUpdateTableById(traceTask.Id, "trace_task", traceTask)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormUpdateTableById:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
services.ResponseStatusOK204NoContent(w)
|
||||
} else {
|
||||
traceTask.Status = "Failed"
|
||||
_, err = dborm.XormUpdateTableById(traceTask.Id, "trace_task", traceTask)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormUpdateTableById:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
err = global.ErrTraceFailedDistributeToNEs
|
||||
log.Error(err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func DeleteTraceTaskToNF(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("DeleteTraceTaskToNF processing... ")
|
||||
|
||||
token, err := services.CheckFrontValidRequest(w, r)
|
||||
if err != nil {
|
||||
log.Error("Request error:", err)
|
||||
return
|
||||
}
|
||||
log.Debug("AccessToken:", token)
|
||||
|
||||
vars := r.URL.Query()
|
||||
ids, ok := vars["id"]
|
||||
if !ok || len(ids) == 0 {
|
||||
err = global.ErrTraceNotCarriedTaskID
|
||||
log.Error(err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
log.Debug("ids:", ids)
|
||||
|
||||
for _, id := range ids {
|
||||
log.Debug("id:", id)
|
||||
|
||||
var succNes []string
|
||||
err = dborm.XormGetColStringArrayByWhere("trace_task", "succ_nes", fmt.Sprintf("id=%s", id), &succNes)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormGetSingleColStringArrayByWhere:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
log.Debug("succNes:", succNes)
|
||||
nes := new([]string)
|
||||
if len(succNes) > 0 {
|
||||
_ = json.Unmarshal([]byte(succNes[0]), nes)
|
||||
}
|
||||
log.Debug("nes:", nes)
|
||||
|
||||
for _, ne := range *nes {
|
||||
i := strings.Index(ne, ".")
|
||||
neType := ne[0:i]
|
||||
neId := ne[i+1:]
|
||||
log.Debugf("ne:%s neType:%s neId:%s", ne, neType, neId)
|
||||
neInfo, err := dborm.XormGetNeInfo(neType, neId)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormGetNeInfo:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port)
|
||||
requestURI2NF := fmt.Sprintf("%s%s?id=%s", hostUri, UriTraceTaskV1, id)
|
||||
log.Debug("requestURI2NF:", requestURI2NF)
|
||||
|
||||
_, err = client.R().
|
||||
EnableTrace().
|
||||
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
|
||||
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
|
||||
Delete(requestURI2NF)
|
||||
if err != nil {
|
||||
log.Error("Failed to Delete:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
_, err = dborm.XormDeleteDataByWhere(fmt.Sprintf("id=%s", id), "trace_task")
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormDeleteDataByWhere:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
services.ResponseStatusOK204NoContent(w)
|
||||
}
|
||||
|
||||
func GetRawMessage(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("GetRawMessage processing... ")
|
||||
|
||||
}
|
||||
|
||||
func ParseRawMsg2Html(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("ParseRawMsg2Html processing... ")
|
||||
|
||||
vars := mux.Vars(r)
|
||||
idStr := vars["id"]
|
||||
id, _ := strconv.Atoi(idStr)
|
||||
|
||||
traceData, err := dborm.XormGetTraceData(id)
|
||||
if err != nil {
|
||||
log.Error("Failed to dborm.XormGetTraceRawMsg:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
log.Trace("traceData:", traceData)
|
||||
filePath := traceData.DecMsg
|
||||
if traceData.DecMsg == "" {
|
||||
htmlFile := fmt.Sprintf("traceDecMessage-%d-%d.html", traceData.TaskID, traceData.ID)
|
||||
filePath = config.GetYamlConfig().OMC.FrontTraceDir + "/" + htmlFile
|
||||
command := fmt.Sprintf("/usr/local/omc/bin/data2html -f %s -t %d -i N%d -d %x", filePath, traceData.Timestamp, traceData.IfType, traceData.RawMsg)
|
||||
out, err := run.ExecCmd(command, "/")
|
||||
log.Tracef("Exec output: %v", string(out))
|
||||
if err != nil {
|
||||
log.Errorf("Faile to ipdate2html:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
exist, err := global.FilePathExists(filePath)
|
||||
if err != nil {
|
||||
log.Errorf("Failed to stat:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
if !exist {
|
||||
err = errors.New(string(strings.ReplaceAll(string(out), "\n", "")))
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
traceData.DecMsg = filePath
|
||||
_, err = dborm.XormUpdateTraceData(id, traceData)
|
||||
if err != nil {
|
||||
log.Errorf("Faile to XormUpdateTraceData:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
services.ResponseHtmlContent(w, http.StatusOK, filePath)
|
||||
}
|
||||
Reference in New Issue
Block a user