diff --git a/features/aaaa/aaaa.go b/features/aaaa/aaaa.go deleted file mode 100644 index c6dde188..00000000 --- a/features/aaaa/aaaa.go +++ /dev/null @@ -1,142 +0,0 @@ -package aaaa - -import ( - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "github.com/go-resty/resty/v2" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/log" - "be.ems/lib/oauth" - "be.ems/lib/services" -) - -var ( - UriAAAASSO = config.DefaultUriPrefix + "/aaaa/{apiVersion}/security/sso" // for 4A external - - CustomUriAAAASSO = config.UriPrefix + "/aaaa/{apiVersion}/security/sso" // for 4A external -) - -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) -} - -type AAAATicket struct { - Ticket string `json:"ticket"` -} - -type SSOResult struct { - SSO struct { - Result string `json:"result"` - ResultMsg string `json:"result_msg"` - Ticket string `json:"ticket"` - ResultMsgcode string `json:"result_msgcode"` - Account []struct { - Accid string `json:"accid"` - } `json:"account"` - } `json:"sso"` -} - -// Get system state from NF/NFs -func GetSSOFromAAAA(w http.ResponseWriter, r *http.Request) { - log.Info("GetSSOFromAAAA processing... ") - - vars := r.URL.Query() - ticket := vars["ticket"] - if len(ticket) == 0 { - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Debug("ticket:", ticket) - - log.Debugf("r.RemoteAddr:%s r.Host: %s", r.RemoteAddr, r.Host) - - aaaaIp := r.RemoteAddr[:strings.Index(r.RemoteAddr, ":")] - omcIp := r.Host[:strings.Index(r.Host, ":")] - - log.Debugf("aaaaIp=%s omcIp=%s", aaaaIp, omcIp) - requestURI2NF := fmt.Sprintf("http://%s:8080/qryUserByTicket", aaaaIp) - - log.Debug("requestURI2NF:", requestURI2NF) - - aaaaTicket := &AAAATicket{ - Ticket: ticket[0], - } - - body, err := json.Marshal(aaaaTicket) - if err != nil { - log.Error("Failed to json.Marshal:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - response, 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) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("response:", response) - - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - ssoResult := new(SSOResult) - json.Unmarshal(response.Body(), ssoResult) - var accid string - if len(ssoResult.SSO.Account) != 0 { - accid = ssoResult.SSO.Account[0].Accid - } - - log.Debug("accid:", accid) - exist, err := dborm.XormIsExistUser(accid) - if err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - token := oauth.GenRandToken("aaaa") // Generate new token to session ID - affected, err := dborm.XormInsertSession(accid, r.RemoteAddr, token, - config.GetExpiresFromConfig(), config.GetYamlConfig().Auth.Session) - if err != nil { - log.Error("Failed to XormInsertSession:", err) - if affected == -1 { - services.ResponseForbidden403MultiLoginNotAllowed(w) - } else { - services.ResponseBadRequest400IncorrectLogin(w) - } - return - } - if exist == true { - redirectUrl := fmt.Sprintf("http://%s:8888/home.html?user=%s&token=%s", omcIp, accid, token) - services.ResponseRedirect(w, redirectUrl, accid, token) - return - } else { - services.ResponseBadRequest400IncorrectLogin(w) - return - } - default: - services.ResponseForbidden403NotPermission(w) - return - } -} diff --git a/features/cdr/cdrevent.go b/features/cdr/cdrevent.go deleted file mode 100644 index 47a74f5c..00000000 --- a/features/cdr/cdrevent.go +++ /dev/null @@ -1,102 +0,0 @@ -package cdr - -import ( - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - neService "be.ems/src/modules/network_element/service" - wsService "be.ems/src/modules/ws/service" -) - -var ( - UriCDREvent = config.DefaultUriPrefix + "/cdrManagement/v1/elementType/{elementTypeValue}/objectType/cdrEvent" - UriCDRFile = config.DefaultUriPrefix + "/cdrManagement/v1/elementType/{elementTypeValue}/objectType/cdrFile" - - CustomUriCDREvent = config.UriPrefix + "/cdrManagement/v1/elementType/{elementTypeValue}/objectType/cdrEvent" - CustomUriCDRFile = config.UriPrefix + "/cdrManagement/v1/elementType/{elementTypeValue}/objectType/cdrFile" -) - -// PostCDREventFrom 接收CDR数据请求 -func PostCDREventFrom(w http.ResponseWriter, r *http.Request) { - log.Info("PostCDREventFrom processing... ") - neType := ctx.GetParam(r, "elementTypeValue") - var body struct { - NeType string `json:"neType" ` - NeName string `json:"neName" ` - RmUID string `json:"rmUID" ` - Timestamp int `json:"timestamp" ` - CDR map[string]any `json:"CDR" ` - } - if err := ctx.ShouldBindJSON(r, &body); err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - neTypeLower := strings.ToLower(body.NeType) - if neType == "" || neType != neTypeLower { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("inconsistent network element types")) - return - } - - // 是否存在网元 - neInfo := neService.NewNeInfo.FindByRmuid(body.RmUID) - if neInfo.NeType != body.NeType || neInfo.RmUID != body.RmUID { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("network element does not exist")) - return - } - - cdrByte, err := json.Marshal(body.CDR) - if err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 执行插入表 - type CDREvent struct { - ID int64 `json:"-" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUid string `json:"rmUid" gorm:"column:rm_uid"` - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - CdrJson string `json:"cdrJSON" gorm:"column:cdr_json"` // data JSON String - CreatedAt int64 `json:"-" gorm:"column:created_at"` // 记录创建存储毫秒 - } - data := CDREvent{ - NeType: body.NeType, - NeName: body.NeName, - RmUid: body.RmUID, - Timestamp: int64(body.Timestamp) * 1000, - CdrJson: string(cdrByte), - CreatedAt: time.Now().UnixMilli(), - } - tableName := fmt.Sprintf("cdr_event_%s", neTypeLower) - if err := db.DB("").Table(tableName).Create(&data).Error; err != nil { - log.Error("Failed to insert "+tableName, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 推送到ws订阅组 - switch neInfo.NeType { - case "IMS": - if v, ok := body.CDR["recordType"]; ok && (v == "MOC" || v == "MTSM") { - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_IMS_CDR, neInfo.NeId), data) - } - case "SMF": - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMF_CDR, neInfo.NeId), data) - case "SMSC": - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMSC_CDR, neInfo.NeId), data) - case "SGWC": - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SGWC_CDR, neInfo.NeId), data) - } - - services.ResponseStatusOK204NoContent(w) -} diff --git a/features/cm/exec_linux.go b/features/cm/exec_linux.go deleted file mode 100644 index b8b7b36f..00000000 --- a/features/cm/exec_linux.go +++ /dev/null @@ -1,95 +0,0 @@ -//go:build linux -// +build linux - -package cm - -import ( - "bytes" - "context" - "os/exec" - "time" - - "be.ems/lib/log" -) - -func ExecCmd(command string) error { - log.Debug("Exec command:", command) - - cmd := exec.Command("/bin/bash", "-c", command) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - /* - if err := cmd.Start(); err != nil { - log.Error("Start error: ", err) - return err - } - if err := cmd.Wait(); err != nil { - log.Error("Wait error: ", err) - return err - } - */ - return nil -} - -func ExecShell(command string) error { - in := bytes.NewBuffer(nil) - cmd := exec.Command("sh") - cmd.Stdin = in - in.WriteString(command) - in.WriteString("exit\n") - if err := cmd.Start(); err != nil { - return err - } - return nil -} - -func ExecOsCmd(command, os string) error { - log.Debugf("Exec %s command:%s", os, command) - - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - return nil -} - -func StartSSHCmdWithTimeout(duration int, sshHost, cmdStr string) error { - timeout := time.Duration(duration) * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) // 设置超时 - defer cancel() - cmd := exec.CommandContext(ctx, "ssh", sshHost, cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Start() - if err != nil { - return err - } - return nil -} - -func RunSSHCmd(sshHost, cmdStr string) error { - cmd := exec.Command("ssh", sshHost, cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if err != nil { - return err - } - return nil -} diff --git a/features/cm/exec_windows.go b/features/cm/exec_windows.go deleted file mode 100644 index 9e151bf7..00000000 --- a/features/cm/exec_windows.go +++ /dev/null @@ -1,83 +0,0 @@ -//go:build windows -// +build windows - -package cm - -import ( - "bytes" - "context" - "os/exec" - "time" - - "be.ems/lib/log" -) - -func ExecCmd(command string) error { - log.Debug("Exec command:", command) - - cmd := exec.Command("cmd", "/C", command) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - /* - if err := cmd.Start(); err != nil { - log.Error("Start error: ", err) - return err - } - if err := cmd.Wait(); err != nil { - log.Error("Wait error: ", err) - return err - } - */ - return nil -} - -func ExecOsCmd(command, os string) error { - log.Debugf("Exec %s command:%s", os, command) - - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("exe cmd error: ", err) - return err - } - return nil -} - -func StartSSHCmdWithTimeout(duration int, sshHost, cmdStr string) error { - timeout := time.Duration(duration) * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) // 设置超时 - defer cancel() - cmd := exec.CommandContext(ctx, "ssh", sshHost, cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Start() - if err != nil { - return err - } - return nil -} - -func RunSSHCmd(sshHost, cmdStr string) error { - cmd := exec.Command("ssh", sshHost, cmdStr) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - if err != nil { - return err - } - return nil -} diff --git a/features/cm/ne.go b/features/cm/ne.go deleted file mode 100644 index f9cc9670..00000000 --- a/features/cm/ne.go +++ /dev/null @@ -1,991 +0,0 @@ -package cm - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "os/exec" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/constants" - "be.ems/src/framework/database/db" - neService "be.ems/src/modules/network_element/service" - - "github.com/go-resty/resty/v2" - "github.com/gorilla/mux" -) - -var ( - // NE CM export/import - NeCmUri = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm" - // NE info - UriNeInfo = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo" - // NE backup file - UriNeCmFile = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}" - // service action uri, action: start/stop/restart - UriNeService = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/service/{action}" - // nf instance action uri, action: start/stop/restart - UriNeInstance = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/instance/{action}" - - CustomNeCmUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm" - CustomUriNeInfo = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo" - CustomUriNeCmFile = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}" - // service action uri, action: start/stop/restart - CustomUriNeService = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/service/{action}" - // nf instance action uri, action: start/stop/restart - CustomUriNeInstance = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/instance/{action}" -) - -const ( - NEStatusActive = 0 - NEStatusOffline = 1 - NEStatusStandby = 2 - NEStatusMaintain = 3 -) - -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(time.Duration(1 * time.Second)) -} - -func GetNeInfo(w http.ResponseWriter, r *http.Request) { - log.Debug("GetNeInfo processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neId := services.GetUriParamString(r, "ne_id", ",", false, false) - - // no, _ := strconv.ParseInt(neId, 10, 64) - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - var response services.DataResponse - response.Data = neInfo - services.ResponseWithJson(w, http.StatusOK, response) -} - -type OmcNeConfig struct { - NeId string `json:"neId" xorm:"ne_id"` // 网元标识(内部), - RmUID string `json:"rmUID" xorm:"rm_uid"` // rmUID 网元唯一标识 - NeName string `json:"neName" xorm:"ne_name"` // 网元名称(内部)/友好名称(北向资源/性能等使用) - PvFlag string `json:"pvFlag" xorm:"pv_flag"` // 网元虚实性标识 VNF/PNF: 虚拟/物理 - Province string `json:"province" xorm:"province"` // 网元所在省份 - VendorName string `json:"vendorName" xorm:"vendor_name"` // 厂商名称 - // ManagedBy string `json:"managedBy" xorm:"managed_by"` // 管理ManagedElement的ManagementNode对象类的DN值 - Dn string `json:"dn" xorm:"dn"` // 资源里边的ManagedBy,性能的Dn,网络唯一标识 -} - -func PostNeInfo(w http.ResponseWriter, r *http.Request) { - log.Debug("PostNeInfo processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - syncFlag := services.GetUriParamString(r, "sync2ne", ",", false, false) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to o.ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - neInfo := new(dborm.NeInfo) - err = json.Unmarshal(body, neInfo) - if err != nil { - log.Error("Failed to json.Unmarshal:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - //neInfo.UpdateTime = time.Now().Format(time.DateTime) - neInfo.UpdateTime = time.Now() - log.Debug("NE info:", neInfo) - - //if !config.GetYamlConfig().OMC.Chk2Ne { - if syncFlag == "false" || neTypeUpper == config.GetYamlConfig().OMC.NeType { - neInfo.Status = NEStatusMaintain - affected, err := dborm.XormInsertNeInfo(neInfo) - if err != nil { - log.Error("Failed to insert Ne info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) - return - } else { - hostUri := global.CombineHostUri(neInfo.Ip, neInfo.Port) - //hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - apiUri := fmt.Sprintf("%s/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig?ne_id=%s", config.DefaultUriPrefix, strings.ToLower(neInfo.NeType), neInfo.NeId) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri) - log.Debug("requestURI2NF:", requestURI2NF) - - omcNeConfig := &OmcNeConfig{ - NeId: neInfo.NeId, - RmUID: neInfo.RmUID, - NeName: neInfo.NeName, - PvFlag: neInfo.PvFlag, - Province: neInfo.Province, - VendorName: neInfo.VendorName, - Dn: neInfo.Dn, - } - body, _ = json.Marshal(omcNeConfig) - response, 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) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Info("StatusCode: ", response.StatusCode()) - - respMsg := make(map[string]interface{}) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - neInfo.Status = NEStatusActive - affected, err := dborm.XormInsertNeInfo(neInfo) - if err != nil { - log.Error("Failed to dborm.XormInsertNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if affected <= 0 { - log.Infof("Not record affected to insert ne_info") - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - services.ResponseStatusOK204NoContent(w) - return - default: - log.Info("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) - return - } -} - -func PutNeInfo(w http.ResponseWriter, r *http.Request) { - log.Debug("PutNeInfo processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeLower := strings.ToLower(neType) - neTypeUpper := strings.ToUpper(neType) - syncFlag := services.GetUriParamString(r, "sync2ne", ",", false, false) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to io.ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := new(dborm.NeInfo) - _ = json.Unmarshal(body, neInfo) - neInfo.NeType = strings.ToUpper(neType) - neInfo.UpdateTime = time.Now() - log.Debug("NE info:", neInfo) - - //if !config.GetYamlConfig().OMC.Chk2Ne { - if syncFlag == "false" || neTypeUpper == config.GetYamlConfig().OMC.NeType { - neInfo.Status = NEStatusMaintain - affected, err := dborm.XormUpdateNeInfo(neInfo) - if err != nil { - log.Error("Failed to update Ne info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) - return - } else { - hostUri := global.CombineHostUri(neInfo.Ip, neInfo.Port) - //hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - apiUri := fmt.Sprintf("%s/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig?ne_id=%s", config.DefaultUriPrefix, neTypeLower, neInfo.NeId) - requestURI2NF := fmt.Sprintf("%s%s", hostUri, apiUri) - log.Debug("requestURI2NF:", requestURI2NF) - - omcNeConfig := &OmcNeConfig{ - NeId: neInfo.NeId, - RmUID: neInfo.RmUID, - NeName: neInfo.NeName, - PvFlag: neInfo.PvFlag, - Province: neInfo.Province, - VendorName: neInfo.VendorName, - Dn: neInfo.Dn, - } - body, _ = json.Marshal(omcNeConfig) - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - 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) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Info("StatusCode: ", response.StatusCode()) - - respMsg := make(map[string]interface{}) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - neInfo.Status = NEStatusActive - affected, err := dborm.XormUpdateNeInfo(neInfo) - if err != nil { - log.Error("Failed to dborm.XormUpdateNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if affected <= 0 { - log.Infof("Not record affected to insert ne_info") - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - services.ResponseStatusOK204NoContent(w) - return - default: - log.Info("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) - return - } -} - -func DeleteNeInfo(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteNeInfo processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := new(dborm.NeInfo) - _ = json.Unmarshal(body, neInfo) - neInfo.NeType = strings.ToUpper(neType) - neInfo.NeId = services.GetUriParamString(r, "ne_id", ",", false, false) - neInfo, err = dborm.XormGetNeInfo(neInfo.NeType, neInfo.NeId) - if err != nil || neInfo == nil { - log.Error("Failed to delete Ne info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("NE info:", neInfo) - - // if NE in active status, can't delete NE - if !IsActiveNF(neInfo) { - affected, err := dborm.XormDeleteNeInfo(neInfo) - if err != nil { - log.Error("Failed to delete Ne info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) - return - } - err = global.ErrCMCannotDeleteActiveNE - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) -} - -func IsActiveNF(neInfo *dborm.NeInfo) bool { - log.Debug("IsActiveNF processing... ") - - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI := fmt.Sprintf(config.UriPrefix+"/systemManagement/v1/elementType/%s/objectType/systemState", - strings.ToLower(neInfo.NeType)) - - response, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Get(hostUri + requestURI) - if err != nil { - log.Error("Failed to Get:", err) - return false - } - - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - return true - } - return false -} - -func ExportCmFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("ExportCmFromNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - neId := services.GetUriParamString(r, "ne_id", ",", false, false) - - // neInfo := new(dborm.NeInfo) - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Errorf("Failed to get ne_info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neInfo:", neInfo) - nePath := fmt.Sprintf("%s/etc/%s", config.GetYamlConfig().OMC.Backup, neTypeLower) - isExist, err := global.PathExists(nePath) - if err != nil { - log.Errorf("Failed to stat:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if isExist { - err = os.RemoveAll(nePath) - if err != nil { - log.Errorf("Failed to RemoveAll:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - err = os.MkdirAll(nePath, os.ModePerm) - if err != nil { - log.Errorf("Failed to MkdirAll:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - var scpCmd string - ipType := global.ParseIPAddr(neInfo.Ip) - omcNetypeLower := strings.ToLower(config.GetYamlConfig().OMC.NeType) - etcListIMS := "{*.yaml,mmtel,vars.cfg}" - if config.GetYamlConfig().NE.EtcListIMS != "" { - etcListIMS = config.GetYamlConfig().NE.EtcListIMS - } - switch neTypeLower { - case omcNetypeLower: - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/etc/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.OmcDir, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/etc/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.OmcDir, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - - case "ims": - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/%s/%s %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, neTypeLower, - etcListIMS, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/%s/%s %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, neTypeLower, - etcListIMS, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - - case "mme": - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/%s/*.conf %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/%s/*.conf %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - - default: - if ipType == global.IsIPv4 { - scpCmd = fmt.Sprintf("scp -r %s@%s:%s/%s/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } else { - scpCmd = fmt.Sprintf("scp -r %s@[%s]:%s/%s/*.yaml %s/etc/%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.EtcDir, - neTypeLower, config.GetYamlConfig().OMC.Backup, neTypeLower) - } - - } - - zipFile := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, strings.ToLower(neInfo.NeId), time.Now().Format(global.DateData)) - zipFilePath := config.GetYamlConfig().OMC.Backup + "/" + zipFile - zipCmd := fmt.Sprintf("cd %s/etc && zip -r %s %s/*", config.GetYamlConfig().OMC.Backup, zipFilePath, neTypeLower) - - command := fmt.Sprintf("%s&&%s", scpCmd, zipCmd) - - log.Debug("command:", command) - err = ExecCmd(command) - if err != nil { - log.Error("Faile to exec command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - md5Sum, err := global.GetFileMD5Sum(zipFilePath) - if err != nil { - log.Error("Faile to md5sum:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - //log.Debug("md5Str:", md5Sum) - path := config.GetYamlConfig().OMC.Backup - neBackup := dborm.NeBackup{NeType: neTypeUpper, NeId: neId, FileName: zipFile, Path: path, Md5Sum: md5Sum} - _, err = dborm.XormInsertTableOne("ne_backup", neBackup) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - //services.ResponseFileWithNameAndMD5(w, http.StatusOK, zipFile, path, md5Sum) - services.ResponseStatusOK204NoContent(w) -} - -type ImportCMJson struct { - FileName string `json:"fileName"` -} - -func ImportCmToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("ImportCmToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - neId := services.GetUriParamString(r, "ne_id", ",", false, false) - - var fileName, path string - if services.IsJsonContentType(r) { - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Debug("Body:", string(body)) - - importCMJson := new(ImportCMJson) - _ = json.Unmarshal(body, importCMJson) - fileName = importCMJson.FileName - path = config.GetYamlConfig().OMC.Backup - } else { - path = config.GetYamlConfig().OMC.Upload - fileNamePath, err := services.HandleUploadFile(r, path, "") - if err != nil { - log.Error("Faile to HandleUploadFile:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - fileName = fileNamePath - } - filePath := fmt.Sprintf("%s/%s", path, fileName) - - // neInfo := new(dborm.NeInfo) - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Errorf("Failed to get ne_info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neInfo:", neInfo) - - md5Sum, err := global.GetFileMD5Sum(filePath) - if err != nil { - log.Error("Faile to GetFileMD5Sum:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - //neBackup := dborm.NeBackup{NeType: neType, NeId: neId, Md5Sum: md5Sum} - //log.Debug("neBackup:", neBackup) - where := fmt.Sprintf("ne_type='%s' and ne_id='%s' and md5_sum='%s'", neTypeUpper, neId, md5Sum) - has, err := dborm.XormExistTableOne("ne_backup", where) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if !has { - err = global.ErrCMInvalidBackupFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // nePath := fmt.Sprintf("%s/etc/%s", config.GetYamlConfig().OMC.Upload, neTypeLower) - // isExist, err := global.PathExists(nePath) - // if err != nil { - // log.Errorf("Failed to stat:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // if isExist { - // err = os.RemoveAll(nePath) - // if err != nil { - // log.Errorf("Failed to remove:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } - // unzipCmd := fmt.Sprintf("unzip -o %s -d %s", filePath, config.GetYamlConfig().OMC.Upload) - - // var scpCmd string - // ipType := global.ParseIPAddr(neInfo.Ip) - // if ipType == global.IsIPv4 { - // scpCmd = fmt.Sprintf("scp -r %s/etc/%s %s@%s:%s", config.GetYamlConfig().OMC.Upload, - // neTypeLower, config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.EtcDir) - // } else { - // scpCmd = fmt.Sprintf("scp -r %s/etc/%s %s@[%s]:%s", config.GetYamlConfig().OMC.Upload, - // neTypeLower, config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.EtcDir) - // } - - // err = ExecCmd(fmt.Sprintf("%s && %s", unzipCmd, scpCmd)) - // if err != nil { - // log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // nePath := fmt.Sprintf("%s/etc/%s", config.GetYamlConfig().OMC.Upload, neTypeLower) - // isExist, err := global.PathExists(nePath) - // if err != nil { - // log.Errorf("Failed to stat:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // if isExist { - // err = os.RemoveAll(nePath) - // if err != nil { - // log.Errorf("Failed to remove:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } - var scpZipCmd string - ipType := global.ParseIPAddr(neInfo.Ip) - if ipType == global.IsIPv4 { - scpZipCmd = fmt.Sprintf("scp -r %s %s@%s:%s", filePath, - config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - } else { - scpZipCmd = fmt.Sprintf("scp -r %s %s@[%s]:%s", filePath, - config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - } - err = ExecCmd(scpZipCmd) - if err != nil { - log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - neFilePath := config.GetYamlConfig().NE.ScpDir + "/" + fileName - var unzipCmd string - if neTypeLower != "omc" { - unzipCmd = fmt.Sprintf("sudo unzip -o %s -d %s", neFilePath, config.GetYamlConfig().NE.EtcDir) - } else { - unzipCmd = fmt.Sprintf("sudo unzip -oj %s -d %s/etc", neFilePath, config.GetYamlConfig().NE.OmcDir) - } - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - cmd := exec.Command("ssh", sshHost, unzipCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func DownloadNeBackupFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DownloadNeBackupFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - //neTypeLower := strings.ToLower(neType) - - fileName := vars["fileName"] - if fileName == "" { - log.Error("fileName is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - sql := fmt.Sprintf("select * from ne_backup where ne_type='%s' and file_name='%s'", neTypeUpper, fileName) - neBackup, err := db.RawDB("", sql, nil) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(neBackup) == 0 { - err := global.ErrCMNotFoundTargetBackupFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - path := fmt.Sprint(neBackup[0]["path"]) - md5Sum := fmt.Sprint(neBackup[0]["md5_sum"]) - - services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, path, md5Sum) -} - -func DeleteNeBackupFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteNeBackupFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - //neTypeLower := strings.ToLower(neType) - - fileName := vars["fileName"] - if fileName == "" { - log.Error("fileName is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - sql := fmt.Sprintf("select * from ne_backup where ne_type='%s' and file_name='%s'", neTypeUpper, fileName) - neBackup, err := db.RawDB("", sql, nil) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(neBackup) == 0 { - err := global.ErrCMNotFoundTargetBackupFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - where := fmt.Sprintf("ne_type='%s' and file_name='%s'", neTypeUpper, fileName) - affected, err := dborm.XormDeleteDataByWhere(where, "ne_backup") - if err != nil || affected == 0 { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - path := neBackup[0]["path"] - filePath := fmt.Sprintf("%s/%s", path, fileName) - err = os.Remove(filePath) - if err != nil { - log.Error("Faile to Remove:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func PostNeServiceAction(w http.ResponseWriter, r *http.Request) { - log.Debug("PostNeServiceAction processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - //neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - action := vars["action"] - - neId := services.GetUriParamString(r, "neId", ",", false, false) - - // neInfo := new(dborm.NeInfo) - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to get ne_info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neInfo:", neInfo) - - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - switch neTypeLower { - case "omc": - // send 204 to fe firstly - services.ResponseStatusOK204NoContent(w) - //actionCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh %s", config.GetYamlConfig().NE.OmcDir, action) - actionCmd := fmt.Sprintf("sudo systemctl %s omc", action) - go RunSSHCmd(sshHost, actionCmd) - return - // cmd := exec.Command("ssh", sshHost, actionCmd) - // out, err := cmd.CombinedOutput() - // log.Debugf("Exec output: %v", string(out)) - // if err != nil { - // log.Errorf("Faile to execute ssh %s omc:%v", action, err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - case "ims": - switch action { - case "start", "stop": - actionCmd := fmt.Sprintf("sudo ims-%s", action) - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to execute %s command:%v", actionCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "restart": - actionCmd := "sudo ims-stop && sudo ims-start" - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to execute %s command:%v", actionCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - err = global.ErrCMUnknownServiceAction - log.Errorf("%v, action:%s", err, action) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - actionCmd := fmt.Sprintf("sudo systemctl %s %s.service", action, neTypeLower) - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - services.ResponseStatusOK204NoContent(w) -} - -func PostNeInstanceAction(w http.ResponseWriter, r *http.Request) { - log.Debug("PostNeInstanceAction processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - //neTypeUpper := strings.ToUpper(neType) - //neTypeLower := strings.ToLower(neType) - action := vars["action"] - - neId := services.GetUriParamString(r, "neId", ",", false, false) - - // neInfo := new(dborm.NeInfo) - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Errorf("Failed to get ne_info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neInfo:", neInfo) - - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - switch action { - case "poweron": - actionCmd := "sudo poweron" - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh %s omc:", action, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "poweroff": - actionCmd := "sudo poweroff" - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo poweroff:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "reboot": - actionCmd := "sudo reboot" - cmd := exec.Command("ssh", sshHost, actionCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo reboot:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - err = global.ErrCMUnknownInstanceAction - log.Errorf("%v, action:%s", err, action) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} diff --git a/features/cm/omc/controller.go b/features/cm/omc/controller.go deleted file mode 100644 index 888f182f..00000000 --- a/features/cm/omc/controller.go +++ /dev/null @@ -1,46 +0,0 @@ -package cm_omc - -import ( - "fmt" - "net/http" - - "be.ems/lib/services" - "github.com/gin-gonic/gin" -) - -func (o *ConfigOMC) Get(c *gin.Context) { - paramName := c.Param("paramName") - results, err := o.Query(paramName) - if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusOK, services.DataResp(results)) -} - -func (o *ConfigOMC) Post(c *gin.Context) { - err := fmt.Errorf("method not allowed") - c.JSON(http.StatusMethodNotAllowed, services.ErrResp(err.Error())) -} - -func (o *ConfigOMC) Put(c *gin.Context) { - paramName := c.Param("paramName") - var paramData map[string]any - - if err := c.ShouldBindJSON(¶mData); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) - return - } - - result, err := o.Modify(paramName, paramData) - if err != nil { - c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusOK, services.DataResp(result)) -} - -func (o *ConfigOMC) Delete(c *gin.Context) { - err := fmt.Errorf("method not allowed") - c.JSON(http.StatusMethodNotAllowed, services.ErrResp(err.Error())) -} diff --git a/features/cm/omc/implement.go b/features/cm/omc/implement.go deleted file mode 100644 index 9d7a4300..00000000 --- a/features/cm/omc/implement.go +++ /dev/null @@ -1,69 +0,0 @@ -package cm_omc - -import ( - "fmt" - - "be.ems/lib/config" -) - -const ( - PASSWORD_MASK = "********" -) - -func (o *ConfigOMC) Query(paramName string) (any, error) { - var results []any - - switch paramName { - case "alarmEmailForward": - result := config.GetYamlConfig().Alarm.EmailForward - result.Password = PASSWORD_MASK - results = append(results, result) - case "alarmSMSForward": - result := config.GetYamlConfig().Alarm.SMSCForward - result.Password = PASSWORD_MASK - results = append(results, result) - default: - return nil, fmt.Errorf("invalid source parameter") - } - - return results, nil -} - -func (o *ConfigOMC) Add() { - -} - -func (o *ConfigOMC) Modify(paramName string, paramData map[string]any) (any, error) { - var results []any - - switch paramName { - case "alarmEmailForward": - param := &(config.GetYamlConfig().Alarm.EmailForward) - config.UpdateStructFromMap(param, paramData) - result := *param - results = append(results, result) - err := config.WriteOrignalConfig(config.YamlConfigInfo.FilePath, paramName, paramData) - if err != nil { - fmt.Println("failed to write config yaml file:", err) - return results, err - } - case "alarmSMSForward": - param := &(config.GetYamlConfig().Alarm.SMSCForward) - config.UpdateStructFromMap(param, paramData) - result := *param - results = append(results, result) - err := config.WriteOrignalConfig(config.YamlConfigInfo.FilePath, paramName, paramData) - if err != nil { - fmt.Println("failed to write config yaml file:", err) - return results, err - } - default: - return nil, fmt.Errorf("invalid source parameter") - } - - return results, nil -} - -func (o *ConfigOMC) Remove() { - -} diff --git a/features/cm/omc/model.go b/features/cm/omc/model.go deleted file mode 100644 index 967c84c6..00000000 --- a/features/cm/omc/model.go +++ /dev/null @@ -1,26 +0,0 @@ -package cm_omc - -type ConfigOMC struct{} - -type SystemConfig struct { - ForwardFlag bool `json:"forwardFlag"` -} - -type AlarmEmailForward struct { - Enable bool `json:"enable"` - EmailList string `json:"emailList"` - SMTP string `json:"smtp"` - Port uint16 `json:"port"` - User string `json:"user"` - Password string `json:"password"` - TLSSkipVerify bool `json:"tlsSkipVerify"` -} - -type AlarmSMSForward struct { - Enable bool `json:"enable"` - MobileList string `json:"mobileList"` - SMSCAddr string `json:"smscAddr"` - SystemID string `json:"systemID"` - Password string `json:"password"` - SystemType string `json:"systemType"` -} diff --git a/features/cm/omc/route.go b/features/cm/omc/route.go deleted file mode 100644 index e97f7b5f..00000000 --- a/features/cm/omc/route.go +++ /dev/null @@ -1,30 +0,0 @@ -package cm_omc - -import ( - "be.ems/src/framework/middleware" - "github.com/gin-gonic/gin" -) - -// Register Routes for file_export -func Register(r *gin.RouterGroup) { - cmOMC := r.Group("/omc") - { - var o *ConfigOMC - cmOMC.GET("/config/:paramName", - middleware.AuthorizeUser(nil), - o.Get, - ) - cmOMC.POST("/config/:paramName", - middleware.AuthorizeUser(nil), - o.Post, - ) - cmOMC.PUT("/config/:paramName", - middleware.AuthorizeUser(nil), - o.Put, - ) - cmOMC.DELETE("/config/:paramName", - middleware.AuthorizeUser(nil), - o.Delete, - ) - } -} diff --git a/features/cm/param.go b/features/cm/param.go deleted file mode 100644 index 1b1266d0..00000000 --- a/features/cm/param.go +++ /dev/null @@ -1,208 +0,0 @@ -package cm - -import ( - "strings" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - - "encoding/json" - "fmt" - "io" - "net/http" - - neService "be.ems/src/modules/network_element/service" - - "github.com/go-resty/resty/v2" - "github.com/gorilla/mux" -) - -var ( - // parameter config management - ParamConfigUri = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/config/{paraName}" - - CustomParamConfigUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/config/{paraName}" -) - -func GetParamConfigFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetParamConfigFromNF processing... ") - - neId := ctx.GetQuery(r, "ne_id") - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" || neId == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - var response services.DataResponse - if neInfo.NeId == neId && neInfo.NeId != "" { - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - 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("Failed to Get from NF:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - _ = json.Unmarshal(resp.Body(), &response) - } - log.Debug("response:", response) - } - - services.ResponseWithJson(w, http.StatusOK, response) -} - -func PostParamConfigToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostParamConfigToNF processing... ") - - neId := ctx.GetQuery(r, "ne_id") - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" || neId == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - if neInfo.NeId != neId || neInfo.NeId == "" { - log.Error("neId is empty") - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: POST ", requestURI2NF) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - client := resty.New() - response, 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 to NF:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseWithJson(w, http.StatusNoContent, response) -} - -func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PutParamConfigToNF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // OMC配置接口 /api/rest/systemManagement/v1/elementType/omc/objectType/config/omcNeConfig - if v, ok := vars["paraName"]; ok && v == "omcNeConfig" && strings.ToLower(neType) == "omc" { - PutOMCNeConfig(w, r) - return - } - - neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - if neInfo.NeId != neId || neInfo.NeId == "" { - log.Error("neId is empty") - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: PUT ", requestURI2NF) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - client := resty.New() - response, 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 to NF:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseWithJson(w, http.StatusNoContent, response) -} - -// PutOMCNeConfig 网元OMC配置 -// -// 目前没配置,返回204 -func PutOMCNeConfig(w http.ResponseWriter, r *http.Request) { - services.ResponseStatusOK204NoContent(w) -} - -func DeleteParamConfigToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteParamConfigToNF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - if neInfo.NeId != neId || neInfo.NeId == "" { - log.Error("neId is empty") - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: DELETE ", requestURI2NF) - - client := resty.New() - response, 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 parameter:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - - services.ResponseWithJson(w, http.StatusNoContent, response) -} diff --git a/features/cm/service.go b/features/cm/service.go deleted file mode 100644 index f5d8b692..00000000 --- a/features/cm/service.go +++ /dev/null @@ -1,17 +0,0 @@ -package cm - -import ( - cm_omc "be.ems/features/cm/omc" - "be.ems/lib/log" - "github.com/gin-gonic/gin" -) - -func InitSubServiceRoute(r *gin.Engine) { - log.Info("======init PM group gin.Engine") - - cmGroup := r.Group("/cm") - // register sub modules routes - cm_omc.Register(cmGroup) - - // return featuresGroup -} diff --git a/features/cm/software.go b/features/cm/software.go deleted file mode 100644 index fd873702..00000000 --- a/features/cm/software.go +++ /dev/null @@ -1,1052 +0,0 @@ -package cm - -import ( - "bytes" - "fmt" - "io" - "net/http" - "os" - "os/exec" - "strconv" - "strings" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - - "github.com/gorilla/mux" -) - -const ( - SoftwareStatusUploaded = "3" - SoftwareStatusInactive = "3" - SoftwareStatusActive = "1" - DigestsSignOkString = "digests signatures OK" - SoftwareVerifiedOk = "Verified OK" -) - -var ( - UriSoftware = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{neType}/software/{version}" - UriSoftwareNE = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{neType}/software/{version}/{neId}" - - CustomUriSoftware = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/software/{version}" - CustomUriSoftwareNE = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/software/{version}/{neId}" -) - -// 验证签名 -func verify_signature(public_key_name string, source_cms_file string, source_file string) bytes.Buffer { - cmd := exec.Command("/usr/local/omc/run/iv", "verify_signature", public_key_name, source_cms_file, source_file) - var out bytes.Buffer - cmd.Stdout = &out - cmd.Env = append(os.Environ(), - "FOO=duplicate_value", // 重复被忽略 - "FOO=actual_value", // 实际被使用 - ) - err := cmd.Run() - if err != nil { - log.Error(err) - } - - return out -} - -func UploadSoftwareFile(w http.ResponseWriter, r *http.Request) { - log.Debug("UploadSoftwareFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - md5Param := services.GetUriParamString(r, "md5Sum", ",", false, false) - - // body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - // if err != nil { - // log.Error("io.ReadAll is failed:", err) - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - // neSWBody := new(dborm.NeSoftware) - // _ = json.Unmarshal(body, neSWBody) - // log.Trace("neSoftware:", neSWBody) - - softwarePath := fmt.Sprintf("%s/%s", config.GetYamlConfig().OMC.Software, neTypeLower) - fileName, err := services.HandleUploadFile(r, softwarePath, "") - if err != nil { - log.Error("Faile to HandleUploadFile:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - filePrefix := fileName[:strings.Index(fileName, ".zip")] - filePath := fmt.Sprintf("%s/%s", softwarePath, fileName) - log.Debugf("filePath:%s filePrefix:%s softwarePath:%s", filePath, filePrefix, softwarePath) - cmd := exec.Command("unzip", "-o", filePath) - cmd.Dir = softwarePath - out, err := cmd.CombinedOutput() - log.Debugf("Exec outpout:%s", string(out)) - if err != nil { - log.Error("Failed to unzip:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - md5File, err := global.GetFileMD5Sum(filePath) - if err != nil { - log.Error("Faile to GetFileMD5Sum:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - if md5File != md5Param { - err = global.ErrCMNotMatchMD5File - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - rpmFileName := filePrefix + ".rpm" - if config.GetYamlConfig().OMC.CheckSign { - rpmFilePath := softwarePath + "/" + rpmFileName - cmsFileName := rpmFileName + ".cms" - cmsFilePath := softwarePath + "/" + cmsFileName - log.Debugf("cmsFilePath:%s rpmFilePath:%s publicKey:%s", rpmFilePath, cmsFilePath, config.GetYamlConfig().Auth.PublicKey) - result := verify_signature(config.GetYamlConfig().Auth.PublicKey, cmsFilePath, rpmFilePath) - log.Debug("result:", result.String()) - if !strings.Contains(result.String(), SoftwareVerifiedOk) { - err = global.ErrCMNotMatchSignFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // cmd := exec.Command("rpm", "-K", filePath) - // out, err := cmd.CombinedOutput() - // log.Debugf("Exec outpout:%s", string(out)) - // if err != nil { - // log.Error("Failed to execute rpm:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // if !strings.Contains(string(out), DigestsSignOkString) { - // err = global.ErrCMNotMatchSignFile - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - } - - //neBackup := dborm.NeBackup{NeType: neType, NeId: neId, Md5Sum: md5Sum} - //log.Debug("neBackup:", neBackup) - where := fmt.Sprintf("ne_type='%s' and version='%s'", neTypeUpper, version) - has, err := dborm.XormExistTableOne("ne_software", where) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if has { - err = global.ErrCMExistSoftwareFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - neSoftware := dborm.NeSoftware{ - NeType: neTypeUpper, - FileName: rpmFileName, - Path: softwarePath, - Version: version, - Md5Sum: md5Param, - Comment: neType + " 5GC " + version, - //Comment: neSWBody.Comment, - } - - _, err = dborm.XormInsertTableOne("ne_software", neSoftware) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func UploadSoftwareMultiFile(w http.ResponseWriter, r *http.Request) { - log.Info("UploadSoftwareMultiFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - neSoftwareInfo, _ := dborm.XormGetDataBySQL(sql) - if len(*neSoftwareInfo) >= 1 { - services.ResponseWithJson(w, 200, map[string]any{ - "code": 0, - "msg": "Software version already exists", - }) - return - } - - md5Param := services.GetUriParamString(r, "md5Sum", ",", false, false) - - softwarePath := fmt.Sprintf("%s/%s", config.GetYamlConfig().OMC.Software, neTypeLower) - err := os.MkdirAll(softwarePath, os.ModePerm) - if err != nil { - log.Error("Failed to Mkdir:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - //fileName, err := services.HandleUploadFile(r, softwarePath, "") - - // 解析multipart/form-data请求 - err = r.ParseMultipartForm(1000 << 20) // 1000MB - if err != nil { - log.Error("Faile to ParseMultipartForm:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 获取文件和数据 - swFile := r.MultipartForm.File["file"] - cmsFile := r.MultipartForm.File["cms"] - data := r.MultipartForm.Value["comment"] - - var softwareFileName, cmsFileName, comment string - - // 处理软件rpm/deb文件 - if len(swFile) > 0 { - file := swFile[0] - // 打开文件 - f, err := file.Open() - if err != nil { - log.Error("Faile to Open:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer f.Close() - - // 创建本地文件 - dst, err := os.Create(softwarePath + "/" + file.Filename) - if err != nil { - log.Error("Faile to Create:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer dst.Close() - - softwareFileName = file.Filename - // 将文件内容拷贝到本地文件 - _, err = io.Copy(dst, f) - if err != nil { - log.Error("Faile to Copy:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - // 处理cms文件 - if len(cmsFile) > 0 { - file := cmsFile[0] - // 打开文件 - f, err := file.Open() - if err != nil { - log.Error("Faile to Open:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer f.Close() - - // 创建本地文件 - dst, err := os.Create(softwarePath + "/" + file.Filename) - if err != nil { - log.Error("Faile to Create:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer dst.Close() - - cmsFileName = file.Filename - // 将文件内容拷贝到本地文件 - _, err = io.Copy(dst, f) - if err != nil { - log.Error("Faile to Copy:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - // 处理数据 - if len(data) > 0 { - comment = data[0] - } - - if config.GetYamlConfig().OMC.CheckSign && cmsFileName != "" { - rpmFilePath := softwarePath + "/" + softwareFileName - cmsFileName := cmsFileName - cmsFilePath := softwarePath + "/" + cmsFileName - log.Debugf("cmsFilePath:%s rpmFilePath:%s publicKey:%s", rpmFilePath, cmsFilePath, config.GetYamlConfig().Auth.PublicKey) - result := verify_signature(config.GetYamlConfig().Auth.PublicKey, cmsFilePath, rpmFilePath) - log.Debug("result:", result.String()) - if !strings.Contains(result.String(), SoftwareVerifiedOk) { - err = global.ErrCMNotMatchSignFile - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // cmd := exec.Command("rpm", "-K", filePath) - // out, err := cmd.CombinedOutput() - // log.Debugf("Exec outpout:%s", string(out)) - // if err != nil { - // log.Error("Failed to execute rpm:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // if !strings.Contains(string(out), DigestsSignOkString) { - // err = global.ErrCMNotMatchSignFile - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - } - - // //neBackup := dborm.NeBackup{NeType: neType, NeId: neId, Md5Sum: md5Sum} - // //log.Debug("neBackup:", neBackup) - // where := fmt.Sprintf("ne_type='%s' and version='%s'", neTypeUpper, version) - // has, err := dborm.XormExistTableOne("ne_software", where) - // if err != nil { - // log.Error("Faile to XormInsertTableOne:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } else if has == true { - // err = global.ErrCMExistSoftwareFile - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - neSoftware := dborm.NeSoftware{ - NeType: neTypeUpper, - FileName: softwareFileName, - Path: softwarePath, - Version: version, - Md5Sum: md5Param, - Comment: comment, - } - - _, err = dborm.XormInsertTableOne("ne_software", neSoftware) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func DownloadSoftwareFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DownloadSoftwareFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - //neTypeLower := strings.ToLower(neType) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - neSoftware, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(*neSoftware) == 0 { - err := global.ErrCMNotFoundTargetSoftware - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - fileName := (*neSoftware)[0]["name"] - path := (*neSoftware)[0]["path"] - md5Sum := (*neSoftware)[0]["md5_sum"] - - services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, path, md5Sum) -} - -func DeleteSoftwareFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteSoftwareFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - //neTypeLower := strings.ToLower(neType) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - neSoftware, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(*neSoftware) == 0 { - err := global.ErrCMNotFoundTargetSoftware - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - where := fmt.Sprintf("ne_type='%s' and version='%s'", neTypeUpper, version) - affected, err := dborm.XormDeleteDataByWhere(where, "ne_software") - if err != nil || affected == 0 { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - fileName := (*neSoftware)[0]["name"] - path := (*neSoftware)[0]["path"] - filePath := fmt.Sprintf("%s/%s", path, fileName) - err = os.Remove(filePath) - if err != nil { - log.Error("Faile to Remove:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func DistributeSoftwareToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("DistributeSoftwareFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neId := vars["neId"] - if version == "" { - log.Error("neId is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo, err := dborm.XormGetNeInfo(neTypeUpper, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - neSoftware, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(*neSoftware) == 0 { - err := global.ErrCMNotFoundTargetSoftware - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neSoftware:", neSoftware) - - sql = fmt.Sprintf("select * from ne_version where ne_type='%s' and ne_id='%s'", neTypeUpper, neId) - neVersion, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neVersion:", neVersion) - - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - mkdirCmd := fmt.Sprintf("sudo mkdir -p %s/software/%s", config.GetYamlConfig().NE.OmcDir, neTypeLower) - cmd := exec.Command("ssh", sshHost, mkdirCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to mkdir:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - fileName := (*neSoftware)[0]["name"] - path := (*neSoftware)[0]["path"] - srcFile := fmt.Sprintf("%s/%s", path, fileName) - - scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - cmd = exec.Command("scp", "-r", srcFile, scpDir) - out, err = cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - neFilePath := config.GetYamlConfig().NE.ScpDir + "/" + fileName - cpCmd := fmt.Sprintf("sudo mv -f %s %s/software/%s", neFilePath, - config.GetYamlConfig().NE.OmcDir, neTypeLower) - cmd = exec.Command("ssh", sshHost, cpCmd) - out, err = cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute cp command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - if len(*neVersion) == 0 { - neVersionData := dborm.NeVersion{ - NeType: neTypeUpper, - NeId: neInfo.NeId, - Version: (*neSoftware)[0]["version"], - FilePath: fmt.Sprintf("%s/software/%s/%s", config.GetYamlConfig().NE.OmcDir, neTypeLower, fileName), - PreVersion: "", - PreFile: "", - Status: SoftwareStatusInactive, - } - - _, err = dborm.XormInsertTableOne("ne_version", neVersionData) - if err != nil { - log.Error("Faile to XormInsertTableOne:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } else { - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - NeType: neTypeUpper, - NeId: neInfo.NeId, - Version: (*neSoftware)[0]["version"], - FilePath: fmt.Sprintf("%s/software/%s/%s", config.GetYamlConfig().NE.OmcDir, neTypeLower, fileName), - PreVersion: (*neVersion)[0]["version"], - PreFile: (*neVersion)[0]["path"], - Status: SoftwareStatusInactive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - services.ResponseStatusOK204NoContent(w) -} - -func ActiveSoftwareToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("ActiveSoftwareToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neId := vars["neId"] - if version == "" { - log.Error("neId is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo, err := dborm.XormGetNeInfo(neTypeUpper, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - neSoftware, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(*neSoftware) == 0 { - err := global.ErrCMNotFoundTargetSoftware - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neSoftware:", neSoftware) - - sql = fmt.Sprintf("select * from ne_version where ne_type='%s' and ne_id='%s' and version='%s'", neTypeUpper, neId, version) - neVersion, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(*neVersion) == 0 { - err := global.ErrCMNotFoundTargetNeVersion - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace("neVersion:", neVersion) - - if !config.GetYamlConfig().OMC.TestMode { - filePath := (*neVersion)[0]["path"] - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - - runCmd := fmt.Sprintf("sudo rm -f %s/actpkg.sh", config.GetYamlConfig().NE.ScpDir) - err = RunSSHCmd(sshHost, runCmd) - if err != nil { - log.Errorf("Failed to run cmd: %s", runCmd) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - srcFile := fmt.Sprintf("%s/actpkg.sh", config.GetYamlConfig().OMC.BinDir) - scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - cmd := exec.Command("scp", "-r", srcFile, scpDir) - _, err := cmd.CombinedOutput() - if err != nil { - log.Errorf("Failed to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - runCmd = fmt.Sprintf("sudo %s/actpkg.sh '%s' %s", - config.GetYamlConfig().NE.ScpDir, filePath, neTypeUpper) - if neTypeLower == "omc" { - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - Status: SoftwareStatusActive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) - go RunSSHCmd(sshHost, runCmd) - return - } - err = RunSSHCmd(sshHost, runCmd) - if err != nil { - log.Errorf("Faile to execute command: %s, error: %v", runCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // fileType := global.IsRpmOrDebPackage(filePath) - // if fileType == 1 { - // srcFile := fmt.Sprintf("%s/spawnrpm.sh", config.GetYamlConfig().OMC.BinDir) - - // scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - // neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - // cmd := exec.Command("scp", "-r", srcFile, scpDir) - // _, err := cmd.CombinedOutput() - // if err != nil { - // log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // dpkgCmd := fmt.Sprintf("sudo %s/spawnrpm.sh '%s'", - // config.GetYamlConfig().NE.ScpDir, filePath) - // err = RunSSHCmd(sshHost, dpkgCmd) - // if err != nil { - // log.Errorf("Faile to execute dpkg command: %s, error: %v", dpkgCmd, err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } else if fileType == 2 { - // srcFile := fmt.Sprintf("%s/spawndpkg.sh", config.GetYamlConfig().OMC.BinDir) - - // scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - // neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - // cmd := exec.Command("scp", "-r", srcFile, scpDir) - // _, err := cmd.CombinedOutput() - // if err != nil { - // log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // dpkgCmd := fmt.Sprintf("sudo %s/spawndpkg.sh '%s'", - // config.GetYamlConfig().NE.ScpDir, filePath) - // err = RunSSHCmd(sshHost, dpkgCmd) - // if err != nil { - // log.Errorf("Faile to execute dpkg command: %s, error: %v", dpkgCmd, err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } else { - // err := global.ErrCMUnknownSoftwareFormat - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - switch neTypeLower { - case "omc": - restartCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh restart", config.GetYamlConfig().NE.OmcDir) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh restart omc:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "ims": - restartCmd := "sudo ims-stop && sudo ims-start" - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh command: %s, error: %v", restartCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - restartCmd := fmt.Sprintf("sudo systemctl restart %s.service", neTypeLower) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - Status: SoftwareStatusActive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} - -func RollBackSoftwareToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("ActiveSoftwareToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - version := vars["version"] - if version == "" { - log.Error("version is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neId := vars["neId"] - if version == "" { - log.Error("neId is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo, err := dborm.XormGetNeInfo(neTypeUpper, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - sql := fmt.Sprintf("select * from ne_version where ne_type='%s' and ne_id='%s'", neTypeUpper, neId) - neVersion, err := dborm.XormGetDataBySQL(sql) - if err != nil { - log.Error("Faile to XormGetDataBySQL:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else if len(*neVersion) == 0 { - err := global.ErrCMNotFoundTargetNeVersion - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neVersion:", neVersion) - - filePath := (*neVersion)[0]["pre_file"] - if filePath == "" { - err := global.ErrCMNotFoundRollbackNeVersion - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - if !config.GetYamlConfig().OMC.TestMode { - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - runCmd := fmt.Sprintf("sudo rm -f %s/rbkpkg.sh", config.GetYamlConfig().NE.ScpDir) - err = RunSSHCmd(sshHost, runCmd) - if err != nil { - log.Errorf("Failed to run cmd: %s", runCmd) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - srcFile := fmt.Sprintf("%s/rbkpkg.sh", config.GetYamlConfig().OMC.BinDir) - - scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - cmd := exec.Command("scp", "-r", srcFile, scpDir) - _, err := cmd.CombinedOutput() - if err != nil { - log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - runCmd = fmt.Sprintf("sudo %s/rbkpkg.sh '%s' %s", - config.GetYamlConfig().NE.ScpDir, filePath, neTypeUpper) - if neTypeLower == "omc" { - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - Version: (*neVersion)[0]["pre_version"], - FilePath: (*neVersion)[0]["pre_file"], - PreVersion: "-", - PreFile: "-", - NewVersion: (*neVersion)[0]["version"], - NewFile: (*neVersion)[0]["path"], - Status: SoftwareStatusActive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - services.ResponseStatusOK204NoContent(w) - go RunSSHCmd(sshHost, runCmd) - return - } - err = RunSSHCmd(sshHost, runCmd) - if err != nil { - log.Errorf("Faile to execute command: %s, error: %v", runCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // fileType := global.IsRpmOrDebPackage(filePath) - // if fileType == 1 { - // rpmCmd := fmt.Sprintf("sudo rpm -Uvh --oldpackage '%s'", filePath) - // cmd := exec.Command("ssh", sshHost, rpmCmd) - // _, err := cmd.CombinedOutput() - // if err != nil { - // log.Error("Faile to execute rpm command:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } else if fileType == 2 { - // srcFile := fmt.Sprintf("%s/spawndpkg.sh", config.GetYamlConfig().OMC.BinDir) - - // scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, - // neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - // cmd := exec.Command("scp", "-r", srcFile, scpDir) - // _, err := cmd.CombinedOutput() - // if err != nil { - // log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // var inputStr string = "n" - // if config.GetYamlConfig().NE.DpkgOverwrite { - // inputStr = "y" - // } - // dpkgCmd := fmt.Sprintf("sudo %s/spawndpkg.sh %s '%s'", - // config.GetYamlConfig().NE.ScpDir, inputStr, filePath) - // err = RunSSHCmd(sshHost, dpkgCmd) - // if err != nil { - // log.Errorf("Faile to execute dpkg command: %s, error: %v", dpkgCmd, err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // } else { - // err := global.ErrCMUnknownSoftwareFormat - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - switch neTypeLower { - case "omc": - restartCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh restart", config.GetYamlConfig().NE.OmcDir) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh restart omc:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "ims": - restartCmd := "sudo ims-stop && sudo ims-start" - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh command: %s, error: %v", restartCmd, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - restartCmd := fmt.Sprintf("sudo systemctl restart %s.service", neTypeLower) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Tracef("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - } - } - - idNeVersion, _ := strconv.Atoi((*neVersion)[0]["id"]) - neVersionData := dborm.NeVersion{ - Version: (*neVersion)[0]["pre_version"], - FilePath: (*neVersion)[0]["pre_file"], - PreVersion: "-", - PreFile: "-", - NewVersion: (*neVersion)[0]["version"], - NewFile: (*neVersion)[0]["path"], - Status: SoftwareStatusActive, - } - - _, err = dborm.XormUpdateTableById(idNeVersion, "ne_version", neVersionData) - if err != nil { - log.Error("Faile to UpdateTableById:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - services.ResponseStatusOK204NoContent(w) -} diff --git a/features/dbrest/dbrest.go b/features/dbrest/dbrest.go deleted file mode 100644 index d11f981a..00000000 --- a/features/dbrest/dbrest.go +++ /dev/null @@ -1,859 +0,0 @@ -package dbrest - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "regexp" - "strings" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - - "github.com/gorilla/mux" -) - -type XormResponse struct { - Data interface{} `json:"data"` -} - -type XormInsertResponse struct { - Data interface{} `json:"data"` -} - -var ( - // database management rest pattern, discard - XormGetDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" - XormSelectDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/select/{elementTypeValue}/{objectTypeValue}" - XormInsertDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/insert/{elementTypeValue}/{objectTypeValue}" - XormUpdateDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/update/{elementTypeValue}/{objectTypeValue}" - XormDeleteDataUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/delete/{elementTypeValue}/{objectTypeValue}" - - CustomXormGetDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" - CustomXormSelectDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/select/{elementTypeValue}/{objectTypeValue}" - CustomXormInsertDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/insert/{elementTypeValue}/{objectTypeValue}" - CustomXormUpdateDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/update/{elementTypeValue}/{objectTypeValue}" - CustomXormDeleteDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/delete/{elementTypeValue}/{objectTypeValue}" - - XormCommonUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for internal - XormDatabaseUri = config.DefaultUriPrefix + "/database/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for crontask - XormDataRestUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" - XormExtDataUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for external - XormDataSQLUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for external - - CustomXormCommonUri = config.UriPrefix + "/databaseManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for internal - CustomXormExtDataUri = config.UriPrefix + "/dataManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for external - CustomXormDataSQLUri = config.UriPrefix + "/dataManagement/{apiVersion}/{elementTypeValue}/{objectTypeValue}" // for external - - // 查询数据库连接情况 - UriDbConnection = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/dbConnection" - CustomUriDbConnection = config.UriPrefix + "/dataManagement/{apiVersion}/dbConnection" // for external - - // 终结非法的数据库连接 - UriDbStop = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/dbStop" - CustomUriDbStop = config.UriPrefix + "/dataManagement/{apiVersion}/dbStop" // for external - -) - -func GetUriSQLArray(r *http.Request) []string { - var sa []string - vars := r.URL.Query() - - // 默认SQL - if s, ok := vars["SQL"]; ok { - for _, r := range s { - if r != "" { - sa = append(sa, r) - } - } - } - - // 查询总数 - if totalSQL, ok := vars["totalSQL"]; ok { - if totalSQL[0] != "" { - sa = append(sa, totalSQL[0]) - } - } - // 查询列表 - if rowsSQL, ok := vars["rowsSQL"]; ok { - if rowsSQL[0] != "" { - sa = append(sa, rowsSQL[0]) - } - } - - if len(sa) == 0 { - log.Info("SQL is not exist") - return nil - } - - log.Debug("SQL array:", sa) - return sa -} - -// Get table name from SQL -func GetTableNameFromSQL(s string) string { - ls := strings.ToLower(s) - i1 := strings.Index(ls, "from") - i2 := strings.Index(ls, "where") - - var ts string - if i1 > 0 { - if i2 > 0 && i2 > i1 { - ts = ls[i1+4 : i2] - } - if i2 < 0 { - ts = ls[i1+4:] - } - } - - tn := strings.Trim(ts, " ") - log.Debug("i1:", i1, "i2:", i2, "tn:", tn) - return tn -} - -func GetTableName(sql string) string { - ls := strings.ToLower(sql) - - re := regexp.MustCompile(`from\s+(\S+)`) - matches := re.FindStringSubmatch(ls) - if len(matches) < 2 { - return "" - } - return matches[1] -} - -func IsQuerySQL(s string) bool { - ts := strings.Trim(strings.ToLower(s), " ") - return strings.Index(ts, "select") == 0 -} - -// xorm Get data from database -func ExtDatabaseExecSQL(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseExecSQL processing... ") - - // var err error - - // _, err = services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - //vars := mux.Vars(r) - //tblName := vars["objectTypeValue"] - var sql = GetUriSQLArray(r) - // select as must, todo ... - - ls := services.ExtGetUriPageLimitString(r) - - // data := make([]map[string]interface{}, 0) - // xormResponse := make([]map[string]interface{}, len(sql)) - var xormResponse XormResponse - data := make([]map[string]interface{}, 0) - for i, s := range sql { - log.Tracef("SQL[%d]: %s", i, sql[i]) - - //rows := make([]map[string]interface{}, 0) - mapRows := make(map[string]interface{}) - - if s != "" { - // err = XEngine.SQL(s).Find(&rows) - // if IsQuerySQL(s) == false { - // services.ResponseNotAcceptable406QuerySQLError(w) - // return - // } - - querySQL := s - if i == (len(sql) - 1) { - querySQL = querySQL + " " + ls - } - log.Debug("querySQL:", querySQL) - rows, err := db.RawDB("", querySQL, nil) - if err != nil { - log.Error("SQL failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - tableName := GetTableName(s) - log.Debugf("s:%s tableName:%s", s, tableName) - mapRows[tableName] = rows - data = append(data, mapRows) - log.Trace("data:", data) - } - i++ - } - xormResponse.Data = data - - services.ResponseWithJson(w, http.StatusOK, xormResponse) -} - -// xorm Get data from database -func ExtDatabaseGetData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseGetData processing... ") - - var sql []string - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - pack := "dbrest" - vars := mux.Vars(r) - module := "" - dbname := vars["elementTypeValue"] - tbname := vars["objectTypeValue"] - - log.Debugf("method:%s, module:%s, dbname:%s, tbname:%s, pack:%s", r.Method, module, dbname, tbname, pack) - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("Not permission!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - sql = GetUriSQLArray(r) - // select as must, todo ... - if sql == nil { - wc := services.GetUriLocString(r) - if wc == "" { - sql = append(sql, fmt.Sprintf("select * from %s", tbname)) - } else { - sql = append(sql, fmt.Sprintf("select * from %s where %s", tbname, wc)) - } - } - - ls := services.ExtGetUriPageLimitString(r) - - // data := make([]map[string]interface{}, 0) - // xormResponse := make([]map[string]interface{}, len(sql)) - var xormResponse XormResponse - data := make([]map[string]interface{}, 0) - for i, s := range sql { - log.Tracef("SQL[%d]: %s", i, sql[i]) - - mapRows := make(map[string]interface{}) - - if s != "" { - // err = XEngine.SQL(s).Find(&rows) - if !IsQuerySQL(s) { - services.ResponseNotAcceptable406QuerySQLError(w) - return - } - - querySQL := s - if i == (len(sql) - 1) { - querySQL = querySQL + " " + ls - } - log.Debug("querySQL:", querySQL) - rows, err := db.RawDB("", querySQL, nil) - if err != nil { - log.Error("SQL failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - tableName := GetTableName(s) - log.Debugf("s:%s tableName:%s", s, tableName) - mapRows[tableName] = rows - data = append(data, mapRows) - log.Trace("data:", data) - } - i++ - } - xormResponse.Data = data - - services.ResponseWithJson(w, http.StatusOK, xormResponse) -} - -func ExtDatabaseInsertData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseInsertData processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - vars := mux.Vars(r) - module := "" - dbname := vars["elementTypeValue"] - tbname := vars["objectTypeValue"] - pack := "dbrest" - - log.Debugf("method:%s, module:%s, dbname:%s, tbname:%s, pack:%s", r.Method, module, dbname, tbname, pack) - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("permission deny!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - log.Debug("Request body:", string(body), "dataObject:", tbname) - insertData := make(map[string]interface{}) - _ = json.Unmarshal(body, &insertData) - - tn, sql := dborm.ConstructInsertSQL(tbname, insertData) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Insert failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - // affected, err := InsertDataWithJson(insertData) - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - // xormResponse.Data = mapRow - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func ExtDatabaseUpdateData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseUpdateData processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - module := "" - dbname := vars["elementTypeValue"] - tbname := vars["objectTypeValue"] - pack := "dbrest" - - log.Debugf("method:%s, module:%s, dbname:%s, tbname:%s, pack:%s", r.Method, module, dbname, tbname, pack) - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("Not permission!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - wc := services.GetUriLocString(r) - - log.Debug("Request body:", string(body), "Tablename:", tbname, "wc:", wc) - updateData := make(map[string]interface{}) - _ = json.Unmarshal(body, &updateData) - - tn, sql := dborm.ConstructUpdateSQL(tbname, updateData, wc) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Update failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func ExtDatabaseDeleteData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseDeleteData processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - module := "" - dbname := vars["elementTypeValue"] - tbname := vars["objectTypeValue"] - pack := "dbreset" - - log.Debugf("method:%s, module:%, dbname:%s, tbname:%s pack:%s", r.Method, module, dbname, tbname, pack) - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("Not permission!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - wc := services.GetUriLocString(r) - - log.Debug("Table name:", tbname, "wc:", wc) - - sql := dborm.ConstructDeleteSQL(tbname, wc) - - affected, err := db.ExecDB("", sql, nil) - if err != nil { - log.Error("Update failed, err:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -// xorm Get data from database -func DatabaseGetData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseGetData processing... ") - - var sql []string - - // _, err = services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - sql = GetUriSQLArray(r) - // select as must, todo ... - - if sql == nil { - wc := services.GetUriWhereString(r) - if wc == "" { - sql = append(sql, fmt.Sprintf("select * from %s", tblName)) - } else { - sql = append(sql, fmt.Sprintf("select * from %s where %s", tblName, wc)) - } - } - - ls := services.GetUriPageLimitString(r) - - // data := make([]map[string]interface{}, 0) - // xormResponse := make([]map[string]interface{}, len(sql)) - var xormResponse XormResponse - data := make([]map[string]interface{}, 0) - for i, s := range sql { - log.Tracef("SQL[%d]: %s", i, sql[i]) - - mapRows := make(map[string]interface{}) - - if s != "" { - // err = XEngine.SQL(s).Find(&rows) - if !IsQuerySQL(s) { - services.ResponseNotAcceptable406QuerySQLError(w) - return - } - - querySQL := s - if i == (len(sql) - 1) { - querySQL = querySQL + " " + ls - } - log.Debug("querySQL:", querySQL) - rows, err := db.RawDB("", querySQL, nil) - if err != nil { - log.Error("QueryInterface failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - tableName := GetTableName(s) - log.Debugf("s:%s tableName:%s", s, tableName) - mapRows[tableName] = rows - data = append(data, mapRows) - log.Trace("data:", data) - } - i++ - } - xormResponse.Data = data - - services.ResponseWithJson(w, http.StatusOK, xormResponse) -} - -func DatabaseInsertData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseInsertData processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - vars := mux.Vars(r) - tableName := vars["objectTypeValue"] - log.Debug("Request body:", string(body), "tableName:", tableName) - insertData := make(map[string]interface{}) - _ = json.Unmarshal(body, &insertData) - - // 操作日志的IP - if tableName == "operation_log" || tableName == "security_log" { - ipAddr := strings.Split(r.RemoteAddr, ":")[0] - s := insertData["data"].([]any) - a := s[0].(map[string]any) - a["op_ip"] = ipAddr - } else if tableName == "mml_log" { - ipAddr := strings.Split(r.RemoteAddr, ":")[0] - s := insertData["data"].([]any) - a := s[0].(map[string]any) - a["ip"] = ipAddr - } - - tn, sql := dborm.ConstructInsertSQL(tableName, insertData) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Insert failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - // affected, err := InsertDataWithJson(insertData) - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - // xormResponse.Data = mapRow - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func DatabaseUpdateData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseUpdateData processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - wc := services.GetUriWhereString(r) - - log.Debug("Request body:", string(body), "Table name:", tblName, "wc:", wc) - updateData := make(map[string]interface{}) - _ = json.Unmarshal(body, &updateData) - - tn, sql := dborm.ConstructUpdateSQL(tblName, updateData, wc) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Update failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func DatabaseDeleteData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseDeleteData processing... ") - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - wc := services.GetUriWhereString(r) - - log.Debug("Table name:", tblName, "wc:", wc) - - sql := dborm.ConstructDeleteSQL(tblName, wc) - - affected, err := db.ExecDB("", sql, nil) - if err != nil { - log.Error("Update failed, err:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -// 连接用户实例 -func DbConnection(w http.ResponseWriter, r *http.Request) { - // 获取底层 SQL 数据库连接 - sqlDB, err := db.DB("").DB() - if err != nil { - services.ResponseErrorWithJson(w, 400, "无连接") - return - } - // 测试数据库连接 - err = sqlDB.Ping() - if err != nil { - services.ResponseErrorWithJson(w, 400, "无连接") - return - } - - // 查询实例 - result, err := db.RawDB("", "SHOW PROCESSLIST;", nil) - if err != nil { - services.ResponseErrorWithJson(w, 500, err.Error()) - } - filterData := []map[string]any{} - for _, r := range result { - if r["User"] != "system user" { - filterData = append(filterData, r) - } - } - // Sleep:连接处于空闲状态,没有执行任何操作。 - // Query:连接正在执行一个查询语句。 - // Execute:连接正在执行一个准备好的 SQL 语句。 - // Connect:连接正在建立但尚未完成。 - services.ResponseWithJson(w, 200, filterData) -} - -// 关闭数据库连接 -func DbStop(w http.ResponseWriter, r *http.Request) { - // 获取底层 SQL 数据库连接 - sqlDB, err := db.DB("").DB() - if err != nil { - services.ResponseErrorWithJson(w, 400, "无连接") - return - } - // 测试数据库连接 - err = sqlDB.Ping() - if err != nil { - services.ResponseErrorWithJson(w, 400, "无连接") - return - } - - // json 請求參數獲取 - var bodyArgs struct { - ID string `json:"ID" validate:"required"` - } - err = ctx.ShouldBindJSON(r, &bodyArgs) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseErrorWithJson(w, 400, err.Error()) - return - } - - // 关闭 - rse, err := db.ExecDB("", "KILL ?;", []any{bodyArgs.ID}) - if err != nil { - services.ResponseErrorWithJson(w, 500, err.Error()) - return - } - services.ResponseWithJson(w, 200, rse) -} - -// xorm Get data from database -func TaskDatabaseGetData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseGetData processing... ") - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - var sql = GetUriSQLArray(r) - // select as must, todo ... - - if sql == nil { - wc := services.GetUriWhereString(r) - if wc == "" { - sql = append(sql, fmt.Sprintf("select * from %s", tblName)) - } else { - sql = append(sql, fmt.Sprintf("select * from %s where %s", tblName, wc)) - } - } - - ls := services.GetUriPageLimitString(r) - - // data := make([]map[string]interface{}, 0) - // xormResponse := make([]map[string]interface{}, len(sql)) - var xormResponse XormResponse - data := make([]map[string]interface{}, 0) - for i, s := range sql { - log.Tracef("SQL[%d]: %s", i, sql[i]) - - mapRows := make(map[string]interface{}) - - if s != "" { - // err = XEngine.SQL(s).Find(&rows) - if !IsQuerySQL(s) { - services.ResponseNotAcceptable406QuerySQLError(w) - return - } - - querySQL := s - if i == (len(sql) - 1) { - querySQL = querySQL + " " + ls - } - log.Debug("querySQL:", querySQL) - rows, err := db.RawDB("", querySQL, nil) - if err != nil { - log.Error("SQL failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - tableName := GetTableName(s) - log.Debugf("s:%s tableName:%s", s, tableName) - mapRows[tableName] = rows - data = append(data, mapRows) - log.Trace("data:", data) - } - i++ - } - xormResponse.Data = data - - services.ResponseWithJson(w, http.StatusOK, xormResponse) -} - -func TaskDatabaseInsertData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseInsertData processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - vars := mux.Vars(r) - tableName := vars["objectTypeValue"] - log.Debug("Request body:", string(body), "tableName:", tableName) - insertData := make(map[string]interface{}) - _ = json.Unmarshal(body, &insertData) - - tn, sql := dborm.ConstructInsertSQL(tableName, insertData) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Insert failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - // affected, err := InsertDataWithJson(insertData) - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - // xormResponse.Data = mapRow - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func TaskDatabaseUpdateData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseUpdateData processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - wc := services.GetUriWhereString(r) - - log.Debug("Request body:", string(body), "Table name:", tblName, "wc:", wc) - updateData := make(map[string]interface{}) - _ = json.Unmarshal(body, &updateData) - - tn, sql := dborm.ConstructUpdateSQL(tblName, updateData, wc) - log.Tracef("tn: %s sql :%s", tn, sql) - - var affected int64 - for _, s := range sql { - n, err := db.ExecDB("", s, nil) - if err != nil { - log.Error("Update failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - affected = affected + n - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tn] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} - -func TaskDatabaseDeleteData(w http.ResponseWriter, r *http.Request) { - log.Debug("DatabaseDeleteData processing... ") - - vars := mux.Vars(r) - tblName := vars["objectTypeValue"] - wc := services.GetUriWhereString(r) - - log.Debug("Table name:", tblName, "wc:", wc) - - sql := dborm.ConstructDeleteSQL(tblName, wc) - - affected, err := db.ExecDB("", sql, nil) - if err != nil { - log.Error("Update failed, err:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow["data"] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} diff --git a/features/event/event.go b/features/event/event.go deleted file mode 100644 index 5e3853f1..00000000 --- a/features/event/event.go +++ /dev/null @@ -1,248 +0,0 @@ -package event - -import ( - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/log" - "be.ems/lib/services" - - "be.ems/src/framework/database/db" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/parse" - neService "be.ems/src/modules/network_element/service" - wsService "be.ems/src/modules/ws/service" - - "github.com/gin-gonic/gin" -) - -var ( - // 走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" -) - -// 旧AMF上报处理 -func PostUEEventFromAMF(c *gin.Context) { - log.Info("PostUEEventFromAMF processing... ") - eventType := c.Param("eventType") - if eventType == "" { - log.Error("eventType is empty") - services.ResponseNotFound404UriNotExist(c.Writer, c.Request) - return - } - var body map[string]any - if err := c.ShouldBindBodyWithJSON(&body); err != nil { - log.Error("Failed to Unmarshal ueEvent:", err) - services.ResponseInternalServerError500ProcessError(c.Writer, err) - return - } - - // 执行插入表 - type UEEvent struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state - EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 - } - timestamp := time.Now().UnixMilli() - data := UEEvent{ - NeType: "AMF", - NeName: "", - RmUID: "", - Timestamp: timestamp, - EventType: eventType, - EventJSONStr: "", - CreatedAt: timestamp, - } - - // 从eventJson中获取rmUID - if v, ok := body["rmUID"]; ok { - data.RmUID = fmt.Sprint(v) - } else { - data.RmUID = "4400HXAMF001" - } - if v, ok := body["neName"]; ok { - data.NeName = fmt.Sprint(v) - } else { - data.NeName = "AMF_001" - } - - // 是否存在网元 - neInfo := neService.NewNeInfo.FindByRmuid(data.RmUID) - if neInfo.NeType != "AMF" || neInfo.RmUID != data.RmUID { - services.ResponseInternalServerError500ProcessError(c.Writer, fmt.Errorf("network element does not exist")) - return - } - - // 统一格式 - eventJson := map[string]any{"cellID": 0, "gNBID": "", "imsi": "", "onlineNumber": 0, "result": "", "tacID": 0, "timestamp": 0, "time": 0, "type": eventType} - switch eventType { - case "auth-result": - // {"authCode":"200","authMessage":"成功","authTime":"2024-12-07 16:48:37","cellID":"3","gNBID":"1","imsi":"460002082100000","onlineNumber":1,"tacID":"81"} - if v, ok := body["imsi"]; ok { - eventJson["imsi"] = fmt.Sprint(v) - } - if v, ok := body["cellID"]; ok { - eventJson["cellID"] = fmt.Sprint(v) - } - if v, ok := body["gNBID"]; ok { - eventJson["gNBID"] = fmt.Sprint(v) - } - if v, ok := body["tacID"]; ok { - eventJson["tacID"] = fmt.Sprint(v) - } - if v, ok := body["onlineNumber"]; ok { - eventJson["onlineNumber"] = parse.Number(v) - } - if v, ok := body["authCode"]; ok { - eventJson["result"] = fmt.Sprint(v) - } - if v, ok := body["authTime"]; ok { - authTime := date.ParseStrToDate(fmt.Sprint(v), date.YYYY_MM_DD_HH_MM_SS) - eventJson["timestamp"] = authTime.Unix() - eventJson["time"] = fmt.Sprint(v) - } - case "detach": - // {"detachResult":0,"detachTime":"2024-12-07 18:00:47","imsi":"460002082100000"} - if v, ok := body["imsi"]; ok { - eventJson["imsi"] = fmt.Sprint(v) - } - if v, ok := body["detachResult"]; ok { - if fmt.Sprint(v) == "0" { - eventJson["result"] = "200" - } else { - eventJson["result"] = "500" - } - } - if v, ok := body["detachTime"]; ok { - detachTime := date.ParseStrToDate(fmt.Sprint(v), date.YYYY_MM_DD_HH_MM_SS) - eventJson["timestamp"] = detachTime.Unix() - eventJson["time"] = fmt.Sprint(v) - } - case "cm-state": - // {"changeTime":"2024-12-07 17:07:52","imsi":"460002082100000","onlineNumber":1,"status":2} - if v, ok := body["imsi"]; ok { - eventJson["imsi"] = fmt.Sprint(v) - } - if v, ok := body["onlineNumber"]; ok { - eventJson["onlineNumber"] = parse.Number(v) - } - if v, ok := body["status"]; ok { - eventJson["result"] = fmt.Sprint(v) - } - if v, ok := body["changeTime"]; ok { - changeTime := date.ParseStrToDate(fmt.Sprint(v), date.YYYY_MM_DD_HH_MM_SS) - eventJson["timestamp"] = changeTime.Unix() - eventJson["time"] = fmt.Sprint(v) - } - } - - ueByte, err := json.Marshal(eventJson) - if err != nil { - services.ResponseInternalServerError500ProcessError(c.Writer, err) - return - } - data.EventJSONStr = string(ueByte) - - if err := db.DB("").Table("ue_event_amf").Create(&data).Error; err != nil { - log.Error("Failed to insert ue_event_amf", err) - services.ResponseInternalServerError500ProcessError(c.Writer, err) - return - } - - // 推送到ws订阅组 - if data.NeType == "AMF" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, data) - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, data) - } - - services.ResponseStatusOK204NoContent(c.Writer) -} - -// UE上报处理 -func PostUEEvent(w http.ResponseWriter, r *http.Request) { - log.Info("PostUEEvent processing... ") - neType := ctx.GetParam(r, "elementTypeValue") - var body struct { - NeType string `json:"neType" ` - NeName string `json:"neName" ` - RmUID string `json:"rmUID" ` - Timestamp int64 `json:"timestamp" ` - EventType string `json:"eventType" ` - EventJson map[string]any `json:"eventJSON" ` - } - if err := ctx.ShouldBindJSON(r, &body); err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - neTypeLower := strings.ToLower(body.NeType) - if neType == "" || neType != neTypeLower { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("inconsistent network element types")) - return - } - - // 是否存在网元 - neInfo := neService.NewNeInfo.FindByRmuid(body.RmUID) - if neInfo.NeType != body.NeType || neInfo.RmUID != body.RmUID { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("network element does not exist")) - return - } - - ueByte, err := json.Marshal(body.EventJson) - if err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 执行插入表 - type UEEvent struct { - ID string `json:"-" gorm:"column:id;primaryKey;autoIncrement"` - NeType string `json:"neType" gorm:"column:ne_type"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUID" gorm:"column:rm_uid"` // 可能没有 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state - EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String - CreatedAt int64 `json:"-" gorm:"column:created_at"` // 记录创建存储毫秒 - } - data := UEEvent{ - NeType: body.NeType, - NeName: body.NeName, - RmUID: body.RmUID, - Timestamp: int64(body.Timestamp) * 1000, - EventType: body.EventType, - EventJSONStr: string(ueByte), - CreatedAt: time.Now().UnixMilli(), - } - tableName := fmt.Sprintf("ue_event_%s", neTypeLower) - if err := db.DB("").Table(tableName).Create(&data).Error; err != nil { - log.Error("Failed to insert "+tableName, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 推送到ws订阅组 - if body.NeType == "MME" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE, data) - wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE+"_"+neInfo.NeId, data) - } - if body.NeType == "AMF" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, data) - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, data) - } - - services.ResponseStatusOK204NoContent(w) -} diff --git a/features/features.go b/features/features.go deleted file mode 100644 index e4f68c75..00000000 --- a/features/features.go +++ /dev/null @@ -1,22 +0,0 @@ -package features - -import ( - "be.ems/features/cm" - "be.ems/features/lm" - "be.ems/features/nbi" - "be.ems/features/pm" - "be.ems/lib/log" - "github.com/gin-gonic/gin" -) - -func InitServiceEngine(r *gin.Engine) { - log.Info("======init feature group gin.Engine") - - // featuresGroup := r.Group("/") - // register features routers - pm.InitSubServiceRoute(r) - lm.InitSubServiceRoute(r) - cm.InitSubServiceRoute(r) - nbi.InitSubServiceRoute(r) - // return featuresGroup -} diff --git a/features/file/file.go b/features/file/file.go deleted file mode 100644 index bdd971f8..00000000 --- a/features/file/file.go +++ /dev/null @@ -1,141 +0,0 @@ -package file - -import ( - "net/http" - "path/filepath" - - "be.ems/lib/config" - "be.ems/lib/log" - "be.ems/lib/services" - "github.com/gorilla/mux" -) - -var ( - // parameter config management - UriFile = config.DefaultUriPrefix + "/fileManagement/{apiVersion}/{location}/file" - CustomUriFile = config.UriPrefix + "/fileManagement/{apiVersion}/{location}/file" -) - -// func init() { -// routes.Register("POST", UriFile, UploadFile, nil) -// routes.Register("GET", UriFile, DownloadFile, nil) -// routes.Register("DELETE", UriFile, DeleteFile, nil) -// } - -func UploadFile(w http.ResponseWriter, r *http.Request) { - log.Debug("UploadFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - location := vars["location"] - if location == "" { - log.Error("location is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - params := r.URL.Query() - rename, ok := params["rename"] - if !ok { - log.Info("rename parameter is not exist") - } - log.Debug("rename:", rename) - - var path, fileName string - if len(rename) > 0 { - fileName = rename[0] - } - if location == "upload" { - path = config.GetYamlConfig().OMC.Upload - fileNamePath, err := services.HandleUploadFile(r, path, fileName) - if err != nil { - log.Error("Faile to HandleUploadFile:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - fileName = fileNamePath - } else { - path = config.GetYamlConfig().OMC.FrontUpload - fileNamePath, err := services.HandleUploadFile(r, path, fileName) - if err != nil { - log.Error("Faile to HandleUploadFile:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - fileName = fileNamePath - } - log.Debugf("upload file=%s to path=%s", fileName, path) - - services.ResponseStatusOK204NoContent(w) - return -} - -func DownloadFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DownloadFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - location := vars["location"] - if location == "" { - log.Error("location is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // 全路径文件下载 - filePath := r.URL.Query().Get("path") - if location == "path" && filePath != "" { - // 截取文件路径 - dir := filepath.Dir(filePath) - // 截取文件名 - fileName := filepath.Base(filePath) - services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, dir, "") - return - } - - params := r.URL.Query() - fileNames, ok := params["loc"] - if !ok { - log.Info("loc parameter is not exist") - } - var path string - if location == "upload" { - path = config.GetYamlConfig().OMC.Upload - } else { - path = config.GetYamlConfig().OMC.FrontUpload - } - for _, fileName := range fileNames { - services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, path, "") - } - return -} - -func DeleteFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - services.ResponseStatusOK204NoContent(w) - return -} diff --git a/features/fm/alarm.go b/features/fm/alarm.go deleted file mode 100644 index e5f624fe..00000000 --- a/features/fm/alarm.go +++ /dev/null @@ -1,567 +0,0 @@ -package fm - -import ( - "database/sql" - "encoding/json" - "fmt" - "net/http" - "strings" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - - "be.ems/src/framework/constants" - "be.ems/src/framework/resp" - "be.ems/src/framework/utils/date" - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" - neFetchlink "be.ems/src/modules/network_element/fetch_link" - neModel "be.ems/src/modules/network_element/model" - neService "be.ems/src/modules/network_element/service" - traceService "be.ems/src/modules/trace/service" - wsService "be.ems/src/modules/ws/service" -) - -const ( - AlarmStatusClear = 0 - AlarmStatusActive = 1 - AlarmStatusClearString = "0" - AlarmStatusActiveString = "1" -) - -const ( - ClearTypeUnclear = 0 - ClearTypeAutoClear = 1 - ClearTypeManualClear = 2 -) - -const ( - AckStateUnacked = 0 - AckStateAcked = 1 -) - -const ( - AlarmTypeCommunicationAlarm = 1 - AlarmTypeEquipmentAlarm = 2 - AlarmTypeProcessingFailure = 3 - AlarmTypeEnvironmentalAlarm = 4 - AlarmTypeQualityOfServiceAlarm = 5 -) - -const ( - AlarmPerceivedSeverityCritical = 1 - AlarmPerceivedSeverityMajor = 2 - AlarmPerceivedSeverityMinor = 3 - AlarmPerceivedSeverityWarning = 4 - AlarmPerceivedSeverityEvent = 5 -) - -const ( - AlarmSeqBeginNumber = 1 -) - -type Alarm struct { - AlarmSeq int `json:"alarmSeq"` - AlarmId string `json:"alarmId" xorm:"alarm_id"` - NeId string `json:"neId"` // 收到实际是rmUID - AlarmCode int `json:"alarmCode"` - AlarmTitle string `json:"alarmTitle"` - EventTime string `json:"eventTime"` - AlarmType string `json:"alarmType"` - OrigSeverity string `json:"origSeverity"` - PerceivedSeverity string `json:"perceivedSeverity"` - PVFlag string `json:"pvFlag" xorm:"pv_flag"` - NeName string `json:"neName"` - NeType string `json:"neType"` - ObjectUid string `json:"objectUid" xorm:"object_uid"` - ObjectName string `json:"objectName" xorm:"object_name"` - ObjectType string `json:"objectType" xorm:"object_type"` - LocationInfo string `json:"locationInfo"` - Province string `json:"province"` - AlarmStatus int `json:"alarmStatus"` - SpecificProblem string `json:"specificProblem"` - SpecificProblemID string `json:"specificProblemID" xorm:"specific_problem_id"` - AddInfo string `json:"addInfo"` - - AckState int `json:"ackState"` - AckTime sql.NullTime `json:"ackTime"` - AckUser string `json:"ackUser"` - ClearType int `json:"clearType"` // 0: Unclear, 1: Auto clear, 2: Manual clear - ClearTime sql.NullTime `json:"clearTime"` -} - -var ( - // alarm management - UriAlarms = config.DefaultUriPrefix + "/faultManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/alarms" - UriAlarmsFmt = config.DefaultUriPrefix + "/faultManagement/v1/elementType/%s/objectType/alarms" - - CustomUriAlarms = config.UriPrefix + "/faultManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/alarms" - CustomUriAlarmsFmt = config.UriPrefix + "/faultManagement/v1/elementType/%s/objectType/alarms" -) - -// PostAlarmFromNF 网元告警数据上报接收 -func PostAlarmFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostAlarmFromNF processing... ") - apiVer := ctx.GetParam(r, "apiVersion") - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseWithJson(w, 422, resp.CodeMsg(40422, "api version is invalid")) - return - } - - var body []Alarm - if err := ctx.ShouldBindJSON(r, &body); err != nil { - services.ResponseWithJson(w, 422, resp.ErrMsg(err.Error())) - return - } - - // service object - neService := neService.NewNeInfo - - for _, v := range body { - log.Debug("alarmData:", v) - - // 是否存在网元 neId实际是rmUID - neInfo := neService.FindByRmuid(v.NeId) - if neInfo.NeType != v.NeType { - msg := fmt.Sprintf("network element does not exist %s", v.NeId) - services.ResponseWithJson(w, 400, resp.ErrMsg(msg)) - return - } - - // 记录日志 - alarmSaveLog(neInfo, v) - - // 补充默认信息 - if v.LocationInfo == "" { - v.LocationInfo = fmt.Sprintf("Remote Host:%s", r.RemoteAddr) - } - if v.AddInfo == "" { - v.AddInfo = fmt.Sprintf("NeInfo:%s", v.NeType) - } - if v.ObjectUid == "" { - v.ObjectUid = neInfo.RmUID - } - if v.ObjectName == "" { - v.ObjectName = neInfo.NeName - } - if v.ObjectType == "" { - v.ObjectType = neInfo.NeType - } - - // 告警事件 - if v.OrigSeverity == "Event" || v.OrigSeverity == "5" { - if v.AlarmStatus == AlarmStatusClear { - // 进行清除 - clearAlarmEvent, err := alarmEventClear(neInfo, v) - if err != nil { - services.ResponseWithJson(w, 400, resp.ErrMsg(err.Error())) - return - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM_EVENT, neInfo.NeType, neInfo.NeId) - wsService.NewWSSend.ByGroupID(groupID, clearAlarmEvent) - } - if v.AlarmStatus == AlarmStatusActive { - // 进行新增 - newAlarmEvent, err := alarmEventNew(neInfo, v) - if err != nil { - services.ResponseWithJson(w, 400, resp.ErrMsg(err.Error())) - return - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM_EVENT, neInfo.NeType, neInfo.NeId) - wsService.NewWSSend.ByGroupID(groupID, newAlarmEvent) - } - continue - } - - if v.AlarmStatus == AlarmStatusClear { - // 进行清除 - clearAlarm, err := alarmClear(neInfo, v) - if err != nil { - services.ResponseWithJson(w, 400, resp.ErrMsg(err.Error())) - return - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - wsService.NewWSSend.ByGroupID(groupID, clearAlarm) - } - if v.AlarmStatus == AlarmStatusActive { - // 进行新增 - newAlarm, err := alarmNew(neInfo, v) - if err != nil { - services.ResponseWithJson(w, 400, resp.ErrMsg(err.Error())) - return - } - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId) - wsService.NewWSSend.ByGroupID(groupID, newAlarm) - } - - // for alarm forward 告警转发 - alarmForward(v) - } - - services.ResponseStatusOK204NoContent(w) -} - -// alarmTypeValue 映射值 -func alarmTypeValue(str string) string { - arr := []string{"CommunicationAlarm", "EquipmentAlarm", "ProcessingFailure", "EnvironmentalAlarm", "QualityOfServiceAlarm"} - for k, v := range arr { - if v == str { - return fmt.Sprint(k + 1) - } - } - return str -} - -// origSeverityValue 映射值 -func origSeverityValue(str string) string { - arr := []string{"Critical", "Major", "Minor", "Warning", "Event"} - for k, v := range arr { - if v == str { - return fmt.Sprint(k + 1) - } - } - return str -} - -// alarmClear 清除告警 -func alarmClear(neInfo neModel.NeInfo, v Alarm) (neDataModel.Alarm, error) { - alarmService := neDataService.NewAlarm - // 检查网元告警ID是否唯一 - alarmIdArr := alarmService.Find(neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: v.AlarmId, - }) - if len(alarmIdArr) != 1 { - return neDataModel.Alarm{}, fmt.Errorf("[%s %s] clear alarm not exists alarmId:%s", neInfo.NeType, neInfo.NeId, v.AlarmId) - } - - // 产生时间 - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - - alarm := neDataModel.Alarm{ - ID: alarmIdArr[0].ID, - NeType: neInfo.NeType, - NeId: neInfo.NeId, - NeName: neInfo.NeName, - Province: neInfo.Province, - PvFlag: neInfo.PvFlag, - AlarmSeq: alarmIdArr[0].AlarmSeq, // seq 告警序号 - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - EventTime: eventTime.UnixMilli(), - AlarmType: alarmTypeValue(v.AlarmType), - OrigSeverity: origSeverityValue(v.OrigSeverity), - PerceivedSeverity: origSeverityValue(v.PerceivedSeverity), - ObjectUid: v.ObjectUid, - ObjectName: v.ObjectName, - ObjectType: v.ObjectType, - LocationInfo: v.LocationInfo, - AlarmStatus: fmt.Sprint(v.AlarmStatus), - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - - // 告警清除 - alarm.ClearType = ClearTypeAutoClear - alarm.ClearTime = eventTime.UnixMilli() - alarm.ClearUser = neInfo.NeName - rows := alarmService.Update(alarm) - if rows > 0 { - return alarm, nil - } - return neDataModel.Alarm{}, fmt.Errorf("[%s %s] clear alarm fail", neInfo.NeType, neInfo.NeId) -} - -// alarmNew 新增告警 -func alarmNew(neInfo neModel.NeInfo, v Alarm) (neDataModel.Alarm, error) { - alarmService := neDataService.NewAlarm - // 检查网元告警ID是否唯一 - alarmIdArr := alarmService.Find(neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: v.AlarmId, - }) - if len(alarmIdArr) > 0 { - return neDataModel.Alarm{}, fmt.Errorf("[%s %s] new alarm already exists alarmId:%s", neInfo.NeType, neInfo.NeId, v.AlarmId) - } - // seq 告警序号 - lastSeq := alarmService.FindAlarmSeqLast(neInfo.NeType, neInfo.NeId) - // 产生时间 - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - - alarm := neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - NeName: neInfo.NeName, - Province: neInfo.Province, - PvFlag: neInfo.PvFlag, - AlarmSeq: lastSeq + 1, - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - EventTime: eventTime.UnixMilli(), - AlarmType: alarmTypeValue(v.AlarmType), - OrigSeverity: origSeverityValue(v.OrigSeverity), - PerceivedSeverity: origSeverityValue(v.PerceivedSeverity), - ObjectUid: v.ObjectUid, - ObjectName: v.ObjectName, - ObjectType: v.ObjectType, - LocationInfo: v.LocationInfo, - AlarmStatus: fmt.Sprint(v.AlarmStatus), - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - insertId := alarmService.Insert(alarm) - if insertId > 0 { - alarm.ID = insertId - return alarm, nil - } - return neDataModel.Alarm{}, fmt.Errorf("[%s %s] new alarm fail", neInfo.NeType, neInfo.NeId) -} - -// alarmSaveLog 保存告警日志 -func alarmSaveLog(neInfo neModel.NeInfo, v Alarm) int64 { - alarmLogService := neDataService.NewAlarmLog - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - alarmLog := neDataModel.AlarmLog{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmSeq: int64(v.AlarmSeq), - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - AlarmStatus: fmt.Sprint(v.AlarmStatus), - AlarmType: alarmTypeValue(v.AlarmType), - OrigSeverity: origSeverityValue(v.OrigSeverity), - EventTime: eventTime.UnixMilli(), - } - return alarmLogService.Insert(alarmLog) -} - -// alarmForward 告警转发 -func alarmForward(v Alarm) { - if config.GetYamlConfig().Alarm.EmailForward.Enable { - if err := AlarmEmailForward(&v); err != nil { - log.Error("Failed to AlarmEmailForward:", err) - } - } - if config.GetYamlConfig().Alarm.SMSCForward.Enable { - if err := AlarmSMSForward(&v); err != nil { - log.Error("Failed to AlarmSMSForward:", err) - } - } -} - -// alarmEventClear 清除告警事件 -func alarmEventClear(neInfo neModel.NeInfo, v Alarm) (neDataModel.AlarmEvent, error) { - alarmEventService := neDataService.NewAlarmEvent - // 检查网元告警ID是否唯一 - alarmIdArr := alarmEventService.Find(neDataModel.AlarmEvent{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: v.AlarmId, - }) - if len(alarmIdArr) != 1 { - return neDataModel.AlarmEvent{}, fmt.Errorf("[%s %s] clear alarm event not exists alarmId:%s", neInfo.NeType, neInfo.NeId, v.AlarmId) - } - - // 产生时间 - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - - alarmEvent := neDataModel.AlarmEvent{ - ID: alarmIdArr[0].ID, - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmSeq: alarmIdArr[0].AlarmSeq, // seq 告警序号 - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - EventTime: eventTime.UnixMilli(), - ObjectUid: v.ObjectUid, - ObjectName: v.ObjectName, - ObjectType: v.ObjectType, - LocationInfo: v.LocationInfo, - AlarmStatus: fmt.Sprint(v.AlarmStatus), - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - - // 告警清除 - alarmEvent.ClearType = ClearTypeAutoClear - alarmEvent.ClearTime = eventTime.UnixMilli() - alarmEvent.ClearUser = neInfo.NeName - rows := alarmEventService.Update(alarmEvent) - if rows > 0 { - return alarmEvent, nil - } - return neDataModel.AlarmEvent{}, fmt.Errorf("[%s %s] clear alarm event fail", neInfo.NeType, neInfo.NeId) -} - -// alarmEventNew 新增告警事件 -func alarmEventNew(neInfo neModel.NeInfo, v Alarm) (neDataModel.AlarmEvent, error) { - alarmEventService := neDataService.NewAlarmEvent - // 检查网元告警ID是否唯一 - alarmIdArr := alarmEventService.Find(neDataModel.AlarmEvent{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmId: v.AlarmId, - }) - if len(alarmIdArr) > 0 { - return neDataModel.AlarmEvent{}, fmt.Errorf("[%s %s] new alarm event already exists alarmId:%s", neInfo.NeType, neInfo.NeId, v.AlarmId) - } - // seq 告警序号 - lastSeq := alarmEventService.FindAlarmEventSeqLast(neInfo.NeType, neInfo.NeId) - // 产生时间 - eventTime := date.ParseStrToDate(v.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - - alarmEvent := neDataModel.AlarmEvent{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmSeq: lastSeq + 1, - AlarmId: v.AlarmId, - AlarmTitle: v.AlarmTitle, - AlarmCode: int64(v.AlarmCode), - EventTime: eventTime.UnixMilli(), - ObjectUid: v.ObjectUid, - ObjectName: v.ObjectName, - ObjectType: v.ObjectType, - LocationInfo: v.LocationInfo, - AlarmStatus: fmt.Sprint(v.AlarmStatus), - SpecificProblem: v.SpecificProblem, - SpecificProblemId: v.SpecificProblemID, - AddInfo: v.AddInfo, - } - insertId := alarmEventService.Insert(alarmEvent) - if insertId > 0 { - alarmEvent.ID = insertId - // 网元重启后,清除活动告警 - if v.AlarmCode == constants.ALARM_EVENT_REBOOT { - alarmService := neDataService.NewAlarm - rows := alarmService.Find(neDataModel.Alarm{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmStatus: "1", - }) - for _, v := range rows { - alarmService.AlarmClearByIds([]int64{v.ID}, "system") - } - } - // 网元重启后,有跟踪任务的需要重新补发启动任务 - if v.AlarmCode == constants.ALARM_EVENT_REBOOT { - traceService.NewTraceTask.RunUnstopped(neInfo.NeType, neInfo.NeId) - } - return alarmEvent, nil - } - return neDataModel.AlarmEvent{}, fmt.Errorf("[%s %s] new alarm event fail", neInfo.NeType, neInfo.NeId) -} - -// mapToAlarm 将 []map[string]any 转换为 []Alarm -func mapToAlarm(data []map[string]any) []Alarm { - var result []Alarm - - // 将 []map[string]any 序列化为 JSON 字符串 - jsonData, err := json.Marshal(data) - if err != nil { - log.Error("Error marshaling data:", err) - return result - } - - // 反序列化到结构体 - err = json.Unmarshal(jsonData, &result) - if err != nil { - log.Error("Error unmarshaling data:", err) - return result - } - return result -} - -// GetAlarmFromNF 告警历史数据,从网元获取 -func GetAlarmFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetAlarmFromNF processing... ") - neType := ctx.GetParam(r, "elementTypeValue") - neTypeLower := strings.ToLower(neType) - - // Get alarms from OMC return 204 - if neTypeLower == strings.ToLower(config.GetYamlConfig().OMC.NeType) { - log.Infof("Return no content alarms from %s", neType) - services.ResponseWithJson(w, 200, resp.ErrMsg("omc alarms no content")) - return - } - - neInfos := neService.NewNeInfo.Find(neModel.NeInfo{}, false, false) - for _, neInfo := range neInfos { - data, err := neFetchlink.AlarmHistory(neInfo) - if err != nil { - log.Error("Failed to fetch alarm history:", err) - continue - } - if len(data) == 0 { - log.Infof("Not found sync alarms, neType=%s, neId=%s", neInfo.NeType, neInfo.NeId) - continue - } - - alarms := mapToAlarm(data) - for _, v := range alarms { - // 补充默认信息 - if v.LocationInfo == "" { - v.LocationInfo = fmt.Sprintf("Remote Host:%s", r.RemoteAddr) - } - if v.AddInfo == "" { - v.AddInfo = fmt.Sprintf("NeInfo:%s", v.NeType) - } - if v.ObjectUid == "" { - v.ObjectUid = neInfo.RmUID - } - if v.ObjectName == "" { - v.ObjectName = neInfo.NeName - } - if v.ObjectType == "" { - v.ObjectType = neInfo.NeType - } - - // 告警事件 - if v.OrigSeverity == "Event" || v.OrigSeverity == "5" { - if v.AlarmStatus == AlarmStatusClear { - // 进行清除 - if _, err := alarmEventClear(neInfo, v); err != nil { - log.Error("Failed to alarmEventClear:", err) - continue - } - } - if v.AlarmStatus == AlarmStatusActive { - // 进行新增 - if _, err := alarmEventNew(neInfo, v); err != nil { - log.Error("Failed to alarmEventNew:", err) - continue - } - } - continue - } - - if v.AlarmStatus == AlarmStatusClear { - // 进行清除 - if _, err := alarmClear(neInfo, v); err != nil { - log.Error("Failed to alarmClear:", err) - continue - } - } - if v.AlarmStatus == AlarmStatusActive { - // 进行新增 - if _, err := alarmNew(neInfo, v); err != nil { - log.Error("Failed to alarmNew:", err) - continue - } - } - } - } - services.ResponseWithJson(w, 200, resp.OkMsg("sync alarms success")) -} diff --git a/features/fm/email.go b/features/fm/email.go deleted file mode 100644 index eacca7d1..00000000 --- a/features/fm/email.go +++ /dev/null @@ -1,129 +0,0 @@ -package fm - -import ( - "crypto/tls" - "fmt" - "strings" - - "be.ems/lib/config" - neService "be.ems/src/modules/network_element/service" - systemService "be.ems/src/modules/system/service" - - "gopkg.in/gomail.v2" -) - -func AlarmEmailForward(alarmData *Alarm) error { - neInfo := neService.NewNeInfo.FindByRmuid(alarmData.NeId) - - alarmStatus := "Clear" - if alarmData.AlarmStatus == 1 { - alarmStatus = "Active" - } - severity := origSeverityValue(alarmData.OrigSeverity) - dictAlarmSeverity := systemService.NewSysDictData.FindByType("active_alarm_severity") - for _, v := range dictAlarmSeverity { - if v.DataValue == severity { - severity = v.DataLabel - } - } - subjectTitle := config.GetYamlConfig().Alarm.EmailForward.Title - if subjectTitle == "" { - subjectTitle = fmt.Sprintf("%s-%s-%s", alarmData.OrigSeverity, alarmData.NeName, alarmData.AlarmTitle) - } - message := fmt.Sprintf(` -
Alarm information
-Sequence: %d
-NE Name: %s
-NE IP: %s
-Title: %s
-Severity: %s
-Event Time: %s
-Alarm Status: %s
-Automatic sent by OMC, please do not reply!
- `, - alarmData.AlarmSeq, - alarmData.NeName, - neInfo.IP, - alarmData.AlarmTitle, - severity, - alarmData.EventTime, - alarmStatus, - ) - - // message := fmt.Sprintf(` - // Alarm information - - // Sequence: %d - // NE name: %s - // Title: %s - // Severity: %s - // Event Time: %s - - // Automatic send by OMC, don't reply! - // `, alarmData.AlarmSeq, alarmData.NeName, alarmData.AlarmTitle, alarmData.OrigSeverity, alarmData.EventTime) - - // QQ 邮箱: - // SMTP 服务器地址:smtp.qq.com(SSL协议端口:465/994 | 非SSL协议端口:25) - // 163 邮箱: - // SMTP 服务器地址:smtp.163.com(端口:25) - // host := "mail.agrandtech.com" - // port := 25 - // userName := "smtpext@agrandtech.com" - // password := "1000smtp@omc!" - - host := config.GetYamlConfig().Alarm.EmailForward.SMTP - port := int(config.GetYamlConfig().Alarm.EmailForward.Port) - userName := config.GetYamlConfig().Alarm.EmailForward.User - password := config.GetYamlConfig().Alarm.EmailForward.Password - - m := gomail.NewMessage() - m.SetHeader("From", userName) // 发件人 - //m.SetHeader("From", "alias"+"<"+"aliastest"+">") // 增加发件人别名 - - // emails, err := dborm.XormGetAlarmForward("Email") - // if err != nil { - // log.Error("Failed to XormGetAlarmForward:", err) - // return err - // } else if emails == nil || len(*emails) == 0 { - // err := errors.New("not found forward email list") - // log.Error(err) - // return err - // } - emails := strings.Split(config.GetYamlConfig().Alarm.EmailForward.EmailList, ",") - if len(emails) == 0 { - return fmt.Errorf("not found forward email list") - } - m.SetHeader("To", emails...) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 - //m.SetHeader("To", strings.Join(*emails, " ")) // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 - //m.SetHeader("To", "zhangshuzhong@agrandtech.com", "simonzhangsz@outlook.com") // 收件人,可以多个收件人,但必须使用相同的 SMTP 连接 - //m.SetHeader("Cc", "******@qq.com") // 抄送,可以多个 - //m.SetHeader("Bcc", "******@qq.com") // 暗送,可以多个 - m.SetHeader("Subject", subjectTitle) // 邮件主题 - - // text/html 的意思是将文件的 content-type 设置为 text/html 的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。 - // 可以通过 text/html 处理文本格式进行特殊处理,如换行、缩进、加粗等等 - //m.SetBody("text/html", fmt.Sprintf(message, *alarm)) - m.SetBody("text/html", message) - - // text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理 - //m.SetBody("text/plain", message) - // m.Attach("test.sh") // 附件文件,可以是文件,照片,视频等等 - // m.Attach("lolcatVideo.mp4") // 视频 - // m.Attach("lolcat.jpg") // 照片 - - d := gomail.NewDialer( - host, - port, - userName, - password, - ) - // 关闭SSL协议认证 - d.TLSConfig = &tls.Config{InsecureSkipVerify: true} - if !config.GetYamlConfig().Alarm.EmailForward.TLSSkipVerify { - // 打开SSL协议认证 - d.TLSConfig = &tls.Config{InsecureSkipVerify: false} - } - - err := d.DialAndSend(m) - return writeLog(alarmData, config.GetYamlConfig().Alarm.EmailForward.EmailList, "EMAIL", err) -} diff --git a/features/fm/smsforward.go b/features/fm/smsforward.go deleted file mode 100644 index 642e0ed3..00000000 --- a/features/fm/smsforward.go +++ /dev/null @@ -1,271 +0,0 @@ -package fm - -import ( - "errors" - "fmt" - "net/http" - "net/url" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/log" - "be.ems/src/framework/utils/date" - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" - neService "be.ems/src/modules/network_element/service" - "github.com/linxGnu/gosmpp" - "github.com/linxGnu/gosmpp/data" - "github.com/linxGnu/gosmpp/pdu" -) - -func AlarmSMSForward(alarmData *Alarm) error { - switch config.GetYamlConfig().Alarm.SMProxy { - case "sms": - users, err := AlarmForwardBySMS(alarmData) - writeLog(alarmData, users, "SMS", err) - return err - case "smsc": - users, err := AlarmForwardBySMPP(alarmData) - writeLog(alarmData, users, "SMS", err) - return err - default: - users, err := AlarmForwardBySMPP(alarmData) - writeLog(alarmData, users, "SMS", err) - return err - } -} - -func AlarmForwardBySMS(alarmData *Alarm) (string, error) { - log.Info("AlarmForwardBySMS processing... ") - - SMSFforwardconfig := config.GetYamlConfig().Alarm.SMS - // 阿里云短信API的请求地址 - apiURL := SMSFforwardconfig.ApiURL - - // 阿里云短信API的AccessKey ID和AccessKey Secret - //accessKeyID := SMSFforwardconfig.AccessKeyID - accessKeySecret := SMSFforwardconfig.AccessKeySecret - - toUsers, err := dborm.XormGetAlarmForward("SMS") - if err != nil { - log.Error("Failed to XormGetAlarmForward:", err) - return "", err - } - if toUsers == nil { - err := errors.New("not found forward phone number") - log.Error(err) - return "", err - } - userList := strings.Join(*toUsers, ",") - if len(userList) == 0 { - err := errors.New("not found forward phone number") - log.Error(err) - return "", err - } - // 短信相关参数 - params := url.Values{} - params.Set("PhoneNumbers", userList) - params.Set("SignName", SMSFforwardconfig.SignName) - params.Set("TemplateCode", SMSFforwardconfig.TemplateCode) - params.Set("TemplateParam", `{"message":"alarm"}`) - - // 构建请求URL - reqURL := apiURL + "?Action=SendSms&" + params.Encode() - - // 创建HTTP请求 - req, err := http.NewRequest("GET", reqURL, nil) - if err != nil { - log.Error("Failed to create request:", err) - return userList, err - } - - // 添加请求头部 - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - req.Header.Set("Authorization", "APPCODE "+accessKeySecret) - - // 发送请求 - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - log.Error("Failed to send request:%v", err) - return userList, err - } - defer resp.Body.Close() - - // 解析响应 - switch resp.StatusCode { - case http.StatusOK, http.StatusAccepted, http.StatusNoContent, http.StatusCreated: - return userList, nil - default: - log.Error(fmt.Errorf("failed to send SMS: %s(Code=%d)", resp.Status, resp.StatusCode)) - return userList, err - } -} - -var smsForward = &(config.GetYamlConfig().Alarm.SMSCForward) - -func AlarmForwardBySMPP(alarmData *Alarm) (string, error) { - log.Info("AlarmForwardBySMPP processing... ") - - if smsForward == nil { - err := errors.New("smsForward configuration is nil") - log.Error(err) - return "", err - } - userList := smsForward.MobileList - if len(userList) == 0 { - err := errors.New("not found forward phone number") - log.Error(err) - return "", err - } - auth := gosmpp.Auth{ - SMSC: smsForward.SMSCAddr, - SystemID: smsForward.SystemID, - Password: smsForward.Password, - SystemType: smsForward.SystemType, - } - - trans, err := gosmpp.NewSession( - gosmpp.TXConnector(gosmpp.NonTLSDialer, auth), - gosmpp.Settings{ - ReadTimeout: 2 * time.Second, - - OnPDU: func(p pdu.PDU, _ bool) { - log.Debug("%+v", p) - }, - - OnSubmitError: func(_ pdu.PDU, err error) { - log.Error(err) - }, - - OnRebindingError: func(err error) { - log.Error(err) - }, - - OnClosed: func(state gosmpp.State) { - log.Error(state) - }, - }, -1) - if err != nil { - log.Error("Failed to create SMPP new session:", err) - return "", err - } - defer func() { - if err := trans.Close(); err != nil { - log.Error(err) - } - }() - - message := "Alarm Notification: " + alarmData.AlarmTitle + - " from " + alarmData.NeType + "_" + alarmData.NeId + - " at " + alarmData.EventTime - users := strings.Split(userList, ",") - for _, user := range users { - if user == "" { - continue - } - sm, err := newSubmitSM(user, message) - if err != nil { - log.Errorf("Failed to newSubmitSM %s short message: %v", user, err) - writeLog(alarmData, user, "SMS", err) - continue - } - if err = trans.Transceiver().Submit(sm); err != nil { - log.Errorf("Failed to Submit %s short message: %v", user, err) - writeLog(alarmData, user, "SMS", err) - continue - } - writeLog(alarmData, user, "SMS", nil) - } - - return userList, nil -} - -func writeLog(alarmData *Alarm, toUser, forwardBy string, err error) error { - var result string = fmt.Sprintf("%s Sent Successfully!", forwardBy) - if err != nil { - result = err.Error() - } - neInfo := neService.NewNeInfo.FindByRmuid(alarmData.NeId) - eventTime := date.ParseStrToDate(alarmData.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) - alarmForwardLog := neDataModel.AlarmForwardLog{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - AlarmSeq: int64(alarmData.AlarmSeq), - AlarmId: alarmData.AlarmId, - AlarmTitle: alarmData.AlarmTitle, - AlarmCode: int64(alarmData.AlarmCode), - AlarmStatus: fmt.Sprint(alarmData.AlarmStatus), - AlarmType: alarmTypeValue(alarmData.AlarmType), - OrigSeverity: origSeverityValue(alarmData.OrigSeverity), - EventTime: eventTime.UnixMilli(), - Type: forwardBy, - Target: toUser, - Result: result, - } - - // 记录日志 - insertId := neDataService.NewAlarmForwardLog.Insert(alarmForwardLog) - if insertId <= 0 { - return fmt.Errorf("failed to insert data") - } - return nil -} - -func newSubmitSM(phoneNumber string, message string) (*pdu.SubmitSM, error) { - // build up submitSM - srcAddr := pdu.NewAddress() - srcAddr.SetTon(5) - srcAddr.SetNpi(0) - err := srcAddr.SetAddress(smsForward.ServiceNumber) - if err != nil { - return nil, err - } - destAddr := pdu.NewAddress() - destAddr.SetTon(1) - destAddr.SetNpi(1) - err = destAddr.SetAddress(phoneNumber) - if err != nil { - return nil, err - } - submitSM := pdu.NewSubmitSM().(*pdu.SubmitSM) - submitSM.SourceAddr = srcAddr - submitSM.DestAddr = destAddr - dataCoding := data.FromDataCoding(smsForward.DataCoding) - err = submitSM.Message.SetMessageWithEncoding(message, dataCoding) - if err != nil { - return nil, err - } - submitSM.ProtocolID = 0 - submitSM.RegisteredDelivery = 1 - submitSM.ReplaceIfPresentFlag = 0 - submitSM.EsmClass = 0 - - return submitSM, nil -} - -// const ( -// // Short message data coding type -// SMS_CODING_GSM7BIT byte = iota -// SMS_CODING_ASCII -// SMS_CODING_BINARY8BIT1 -// SMS_CODING_LATIN1 -// SMS_CODING_BINARY8BIT2 -// SMS_CODING_NODEF -// SMS_CODING_CYRILLIC -// SMS_CODING_HEBREW -// SMS_CODING_UCS2 -// ) - -// var codingMap = map[byte]data.Encoding{ -// SMS_CODING_GSM7BIT: data.GSM7BIT, -// SMS_CODING_ASCII: data.ASCII, -// SMS_CODING_BINARY8BIT1: data.BINARY8BIT1, -// SMS_CODING_LATIN1: data.LATIN1, -// SMS_CODING_BINARY8BIT2: data.BINARY8BIT2, -// SMS_CODING_CYRILLIC: data.CYRILLIC, -// SMS_CODING_HEBREW: data.HEBREW, -// SMS_CODING_UCS2: data.UCS2, -// } diff --git a/features/handle/handle.go b/features/handle/handle.go deleted file mode 100644 index daeaf726..00000000 --- a/features/handle/handle.go +++ /dev/null @@ -1,565 +0,0 @@ -package handle - -import ( - "bytes" - "encoding/json" - "io" - "net/http" - "strconv" - "strings" - - "github.com/gorilla/mux" - g "github.com/gosnmp/gosnmp" - - "be.ems/lib/config" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/oauth" - "be.ems/lib/services" - "be.ems/lib/session" -) - -var TodoList []stTodo - -type stTodo struct { - No string - Item string - Value string -} - -type ErrorOAuthResponse struct { - Error map[string]interface{} -} - -type FailOAuthResponse struct { - Error struct { - ErrorCode string - ErrorInfo string - } -} - -type ApiResponse struct { - ResultCode string - ResultMessage interface{} -} - -var globalSession = session.NewSessManager("restagent") - -func init() { - conf := config.GetYamlConfig() - // Default is a pointer to a GoSNMP struct that contains sensible defaults - // eg port 161, community public, etc - g.Default.Target = conf.NE.Addr - g.Default.Port = conf.NE.Port - err := g.Default.Connect() - if err != nil { - log.Fatalf("Connect() err: %v", err) - } - //defer g.Default.Conn.Close() -} - -/* -func IsValidOAuthInfo(oAuthBody OAuthBody) bool { - log.Debug("IsValidOAuthInfo processing... ") - - conf := config.GetYamlConfig() - for _, o := range conf.Auth { - if oAuthBody.GrantType == o.Type && oAuthBody.UserName == o.User && oAuthBody.Value == o.Password { - return true - } - } - - return false -} - -func IsWrongOAuthInfo(oAuthBody OAuthBody) bool { - log.Debug("IsWrongOAuthInfo processing... ") - - if oAuthBody.GrantType == "" || strings.ToLower(oAuthBody.GrantType) != "password" || oAuthBody.UserName == "" || oAuthBody.Value == "" { - return true - } - - return false -} -*/ - -func IsValidOAuthUri(r *http.Request) bool { - vars := mux.Vars(r) - Uri := vars["apiCategory"] + "/" + vars["apiVersion"] // 获取Uri - return Uri == "securityManagement/v1" -} - -func IsVallidContentType(r *http.Request) bool { - log.Debug("IsVallidContentType processing ...") - - ctype := r.Header["Content-Type"] - if len(ctype) != 0 && !strings.Contains(ctype[0], "application/json") { - return false - } - - return true -} - -func LoginFromOMC(w http.ResponseWriter, r *http.Request) { - log.Debug("LoginFromOMC processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Debug(err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // check media type(content type) only support "application/json" - /* if !IsVallidContentType(r) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // check extend uri, response 404 - if !IsValidOAuthUri(r) { - log.Debug("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - */ - // Error process .... - // response 400-7 - if !json.Valid([]byte(body)) { - log.Debug("Invalid Json Format") - services.ResponseBadRequest400InvalidJson(w) - return - } - - var oAuthBody oauth.OAuthBody - _ = json.Unmarshal(body, &oAuthBody) //转为json - log.Debug("body:", string(body), "oAuthBody:", oAuthBody) - - defer r.Body.Close() - // response 400-5 - if oauth.IsWrongOAuthInfo(oAuthBody) { - log.Debug("Wrong parameter value") - services.ResponseBadRequest400WrongParamValue(w) - return - } - /* - if oauth.IsValidOAuthInfo(oAuthBody) { - plist := config.GetPermissionFromConfig(oAuthBody.UserName, oAuthBody.GrantType) - log.Debug("Permission list:", plist) - - token := globalSession.NewSession(w, r, plist) - services.ResponseStatusOK200Login(w, token) - } else { - // response 400-4 - log.Debug("Authentication failed, mismatch user or password") - - services.ResponseBadRequest400IncorrectLogin(w) - } - */ - // response 400-4 - log.Error("Authentication failed, mismatch user or password") - - services.ResponseBadRequest400IncorrectLogin(w) -} - -func LogoutFromOMC(w http.ResponseWriter, r *http.Request) { - - // check media type(content type) only support "application/json" - if !IsVallidContentType(r) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // check extend uri, response 404 - if !IsValidOAuthUri(r) { - log.Debug("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // error processing ... - // 401-1 response - token, ret := globalSession.IsCarriedToken(r) - if ret { - log.Debug("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - // 401-2 response - if globalSession.IsValidToken(token) { - log.Debug("AccessToken fails or does not exist") - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } - - globalSession.EndSession(w, r) - services.ResponseStatusOK200Null(w) -} - -func HandshakeFromOMC(w http.ResponseWriter, r *http.Request) { - log.Debug("HandshakeFromOMC processing... ") - - // check media type(content type) only support "application/json" - if !IsVallidContentType(r) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // check extend uri, response 404 - if !IsValidOAuthUri(r) { - log.Debug("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // error processing ... - // 401-1 response - token, ret := globalSession.IsCarriedToken(r) - if !ret { - log.Debug("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - if !globalSession.ShakeSession(token) { - // 401-2 response - log.Debug("AccessToken fails or does not exist") - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } - - // 200 response - services.ResponseStatusOK200Null(w) -} - -var ( - MAX_RMUID_NUM = config.GetRmUIDMaxNumFromConfig() - MAX_ALARMID_NUM = config.GetAlarmIDMaxNumFromConfig() - MAX_PMUID_NUM = config.GetPmIDMaxNumFromConfig() - MAX_SUBID_NUM = config.GetSubIDMaxNumFromConfig() - MAX_URI_LEN = config.GetUriMaxLenFromConfig() - RMUID_REGEXP = config.GetRmUIDRegexpFromConfig() -) - -func CheckParameterName(r *http.Request) []string { - var errorParams []string - vars := r.URL.Query() - for k, v := range vars { - log.Debug("vars:", k, v) - if k != "rmUIDs" && k != "fields" { - errorParams = append(errorParams, k) - } - } - - return errorParams -} - -func GetRmUIDArr(r *http.Request) []string { - vars := r.URL.Query() - rmUIDs, ok := vars["rmUIDs"] - if !ok { - log.Debug("rmUIDs is not exist") - return nil - } - - var rmUIDValues []string - for _, r := range rmUIDs { - if r != "" { - rmUIDValues = global.MergeStringArr(rmUIDValues, strings.Split(r, `,`)) - } - } - - return rmUIDValues -} - -func GetAttrNameArr(r *http.Request) []string { - vars := r.URL.Query() - fields, ok := vars["fields"] - if !ok { - log.Debug("attributeNames does not exist") - return nil - } - var attrNames []string - for _, a := range fields { - if a != "" { - attrNames = global.MergeStringArr(attrNames, strings.Split(a, `,`)) - } - } - - return attrNames -} - -func CheckValidRmUID(rmUIDs []string) []string { - log.Debug("GetLocalRmUID processing... ") - - var invalidRmUIDs []string - for _, r := range rmUIDs { - if !global.MatchRmUID(RMUID_REGEXP, r) { - invalidRmUIDs = append(invalidRmUIDs, r) - } - } - - return invalidRmUIDs -} - -func CheckLocalRmUID(rmUIDs []string) string { - log.Debug("GetLocalRmUID processing... ") - - rmUID := config.GetRmUIDFromConfig() - for _, r := range rmUIDs { - if r == rmUID { - return rmUID - } - } - - return "" -} - -func GetNRMByUri(w http.ResponseWriter, r *http.Request) { - log.Debug("GetNRMByUri processing... ") - - // response 414-4 uri too long ? (optional) - // todo ... ? - if bytes.Count([]byte(r.RequestURI), nil) > MAX_URI_LEN { - log.Debug("Request Uri too long:", bytes.Count([]byte(r.RequestURI), nil)) - services.ResponseRequestURITooLong414UriTooLong(w) - return - } - - // check media type(content type) only support "application/json" - // response 415-1 - if !IsVallidContentType(r) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // error processing ... - // 401-1 response - token, ret := globalSession.IsCarriedToken(r) - if !ret { - log.Debug("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - // 401-2 response - if globalSession.IsValidToken(token) { - log.Debug("AccessToken fails or does not exist") - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } - // response 403 Forbidden, permissions deny - // todo... - plist := globalSession.GetPermissionFromSession(token) - log.Debug("permission list:", plist) - if len(plist) == 0 || !plist[0] { - log.Debug("User permission deny") - services.ResponseForbidden403NotPermission(w) - return - } - - vars := mux.Vars(r) - qeuryUri := vars["apiCategory"] + "/" + vars["elementTypeValue"] + "/" + vars["objectTypeValue"] - log.Debug("Get by Uri: ", qeuryUri) - - apiVer := vars["apiVersion"] - if apiVer != "v1" { - log.Debug("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 406-1 - rmUIDValues := GetRmUIDArr(r) - if rmUIDValues == nil { - log.Debug("missing parameter: rmUIDs") - services.ResponseNotAcceptable406MissingParam(w) - return - } - - // response 406-2 - errorParams := CheckParameterName(r) - if errorParams != nil { - log.Debug("parameter name error: ", errorParams) - services.ResponseNotAcceptable406ParamError(w, errorParams) - return - } - - // response 400-5 - if len(rmUIDValues) == 0 { - log.Debug("rmUIDs is wrong or NULL") - services.ResponseBadRequest400WrongParamValue(w) - return - } - - // response 414-1 - if len(rmUIDValues) > MAX_RMUID_NUM { - log.Debug("rmUID greater than", MAX_RMUID_NUM) - services.ResponseRequestURITooLong414NRMNumExceed(w, MAX_RMUID_NUM) - return - } - - // response 400-1 - // check rmUID is valid - // todo ... - invalidRmUIDs := CheckValidRmUID(rmUIDValues) - if len(invalidRmUIDs) != 0 { - log.Debug("rmUID is invalid") - services.ResponseBadRequest400RmUIDsIsInvalid(w, invalidRmUIDs) - return - } - - // response 404-2 - rmUID := CheckLocalRmUID(rmUIDValues) - if rmUID == "" { - log.Debug("rmUID does not exist") - services.ResponseNotFound404NRMNotExist(w, rmUIDValues) - return - } - - // response 404-1, uri is not exist in map - attrNames := GetAttrNameArr(r) - var Oids []string - Oids = *config.GetOidByFileds(qeuryUri, attrNames, &Oids) - if len(Oids) == 0 { - log.Debug("Nothing of config map") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 404-1, uri is not exist in map - var nameOids []config.NameOid - nameOids = *config.GetDataOidByFields(qeuryUri, attrNames, &nameOids) - if len(nameOids) == 0 { - log.Debug("Nothing of config map") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - result, err2 := g.Default.Get(Oids) // Get() accepts up to g.MAX_OIDS - if err2 != nil { - log.Fatalf("Get() err: %v", err2) - - } - - // var nameValues []config.NameValue - var nameValue config.NameValue - - nameValues := make(map[string]interface{}) - nameValues["rmUID"] = rmUID - for i, variable := range result.Variables { - nameValue.Name = nameOids[i].Name - log.Debugf("%d: oid: %s name: %s\n", i, variable.Name, nameValue.Name) - // if nameOids[i].Oid == variable.Name && global.IsContain(attributeNames, nameValue.Name) { - if nameOids[i].Oid == variable.Name { - // the Value of each variable returned by Get() implements - // interface{}. You could do a type switch... - switch variable.Type { - case g.OctetString: - bytes := variable.Value.([]byte) - log.Debugf("string: %s\n", string(bytes)) - nameValue.Value = string(bytes) - nameValues[nameValue.Name] = nameValue.Value - case g.Integer: - value := variable.Value.(int) - log.Debugf("integer: %d\n", value) - nameValue.Value = strconv.Itoa(value) - nameValues[nameValue.Name] = nameValue.Value - case g.IPAddress: - value := variable.Value.(string) - log.Debugf("IPAddress: %s\n", variable.Value) - nameValue.Value = value - nameValues[nameValue.Name] = nameValue.Value - default: - // ... or often you're just interested in numeric values. - // ToBigInt() will return the Value as a BigInt, for plugging - // into your calculations. - log.Debugf("number: %d\n", g.ToBigInt(variable.Value)) - } - } - } - - getResponse := services.DataResponse{Data: nameValues} - services.ResponseWithJson(w, http.StatusOK, getResponse) -} - -func RestfulPut(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - queryNo := vars["no"] - var targetTodo stTodo - for _, Todo := range TodoList { - if Todo.No == queryNo { - targetTodo = Todo - } - } - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) -} - -func RestfulHead(w http.ResponseWriter, r *http.Request) { - var targetTodo stTodo - - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) - -} - -func RemoveElement(TodoList []stTodo, No string) stTodo { - // var targetTodo stTodo - j := 0 - if len(TodoList) == 0 { - return TodoList[j] - } - - for i := 0; i < len(TodoList); i++ { - if TodoList[i].No != No { - if i != j { - TodoList[i], TodoList[j] = TodoList[j], TodoList[i] - } - j++ - } - } - log.Debug(TodoList[j].No, TodoList[j].Item) - return TodoList[j] -} - -func RestfulDelete(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - queryNo := vars["no"] //获取No - - log.Debug("RestfulDelete processing... ") - - targetTodo := RemoveElement(TodoList, queryNo) - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) -} - -func RestfulOptions(w http.ResponseWriter, r *http.Request) { - var targetTodo stTodo - - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) - -} - -func RestfulTrace(w http.ResponseWriter, r *http.Request) { - var targetTodo stTodo - - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) - -} - -func RestfulPatch(w http.ResponseWriter, r *http.Request) { - var targetTodo stTodo - - response := ApiResponse{"200", targetTodo} - services.ResponseWithJson(w, http.StatusOK, response) - -} diff --git a/features/lm/file_export/controller.go b/features/lm/file_export/controller.go deleted file mode 100644 index 54eeed7c..00000000 --- a/features/lm/file_export/controller.go +++ /dev/null @@ -1,138 +0,0 @@ -package file_export - -import ( - "encoding/json" - "net/http" - "os" - "path/filepath" - - "be.ems/lib/file" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - "be.ems/src/framework/i18n" - "be.ems/src/framework/reqctx" - "github.com/gin-gonic/gin" -) - -type SysJobResponse struct { - SysJob - TableName string `json:"tableName"` - TableDisplay string `json:"tableDisplay"` - FilePath string `json:"filePath"` -} - -type TargetParams struct { - Hour int `json:"hour"` // hour - TableName string `json:"tableName"` - Columns []string `json:"columns"` - FilePath string `json:"filePath"` // file path -} - -func (m *SysJob) GetFileExportTable(c *gin.Context) { - var results []SysJob - - tx := db.DB("").Table("sys_job").Where("invoke_target=?", INVOKE_FILE_EXPORT) - if err := tx.Find(&results).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - language := reqctx.AcceptLanguage(c) - var response []SysJobResponse - for _, job := range results { - var params TargetParams - if err := json.Unmarshal([]byte(job.TargetParams), ¶ms); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - TableDisplay := i18n.TKey(language, "table."+params.TableName) - if TableDisplay == "" { - TableDisplay = params.TableName - } - response = append(response, SysJobResponse{ - SysJob: job, - TableName: params.TableName, - TableDisplay: TableDisplay, - FilePath: params.FilePath, - }) - } - c.JSON(http.StatusOK, services.DataResp(response)) -} - -func (m *FileExport) GetFileList(c *gin.Context) { - var querys FileExportQuery - - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - files, err := file.GetFileInfo(querys.Path, querys.Suffix) - if err != nil { - log.Error("failed to GetFileInfo:", err) - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // split files list - lenNum := int64(len(files)) - start := (querys.PageNum - 1) * querys.PageSize - end := start + querys.PageSize - var splitList []file.FileInfo - if start >= lenNum { - splitList = []file.FileInfo{} - } else if end >= lenNum { - splitList = files[start:] - } else { - splitList = files[start:end] - } - total := len(files) - c.JSON(http.StatusOK, services.TotalDataResp(splitList, total)) -} - -func (m *FileExport) Total(c *gin.Context) { - dir := c.Query("path") - - fileCount, dirCount, err := file.GetFileAndDirCount(dir) - if err != nil { - log.Error("failed to GetFileAndDirCount:", err) - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - total := fileCount + dirCount - c.JSON(http.StatusOK, services.TotalResp(int64(total))) -} - -func (m *FileExport) DownloadHandler(c *gin.Context) { - dir := c.Query("path") - fileName := c.Param("fileName") - filePath := filepath.Join(dir, fileName) - - file, err := os.Open(filePath) - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - defer file.Close() - - if _, err := os.Stat(filePath); os.IsNotExist(err) { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.Header("Content-Disposition", "attachment; filename="+fileName) - c.Header("Content-Type", "application/octet-stream") - c.File(filePath) -} - -func (m *FileExport) Delete(c *gin.Context) { - fileName := c.Param("fileName") - dir := c.Query("path") - filePath := filepath.Join(dir, fileName) - - if err := os.Remove(filePath); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusNoContent, nil) // 204 No Content -} diff --git a/features/lm/file_export/model.go b/features/lm/file_export/model.go deleted file mode 100644 index 33a611f9..00000000 --- a/features/lm/file_export/model.go +++ /dev/null @@ -1,30 +0,0 @@ -package file_export - -import ( - "be.ems/lib/file" -) - -const ( - INVOKE_FILE_EXPORT = "exportTable" -) - -type SysJob struct { - JobID int64 `gorm:"column:job_id;primary_key;auto_increment" json:"job_id"` //任务ID - InvokeTarget string `gorm:"column:invoke_target" json:"invoke_target"` //调用目标字符串 - TargetParams string `gorm:"column:target_params;type:json" json:"target_params,omitempty"` //调用目标传入参数 -} - -func (m *SysJob) TableName() string { - return "sys_job" -} - -type FileExport struct { - file.FileInfo -} - -type FileExportQuery struct { - Path string `form:"path" binding:"required"` - Suffix string `form:"suffix"` - PageNum int64 `form:"pageNum" binding:"required"` - PageSize int64 `form:"pageSize" binding:"required"` -} diff --git a/features/lm/file_export/route.go b/features/lm/file_export/route.go deleted file mode 100644 index de9a05e6..00000000 --- a/features/lm/file_export/route.go +++ /dev/null @@ -1,39 +0,0 @@ -package file_export - -import ( - "be.ems/src/framework/middleware" - "github.com/gin-gonic/gin" -) - -// Register Routes for file_export -func Register(r *gin.RouterGroup) { - - lmTable := r.Group("/table") - { - var m *SysJob - lmTable.GET("/list", - middleware.AuthorizeUser(nil), - m.GetFileExportTable, - ) - } - lmFile := r.Group("/file") - { - var f *FileExport - lmFile.GET("/list", - middleware.AuthorizeUser(nil), - f.GetFileList, - ) - lmFile.GET("/total", - middleware.AuthorizeUser(nil), - f.Total, - ) - lmFile.GET("/:fileName", - middleware.AuthorizeUser(nil), - f.DownloadHandler, - ) - lmFile.DELETE("/:fileName", - middleware.AuthorizeUser(nil), - f.Delete, - ) - } -} diff --git a/features/lm/logbak.go b/features/lm/logbak.go deleted file mode 100644 index 99a36ae6..00000000 --- a/features/lm/logbak.go +++ /dev/null @@ -1,103 +0,0 @@ -package lm - -import ( - "fmt" - "net/http" - "os/exec" - "time" - - "be.ems/lib/config" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - - "github.com/gorilla/mux" -) - -type XormResponse struct { - Data interface{} `json:"data"` -} - -type XormInsertResponse struct { - Data interface{} `json:"data"` -} - -var ( - ExtBackupDataUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{dataStorage}/{dataObject}/backup" // for external - - CustomExtBackupDataUri = config.UriPrefix + "/dataManagement/{apiVersion}/{dataStorage}/{dataObject}/backup" // for external -) - -// func init() { -// conf := config.GetYamlConfig() -// InitDbClient(conf.Database.Type, conf.Database.User, conf.Database.Password, -// conf.Database.Host, conf.Database.Port, conf.Database.Name) -// } - -func ExtDatabaseBackupData(w http.ResponseWriter, r *http.Request) { - log.Debug("ExtDatabaseBackupData processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - module := vars["managementModule"] - dbname := vars["dataStorage"] - tbname := vars["dataObject"] - pack := "lm" - log.Debugf("method:%s, module:%s dbname:%s, tbname:%s pack:%s", r.Method, module, dbname, tbname, pack) - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, dbname, tbname, pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("permission deny!") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - var sql string - var filePath string - switch tbname { - case "operation_log": - filePath = fmt.Sprintf("/tmp/%s-%s.csv", tbname, time.Now().Local().Format(global.DateData)) - sql = fmt.Sprintf("select * into outfile '%s' fields terminated by ',' escaped by '' optionally enclosed by '' lines terminated by '\n' from (select 'op_id','account_name','op_ip','subsys_tag','op_type','op_content','op_result','begin_time','end_time','vnf_flag','log_time' union select op_id,account_name,op_ip,subsys_tag,op_type,op_content,op_result,begin_time,end_time,vnf_flag,log_time from operation_log) b", filePath) - case "security_log": - filePath = fmt.Sprintf("/tmp/%s-%s.csv", tbname, time.Now().Local().Format(global.DateData)) - sql = fmt.Sprintf("select * into outfile '%s' fields terminated by ',' escaped by '' optionally enclosed by '' lines terminated by '\n' from (select 'id','account_name','account_type','op_ip','op_type','op_content','op_result','op_time' union select id,account_name,account_type,op_ip,op_type,op_content,op_result,op_time from security_log) b", filePath) - case "alarm_log": - filePath = fmt.Sprintf("/tmp/%s-%s.csv", tbname, time.Now().Local().Format(global.DateData)) - sql = fmt.Sprintf("select * into outfile '%s' fields terminated by ',' escaped by '' optionally enclosed by '' lines terminated by '\n' from (select 'id','ne_type','ne_id','alarm_seq','alarm_id','alarm_code','alarm_status','event_time','log_time' union select id,ne_type,ne_id,alarm_seq,alarm_id,alarm_code,alarm_status,event_time,log_time from alarm_log) b", filePath) - default: - log.Error("error target table") - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - affected, err := db.ExecDB("", sql, nil) - if err != nil { - log.Error("Failed to exec SQL:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - log.Debugf("filePath:%s backup dir:%s", filePath, config.GetYamlConfig().OMC.Backup) - cmd := exec.Command("cp", "-rf", filePath, config.GetYamlConfig().OMC.Backup) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to exec:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - mapRow := make(map[string]interface{}) - row := map[string]interface{}{"affectedRows": affected} - mapRow[tbname] = row - services.ResponseWithJson(w, http.StatusOK, mapRow) -} diff --git a/features/lm/service.go b/features/lm/service.go deleted file mode 100644 index 5cdaa943..00000000 --- a/features/lm/service.go +++ /dev/null @@ -1,17 +0,0 @@ -// log management package - -package lm - -import ( - "be.ems/features/lm/file_export" - "be.ems/lib/log" - "github.com/gin-gonic/gin" -) - -func InitSubServiceRoute(r *gin.Engine) { - log.Info("======init Log management group gin.Engine") - - lmGroup := r.Group("/lm") - // register sub modules routes - file_export.Register(lmGroup) -} diff --git a/features/mml/mml.go b/features/mml/mml.go deleted file mode 100644 index 867c41e6..00000000 --- a/features/mml/mml.go +++ /dev/null @@ -1,705 +0,0 @@ -package mml - -import ( - "encoding/json" - "fmt" - "io" - "net" - "net/http" - "regexp" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/mmlp" - "be.ems/lib/services" - "be.ems/src/framework/constants" - neModel "be.ems/src/modules/network_element/model" - neService "be.ems/src/modules/network_element/service" -) - -// const ( -// //经过测试,linux下,延时需要大于100ms -// TIME_DELAY_AFTER_WRITE = 200 -// TIME_DEAD_LINE = 10 -// ) - -type Response struct { - Data []string `json:"data"` -} - -type MMLRequest struct { - MML []string `json:"mml"` -} - -var ( - // MML interface - UriMML = config.DefaultUriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml" - UriMML2 = config.DefaultUriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml2" - UriMMLDiscard = config.DefaultUriPrefix + "/opeartionManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml" - UriNeOmMml = config.DefaultUriPrefix + "/omManagement/{apiVersion}/mml/{netype}/{neid}" - UriOmMmlExt = config.DefaultUriPrefix + "/{managedType}/{apiVersion}/elementType/OMC/objectType/mml" - UriOmMmlInt = config.DefaultUriPrefix + "/omManagement/{apiVersion}/mml/{neType}/{neId}" - - CustomUriMML = config.UriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml" - CustomUriMML2 = config.UriPrefix + "/operationManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/mml2" - CustomUriNeOmMml = config.UriPrefix + "/omManagement/{apiVersion}/mml/{netype}/{neid}" - CustomUriOmMmlExt = config.UriPrefix + "/opeartionManagement/{apiVersion}/elementType/OMC/objectType/mml" - CustomUriOmMmlInt = config.UriPrefix + "/omManagement/{apiVersion}/mml/{neType}/{neId}" -) - -var ( - TIME_DELAY_AFTER_WRITE time.Duration = 200 - TIME_DEAD_LINE time.Duration = 10 - WIN_ROW_SIZE int16 = 200 - WIN_COL_SIZE int16 = 120 - BUFFER_SIZE int = 65535 -) - -func InitMML() { - if config.GetYamlConfig().MML.Sleep != 0 { - TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep) - } - if config.GetYamlConfig().MML.DeadLine != 0 { - TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine) - } - WIN_ROW_SIZE = config.GetYamlConfig().MML.SizeRow - WIN_COL_SIZE = config.GetYamlConfig().MML.SizeCol - BUFFER_SIZE = config.GetYamlConfig().MML.BufferSize -} - -func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { - log.Info("PostMML2ToNF processing... ") - - neType := ctx.GetParam(r, "elementTypeValue") - neId := ctx.GetQuery(r, "ne_id") - if neId == "" { - log.Error("NOT FOUND ne_id") - services.ResponseBadRequest400WrongParamValue(w) - return - } - log.Debug("neType:", neType, "neId", neId) - - neInfoArr := neService.NewNeInfo.Find(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) - if len(neInfoArr) < 1 { - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - neInfo := neInfoArr[0] - if neInfo.NeId != neId || neInfo.IP == "" || len(neInfo.Hosts) < 2 { - services.ResponseWithJson(w, 200, map[string]any{ - "code": 0, - "msg": "neInfo not found", - }) - return - } - telnetHost := neInfo.Hosts[1] - - buf := make([]byte, BUFFER_SIZE) - var n int - var mmlResult []string - hostMML := net.JoinHostPort(telnetHost.Addr, fmt.Sprintf("%d", telnetHost.Port)) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - // localAddr := conn.LocalAddr() - // remoteAddr := conn.RemoteAddr() - // if localAddr == nil || remoteAddr == nil { - // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - - // 发送窗口大小设置命令 - conn.Write([]byte{255, 251, 31}) // 发送WILL WINDOW SIZE - conn.Write([]byte{ - 255, 250, 31, - byte(WIN_COL_SIZE >> 8), byte(WIN_COL_SIZE & 0xFF), - byte(WIN_ROW_SIZE >> 8), byte(WIN_ROW_SIZE & 0xFF), - 255, 240, - }) // 发送设置 WINDOW SIZE - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - loginStr := fmt.Sprintf("%s\n%s\n", telnetHost.User, telnetHost.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0:n])) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - for _, mml := range mmlRequest.MML { - mmlCommand := fmt.Sprintf("%s\n", mml) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - } - - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) -} - -func PostMMLToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMMLToNF processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // 经过测试,linux下,延时需要大于100ms - // var TIME_DELAY_AFTER_WRITE time.Duration = 200 - // var TIME_DEAD_LINE time.Duration = 10 - // if config.GetYamlConfig().MML.Sleep != 0 { - // TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep) - // } - // if config.GetYamlConfig().MML.DeadLine != 0 { - // TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine) - // } - - neType := ctx.GetParam(r, "elementTypeValue") - neId := ctx.GetQuery(r, "ne_id") - if neId == "" { - log.Error("NOT FOUND ne_id") - services.ResponseBadRequest400WrongParamValue(w) - return - } - log.Debug("neType:", neType, "neId", neId) - - if strings.ToLower(neType) == "omc" { - PostMMLToOMC(w, r) - return - } - - neInfoArr := neService.NewNeInfo.Find(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) - if len(neInfoArr) < 1 { - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - neInfo := neInfoArr[0] - if neInfo.NeId != neId || neInfo.IP == "" || len(neInfo.Hosts) < 2 { - services.ResponseWithJson(w, 200, map[string]any{ - "code": 0, - "msg": "neInfo not found", - }) - return - } - telnetHost := neInfo.Hosts[1] - - var buf [20 * 1024]byte - //buf := make([]byte, 0) - var n int - var mmlResult []string - switch strings.ToLower(neType) { - case "xxx": - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - // n, err = conn.Read(buf[0:]) - // if err != nil { - // log.Error("Failed to read:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - // hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - // conn, err := net.Dial("tcp", hostMML) - // if err != nil { - // errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // defer conn.Close() - - // conn.SetDeadline(time.Now().Add(10 * time.Second)) - // loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - // _, err = conn.Write([]byte(loginStr)) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // n, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\n")) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // n, err = conn.Read(buf[0:]) - // if err != nil { - // log.Error("Failed to read:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - // n, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\n")) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // n, err = conn.Read(buf[0:]) - // if err != nil { - // log.Error("Failed to read:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - for _, mml := range mmlRequest.MML { - hostMML := net.JoinHostPort(telnetHost.Addr, fmt.Sprintf("%d", telnetHost.Port)) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - - loginStr := fmt.Sprintf("%s\n%s\n", telnetHost.User, telnetHost.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - //response := Response{mmlResult} - //services.ResponseWithJson(w, http.StatusOK, response) - //return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - mmlCommand := fmt.Sprintf("%s\n", mml) - log.Debug("mml command:", mmlCommand) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - //response := Response{mmlResult} - //services.ResponseWithJson(w, http.StatusOK, response) - //return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - //response := Response{mmlResult} - //services.ResponseWithJson(w, http.StatusOK, response) - //return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - // upf telnet buffer只能读取一次,需要去掉前面的多余字符 - //result := re1.ReplaceAllString(string(buf[config.GetYamlConfig().MML.UpfHeaderLength:n-len(neType)-2]), "") - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - conn.Close() - //mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2])) - - // can't read buffer from upf telnet server, so return ok always - // mmlResult = append(mmlResult, "COMMAND OK\n") - } - case "ims": - hostMML := net.JoinHostPort(telnetHost.Addr, fmt.Sprintf("%d", telnetHost.Port)) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - // localAddr := conn.LocalAddr() - // remoteAddr := conn.RemoteAddr() - // if localAddr == nil || remoteAddr == nil { - // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - - _, err = conn.Write([]byte(telnetHost.User + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0:n])) - - _, err = conn.Write([]byte(telnetHost.Password + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // loginStr := fmt.Sprintf("%s\r\n%s\r\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - // _, err = conn.Write([]byte(loginStr)) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - for _, mml := range mmlRequest.MML { - mmlCommand := fmt.Sprintf("%s\r\n", mml) - log.Debug("mml command:", mmlCommand) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - } - default: - hostMML := net.JoinHostPort(telnetHost.Addr, fmt.Sprintf("%d", telnetHost.Port)) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - // localAddr := conn.LocalAddr() - // remoteAddr := conn.RemoteAddr() - // if localAddr == nil || remoteAddr == nil { - // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - loginStr := fmt.Sprintf("%s\n%s\n", telnetHost.User, telnetHost.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0:n])) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - for _, mml := range mmlRequest.MML { - mmlCommand := fmt.Sprintf("%s\n", mml) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - - // UDM 特殊命令处理 - if neType == "UDM" && mml == "dec key" { - output, err := neService.NewNeInfo.NeRunSSHCmd(neInfo.NeType, neInfo.NeId, "cat /usr/local/etc/udm/ueKeyProfile.tmp") - if err != nil { - mmlResult = append(mmlResult, err.Error()) - } else { - mmlResult = append(mmlResult, output) - } - } - } - } - - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) -} - -func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMMLToOMC processing... ") - - neType := "OMC" //ctx.GetParam(r, "elementTypeValue") - neId := ctx.GetQuery(r, "ne_id") - if neId == "" { - log.Error("NOT FOUND ne_id") - services.ResponseBadRequest400WrongParamValue(w) - return - } - log.Debug("neType:", neType, "neId", neId) - - neInfoArr := neService.NewNeInfo.Find(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) - if len(neInfoArr) < 1 { - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - neInfo := neInfoArr[0] - if neInfo.NeId != neId || neInfo.IP == "" { - services.ResponseWithJson(w, 200, map[string]any{ - "code": 0, - "msg": "neInfo not found", - }) - return - } - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - hostUri := fmt.Sprintf("http://%s:%d", neInfo.IP, neInfo.Port) - omcMmlVar := &mmlp.MmlVar{ - Version: global.Version, - Output: mmlp.DefaultFormatType, - MmlHome: config.GetYamlConfig().MML.MmlHome, - Limit: 50, - User: "", - SessionToken: "", // 旧token - Authorization: r.Header.Get(constants.HEADER_KEY), // 请求Token - HttpUri: hostUri, - UserAgent: config.GetDefaultUserAgent(), - } - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - var mmlResult []string - mmlLine := strings.Join(mmlRequest.MML, ";") - - var mmlCmds []mmlp.MmlCommand - if err = mmlp.ParseMMLCommand(mmlLine, &mmlCmds); err != nil { - response := fmt.Sprintf("parse command error: %v\n", err) - mmlResult = append(mmlResult, response) - } - - for _, mmlCmd := range mmlCmds { - output, err := mmlp.TransMml2HttpReq(omcMmlVar, &mmlCmd) - if err != nil { - response := fmt.Sprintf("translate MML command error: %v]\n", err) - mmlResult = append(mmlResult, response) - } - mmlResult = append(mmlResult, string(*output)) - } - - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) -} diff --git a/features/nbi/file/controller.go b/features/nbi/file/controller.go deleted file mode 100644 index cc5edc88..00000000 --- a/features/nbi/file/controller.go +++ /dev/null @@ -1,257 +0,0 @@ -package nbi_file - -import ( - "archive/zip" - "fmt" - "io" - "net/http" - "os" - "path/filepath" - "time" - - "be.ems/lib/dborm" - "be.ems/lib/file" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "github.com/gin-gonic/gin" -) - -type SysJobResponse struct { - SysJob - TableName string `json:"tableName"` - TableDisplay string `json:"tableDisplay"` - FilePath string `json:"filePath"` -} - -type TargetParams struct { - Duration int `json:"duration"` - TableName string `json:"tableName"` - Columns string `json:"columns"` // exported column name of time string - TimeCol string `json:"timeCol"` // time stamp of column name - TimeUnit string `json:"timeUnit"` // timestamp unit: second/micro/milli - Extras string `json:"extras"` // extras condition for where - FilePath string `json:"filePath"` // file path -} - -func (m *FileNBI) GetFileList(c *gin.Context) { - var querys FileNBIQuery - - querys.Category = c.Param("category") - querys.Type = c.Param("type") - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - if querys.Path == "" { - tableName := "" - ok := false - switch querys.Category { - case "cdr": - tableName, ok = CDRTableMapper[querys.Type] - if tableName == "" || !ok { - c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid CDR file type: %s", querys.Type))) - return - } - case "log": - tableName, ok = LogTableMapper[querys.Type] - if tableName == "" || !ok { - c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file type: %s", querys.Type))) - return - } - default: - c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file category: %s", querys.Category))) - return - } - - s := SysJob{} - where := fmt.Sprintf("invoke_target='%s' and status=1 and JSON_UNQUOTE(JSON_EXTRACT(target_params,'$.tableName'))='%s'", INVOKE_FILE_EXPORT, tableName) - _, err := dborm.XEngDB().Table(s.TableName()). - Select("JSON_UNQUOTE(JSON_EXTRACT(target_params, '$.filePath')) as file_path"). - Where(where). - Get(&querys.Path) - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - } - - files, err := file.GetFileInfo(querys.Path, querys.Suffix) - if err != nil { - log.Error("failed to GetFileInfo:", err) - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // split files list - lenNum := int64(len(files)) - start := (querys.PageNum - 1) * querys.PageSize - end := start + querys.PageSize - var splitList []file.FileInfo - if start >= lenNum { - splitList = []file.FileInfo{} - } else if end >= lenNum { - splitList = files[start:] - } else { - splitList = files[start:end] - } - total := len(files) - c.JSON(http.StatusOK, services.TotalDataResp(splitList, total)) -} - -func (m *FileNBI) Total(c *gin.Context) { - dir := c.Query("path") - - fileCount, dirCount, err := file.GetFileAndDirCount(dir) - if err != nil { - log.Error("failed to GetFileAndDirCount:", err) - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - total := fileCount + dirCount - c.JSON(http.StatusOK, services.TotalResp(int64(total))) -} - -func (m *FileNBI) GetSingleFileHandler(c *gin.Context) { - var querys FileNBIQuery - - querys.Category = c.Param("category") - querys.Type = c.Param("type") - querys.DateIndex = c.Param("dateIndex") - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - tableName := "" - if querys.Path == "" { - ok := false - switch querys.Category { - case "cdr": - tableName, ok = CDRTableMapper[querys.Type] - if tableName == "" || !ok { - c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid CDR file type: %s", querys.Type))) - return - } - case "log": - tableName, ok = LogTableMapper[querys.Type] - if tableName == "" || !ok { - c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file type: %s", querys.Type))) - return - } - default: - c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file category: %s", querys.Category))) - return - } - - s := SysJob{} - where := fmt.Sprintf("invoke_target='%s' and status=1 and JSON_UNQUOTE(JSON_EXTRACT(target_params,'$.tableName'))='%s'", INVOKE_FILE_EXPORT, tableName) - _, err := dborm.XEngDB().Table(s.TableName()). - Select("JSON_UNQUOTE(JSON_EXTRACT(target_params, '$.filePath')) as file_path"). - Where(where). - Get(&querys.Path) - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - } - - fileName := tableName + "_export_" + querys.DateIndex + "0000" + ".csv" - filePath := filepath.Join(querys.Path, fileName) - - file, err := os.Open(filePath) - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - defer file.Close() - - if _, err := os.Stat(filePath); os.IsNotExist(err) { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.Header("Content-Disposition", "attachment; filename="+fileName) - c.Header("Content-Type", "application/octet-stream") - c.File(filePath) -} - -func (m *FileNBI) GetMultiFileHandler(c *gin.Context) { - var querys FileNBIQuery - - querys.Category = c.Param("category") - querys.Type = c.Param("type") - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - tableName := "" - if querys.Path == "" { - ok := false - switch querys.Category { - case "cdr": - tableName, ok = CDRTableMapper[querys.Type] - if tableName == "" || !ok { - c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid CDR file type: %s", querys.Type))) - return - } - case "log": - tableName, ok = LogTableMapper[querys.Type] - if tableName == "" || !ok { - c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file type: %s", querys.Type))) - return - } - default: - c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file category: %s", querys.Category))) - return - } - - s := SysJob{} - where := fmt.Sprintf("invoke_target='%s' and status=1 and JSON_UNQUOTE(JSON_EXTRACT(target_params,'$.tableName'))='%s'", INVOKE_FILE_EXPORT, tableName) - _, err := dborm.XEngDB().Table(s.TableName()). - Select("JSON_UNQUOTE(JSON_EXTRACT(target_params, '$.filePath')) as file_path"). - Where(where). - Get(&querys.Path) - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - } - - zipWriter := zip.NewWriter(c.Writer) - defer zipWriter.Close() - - for _, fileName := range querys.FileNames { - filePath := filepath.Join(querys.Path, fileName) - - file, err := os.Open(filePath) - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - defer file.Close() - - if _, err := os.Stat(filePath); os.IsNotExist(err) { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - writer, err := zipWriter.Create(filepath.Base(fileName)) - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - if _, err := io.Copy(writer, file); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - } - zipFile := tableName + "_export_" + time.Now().Local().Format(global.DateData) + ".zip" - c.Header("Content-Disposition", "attachment; filename="+zipFile) - c.Header("Content-Type", "application/zip") - //c.File(filePath) -} diff --git a/features/nbi/file/model.go b/features/nbi/file/model.go deleted file mode 100644 index 5dcdd9fa..00000000 --- a/features/nbi/file/model.go +++ /dev/null @@ -1,47 +0,0 @@ -package nbi_file - -import ( - "be.ems/lib/file" -) - -const ( - INVOKE_FILE_EXPORT = "exportTable" -) - -var CDRTableMapper map[string]string = map[string]string{ - "ims": "cdr_event_ims", - "smf": "cdr_event_smf", - "smsc": "cdr_event_smsc", - "sms": "cdr_event_smsc", -} - -var LogTableMapper map[string]string = map[string]string{ - "operate": "sys_log_operate", - "security": "sys_log_login", - "alarm": "alarm_log", -} - -type SysJob struct { - JobID int64 `gorm:"column:job_id;primary_key;auto_increment" json:"job_id"` //任务ID - InvokeTarget string `gorm:"column:invoke_target" json:"invoke_target"` //调用目标字符串 - TargetParams string `gorm:"column:target_params;type:json" json:"target_params,omitempty"` //调用目标传入参数 -} - -func (s *SysJob) TableName() string { - return "sys_job" -} - -type FileNBI struct { - file.FileInfo -} - -type FileNBIQuery struct { - Category string `form:"category" binding:"required"` - Type string `form:"type" binding:"required"` - DateIndex string `form:"dateIndex"` - Path string `json:"path" form:"path"` - FileNames []string `json:"fileName" form:"fileName"` - Suffix string `form:"suffix"` - PageNum int64 `form:"pageNum"` - PageSize int64 `form:"pageSize"` -} diff --git a/features/nbi/file/route.go b/features/nbi/file/route.go deleted file mode 100644 index 45c87e62..00000000 --- a/features/nbi/file/route.go +++ /dev/null @@ -1,26 +0,0 @@ -package nbi_file - -import ( - "be.ems/src/framework/middleware" - "github.com/gin-gonic/gin" -) - -// Register Routes for file_export -func Register(r *gin.RouterGroup) { - fileNBI := r.Group("/file") - { - var f *FileNBI - fileNBI.GET("/:category/:type/list", - middleware.AuthorizeUser(nil), - f.GetFileList, - ) - fileNBI.GET("/:category/:type/:dateIndex", - middleware.AuthorizeUser(nil), - f.GetSingleFileHandler, - ) - fileNBI.GET("/:category/:type", - middleware.AuthorizeUser(nil), - f.GetMultiFileHandler, - ) - } -} diff --git a/features/nbi/nbi.go b/features/nbi/nbi.go deleted file mode 100644 index 44ce90dd..00000000 --- a/features/nbi/nbi.go +++ /dev/null @@ -1,258 +0,0 @@ -package nbi - -import ( - "bytes" - "fmt" - "net/http" - "strings" - - "be.ems/lib/dborm" - "github.com/go-resty/resty/v2" - - "github.com/gorilla/mux" - - "be.ems/lib/config" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/oauth" - "be.ems/lib/services" -) - -type ErrorOAuthResponse struct { - Error map[string]interface{} -} - -type FailOAuthResponse struct { - Error struct { - ErrorCode string - ErrorInfo string - } -} - -type ApiResponse struct { - ResultCode string - ResultMessage interface{} -} - -//var globalSession = session.NewSessManager("restagent") - -var ( - MAX_RMUID_NUM int - MAX_ALARMID_NUM int - MAX_PMUID_NUM int - MAX_SUBID_NUM int - MAX_URI_LEN int - RMUID_REGEXP string -) - -var ( - // Northbound interface - GetNRMUri = config.DefaultUriPrefix + "/resourceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" - NorthboundGetAlarmUri = config.DefaultUriPrefix + "/faultManagement/{apiVersion}/alarms" // ?alarmIds={alarmIdValues} - - CustomGetNRMUri = config.UriPrefix + "/resourceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/{objectTypeValue}" -) - -func CheckParameterName(r *http.Request) []string { - var errorParams []string - vars := r.URL.Query() - for k, v := range vars { - log.Debug("vars:", k, v) - if k != "rmUIDs" && k != "fields" { - errorParams = append(errorParams, k) - } - } - - return errorParams -} - -func GetRmUIDArr(r *http.Request) []string { - vars := r.URL.Query() - rmUIDs, ok := vars["rmUIDs"] - if !ok { - log.Debug("rmUIDs is not exist") - return nil - } - - var rmUIDValues []string - for _, r := range rmUIDs { - if r != "" { - rmUIDValues = global.MergeStringArr(rmUIDValues, strings.Split(r, `,`)) - } - } - - return rmUIDValues -} - -func GetAttrNameArr(r *http.Request) []string { - vars := r.URL.Query() - fields, ok := vars["fields"] - if !ok { - log.Debug("attributeNames does not exist") - return nil - } - var attrNames []string - for _, a := range fields { - if a != "" { - attrNames = global.MergeStringArr(attrNames, strings.Split(a, `,`)) - } - } - - return attrNames -} - -func CheckValidRmUID(rmUIDs []string) []string { - log.Debug("CheckValidRmUID processing... ") - - var invalidRmUIDs []string - for _, r := range rmUIDs { - if !global.MatchRmUID(RMUID_REGEXP, r) { - invalidRmUIDs = append(invalidRmUIDs, r) - } - } - - return invalidRmUIDs -} - -func CheckLocalRmUID(rmUIDs []string) string { - log.Debug("GetLocalRmUID processing... ") - - rmUID := config.GetRmUIDFromConfig() - for _, r := range rmUIDs { - if r == rmUID { - return rmUID - } - } - - return "" -} - -func NBIGetNRMFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("NBIGetNRMFromNF processing... ") - - // response 414-4 uri too long ? (optional) - // todo ... ? - if bytes.Count([]byte(r.RequestURI), nil) > config.GetUriMaxLenFromConfig() { - log.Error("Request Uri too long:", bytes.Count([]byte(r.RequestURI), nil), config.GetUriMaxLenFromConfig()) - services.ResponseRequestURITooLong414UriTooLong(w) - return - } - - // check media type(content type) only support "application/json" - // response 415-1 - if !services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // error processing ... - // 401-1 response - token, ret := oauth.IsCarriedToken(r) - if ret == false { - log.Error("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - // 401-2 response - if dborm.XormExistValidToken(token, config.GetExpiresFromConfig()) == false { - log.Error("AccessToken fails or does not exist") - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } - - _, err := dborm.XormUpdateSessionShakeTime(token) - if err != nil { - log.Error("Failed to update session table:", err) - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } - - /* - // response 403 Forbidden, permissions deny - // todo... - plist := globalSession.GetPermissionFromSession(token) - log.Debug("permission list:", plist) - if len(plist) == 0 || plist[0] == false { - log.Debug("User permission deny") - services.ResponseForbidden403NotPermission(w) - return - } - */ - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - - apiVer := vars["apiVersion"] - if apiVer != "v1" { - log.Error("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 406-1 - rmUIDValues := GetRmUIDArr(r) - if rmUIDValues == nil { - log.Error("missing parameter: rmUIDs") - services.ResponseNotAcceptable406MissingParam(w) - return - } - - // response 406-2 - errorParams := CheckParameterName(r) - if errorParams != nil { - log.Error("parameter name error: ", errorParams) - services.ResponseNotAcceptable406ParamError(w, errorParams) - return - } - - // response 400-5 - if len(rmUIDValues) == 0 { - log.Error("rmUIDs is wrong or NULL") - services.ResponseBadRequest400WrongParamValue(w) - return - } - - // response 414-1 - if len(rmUIDValues) > config.GetYamlConfig().Params.RmUIDMaxNum { - log.Error("rmUID greater than", config.GetYamlConfig().Params.RmUIDMaxNum) - services.ResponseRequestURITooLong414NRMNumExceed(w, config.GetYamlConfig().Params.RmUIDMaxNum) - return - } - - var response *resty.Response - respMsg := make(map[string]interface{}) - for _, rmUID := range rmUIDValues { - neInfo, err := dborm.XormGetNeInfoByRmUID(neType, rmUID) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: GET ", requestURI2NF) - - client := resty.New() - response, 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("Failed to Get from NF:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - switch response.StatusCode() { - case http.StatusOK, http.StatusAccepted, http.StatusNoContent, http.StatusCreated: - respMsg["data"] = response - default: - if response != nil { - services.TransportResponse(w, response.StatusCode(), response.Body()) - } - } - } - - services.TransportResponse(w, response.StatusCode(), response.Body()) -} diff --git a/features/nbi/service.go b/features/nbi/service.go deleted file mode 100644 index 7b913d5c..00000000 --- a/features/nbi/service.go +++ /dev/null @@ -1,16 +0,0 @@ -// log management package - -package nbi - -import ( - nbi_file "be.ems/features/nbi/file" - "be.ems/lib/log" - "github.com/gin-gonic/gin" -) - -func InitSubServiceRoute(r *gin.Engine) { - log.Info("======init North-Bound Interface group gin.Engine") - - nbiGroup := r.Group("/nbi") - nbi_file.Register(nbiGroup) -} diff --git a/features/nbi/snmp.go b/features/nbi/snmp.go deleted file mode 100644 index 9e5e727b..00000000 --- a/features/nbi/snmp.go +++ /dev/null @@ -1,203 +0,0 @@ -package nbi - -import ( - "bytes" - "fmt" - "net/http" - "strconv" - - "github.com/gorilla/mux" - g "github.com/gosnmp/gosnmp" - - "be.ems/lib/config" - "be.ems/lib/log" - "be.ems/lib/services" -) - -func init() { - conf := config.GetYamlConfig() - // Default is a pointer to a GoSNMP struct that contains sensible defaults - // eg port 161, community public, etc - g.Default.Target = conf.NE.Addr - g.Default.Port = conf.NE.Port - err := g.Default.Connect() - if err != nil { - fmt.Printf("Connect() err: %v", err) - } - //defer g.Default.Conn.Close() - MAX_RMUID_NUM = config.GetRmUIDMaxNumFromConfig() - MAX_ALARMID_NUM = config.GetAlarmIDMaxNumFromConfig() - MAX_PMUID_NUM = config.GetPmIDMaxNumFromConfig() - MAX_SUBID_NUM = config.GetSubIDMaxNumFromConfig() - MAX_URI_LEN = config.GetUriMaxLenFromConfig() - RMUID_REGEXP = config.GetRmUIDRegexpFromConfig() -} - -func GetNRMByUri(w http.ResponseWriter, r *http.Request) { - log.Debug("GetNRMByUri processing... ") - - // response 414-4 uri too long ? (optional) - // todo ... ? - if bytes.Count([]byte(r.RequestURI), nil) > MAX_URI_LEN { - log.Error("Request Uri too long:", bytes.Count([]byte(r.RequestURI), nil)) - services.ResponseRequestURITooLong414UriTooLong(w) - return - } - - // check media type(content type) only support "application/json" - // response 415-1 - if !services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // error processing ... - // 401-1 response - // token, ret := globalSession.IsCarriedToken(r) - // if ret == false { - // log.Error("AccessToken is not carried") - // services.ResponseUnauthorized401AccessTokenNotCarried(w) - // return - // } - - // 401-2 response - // if globalSession.IsValidToken(token) == false { - // log.Error("AccessToken fails or does not exist") - // services.ResponseUnauthorized401AccessTokenNotExist(w) - // return - // } - // response 403 Forbidden, permissions deny - // todo... - // plist := globalSession.GetPermissionFromSession(token) - // log.Debug("permission list:", plist) - // if len(plist) == 0 || plist[0] == false { - // log.Error("User permission deny") - // services.ResponseForbidden403NotPermission(w) - // return - // } - - vars := mux.Vars(r) - qeuryUri := vars["apiCategory"] + "/" + vars["elementTypeValue"] + "/" + vars["objectTypeValue"] - log.Debug("Get by Uri: ", qeuryUri) - - apiVer := vars["apiVersion"] - if apiVer != "v1" { - log.Error("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 406-1 - rmUIDValues := GetRmUIDArr(r) - if rmUIDValues == nil { - log.Error("missing parameter: rmUIDs") - services.ResponseNotAcceptable406MissingParam(w) - return - } - - // response 406-2 - errorParams := CheckParameterName(r) - if errorParams != nil { - log.Error("parameter name error: ", errorParams) - services.ResponseNotAcceptable406ParamError(w, errorParams) - return - } - - // response 400-5 - if len(rmUIDValues) == 0 { - log.Error("rmUIDs is wrong or NULL") - services.ResponseBadRequest400WrongParamValue(w) - return - } - - // response 414-1 - if len(rmUIDValues) > MAX_RMUID_NUM { - log.Error("rmUID greater than", MAX_RMUID_NUM) - services.ResponseRequestURITooLong414NRMNumExceed(w, MAX_RMUID_NUM) - return - } - - // response 400-1 - // check rmUID is valid - // todo ... - invalidRmUIDs := CheckValidRmUID(rmUIDValues) - if len(invalidRmUIDs) != 0 { - log.Error("rmUID is invalid") - services.ResponseBadRequest400RmUIDsIsInvalid(w, invalidRmUIDs) - return - } - - // response 404-2 - rmUID := CheckLocalRmUID(rmUIDValues) - if rmUID == "" { - log.Error("rmUID does not exist") - services.ResponseNotFound404NRMNotExist(w, rmUIDValues) - return - } - - // response 404-1, uri is not exist in map - attrNames := GetAttrNameArr(r) - var Oids []string - Oids = *config.GetOidByFileds(qeuryUri, attrNames, &Oids) - if len(Oids) == 0 { - log.Error("Nothing of config map") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // response 404-1, uri is not exist in map - var nameOids []config.NameOid - nameOids = *config.GetDataOidByFields(qeuryUri, attrNames, &nameOids) - if len(nameOids) == 0 { - log.Error("Nothing of config map") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - result, err2 := g.Default.Get(Oids) // Get() accepts up to g.MAX_OIDS - if err2 != nil { - log.Fatalf("Get() err: %v", err2) - - } - - // var nameValues []config.NameValue - var nameValue config.NameValue - - nameValues := make(map[string]interface{}) - nameValues["rmUID"] = rmUID - for i, variable := range result.Variables { - nameValue.Name = nameOids[i].Name - log.Debugf("%d: oid: %s name: %s\n", i, variable.Name, nameValue.Name) - // if nameOids[i].Oid == variable.Name && global.IsContain(attributeNames, nameValue.Name) { - if nameOids[i].Oid == variable.Name { - // the Value of each variable returned by Get() implements - // interface{}. You could do a type switch... - switch variable.Type { - case g.OctetString: - bytes := variable.Value.([]byte) - log.Debugf("string: %s\n", string(bytes)) - nameValue.Value = string(bytes) - nameValues[nameValue.Name] = nameValue.Value - case g.Integer: - value := variable.Value.(int) - log.Debugf("integer: %d\n", value) - nameValue.Value = strconv.Itoa(value) - nameValues[nameValue.Name] = nameValue.Value - case g.IPAddress: - value := variable.Value.(string) - log.Debugf("IPAddress: %s\n", variable.Value) - nameValue.Value = value - nameValues[nameValue.Name] = nameValue.Value - default: - // ... or often you're just interested in numeric values. - // ToBigInt() will return the Value as a BigInt, for plugging - // into your calculations. - log.Debugf("number: %d\n", g.ToBigInt(variable.Value)) - } - } - } - - getResponse := services.DataResponse{nameValues} - services.ResponseWithJson(w, http.StatusOK, getResponse) -} diff --git a/features/pm/kpi_c_report/controller.go b/features/pm/kpi_c_report/controller.go deleted file mode 100644 index 63350aa9..00000000 --- a/features/pm/kpi_c_report/controller.go +++ /dev/null @@ -1,349 +0,0 @@ -package kpi_c_report - -import ( - "encoding/json" - "fmt" - "net/http" - "strconv" - "strings" - - "be.ems/lib/services" - "be.ems/src/framework/database/db" - "be.ems/src/framework/utils/parse" - "github.com/gin-gonic/gin" -) - -func (k *KpiCReport) Get(c *gin.Context) { - var reports []KpiCReport - var conditions []string - var params []any - - var querys KpiCReportQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusBadRequest, services.ErrResp(err.Error())) - return - } - - // construct condition to get - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(querys.NeType)) - } else { - c.JSON(http.StatusBadRequest, services.ErrResp("Not found NE type")) - return - } - tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dbg := db.DB("").Model(&KpiCReport{}).Table(tableName) - - if querys.NeID != "" { - conditions = append(conditions, "rm_uid = (select n.rm_uid from ne_info n where n.ne_type=? and n.ne_id=?)") - params = append(params, strings.ToUpper(querys.NeType), querys.NeID) - } else { - c.JSON(http.StatusBadRequest, services.ErrResp("Not found required parameter NE ID")) - return - } - if querys.StartTime != "" { - conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") - params = append(params, querys.EndTime) - } - conditions = append(conditions, "kpi_values != 'null'") - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - // page number and size - if pageSize := querys.PageSize; pageSize > 0 { - dbg = dbg.Limit(pageSize) - if pageNum := querys.PageNum; pageNum > 0 { - dbg = dbg.Offset((pageNum - 1) * pageSize) - } - } - - // order by - if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { - orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dbg = dbg.Order(orderBy) - } - - //err := db.DB("").Table(tableName).Where(whereSql, params...).Find(&reports).Error - err := dbg.Find(&reports).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusOK, services.DataResp(reports)) -} - -func (k *KpiCReport) GetReport2FE(c *gin.Context) { - var results []KpiCReport - var conditions []string - var params []any - - var querys KpiCReportQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // construct condition to get - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(querys.NeType)) - } else { - c.JSON(http.StatusOK, services.ErrResp("Not found required parameter NE type")) - return - } - tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dbg := db.DB("").Model(&KpiCReport{}).Table(tableName) - - if querys.NeID != "" { - conditions = append(conditions, "rm_uid = (select n.rm_uid from ne_info n where n.ne_type=? and n.ne_id=?)") - params = append(params, querys.NeType, querys.NeID) - } else { - c.JSON(http.StatusBadRequest, services.ErrResp("Not found required parameter NE ID")) - return - } - if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") - params = append(params, querys.EndTime) - } - conditions = append(conditions, "kpi_values != 'null'") - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - // page number and size - if pageSize := querys.PageSize; pageSize > 0 { - dbg = dbg.Limit(pageSize) - if pageNum := querys.PageNum; pageNum > 0 { - dbg = dbg.Offset((pageNum - 1) * pageSize) - } - } - - // order by - if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { - orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dbg = dbg.Order(orderBy) - } - - //err := db.DB("").Table(tableName).Where(whereSql, params...).Find(&reports).Error - err := dbg.Find(&results).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - reports := []map[string]any{} - for _, r := range results { - report := map[string]any{ - // kip_id ... - "neType": *r.NeType, - "neId": querys.NeID, - "neName": *r.NeName, - "rmUID": *r.RmUID, - "startIndex": r.Index, - "timeGroup": r.Date[:10] + " " + *r.EndTime, - "createdAt": r.CreatedAt, - "granularity": r.Granularity, - } - // 解析 JSON 字符串为 map - var kpiValues []map[string]any - err := json.Unmarshal([]byte(r.KpiValues), &kpiValues) - if err != nil { - continue - } - - // 遍历 kpiValues 数组 - for _, k := range kpiValues { - kpiId := fmt.Sprint(k["kpiId"]) - value := parse.Number(k["value"]) - - formatted := fmt.Sprintf("%.3d", value) - formattedFloat, err := strconv.ParseFloat(formatted, 64) - if err != nil { - formattedFloat = 0 - } - report[kpiId] = formattedFloat - } - reports = append(reports, report) - } - c.JSON(http.StatusOK, services.DataResp(reports)) -} - -func (k *KpiCReport) GetTotalList(c *gin.Context) { - var reports []KpiCReport - var conditions []string - var params []any - - var querys KpiCReportQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // construct condition to get - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(querys.NeType)) - } else { - c.JSON(http.StatusOK, services.ErrResp("Not found NE type")) - return - } - tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dbg := db.DB("").Model(&KpiCReport{}).Table(tableName) - - if querys.StartTime != "" { - conditions = append(conditions, "created_at >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "created_at <= ?") - params = append(params, querys.EndTime) - } - conditions = append(conditions, "kpi_values != 'null'") - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - - // get total number - var total int64 = 0 - err := dbg.Count(&total).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // page number and size - if pageSize := querys.PageSize; pageSize > 0 { - dbg = dbg.Limit(pageSize) - if pageNum := querys.PageNum; pageNum > 0 { - dbg = dbg.Offset((pageNum - 1) * pageSize) - } - } - - // order by - if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { - orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dbg = dbg.Order(orderBy) - } - - //err := db.DB("").Table(tableName).Where(whereSql, params...).Find(&reports).Error - err = dbg.Find(&reports).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.JSON(http.StatusOK, services.TotalDataResp(reports, total)) -} - -func (k *KpiCReport) Total(c *gin.Context) { - var conditions []string - var params []any - - var querys KpiCReportQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // construct condition to get - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(querys.NeType)) - } else { - c.JSON(http.StatusOK, services.ErrResp("Not found NE type")) - return - } - tableName := TableName() + "_" + strings.ToLower(querys.NeType) - dbg := db.DB("").Model(&KpiCReport{}).Table(tableName) - if querys.StartTime != "" { - conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "(UNIX_TIMESTAMP(created_at) * 1000) <= ?") - params = append(params, querys.EndTime) - } - conditions = append(conditions, "kpi_values != 'null'") - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - var total int64 = 0 - err := dbg.Count(&total).Error - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.JSON(http.StatusOK, services.TotalResp(total)) -} - -func (k *KpiCReport) Post(c *gin.Context) { - var report KpiCReport - - if err := c.ShouldBindJSON(&report); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - dbg := db.DB("").Model(&KpiCReport{}) - if err := dbg.Create(&report).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - c.JSON(http.StatusCreated, services.DataResp(report)) -} - -func (k *KpiCReport) Put(c *gin.Context) { - var report KpiCReport - id := c.Param("id") - dbg := db.DB("").Model(&KpiCReport{}) - if err := dbg.First(&report, id).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp("custom indicator report not found")) - return - } - - if err := c.ShouldBindJSON(&report); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - db.DB("").Model(&KpiCReport{}).Save(&report) - c.JSON(http.StatusOK, services.DataResp(report)) -} - -func (k *KpiCReport) Delete(c *gin.Context) { - id := c.Param("id") - - if err := db.DB("").Delete(&KpiCReport{}, id).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp("custom indicator report not found")) - return - } - - c.JSON(http.StatusNoContent, nil) // 204 No Content -} - -func InsertKpiCReport(neType string, report KpiCReport) { - tableName := TableName() + "_" + strings.ToLower(neType) - dbg := db.DB("").Model(&KpiCReport{}) - if err := dbg.Table(tableName).Create(&report).Error; err != nil { - return - } -} diff --git a/features/pm/kpi_c_report/model.go b/features/pm/kpi_c_report/model.go deleted file mode 100644 index 82a3c505..00000000 --- a/features/pm/kpi_c_report/model.go +++ /dev/null @@ -1,42 +0,0 @@ -package kpi_c_report - -type KpiCReport struct { - ID int `gorm:"column:id;primary_key;auto_increment" json:"id"` - NeType *string `gorm:"column:ne_type;default:NULL" json:"neType,omitempty"` - NeName *string `gorm:"column:ne_name;default:" json:"neName,omitempty"` - RmUID *string `gorm:"column:rm_uid;" json:"rmUid,omitempty"` - Date string `gorm:"column:date" json:"date"` // time.Time `gorm:"column:date" json:"date"` - StartTime *string `gorm:"column:start_time" json:"startTime,omitempty"` - EndTime *string `gorm:"column:end_time" json:"endTime,omitempty"` - Index int64 `gorm:"column:index" json:"index"` - Granularity *int64 `gorm:"column:granularity" json:"granularity,omitempty"` //Time granualarity: 5/10/.../60/300 (second) - KpiValues string `gorm:"column:kpi_values" json:"kpiValues,omitempty"` - CreatedAt *int64 `gorm:"column:created_at" json:"createdAt,omitempty"` -} - -type KpiCReportQuery struct { - NeType string `json:"neType" form:"neType" binding:"required"` - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` - UserName string `json:"userName" form:"userName"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=created_at"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int `json:"pageNum" form:"pageNum"` - PageSize int `json:"pageSize" form:"pageSize"` -} - -type KpiCReport2FE struct { - NeType string `json:"neType" gorm:"column:ne_type"` - NeId string `json:"neId"` - NeName string `json:"neName" gorm:"column:ne_name"` - RmUID string `json:"rmUid" gorm:"column:rm_uid"` - TimeGroup string `json:"timeGroup"` - StartIndex int16 `json:"startIndex" gorm:"column:index"` - Granularity int8 `json:"granularity" gorm:"column:granularity"` -} - -func TableName() string { - return "kpi_c_report" -} diff --git a/features/pm/kpi_c_report/route.go b/features/pm/kpi_c_report/route.go deleted file mode 100644 index 037d936c..00000000 --- a/features/pm/kpi_c_report/route.go +++ /dev/null @@ -1,43 +0,0 @@ -package kpi_c_report - -import ( - "be.ems/src/framework/middleware" - "github.com/gin-gonic/gin" -) - -// Register Routes for kpi_c_report -func Register(r *gin.RouterGroup) { - - pmKPIC := r.Group("/kpiC") - { - var k *KpiCReport - pmKPIC.GET("/report", - middleware.AuthorizeUser(nil), - k.GetReport2FE, - ) - pmKPIC.GET("/report/list", - middleware.AuthorizeUser(nil), - k.Get, - ) - pmKPIC.GET("/report/totalList", - middleware.AuthorizeUser(nil), - k.Total, - ) - pmKPIC.GET("/report/total", - middleware.AuthorizeUser(nil), - k.Total, - ) - pmKPIC.POST("/report", - middleware.AuthorizeUser(nil), - k.Post, - ) - pmKPIC.PUT("/report/:id", - middleware.AuthorizeUser(nil), - k.Put, - ) - pmKPIC.DELETE("/report/:id", - middleware.AuthorizeUser(nil), - k.Delete, - ) - } -} diff --git a/features/pm/kpi_c_title/controller.go b/features/pm/kpi_c_title/controller.go deleted file mode 100644 index 50c2b685..00000000 --- a/features/pm/kpi_c_title/controller.go +++ /dev/null @@ -1,312 +0,0 @@ -package kpi_c_title - -import ( - "fmt" - "net/http" - "regexp" - "sort" - "strconv" - "strings" - "time" - - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - "be.ems/src/framework/reqctx" - - "github.com/gin-gonic/gin" -) - -// get customize kpi total and list -func (k *KpiCTitle) GetToalList(c *gin.Context) { - var titles []KpiCTitle - var conditions []string - var params []any - i18n := reqctx.AcceptLanguage(c) - - var querys KpiCTitleQuery - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - dbg := db.DB("").Model(&KpiCTitle{}) - // construct condition to get - if neType := querys.NeType; neType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(neType)) - } - if status := querys.Status; status != "" { - conditions = append(conditions, "status = ?") - params = append(params, status) - } else { - conditions = append(conditions, "status != '2'") - } - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - dbg = dbg.Where(whereSql, params...) - } - - // Get total number - var total int64 = 0 - if err := dbg.Count(&total).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - // page number and size - if pageSize := querys.PageSize; pageSize > 0 { - dbg = dbg.Limit(pageSize) - if pageNum := querys.PageNum; pageNum > 0 { - dbg = dbg.Offset((pageNum - 1) * pageSize) - } - } - - // order by - if sortField, sortOrder := querys.SortField, querys.SortOrder; sortField != "" && sortOrder != "" { - orderBy := fmt.Sprintf("%s %s", sortField, sortOrder) - dbg = dbg.Order(orderBy) - } - if err := dbg.Find(&titles).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - k.expressionAlias(titles, i18n) - - c.JSON(http.StatusOK, services.TotalDataResp(titles, total)) - //c.JSON(http.StatusOK, titles) -} - -func (k *KpiCTitle) Get(c *gin.Context) { - var titles []KpiCTitle - var conditions []string - var params []any - i18n := reqctx.AcceptLanguage(c) - - // construct condition to get - if neType := c.Query("neType"); neType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(neType)) - } - if status := c.Query("status"); status != "" { - conditions = append(conditions, "status = ?") - params = append(params, status) - } else { - conditions = append(conditions, "status != '2'") - } - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - } - if err := db.DB("").Where(whereSql, params...).Find(&titles).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - k.expressionAlias(titles, i18n) - - c.JSON(http.StatusOK, services.DataResp(titles)) - //c.JSON(http.StatusOK, titles) -} - -// alias customized kpi expression with cn/en title -func (k *KpiCTitle) expressionAlias(titles []KpiCTitle, i18n string) { - var title *KpiCTitle - for i := 0; i < len(titles); i++ { - title = &titles[i] - title.ExprAlias = *title.Expression - re := regexp.MustCompile(`'([^']+)'`) - matches := re.FindAllStringSubmatch(title.ExprAlias, -1) - - for _, match := range matches { - var alias, sql string - if i18n == "zh" { - sql = fmt.Sprintf("SELECT cn_title FROM kpi_title WHERE kpi_id='%s'", match[1]) - } else { - sql = fmt.Sprintf("SELECT en_title FROM kpi_title WHERE kpi_id='%s'", match[1]) - } - m, err := db.RawDB("", sql, nil) - if err != nil { - log.Warn("Failed to QueryRow:", err) - continue - } - if len(m) > 0 { - if i18n == "zh" { - alias = fmt.Sprintf("%v", m[0]["cn_title"]) - } else { - alias = fmt.Sprintf("%v", m[0]["en_title"]) - } - } - title.ExprAlias = regexp.MustCompile(match[1]).ReplaceAllString(title.ExprAlias, alias) - } - } -} - -func (k *KpiCTitle) Total(c *gin.Context) { - var conditions []string - var params []any - - // construct condition to get - if neType := c.Query("neType"); neType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.ToUpper(neType)) - } - if status := c.Query("status"); status != "" { - conditions = append(conditions, "status = ?") - params = append(params, status) - } else { - conditions = append(conditions, "status != '2'") - } - - whereSql := "" - if len(conditions) > 0 { - whereSql += strings.Join(conditions, " and ") - } - var total int64 = 0 - if err := db.DB("").Table(k.TableName()).Where(whereSql, params...).Count(&total).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.JSON(http.StatusOK, services.TotalResp(total)) -} - -func (k *KpiCTitle) Post(c *gin.Context) { - var title KpiCTitle - if err := c.ShouldBindJSON(&title); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - userName := reqctx.LoginUserToUserName(c) - title.CreatedBy = &userName - tx := db.DB("").Model(&KpiCTitle{}) - result := tx.Where("ne_type=? and (kpi_id=? or title=?) and status!='2'", title.NeType, title.KpiID, title.Title).First(&title) - if result.RowsAffected > 0 { - c.JSON(http.StatusOK, services.ErrResp("custom indicator already exist")) - return - } - - // Regexp match like AMF.C.01 - // kpiIDRegexp := "^" + *title.NeType + "\\.C\\.[0-9]{2}$" - // ret := db.DB("").Table("kpi_c_title"). - // Where("ne_type=? and kpi_id REGEXP ? ORDER BY kpi_id DESC LIMIT 1", title.NeType, kpiIDRegexp).Scan(&res) - // if err := ret.Error; err != nil { - // c.JSON(http.StatusOK, services.ErrResp(err.Error())) - // return - // } - - titles := []KpiCTitle{} - ret := db.DB("").Model(&KpiCTitle{}) - ret = ret.Select("kpi_id").Where("ne_type=?", title.NeType).Find(&titles) - - newKpiID := *title.NeType + ".C" + ".01" - if ret.RowsAffected != 0 { - suffixInt := 1 - prefixStr := fmt.Sprintf("%s.C.", *title.NeType) - sort.SliceStable(titles, func(i, j int) bool { - vi := *titles[i].KpiID - vj := *titles[j].KpiID - if strings.HasPrefix(vi, prefixStr) && strings.HasPrefix(vj, prefixStr) { - vvi := strings.Replace(vi, prefixStr, "", 1) - vvii, err := strconv.Atoi(vvi) - if err != nil { - return false - } - vvj := strings.Replace(vj, prefixStr, "", 1) - vvjj, err := strconv.Atoi(vvj) - if err != nil { - return false - } - return vvii > vvjj // desc - } - return false - }) - maxKpiID := *titles[0].KpiID - prefix := maxKpiID[:len(maxKpiID)-2] - suffix := maxKpiID[len(maxKpiID)-2:] - suffixInt, err := strconv.Atoi(suffix) - if err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - if suffixInt >= MAX_KPI_C_ID { - err := fmt.Errorf("exceed the max customized KPI ID") - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - suffixInt++ - newSuffix := fmt.Sprintf("%02d", suffixInt) - newKpiID = prefix + newSuffix - } - title.KpiID = &newKpiID - txx := db.DB("").Model(&KpiCTitle{}) - if err := txx.Create(&title).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - kpiCReportTable := "kpi_c_report_" + strings.ToLower(*title.NeType) - if !db.DB("").Migrator().HasTable(kpiCReportTable) { - // clone table "kpi_c_report" to "kpi_c_report_{neType}" - sql := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s AS SELECT * FROM %s WHERE 1=0", kpiCReportTable, "kpi_c_report") - if _, err := db.ExecDB("", sql, nil); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - sql = fmt.Sprintf("ALTER TABLE %s MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY IF NOT EXISTS (`id`)", kpiCReportTable) - if _, err := db.ExecDB("", sql, nil); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - sql = fmt.Sprintf("ALTER TABLE %s ADD INDEX IF NOT EXISTS `idx_timestamp`(`created_at`) USING BTREE, ADD INDEX IF NOT EXISTS `idx_uid_datetime`(`rm_uid`, `date`, `start_time`) USING BTREE", kpiCReportTable) - if _, err := db.ExecDB("", sql, nil); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - } - c.JSON(http.StatusCreated, services.DataResp(title)) -} - -func (k *KpiCTitle) Put(c *gin.Context) { - var title KpiCTitle - id := c.Param("id") - - if err := db.DB("").First(&title, id).Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp("custom indicator not found")) - return - } - - if err := c.ShouldBindJSON(&title); err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - title.UpdatedAt = time.Now().UnixMilli() - db.DB("").Save(&title) - - c.JSON(http.StatusOK, services.DataResp(title)) -} - -func (k *KpiCTitle) Delete(c *gin.Context) { - id := c.Param("id") - - if err := db.DB("").Table(k.TableName()).Where("id=?", id).Update("status", "2").Error; err != nil { - c.JSON(http.StatusOK, services.ErrResp(err.Error())) - return - } - - c.JSON(http.StatusNoContent, nil) // 204 No Content -} - -func GetActiveKPICList(neType string) []KpiCTitle { - k := new([]KpiCTitle) - - err := db.DB("").Where("`ne_type` = ? and `status` = '1'", neType).Find(&k).Error - if err != nil { - return nil - } - return *k -} diff --git a/features/pm/kpi_c_title/model.go b/features/pm/kpi_c_title/model.go deleted file mode 100644 index 05170c4b..00000000 --- a/features/pm/kpi_c_title/model.go +++ /dev/null @@ -1,33 +0,0 @@ -package kpi_c_title - -const ( - MAX_KPI_C_ID = 99 -) - -type KpiCTitle struct { - ID int `gorm:"column:id;primary_key;auto_increment" json:"id"` - NeType *string `gorm:"column:ne_type" json:"neType,omitempty"` - KpiID *string `gorm:"column:kpi_id" json:"kpiId,omitempty"` - Title *string `gorm:"column:title" json:"title,omitempty"` - Expression *string `gorm:"column:expression" json:"expression,omitempty"` - ExprAlias string `gorm:"-" json:"exprAlias"` - Status string `gorm:"column:status" json:"status"` // 0-Inactive/1-Active/2-Deleted - Unit *string `gorm:"column:unit" json:"unit,omitempty"` - Description *string `gorm:"column:description" json:"description,omitempty"` - CreatedBy *string `gorm:"column:created_by" json:"createdBy,omitempty"` - UpdatedAt int64 `gorm:"column:updated_at" json:"updatedAt,omitempty"` -} - -type KpiCTitleQuery struct { - ID int `json:"id" form:"id"` - NeType string `json:"neType" form:"neType"` - Status string `json:"status" form:"status"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=created_at"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int `json:"pageNum" form:"pageNum"` - PageSize int `json:"pageSize" form:"pageSize"` -} - -func (k *KpiCTitle) TableName() string { - return "kpi_c_title" -} diff --git a/features/pm/kpi_c_title/route.go b/features/pm/kpi_c_title/route.go deleted file mode 100644 index 485f3f93..00000000 --- a/features/pm/kpi_c_title/route.go +++ /dev/null @@ -1,39 +0,0 @@ -package kpi_c_title - -import ( - "be.ems/src/framework/middleware" - "github.com/gin-gonic/gin" -) - -// Register Routes for kpi_c_title -func Register(r *gin.RouterGroup) { - - pmKPIC := r.Group("/kpiC") - { - var k *KpiCTitle - pmKPIC.GET("/title", - middleware.AuthorizeUser(nil), - k.Get, - ) - pmKPIC.GET("/title/total", - middleware.AuthorizeUser(nil), - k.Total, - ) - pmKPIC.GET("/title/totalList", - middleware.AuthorizeUser(nil), - k.GetToalList, - ) - pmKPIC.POST("/title", - middleware.AuthorizeUser(nil), - k.Post, - ) - pmKPIC.PUT("/title/:id", - middleware.AuthorizeUser(nil), - k.Put, - ) - pmKPIC.DELETE("/title/:id", - middleware.AuthorizeUser(nil), - k.Delete, - ) - } -} diff --git a/features/pm/performance.go b/features/pm/performance.go deleted file mode 100644 index 0a779084..00000000 --- a/features/pm/performance.go +++ /dev/null @@ -1,1227 +0,0 @@ -package pm - -import ( - "encoding/json" - "fmt" - "io" - "math" - "net/http" - "strconv" - "strings" - "time" - - "be.ems/features/pm/kpi_c_report" - "be.ems/features/pm/kpi_c_title" - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/dborm" - evaluate "be.ems/lib/eval" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/database/db" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/parse" - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" - neService "be.ems/src/modules/network_element/service" - wsService "be.ems/src/modules/ws/service" - - "github.com/go-resty/resty/v2" - "github.com/gorilla/mux" -) - -type Response struct { - Data interface{} `json:"data"` -} - -type KpiReport struct { - Timestamp string `json:"TimeStamp"` - Task struct { - Period struct { - StartTime string `json:"StartTime"` - EndTime string `json:"EndTime"` - } `json:"Period"` - NE struct { - NEName string `json:"NEName"` - RmUID string `json:"rmUID"` - NeType string `json:"NeType"` - KPIs []struct { - KPIID string `json:"KPIID"` - Value int64 `json:"Value"` - Err string `json:"Err"` - } `json:"KPIs"` - } `json:"NE"` - } `json:"Task"` -} - -type GoldKpi struct { - // Id int `json:"-" xorm:"pk 'id' autoincr"` - Date string `json:"date" xorm:"date"` - Index int `json:"index"` - Granularity int8 `json:"granularity"` - StartTime string `json:"startTime"` - EndTime string `json:"endTime"` - NEName string `json:"neName" xorm:"ne_name"` - RmUid string `json:"rmUid" xorm:"rm_uid"` - NEType string `json:"neType" xorm:"ne_type"` - KpiId string `json:"kpiId" xorm:"kpi_id"` - Value int64 `json:"value"` - Error string `json:"error"` - Timestamp string `json:"timestamp"` -} - -type KpiData struct { - ID int `json:"id" xorm:"pk 'id' '<-' autoincr"` - NEType string `json:"neType" xorm:"ne_type"` - NEName string `json:"neName" xorm:"ne_name"` - RmUid string `json:"rmUid" xorm:"rm_uid"` - Date string `json:"date" xorm:"date"` - StartTime string `json:"startTime" xorm:"start_time"` - EndTime string `json:"endTime" xorm:"end_time"` - Index int `json:"index" xorm:"index"` - Granularity int64 `json:"granularity" xorm:"granularity"` - KPIValues []KPIVal `json:"kpiValues" xorm:"json 'kpi_values'"` - //CreatedAt int64 `json:"createdAt" xorm:"created 'created_at'"` - CreatedAt int64 `json:"createdAt" xorm:"'created_at'"` -} -type KPIVal struct { - KPIID string `json:"kpi_id" xorm:"kpi_id"` - Value int64 `json:"value" xorm:"value"` - Err string `json:"err" xorm:"err"` -} - -var ( - // performance management - PerformanceUri = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/kpiReport/{index}" - MeasureTaskUri = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measureTask" - MeasureReportUri = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measureReport" - MeasureReportFmt = config.DefaultUriPrefix + "/performanceManagement/v1/elementType/%s/objectType/measureReport" - MeasurementUri = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measurement/{index}" - UriMeasureTask = config.DefaultUriPrefix + "/performanceManagement/{apiVersion}/measureTask/{netype}" - - // performance management - CustomPerformanceUri = config.UriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/kpiReport/{index}" - CustomMeasureTaskUri = config.UriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measureTask" - CustomMeasureReportUri = config.UriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measureReport" - CustomMeasureReportFmt = config.UriPrefix + "/performanceManagement/v1/elementType/%s/objectType/measureReport" - CustomMeasurementUri = config.UriPrefix + "/performanceManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/measurement/{index}" - CustomUriMeasureTask = config.UriPrefix + "/performanceManagement/{apiVersion}/measureTask/{netype}" -) - -func GetDateFromTimeString(fmtString string, timeString string) string { - t, _ := time.ParseInLocation(fmtString, timeString, time.Local) - return t.Format("2006-01-02") -} - -func GetDateTimeFromTimeString(fmtString string, timeString string) string { - t, _ := time.ParseInLocation(fmtString, timeString, time.Local) - return t.Format(global.DateTime) -} - -// process KPI report post message from NFs -func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostKPIReportFromNF processing... ") - - apiVer := ctx.GetParam(r, "apiVersion") - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - var kpiReport KpiReport - if err := ctx.ShouldBindJSON(r, &kpiReport); err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - kpiIndexStr := ctx.GetParam(r, "index") - - // insert kpi_report table, no session - saveKPIData(kpiReport, parse.Number(kpiIndexStr)) - saveKPIDataC(kpiReport, parse.Number(kpiIndexStr)) - - services.ResponseStatusOK204NoContent(w) -} - -// saveKPIData 存储KPI数据并推送到ws订阅组 -func saveKPIData(kpiReport KpiReport, index int64) int64 { - timestamp := kpiReport.Timestamp - taskPeriod := kpiReport.Task.Period - taskNe := kpiReport.Task.NE - taskNeKPIs := kpiReport.Task.NE.KPIs - // 时间数据处理 - receiverTime := date.ParseStrToDate(timestamp, date.YYYY_MM_DDTHH_MM_SSZ) - startTime := date.ParseStrToDate(taskPeriod.StartTime, date.YYYY_MM_DDTHH_MM_SSZ) - endTime := date.ParseStrToDate(taskPeriod.EndTime, date.YYYY_MM_DDTHH_MM_SSZ) - granularity := parse.Number(endTime.Sub(startTime).Seconds()) - // kpi data数据json - KpiValues := make([]map[string]any, 0) - for _, v := range taskNeKPIs { - KpiValues = append(KpiValues, map[string]any{ - "kpiId": v.KPIID, - "value": v.Value, - "err": v.Err, - }) - } - KpiValuesByte, _ := json.Marshal(KpiValues) - kpiData := neDataModel.KpiReport{ - NeType: taskNe.NeType, - NeName: taskNe.NEName, - RmUid: taskNe.RmUID, - Date: date.ParseDateToStr(receiverTime, "2006-01-02"), - StartTime: date.ParseDateToStr(startTime, "15:04:05"), - EndTime: date.ParseDateToStr(endTime, "15:04:05"), - Index: index, - Granularity: granularity, - KpiValues: string(KpiValuesByte), - CreatedAt: receiverTime.UnixMilli(), // 时间戳毫秒实际记录到秒 - } - insertId := neDataService.NewKpiReport.Insert(kpiData) - if insertId > 0 { - // 指标事件对象 - kpiEvent := map[string]any{ - "neType": kpiData.NeType, - "neName": kpiData.NeName, - "rmUID": kpiData.RmUid, - "startIndex": kpiData.Index, - "timeGroup": kpiData.CreatedAt, - // kip_id ... - } - for _, v := range taskNeKPIs { - kpiEvent[v.KPIID] = v.Value - } - - // 发送到匹配的网元 - neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid) - if neInfo.RmUID == kpiData.RmUid { - // 推送到ws订阅组 - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent) - if neInfo.NeType == "UPF" { - // 更新UPF总流量 - upValue := parse.Number(kpiEvent["UPF.03"]) - downValue := parse.Number(kpiEvent["UPF.06"]) - neDataService.NewKpiReport.UPFTodayFlowUpdate(neInfo.RmUID, upValue, downValue) - } - } - } - return insertId -} - -// saveKPIDataC 存储自定义KPI数据并推送到ws订阅组 -func saveKPIDataC(kpiReport KpiReport, index int64) int64 { - timestamp := kpiReport.Timestamp - taskPeriod := kpiReport.Task.Period - taskNe := kpiReport.Task.NE - taskNeKPIs := kpiReport.Task.NE.KPIs - // 时间数据处理 - receiverTime := date.ParseStrToDate(timestamp, date.YYYY_MM_DDTHH_MM_SSZ) - startTime := date.ParseStrToDate(taskPeriod.StartTime, date.YYYY_MM_DDTHH_MM_SSZ) - endTime := date.ParseStrToDate(taskPeriod.EndTime, date.YYYY_MM_DDTHH_MM_SSZ) - granularity := parse.Number(endTime.Sub(startTime).Seconds()) - // kpi data数据 - KpiValues := make([]map[string]any, 0) - kpiValMap := map[string]any{} - for _, v := range taskNeKPIs { - kpiValMap[v.KPIID] = v.Value - } - // 自定义kpiId数据 - cTitles := kpi_c_title.GetActiveKPICList(taskNe.NeType) - for _, v := range cTitles { - item := map[string]any{ - "kpiId": *v.KpiID, - "value": 0, - "err": "", - } - // 计算结果 - result, err := evaluate.CalcExpr(*v.Expression, kpiValMap) - if err != nil { - item["value"] = 0 - item["err"] = err.Error() - } else { - if *v.Unit == "%" && result > 100 { - result = 100 - } - if *v.Unit == "%" && result < 0 { - result = 0 - } - item["value"] = result - } - KpiValues = append(KpiValues, item) - } - - KpiValuesByte, _ := json.Marshal(KpiValues) - kpiData := neDataModel.KpiCReport{ - NeType: taskNe.NeType, - NeName: taskNe.NEName, - RmUid: taskNe.RmUID, - Date: date.ParseDateToStr(receiverTime, "2006-01-02"), - StartTime: date.ParseDateToStr(startTime, "15:04:05"), - EndTime: date.ParseDateToStr(endTime, "15:04:05"), - Index: index, - Granularity: granularity, - KpiValues: string(KpiValuesByte), - CreatedAt: receiverTime.UnixMilli(), // 时间戳毫秒实际记录到秒 - } - insertId := neDataService.NewKpiCReport.Insert(kpiData) - if insertId > 0 { - // 指标事件对象 - kpiEvent := map[string]any{ - "neType": kpiData.NeType, - "neName": kpiData.NeName, - "rmUID": kpiData.RmUid, - "startIndex": kpiData.Index, - "timeGroup": kpiData.CreatedAt, - // kip_id ... - } - for _, v := range KpiValues { - kpiEvent[fmt.Sprint(v["kpiId"])] = v["value"] - } - - // 发送到匹配的网元 - neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid) - if neInfo.RmUID == kpiData.RmUid { - // 推送自定义KPI到ws订阅组 - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiEvent) - } - } - return insertId -} - -// process KPI report post message from NFs 旧版 -func PostKPIReportFromNFOld(w http.ResponseWriter, r *http.Request) { - log.Debug("PostKPIReportFromNF processing... ") - - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Faile to io.ReadAll: ", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - //log.Trace("Request body:", string(body)) - kpiReport := new(KpiReport) - _ = json.Unmarshal(body, &kpiReport) - //log.Trace("kpiReport:", kpiReport) - - layout := time.RFC3339Nano - //kpiDate := GetDateFromTimeString(layout, kpiReport.Task.Period.StartTime) - kpiIndex, _ := strconv.Atoi(vars["index"]) - startTime := global.GetFmtTimeString(layout, kpiReport.Task.Period.StartTime, time.DateTime) - endTime := global.GetFmtTimeString(layout, kpiReport.Task.Period.EndTime, time.DateTime) - // get time granularity from startTime and endTime - seconds, _ := global.GetSecondDuration(startTime, endTime) - var granularity int64 = 60 - if seconds != 0 && seconds <= math.MaxInt8 && seconds >= math.MinInt8 { - granularity = int64(seconds) - } - - // insert into new kpi_report_xxx table - kpiData := new(KpiData) - kpiData.Date = startTime - kpiData.Index = kpiIndex - //stime, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.StartTime, time.Local) - //etime, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.EndTime, time.Local) - kpiData.StartTime = startTime - kpiData.EndTime = endTime - kpiData.Granularity = granularity - kpiData.NEName = kpiReport.Task.NE.NEName - kpiData.NEType = kpiReport.Task.NE.NeType - kpiData.RmUid = kpiReport.Task.NE.RmUID - kpiVal := new(KPIVal) - kpiData.CreatedAt = time.Now().UnixMilli() - - // 黄金指标事件对象 - kpiEvent := map[string]any{ - // kip_id ... - "neType": kpiReport.Task.NE.NeType, - "neName": kpiReport.Task.NE.NEName, - "rmUID": kpiReport.Task.NE.RmUID, - "startIndex": kpiIndex, - "timeGroup": kpiData.CreatedAt, - } - - // for custom kpi - kpiValMap := map[string]any{} - for _, k := range kpiReport.Task.NE.KPIs { - kpiEvent[k.KPIID] = k.Value // kip_id - - kpiVal.KPIID = k.KPIID - kpiVal.Value = int64(k.Value) - kpiVal.Err = k.Err - kpiData.KPIValues = append(kpiData.KPIValues, *kpiVal) - kpiValMap[k.KPIID] = k.Value - } - kpiValMap["granularity"] = kpiData.Granularity - - // insert kpi_report table, no session - tableName := "kpi_report_" + strings.ToLower(kpiReport.Task.NE.NeType) - // affected, err := xEngine.Table(tableName).Insert(kpiData) - tx := db.DB("").Table(tableName).Create(kpiData) - if tx.Error != nil && tx.RowsAffected <= 0 { - log.Errorf("Failed to insert %s:%v", tableName, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - report := kpi_c_report.KpiCReport{ - NeType: &kpiData.NEType, - NeName: &kpiData.NEName, - RmUID: &kpiData.RmUid, - Date: kpiData.Date, - StartTime: &kpiData.StartTime, - EndTime: &kpiData.EndTime, - Index: int64(kpiData.Index), - Granularity: &kpiData.Granularity, - } - - // 发送到匹配的网元 - neInfo := neService.NewNeInfo.FindByRmuid(kpiData.RmUid) - // custom kpi report to FE - kpiCEvent := map[string]any{ - // kip_id ... - "neType": kpiData.NEType, - "neId": neInfo.NeId, - "neName": kpiData.NEName, - "rmUID": kpiData.RmUid, - "startIndex": kpiData.Index, - "timeGroup": kpiData.Date[:10] + " " + kpiData.EndTime, - "createdAt": kpiData.CreatedAt, - "granularity": kpiData.Granularity, - } - // kpiCList := kpi_c_title.GetActiveKPICList(kpiData.NEType) - // for _, k := range kpiCList { - // result, err := evaluate.CalcExpr(*k.Expression, kpiValMap) - // kpiCVal := new(kpi_c_report.KpiCVal) - // kpiCVal.KPIID = *k.KpiID - // if err != nil { - // kpiCVal.Value = 0.0 - // kpiCVal.Err = err.Error() - // } else { - // kpiCVal.Value = result - // } - - // report.KpiValues = append(report.KpiValues, *kpiCVal) - - // // set KPIC event kpiid and value - // kpiCEvent[kpiCVal.KPIID] = kpiCVal.Value - // } - - // KPI自定义指标入库 - kpi_c_report.InsertKpiCReport(kpiData.NEType, report) - - if neInfo.RmUID == kpiData.RmUid { - // 推送到ws订阅组 - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent) - // 推送自定义KPI到ws订阅组 - wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiCEvent) - } - - services.ResponseStatusOK204NoContent(w) -} - -// type MeasureTask struct { -// Tasks []Task `json:"Tasks"` -// NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */ -// } -type ScheduleJ struct { - Type string `json:"Type"` - Days []int `json:"Days"` -} - -type Period struct { - Start string `json:"Start"` - End string `json:"End"` -} -type Task struct { - Id int `json:"Id"` - - StartTime string `json:"StartTime"` - EndTime string `json:"EndTime"` - - Schedule struct { - Type string `json:"Type"` // 计划类型:Weekly/Monthly, 如果type为"", 则任务以StartTime和EndTime为条件进行统计, 否则以Shedule方式进行 - Days []int `json:"Days"` // Weekly: [0,1,...,5,6] 星期日为0, Monthly: [1,2,3,...,30,31] - Periods []Period `json:"Periods"` - /* - Periods []struct { - Start string `json:"Start"` // 零点或者零点加测量粒度的整数倍 - End string `json:"End"` //零点加测量粒度的整数倍 - } `json:"Periods"` - */ - } `json:"Schedule"` - - GranulOption string `json:"GranulOption"` // 测量粒度选项:15M/30M/60M/24H - KPISet []KpiSetJ `json:"KPISet"` - /* - KPISet []struct { - Code string `json:"Code"` // 统计编码 如:SMFHA01 - KPIs []string `json:"KPIs` // 指标项集合 ["SMF.AttCreatePduSession", "SMF.AttCreatePduSession._Dnn"] - } `json:"KPISet"` - */ -} -type KpiSetJ struct { - Code string `json:"Code"` // 统计编码 如:SMFHA01 - KPIs []string `json:"KPIs"` // 指标项集合 ["SMF.AttCreatePduSession", "SMF.AttCreatePduSession._Dnn"] -} - -type MeasureTask struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeIds []string `json:"neIds" xorm:"ne_ids"` - KpiSet []KpiSetJ `json:"KPISet" xorm:"kpi_set"` - StartTime string `json:"startTime" xorm:"start_time"` - EndTime string `json:"endTime" xorm:"end_time"` - Periods []Period `json:"Periods" xorm:"periods"` - Schedule []ScheduleJ `json:"Schedule" xorm:"schedule"` - GranulOption string `json:"granulOption" xorm:"granul_option"` - Status string `json:"status" xorm:"status"` - AccountID string `json:"accountId" xorm:"account_id"` - Comment string `json:"comment" xorm:"comment"` - CreateTime string `json:"createTime" xorm:"create_time"` - UpdateTime string `json:"updateTime" xorm:"update_time"` - DeleteTime string `json:"deleteTime" xorm:"delete_time"` - - Tasks []Task `json:"Tasks"` - NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */ -} -type MeasureReport struct { - Id int `json:"Id"` - TimeStamp string `json:"TimeStamp"` - NeName string `json:"NeName"` - RmUID string `json:"rmUID"` - NeType string `json:"NeType"` - - Report struct { - Period struct { - StartTime string `json:"StartTime"` - EndTime string `json:"EndTime"` - } `json:"Period"` - - Datas []struct { - Code string `json:"Code"` // 统计编码 如:SMFHA01 - KPIs []struct { - KPIID string `json:"KPIID"` // 指标项, 如: SMF.AttCreatePduSession._Dnn - KPIValues []struct { - Name string `json:"Name"` // 单个的写"Total", 或者指标项有多个测量项,如Dnn的名称写对应的Dnn"cmnet"/"ims" - Value int64 `json:"Value"` - } `json:"KPIValues"` - } `json:"KPIs"` - } `json:"Datas"` - } `json:"Report"` -} - -func GetMeasureTask(taskId int) (*MeasureTask, error) { - log.Debug("GetMeasureTask processing... ") - - measureTask := new(MeasureTask) - tx := db.DB("").Table("measure_task").Where("id=?", taskId).Find(measureTask) - if tx.Error != nil { - log.Error("Failed to get table measure_task from database:", tx.Error) - - return nil, tx.Error - } - - log.Debug("Measure Task:", measureTask) - return measureTask, nil -} - -func XormGetActiveMeasureTask(measureTasks *[]MeasureTask) (*[]MeasureTask, error) { - log.Debug("XormGetActiveMeasureTask processing... ") - tx := db.DB("").Table("measure_task").Where("status='Active'").Find(measureTasks) - if tx.Error != nil { - log.Error("Failed to get table measure_task:", tx.Error) - return nil, tx.Error - } - - log.Debug("measureTasks:", measureTasks) - return measureTasks, nil -} - -type MeasureData struct { - // Id int `json:"id" xorm:"pk 'id' autoincr"` - Id int `json:"id" xorm:"-"` - Date string `json:"date" xorm:"date"` - TaskId int `json:"taskId"` - NeType string `json:"neType" xorm:"ne_type"` - NeName string `json:"neName" xorm:"ne_name"` - RmUid string `json:"rmUid" xorm:"rm_uid"` - GranulOption string `json:"granulOption" xorm:"granul_option"` - StartTime string `json:"startTime"` - EndTime string `json:"endTime"` - KpiCode string `json:"kpiCode" xorm:"kpi_code"` - KpiId string `json:"kpiId" xorm:"kpi_id"` - KpiExt string `json:"kpiExt" xorm:"kpi_ext"` - Value int64 `json:"value"` - Timestamp string `json:"timestamp"` -} - -// process measure report from NFs -func PostMeasureReportFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMeasureReportFromNF processing... ") - - // vars := mux.Vars(r) - // neType := vars["elementTypeValue"] - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Faile to io.ReadAll: ", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Debug("Request body:", string(body)) - measureReport := new(MeasureReport) - _ = json.Unmarshal(body, &measureReport) - log.Debug("measureReport:", measureReport) - - measureData := new(MeasureData) - layout := global.DateTime - measureData.Date = GetDateFromTimeString(layout, measureReport.Report.Period.StartTime) - measureData.TaskId = measureReport.Id - measureData.StartTime = measureReport.Report.Period.StartTime - measureData.EndTime = measureReport.Report.Period.EndTime - measureData.NeType = measureReport.NeType - measureData.NeName = measureReport.NeName - measureData.RmUid = measureReport.RmUID - measureData.GranulOption, _ = dborm.XormGetSingleCol("measure_task", "granul_option", fmt.Sprintf("id=%d", measureReport.Id)) - t, _ := strconv.ParseInt(measureReport.TimeStamp, 10, 64) - timestamp := time.Unix(t, 0) - log.Debug("timestamp:", timestamp.Format(layout)) - measureData.Timestamp = timestamp.Format(layout) - log.Debug("Datas:", measureReport.Report.Datas) - for _, d := range measureReport.Report.Datas { - measureData.KpiCode = d.Code - - log.Debug("KPIs:", d.KPIs) - for _, k := range d.KPIs { - measureData.KpiId = k.KPIID - - log.Debug("KPIValues:", k.KPIValues) - if len(k.KPIValues) != 0 { - for _, v := range k.KPIValues { - measureData.KpiExt = v.Name - measureData.Value = v.Value - log.Debug("measureData:", measureData) - - err := db.DB("").Create(measureData).Error - if err != nil { - log.Error("Failed to insert measure_data:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - } - } else { - measureData.Value = 0 - log.Debug("measureData:", measureData) - - err := db.DB("").Create(measureData).Error - if err != nil { - log.Error("Failed to insert measure_data:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - } - } - } - - services.ResponseStatusOK204NoContent(w) -} - -func PostMeasureTaskToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMeasureTaskToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - params := r.URL.Query() - taskIds := params["id"] - log.Debug("taskIds:", taskIds) - - var response *resty.Response - client := resty.New() - measureTask := new(MeasureTask) - measureTask.Tasks = make([]Task, 1) - for _, taskId := range taskIds { - id, _ := strconv.Atoi(taskId) - task, err := GetMeasureTask(id) - if err != nil { - log.Error("Failed to connect database: ", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - log.Debug("Table Task:", task) - - measureTask.Tasks[0].Id = task.Id - measureTask.Tasks[0].StartTime = task.StartTime - measureTask.Tasks[0].EndTime = task.EndTime - // v := new(dborm.ScheduleJson) - // _ = json.Unmarshal(task.Schedule, v) - // measureTask.Task[0].Schedule.Type = v.Type - // measureTask.Task[0].Schedule.Days = v.Days - if len(task.Schedule) >= 1 { - measureTask.Tasks[0].Schedule.Type = task.Schedule[0].Type - measureTask.Tasks[0].Schedule.Days = task.Schedule[0].Days - } - //v := new(dborm.ScheduleJ) - //_ = json.Unmarshal(task.Schedule, v) - measureTask.Tasks[0].Schedule.Periods = task.Periods - measureTask.Tasks[0].GranulOption = task.GranulOption - - measureTask.Tasks[0].KPISet = task.KpiSet - ips, err := global.GetIps() - if err != nil { - log.Error("Failed to get local IP:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("ips:", ips) - - measureTask.NotifyUrl = global.SetNotifyUrl(ips[0], 33030, fmt.Sprintf(MeasureReportFmt, neType)) - log.Debug("Measure Task to NF:", measureTask) - - if len(task.NeIds) == 0 { - var neInfos []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType(neType, &neInfos) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfoByNeType:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - for _, neInfo := range neInfos { - task.NeIds = append(task.NeIds, neInfo.NeId) - } - } - - for _, neId := range task.NeIds { - var err error - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if neInfo == nil { - err := fmt.Errorf("not found target NE neType=%s, neId=%s", neType, neId) - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: POST ", requestURI2NF) - - switch task.Status { - case dborm.MeasureTaskStatusInactive: - body, _ := json.Marshal(measureTask) - log.Debug("body: ", string(body)) - - log.Debug("User-Agent: ", config.GetDefaultUserAgent()) - response, 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). - SetContentLength(true). - Post(requestURI2NF) - - if err != nil { - log.Error("Post to NF failed:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - log.Debug("response info: ") - log.Debug("Status Code:", response.StatusCode()) - log.Debug("Status:", response.Status()) - log.Debug("Proto:", response.Proto()) - log.Debug("Time:", response.Time()) - log.Debug("Received At:", response.ReceivedAt()) - log.Debug("Size:", response.Size()) - - case dborm.MeasureTaskStatusSuspend: - body, _ := json.Marshal(measureTask) - log.Debug("body: ", string(body)) - response, 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). - SetContentLength(true). - Put(requestURI2NF) - - if err != nil { - log.Error("Put to NF failed:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - default: - err = fmt.Errorf("measure task status must be inactive id=%d", id) - log.Error("Unable to active measure task:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - log.Debug("StatusCode: ", response.StatusCode()) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusActive - taskInfo.CreateTime = time.Now().Format(time.DateTime) - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - default: - log.Error("NF return failure to active measure task") - if response != nil { - log.Info("response body:", string(response.Body())) - services.TransportResponse(w, response.StatusCode(), response.Body()) - return - } else { - err = fmt.Errorf("failed to active measure task, NF return error status=%v", response.Status()) - log.Error("Unable to active measure task:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - } - - services.ResponseStatusOK204NoContent(w) -} - -func PutMeasureTaskToNF(w http.ResponseWriter, r *http.Request) { - - services.ResponseStatusOK200Null(w) -} - -func DeleteMeasureTaskToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteMeasureTaskToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - params := r.URL.Query() - taskIds := params["id"] - log.Debug("taskIds:", taskIds) - - var response *resty.Response - respMsg := make(map[string]interface{}) - for _, taskId := range taskIds { - id, _ := strconv.Atoi(taskId) - task, err := GetMeasureTask(id) - if err != nil { - log.Error("Failed to connect database: ", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - log.Debug("Measure Task:", task) - - if len(task.NeIds) == 0 { - var neInfos []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType(neType, &neInfos) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfoByNeType:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - for _, neInfo := range neInfos { - task.NeIds = append(task.NeIds, neInfo.NeId) - } - } - log.Debug("neIds:", task.NeIds) - if len(task.NeIds) == 0 { - log.Warn("Not found target NE in the measure task") - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusDeleted - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - } - - for _, neId := range task.NeIds { - var err error - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - if neInfo != nil { - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: DELETE ", requestURI2NF) - client := resty.New() - response, 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 { - // to avoid can't delete the task for abnormal NF - log.Error("Failed to resty delete:", err) - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusDeleted - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - } - - log.Info("StatusCode: ", response.StatusCode()) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusDeleted - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Infof("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - default: - log.Info("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - } else { - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusDeleted - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - } - } - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) -} - -func PatchMeasureTaskToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PatchMeasureTaskToNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - params := r.URL.Query() - taskIds := params["id"] - log.Debug("taskIds:", taskIds) - - var response *resty.Response - respMsg := make(map[string]interface{}) - for _, taskId := range taskIds { - id, _ := strconv.Atoi(taskId) - task, err := GetMeasureTask(id) - if err != nil { - log.Error("Failed to connect database: ", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - log.Debug("Measure Task:", task) - - // for neType - if len(task.NeIds) == 0 { - var neInfos []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType(neType, &neInfos) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfoByNeType:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - for _, neInfo := range neInfos { - task.NeIds = append(task.NeIds, neInfo.NeId) - } - } - - if len(task.NeIds) == 0 { - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusInactive - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - return - } - - for _, neId := range task.NeIds { - var err error - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - if neInfo == nil { - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusInactive - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - services.ResponseStatusOK204NoContent(w) - //services.ResponseInternalServerError500ProcessError(w, em) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: PATCH ", requestURI2NF) - client := resty.New() - response, err = client.R(). - EnableTrace(). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Patch(requestURI2NF) - if err != nil { - log.Error("Patch to NF failed:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - - log.Debug("StatusCode: ", response.StatusCode()) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - taskInfo := new(MeasureTask) - taskInfo.Status = dborm.MeasureTaskStatusInactive - affected, err := dborm.XormUpdateTableById(id, dborm.TableNameMeasureTask, taskInfo) - if err != nil { - log.Error("dborm.XormUpdateTableById is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } else if affected <= 0 { - log.Info("Not record affected in measure_task") - } - default: - log.Debug("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - } - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) -} - -type Measurement struct { - Id int `json:"-" xorm:"pk 'id' autoincr"` - Date string `json:"-" xorm:"date"` - Index int `json:"Index"` // 1天中测量时间粒度(如15分钟)的切片索引: 0~95 - Timestamp string `json:"TimeStamp" xorm:"-"` - NeName string `json:"NeName"` // UserLabel - RmUID string `json:"RmUID" xorm:"rm_uid"` - NeType string `json:"NeType"` // 网元类型 - PmVersion string `json:"PmVersion"` // 性能数据版本号 - Dn string `json:"Dn"` // (???)网元标识, 如:RJN-CMZJ-TZ,SubNetwork=5GC88,ManagedElement=SMF53456,SmfFunction=53456 - Period string `json:"Period"` // 测量时间粒度选项:5/15/30/60 - TimeZone string `json:"TimeZone"` - StartTime string `json:"StartTime"` - - Datas []Data `json:"Datas"` -} - -type KPIValue struct { - Name string `json:"Name"` // 单个的写"Total", 或者指标项有多个测量项,如Dnn的名称写对应的Dnn"cmnet"/"ims" - Value int64 `json:"Value"` -} - -type KPI struct { - KPIID string `json:"KPIID"` // 指标项, 如: SMF.AttCreatePduSession._Dnn - KPIValues []KPIValue `json:"KPIValues"` -} - -type Data struct { - ObjectType string `json:"ObjectType"` // 网络资源类别名称, Pm指标项列表中为空间粒度 如:SmfFunction - KPIs []KPI `json:"KPIs"` // 指标项, 如: SMF.AttCreatePduSession._Dnn -} - -// process measurement post message from NFs -func PostMeasurementFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMeasurementFromNF processing... ") - - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Faile to io.ReadAll: ", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Debug("Request body:", string(body)) - // measurement := new(dborm.NorthboundPm) - measurement := new(dborm.NorthboundPm) - _ = json.Unmarshal(body, &measurement) - log.Debug("measurement:", measurement) - - // layout := global.DateTime - layout := time.RFC3339 - measurement.Date = GetDateFromTimeString(layout, measurement.StartTime) - measurement.StartTime = GetDateTimeFromTimeString(layout, measurement.StartTime) - // tx := db.DB("").Table("nbi_pm").Create(measurement) - // if tx.Error != nil && tx.RowsAffected <= 0 { - // log.Error("Failed to insert nbi_pm:", err) - // services.ResponseInternalServerError500DatabaseOperationFailed(w) - // return - // } - - services.ResponseStatusOK204NoContent(w) -} - -// get measurement message from NFs -func GetMeasurementFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetMeasurementFromNF processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is null.") - services.ResponseNotFound404UriNotExist(w, r) - return - } - params := r.URL.Query() - neIds := params["ne_id"] - if len(neIds) == 0 { - log.Error("ne_id NOT FOUND") - services.ResponseBadRequest400WrongParamValue(w) - return - } - log.Debugf("neType: %s neId:%s", neType, neIds) - - //var neInfo *dborm.NeInfo - neInfo := new(dborm.NeInfo) - - neInfo, err := dborm.XormGetNeInfo(neType, neIds[0]) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.Ip, neInfo.Port, r.RequestURI) - log.Debug("requestURI2NF: GET ", requestURI2NF) - - client := resty.New() - response, 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("Failed to Get from NF:", err) - services.ResponseInternalServerError500NFConnectRefused(w) - return - } - - respMsg := make(map[string]interface{}) - switch response.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - log.Debug("response:", response) - // measurement := new(dborm.NorthboundPm) - measurement := new(dborm.NorthboundPm) - _ = json.Unmarshal(response.Body(), &measurement) - log.Debug("measurement:", measurement) - - layout := time.RFC3339 - measurement.Date = GetDateFromTimeString(layout, measurement.StartTime) - measurement.StartTime = GetDateTimeFromTimeString(layout, measurement.StartTime) - // tx := db.DB("").Table("nbi_pm").Create(measurement) - // if tx.Error != nil && tx.RowsAffected <= 0 { - // log.Error("Failed to insert nbi_pm:", err) - // services.ResponseInternalServerError500DatabaseOperationFailed(w) - // return - // } - default: - log.Debug("response body:", string(response.Body())) - body := new(map[string]interface{}) - _ = json.Unmarshal(response.Body(), &body) - respMsg["error"] = body - } - - services.ResponseWithJson(w, response.StatusCode(), respMsg) -} diff --git a/features/pm/service.go b/features/pm/service.go deleted file mode 100644 index ff2a6539..00000000 --- a/features/pm/service.go +++ /dev/null @@ -1,19 +0,0 @@ -package pm - -import ( - "be.ems/features/pm/kpi_c_report" - "be.ems/features/pm/kpi_c_title" - "be.ems/lib/log" - "github.com/gin-gonic/gin" -) - -func InitSubServiceRoute(r *gin.Engine) { - log.Info("======init PM group gin.Engine") - - pmGroup := r.Group("/pm") - // register sub modules routes - kpi_c_title.Register(pmGroup) - kpi_c_report.Register(pmGroup) - - // return featuresGroup -} diff --git a/features/security/account.go b/features/security/account.go deleted file mode 100644 index 919b2bc7..00000000 --- a/features/security/account.go +++ /dev/null @@ -1,176 +0,0 @@ -package security - -import ( - "encoding/json" - "io" - "net/http" - "strings" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/oauth" - "be.ems/lib/services" -) - -var ( - UriOauthToken = config.DefaultUriPrefix + "/securityManagement/{apiVersion}/{elementTypeValue}/token" - UriOauthHandshake = config.DefaultUriPrefix + "/securityManagement/{apiVersion}/{elementTypeValue}/handshake" - - CustomUriOauthToken = config.UriPrefix + "/securityManagement/{apiVersion}/{elementTypeValue}/token" - CustomUriOauthHandshake = config.UriPrefix + "/securityManagement/{apiVersion}/{elementTypeValue}/handshake" -) - -func LoginFromOMC(w http.ResponseWriter, r *http.Request) { - log.Info("LoginFromOMC processing... ") - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("Failed to ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // check media type(content type) only support "application/json" - if !services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // // check extend uri, response 404 - // if !IsValidOAuthUri(r) { - // log.Debug("Uri is invalid") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // Error process .... - // response 400-7 - if !json.Valid([]byte(body)) { - log.Error("Invalid Json Format") - services.ResponseBadRequest400InvalidJson(w) - return - } - - var oAuthBody oauth.OAuthBody - _ = json.Unmarshal(body, &oAuthBody) //转为json - //log.Debug("body:", string(body), "oAuthBody:", oAuthBody) - - defer r.Body.Close() - // response 400-5 - if oauth.IsWrongOAuthInfo(oAuthBody) { - log.Error("Wrong parameter value") - services.ResponseBadRequest400WrongParamValue(w) - return - } - /* - if oauth.IsValidOAuthInfo(oAuthBody) { - plist := config.GetPermissionFromConfig(oAuthBody.UserName, oAuthBody.GrantType) - log.Debug("Permission list:", plist) - - token := globalSession.NewSession(w, r, plist) - services.ResponseStatusOK200Login(w, token) - } else { - // response 400-4 - log.Debug("Authentication failed, mismatch user or password") - - services.ResponseBadRequest400IncorrectLogin(w) - } - */ - - token := oauth.GenRandToken("omc") // Generate new token to session ID - sourceAddr := r.RemoteAddr[:strings.Index(r.RemoteAddr, ":")] - affected, err := dborm.XormInsertSession(oAuthBody.UserName, sourceAddr, token, - config.GetExpiresFromConfig(), config.GetYamlConfig().Auth.Session) - if err != nil { - log.Error("Failed to XormInsertSession:", err) - if affected == -1 { - services.ResponseForbidden403MultiLoginNotAllowed(w) - } else { - services.ResponseBadRequest400IncorrectLogin(w) - } - - return - } - - services.ResponseBadRequest400IncorrectLogin(w) -} - -func LogoutFromOMC(w http.ResponseWriter, r *http.Request) { - log.Info("LogoutFromOMC processing... ") - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // // check media type(content type) only support "application/json" - // if services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) == false { - // log.Error("Invalid Content-Type") - // services.ResponseUnsupportedMediaType415(w) - // return - // } - - // // check extend uri, response 404 - // if !services.IsValidOAuthUri(r) { - // log.Error("Uri is invalid") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // // error processing ... - // // 401-1 response - // token, ret := oauth.IsCarriedToken(r) - // if ret == false { - // log.Error("AccessToken is not carried") - // services.ResponseUnauthorized401AccessTokenNotCarried(w) - // return - // } - - // se, err := dborm.XormLogoutUpdateSession(token) - // if err != nil { - // log.Error("Uri is invalid") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - // 清除缓存用户信息 - // account.ClearLoginUser(se.AccountId) - services.ResponseStatusOK200Null(w) -} - -func HandshakeFromOMC(w http.ResponseWriter, r *http.Request) { - log.Info("HandshakeFromOMC processing... ") - - // check media type(content type) only support "application/json" - if !services.IsVallidContentType(r, config.GetYamlConfig().OMC.CheckContentType) { - log.Debug("Invalid Content-Type") - services.ResponseUnsupportedMediaType415(w) - return - } - - // check extend uri, response 404 - if !services.IsValidOAuthUri(r) { - log.Error("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // error processing ... - // 401-1 response - token, ret := oauth.IsCarriedToken(r) - if !ret { - log.Error("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } - - _, err := dborm.XormUpdateSessionShakeTime(token) - if err != nil { - log.Error("Uri is invalid") - services.ResponseNotFound404UriNotExist(w, r) - return - } - services.ResponseStatusOK200Null(w) -} diff --git a/features/sm/backup.go b/features/sm/backup.go deleted file mode 100644 index 6795c10c..00000000 --- a/features/sm/backup.go +++ /dev/null @@ -1,45 +0,0 @@ -package sm - -import ( - "net/http" - "time" - - "be.ems/lib/config" - "be.ems/lib/log" - "be.ems/lib/services" - _ "github.com/go-sql-driver/mysql" -) - -var ( - // Get OMC local time - UriOMCLocalTime = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/OMC/objectType/time" - - CustomUriOMCLocalTime = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/OMC/objectType/time" -) - -type OMCLocalTime struct { - Timestamp int64 `json:"timestamp"` // 时间戳 (单位:毫秒) - TimeZone int `json:"timeZone"` // 本地时区偏移(单位:秒) -} - -func GetOMCLocalTime(w http.ResponseWriter, r *http.Request) { - log.Debug("GetOMCLocalTime processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - t := time.Now() - _, offset := t.Zone() - - localTime := OMCLocalTime{ - Timestamp: t.UnixMilli(), - TimeZone: offset, - } - response := services.DataResponse{ - Data: localTime, - } - services.ResponseWithJson(w, http.StatusOK, response) -} diff --git a/features/state/getstate.go b/features/state/getstate.go deleted file mode 100644 index 9e7519e3..00000000 --- a/features/state/getstate.go +++ /dev/null @@ -1,1012 +0,0 @@ -package state - -import ( - "encoding/json" - "fmt" - "net/http" - "os" - "strconv" - "strings" - "time" - - "github.com/go-resty/resty/v2" - "github.com/gorilla/mux" - "github.com/shirou/gopsutil/v4/net" - - "be.ems/lib/config" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - cfg "be.ems/src/framework/config" - "be.ems/src/framework/constants" - "be.ems/src/framework/database/db" - "be.ems/src/framework/utils/parse" -) - -type CpuUsage struct { - NfCpuUsage uint16 `json:"nfCpuUsage"` - SysCpuUsage uint16 `json:"sysCpuUsage"` -} - -type MemUsage struct { - TotalMem uint32 `json:"totalMem"` - NfUsedMem uint32 `json:"nfUsedMem"` - SysMemUsage uint16 `json:"sysMemUsage"` -} - -type PartitionInfo struct { - Total uint32 `json:"total"` // MB - Used uint32 `json:"used"` // MB -} - -type DiskSpace struct { - PartitionNum uint8 `json:"partitionNum"` - PartitionInfo []PartitionInfo `json:"partitionInfo"` -} - -type HardwareInfo struct { - CPUs int `json:"cpus"` - Memory int `json:"memory"` -} - -type SysState struct { - HostName string `json:"hostName"` // linux命令: hostname - OsInfo string `json:"osInfo"` // linux命令: uname -a - DbInfo string `json:"dbInfo"` // 网元如果有db, 显示数据库名和版本信息, OMC: mysql --version - Version string `json:"version"` // 软件版本信息: 16.1.1 - IpAddr []string `json:"ipAddr"` // 网管的ipv4和ipv6列表 - Port uint16 `json:"port"` // 用于网管的port - Capability uint32 `json:"capability"` - SerialNum string `json:"serialNum"` - ExpiryDate string `json:"expiryDate"` - HardwareInfo HardwareInfo `json:"hardwareInfo"` - CpuUsage CpuUsage `json:"cpuUsage"` - MemUsage MemUsage `json:"memUsage"` - DiskSpace DiskSpace `json:"diskSpace"` - //Timestamp string `json:"timestamp"` -} - -type SystemState struct { - HostName string `json:"hostName"` // linux命令: hostname - OsInfo string `json:"osInfo"` // linux命令: uname -a - DbInfo string `json:"dbInfo"` // 网元如果有db, 显示数据库名和版本信息, OMC: mysql --version - Version string `json:"version"` // 软件版本信息: 16.1.1 - IpAddr []string `json:"ipAddr"` // 网管的ipv4和ipv6列表 - Port uint16 `json:"port"` // 用于网管的port - Capability uint32 `json:"capability"` - SerialNum string `json:"serialNum"` - ExpiryDate string `json:"expiryDate"` - HardwareInfo struct { - CPUs int `json:"cpus"` // 主机(裸机/虚拟机)的cpu个数 - Memory int `json:"memory"` // 主机(裸机/虚拟机): 配置的内存 - } `json:"hardwareInfo"` - CpuUsage struct { - NfCpuUsage uint16 `json:"nfCpuUsage"` - SysCpuUsage uint16 `json:"sysCpuUsage"` - } `json:"cpuUsage"` - MemUsage struct { - TotalMem uint32 `json:"totalMem"` - NfUsedMem uint32 `json:"nfUsedMem"` - SysMemUsage uint16 `json:"sysMemUsage"` - } `json:"memUsage"` - DiskSpace struct { - PartitionNum uint8 `json:"partitionNum"` - PartitionInfo []struct { - Total uint32 `json:"total"` // MB - Used uint32 `json:"used"` // MB - } `json:"partitionInfo"` - } `json:"diskSpace"` - //Timestamp string `json:"timestamp"` -} - -type SystemInfo struct { - NeType string `json:"neType" map:"neType, omitempty"` - NeId string `json:"neId" map:"neId, omitempty"` - HostName string `json:"hostName" map:"hostName, omitempty"` // linux命令: hostname - OsInfo string `json:"osInfo" map:"osInfo, omitempty"` // linux命令: uname -a - DbInfo string `json:"dbInfo" map:"dbInfo, omitempty"` // 网元如果有db, 显示数据库名和版本信息, OMC: mysql --version - Version string `json:"version" map:"version, omitempty"` // 软件版本信息: 16.1.1 - IpAddr string `json:"ipAddr" map:"ipAddr, omitempty"` // 网管的ipv4和ipv6列表 - Port uint16 `json:"port" map:"port, omitempty"` // 用于网管的port - CPUs int `json:"cpus" map:"cpus, omitempty"` - TotalMem int `json:"totalMem" map:"totalMem, omitempty"` - PvFlag string `json:"pvFlag" map:"pvFlag, omitempty"` - Status string `json:"status" map:"status, omitempty"` -} - -type LicenseInfo struct { - NeType string `json:"neType"` - NeId string `json:"neId"` - SerialNum string `json:"serialNum"` - Capability uint32 `json:"capability"` - CapUsed uint32 `json:"capUsed"` - FeatureEnabled []string `json:"featureEnabled"` - ExpiryDate string `json:"expiryDate"` -} - -type Response struct { - Data interface{} `json:"data"` -} - -var ( - UriSysState = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/systemState" - UriSysState2 = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/systemState" - UriSysInfoAll = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/sysInfo" - UriSysInfoOne = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/sysInfo/{neType}/{neId}" - UriLicenseInfoAll = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/licenseInfo" - UriLicenseInfoOne = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/licenseInfo/{neType}/{neId}" - - CustomUriSysState = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/systemState" - CustomUriSysState2 = config.UriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/systemState" - CustomUriSysInfoAll = config.UriPrefix + "/systemManagement/{apiVersion}/sysInfo" - CustomUriSysInfoOne = config.UriPrefix + "/systemManagement/{apiVersion}/sysInfo/{neType}/{neId}" - CustomUriLicenseInfoAll = config.UriPrefix + "/systemManagement/{apiVersion}/licenseInfo" - CustomUriLicenseInfoOne = config.UriPrefix + "/systemManagement/{apiVersion}/licenseInfo/{neType}/{neId}" -) - -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(time.Duration(400 * time.Millisecond)) - // SetRetryCount(1). - // SetRetryWaitTime(time.Duration(1 * time.Second)). - // SetRetryMaxWaitTime(time.Duration(2 * time.Second)) - //client.SetTimeout(2 * time.Second) -} - -func NeStatusEnumToStr(intStatus int) string { - switch intStatus { - case 0: - return "active" - case 1: - return "offline" - case 2: - return "standby" - case 3: - return "maintain" - default: - return "unkown" - } -} - -// Get system state from NF/NFs -func GetOneLicenseInfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetOneLicenseInfoFromNF processing... ") - - data := make([]map[string]interface{}, 0) - - vars := mux.Vars(r) - neType := vars["neType"] - neId := vars["neId"] - if neType == "" || neId == "" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("AccessToken:", 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) - - //systemState := make(map[string]interface{}) - systemState := &SysState{} - var result map[string]interface{} - //sysInfo := &SystemInfo{} - omcNeTypeLower := "omc" - if config.GetYamlConfig().OMC.NeType != "" { - omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType) - } - if neType != omcNeTypeLower { - log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower) - var requestURI2NF string - if config.GetYamlConfig().OMC.TestMode && strings.ToLower(neType) != "udm" { - var udmNEs []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs) - if err != nil { - log.Error("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if len(udmNEs) > 0 { - udmNe := udmNEs[0] - hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(udmNe.NeType)) - } - } else { - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(neInfo.NeType)) - } - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - // 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("Failed to get system state:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - log.Trace("resp.Body():", string(resp.Body())) - _ = json.Unmarshal(resp.Body(), &systemState) - - log.Trace("systemState:", systemState) - capUsed := config.TDatas[neInfo.NeType].CapUsed - log.Tracef("neInfo.NeType:%s capUsed: %v", capUsed) - licenseInfo := &LicenseInfo{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - SerialNum: systemState.SerialNum, - Capability: systemState.Capability, - CapUsed: capUsed, - FeatureEnabled: config.TDatas[neInfo.NeType].FeatureEnabled, - ExpiryDate: systemState.ExpiryDate, - } - //neItem := strings.ToUpper(neType) + "/" + neId - result, err = global.ToMap(*licenseInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - } - } else { - systemState := GetEMSState(neInfo.Ip) - licenseInfo := &LicenseInfo{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - SerialNum: systemState.SerialNum, - Capability: systemState.Capability, - CapUsed: config.TDatas[neInfo.NeType].CapUsed, - FeatureEnabled: config.TDatas[neInfo.NeType].FeatureEnabled, - ExpiryDate: systemState.ExpiryDate, - } - result, err = global.ToMap(*licenseInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - // neItem := strings.ToUpper(neType) + "/" + neId - // result[neItem] = sysInfo - } - - data = append(data, result) - log.Trace("data:", data) - - var response Response - response.Data = data - services.ResponseWithJson(w, http.StatusOK, response) -} - -// Get system state from NF/NFs -func GetAllLicenseInfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetAllLicenseInfoFromNF processing... ") - - data := make([]map[string]interface{}, 0) - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("AccessToken:", token) - - var neList []dborm.NeInfo - _, err := dborm.XormGetAllNeInfo(&neList) - if err != nil { - log.Error("Failed to XormGetAllNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - omcNeTypeLower := "omc" - if config.GetYamlConfig().OMC.NeType != "" { - omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType) - } - - for _, ne := range neList { - var result map[string]interface{} - log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower) - log.Debug("ne: ", ne) - //if strings.ToLower(ne.NeType) != omcNeTypeLower || !strings.Contains(r.RemoteAddr, ne.Ip) { - if strings.ToLower(ne.NeType) != omcNeTypeLower { - // 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)) - var requestURI2NF string - if config.GetYamlConfig().OMC.TestMode && strings.ToLower(ne.NeType) != "udm" { - var udmNEs []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs) - if err != nil { - log.Error("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if len(udmNEs) > 0 { - udmNe := udmNEs[0] - hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(udmNe.NeType)) - } - } else { - 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.SetTimeout(time.Duration(1 * time.Second)).R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - // 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) - // errorMessage := services.ErrorMessage{ - // ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused", - // } - // //result["error"] = errorMessage - continue - } else { - systemState := &SysState{} - _ = json.Unmarshal(resp.Body(), &systemState) - licenseInfo := &LicenseInfo{ - NeType: ne.NeType, - NeId: ne.NeId, - SerialNum: systemState.SerialNum, - Capability: systemState.Capability, - CapUsed: config.TDatas[ne.NeType].CapUsed, - FeatureEnabled: config.TDatas[ne.NeType].FeatureEnabled, - ExpiryDate: systemState.ExpiryDate, - } - result, err = global.ToMap(*licenseInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - // neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId - // result[neItem] = sysInfo - } - } else { - systemState := GetEMSState(ne.Ip) - licenseInfo := &LicenseInfo{ - NeType: ne.NeType, - NeId: ne.NeId, - SerialNum: systemState.SerialNum, - Capability: systemState.Capability, - CapUsed: config.TDatas[ne.NeType].CapUsed, - FeatureEnabled: config.TDatas[ne.NeType].FeatureEnabled, - ExpiryDate: systemState.ExpiryDate, - } - result, err = global.ToMap(*licenseInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - // neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId - // result[neItem] = sysInfo - } - - data = append(data, result) - log.Trace("data:", data) - } - - var response Response - response.Data = data - services.ResponseWithJson(w, http.StatusOK, response) -} - -// Get system state from NF/NFs -func GetOneSysinfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetOneSysinfoFromNF processing... ") - - data := make([]map[string]interface{}, 0) - - vars := mux.Vars(r) - neType := vars["neType"] - neId := vars["neId"] - if neType == "" || neId == "" { - services.ResponseNotFound404UriNotExist(w, r) - return - } - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("AccessToken:", 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) - - //systemState := make(map[string]interface{}) - systemState := &SysState{} - var result map[string]interface{} - //sysInfo := &SystemInfo{} - omcNeTypeLower := "omc" - if config.GetYamlConfig().OMC.NeType != "" { - omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType) - } - if neType != omcNeTypeLower { - log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower) - var requestURI2NF string - if config.GetYamlConfig().OMC.TestMode && strings.ToLower(neType) != "udm" { - var udmNEs []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs) - if err != nil { - log.Error("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if len(udmNEs) > 0 { - udmNe := udmNEs[0] - hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(udmNe.NeType)) - } - } else { - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(neInfo.NeType)) - } - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - // 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 { - log.Trace("resp.Body():", string(resp.Body())) - _ = json.Unmarshal(resp.Body(), &systemState) - - log.Trace("systemState:", systemState) - hostName := "5gc" - if systemState.HostName != "" { - hostName = systemState.HostName - } - osInfo := "Linux 5gc 4.15.0-29-generic SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 GNU/Linux" - if systemState.OsInfo != "" { - osInfo = systemState.OsInfo - } - dbInfo := "db v1.4.15" - if systemState.OsInfo != "" { - dbInfo = systemState.DbInfo - } - port, _ := strconv.Atoi(neInfo.Port) - cpus := 4 - if systemState.HardwareInfo.CPUs != 0 { - cpus = systemState.HardwareInfo.CPUs - } - totalMem := 34029125632 - if systemState.HardwareInfo.Memory != 0 { - totalMem = systemState.HardwareInfo.Memory - } - sysInfo := &SystemInfo{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - HostName: hostName, - OsInfo: osInfo, - DbInfo: dbInfo, - Version: systemState.Version, - IpAddr: neInfo.Ip, - Port: uint16(port), - CPUs: cpus, - TotalMem: totalMem, - PvFlag: neInfo.PvFlag, - Status: NeStatusEnumToStr(neInfo.Status), - } - //neItem := strings.ToUpper(neType) + "/" + neId - result, err = global.ToMap(*sysInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - } - } else { - systemState := GetEMSState(neInfo.Ip) - sysInfo := &SystemInfo{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - HostName: systemState.HostName, - OsInfo: systemState.OsInfo, - DbInfo: systemState.DbInfo, - Version: systemState.Version, - IpAddr: neInfo.Ip, - Port: systemState.Port, - CPUs: systemState.HardwareInfo.CPUs, - TotalMem: systemState.HardwareInfo.Memory, - PvFlag: neInfo.PvFlag, - Status: NeStatusEnumToStr(neInfo.Status), - } - result, err = global.ToMap(*sysInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - // neItem := strings.ToUpper(neType) + "/" + neId - // result[neItem] = sysInfo - } - - data = append(data, result) - log.Trace("data:", data) - - var response Response - response.Data = data - services.ResponseWithJson(w, http.StatusOK, response) -} - -// Get system state from NF/NFs -func GetAllSysinfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetAllSysinfoFromNF processing... ") - - data := make([]map[string]interface{}, 0) - - // token, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // log.Debug("AccessToken:", token) - - var neList []dborm.NeInfo - _, err := dborm.XormGetAllNeInfo(&neList) - if err != nil { - log.Error("Failed to XormGetAllNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - omcNeTypeLower := "omc" - if config.GetYamlConfig().OMC.NeType != "" { - omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType) - } - - for _, ne := range neList { - var result map[string]interface{} - log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower) - log.Debug("ne: ", ne) - //if strings.ToLower(ne.NeType) != omcNeTypeLower || !strings.Contains(r.RemoteAddr, ne.Ip) { - if strings.ToLower(ne.NeType) != omcNeTypeLower { - // 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)) - var requestURI2NF string - if config.GetYamlConfig().OMC.TestMode && strings.ToLower(ne.NeType) != "udm" { - var udmNEs []dborm.NeInfo - err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs) - if err != nil { - log.Error("Get system state from NF is failed:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - if len(udmNEs) > 0 { - udmNe := udmNEs[0] - hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port) - requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, strings.ToLower(udmNe.NeType)) - } - } else { - 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.SetTimeout(time.Duration(1 * time.Second)).R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - // 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) - // errorMessage := services.ErrorMessage{ - // ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused", - // } - // //result["error"] = errorMessage - continue - } else { - systemState := &SysState{} - _ = json.Unmarshal(resp.Body(), &systemState) - hostName := "5gc" - if systemState.HostName != "" { - hostName = systemState.HostName - } - osInfo := "Linux 5gc 4.15.0-29-generic SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 GNU/Linux" - if systemState.OsInfo != "" { - osInfo = systemState.OsInfo - } - dbInfo := "db v1.4.15" - if systemState.OsInfo != "" { - dbInfo = systemState.DbInfo - } - port, _ := strconv.Atoi(ne.Port) - cpus := 4 - if systemState.HardwareInfo.CPUs != 0 { - cpus = systemState.HardwareInfo.CPUs - } - totalMem := 34029125632 - if systemState.HardwareInfo.Memory != 0 { - totalMem = systemState.HardwareInfo.Memory - } - sysInfo := &SystemInfo{ - NeType: ne.NeType, - NeId: ne.NeId, - HostName: hostName, - OsInfo: osInfo, - DbInfo: dbInfo, - Version: systemState.Version, - IpAddr: ne.Ip, - Port: uint16(port), - CPUs: cpus, - TotalMem: totalMem, - PvFlag: ne.PvFlag, - Status: NeStatusEnumToStr(ne.Status), - } - // neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId - // result[neItem] = sysInfo - result, err = global.ToMap(*sysInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - } - } else { - port, _ := strconv.Atoi(ne.Port) - systemState := GetEMSState(ne.Ip) - sysInfo := &SystemInfo{ - NeType: ne.NeType, - NeId: ne.NeId, - HostName: systemState.HostName, - OsInfo: systemState.OsInfo, - DbInfo: systemState.DbInfo, - Version: systemState.Version, - IpAddr: ne.Ip, - Port: (uint16(port)), - CPUs: systemState.HardwareInfo.CPUs, - TotalMem: systemState.HardwareInfo.Memory, - PvFlag: ne.PvFlag, - Status: NeStatusEnumToStr(ne.Status), - } - // neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId - // result[neItem] = sysInfo - result, err = global.ToMap(*sysInfo, "json") - if err != nil { - log.Warn("Failed to map:", err) - } - } - - data = append(data, result) - log.Trace("data:", data) - } - - var response Response - response.Data = data - services.ResponseWithJson(w, http.StatusOK, response) -} - -// Get system state from NF/NFs -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{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - //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("Fail to get state:", err) - - errorMessage := services.ErrorMessage{ - ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused", - } - systemState := make(map[string]interface{}) - systemState["error"] = errorMessage - result["systemState"] = systemState - } 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 - } - - // only support omc and all elementType - err := fmt.Errorf("only support omc or all elementTypeValue") - log.Error("Fail to get state:", err) - services.ResponseInternalServerError500ProcessError(w, err) - - // var neList []dborm.NeInfo - // err := dborm.XormGetNeInfoByNeType(neType, &neList) - // if err != nil { - // log.Error("Failed to dborm.XormGetNeInfoByNeType:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // var omcList []dborm.NeInfo - // err = dborm.XormGetNeInfoByNeType("omc", &omcList) - // if err != nil { - // log.Error("Failed to omc ne list:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - // for i, ne := range neList { - - // } - // 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) -} - -func GetEMSState(ip string) *SysState { - log.Debug("GetEMSState processing... ") - - sysInfo := new(SysInfo) - err := GetSysInfo(sysInfo) - if err != nil { - log.Error("Failed to GetSysInfo:", err) - return nil - } - - cpuUsage := &CpuUsage{ - NfCpuUsage: sysInfo.MyCpuPercent, - SysCpuUsage: sysInfo.SysCpuPercent, - } - - memUsage := &MemUsage{ - TotalMem: sysInfo.SysTotalRam, - NfUsedMem: sysInfo.MyUsedRam, - SysMemUsage: sysInfo.SysRamUsedPercent, - } - - diskSpace := &DiskSpace{ - PartitionNum: sysInfo.PartitionNum, - 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) - } - } - } - } - } - - CapabilityInt := config.GetYamlConfig().OMC.Capability - if CapabilityInt == 0 { - CapabilityInt = 5000 - } - snStr := config.GetYamlConfig().OMC.Sn - if snStr == "" { - snStr = "-" - } - expiryDateStr := config.GetYamlConfig().OMC.ExpiryDate - if expiryDateStr == "" { - expiryDateStr = "-" - } - var port uint16 = 33030 - httpArr := cfg.Get("server") - if httpArr != nil { - arr := httpArr.([]any) - if len(arr) > 1 { - rest := arr[0].(map[string]any) - port = uint16(parse.Number(rest["port"])) - } - } - hostName, _ := os.Hostname() - dbInfo := getDbInfo() - emsState := &SysState{ - HostName: hostName, - OsInfo: getUnameStr(), - DbInfo: dbInfo, - IpAddr: ipAddrs, - Port: port, - Version: cfg.Version, - Capability: CapabilityInt, - SerialNum: snStr, - ExpiryDate: expiryDateStr, - HardwareInfo: HardwareInfo{CPUs: getCpuNumber(), Memory: getTotalMemory()}, - CpuUsage: *cpuUsage, - MemUsage: *memUsage, - DiskSpace: *diskSpace, - } - - //getSystemInfo() - return emsState -} - -func getDbInfo() string { - var dbConfig map[string]any - defSource := cfg.Get("database.defaultDataSourceName").(string) - datasource := cfg.Get("database.datasource").(map[string]any) - for key, value := range datasource { - item := value.(map[string]any) - if key == defSource { - dbConfig = item - break - } - } - - if dbConfig["type"] == "mysql" { - return getMySQLVersion() - } - if dbConfig["type"] == "sqlite" { - return "3.35.5 SQLite3" - } - return "" -} - -func getMySQLVersion() string { - var info string = "" - - var ver, verComment, verCompileOS, verCompile string - - // 版本 - m, err := db.RawDB("", "SHOW VARIABLES LIKE 'version'", nil) - if err != nil || len(m) != 1 { - return info - } - if v, ok := m[0]["Value"]; ok { - ver = v.(string) - } - - // 详细版本 - m, err = db.RawDB("", "SHOW VARIABLES LIKE 'version_comment'", nil) - if err != nil || len(m) != 1 { - return info - } - if v, ok := m[0]["Value"]; ok { - verComment = v.(string) - } - - // 编译操作系统 - m, err = db.RawDB("", "SHOW VARIABLES LIKE 'version_compile_os'", nil) - if err != nil || len(m) != 1 { - return info - } - if v, ok := m[0]["Value"]; ok { - verCompileOS = v.(string) - } - - // 编译机器 - m, err = db.RawDB("", "SHOW VARIABLES LIKE 'version_compile_machine'", nil) - if err != nil || len(m) != 1 { - return info - } - if v, ok := m[0]["Value"]; ok { - verCompileOS = v.(string) - } - - return fmt.Sprintf("%s %s, for %s (%s)", ver, verComment, verCompileOS, verCompile) -} diff --git a/features/state/state_linux.go b/features/state/state_linux.go deleted file mode 100644 index 30ed20d8..00000000 --- a/features/state/state_linux.go +++ /dev/null @@ -1,243 +0,0 @@ -//go:build linux -// +build linux - -package state - -import ( - "encoding/binary" - "fmt" - "os" - "runtime" - "syscall" - "time" - - "be.ems/lib/log" - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/disk" - "github.com/shirou/gopsutil/v4/mem" - "github.com/shirou/gopsutil/v4/process" -) - -type SysInfo struct { - SysCpuPercent uint16 // x% - MyCpuPercent uint16 // x%, CPU percent of current proccess - - SysTotalRam uint32 // KB - MyUsedRam uint32 // RAM usage of current proccess, KB - SysRamUsedPercent uint16 // x% - - PartitionNum byte - PartitionInfo []PartitionInfo // usage of each partition -} - -const MAX_PARTITION_NUM byte = 32 - -func GetSysStat() ([]byte, int) { - // Get sys info - var sysInfo SysInfo - err := GetSysInfo(&sysInfo) - if err != nil { - return nil, 0 - } - - //log.Tracef("current sys info: %v", sysInfo) - - // build ems buffer - var data []byte = make([]byte, 1024) - var len int - var i byte - binary.BigEndian.PutUint16(data[0:], sysInfo.MyCpuPercent) //x% * 100 - binary.BigEndian.PutUint16(data[2:], sysInfo.SysCpuPercent) //x% * 100 - binary.BigEndian.PutUint32(data[4:], sysInfo.SysTotalRam) // KB - binary.BigEndian.PutUint32(data[8:], sysInfo.MyUsedRam) // KB - binary.BigEndian.PutUint16(data[12:], sysInfo.SysRamUsedPercent) //x% * 100 - data[14] = sysInfo.PartitionNum - for i = 0; i < sysInfo.PartitionNum; i++ { - binary.BigEndian.PutUint32(data[15+8*(i):], sysInfo.PartitionInfo[i].Total) // MB - binary.BigEndian.PutUint32(data[15+8*(i)+4:], sysInfo.PartitionInfo[i].Used) // MB - } - len = int(15 + 8*sysInfo.PartitionNum) - - //log.Tracef("current sys stat buf: %v, len: %d", data, len) - - return data, len -} - -var pProc *process.Process = nil - -func GetSYsCpuPercent() float64 { - totalPercent, err := cpu.Percent(0, false) //(2*time.Second, false) - if err != nil { - return 0.0 - } else { - return totalPercent[0] - } -} - -func GetSysInfo(sysInfo *SysInfo) error { - // sys cpu percent - totalPercent, err := cpu.Percent(0, false) //(2*time.Second, false) - if err != nil { - sysInfo.SysCpuPercent = 0 - } else { - sysInfo.SysCpuPercent = uint16(totalPercent[0] * 100) - } - - if pProc == nil { - checkPid := os.Getpid() - pProc, err = process.NewProcess(int32(checkPid)) - if err != nil { - log.Tracef("get process info error %v", err) - return err - } - } - - // self cpu percent - percent, err := pProc.Percent(0) //(2*time.Second) - if err != nil { - log.Tracef("get process cpu percent error %v", err) - sysInfo.MyCpuPercent = 0 - } else { - sysInfo.MyCpuPercent = uint16(percent * 100) - } - - // self RAM(KB) - myRam, err := pProc.MemoryInfo() - if err != nil { - log.Tracef("get self memory info error %v", err) - sysInfo.MyUsedRam = 0 - } else { - sysInfo.MyUsedRam = uint32(myRam.RSS / 1024) - } - - // system RAM(KB) - sysRam, err := mem.VirtualMemory() - if err != nil { - log.Tracef("gett sys memory info error %v", err) - sysInfo.SysTotalRam = 0 - sysInfo.SysRamUsedPercent = 0 - } else { - sysInfo.SysTotalRam = uint32(sysRam.Total / 1024) - sysInfo.SysRamUsedPercent = uint16(sysRam.UsedPercent * 100) - } - - // partition usage - GetPartitions(sysInfo) - return nil -} - -func getProcess() *process.Process { - checkPid := os.Getpid() - ret, _ := process.NewProcess(int32(checkPid)) - return ret -} - -func GetSystemCpuInfo() { - physicalCnt, _ := cpu.Counts(false) - logicalCnt, _ := cpu.Counts(true) - log.Tracef("physical count:%d logical count:%d", physicalCnt, logicalCnt) - - totalPercent, _ := cpu.Percent(3*time.Second, false) // per cpu is false - perPercents, _ := cpu.Percent(3*time.Second, true) // per cpu is true - log.Tracef("total percent:%v per percents:%v", totalPercent, perPercents) -} - -func GetProcessCpuPercent() { - p := getProcess() - percent, err := p.Percent(0) - if err != nil { - log.Tracef("error %v", err) - } - - numcpu := runtime.NumCPU() - // if percent < 0.0 || percent > 100.0*float64(numcpu) { // TODO - if percent < 0.0 { - log.Tracef("Err CPU Percent of Process: %f, CPU num: %d", percent, numcpu) - } else { - log.Tracef("get process CPU percent: %f, CPU num: %d", percent, numcpu) - } -} - -func GetProcessMemoryInfo() { - p := getProcess() - - v, err := p.MemoryInfo() - if err != nil { - log.Tracef("getting memory info error %v", err) - } - - log.Tracef("get process memory info %v", v) - - info, _ := mem.VirtualMemory() - fmt.Println(info) -} - -func GetPartitions(sysInfo *SysInfo) { - sysInfo.PartitionNum = 0 - //sysInfo.PartitionInfo = make([]PartitionInfo, MAX_PARTITION_NUM, MAX_PARTITION_NUM) - infos, _ := disk.Partitions(true) - for _, info := range infos { - GetOnePartitionUsage(info.Mountpoint, sysInfo) - if sysInfo.PartitionNum >= MAX_PARTITION_NUM { - break - } - } -} - -func GetOnePartitionUsage(path string, sysInfo *SysInfo) int { - info, err := disk.Usage(path) - if err != nil { - return -1 - } - - if info.Total <= 0 { // info.Used/(1024 * 1024)MB - return 0 - } - var partition PartitionInfo - partition.Total = uint32(info.Total / 1024 / 1024) - partition.Used = uint32(info.Used / 1024 / 1024) - sysInfo.PartitionInfo = append(sysInfo.PartitionInfo, partition) - sysInfo.PartitionNum++ - - /*data, err := json.MarshalIndent(info, "", " ") - if err != nil { - return -1 - } - - fmt.Println(string(data))*/ - return 1 -} - -func getOS() string { - var osname string - if runtime.GOOS == "linux" { - osname = "GNU/Linux" - } - return osname -} - -func utsnameToString(unameArray [65]int8) string { - var byteString [65]byte - var indexLength int - for ; unameArray[indexLength] != 0 && indexLength < 65; indexLength++ { - byteString[indexLength] = uint8(unameArray[indexLength]) - } - return string(byteString[:indexLength]) -} - -func getUnameStr() string { - var utsname = syscall.Utsname{} - err := syscall.Uname(&utsname) - if err == nil { - name := utsnameToString(utsname.Sysname) - node := utsnameToString(utsname.Nodename) - release := utsnameToString(utsname.Release) - version := utsnameToString(utsname.Version) - machine := utsnameToString(utsname.Machine) - //domain:= utsnameToString(utsname.Domainname) - osName := getOS() - return fmt.Sprintf("%s %s %s %s %s %s", name, node, - release, version, machine, osName) - } - return "" -} diff --git a/features/state/state_windows.go b/features/state/state_windows.go deleted file mode 100644 index cbb027ee..00000000 --- a/features/state/state_windows.go +++ /dev/null @@ -1,231 +0,0 @@ -//go:build windows -// +build windows - -package state - -import ( - "encoding/binary" - "fmt" - "os" - "runtime" - "syscall" - "time" - - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/disk" - "github.com/shirou/gopsutil/v4/mem" - "github.com/shirou/gopsutil/v4/process" -) - -type SysInfo struct { - SysCpuPercent uint16 // x% - MyCpuPercent uint16 // x%, CPU percent of current proccess - - SysTotalRam uint32 // KB - MyUsedRam uint32 // RAM usage of current proccess, KB - SysRamUsedPercent uint16 // x% - - PartitionNum byte - PartitionInfo []PartitionInfo // usage of each partition -} - -const MAX_PARTITION_NUM byte = 32 - -func GetSysStat() ([]byte, int) { - // Get sys info - var sysInfo SysInfo - err := GetSysInfo(&sysInfo) - if err != nil { - return nil, 0 - } - - //fmt.Printf("current sys info: %v", sysInfo) - - // build ems buffer - var data []byte = make([]byte, 1024) - var len int - var i byte - binary.BigEndian.PutUint16(data[0:], sysInfo.MyCpuPercent) //x% * 100 - binary.BigEndian.PutUint16(data[2:], sysInfo.SysCpuPercent) //x% * 100 - binary.BigEndian.PutUint32(data[4:], sysInfo.SysTotalRam) // KB - binary.BigEndian.PutUint32(data[8:], sysInfo.MyUsedRam) // KB - binary.BigEndian.PutUint16(data[12:], sysInfo.SysRamUsedPercent) //x% * 100 - data[14] = sysInfo.PartitionNum - for i = 0; i < sysInfo.PartitionNum; i++ { - binary.BigEndian.PutUint32(data[15+8*(i):], sysInfo.PartitionInfo[i].Total) // MB - binary.BigEndian.PutUint32(data[15+8*(i)+4:], sysInfo.PartitionInfo[i].Used) // MB - } - len = int(15 + 8*sysInfo.PartitionNum) - - //fmt.Printf("current sys stat buf: %v, len: %d", data, len) - - return data, len -} - -var pProc *process.Process = nil - -func GetSYsCpuPercent() float64 { - totalPercent, err := cpu.Percent(0, false) //(2*time.Second, false) - if err != nil { - return 0.0 - } else { - return totalPercent[0] - } -} - -func GetSysInfo(sysInfo *SysInfo) error { - // sys cpu percent - totalPercent, err := cpu.Percent(0, false) //(2*time.Second, false) - if err != nil { - sysInfo.SysCpuPercent = 0 - } else { - sysInfo.SysCpuPercent = uint16(totalPercent[0] * 100) - } - - if pProc == nil { - checkPid := os.Getpid() - pProc, err = process.NewProcess(int32(checkPid)) - if err != nil { - fmt.Printf("get process info error %v", err) - return err - } - } - - // self cpu percent - percent, err := pProc.Percent(0) //(2*time.Second) - if err != nil { - fmt.Printf("get process cpu percent error %v", err) - sysInfo.MyCpuPercent = 0 - } else { - sysInfo.MyCpuPercent = uint16(percent * 100) - } - - // self RAM(KB) - myRam, err := pProc.MemoryInfo() - if err != nil { - fmt.Printf("get self memory info error %v", err) - sysInfo.MyUsedRam = 0 - } else { - sysInfo.MyUsedRam = uint32(myRam.RSS / 1024) - } - - // system RAM(KB) - sysRam, err := mem.VirtualMemory() - if err != nil { - fmt.Printf("gett sys memory info error %v", err) - sysInfo.SysTotalRam = 0 - sysInfo.SysRamUsedPercent = 0 - } else { - sysInfo.SysTotalRam = uint32(sysRam.Total / 1024) - sysInfo.SysRamUsedPercent = uint16(sysRam.UsedPercent * 100) - } - - // partition usage - GetPartitions(sysInfo) - return nil -} - -func getProcess() *process.Process { - checkPid := os.Getpid() - ret, _ := process.NewProcess(int32(checkPid)) - return ret -} - -func GetSystemCpuInfo() { - physicalCnt, _ := cpu.Counts(false) - logicalCnt, _ := cpu.Counts(true) - fmt.Printf("physical count:%d logical count:%d\n", physicalCnt, logicalCnt) - - totalPercent, _ := cpu.Percent(3*time.Second, false) // per cpu is false - perPercents, _ := cpu.Percent(3*time.Second, true) // per cpu is true - fmt.Printf("total percent:%v per percents:%v\n", totalPercent, perPercents) -} - -func GetProcessCpuPercent() { - p := getProcess() - percent, err := p.Percent(0) - if err != nil { - fmt.Printf("error %v", err) - } - - numcpu := runtime.NumCPU() - // if percent < 0.0 || percent > 100.0*float64(numcpu) { // TODO - if percent < 0.0 { - fmt.Printf("Err CPU Percent of Process: %f, CPU num: %d", percent, numcpu) - } else { - fmt.Printf("get process CPU percent: %f, CPU num: %d", percent, numcpu) - } -} - -func GetProcessMemoryInfo() { - p := getProcess() - - v, err := p.MemoryInfo() - if err != nil { - fmt.Printf("getting memory info error %v", err) - } - - fmt.Printf("get process memory info %v\n", v) - - info, _ := mem.VirtualMemory() - fmt.Println(info) -} - -func GetPartitions(sysInfo *SysInfo) { - sysInfo.PartitionNum = 0 - //sysInfo.PartitionInfo = make([]PartitionInfo, MAX_PARTITION_NUM, MAX_PARTITION_NUM) - infos, _ := disk.Partitions(true) - for _, info := range infos { - GetOnePartitionUsage(info.Mountpoint, sysInfo) - if sysInfo.PartitionNum >= MAX_PARTITION_NUM { - break - } - } -} - -func GetOnePartitionUsage(path string, sysInfo *SysInfo) int { - info, err := disk.Usage(path) - if err != nil { - return -1 - } - - if info.Total <= 0 { // info.Used/(1024 * 1024)MB - return 0 - } - var partition PartitionInfo - partition.Total = uint32(info.Total / 1024 / 1024) - partition.Used = uint32(info.Used / 1024 / 1024) - sysInfo.PartitionInfo = append(sysInfo.PartitionInfo, partition) - sysInfo.PartitionNum++ - - /*data, err := json.MarshalIndent(info, "", " ") - if err != nil { - return -1 - } - - fmt.Println(string(data))*/ - return 1 -} - -func getOS() string { - var osname string - if runtime.GOOS == "linux" { - osname = "GNU/Linux" - } - return osname -} - -func utsnameToString(unameArray [65]int8) string { - var byteString [65]byte - var indexLength int - for ; unameArray[indexLength] != 0 && indexLength < 65; indexLength++ { - byteString[indexLength] = uint8(unameArray[indexLength]) - } - return string(byteString[:indexLength]) -} - -func getUnameStr() string { - osInfo, _ := syscall.GetVersion() - - return fmt.Sprintf("Widnows %d", osInfo) -} diff --git a/features/state/sysinfo.go b/features/state/sysinfo.go deleted file mode 100644 index f6f25b1c..00000000 --- a/features/state/sysinfo.go +++ /dev/null @@ -1,29 +0,0 @@ -package state - -import ( - "be.ems/lib/log" - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/mem" -) - -func getCpuNumber() int { - // 获取CPU信息 - cpuInfo, err := cpu.Info() - if err != nil { - log.Errorf("Failed to get CPU info: %v", err) - return 0 - } - log.Tracef("CPU info: %+v", cpuInfo) - return len(cpuInfo) -} - -func getTotalMemory() int { - // 获取内存信息 - memInfo, err := mem.VirtualMemory() - if err != nil { - log.Errorf("Failed to get memory info: %v", err) - return 0 - } - log.Tracef("Memory info: %+v", memInfo) - return int(memInfo.Total) -} diff --git a/features/ue/ue.go b/features/ue/ue.go deleted file mode 100644 index 4c4ebb9a..00000000 --- a/features/ue/ue.go +++ /dev/null @@ -1,833 +0,0 @@ -package ue - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - "time" - - "be.ems/lib/config" - "be.ems/lib/core/ctx" - "be.ems/lib/dborm" - "be.ems/lib/global" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/src/framework/constants" - neDataModel "be.ems/src/modules/network_data/model" - neDataService "be.ems/src/modules/network_data/service" - neService "be.ems/src/modules/network_element/service" - - "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"` - RatType string `json:"ratType"` - PduSessionInfo []struct { - PduSessionID int `json:"pduSessionID"` - IPv4 string `json:"ipv4"` - IPv6 string `json:"ipv6"` - Dnn string `json:"dnn"` - Tai string `json:"tai"` - SstSD string `json:"sstSD"` - UpfN3IP string `json:"upfN3IP"` - RanN3IP string `json:"ranN3IP"` - Activetime string `json:"activeTime"` - UpState string `json:"upState"` - } `json:"pduSessionInfo"` -} - -// 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"` -} - -// N3iwfUEInfo N3IWF在线用户信息 -type N3iwfUEInfo struct { - IMSI string `json:"imsi"` - - NAI string `json:"nai"` - RegState int `json:"regState"` - Activetime string `json:"activeTime"` -} - -type N3iwfUEData struct { - Data []N3iwfUEInfo `json:"data"` -} - -var ( - UriNBState = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/nbState" - 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" - UriPCFUser = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo" - UriPCFUserM = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/batch/{number}" - UriPCFUserFileImport = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/file/import" - UriPCFUserFileExport = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/file/export" - UriNSSFAvailableAMFs = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/availableAMFs" - UriNSSFSubscriptions = config.DefaultUriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/subscriptions" - - CustomUriNBState = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/nbState" - 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" - CustomUriPCFUser = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo" - CustomUriPCFUserM = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/batch/{number}" - CustomUriPCFUserFileImport = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/file/import" - CustomUriPCFUserFileExport = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/pcf/objectType/ueInfo/file/export" - CustomUriNSSFAvailableAMFs = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/availableAMFs" - CustomUriNSSFSubscriptions = config.UriPrefix + "/ueManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/subscriptions" -) - -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(500 * time.Millisecond) -} - -// Get AvailableAMFs from NSSF -func GetAvailableAMFsFromNSSF(w http.ResponseWriter, r *http.Request) { - log.Info("GetAvailableAMFsFromNSSF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if strings.ToLower(neType) != "nssf" { - 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{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - // 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.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get Subscriptions from NSSF -func GetSubscriptionsFromNSSF(w http.ResponseWriter, r *http.Request) { - log.Info("GetSubscriptionsFromNSSF processing... ") - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if strings.ToLower(neType) != "nssf" { - 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{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - // 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.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get UEInfo from NF/NFs -func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("GetUEInfoFromNF processing... ") - - neId := ctx.GetQuery(r, "neId") - neType := ctx.GetParam(r, "elementTypeValue") - if neType == "" || neId == "" { - log.Error("elementTypeValue/neId is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - - neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - var response services.MapResponse - if neInfo.NeId == neId && neInfo.NeId != "" { - requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI) - 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("Failed to Get from NF:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - _ = json.Unmarshal(resp.Body(), &response) - } - log.Debug("response:", response) - } - - services.ResponseWithJson(w, http.StatusOK, response) -} - -// POST User Info from NF/NFs -func PostPCFUserInfo(w http.ResponseWriter, r *http.Request) { - log.Info("PostPCFUserInfo processing... ") - - // vars := mux.Vars(r) - // neType := vars["elementTypeValue"] - // if neType == "" { - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - //neTypeLower := strings.ToLower(neType) - neType := "PCF" - 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) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - client.SetTimeout(1 * time.Minute) - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - //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"}). - SetBody(body). - Post(requestURI2NF) - if err != nil { - log.Error("Failed to post:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// PUT PCF User Info from NF/NFs -func PutPCFUserInfo(w http.ResponseWriter, r *http.Request) { - log.Info("PutPCFUserInfo processing... ") - - // vars := mux.Vars(r) - // neType := vars["elementTypeValue"] - // if neType == "" { - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - //neTypeLower := strings.ToLower(neType) - neType := "PCF" - 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) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - client.SetTimeout(1 * time.Minute) - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - //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"}). - SetBody(body). - Put(requestURI2NF) - if err != nil { - log.Error("Failed to put:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get UEInfo from NF/NFs -func DeletePCFUserInfo(w http.ResponseWriter, r *http.Request) { - log.Info("DeletePCFUserInfo processing... ") - - // vars := mux.Vars(r) - // neType := vars["elementTypeValue"] - // if neType == "" { - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - //neTypeLower := strings.ToLower(neType) - neType := "PCF" - 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{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - //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"}). - Delete(requestURI2NF) - if err != nil { - log.Error("Failed to delete:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } else { - w.WriteHeader(resp.StatusCode()) - w.Write(resp.Body()) - // var response services.MapResponse - // _ = json.Unmarshal(resp.Body(), &response) - // services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get UEInfo from SMF -func GetUENumFromNF(w http.ResponseWriter, r *http.Request) { - log.Info("GetUENumFromNF 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{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - // 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.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// Get Radio Info 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{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - // 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.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} - -// PostNBInfoFromNF 接收Radio数据请求 -func PostNBInfoFromNF(w http.ResponseWriter, r *http.Request) { - log.Info("PostNBInfoFromNF processing... ") - neType := ctx.GetParam(r, "elementTypeValue") - var body struct { - NeType string `json:"neType" ` - NeName string `json:"neName" ` - RmUID string `json:"rmUID"` - StateList []struct { - Address string `json:"address" ` - Name string `json:"name" ` - Position string `json:"position" ` - NbName string `json:"nbName" ` - State string `json:"state" ` // "OFF" or "ON" - OffTime string `json:"offTime" ` //if State=OFF, will set it - OnTime string `json:"onTime" ` //if State=ON , will set it - } - } - if err := ctx.ShouldBindJSON(r, &body); err != nil { - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - neTypeLower := strings.ToLower(body.NeType) - if neType == "" || neType != neTypeLower { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("inconsistent network element types")) - return - } - - neInfo := neService.NewNeInfo.FindByRmuid(body.RmUID) - if neInfo.RmUID != body.RmUID { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("inconsistent network element rmUID")) - return - } - - if len(body.StateList) == 0 { - services.ResponseInternalServerError500ProcessError(w, fmt.Errorf("no stateList")) - return - } - - nbStateService := neDataService.NewNBState - for _, v := range body.StateList { - if v.Address == "" || v.State == "" { - continue - } - timeStr := v.OffTime - if v.State == "ON" { - timeStr = v.OnTime - } - nbStateService.Insert(neDataModel.NBState{ - NeType: neInfo.NeType, - NeId: neInfo.NeId, - RmUid: neInfo.RmUID, - Address: v.Address, - Name: v.Name, - Position: v.Position, - NbName: v.NbName, - State: v.State, - Time: timeStr, - }) - } - - services.ResponseStatusOK204NoContent(w) -} - -// Get Radio Info from NF/NFs -func GetNBInfoAllFromNF(w http.ResponseWriter, r *http.Request) { - log.Info("GetNBInfoAllFromNF 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) - - //var ret error - var statusCode int = 500 - var dataResponse []services.MapResponse - var neInfos []dborm.NeInfo - dborm.XormGetNeInfo2(neType, neIDs, &neInfos) - for _, neInfo := range neInfos { - // 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 - // } - - 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{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - //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("Failed to GET:", err) - continue - // services.ResponseInternalServerError500ProcessError(w, err) - // return - } else { - switch resp.StatusCode() { - case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted: - var response services.MapResponse - _ = json.Unmarshal(resp.Body(), &response) - dataResponse = append(dataResponse, response) - statusCode = http.StatusOK - } - } - } - var response services.DataResponse - response.Data = dataResponse - services.ResponseWithJson(w, statusCode, response) -} - -// Get GetUEInfoFileExportNF from NF/NFs -func GetUEInfoFileExportNF(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("PCF", 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) - - client.SetTimeout(3 * time.Minute) - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{constants.HEADER_KEY: r.Header.Get(constants.HEADER_KEY)}). - // 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 { - w.WriteHeader(resp.StatusCode()) - w.Write(resp.Body()) - // var response services.MapResponse - // _ = json.Unmarshal(resp.Body(), &response) - // services.ResponseWithJson(w, resp.StatusCode(), response) - return - } -} diff --git a/lib/aes/aes.go b/lib/aes/aes.go deleted file mode 100644 index 5ce2fb40..00000000 --- a/lib/aes/aes.go +++ /dev/null @@ -1,64 +0,0 @@ -package aes - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "encoding/base64" -) - -func AesEncrypt(orig string, key string) string { - // 转成字节数组 - origData := []byte(orig) - k := []byte(key) - - // 分组秘钥 - block, _ := aes.NewCipher(k) - // 获取秘钥块的长度 - blockSize := block.BlockSize() - // 补全码 - origData = PKCS7Padding(origData, blockSize) - // 加密模式 - blockMode := cipher.NewCBCEncrypter(block, k[:blockSize]) - // 创建数组 - cryted := make([]byte, len(origData)) - // 加密 - blockMode.CryptBlocks(cryted, origData) - - return base64.StdEncoding.EncodeToString(cryted) - -} - -func AesDecrypt(cryted string, key string) string { - // 转成字节数组 - crytedByte, _ := base64.StdEncoding.DecodeString(cryted) - k := []byte(key) - - // 分组秘钥 - block, _ := aes.NewCipher(k) - // 获取秘钥块的长度 - blockSize := block.BlockSize() - // 加密模式 - blockMode := cipher.NewCBCDecrypter(block, k[:blockSize]) - // 创建数组 - orig := make([]byte, len(crytedByte)) - // 解密 - blockMode.CryptBlocks(orig, crytedByte) - // 去补全码 - orig = PKCS7UnPadding(orig) - return string(orig) -} - -// 补码 -func PKCS7Padding(ciphertext []byte, blocksize int) []byte { - padding := blocksize - len(ciphertext)%blocksize - padtext := bytes.Repeat([]byte{byte(padding)}, padding) - return append(ciphertext, padtext...) -} - -// 去码 -func PKCS7UnPadding(origData []byte) []byte { - length := len(origData) - unpadding := int(origData[length-1]) - return origData[:(length - unpadding)] -} diff --git a/lib/config/config.go b/lib/config/config.go deleted file mode 100644 index 2ba6afae..00000000 --- a/lib/config/config.go +++ /dev/null @@ -1,475 +0,0 @@ -package config - -import ( - "bufio" - "fmt" - "os" - "reflect" - "strings" - - "be.ems/lib/global" - "be.ems/lib/log" - - "gopkg.in/yaml.v3" -) - -// Yaml struct of config -type YamlConfig struct { - Logger struct { - File string `yaml:"file"` - Level string `yaml:"level"` - Duration int `yaml:"duration"` - Count int `yaml:"count"` - } `yaml:"logger"` - - OMC struct { - UriPrefix string `yaml:"uriPrefix"` - NeType string `yaml:"neType"` - NeId string `yaml:"neId"` - RmUID string `yaml:"rmUID"` - NeName string `yaml:"neName"` - Province string `yaml:"province"` - Vendor string `yaml:"vendor"` - Dn string `yaml:"dn"` - Chk2Ne bool `yaml:"chk2ne"` - Capability uint32 `yaml:"capability"` - Sn string `yaml:"sn"` - ExpiryDate string `yaml:"expiryDate"` - CheckSign bool `yaml:"checksign"` - RootDir string `yaml:"rootDir"` - BinDir string `yaml:"binDir"` - Backup string `yaml:"backup"` - Upload string `yaml:"upload"` - FrontUpload string `yaml:"frontUpload"` - FrontTraceDir string `yaml:"frontTraceDir"` - Software string `yaml:"software"` - License string `yaml:"license"` - GtpUri string `yaml:"gtpUri"` - CheckContentType bool `yaml:"checkContentType"` - TestMode bool `yaml:"testMode"` - RBACMode bool `yaml:"rbacMode"` - RunDir string `yaml:"runDir"` - CmdTimeout int `yaml:"cmdTimeout"` - } `yaml:"omc"` - - Alarm AlarmConfig `yaml:"alarm"` - - MML MMLParam `yaml:"mml"` - - NE struct { - Addr string `yaml:"addr"` - Port uint16 `yaml:"port"` - User string `yaml:"user"` - EtcDir string `yaml:"etcdir"` - BinDir string `yaml:"bindir"` - OmcDir string `yaml:"omcdir"` - ScpDir string `yaml:"scpdir"` - LicenseDir string `yaml:"licensedir"` - EtcListIMS string `yaml:"etcListIMS"` - EtcListDefault string `yaml:"etcListDefault"` - DpkgOverwrite bool `yaml:"dpkgOverwrite"` - DpkgTimeout int `yaml:"dpkgTimeout"` - } `yaml:"ne"` - - Auth struct { - Crypt string `yaml:"crypt"` - Token bool `yaml:"token"` - Expires uint32 `yaml:"expires"` - Session string `yaml:"session"` - PublicKey string `yaml:"publicKey"` - PrivateKey string `yaml:"privateKey"` - } `yaml:"auth"` - - Params struct { - RmUIDMaxNum int `yaml:"rmuidmaxnum"` - AlarmIDMaxNum int `yaml:"alarmidmaxnum"` - PmIDMaxNum int `yaml:"pmidmaxnum"` - SubIDMaxNum int `yaml:"subidmaxnum"` - UriMaxLen int `yaml:"urimaxlen"` - RmUIDRegexp string `yaml:"rmuidregexp"` - } `yaml:"params"` - - TestConfig struct { - Enabled bool `yaml:"enabled"` - File string `yaml:"file"` - } `yaml:"testConfig"` -} - -// type DbConfig struct { -// Type string `yaml:"type"` -// User string `yaml:"user"` -// Password string `yaml:"password"` -// Host string `yaml:"host"` -// Port string `yaml:"port"` -// Name string `yaml:"name"` -// ConnParam string `yaml:"connParam,omitempty"` -// Backup string `yaml:"backup"` -// } - -type AlarmConfig struct { - SplitEventAlarm bool `yaml:"splitEventAlarm"` - //ForwardAlarm bool `yaml:"forwardAlarm"` - - EmailForward struct { - Enable bool `yaml:"enable" json:"enable"` - EmailList string `yaml:"emailList" json:"emailList"` - Title string `yaml:"title" json:"title"` - SMTP string `yaml:"smtp" json:"smtp"` - Port uint16 `yaml:"port" json:"port"` - User string `yaml:"user" json:"user"` - Password string `yaml:"password" json:"password"` - TLSSkipVerify bool `yaml:"tlsSkipVerify" json:"tlsSkipVerify"` - } `yaml:"alarmEmailForward"` - SMSCForward struct { - Enable bool `yaml:"enable" json:"enable"` - MobileList string `yaml:"mobileList" json:"mobileList"` - SMSCAddr string `yaml:"smscAddr" json:"smscAddr"` - SystemID string `yaml:"systemID" json:"systemID"` - Password string `yaml:"password" json:"password"` - SystemType string `yaml:"systemType" json:"systemType"` - DataCoding byte `yaml:"dataCoding" json:"dataCoding"` - ServiceNumber string `yaml:"serviceNumber" json:"serviceNumber"` - } `yaml:"alarmSMSForward"` - SMS struct { - ApiURL string `yaml:"apiURL"` - AccessKeyID string `yaml:"AccessKeyID"` - AccessKeySecret string `yaml:"accessKeySecret"` - SignName string `yaml:"signName"` - TemplateCode string `yaml:"templateCode"` - } `yaml:"smsForward"` - SMProxy string `yaml:"smProxy"` -} - -type MMLParam struct { - Sleep int64 `yaml:"sleep"` - DeadLine int64 `yaml:"deadLine"` - SizeRow int16 `yaml:"sizeRow"` - SizeCol int16 `yaml:"sizeCol"` - BufferSize int `yaml:"bufferSize"` - MmlHome string `yaml:"mmlHome"` -} - -type TestDatas struct { - UDM struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"udm"` - AUSF struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"ausf"` - AMF struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"amf"` - SMF struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"smf"` - UPF struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` - } `yaml:"upf"` -} - -type NeTestData struct { - CapUsed uint32 `yaml:"capUsed"` - FeatureEnabled []string `yaml:"featureEnabled"` -} -type TestDataMap struct { - NeTestDatas []map[string]NeTestData -} - -var yamlConfig YamlConfig = NewYamlConfig() - -type YamlConfigFile struct { - FilePath string `json:"filePath"` - ConfigLines YamlConfig `json:"configLines"` - OrignalLines []string `json:"orignalLines"` -} - -var YamlConfigInfo YamlConfigFile = YamlConfigFile{ - ConfigLines: NewYamlConfig(), -} - -// set default value for yaml config -func NewYamlConfig() YamlConfig { - return YamlConfig{ - // Database: DbConfig{ - // Type: "mysql", - // ConnParam: "charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True", - // }, - MML: MMLParam{ - SizeRow: 200, - SizeCol: 120, - BufferSize: 65535, - }, - Alarm: AlarmConfig{ - SplitEventAlarm: true, - }, - } -} - -func ReadConfig(configFile string) { - YamlConfigInfo.FilePath = configFile - - yamlFile, err := os.ReadFile(configFile) - if err != nil { - fmt.Println("Read yaml config file error:", err) - os.Exit(2) - } - // fmt.Println("yamlfile:", string(yamlFile)) - - err = yaml.Unmarshal(yamlFile, &YamlConfigInfo.ConfigLines) - if err != nil { - fmt.Println("Unmarshal error:", err) - os.Exit(3) - } - yamlConfig = YamlConfigInfo.ConfigLines - - ReadOriginalConfig(configFile) -} - -func ReadOriginalConfig(configFile string) { - // 读取原始YAML文件 - inputFile, err := os.Open(configFile) - if err != nil { - fmt.Println("failed to open:", err) - os.Exit(3) - } - defer inputFile.Close() - - scanner := bufio.NewScanner(inputFile) - for scanner.Scan() { - YamlConfigInfo.OrignalLines = append(YamlConfigInfo.OrignalLines, scanner.Text()) - } - - if err := scanner.Err(); err != nil { - fmt.Println("failed to scanner:", err) - os.Exit(3) - } -} - -func WriteOrignalConfig(configFile string, paramName string, paramData map[string]any) error { - lines := YamlConfigInfo.OrignalLines - for i, line := range lines { - if strings.Contains(line, paramName) { - for k, v := range paramData { - // find the first line nearby the paramName - for j := i + 1; j < len(lines); j++ { - if strings.Contains(lines[j], k+":") { - index := strings.Index(lines[j], k) - // Determine the type of v - switch v := v.(type) { - case string: - lines[j] = lines[j][:index] + fmt.Sprintf("%s: \"%s\"", k, v) - // case int: - // lines[j] = lines[j][:index] + fmt.Sprintf("%s: %d", k, v) - // case float64: - // lines[j] = lines[j][:index] + fmt.Sprintf("%s: %f", k, v) - case bool: - lines[j] = lines[j][:index] + fmt.Sprintf("%s: %t", k, v) - default: - lines[j] = lines[j][:index] + fmt.Sprintf("%s: %v", k, v) - } - break - } - } - } - break - } - } - - // write back to yaml file - outputFile, err := os.Create(configFile) - if err != nil { - fmt.Println(err) - return err - } - defer outputFile.Close() - - writer := bufio.NewWriter(outputFile) - for _, line := range YamlConfigInfo.OrignalLines { - writer.WriteString(line + "\n") - } - writer.Flush() - return nil -} - -func WriteYamlConfig(newConfigData YamlConfig, configFile string) error { - // 将配置转换回YAML数据 - newYamlData, err := yaml.Marshal(&newConfigData) - if err != nil { - log.Errorf("Failed to marshal YAML: %v", err) - return err - } - - // 将新的YAML数据写入文件 - err = os.WriteFile(configFile, newYamlData, 0644) - if err != nil { - log.Errorf("Failed to write YAML file: %v", err) - return err - } - return nil -} - -var mapYaml map[string]interface{} - -func ReadParamConfig(fileName string) *map[string]interface{} { - file, err := os.ReadFile(fileName) - if err != nil { - fmt.Println("Read yaml file error:", err) - } - - mapYaml = make(map[string]interface{}) - - err = yaml.Unmarshal(file, &mapYaml) - if err != nil { - fmt.Printf("yaml.Unmarshal: %v when to struct", err) - } - // fmt.Println("mapYaml:", mapYaml) - - return &mapYaml -} - -func UpdateStructFromMap(s any, updates map[string]any) { - v := reflect.ValueOf(s).Elem() - t := v.Type() - - for key, value := range updates { - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - if field.Tag.Get("json") == key { - structField := v.FieldByName(field.Name) - if structField.IsValid() && structField.CanSet() { - // Convert value to the appropriate type if necessary - convertedValue := reflect.ValueOf(value).Convert(structField.Type()) - if structField.Type() == convertedValue.Type() { - structField.Set(convertedValue) - } - } - break - } - } - } -} - -func GetYamlConfig() *YamlConfig { - return &YamlConfigInfo.ConfigLines -} - -func GetAuthFromConfig() interface{} { - return yamlConfig.Auth -} - -func GetExpiresFromConfig() uint32 { - return yamlConfig.Auth.Expires -} - -func GetRmUIDFromConfig() string { - return yamlConfig.OMC.RmUID -} - -func GetRmUIDRegexpFromConfig() string { - return yamlConfig.Params.RmUIDRegexp -} - -func GetRmUIDMaxNumFromConfig() int { - return yamlConfig.Params.RmUIDMaxNum -} - -func GetAlarmIDMaxNumFromConfig() int { - return yamlConfig.Params.AlarmIDMaxNum -} - -func GetPmIDMaxNumFromConfig() int { - return yamlConfig.Params.PmIDMaxNum -} - -func GetSubIDMaxNumFromConfig() int { - return yamlConfig.Params.SubIDMaxNum -} - -func GetUriMaxLenFromConfig() int { - return yamlConfig.Params.UriMaxLen -} - -func GetLogLevel() log.LogLevel { - var logLevel log.LogLevel - switch strings.ToLower(yamlConfig.Logger.Level) { - case "trace": - logLevel = log.LOG_TRACE - case "info": - logLevel = log.LOG_INFO - case "debug": - logLevel = log.LOG_DEBUG - case "warn": - logLevel = log.LOG_WARN - case "error": - logLevel = log.LOG_ERROR - case "fatal": - logLevel = log.LOG_FATAL - case "off": - logLevel = log.LOG_OFF - default: - logLevel = log.LOG_DEBUG - } - return logLevel -} - -var ( - DefaultUriPrefix string = "/api/rest" - UriPrefix string = "/omc/rest" - //TestDataUDM []map[string]interface{} - TDatas map[string]NeTestData -) - -func ReadTestConfigYaml(pfile string) (ret error) { - file, err := os.ReadFile(pfile) - if err != nil { - return err - } - - err = yaml.Unmarshal(file, &TDatas) - if err != nil { - fmt.Println("Failed to Unmarshal:", err) - return err - } - - return nil -} - -func GetDefaultUserAgent() string { - return "OMC/" + global.Version -} - -// const defaultConfigFile = "./etc/restconf.yaml" - -// func init() { -// cfile := flag.String("c", defaultConfigFile, "config file") -// pv := flag.Bool("version", false, "print version") -// ph := flag.Bool("help", false, "print help") - -// //global.BuildTime = "Wed May 31 18:24:04 CST 2023" -// //global.GoVer = "go version go1.15.7 linux/arm64" -// flag.Parse() -// if *pv { -// fmt.Printf("OMC restagent version: %s\n%s\n%s\n\n", global.Version, global.BuildTime, global.GoVer) -// os.Exit(0) -// } -// if *ph { -// flag.Usage() -// os.Exit(0) -// } - -// // 使用viper读取配置 -// conf.InitConfig(*cfile) - -// ReadConfig(*cfile) -// if GetYamlConfig().OMC.UriPrefix != "" { -// UriPrefix = GetYamlConfig().OMC.UriPrefix -// } -// if GetYamlConfig().TestConfig.Enabled { -// ReadTestConfigYaml(GetYamlConfig().TestConfig.File) -// } -// } diff --git a/lib/config/map.go b/lib/config/map.go deleted file mode 100644 index 4c012791..00000000 --- a/lib/config/map.go +++ /dev/null @@ -1,111 +0,0 @@ -package config - -import ( - "io/ioutil" - "log" - - "gopkg.in/yaml.v3" - - "be.ems/lib/global" -) - -type Uri2Object struct { - Uri string `yaml:"uri"` - Object []Object `yaml:"object"` -} - -type Object struct { - Name string `yaml:"name"` - Syntax string `yaml:"syntax"` - Oid string `yaml:"oid"` -} - -var uri2Object []Uri2Object - -func ReadMap(pfile string) (ret error) { - file, err := ioutil.ReadFile(pfile) - if err != nil { - log.Println(err) - return err - } - - err = yaml.Unmarshal(file, &uri2Object) - if err != nil { - log.Println(err) - return err - } - /* - for _, v := range uri2Object { - log.Println(v) - } - */ - return nil -} - -func GetOid(uri string, oids *[]string) *[]string { - for _, v := range uri2Object { - if uri == v.Uri { - for _, o := range v.Object { - *oids = append(*oids, o.Oid) - } - } - } - - return oids -} - -func GetOidByFileds(uri string, fields []string, oids *[]string) *[]string { - for _, v := range uri2Object { - if uri == v.Uri { - for _, o := range v.Object { - if global.IsContain(o.Name, fields) || len(fields) == 0 { - *oids = append(*oids, o.Oid) - } - } - } - } - - return oids -} - -type NameOid struct { - Name string - Oid string -} - -type NameValue struct { - Name string - Value string -} - -func GetDataOid(Uri string, nameOids *[]NameOid) *[]NameOid { - var nameOid NameOid - for _, v := range uri2Object { - if Uri == v.Uri { - for _, o := range v.Object { - nameOid.Name = o.Name - nameOid.Oid = o.Oid - *nameOids = append(*nameOids, nameOid) - } - } - } - - return nameOids -} - -func GetDataOidByFields(uri string, fields []string, nameOids *[]NameOid) *[]NameOid { - var nameOid NameOid - for _, v := range uri2Object { - if uri == v.Uri { - for _, o := range v.Object { - nameOid.Name = o.Name - nameOid.Oid = o.Oid - if len(fields) == 0 || global.IsContainP(nameOid.Name, &fields, len(fields)) { - *nameOids = append(*nameOids, nameOid) - } - } - } - } - - return nameOids -} diff --git a/lib/core/ctx/ctx.go b/lib/core/ctx/ctx.go deleted file mode 100644 index 57cda575..00000000 --- a/lib/core/ctx/ctx.go +++ /dev/null @@ -1,185 +0,0 @@ -package ctx - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "os" - "path/filepath" - "strings" - - "be.ems/src/framework/constants" - "be.ems/src/framework/token" - "github.com/gorilla/mux" -) - -// GetParam 地址栏参数{id} -func GetParam(r *http.Request, key string) string { - vars := mux.Vars(r) - v, ok := vars[key] - if ok { - return v - } - return "" -} - -// GetQuery 查询参数 -func GetQuery(r *http.Request, key string) string { - return r.URL.Query().Get(key) -} - -// GetHeader 请求头参数 -func GetHeader(r *http.Request, key string) string { - return r.Header.Get(key) -} - -// QueryMap 查询参数转换Map -func QueryMap(r *http.Request) map[string]any { - queryValues := r.URL.Query() - queryParams := make(map[string]any) - for key, values := range queryValues { - queryParams[key] = values[0] - } - return queryParams -} - -// ShouldBindQuery 查询参数读取json请求结构团体 &xxx -func ShouldBindQuery(r *http.Request, args any) error { - queryParams := QueryMap(r) - body, err := json.Marshal(queryParams) - if err != nil { - return err - } - return json.Unmarshal(body, args) -} - -// ShouldBindJSON 读取json请求结构团体 &xxx -func ShouldBindJSON(r *http.Request, args any) error { - body, err := io.ReadAll(io.LimitReader(r.Body, 1<<20)) // 设置较大的长度,例如 1<<20 (1MB) - if err != nil { - return err - } - err = json.Unmarshal(body, args) - return err -} - -// JSON 相应json数据 -func JSON(w http.ResponseWriter, code int, data any) { - w.Header().Set("Content-Type", "application/json;charset=UTF-8") - - response, err := json.Marshal(data) - if err != nil { - w.WriteHeader(500) - w.Write([]byte(err.Error())) - } else { - w.WriteHeader(code) - w.Write(response) - } -} - -// 将文件导出到外部下载 -func FileAttachment(w http.ResponseWriter, r *http.Request, filepath, filename string) { - w.Header().Set("Content-Disposition", `attachment; filename=`+url.QueryEscape(filename)) - w.Header().Set("Content-Type", "application/octet-stream") - http.ServeFile(w, r, filepath) -} - -// 将文件上传保存到指定目录 -// file, handler, err := r.FormFile("file") -// SaveUploadedFile uploads the form file to specific dst. -func SaveUploadedFile(r *http.Request, dst string) error { - // 解析请求中的文件 - _, handler, err := r.FormFile("file") - if err != nil { - return err - } - - src, err := handler.Open() - if err != nil { - return err - } - defer src.Close() - - if err = os.MkdirAll(filepath.Dir(dst), 0750); err != nil { - return err - } - - out, err := os.Create(dst) - if err != nil { - return err - } - defer out.Close() - - _, err = io.Copy(out, src) - return err -} - -/// ==== 登录用户信息, 通过中间件后预置入 - -// Authorization 解析请求头 -func Authorization(r *http.Request) string { - // Query请求查询 - if authQuery := r.URL.Query().Get(constants.ACCESS_TOKEN); authQuery != "" { - return authQuery - } - // Header请求头 - if authHeader := r.Header.Get(constants.ACCESS_TOKEN); authHeader != "" { - return authHeader - } - - // Query请求查询 - if authQuery := r.URL.Query().Get(constants.ACCESS_TOKEN_QUERY); authQuery != "" { - return authQuery - } - // Header请求头 - authHeader := r.Header.Get(constants.HEADER_KEY) - if authHeader == "" { - return "" - } - // 拆分 Authorization 请求头,提取 JWT 令牌部分 - tokenStr := strings.Replace(authHeader, constants.HEADER_PREFIX, "", 1) - if len(tokenStr) > 64 { - return strings.TrimSpace(tokenStr) // 去除可能存在的空格 - } - return "" -} - -// ContextKey 定义自定义类型作为键 -type ContextKey string - -// LoginUser 登录用户信息需要Authorize中间件 -func LoginUser(r *http.Request) (token.UserInfo, error) { - // 获取请求头标识信息 - tokenStr := Authorization(r) - if tokenStr == "" { - return token.UserInfo{}, fmt.Errorf("not token info") - } - if tokenStr == "" { - return token.UserInfo{}, fmt.Errorf("authorization token is empty") - } - - // 验证令牌 - claims, err := token.UserTokenVerify(tokenStr, "access") - if err != nil { - return token.UserInfo{}, err - } - - // 获取缓存的用户信息 - info := token.UserInfoGet(claims) - if info.UserId <= 0 { - return token.UserInfo{}, fmt.Errorf("invalid login user information") - } - - return info, nil -} - -// LoginUserToUserName 登录用户信息-用户名称 -func LoginUserToUserName(r *http.Request) string { - loginUser, err := LoginUser(r) - if err != nil { - return "" - } - return loginUser.User.UserName -} diff --git a/lib/dborm/dborm.go b/lib/dborm/dborm.go deleted file mode 100644 index cfe12f29..00000000 --- a/lib/dborm/dborm.go +++ /dev/null @@ -1,1561 +0,0 @@ -package dborm - -import ( - "database/sql" - "encoding/json" - "errors" - "fmt" - "strconv" - "time" - - "strings" - - "be.ems/lib/log" - neService "be.ems/src/modules/network_element/service" - - _ "github.com/go-sql-driver/mysql" - "xorm.io/xorm" - "xorm.io/xorm/core" -) - -const ( - TableNameMeasureTask = "measure_task" - TableNameNeInfo = "ne_info" -) - -type Menu struct { - Id int `json:"id"` - Title string `json:"title"` - Icon string `json:"icon"` - Href string `json:"href"` - ParentId int `json:"parent_id"` - Remark int `json:"remark"` -} - -type DatabaseClient struct { - dbType string - dbUrl string - dbConnMaxLifetime time.Duration - dbMaxIdleConns int - dbMaxOpenConns int - IsShowSQL bool - - XEngine *xorm.Engine -} - -var DbClient DatabaseClient - -func InitDbClient(dbType, dbUser, dbPassword, dbHost, dbPort, dbName, dbParam string) error { - DbClient.dbUrl = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s", - dbUser, dbPassword, dbHost, dbPort, dbName, dbParam) - DbClient.dbType = dbType - DbClient.dbConnMaxLifetime = 0 - DbClient.dbMaxIdleConns = 0 - DbClient.dbMaxOpenConns = 0 - if log.GetLevel() == log.LOG_TRACE { - DbClient.IsShowSQL = true - } - log.Debugf("dbType:%s dbUrl:%s:", dbType, DbClient.dbUrl) - - var err error - DbClient.XEngine, err = xorm.NewEngine(DbClient.dbType, DbClient.dbUrl) - if err != nil { - log.Error("Failed to connet database:", err) - return err - } - DbClient.XEngine.SetConnMaxLifetime(DbClient.dbConnMaxLifetime) - DbClient.XEngine.SetMaxIdleConns(DbClient.dbMaxIdleConns) - DbClient.XEngine.SetMaxOpenConns(DbClient.dbMaxOpenConns) - DbClient.XEngine.DatabaseTZ = time.Local // 必须 - DbClient.XEngine.TZLocation = time.Local // 必须 - if DbClient.IsShowSQL { - DbClient.XEngine.ShowSQL(true) - } - - xEngine = DbClient.XEngine - - return nil -} - -// func InitDbClient() error { -// db := config.GetYamlConfig().Database -// DbClient.dbUrl = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", db.User, db.Password, db.Host, db.Port, db.Name) -// DbClient.dbType = db.Type -// DbClient.dbConnMaxLifetime = 0 -// DbClient.dbMaxIdleConns = 0 -// DbClient.dbMaxOpenConns = 0 -// if log.GetLevel() == log.LOG_TRACE { -// DbClient.IsShowSQL = true -// } -// log.Debugf("dbType:%s dbUrl:%s:******@tcp(%s:%s)/%s", DbClient.dbType, db.User, db.Host, db.Port, db.Name) -// var err error -// DbClient.XEngine, err = xorm.NewEngine(DbClient.dbType, DbClient.dbUrl) -// if err != nil { -// log.Error("Failed to connet database:", err) -// return err -// } -// DbClient.XEngine.SetConnMaxLifetime(DbClient.dbConnMaxLifetime) -// DbClient.XEngine.SetMaxIdleConns(DbClient.dbMaxIdleConns) -// DbClient.XEngine.SetMaxOpenConns(DbClient.dbMaxOpenConns) -// if DbClient.IsShowSQL { -// DbClient.XEngine.ShowSQL(true) -// } -// xEngine = DbClient.XEngine - -// return nil -// } - -var xEngine *xorm.Engine - -func XormConnectDatabase(dbType, dbUser, dbPassword, dbHost, dbPort, dbName string) (*xorm.Engine, error) { - sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", - dbUser, dbPassword, dbHost, dbPort, dbName) - log.Debugf("dbType:%s Connect to:%s:******@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", - dbType, dbUser, dbHost, dbPort, dbName) - var err error - xEngine, err = xorm.NewEngine(dbType, sqlStr) //1、Create xorm engine - if err != nil { - log.Error("Failed to connect database:", err) - return nil, err - } - if log.GetLevel() == log.LOG_TRACE { - xEngine.ShowSQL(true) - } - return xEngine, nil -} - -func XCoreDB() *core.DB { - return xEngine.DB() -} - -func XEngDB() *xorm.Engine { - return xEngine -} - -func ConstructInsertSQL(tableName string, insertData interface{}) (string, []string) { - log.Debug("ConstructInsertSQL processing... ") - log.Debug("Request insertData:", insertData) - - var sql []string - var dataTag string - for t, d := range insertData.(map[string]interface{}) { - log.Tracef("t: %v d: %v", t, d) - dataTag = t - - for i, r := range d.([]interface{}) { - var cl, vl string - log.Tracef("i: %v r: %v", i, r) - for c, v := range r.(map[string]interface{}) { - log.Tracef("c: %v v: %v", c, v) - if cl == "" { - cl = fmt.Sprint(c) - } else { - cl = fmt.Sprintf("%s, %s", cl, c) - } - if vl == "" { - vl = fmt.Sprintf("'%v'", v) - } else { - vl = fmt.Sprintf("%s, '%v'", vl, v) - } - - log.Tracef("cl: %s vl: %s", cl, vl) - } - sql = append(sql, "insert into "+tableName+"("+cl+")"+" values("+vl+")") - } - - log.Debug("sql:", sql) - } - - return dataTag, sql -} - -func InsertDataWithJson(insertData interface{}) (int64, error) { - log.Debug("InsertDataWithJson processing... ") - - var data map[string]interface{} - var tableName string - for k, v := range insertData.(map[string]interface{}) { - log.Tracef("k: %v v: %v", k, v) - tableName = k - data = v.(map[string]interface{}) - } - - log.Tracef("data: %v", data) - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Insert(data, tableName) - xSession.Commit() - - return affected, err -} - -type NeInfo struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeId string `json:"neId" xorm:"ne_id"` // neUID/rmUID 网元唯一标识 - RmUID string `json:"rmUid" xorm:"rm_uid"` // neUID/rmUID网元UID - NeName string `json:"neName" xorm:"ne_name"` // NeName/UserLabel 网元名称/网元设备友好名称 - Ip string `json:"ip" xorm:"ip"` - Port string `json:"port" xorm:"port"` - PvFlag string `json:"pvFlag" xorm:"pv_flag"` // 网元虚实性标识 VNF/PNF: 虚拟/物理 - NeAddress string `json:"neAddress" xorm:"ne_address"` // 只对PNF - Province string `json:"province" xorm:"province"` // 网元所在省份 - VendorName string `json:"vendorName" xorm:"vendor_name"` // 厂商名称 - Dn string `json:"dn" xorm:"dn"` // 网络标识 - Status int `json:"status" xorm:"status"` - UpdateTime time.Time `json:"updateTime" xorm:"<-"` -} - -func XormGetNeInfo(neType string, neId string) (*NeInfo, error) { - log.Debug("XormGetNeInfo processing... ") - neInfox := neService.NewNeInfo.FindByNeTypeAndNeID(neType, neId) - - neInfo := new(NeInfo) - neInfo.NeType = neType - neInfo.NeId = neId - neInfo.RmUID = neInfox.RmUID - neInfo.NeName = neInfox.NeName - neInfo.Ip = neInfox.IP - neInfo.Port = fmt.Sprint(neInfox.Port) - neInfo.PvFlag = neInfox.PvFlag - neInfo.NeAddress = neInfox.NeAddress - neInfo.Province = neInfox.Province - neInfo.VendorName = neInfox.VendorName - neInfo.Dn = neInfox.Dn - neInfo.Status = int(neInfox.Status) - neInfo.UpdateTime = time.UnixMilli(neInfox.UpdateTime) - - return neInfo, nil -} - -func XormGetNeInfoByRmUID(neType string, rmUID string) (*NeInfo, error) { - log.Debug("XormGetNeInfoByRmUID processing... ") - - neInfo := new(NeInfo) - has, err := xEngine.Where("ne_type=? and rm_uid=?", strings.ToUpper(neType), rmUID).Get(neInfo) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return nil, err - } else if !has { - log.Infof("Not found ne_info from database, neType=%s, neId=%s", neType, rmUID) - return nil, nil - } - - log.Debug("NE Info:", neInfo) - return neInfo, nil -} - -func XormGetAllNeInfo(nes *[]NeInfo) (*[]NeInfo, error) { - log.Debug("XormGetAllNeInfo processing... ") - - ne := new(NeInfo) - rows, err := xEngine.Table("ne_info").Rows(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return nil, err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return nil, err - } - *nes = append(*nes, *ne) - } - log.Trace("nes:", nes) - return nes, nil -} - -func XormGetNeInfoByNeType(neType string, nes *[]NeInfo) error { - log.Debug("XormGetNeInfoByNeType processing... ") - - ne := new(NeInfo) - rows, err := xEngine.Table("ne_info").Where("ne_type=?", neType).Rows(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return err - } - *nes = append(*nes, *ne) - } - - return nil -} - -func XormGetNeInfo2(neType string, neIDs []string, nes *[]NeInfo) error { - log.Info("XormGetNeInfo2 processing... ") - - ne := new(NeInfo) - var rows *xorm.Rows - var err error - if len(neIDs) == 0 { - rows, err = xEngine.Table("ne_info"). - Where("ne_type=?", neType). - Rows(ne) - } else { - rows, err = xEngine.Table("ne_info"). - In("ne_id", neIDs). - And("ne_type=?", neType). - Rows(ne) - } - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(ne) - if err != nil { - log.Error("Failed to get table ne_info from database:", err) - return err - } - *nes = append(*nes, *ne) - } - - return nil -} - -func XormInsertNeInfo(neInfo *NeInfo) (int64, error) { - log.Debug("XormInsertNeInfo processing... ") - - var affected int64 = 0 - var err error = nil - - xSession := xEngine.NewSession() - defer xSession.Close() - ex, _ := xEngine.Table("ne_info").Where("status = '1' and ne_type = ? and ne_id = ?", neInfo.NeType, neInfo.NeId).Exist() - if ex { - neInfo.Status = 0 - affected, err = xSession.Where("ne_type = ? and ne_id = ?", neInfo.NeType, neInfo.NeId).Update(neInfo) - } else { - affected, err = xSession.InsertOne(neInfo) - } - xSession.Commit() - return affected, err -} - -func XormUpdateNeInfo(neInfo *NeInfo) (int64, error) { - log.Debug("XormUpdateNeInfo processing... ") - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.ID(neInfo.Id).MustCols("status").Update(neInfo) - xSession.Commit() - return affected, err -} - -func XormDeleteNeInfo(neInfo *NeInfo) (int64, error) { - log.Debug("XormDeleteNeInfo processing... ") - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Where("ne_type = ? and ne_id = ?", neInfo.NeType, neInfo.NeId).Delete(neInfo) - xSession.Commit() - return affected, err -} - -func XormParseResult(body []byte) ([]NeInfo, error) { - log.Debug("XormParseResult processing... ") - - data := make(map[string]interface{}) - err := json.Unmarshal(body, &data) - if err != nil { - return nil, err - } - var neInfo []NeInfo - var re interface{} - if data["data"] == nil { - return nil, errors.New("the data is not found") - } - for _, d := range data["data"].([]interface{}) { - if d == nil { - return nil, errors.New("the data is Not found") - } - for _, re = range d.(map[string]interface{}) { - if re == nil { - return nil, errors.New("the data is Not found") - } - for _, rc := range re.([]interface{}) { - if rc == nil { - return nil, errors.New("the data is Not found") - } - var s NeInfo - record := rc.(map[string]interface{}) - s.NeName = fmt.Sprintf("%v", record["ne_name"]) - s.NeId = fmt.Sprintf("%v", record["ne_id"]) - s.NeType = fmt.Sprintf("%v", strings.ToLower(record["ne_type"].(string))) - s.Ip = fmt.Sprintf("%v", record["ip"]) - s.Port = fmt.Sprintf("%v", record["port"]) - s.PvFlag = fmt.Sprintf("%v", record["pv_flag"]) - - neInfo = append(neInfo, s) - } - } - } - - log.Debug("neInfo:", neInfo) - return neInfo, nil -} - -func ConstructUpdateSQLArray(tableName string, updateData interface{}, whereCondition string) (string, []string) { - log.Debug("ConstructUpdateSQL processing... ") - log.Debug("Request updateData:", updateData) - - var sql []string - var tblName string - for t, d := range updateData.(map[string]interface{}) { - log.Tracef("t: %v d: %v", t, d) - tblName = t - - for i, r := range d.([]interface{}) { - var cv string - log.Tracef("i: %v r: %v", i, r) - for c, v := range r.(map[string]interface{}) { - log.Tracef("c: %v v: %v", c, v) - if cv == "" { - cv = fmt.Sprintf("`%s`='%s'", c, v) - } else { - cv = fmt.Sprintf("%s,`%s`='%s'", cv, c, v) - } - - log.Tracef("cv: %s", cv) - } - sql = append(sql, "UPDATE "+tableName+" SET "+cv+" WHERE "+whereCondition) - } - - log.Debug("sql:", sql) - } - - return tblName, sql -} - -func ConstructUpdateSQL(tableName string, updateData interface{}, whereCondition string) (string, []string) { - log.Debug("ConstructUpdateSQL processing... ") - log.Debug("Request updateData:", updateData) - - var sql []string - var tblName string - for t, d := range updateData.(map[string]interface{}) { - log.Tracef("t: %v d: %v", t, d) - tblName = t - - var cv string - for c, v := range d.(map[string]interface{}) { - log.Tracef("c: %v v: %v", c, v) - if cv == "" { - //cv = fmt.Sprintf("`%s`=%s", c, v) - cv = fmt.Sprintf("`%s`='%s'", c, v) - } else { - //cv = fmt.Sprintf("%s,`%s`=%s", cv, c, v) - cv = fmt.Sprintf("%s,`%s`='%s'", cv, c, v) - } - - log.Tracef("cv: %s", cv) - } - sql = append(sql, "UPDATE "+tableName+" SET "+cv+" WHERE "+whereCondition) - - log.Debug("sql:", sql) - } - - return tblName, sql -} - -func ConstructDeleteSQL(tableName string, whereCondition string) string { - log.Debug("ConstructDeleteSQL processing... ") - - var sql string = "DELETE from " + tableName + " WHERE " + whereCondition - log.Debug("sql:", sql) - return sql -} - -type TaskStatus string - -const ( - MeasureTaskStatusInactive = "Inactive" - MeasureTaskStatusActive = "Active" - MeasureTaskStatusSuspend = "Suspend" - MeasureTaskStatusDeleted = "Deleted" -) - -type ScheduleJ struct { - Type string `json:"Type"` - Days []int `json:"Days"` -} - -type Period struct { - Start string `json:"Start"` - End string `json:"End"` -} - -func GetTableByWhere(whereCondition string, tableName string) (*[]interface{}, error) { - log.Debug("GetTableByWhere processing... ") - - rows := new([]interface{}) - has, err := xEngine.Table(tableName).Where(whereCondition).Get(rows) - if err != nil { - log.Errorf("Failed to get table %s from database:%v", tableName, err) - return nil, err - } else if !has { - log.Infof("Not found table %s from database:where=%d", tableName, whereCondition) - return nil, nil - } - - log.Debugf("%s:%v", tableName, rows) - return rows, nil -} - -func GetTableById(id int, tableName string) (*[]interface{}, error) { - log.Debug("GetTableById processing... ") - - rows := new([]interface{}) - has, err := xEngine.Table(tableName).ID(id).Get(rows) - if err != nil { - log.Errorf("Failed to get table %s from database:id=%d, %v", tableName, id, err) - return nil, err - } else if !has { - log.Infof("Not found table %s from database:id=%d", tableName, id) - return nil, nil - } - - log.Debugf("%s:%v", tableName, rows) - return rows, nil -} - -func XormUpdateTableById(id int, tableName string, tbInfo interface{}) (int64, error) { - log.Debug("XormUpdateTableById processing...id: ", id) - - affected, err := xEngine.Table(tableName).ID(id).Update(tbInfo) - if err != nil { - log.Errorf("Failed to update table %s from database:%v", tableName, err) - return 0, err - } - - return affected, nil -} - -func XormUpdateTableByWhere(whereCondition string, tableName string, tbInfo interface{}) (int64, error) { - log.Debug("UpdateTableByWhere processing... ") - - affected, err := xEngine.Table(tableName).Where(whereCondition).Update(tbInfo) - if err != nil { - log.Errorf("Failed to update table %s from database:%v", tableName, err) - return 0, err - } - - return affected, nil -} - -func XormIsExistUser(accid string) (bool, error) { - log.Info("xormIsExistUser processing... ") - - exist, err := xEngine.Table("user"). - Where("account_id=?", accid). - Exist() - if err != nil { - log.Error("Failed to exist user:", err) - - return false, err - } - - return exist, nil -} - -func XormGetConfig(moduleName, configTag string) (map[string]any, error) { - result, err := DbClient.XEngine.QueryInterface("select * from config where module_name=? and config_tag=?", moduleName, configTag) - if err != nil { - log.Error("Failed to get config:", err) - return nil, err - } - if len(result) > 0 { - return result[0], nil - } - return map[string]any{}, nil -} - -func XormGetConfigValue(moduleName, configTag string) (string, error) { - var value string - _, err := xEngine.Table("config"). - Where("module_name=? and config_tag=?", moduleName, configTag). - Cols("value"). - Get(&value) - if err != nil { - log.Error("Failed to get config:", err) - return "", err - } - return value, nil -} - -type Session struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - AccountId string `json:"accountId" xorm:"account_id"` - Name string `json:"name" xorm:"name"` - Host string `json:"host" xorm:"host"` - AccessToken string `json:"accessToken" xorm:"access_token"` - Expires uint32 `json:"expires" xorm:"expires"` - Status string `json:"status" xorm:"status"` - LoginTime string `json:"loginTime" xorm:"-"` - ShakeTime sql.NullTime `son:"shakeTime" xorm:"shake_time"` - LogoutTime sql.NullTime `json:"logoutTime" xorm:"logout_time"` -} - -// XormInsertSession create session -func XormInsertSession(name, host, token string, expires uint32, sessionFlag string) (int64, error) { - log.Info("XormInsertSession processing... ") - - var affected int64 = 0 - var err error = nil - currentTime := time.Now() - timeValue := currentTime.Local() - nullTime := sql.NullTime{Valid: true, Time: timeValue} - value, err := XormGetConfigValue("Security", "sessionExpires") - if err != nil { - return affected, err - } - if value != "" { - intValue, _ := strconv.Atoi(value) - expires = uint32(intValue) - log.Debugf("intValue=%d, expires=%d", intValue, expires) - } - - session := Session{AccountId: name, - Name: name, Host: host, AccessToken: token, - Status: "online", Expires: expires, - ShakeTime: nullTime, - } - - //session.ShakeTime.Time - xSession := xEngine.NewSession() - defer xSession.Close() - if strings.ToLower(sessionFlag) == "multiple" { - exist, err := xEngine.Table("session").Where("status = 'online' and account_id = ? and host = ?", name, host).Exist() - if err != nil { - return affected, err - } - if exist { - affected, _ = xSession.Table("session").Where("account_id = ? and host = ?", name, host).Update(session) - } else { - affected, _ = xSession.InsertOne(session) - } - } else { // single session for a user - exist, err := xEngine.Table("session").Where("status = 'online' and account_id = ?", name).Exist() - if err != nil { - return affected, err - } - if exist { - // todo... - err := errors.New("user is logged in") - return -1, err - } else { - affected, _ = xSession.InsertOne(session) - } - } - xSession.Commit() - return affected, err -} - -// XormUpdateSession update session -func XormLogoutUpdateSession(token string) (Session, error) { - log.Info("XormLogoutUpdateSession processing... ") - - session := Session{Status: "offline", AccessToken: token} - session.LogoutTime.Valid = true - session.LogoutTime.Time = time.Now() - - xSession := xEngine.NewSession() - defer xSession.Close() - _, err := xSession.Table("session").Where("access_token = ?", token).Update(session) - xSession.Commit() - // 查询记录返回 - if err == nil { - session := Session{} - _, err = xSession.Table("session").Where("access_token = ?", token).Get(&session) - return session, err - } - return session, err -} - -// XormUpdateSessionShakeTime create session -func XormUpdateSessionShakeTime(token string) (Session, error) { - log.Debug("XormUpdateSessionShakeTime processing... ") - - session := Session{AccessToken: token} - session.ShakeTime.Valid = true - session.ShakeTime.Time = time.Now() - xSession := xEngine.NewSession() - defer xSession.Close() - _, err := xSession.Table("session").Where("access_token = ?", token).Update(session) - xSession.Commit() - // 查询记录返回 - if err == nil { - session := Session{} - _, err = xSession.Table("session").Where("access_token = ?", token).Get(&session) - return session, err - } - return session, err -} - -func XormExistValidToken(token string, expires uint32) bool { - log.Info("XormExistValidToken processing... ") - - exist, err := xEngine.Table("session"). - Where("status = 'online' and access_token = ? and DATE_ADD(shake_time, INTERVAL expires SECOND) > NOW()", token). - Exist() - if err != nil { - return false - } - - return exist -} - -/* - type NorthboundPm struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - Date string `json:"date" xorm:"date"` - Index int `json:"index"` - StartTime string `json:"startTime" xorm:"start_time"` - TimeZone string `json:"timeZone" xorm:"time_zone"` - NEName string `json:"neName" xorm:"ne_name"` - PmVersion string `json:"pmVersion" xorm:"pm_version"` - Period string `json:"period" xorm:"pevalue" - RmUid string `json:"rmUid" xorm:"rm_uid"` - NEType string `json:"neType" xorm:"ne_type"` - Dn string `json:"neType" xorm:"ne_type"` - ObjectType string `json:"objectType" xorm:"object_type"` - PmName string `json:"pmName" xorm:"pm_name"` - PmExt string `json:"pmExt" xorm:"pm_ext"` - Value int `json:"value" xorm:"value"` - Timestamp string `json:"timestamp" xorm:"timestamp"` - } -*/ -type NorthboundPm struct { - Id int `json:"-" xorm:"pk 'id' autoincr"` - Date string `json:"Date" xorm:"date"` - Index int `json:"Index" xorm:"index"` // 1天中测量时间粒度(如15分钟)的切片索引: 0~95 - Timestamp string `json:"-" xorm:"-"` - NeName string `json:"NeName" xorm:"ne_name"` // UserLabel - RmUID string `json:"RmUID" xorm:"rm_uid"` - NeType string `json:"NeType" xorm:"ne_type"` // 网元类型 - PmVersion string `json:"PmVersion" xorm:"pm_version"` // 性能数据版本号 - Dn string `json:"Dn" xorm:"dn"` // (???)网元标识, 如:RJN-CMZJ-TZ,SubNetwork=5GC88,ManagedElement=SMF53456,SmfFunction=53456 - Period string `json:"Period" xorm:"period"` // 测量时间粒度选项:5/15/30/60 - TimeZone string `json:"TimeZone" xorm:"time_zone"` - StartTime string `json:"StartTime" xorm:"start_time"` - - Datas []struct { - ObjectType string `json:"ObjectType" xorm:"object_type"` // 网络资源类别名称, Pm指标项列表中为空间粒度 如:SmfFunction - PmDatas []struct { - PmName string `json:"KPIID" xorm:"pm_name"` // 指标项, 如: SMF.AttCreatePduSession._Dnn - SubDatas []struct { - SN string `json:"Name" xorm:"sn"` // 单个的写"Total", 或者指标项有多个测量项,如Dnn的名称写对应的Dnn"cmnet"/"ims" - SV int64 `json:"Value" xorm:"sv"` - } `json:"KPIValues" xorm:"sub_datas"` - } `json:"KPIs" xorm:"pm_datas"` - } `json:"Datas" xorm:"datas"` -} - -type Alarm struct { - AlarmSeq int `json:"alarmSeq"` - AlarmId string `json:"alarmId" xorm:"alarm_id"` - NeId string `json:"neId"` - AlarmCode int `json:"alarmCode"` - AlarmTitle string `json:"alarmTitle"` - EventTime string `json:"eventTime"` - AlarmType string `json:"alarmType"` - OrigSeverity string `json:"origSeverity"` - PVFlag string `json:"pvFlag" xorm:"pv_flag"` - NeName string `json:"neName"` - NeType string `json:"neType"` - ObjectUid string `json:"objectUid" xorm:"object_uid"` - ObjectName string `json:"objectName" xorm:"object_name"` - ObjectType string `json:"objectType" xorm:"object_type"` - LocationInfo string `json:"locationInfo"` - Province string `json:"province"` - AlarmStatus int `json:"alarmStatus"` - SpecificProblem string `json:"specificProblem"` - SpecificProblemID string `json:"specificProblemID" xorm:"specific_problem_id"` - AddInfo string `json:"addInfo"` - - // AckState int `json:"ackState" xorm:"-"` - // AckTime string `json:"ackTime" xorm:"-"` - ClearType int `json:"clearType" xorm:"-"` // 0: Unclear, 1: Auto clear, 2: Manual clear - ClearTime string `json:"clearTime" xorm:"-"` -} - -func XormGetAlarmByAlarmId(alarmId string, alarms *[]Alarm) (*[]Alarm, error) { - log.Debug("XormGetAlarmByAlarmId processing... ") - - alarm := new(Alarm) - rows, err := xEngine.Table("alarm").Where("alarm_id=?", alarmId).Rows(alarm) - if err != nil { - log.Error("Failed to get table alarm from database:", err) - return nil, err - } - - defer rows.Close() - for rows.Next() { - err := rows.Scan(alarm) - if err != nil { - log.Error("Failed to get table alarm from database:", err) - return nil, err - } - *alarms = append(*alarms, *alarm) - } - - log.Trace("alarms:", alarms) - return alarms, nil -} - -func XormSQLGetStringValue(querySQL string) (string, error) { - log.Debug("XormSQLGetStringValue processing... ") - - row := make(map[string]interface{}) - _, err := xEngine.SQL(querySQL).Get(&row) - if err != nil { - log.Errorf("Failed to get by SQL=%s:%v", querySQL, err) - return "", err - } - - for _, v := range row { - return fmt.Sprintf("%v", v), nil - } - - return "", nil -} - -func XormGetSingleCol(table, col, where string) (string, error) { - log.Debug("XormGetSingleCol processing... ") - - row := make(map[string]interface{}) - _, err := xEngine.Table(table).Where(where).Cols(col).Get(&row) - if err != nil { - log.Errorf("Failed to get %s from table %s:%v", col, table, err) - return "", err - } - - for _, v := range row { - return fmt.Sprintf("%v", v), nil - } - - return "", nil -} - -func XormGetSingleColStringArrayByIn(table, col, incol string, conditions []string, cols *[]string) error { - log.Debug("XormGetSingleColStringArrayByIn processing... ") - - err := xEngine.Table(table).In(incol, conditions).Cols(col).Distinct().Find(cols) - if err != nil { - log.Errorf("Failed to get %s from table %s:%v", col, table, err) - return err - } - return nil -} - -func XormGetColStringArrayByWhere(table, coln, where string, colv *[]string) error { - log.Debug("XormGetColStringArrayByWhere processing... ") - - _, err := xEngine.Table(table).Where(where).Cols(coln).Get(colv) - if err != nil { - log.Errorf("Failed to Get %s from table %s:%v", coln, table, err) - return err - } - return nil -} - -func XormFindColStringArrayByWhere(table, col, where string, cols *[]string) error { - log.Debug("XormFindColStringArrayByWhere processing... ") - - err := xEngine.Table(table).Where(where).Cols(col).Distinct().Find(cols) - if err != nil { - log.Errorf("Failed to Find %s from table %s:%v", col, table, err) - return err - } - return nil -} - -func XormGetSingleColStringByWhere(table, col, where string) (string, error) { - log.Info("XormFindSingleColStringByWhere processing... ") - - var colv string - _, err := xEngine.Table(table).Where(where).Cols(col).Get(&colv) - if err != nil { - log.Errorf("Failed to Find %s from table %s:%v", col, table, err) - return colv, err - } - return colv, nil -} - -func XormGetSingleColStringArrayByID(table, col string, id int, cols *[]string) error { - log.Debug("XormGetSingleColStringArrayByID processing... ") - - err := xEngine.Table(table).ID(id).Cols(col).Find(cols) - if err != nil { - log.Errorf("Failed to Find %s from table %s:%v", col, table, err) - return err - } - return nil -} - -func XormGetStringValue(table, col string, id int) (string, error) { - log.Debug("XormGetStringValue processing... ") - - row := make(map[string]interface{}) - _, err := xEngine.ID(id).Table(table).Cols(col).Get(&row) - if err != nil { - log.Errorf("Failed to get %s from table %s:%v", col, table, err) - return "", err - } - - for _, v := range row { - return fmt.Sprintf("%v", v), nil - } - - return "", nil -} - -type NeBackup struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeId string `json:"neId" xorm:"ne_id"` - FileName string `json:"neName" xorm:"file_name"` - Path string `json:"path"` - Md5Sum string `json:"md5Sum" xorm:"md5_sum"` - CreateTime string `json:"createTime" xorm:"-" ` -} - -// XormInsertSession create session -func XormInsertTableOne(tableName string, tbInfo interface{}) (int64, error) { - log.Debug("XormInsertTableOne processing... ") - - var affected int64 = 0 - var err error = nil - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err = xSession.Table(tableName).InsertOne(tbInfo) - xSession.Commit() - return affected, err -} - -// XormExistTableOne create session -func XormExistTableOne(tableName string, where string) (bool, error) { - log.Debug("XormExistTableOne processing... ") - - has, err := xEngine.Table(tableName).Where(where).Exist() - - return has, err -} - -func XormGetTableRows(tableName string, where string, tbInfo *[]interface{}) (*[]interface{}, error) { - log.Debug("XormGetTableRows processing... ") - - row := make(map[string]interface{}) - rows, err := xEngine.Table(tableName).Where(where).Rows(row) - if err != nil { - log.Errorf("Failed to Rows table %s from database: %v", tableName, err) - return nil, err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(row) - if err != nil { - log.Errorf("Failed to Scan table %s from database: %v", tableName, err) - return nil, err - } - *tbInfo = append(*tbInfo, row) - } - log.Trace("tbInfo:", tbInfo) - return tbInfo, nil -} - -type MeasureThreshold struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - KpiSet []string `json:"kpiSet" xorm:"kpi_set"` - Threshold int64 `json:"threshold"` - Status string `json:"md5Sum" xorm:"md5_sum"` - OrigSeverity string `json:"createTime" xorm:"orig_severity"` - AlarmId string `json:"alarmId" xorm:"alarm_id"` -} - -type NeSoftware struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - FileName string `json:"fileName" xorm:"name"` - Path string `json:"path" xorm:"path"` - Version string `json:"version" ` - Md5Sum string `json:"md5Sum" xorm:"-"` - Comment string `json:"comment" xorm:"description"` - // Status string `json:"status"` - UpdateTime string `json:"createTime" xorm:"-" ` -} - -type NeVersion struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeId string `json:"neId" xorm:"ne_id"` - Version string `json:"version" ` - FilePath string `json:"filePath" xorm:"path"` - NewVersion string `json:"newVersion" xorm:"new_version"` - NewFile string `json:"newFile" xorm:"new_path"` - PreVersion string `json:"preVersion" xorm:"pre_version"` - PreFile string `json:"preFile" xorm:"pre_path"` - Status string `json:"status" xorm:"status"` - UpdateTime string `json:"createTime" xorm:"-" ` -} - -func XormGetDataBySQL(sql string) (*[]map[string]string, error) { - log.Debug("XormGetDataBySQL processing... ") - - rows := make([]map[string]string, 0) - rows, err := DbClient.XEngine.QueryString(sql) - if err != nil { - log.Error("Failed to QueryString:", err) - return nil, err - } - - return &rows, nil -} - -func XormDeleteDataByWhere(where, table string) (int64, error) { - log.Debug("XormDeleteDataByWhere processing... ") - - xSession := DbClient.XEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Table(table).Where(where).Delete() - if err != nil { - log.Error("Failed to Delete:", err) - return 0, err - } - xSession.Commit() - - return affected, nil -} - -func XormDeleteDataByWhereNoSession(where, table string) (int64, error) { - affected, err := DbClient.XEngine.Table(table).Where(where).Delete() - if err != nil { - log.Error("Failed to Delete:", err) - return 0, err - } - return affected, nil -} - -func XormDeleteDataById(id int, table string) (int64, error) { - log.Debug("XormDeleteDataByWhere processing... ") - - xSession := DbClient.XEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Table(table).ID(id).Delete() - if err != nil { - log.Error("Failed to Delete:", err) - return 0, err - } - xSession.Commit() - - return affected, nil -} - -type ColOutput struct { - Name string `json:"name"` - Display string `json:"display"` - Length int `json:"length"` - Alias []string `json:"Alias"` -} - -type ColInput struct { - Name string `json:"name"` - Alias string `json:"Alias"` - Type string `json:"type"` - Length int `json:"length"` - Value any `json:"value"` -} - -type MmlInput struct { - BodyFmt string `json:"bodyFmt"` - BodyKey string `json:"bodyKey"` - CallFunc string `json:"callFunc"` - Cols []ColInput `json:"cols"` -} - -type MmlOutput struct { - RetFmt string `json:"retFmt"` - RetMsg string `json:"retMsg"` - ErrMsg string `json:"errMsg"` - Title string `json:"title"` - SingleList bool `json:"singleList"` - SepSpaceNum int `json:"sepSpaceNum"` - AlignmentM string `json:"alignmentM"` - AlignmentSN string `json:"alignmentSN"` - AlignmentSV string `json:"alignmentSV"` - Cols []ColOutput `json:"cols"` - End string `json:"end"` -} - -type MmlHttpMap struct { - ID int `json:"-" xorm:"id"` - NeType string `json:"neType" xorm:"ne_type"` - Operation string `json:"operation"` - Object string `json:"object"` - Method string `json:"method"` - URI string `json:"uri" xorm:"uri"` - ExtUri string `json:"extUri"` - ParamTag string `json:"paramTag"` - Params string `json:"params"` - Input string `json:"input"` - Output string `json:"output"` -} - -func XormGetMmlHttpMap(table, where string) (*MmlHttpMap, error) { - mmlMap := new(MmlHttpMap) - _, err := DbClient.XEngine.Table(table).Where(where).Get(mmlMap) - if err != nil { - log.Error("Failed to Get:", err) - return nil, err - } - return mmlMap, nil -} - -type MmlCommand struct { - ID int `json:"-" xorm:"id"` - NeType string `json:"neType" xorm:"ne_type"` - Category string `json:"category"` - CatDisplay string `json:"catDisplay"` - Operation string `json:"operation"` - Object string `json:"object" xorm:"object"` - MmlDisplay string `json:"mmlDisplay"` - ParamJson []struct { - Name string `json:"name"` - Alias string `json:"alias"` - Type string `json:"type"` - Optional string `json:"optional"` - Apostr string `json:"apostr"` - Loc string `json:"loc"` - Filter string `json:"filter"` - Display string `json:"display"` - Comment string `json:"comment"` - } `json:"paramJson"` -} - -func XormGetMmlCommand(table, where string) (*MmlCommand, error) { - mmlCmd := new(MmlCommand) - _, err := DbClient.XEngine.Table(table).Where(where).Get(mmlCmd) - if err != nil { - log.Error("Failed to Get:", err) - return nil, err - } - return mmlCmd, nil -} - -type AlarmOMCConfig struct { - ID int `json:"-" xorm:"id"` - ModuleName string `json:"moduleName"` - ConfigTag string `json:"configTag"` - Value string `json:"value"` - ValueJson string `json:"valueJson"` -} - -type ValueJson struct { - AlarmStatus string `json:"alarm_status"` - AlarmType string `json:"alarm_type"` - OrigSeverity string `json:"orig_severity"` - AckUser string `json:"ack_user"` -} - -type AlarmForwardToUsers struct { - Interface string `json:"interface"` - ToUser []string `json:"to_user"` -} - -func XormGetAAConfig() (*ValueJson, error) { - aaConfig := new(AlarmOMCConfig) - _, err := DbClient.XEngine.Table("config"). - Where("module_name=? and config_tag=?", "Alarm", "autoAlarmAck"). - Cols("value", "value_json"). - Get(aaConfig) - if err != nil { - log.Error("Failed to Get:", err) - return nil, err - } - log.Debug("aaConfig:", aaConfig) - valueJson := new(ValueJson) - err = json.Unmarshal([]byte(aaConfig.ValueJson), valueJson) - if err != nil { - log.Error("Failed to Unmarshal:", err) - return nil, err - } - log.Debug("valueJson:", valueJson) - return valueJson, nil -} - -func XormGetAlarmForward(interfaceName string) (*[]string, error) { - alarmForwardConfig := new(AlarmOMCConfig) - _, err := DbClient.XEngine.Table("config"). - Where("module_name=? and config_tag=?", "Alarm", "forwardAlarm"). - Cols("value", "value_json"). - Get(alarmForwardConfig) - if err != nil { - log.Error("Failed to Get:", err) - return nil, err - } - log.Debug("alarmForwardConfig:", alarmForwardConfig) - alarmForwardToUsers := new([]AlarmForwardToUsers) - err = json.Unmarshal([]byte(alarmForwardConfig.ValueJson), alarmForwardToUsers) - if err != nil { - log.Error("Failed to Unmarshal:", err) - return nil, err - } - log.Debug("alarmForwardToUsers:", alarmForwardToUsers) - for _, a := range *alarmForwardToUsers { - if a.Interface == interfaceName { - return &(a.ToUser), nil - } - } - return nil, nil -} - -type AlarmForwardLog struct { - ID int `json:"-" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeID string `json:"neID" xorm:"ne_id"` - AlarmID string `json:"alarmID" xorm:"alarm_id"` - AlarmTitle string `json:"alarmTitle" xorm:"alarm_title"` - AlarmSeq int `json:"alarmSeq" xorm:"alarm_seq"` - EventTime string `json:"eventTime" xorm:"event_time"` - Interface string `json:"interface" xorm:"interface"` - ToUser string `json:"toUser" xorm:"to_user"` - OperResult string `json:"operResult" xorm:"oper_result"` - LogTime string `json:"logTime" xorm:"<-"` -} - -func XormInsertAlarmForwardLog(logData *AlarmForwardLog) (int64, error) { - log.Debug("XormInsertAlarmForwardLog processing... ") - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Insert(logData) - xSession.Commit() - - return affected, err -} - -type SystemLog struct { - ID int `json:"-" xorm:"pk 'id' autoincr"` - UserName string `json:"user_name" xorm:"user_name"` - ProcessName string `json:"process_name" xorm:"process_name"` - ProcessID int32 `json:"process_id" xorm:"process_id"` - Operation string `json:"operation" xorm:"operation"` - StartTime string `json:"start_time" ` - LogTime string `json:"-" xorm:"-"` -} - -func XormInsertSystemLog(logData *SystemLog) (int64, error) { - log.Info("XormInsertSystemLog processing... ") - - xSession := xEngine.NewSession() - defer xSession.Close() - affected, err := xSession.Insert(logData) - xSession.Commit() - - return affected, err -} - -type Permission struct { - ID int `json:"-" xorm:"pk 'id' autoincr"` - PermissionName string `json:"permissionName"` - Method string `json:"method"` - Element string `json:"element"` - Object string `json:"object"` -} - -func IsPermissionAllowed(token, method, module, dbname, tbname, pack string) (bool, error) { - log.Info("IsPermissionAllowed processing... ") - - exist, err := xEngine.Table("permission"). - Join("INNER", "role_permission", "permission.permission_name = role_permission.p_name"). - Join("INNER", "user_role", "role_permission.r_name = user_role.r_name"). - Join("INNER", "session", "user_role.u_name = session.account_id and session.access_token=?", token). - Where("method in ('*',?) and module in ('*',?) and management in ('*',?) and element in ('*',?) and object in ('*',?)", method, pack, module, dbname, tbname). - Exist() - if err != nil { - return false, err - } - - return exist, nil -} - -type NeLicense struct { - NeType string `json:"neType" xorm:"ne_type"` - NeID string `json:"neID" xorm:"ne_id"` - SerialNo string `json:"serialNo" xorm:"serial_num"` - Capcity int `json:"capcity" xorm:"-"` - Used int `json:"used" xorm:"-"` - FeatureEnabled string `json:"featureEnabled" xorm:"-"` - ExpirationDate string `json:"expirationDate" xorm:"expiry_date"` - Status string `json:"status" xorm:"status"` - Path string `json:"path" xorm:"license_path"` - FileName string `json:"file_name" xorm:"-"` - Comment string `json:"comment" xorm:"remark"` - CreatedAt string `json:"createdAt" xorm:"-"` - UpdatedAt string `json:"updatedAt" xorm:"-"` - DeletedAt string `json:"deletedAt" xorm:"-"` -} - -func XormAdjustmentNeLicense(neType, neID string, value int) (int64, error) { - return 1, nil - //neLicense := NeLicense{NeType: neType, NeID: neID, Capability: value} - // session.LogoutTime.Valid = true - // session.LogoutTime.Time = time.Now() - // res, err := xEngine.Exec("update ne_license set capcity=capcity+? where IFNULL(ne_type, '')=? and IFNULL(ne_id, '')=?", value, neType, neID) - // defer xSession.Close() - - //affected, err := xSession.Table("ne_license").Where("ne_type=? and ne_id=?", neType, neID).Update(&neLicense) - - // //affected, err := xSession.Table("ne_license").SQL("ne_tye=? and ne_id=?", neType, neID).Update(session) - // err := xSession.SQL("update ne_license set capability=capability+? where ne_type=? and ne_id=?", value, neType, neID) - //xSession.Commit() - // affected, err := res.RowsAffected() - // return affected, err -} - -func XormUpdateNeLicense(neType, neID string, capcity int) (int64, error) { - return 1, nil - // var err error - // var res sql.Result - // if neType != "" && neID != "" { - // res, err = xEngine.Exec("update ne_license set capcity=? where ne_type=? and ne_id=?", capcity, neType, neID) - // } else if neType != "" && neID == "" { - // res, err = xEngine.Exec("update ne_license set capcity=? where ne_type=?", capcity, neType) - // } else if neType == "" && neID != "" { - // res, err = xEngine.Exec("update ne_license set capcity=? where ne_id=?", capcity, neID) - // } else { - // res, err = xEngine.Exec("update ne_license set capcity=?", capcity) - // } - - // affected, err := res.RowsAffected() - // return affected, err -} - -type NorthboundCm struct { - ID int `json:"-" xorm:"pk '-' autoincr"` - Timestamp string `json:"timestamp" xorm:"timestamp"` - TimeZone string `json:"timeZone" xorm:"time_zone"` - VendorName string `json:"vendorName" xorm:"vendor_name"` - NeType string `json:"neType" xorm:"ne_type"` - CmVersion string `json:"cmVersion" xorm:"cm_version"` - RmUID string `json:"rmUID" xorm:"rm_uid"` - NeID string `json:"neID" xorm:"ne_id"` - UserLabel string `json:"userLabel" xorm:"user_label"` - ObjectType string `json:"objectType" xorm:"object_type"` - PvFlag string `json:"pvFlag" xorm:"pv_flag"` - VMID string `json:"vmID" xorm:"vm_id"` - VnfInstanceID string `json:"vnf_instance_id"` - ValueJSON string `json:"valueJson" xorm:"value_json"` - Status string `json:"status" xorm:"status"` -} - -func XormGetNorthboundCm(neType string, cmResults *[]NorthboundCm) error { - log.Info("XormGetNorthboundCm processing... ") - - cmResult := new(NorthboundCm) - rows, err := xEngine.Table("nbi_cm"). - Distinct("object_type"). - Where("`ne_type` = ?", neType). - Desc("timestamp"). - Cols("*"). - Rows(cmResult) - if err != nil { - log.Error("Failed to get table nbi_cm:", err) - return err - } - defer rows.Close() - for rows.Next() { - err := rows.Scan(cmResult) - if err != nil { - log.Error("Failed to get table nbi_cm:", err) - return err - } - *cmResults = append(*cmResults, *cmResult) - } - return nil -} - -func XormGetNorthboundCmLatestObject(neType, neID, objectType string) (*NorthboundCm, error) { - log.Info("XormGetNorthboundCmLatestObject processing... ") - - cmResult := new(NorthboundCm) - _, err := xEngine.Table("nbi_cm"). - Where("`ne_type`=? and `ne_id`=? and `object_type`=?", neType, neID, objectType). - Desc("timestamp"). - Cols("*"). - Limit(1). - Get(cmResult) - if err != nil { - log.Error("Failed to get table nbi_cm:", err) - return nil, err - } - - return cmResult, nil -} - -type TraceData struct { - ID int `json:"-" xorm:"pk 'id' autoincr"` - TaskID int `json:"taskID" xorm:"task_id"` - Imsi string `json:"imsi" xorm:"imsi"` - Msisdn string `json:"msisdn" xorm:"msisdn"` - SrcAddr string `json:"srcAddr" xorm:"src_addr"` - DstAddr string `json:"dstAddr" xorm:"dst_addr"` - IfType int `json:"ifType" xorm:"if_type"` - MsgType int `json:"msgType" xorm:"msg_type"` - MsgDirect int `json:"msgDirect" xorm:"msg_direct"` - Length int `json:"length" xorm:"length"` - Timestamp int64 `json:"timestamp" xorm:"timestamp"` - RawMsg []byte `json:"rawMsg" xorm:"raw_msg"` - DecMsg string `json:"decMsg" xorm:"dec_msg"` -} - -func XormGetTraceData(id int) (*TraceData, error) { - result := new(TraceData) - _, err := xEngine.Table("trace_data"). - Where("id=?", id). - Get(result) - if err != nil { - log.Error("Failed to get table trace_data:", err) - return nil, err - } - - return result, nil -} - -func XormUpdateTraceData(id int, data *TraceData) (int64, error) { - affected, err := xEngine.Table("trace_data"). - Where("id=?", id). - Update(data) - if err != nil { - log.Error("Failed to update table trace_data:", err) - return 0, err - } - - return affected, nil -} - -func XormInsertTraceData(data *TraceData) (int64, error) { - affected, err := xEngine.Table("trace_data"). - InsertOne(data) - if err != nil { - log.Error("Failed to insert table trace_data:", err) - return 0, err - } - - return affected, nil -} - -func XormDeleteTraceData(id int) (int64, error) { - affected, err := xEngine.Table("trace_data"). - Where("id=?", id). - Delete() - if err != nil { - log.Error("Failed to delete table trace_data:", err) - return 0, err - } - - return affected, nil -} - -func XormGetTraceRawMsg(id int) (int64, []byte, error) { - var rawMsg []byte - var timestamp int64 - _, err := xEngine.Table("trace_data"). - Where("id=?", id). - Cols("timestamp", "raw_msg"). - Get(×tamp, &rawMsg) - if err != nil { - log.Error("Failed to get table trace_data:", err) - return timestamp, rawMsg, err - } - - return timestamp, rawMsg, nil -} - -func XormGetNEStateInfo(neType, neID string) (string, string, error) { - SN := "-" - Version := "-" - _, err := xEngine.Table("ne_state"). - Where("ne_type=? and ne_id=?", neType, neID). - Desc("timestamp"). - Cols("serial_num", "version"). - Limit(1). - Get(&SN, &Version) - return SN, Version, err -} - -type NeState struct { - Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType" xorm:"ne_type"` - NeId string `json:"neId" xorm:"ne_id"` - Version string `json:"version" xorm:"column 'version' VARCHAR(16)"` - Capability uint32 `json:"capability" xorm:"capability"` - SerialNum string `json:"serialNum" xorm:"serial_num"` - ExpiryDate string `json:"expiryDate" xorm:"expiry_date"` - CpuUsage string `json:"cpuUsage" xorm:"cpu_usage"` - MemUsage string `json:"memUsage" xorm:"mem_usage"` - DiskSpace string `json:"diskSpace" xorm:"disk_space"` - Timestamp string `json:"timestamp" xorm:"-" ` -} - -func XormInsertNeState(neState *NeState) (int64, error) { - log.Debug("XormInsertNeState processing... ") - - var affected int64 = 0 - - session := xEngine.NewSession() - defer session.Close() - affected, err := session.InsertOne(neState) - if err != nil { - return 0, err - } - err = session.Commit() - if err != nil { - return 0, err - } - return affected, err -} - -type AlarmDefine struct { - AlarmId string `json:"alarmId" xorm:"alarm_id"` - AlarmCode int `json:"alarmCode" xorm:"alarm_code"` - AlarmTitle string `json:"alarmTitle" xorm:"alarm_title"` - NeType string `json:"neType" xorm:"ne_type"` - AlarmType string `json:"alarmType" xorm:"alarm_type"` - OrigSeverity string `json:"origSeverity" xorm:"orig_severity"` - ObjectUid string `json:"objectUid" xorm:"object_uid"` - ObjectName string `json:"objectName" xorm:"object_name"` - ObjectType string `json:"objectType" xorm:"object_type"` - LocationInfo string `json:"locationInfo"` - SpecificProblem string `json:"specificProblem"` - SpecificProblemId string `json:"specificProblemId" xorm:"specific_problem_id"` - AddInfo string `json:"addInfo" xorm:"add_info"` - Threshold int64 `json:"threshold" xorm:"threshold"` - Status string `json:"status" xorm:"status"` -} - -func XormGetAlarmDefine(alarmCode string) (*AlarmDefine, error) { - log.Debug("XormGetAlarmDefine processing... ") - - alarmDefine := new(AlarmDefine) - _, err := xEngine. - Where("alarm_code=? and status='Active'", alarmCode). - Get(alarmDefine) - if err != nil { - log.Error("Failed to get table alarm_define from database:", err) - return nil, err - } - - return alarmDefine, nil -} diff --git a/lib/eval/evaluate.go b/lib/eval/evaluate.go deleted file mode 100644 index 664d7176..00000000 --- a/lib/eval/evaluate.go +++ /dev/null @@ -1,119 +0,0 @@ -package evaluate - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "math" - "regexp" - "strconv" - "strings" -) - -// Parse and caculate expression -func CalcExpr(expr string, paramValues map[string]any) (float64, error) { - // match parameter with '' - re := regexp.MustCompile(`'([^']+)'`) - matches := re.FindAllStringSubmatch(expr, -1) - - // replace to value - for _, match := range matches { - paramName := match[1] - value, exists := paramValues[paramName] - if !exists { - return 0, fmt.Errorf("parameter '%s' not found", paramName) - } - - expr = strings.Replace(expr, match[0], fmt.Sprintf("%v", value), 1) - } - - // expression to evaluate - result, err := evalExpr(expr) - if math.IsNaN(result) { - return 0.0, err - } - return result, err -} - -// eval 解析和计算表达式 -func evalExpr(expr string) (float64, error) { - //fset := token.NewFileSet() - node, err := parser.ParseExpr(expr) - if err != nil { - return 0, err - } - return evalNode(node) -} - -// EvaluateExpr 解析并计算给定的表达式 -func EvalExpr(expr string, values map[string]any) (float64, error) { - // 解析表达式 - node, err := parser.ParseExpr(expr) - if err != nil { - return 0, err - } - - // 遍历 AST 并替换变量 - ast.Inspect(node, func(n ast.Node) bool { - if ident, ok := n.(*ast.Ident); ok { - if val, ok := values[ident.Name]; ok { - // 替换标识符为对应值 - ident.Name = fmt.Sprintf("%v", val) - } - } - return true - }) - - // 计算表达式 - return evalNode(node) -} - -// eval 递归计算 AST 节点 -func evalNode(node ast.Node) (float64, error) { - var result float64 - - switch n := node.(type) { - case *ast.BinaryExpr: - left, err := evalNode(n.X) - if err != nil { - return 0, err - } - right, err := evalNode(n.Y) - if err != nil { - return 0, err - } - switch n.Op { - case token.ADD: - result = left + right - case token.SUB: - result = left - right - case token.MUL: - result = left * right - case token.QUO: - if right == 0 { - return math.NaN(), fmt.Errorf("divisor cannot be zero") - } - - result = left / right - } - case *ast.BasicLit: - var err error - result, err = strconv.ParseFloat(n.Value, 64) - if err != nil { - return 0, err - } - case *ast.Ident: - val, err := strconv.ParseFloat(n.Name, 64) - if err != nil { - return 0, fmt.Errorf("unsupported expression: %s", n.Name) - } - result = val - case *ast.ParenExpr: - return evalNode(n.X) // 递归评估括号中的表达式 - default: - return 0, fmt.Errorf("unsupported expression: %T", n) - } - - return result, nil -} diff --git a/lib/file/file.go b/lib/file/file.go deleted file mode 100644 index 7bc2a57e..00000000 --- a/lib/file/file.go +++ /dev/null @@ -1,27 +0,0 @@ -package file - -import ( - "os" - "path/filepath" -) - -func GetFileAndDirCount(dir string) (int, int, error) { - var fileCount, dirCount int - - err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if path == dir { - return nil // 跳过当前目录 - } - if info.IsDir() { - dirCount++ - } else { - fileCount++ - } - return nil - }) - - return fileCount, dirCount, err -} diff --git a/lib/file/file_linux.go b/lib/file/file_linux.go deleted file mode 100644 index e8936bb9..00000000 --- a/lib/file/file_linux.go +++ /dev/null @@ -1,78 +0,0 @@ -//go:build linux -// +build linux - -package file - -import ( - "fmt" - "os" - "os/user" - "path/filepath" - "syscall" -) - -type FileInfo struct { - FileType string `json:"fileType"` // file type: file/directory - FileMode string `json:"fileMode"` // file mode - LinkCount int64 `json:"linkCount"` // link count - Owner string `json:"owner"` // owner - Group string `json:"group"` // group - Size int64 `json:"size"` // size: xx byte - ModifiedTime int64 `json:"modifiedTime"` // last modified time:seconds - FilePath string `json:"filePath"` // file path - FileName string `json:"fileName"` // file name -} - -func GetFileInfo(dir, suffix string) ([]FileInfo, error) { - var files []FileInfo - - err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if path == dir { - return nil // 跳过当前目录 - } - - fileType := "file" - if info.IsDir() { - fileType = "directory" - } else if info.Mode()&os.ModeSymlink != 0 { - fileType = "symlink" - } - - // check if match suffix - if (suffix != "" && filepath.Ext(path) == suffix) || suffix == "" { - stat, ok := info.Sys().(*syscall.Stat_t) - if !ok { - return fmt.Errorf("not a syscall.Stat_t") - } - userInfo, err := user.LookupId(fmt.Sprint(stat.Uid)) - if err != nil { - return err - } - groupInfo, err := user.LookupGroupId(fmt.Sprint(stat.Gid)) - if err != nil { - return err - } - fileInfo := FileInfo{ - FileType: fileType, - FileMode: info.Mode().String(), - LinkCount: int64(info.Sys().(*syscall.Stat_t).Nlink), - Owner: userInfo.Username, - Group: groupInfo.Name, - Size: info.Size(), - ModifiedTime: info.ModTime().Unix(), - FilePath: dir, - FileName: info.Name(), - } - files = append(files, fileInfo) - } - return nil - }) - if err != nil { - return nil, err - } - return files, nil -} diff --git a/lib/file/file_windows.go b/lib/file/file_windows.go deleted file mode 100644 index 7c97f111..00000000 --- a/lib/file/file_windows.go +++ /dev/null @@ -1,63 +0,0 @@ -//go:build windows -// +build windows - -package file - -import ( - "os" - "path/filepath" -) - -type FileInfo struct { - FileType string `json:"fileType"` // file type: file/directory - FileMode string `json:"fileMode"` // file mode - LinkCount int64 `json:"linkCount"` // link count - Owner string `json:"owner"` // owner - Group string `json:"group"` // group - Size int64 `json:"size"` // size: xx byte - ModifiedTime int64 `json:"modifiedTime"` // last modified time:seconds - FilePath string `json:"filePath"` // file path - FileName string `json:"fileName"` // file name -} - -func GetFileInfo(dir, suffix string) ([]FileInfo, error) { - var files []FileInfo - - err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if path == dir { - return nil // 跳过当前目录 - } - - fileType := "file" - if info.IsDir() { - fileType = "directory" - } else if info.Mode()&os.ModeSymlink != 0 { - fileType = "symlink" - } - - // check if match suffix - if (suffix != "" && filepath.Ext(path) == suffix) || suffix == "" { - fileInfo := FileInfo{ - FileType: fileType, - FileMode: info.Mode().String(), - LinkCount: 0, - Owner: "-", - Group: "-", - Size: info.Size(), - ModifiedTime: info.ModTime().Unix(), - FilePath: dir, - FileName: info.Name(), - } - files = append(files, fileInfo) - } - return nil - }) - if err != nil { - return nil, err - } - return files, nil -} diff --git a/lib/global/exec_linux.go b/lib/global/exec_linux.go deleted file mode 100644 index e4aa8584..00000000 --- a/lib/global/exec_linux.go +++ /dev/null @@ -1,47 +0,0 @@ -//go:build linux -// +build linux - -package global - -import ( - "bytes" - "os/exec" -) - -func ExecCmd(command string) ([]byte, error) { - cmd := exec.Command("/bin/bash", "-c", command) - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - - return out, nil -} - -func ExecShell(command string) error { - in := bytes.NewBuffer(nil) - cmd := exec.Command("sh") - cmd.Stdin = in - in.WriteString(command) - in.WriteString("exit\n") - if err := cmd.Start(); err != nil { - return err - } - return nil -} - -func ExecOsCmd(command, os string) ([]byte, error) { - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - return out, nil -} diff --git a/lib/global/exec_windows.go b/lib/global/exec_windows.go deleted file mode 100644 index 285005c2..00000000 --- a/lib/global/exec_windows.go +++ /dev/null @@ -1,34 +0,0 @@ -//go:build windows -// +build windows - -package global - -import ( - "os/exec" -) - -func ExecCmd(command string) ([]byte, error) { - cmd := exec.Command("cmd", "/C", command) - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - - return out, nil -} - -func ExecOsCmd(command, os string) ([]byte, error) { - var cmd *exec.Cmd - switch os { - case "Linux": - cmd = exec.Command(command) - case "Windows": - cmd = exec.Command("cmd", "/C", command) - } - - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - return out, nil -} diff --git a/lib/global/global.go b/lib/global/global.go deleted file mode 100644 index 228fdf20..00000000 --- a/lib/global/global.go +++ /dev/null @@ -1,65 +0,0 @@ -package global - -import "errors" - -// 跨package引用的首字母大写 -const ( - RequestBodyMaxLen = 2000000 - ApiVersionV1 = "v1" - ApiVersionV2 = "v2" - LineBreak = "\n" -) - -const ( - DateTime = "2006-01-02 15:04:05" - DateData = "20060102150405" - DateHour = "2006010215" - DateZone = "2006-01-02 15:04:05 +0000 UTC" -) - -const ( - MaxInt32Number = 2147483647 -) - -const ( - MaxLimitData = 1000 -) - -var ( - Version string = "-" - BuildTime string = "-" - GoVer string = "-" -) - -var ( - DefaultUriPrefix = "/api/rest" -) -var ( - ErrParamsNotAdapted = errors.New("the number of params is not adapted") - - // PM module error message - ErrPMNotFoundData = errors.New("not found PM data") - - // CM module error message - ErrCMNotFoundTargetNE = errors.New("not found target NE") - ErrCMCannotDeleteActiveNE = errors.New("can not delete an active NE") - ErrCMInvalidBackupFile = errors.New("invalid backup file") - ErrCMNotMatchMD5File = errors.New("md5 not match between file and url") - ErrCMNotMatchSignFile = errors.New("digests signatures not match in the file") - ErrCMExistSoftwareFile = errors.New("exist the same software package file") - ErrCMNotFoundTargetSoftware = errors.New("not found the target software package") - ErrCMNotFoundTargetNeVersion = errors.New("not found the target NE version") - ErrCMNotFoundRollbackNeVersion = errors.New("not found the rollback NE version") - ErrCMUnknownServiceAction = errors.New("unknown service action") - ErrCMUnknownInstanceAction = errors.New("unknown instance action") - - ErrCMNotFoundTargetBackupFile = errors.New("not found the target NE backup") - ErrCMUnknownSoftwareFormat = errors.New("unknown software package format") // 未知软件包格式 - - // TRACE module error message - ErrTraceFailedDistributeToNEs = errors.New("failed to distribute trace task to target NEs") - ErrTraceNotCarriedTaskID = errors.New("not carried task id in request url") - - // MML module error define - ErrMmlInvalidCommandFormat = errors.New("invalid mml command format") -) diff --git a/lib/global/kits.go b/lib/global/kits.go deleted file mode 100644 index 22091f08..00000000 --- a/lib/global/kits.go +++ /dev/null @@ -1,728 +0,0 @@ -package global - -import ( - "archive/zip" - "bytes" - "crypto/md5" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "net" - "net/http" - "os" - "path/filepath" - "reflect" - "regexp" - "sort" - "strings" - "time" -) - -const ( - IsIPv4 = "IPv4" - IsIPv6 = "IPv6" - NonIP = "NonIp" -) - -type em struct{} - -func GetPkgName() string { - return reflect.TypeOf(em{}).PkgPath() -} - -// interface{} change to map[string]interface{} -// interface{} data is []interface{} -func ListToMap(list interface{}, key string) map[string]interface{} { - res := make(map[string]interface{}) - arr := ToSlice(list) - for _, row := range arr { - immutable := reflect.ValueOf(row) - val := immutable.FieldByName(key).String() - res[val] = row - } - return res -} - -// interface{} change to []interface{} -func ToSlice(arr interface{}) []interface{} { - ret := make([]interface{}, 0) - v := reflect.ValueOf(arr) - if v.Kind() != reflect.Slice { - ret = append(ret, arr) - return ret - } - l := v.Len() - for i := 0; i < l; i++ { - ret = append(ret, v.Index(i).Interface()) - } - return ret -} - -var TodoList []Todo - -type Todo struct { - Id int64 - Item string -} - -// JSON序列化方式 -func jsonStructToMap(TodoList Todo) (map[string]interface{}, error) { - // 结构体转json - strRet, err := json.Marshal(TodoList) - if err != nil { - return nil, err - } - // json转map - var mRet map[string]interface{} - err1 := json.Unmarshal(strRet, &mRet) - if err1 != nil { - return nil, err1 - } - return mRet, nil -} - -func IsContain(item string, items []string) bool { - for _, e := range items { - if e == item { - return true - } - } - return false -} - -func IsContainP(item string, items *[]string, size int) bool { - for i := 0; i < size; i++ { - if (*items)[i] == item { - return true - } - } - return false -} - -// 将字符串 分割成 字符串数组 -// @s:分割符 -func SplitString(str string, s string) []string { - sa := strings.Split(str, s) - return sa -} - -// 合并字符串数组 -func MergeStringArr(a, b []string) []string { - var arr []string - for _, i := range a { - arr = append(arr, i) - } - for _, j := range b { - arr = append(arr, j) - } - return arr -} - -// 数组去重 -func UniqueStringArr(m []string) []string { - d := make([]string, 0) - tempMap := make(map[string]bool, len(m)) - for _, v := range m { // 以值作为键名 - if tempMap[v] == false { - tempMap[v] = true - d = append(d, v) - } - } - return d -} - -// 合并整型数组 -func MergeArr(a, b []int) []int { - var arr []int - for _, i := range a { - arr = append(arr, i) - } - for _, j := range b { - arr = append(arr, j) - } - return arr -} - -// 数组去重 -func UniqueArr(m []int) []int { - d := make([]int, 0) - tempMap := make(map[int]bool, len(m)) - for _, v := range m { // 以值作为键名 - if tempMap[v] == false { - tempMap[v] = true - d = append(d, v) - } - } - return d -} - -// 升序 -func AscArr(e []int) []int { - sort.Ints(e[:]) - return e -} - -// 降序 -func DescArr(e []int) []int { - sort.Sort(sort.Reverse(sort.IntSlice(e))) - return e -} - -func MatchRmUID(p string, s string) bool { - match, _ := regexp.MatchString(p, s) - return match -} - -type OrderedMap struct { - Order []string - Map map[string]interface{} -} - -func (om *OrderedMap) UnmarshalJson(b []byte) error { - json.Unmarshal(b, &om.Map) - - index := make(map[string]int) - for key := range om.Map { - om.Order = append(om.Order, key) - esc, _ := json.Marshal(key) //Escape the key - index[key] = bytes.Index(b, esc) - } - - sort.Slice(om.Order, func(i, j int) bool { return index[om.Order[i]] < index[om.Order[j]] }) - return nil -} - -func (om OrderedMap) MarshalJson() ([]byte, error) { - var b []byte - buf := bytes.NewBuffer(b) - buf.WriteRune('{') - l := len(om.Order) - for i, key := range om.Order { - km, err := json.Marshal(key) - if err != nil { - return nil, err - } - buf.Write(km) - buf.WriteRune(':') - vm, err := json.Marshal(om.Map[key]) - if err != nil { - return nil, err - } - buf.Write(vm) - if i != l-1 { - buf.WriteRune(',') - } - fmt.Println(buf.String()) - } - buf.WriteRune('}') - fmt.Println(buf.String()) - return buf.Bytes(), nil -} - -func GetBodyCopy(r *http.Request) (*bytes.Buffer, error) { - // If r.bodyBuf present, return the copy - // if r.bodyBuf != nil { - // return bytes.NewBuffer(r.bodyBuf.Bytes()), nil - // } - - // Maybe body is `io.Reader`. - // Note: Resty user have to watchout for large body size of `io.Reader` - if r.Body != nil { - b, err := io.ReadAll(r.Body) - if err != nil { - return nil, err - } - - // Restore the Body - // close(r.Body) - r.Body = io.NopCloser(bytes.NewReader(b)) - - // Return the Body bytes - return bytes.NewBuffer(b), nil - } - return nil, nil -} - -func UnmarshalBody(r *http.Request, v *interface{}, maxLen int64) error { - body, err := io.ReadAll(io.LimitReader(r.Body, maxLen)) - if err != nil { - return err - } - - return json.Unmarshal(body, v) -} - -func SetNotifyUrl(ip string, port uint16, uri string) string { - return fmt.Sprintf("http://%s:%d%s", ip, port, uri) -} - -func GetIps() (ips []string, err error) { - interfaceAddr, err := net.InterfaceAddrs() - if err != nil { - return ips, err - } - - for _, address := range interfaceAddr { - ipNet, isVailIpNet := address.(*net.IPNet) - // 检查ip地址判断是否回环地址 - if isVailIpNet && !ipNet.IP.IsLoopback() { - if ipNet.IP.To4() != nil { - ips = append(ips, ipNet.IP.String()) - } - } - } - return ips, nil -} - -func GetCurrentTimeSliceIndexByPeriod(t time.Time, period int) int { - index := int((t.Hour()*60+t.Minute())/period) - 1 - if index < 0 { - return int(24*60/period) - 1 - } - return index -} - -var ( - cst *time.Location -) - -// RFC3339ToDateTime convert rfc3339 value to china standard time layout -func RFC3339ToDateTime(value string) (string, error) { - ts, err := time.Parse(time.RFC3339, value) - if err != nil { - return "", err - } - - return ts.In(cst).Format("2006-01-02 15:04:05"), nil -} - -// CreateTimeDir 根据当前时间格式来创建文件夹 -func CreateTimeDir(fmt string, path string) string { - folderName := time.Now().Format(fmt) - folderPath := filepath.Join(path, folderName) - if _, err := os.Stat(folderPath); os.IsNotExist(err) { - // 必须分成两步:先创建文件夹、再修改权限 - os.Mkdir(folderPath, 0664) //0644也可以os.ModePerm - os.Chmod(folderPath, 0664) - } - return folderPath -} - -// CreateDir 根据传入的目录名和路径来创建文件夹 -func CreateDir(folderName string, path string) string { - folderPath := filepath.Join(path, folderName) - if _, err := os.Stat(folderPath); os.IsNotExist(err) { - // 必须分成两步:先创建文件夹、再修改权限 - os.MkdirAll(folderPath, 0664) //0644也可以os.ModePerm - os.Chmod(folderPath, 0664) - } - return folderPath -} - -func GetFmtTimeString(srcFmt string, timeString string, dstFmt string) string { - t, _ := time.ParseInLocation(srcFmt, timeString, time.Local) - return t.Format(dstFmt) -} - -func GetFileMD5Sum(filePath string) (string, error) { - file, err := os.Open(filePath) - if err != nil { - return "", err - } - defer file.Close() - md5 := md5.New() - _, err = io.Copy(md5, file) - if err != nil { - return "", err - } - - md5str := hex.EncodeToString(md5.Sum(nil)) - - return md5str, nil -} - -// PathExists check path is exist or no -func PathExists(path string) (bool, error) { - _, err := os.Stat(path) - if err == nil { //文件或者目录存在 - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err -} - -// PathExists check path is exist or no -func FilePathExists(filePath string) (bool, error) { - _, err := os.Stat(filePath) - if err == nil { //文件或者目录存在 - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err -} - -func GetDayDuration(d1, d2 string) int64 { - a, _ := time.Parse("2006-01-02", d1) - b, _ := time.Parse("2006-01-02", d2) - d := a.Sub(b) - - return (int64)(d.Hours() / 24) -} - -func GetSecondsSinceDatetime(datetimeStr string) (int64, error) { - loc1, _ := time.LoadLocation("Local") - // 解析日期时间字符串为时间对象 - datetime, err := time.ParseInLocation(time.DateTime, datetimeStr, loc1) - if err != nil { - return 0, err - } - - // 计算时间差 - duration := time.Since(datetime) - - // 获取时间差的秒数 - seconds := int64(duration.Seconds()) - - return seconds, nil -} - -func GetSecondDuration(time1, time2 string) (int64, error) { - loc1, _ := time.LoadLocation("Local") - // 解析日期时间字符串为时间对象 - t1, err := time.ParseInLocation(time.DateTime, time1, loc1) - if err != nil { - return 0, err - } - t2, err := time.ParseInLocation(time.DateTime, time2, loc1) - if err != nil { - return 0, err - } - - // 计算时间差 - duration := t2.Sub(t1) - - // 获取时间差的秒数 - seconds := int64(duration.Seconds()) - - return seconds, nil -} - -// 0: invalid ip -// 4: IPv4 -// 6: IPv6 -func ParseIP(s string) (net.IP, int) { - ip := net.ParseIP(s) - if ip == nil { - return nil, 0 - } - for i := 0; i < len(s); i++ { - switch s[i] { - case '.': - return ip, 4 - case ':': - return ip, 6 - } - } - return nil, 0 -} - -func BytesCombine1(pBytes ...[]byte) []byte { - return bytes.Join(pBytes, []byte("")) -} - -func BytesCombine(pBytes ...[]byte) []byte { - length := len(pBytes) - s := make([][]byte, length) - for index := 0; index < length; index++ { - s[index] = pBytes[index] - } - sep := []byte("") - return bytes.Join(s, sep) -} - -func ParseIPAddr(ip string) string { - ipAddr := net.ParseIP(ip) - - if ipAddr != nil { - if ipAddr.To4() != nil { - return IsIPv4 - } else { - return IsIPv6 - } - } - - return NonIP -} - -func CombineHostUri(ip string, port string) string { - var hostUri string = "" - ipType := ParseIPAddr(ip) - if ipType == IsIPv4 { - hostUri = fmt.Sprintf("http://%s:%v", ip, port) - } else { - hostUri = fmt.Sprintf("http://[%s]:%v", ip, port) - } - - return hostUri -} - -func StructToMap(obj interface{}) map[string]interface{} { - objValue := reflect.ValueOf(obj) - objType := objValue.Type() - - m := make(map[string]interface{}) - - for i := 0; i < objValue.NumField(); i++ { - field := objValue.Field(i) - fieldName := objType.Field(i).Name - - m[fieldName] = field.Interface() - } - - return m -} - -// ToMap 结构体转为Map[string]interface{} -func ToMap(in interface{}, tagName string) (map[string]interface{}, error) { - out := make(map[string]interface{}) - - v := reflect.ValueOf(in) - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - - if v.Kind() != reflect.Struct { // 非结构体返回错误提示 - return nil, fmt.Errorf("ToMap only accepts struct or struct pointer; got %T", v) - } - - t := v.Type() - // 遍历结构体字段 - // 指定tagName值为map中key;字段值为map中value - for i := 0; i < v.NumField(); i++ { - fi := t.Field(i) - if tagValue := fi.Tag.Get(tagName); tagValue != "" { - out[tagValue] = v.Field(i).Interface() - } - } - return out, nil -} - -func ZipOneFile(srcFile, dstZip string, pathFlag bool) error { - zipFile, err := os.Create(dstZip) - if err != nil { - return err - } - defer zipFile.Close() - - zipWriter := zip.NewWriter(zipFile) - defer zipWriter.Close() - - fileToCompress, err := os.Open(srcFile) - if err != nil { - return err - } - defer fileToCompress.Close() - - var fileInZip io.Writer - if pathFlag { - fileInZip, err = zipWriter.Create(srcFile) - if err != nil { - return err - } - } else { - // 获取文件的基本名称 - fileName := filepath.Base(fileToCompress.Name()) - fileInZip, err = zipWriter.Create(fileName) - if err != nil { - return err - } - } - - _, err = io.Copy(fileInZip, fileToCompress) - if err != nil { - return err - } - return nil -} - -func ZipDirectoryFile(srcDir, dstZip string) error { - // Create a new zip file - zipfileWriter, err := os.Create(dstZip) - if err != nil { - return err - } - defer zipfileWriter.Close() - - // Create a new zip archive - zipWriter := zip.NewWriter(zipfileWriter) - defer zipWriter.Close() - - // Walk through the directory and add files to the zip archive - err = filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - // Create a new file header for the current file - header, err := zip.FileInfoHeader(info) - if err != nil { - return err - } - - // Set the name of the file within the zip archive - header.Name = filepath.Join(filepath.Base(srcDir), path[len(srcDir):]) - - // If the current file is a directory, skip it - if info.IsDir() { - return nil - } - - // Create a new file in the zip archive - fileWriter, err := zipWriter.CreateHeader(header) - if err != nil { - return err - } - - // Open the current file - file, err := os.Open(path) - if err != nil { - return err - } - defer file.Close() - - // Copy the contents of the current file to the zip archive - _, err = io.Copy(fileWriter, file) - if err != nil { - return err - } - - return nil - }) - - return err -} - -// 判断软件包是rpm或者deb, 1:rpm, 2:deb, 0:unknown format -func JudgeRpmOrDebPackage(filePath string) (int, error) { - var fileType int = 0 - file, err := os.Open(filePath) - if err != nil { - return fileType, err - } - defer file.Close() - - // Read the first 6 bytes of the file - header := make([]byte, 6) - _, err = file.Read(header) - if err != nil { - return fileType, err - } - - // Check the magic numbers to determine the package format - if string(header) == "!