Skip to content

Commit

Permalink
TEXTUAL-CONVENTION マクロやのEnumと
Browse files Browse the repository at this point in the history
INTEGERのDISPLAY-HINTに対応した
#32
  • Loading branch information
twsnmp committed Dec 7, 2023
1 parent a078ee1 commit b825906
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 17 deletions.
127 changes: 119 additions & 8 deletions datastore/mibdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type MIBInfo struct {
Index string
Description string
EnumMap map[int]string
Hint string
}

type MIBTreeEnt struct {
Expand All @@ -44,9 +45,16 @@ type MIBModuleEnt struct {
Error string
}

type MIBTypeEnt struct {
Enum string
EnumMap map[int]string
Hint string
}

var MIBTree = []*MIBTreeEnt{}

var MIBInfoMap = make(map[string]MIBInfo)
var MIBInfoMap = make(map[string]*MIBInfo)
var MIBTypeMap = make(map[string]MIBTypeEnt)

var MIBModules = []*MIBModuleEnt{}

Expand All @@ -57,7 +65,7 @@ func FindMIBInfo(name string) *MIBInfo {
}
oid := MIBDB.NameToOID(name)
if i, ok := MIBInfoMap[oid]; ok {
return &i
return i
}
return nil
}
Expand Down Expand Up @@ -269,6 +277,30 @@ func loadExtMIB(asn1 []byte, fileType, file string, retry bool) bool {
nameList = append(nameList, name)
log.Printf("module %s=%s", name, oid)
}
if module.Body.Types != nil {
for _, t := range module.Body.Types {
if t.Syntax != nil && t.Syntax.Enum != nil {
log.Printf("type syntax enum(%s) = %#v ", t.Name, t.Syntax)
}
if t.TextualConvention != nil {
enum := []string{}
enumMap := make(map[int]string)
if t.TextualConvention.Syntax.Enum != nil {
for _, e := range t.TextualConvention.Syntax.Enum {
enum = append(enum, fmt.Sprintf("%s:%s ", e.Value, e.Name))
if i, err := strconv.Atoi(e.Value); err == nil {
enumMap[i] = string(e.Name)
}
}
MIBTypeMap[t.Name.String()] = MIBTypeEnt{
Hint: t.TextualConvention.DisplayHint,
Enum: strings.Join(enum, ","),
EnumMap: enumMap,
}
}
}
}
}
for _, n := range module.Body.Nodes {
if n.Name.String() == "" || n.Oid == nil {
continue
Expand Down Expand Up @@ -350,7 +382,7 @@ func setMIBInfo(oid string, n *parser.Node) {
return
}
if n.NotificationType != nil {
MIBInfoMap[oid] = MIBInfo{
MIBInfoMap[oid] = &MIBInfo{
OID: oid,
Status: n.NotificationType.Status.ToSmi().String(),
Type: "Notification",
Expand All @@ -359,14 +391,27 @@ func setMIBInfo(oid string, n *parser.Node) {
return
}
if n.TrapType != nil {
MIBInfoMap[oid] = MIBInfo{
MIBInfoMap[oid] = &MIBInfo{
OID: oid,
Status: "current",
Type: "Notification",
Description: n.TrapType.Description,
}
}
if n.ObjectType == nil || n.ObjectType.Syntax.Type == nil {
if n.ObjectType == nil {
// OID
return
}
if n.ObjectType.Syntax.Sequence != nil {
MIBInfoMap[oid] = &MIBInfo{
OID: oid,
Status: "current",
Type: "Sequence",
Description: n.ObjectType.Description,
}
return
}
if n.ObjectType.Syntax.Type == nil {
return
}
enum := []string{}
Expand All @@ -386,7 +431,7 @@ func setMIBInfo(oid string, n *parser.Node) {
index = append(index, i.Name.String())
}

MIBInfoMap[oid] = MIBInfo{
MIBInfoMap[oid] = &MIBInfo{
OID: oid,
Status: n.ObjectType.Status.ToSmi().String(),
Type: n.ObjectType.Syntax.Type.Name.String(),
Expand All @@ -402,14 +447,23 @@ func setMIBInfo(oid string, n *parser.Node) {
// checkMIBInfoMap : MIB情報を数値のOIDをキーとしたMAPへ変換する
func checkMIBInfoMap() {
delList := []string{}
addList := []MIBInfo{}
addList := []*MIBInfo{}
for oid, info := range MIBInfoMap {
noid := MIBDB.NameToOID(oid)
if noid != oid {
delList = append(delList, oid)
info.OID = noid
addList = append(addList, info)
}
if e, ok := MIBTypeMap[info.Type]; ok {
if info.Enum == "" {
info.Enum = e.Enum
info.EnumMap = e.EnumMap
}
if info.Hint == "" {
info.Hint = e.Hint
}
}
}
for _, d := range delList {
delete(MIBInfoMap, d)
Expand Down Expand Up @@ -466,7 +520,7 @@ var (
func addToMibTree(oid, name, poid string) {
n := &MIBTreeEnt{Name: name, OID: oid, Children: []*MIBTreeEnt{}}
if i, ok := MIBInfoMap[oid]; ok {
n.MIBInfo = &i
n.MIBInfo = i
}
if poid == "" {
mibTreeRoot = n
Expand Down Expand Up @@ -590,3 +644,60 @@ func rfc2mib(b []byte) []byte {
}
return []byte("")
}

func PrintHintedMIBIntVal(val int32, hint string, us bool) string {
if hint == "" {
if us {
return fmt.Sprintf("%d", uint32(val))
}
return fmt.Sprintf("%d", val)
}
h := hint[0:1]
switch h {
case "d":
r := ""
n := false
if us {
r = fmt.Sprintf("%d", uint32(val))
} else {
if val < 0 {
n = true
val = -val
}
r = fmt.Sprintf("%d", val)
}
if len(hint) > 2 && hint[1:2] == "-" {
s, err := strconv.Atoi(hint[2:])
if err == nil && s != 0 {
if s <= len(r) {
r = r[0:s] + "." + r[s:]
} else {
tmp := "."
for len(tmp) < s-len(r)+1 {
tmp += "0"
}
r = tmp + r
}
}
}
if n {
r = "-" + r
}
return r
case "x":
return fmt.Sprintf("%x", val)
case "o":
return fmt.Sprintf("%o", val)
case "b":
r := ""
for b := 0x80000000; b != 0; b >>= 1 {
if int32(b)&val != 0 {
r += "1"
} else {
r += "0"
}
}
return r
}
return ""
}
14 changes: 9 additions & 5 deletions logger/snmptrapd.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,18 +136,22 @@ func snmptrapd(stopCh chan bool) {
val = getTimeTickStr(gosnmp.ToBigInt(vb.Value).Int64())
default:
v := int(gosnmp.ToBigInt(vb.Value).Uint64())
apend := ""
val = fmt.Sprintf("%d", v)
mi := datastore.FindMIBInfo(key)
if mi != nil {
if mi.Enum != "" {
if vn, ok := mi.EnumMap[v]; ok {
apend = "(" + vn + ")"
val += "(" + vn + ")"
}
} else {
if mi.Hint != "" {
val = datastore.PrintHintedMIBIntVal(int32(v), mi.Hint, vb.Type != gosnmp.Integer)
}
if mi.Units != "" {
val += " " + mi.Units
}
} else if mi.Units != "" {
apend = " " + mi.Units
}
}
val = fmt.Sprintf("%d%s", gosnmp.ToBigInt(vb.Value).Uint64(), apend)
}
vbs += fmt.Sprintf("%s=%s\n", key, val)
}
Expand Down
10 changes: 6 additions & 4 deletions webapi/mibbr.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,20 +215,22 @@ func snmpWalk(api *WebAPI, p *mibGetReqWebAPI) ([]*mibEnt, error) {
if p.Raw {
value = fmt.Sprintf("%d", v)
} else {
apend := ""
value = fmt.Sprintf("%d", gosnmp.ToBigInt(variable.Value).Uint64())
mi := datastore.FindMIBInfo(name)
if mi != nil {
if mi.Enum != "" {
if vn, ok := mi.EnumMap[v]; ok {
apend = "(" + vn + ")"
value += "(" + vn + ")"
}
} else {
if mi.Hint != "" {
value = datastore.PrintHintedMIBIntVal(int32(v), mi.Hint, variable.Type != gosnmp.Integer)
}
if mi.Units != "" {
apend = " " + mi.Units
value += " " + mi.Units
}
}
}
value = fmt.Sprintf("%d%s", gosnmp.ToBigInt(variable.Value).Uint64(), apend)
}
}
ret = append(ret, &mibEnt{
Expand Down

0 comments on commit b825906

Please sign in to comment.