diff --git a/features/state/getstate.go b/features/state/getstate.go index dfdcc149..1955a424 100644 --- a/features/state/getstate.go +++ b/features/state/getstate.go @@ -9,6 +9,8 @@ import ( "strings" "time" + "github.com/shirou/gopsutil/v3/net" + "github.com/go-resty/resty/v2" "github.com/gorilla/mux" @@ -726,6 +728,112 @@ func GetAllSysinfoFromNF(w http.ResponseWriter, r *http.Request) { func GetStateFromNF(w http.ResponseWriter, r *http.Request) { log.Debug("GetStateFromNF processing... ") + vars := mux.Vars(r) + neType := vars["elementTypeValue"] + neType = strings.ToLower(neType) + + if neType == "" { + services.ResponseNotFound404UriNotExist(w, r) + return + } + + if neType == "all" { + var neList []dborm.NeInfo + _, err := dborm.XormGetAllNeInfo(&neList) + if err != nil { + log.Error("Failed to get all ne info:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + data := make([]map[string]interface{}, 0) + for _, ne := range neList { + result := make(map[string]interface{}) + hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port) + requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", + hostUri, strings.ToLower(ne.NeType)) + log.Debug("requestURI2NF:", requestURI2NF) + + result["ipAddress"] = ne.Ip + resp, err := client.R(). + EnableTrace(). + 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) + errorMessage := services.ErrorMessage{ + ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused", + } + result["error"] = errorMessage + SN, Version, _ := dborm.XormGetNEStateInfo(ne.NeType, ne.NeId) + result["serialNum"] = SN + result["version"] = Version + } else { + systemState := make(map[string]interface{}) + _ = json.Unmarshal(resp.Body(), &systemState) + result["systemState"] = systemState + } + + neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId + mapState := make(map[string]interface{}) + mapState[neItem] = result + data = append(data, mapState) + log.Trace("data:", data) + } + var response Response + response.Data = data + services.ResponseWithJson(w, http.StatusOK, response) + return + } + + if neType == "omc" { + emsState := GetEMSState("127.0.0.1") + services.ResponseWithJson(w, http.StatusOK, emsState) + return + } + + var neList []dborm.NeInfo + err := dborm.XormGetNeInfoByNeType(neType, &neList) + if err != nil { + log.Error("Failed to dborm.XormGetNeInfoByNeType:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + data := make([]map[string]interface{}, 0) + for _, ne := range neList { + hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port) + requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", + hostUri, strings.ToLower(ne.NeType)) + log.Debug("requestURI2NF:", requestURI2NF) + + resp, err := client.R(). + EnableTrace(). + 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) + } else { + systemState := make(map[string]interface{}) + _ = json.Unmarshal(resp.Body(), &systemState) + data = append(data, systemState) + } + } + + if len(data) == 1 { + services.ResponseWithJson(w, http.StatusOK, data[0]) + return + } + var response Response + response.Data = data + services.ResponseWithJson(w, http.StatusOK, response) +} + +// GetStateFromNF 旧函数 +// Get system state from NF/NFs +func GetStateFromNFOld(w http.ResponseWriter, r *http.Request) { + log.Debug("GetStateFromNF processing... ") + data := make([]map[string]interface{}, 0) vars := mux.Vars(r) @@ -876,6 +984,35 @@ func GetEMSState(ip string) *SysState { PartitionInfo: sysInfo.PartitionInfo, } + // 获取主机的 IP 地址列表 + ipAddrs := []string{ip} + if ip == "" || ip == "127.0.0.1" { + ipAddrs = []string{} + interfaces, err := net.Interfaces() + if err == nil { + for _, iface := range interfaces { + for _, v := range iface.Addrs { + name := iface.Name + if name[len(name)-1] == '0' { + name = name[0 : len(name)-1] + name = strings.Trim(name, "") + } + // ignore localhost + if name == "lo" { + continue + } + prefix := strings.Split(v.Addr, "/")[0] + if strings.Contains(prefix, "::") { + ipAddrs = append(ipAddrs, prefix) + } + if strings.Contains(prefix, ".") { + ipAddrs = append(ipAddrs, prefix) + } + } + } + } + } + version := "16.1.1" if global.Version != "" { version = global.Version @@ -886,7 +1023,7 @@ func GetEMSState(ip string) *SysState { HostName: hostName, OsInfo: getUnameStr(), DbInfo: dbInfo, - IpAddr: []string{ip}, + IpAddr: ipAddrs, Port: config.GetYamlConfig().Rest[0].Port, Version: version, Capability: 9999999,