From bdec033db48866f023c399b115300f4b696ff2aa Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 15 Jun 2024 16:38:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eue=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=B8=8A=E6=8A=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/event/event.go | 50 ++++++++++++++++++++--- lib/routes/routes.go | 4 ++ restagent/restagent.go | 2 +- src/framework/middleware/pre_authorize.go | 1 + src/modules/ws/processor/ue_connect.go | 4 +- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/features/event/event.go b/features/event/event.go index c0cb25ce..fa43730f 100644 --- a/features/event/event.go +++ b/features/event/event.go @@ -2,26 +2,35 @@ package event import ( "encoding/json" + "fmt" "io" + "net/http" + "strings" "time" + "be.ems/lib/core/utils/ctx" "be.ems/lib/dborm" "be.ems/lib/global" "be.ems/lib/log" "be.ems/lib/services" + "be.ems/restagent/config" wsService "be.ems/src/modules/ws/service" "github.com/gin-gonic/gin" ) var ( - UriUEEvent = "/upload-ue/v1/:eventType" + // 走Gin + UriUEEventAMF = "/upload-ue/v1/:eventType" + // 走Mux + UriUEEvent = config.DefaultUriPrefix + "/logManagement/v1/elementType/{elementTypeValue}/objectType/ueEvent" + CustomUriUEEvent = config.UriPrefix + "/logManagement/v1/elementType/{elementTypeValue}/objectType/ueEvent" ) type UEEvent struct { NeType string `json:"neType" xorm:"ne_type"` NeName string `json:"neName" xorm:"ne_name"` RmUID string `json:"rmUID" xorm:"rm_uid"` - Timestamp int `json:"timestamp" xorm:"timestamp"` + Timestamp int64 `json:"timestamp" xorm:"timestamp"` EventType string `json:"eventType" xorm:"event_type"` EventJson map[string]any `json:"eventJSON" xorm:"event_json"` } @@ -51,13 +60,13 @@ func PostUEEventFromAMF(c *gin.Context) { return } ueEvent.NeType = "AMF" - ueEvent.Timestamp = int(time.Now().Unix()) + ueEvent.Timestamp = time.Now().Unix() ueEvent.EventType = eventType - log.Trace("ueEvent:", ueEvent) + log.Trace("ueEvent AMF:", ueEvent) - affected, err := dborm.XormInsertTableOne("ue_event", ueEvent) + affected, err := dborm.XormInsertTableOne("ue_event_amf", ueEvent) if err != nil && affected <= 0 { - log.Error("Failed to insert ue_event:", err) + log.Error("Failed to insert ue_event_amf:", err) services.ResponseInternalServerError500ProcessError(c.Writer, err) return } @@ -67,3 +76,32 @@ func PostUEEventFromAMF(c *gin.Context) { services.ResponseStatusOK204NoContent(c.Writer) } + +func PostUEEvent(w http.ResponseWriter, r *http.Request) { + log.Info("PostUEEvent processing... ") + + neType := ctx.GetParam(r, "elementTypeValue") + ueEvent := new(UEEvent) + if err := ctx.ShouldBindJSON(r, &ueEvent.EventJson); err != nil { + services.ResponseInternalServerError500ProcessError(w, err) + return + } + + ueEvent.NeType = strings.ToUpper(neType) + ueEvent.Timestamp = time.Now().Unix() + + tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType)) + affected, err := dborm.XormInsertTableOne(tableName, ueEvent) + if err != nil && affected <= 0 { + log.Error("Failed to insert "+tableName, err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + + // 推送到ws订阅组 + if ueEvent.NeType == "MME" { + wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_MME_UE, ueEvent) + } + + services.ResponseStatusOK204NoContent(w) +} diff --git a/lib/routes/routes.go b/lib/routes/routes.go index baddb754..d403e00a 100644 --- a/lib/routes/routes.go +++ b/lib/routes/routes.go @@ -9,6 +9,7 @@ import ( "be.ems/features/cdr" "be.ems/features/cm" "be.ems/features/dbrest" + "be.ems/features/event" "be.ems/features/file" "be.ems/features/fm" "be.ems/features/lm" @@ -289,6 +290,9 @@ func init() { Register("POST", cdr.UriSMFCDREvent, cdr.PostCDREventFromSMF, nil) Register("POST", cdr.CustomUriSMFCDREvent, cdr.PostCDREventFromSMF, nil) + // UE event 上报的UE事件 + Register("POST", event.UriUEEvent, event.PostUEEvent, nil) + // UE event AMF上报的UE事件, 无前缀给到Gin处理 //Register("POST", event.UriUEEvent, event.PostUEEventFromAMF, nil) diff --git a/restagent/restagent.go b/restagent/restagent.go index ec8afd3c..734cf30e 100644 --- a/restagent/restagent.go +++ b/restagent/restagent.go @@ -249,7 +249,7 @@ func main() { uriGroup := app.Group(config.UriPrefix) uriGroup.Any("/*any", gin.WrapH(routes.NewRouter())) // AMF上报的UE事件, 无前缀,暂时特殊处理 - app.POST(event.UriUEEvent, event.PostUEEventFromAMF) + app.POST(event.UriUEEventAMF, event.PostUEEventFromAMF) var listenLocalhost bool = false for _, rest := range conf.Rest { diff --git a/src/framework/middleware/pre_authorize.go b/src/framework/middleware/pre_authorize.go index d840a9f3..588ad292 100644 --- a/src/framework/middleware/pre_authorize.go +++ b/src/framework/middleware/pre_authorize.go @@ -20,6 +20,7 @@ var URL_WHITE_LIST = []string{ "/systemState", "/omcNeConfig", "/cdrEvent", + "/ueEvent", "/upload-ue", "/oauth/token", } diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index 32a4d7c8..1a4310e4 100644 --- a/src/modules/ws/processor/ue_connect.go +++ b/src/modules/ws/processor/ue_connect.go @@ -13,14 +13,14 @@ import ( // GetUEConnectByAMF 获取UE会话事件-AMF func GetUEConnectByAMF(requestID string, data any) ([]byte, error) { msgByte, _ := json.Marshal(data) - var query neDataModel.UEEventQuery + var query neDataModel.UEEventAMFQuery err := json.Unmarshal(msgByte, &query) if err != nil { logger.Warnf("ws processor GetUEConnect err: %s", err.Error()) return nil, fmt.Errorf("query data structure error") } - dataMap := neDataService.NewUEEventImpl.SelectPage(query) + dataMap := neDataService.NewUEEventAMFImpl.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap,