204 lines
5.6 KiB
Go
204 lines
5.6 KiB
Go
package nbi
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gorilla/mux"
|
|
g "github.com/gosnmp/gosnmp"
|
|
|
|
"nms_cxy/lib/log"
|
|
"nms_cxy/lib/services"
|
|
"nms_cxy/omc/config"
|
|
)
|
|
|
|
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)
|
|
}
|