diff --git a/features/ue/ue.go b/features/ue/ue.go new file mode 100644 index 00000000..06d5949c --- /dev/null +++ b/features/ue/ue.go @@ -0,0 +1,206 @@ +package ue + +import ( + "encoding/json" + "fmt" + "net/http" + "time" + + "ems.agt/lib/dborm" + "ems.agt/lib/global" + "ems.agt/lib/log" + "ems.agt/lib/services" + "ems.agt/restagent/config" + "github.com/go-resty/resty/v2" + "github.com/gorilla/mux" +) + +// AmfNBInfo AMF的NodeB信息 +type AmfNBInfo struct { + ID string `json:"id"` //NodeB ID + Name string `json:"name"` // NodeB name + Address string `json:"address"` // 基站地址 + UENum int `jons:"ueNum"` // UE数量 +} + +// SmfUENum SMF在线用户数 +type SmfUENum struct { + UENum int `json:"ueNum"` // 当前在线用户数 +} + +// SmfUEInfo SMF在线用户信息 +type SmfUEInfo struct { + IMSI string `json:"imsi"` + MSISDN string `json:"msisdn"` + IPv4 []string `json:"ipv4"` + Dnn []string `json:"dnn"` + Tai []string `json:"tai"` + PduSessionID []int `json:"pduSessionID"` + IPv6 []string `json:"ipv6"` + SstSD []string `json:"sstSD"` + UpfN3IP []string `json:"upfN3IP"` + RanN3IP []string `json:"ranN3IP"` + Activetime []string `json:"activeTime"` +} + +// ImsUEInfo IMS在线用户信息 +type ImsUEInfo struct { + IMSI string `json:"imsi"` + MSISDN string `json:"msisdn"` + IMPU string `json:"impu"` + Barring int `json:"barring"` + RegState int `json:"regState"` + Activetime string `json:"activeTime"` +} + +var ( + UriNBInfo = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/nbInfo" + UriUEInfo = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/ueInfo" + UriUENum = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/ueNum" + + CustomUriNBInfo = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/nbInfo" + CustomUriUEInfo = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/ueInfo" + CustomUriUENum = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/ueNum" +) + +var client = resty.New() + +func init() { + /* + client. + SetTimeout(10 * time.Second). + SetRetryCount(1). + SetRetryWaitTime(1 * time.Second). + SetRetryMaxWaitTime(2 * time.Second). + SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) { + return 0, errors.New("quota exceeded") + }) + */ + client.SetTimeout(3 * time.Second) +} + +// Get UEInfo from NF/NFs +func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) { + log.Info("GetUEInfoFromNF processing... ") + + vars := mux.Vars(r) + neType := vars["elementTypeValue"] + if neType == "" { + services.ResponseNotFound404UriNotExist(w, r) + return + } + //neTypeLower := strings.ToLower(neType) + var neId string + neIds := services.GetParamsArrByName("neId", r) + if len(neIds) == 1 { + neId = neIds[0] + } else { + services.ResponseNotFound404UriNotExist(w, r) + return + } + + token, err := services.CheckFrontValidRequest(w, r) + if err != nil { + log.Error("Request error:", err) + return + } + log.Debug("token:", token) + + neInfo, err := dborm.XormGetNeInfo(neType, neId) + if err != nil { + log.Error("Failed to XormGetNeInfo:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } else if neInfo == nil { + err := global.ErrCMNotFoundTargetNE + log.Error(global.ErrCMNotFoundTargetNE) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + log.Trace("neInfo:", neInfo) + + hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) + requestURI2NF := fmt.Sprintf("%s/%s", hostUri, r.RequestURI) + + log.Debug("requestURI2NF:", requestURI2NF) + + resp, err := client.R(). + EnableTrace(). + SetHeaders(map[string]string{"accessToken": token}). + SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). + SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). + Get(requestURI2NF) + if err != nil { + log.Error("Get system state from NF is failed:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } else { + var response services.DataResponse + _ = json.Unmarshal(resp.Body(), &response) + services.ResponseWithJson(w, http.StatusOK, response) + return + } +} + +// Get UEInfo from NF/NFs +func GetNBInfoFromNF(w http.ResponseWriter, r *http.Request) { + log.Info("GetNBInfoFromNF processing... ") + + vars := mux.Vars(r) + neType := vars["elementTypeValue"] + if neType == "" { + services.ResponseNotFound404UriNotExist(w, r) + return + } + //neTypeLower := strings.ToLower(neType) + var neId string + neIds := services.GetParamsArrByName("neId", r) + if len(neIds) == 1 { + neId = neIds[0] + } else { + services.ResponseNotFound404UriNotExist(w, r) + return + } + + token, err := services.CheckFrontValidRequest(w, r) + if err != nil { + log.Error("Request error:", err) + return + } + log.Debug("token:", token) + + neInfo, err := dborm.XormGetNeInfo(neType, neId) + if err != nil { + log.Error("Failed to XormGetNeInfo:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } else if neInfo == nil { + err := global.ErrCMNotFoundTargetNE + log.Error(global.ErrCMNotFoundTargetNE) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + log.Trace("neInfo:", neInfo) + + hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) + requestURI2NF := fmt.Sprintf("%s/%s", hostUri, r.RequestURI) + + log.Debug("requestURI2NF:", requestURI2NF) + + resp, err := client.R(). + EnableTrace(). + SetHeaders(map[string]string{"accessToken": token}). + SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). + SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). + Get(requestURI2NF) + if err != nil { + log.Error("Get system state from NF is failed:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } else { + var response services.DataResponse + _ = json.Unmarshal(resp.Body(), &response) + services.ResponseWithJson(w, http.StatusOK, response) + return + } +} diff --git a/lib/routes/routes.go b/lib/routes/routes.go index 555aa8c2..542e404d 100644 --- a/lib/routes/routes.go +++ b/lib/routes/routes.go @@ -26,6 +26,7 @@ import ( sysuser "ems.agt/features/sys_user" "ems.agt/features/trace" udmuser "ems.agt/features/udm_user" + "ems.agt/features/ue" "ems.agt/lib/midware" "ems.agt/lib/services" @@ -248,10 +249,17 @@ func init() { // AAAA Register("GET", aaaa.UriAAAASSO, aaaa.GetSSOFromAAAA, nil) - // AAAA Register("GET", aaaa.CustomUriAAAASSO, aaaa.GetSSOFromAAAA, nil) + // UEInfo + Register("GET", ue.UriNBInfo, ue.GetUEInfoFromNF, nil) + Register("GET", ue.CustomUriUEInfo, ue.GetUEInfoFromNF, nil) + + // NBInfo + Register("GET", ue.UriNBInfo, ue.GetNBInfoFromNF, nil) + Register("GET", ue.CustomUriNBInfo, ue.GetNBInfoFromNF, nil) + // 进程网络 Register("GET", psnet.UriWs, psnet.ProcessWs, nil) Register("POST", psnet.UriStop, psnet.StopProcess, nil) diff --git a/misc/nehosts b/misc/nehosts index ff69c62e..2336a8a0 100644 --- a/misc/nehosts +++ b/misc/nehosts @@ -1,4 +1,3 @@ # host user password # Example: 192.168.4.133 root password -192.168.4.133 root ****** -192.168.4.134 root ****** \ No newline at end of file +192.168.4.233 root Admin123@pl \ No newline at end of file