代码之家  ›  专栏  ›  技术社区  ›  Frank

如何为SNMP-MIB文件中的节创建某种模板

  •  1
  • Frank  · 技术社区  · 8 年前

    我们希望在一个集中服务中使用SNMP,一个MIB文件,而不是使用MIB文件并在每个模块中实现SNMP。 这有其优点,但是伴随的MIB文件越来越大,因为每个模块都可能包含其对等模块的完整副本。 这看起来像这样,这只是一个非常简单的例子。

    example mib tree

    问题是: 是否有方法在mib树中构造子节,以使mib文件更易于维护?

    这有可能吗?

        MYCOMP-MYAPP-MIB DEFINITIONS ::= BEGIN
    
       IMPORTS
            MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE, enterprises
               FROM SNMPv2-SMI
            TEXTUAL-CONVENTION
               FROM SNMPv2-TC;
    
    mycomp             OBJECT IDENTIFIER ::= {enterprises 12345}
    
    myapp MODULE-IDENTITY                      
           LAST-UPDATED  "201810220000Z"
           ORGANIZATION  "MyCompany"
           CONTACT-INFO  ""
           DESCRIPTION   ""
           ::= { mycomp 40 }
    
    systemInfoGroup OBJECT IDENTIFIER ::= {myapp 2}
    
    ErrorStatus ::= TEXTUAL-CONVENTION
        STATUS     current   
        DESCRIPTION
            "Status"
        SYNTAX     INTEGER {
            normal(0),
            error(1),
        }
    
    sysManagerGroup OBJECT IDENTIFIER 
    ::= {systemInfoGroup 1}
    
    sysManagerModule1 OBJECT IDENTIFIER 
    ::= {sysManagerGroup 1}
    
    sysManagerModule1Version  OBJECT-TYPE
       SYNTAX  OCTET STRING (SIZE (1..100))
       ACCESS  read-only
       STATUS  current
       DESCRIPTION
               "Contains the version string of the software module."
       ::= { sysManagerModule1 1 }
    
    sysManagerModule1Uptime  OBJECT-TYPE
       SYNTAX  OCTET STRING (SIZE (1..100))
       ACCESS  read-only
       STATUS  current
       DESCRIPTION
               "Up time."
       ::= { sysManagerModule1 2 }
    
    sysManagerModule1ErrorA OBJECT-TYPE
        SYNTAX  ErrorStatus                
        ACCESS  read-only
        STATUS  current
        ::= { sysManagerModule1 4 }
    
    sysManagerModule1ErrorB OBJECT-TYPE
        SYNTAX   ErrorStatus 
        ACCESS  read-only
        STATUS  current
        ::= { sysManagerModule1 5 }
    
    sysManagerModule1ErrorC OBJECT-TYPE
        SYNTAX  ErrorStatus 
        ACCESS  read-only
        STATUS  current
        ::= { sysManagerModule1 6 }
    
    sysManagerModule2 OBJECT IDENTIFIER 
    ::= {sysManagerGroup 2}
    
    sysManagerModule2Version  OBJECT-TYPE
       SYNTAX  OCTET STRING (SIZE (1..100))
       ACCESS  read-only
       STATUS  current
       DESCRIPTION
               "Contains the version string of the software module."
       ::= { sysManagerModule2 1 }
    
    sysManagerModule2Uptime  OBJECT-TYPE
       SYNTAX  OCTET STRING (SIZE (1..100))
       ACCESS  read-only
       STATUS  current
       DESCRIPTION
               "Up time."
       ::= { sysManagerModule2 2 }
    
    sysManagerModule2ErrorA OBJECT-TYPE
        SYNTAX  ErrorStatus                
        ACCESS  read-only
        STATUS  current
        ::= { sysManagerModule2 4 }
    
    sysManagerModule2ErrorB OBJECT-TYPE
        SYNTAX   ErrorStatus 
        ACCESS  read-only
        STATUS  current
        ::= { sysManagerModule2 5 }
    
    sysManagerModule2ErrorC OBJECT-TYPE
        SYNTAX  ErrorStatus 
        ACCESS  read-only
        STATUS  current
        ::= { sysManagerModule2 6 }
    END
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Lightness Races in Orbit    8 年前

    我没有完全理解您的用例(我没有完全理解“每个模块可能包含其对等模块的完整副本”部分,特别是因为您的模块本身实际上“有” 没有什么 桌子 . 这类似于C语言中的结构数组。

    与版本、正常运行时间、ErrorA、errob和erroc重复一百万次(在MIB和实际逻辑树中)不同,您有一个 桌子 它包含五列,并根据需要填充任意多行。每列的语法/格式只需指定一次。

    对于每一行的“索引”,您将有一个额外的列(放在第一位),即模块号。

    我的SMI是生锈的,但是定义看起来像这样:

    sysManagerGroup OBJECT IDENTIFIER 
    ::= { systemInfoGroup 1 }
    
    sysManagerModuleTable OBJECT-TYPE
       SYNTAX SEQUENCE OF SysManagerModuleEntry
       MAX-ACCESS   not-accessible
       STATUS       current
       DESCRIPTION  "Table of modules being monitored"
    ::= { sysManagerGroup 1 }
    
    sysManagerModuleEntry OBJECT-TYPE
       SYNTAX       SysManagerModuleEntry
       MAX-ACCESS   not-accessible
       STATUS       current
       DESCRIPTION  "A row in the table of modules being monitored"
       INDEX        { sysManagerModuleId }
    ::= { sysManagerModuleTable 1 }
    
    SysManagerModuleEntry ::= { SEQUENCE
       sysManagerModuleId       Integer32,
       sysManagerModuleVersion  OCTET STRING,
       sysManagerModuleUptime   OCTET STRING,
       sysManagerModuleErrorA   ErrorStatus,
       sysManagerModuleErrorB   ErrorStatus,
       sysManagerModuleErrorC   ErrorStatus,
    }
    
    sysManagerModuleId OBJECT-TYPE
       SYNTAX     Integer32,
       MAX-ACCESS not-accessible
       STATUS     current
       DESCRIPTION "Numeric ID of the module"
       ::= { sysManagerModuleEntry 1 }
    
    sysManagerModuleVersion  OBJECT-TYPE
       SYNTAX     OCTET STRING (SIZE (1..100))
       MAX-ACCESS read-only
       STATUS     current
       DESCRIPTION
               "Contains the version string of the software module."
       ::= { sysManagerModuleEntry 2 }
    
    sysManagerModuleUptime  OBJECT-TYPE
       SYNTAX     OCTET STRING (SIZE (1..100))
       MAX-ACCESS read-only
       STATUS     current
       DESCRIPTION
               "Up time."
       ::= { sysManagerModuleEntry 3 }
    
    sysManagerModuleErrorA OBJECT-TYPE
        SYNTAX     ErrorStatus                
        MAX-ACCESS read-only
        STATUS     current
        ::= { sysManagerModuleEntry 4 }
    
    sysManagerModuleErrorB OBJECT-TYPE
        SYNTAX     ErrorStatus 
        MAX-ACCESS read-only
        STATUS     current
        ::= { sysManagerModuleEntry 5 }
    
    sysManagerModuleErrorC OBJECT-TYPE
        SYNTAX     ErrorStatus 
        MAX-ACCESS read-only
        STATUS     current
        ::= { sysManagerModuleEntry 6 }
    

    就这样-不需要重复定义。在运行时,根据需要/需要添加任意多行。

    4.1.12345.40.2.1.1.1.<ID>.<FIELD>
    

    e、 g.模块2的错误是

    4.1.12345.40.2.1.1.1.2.5
    

    模块48570的正常运行时间是

    4.1.12345.40.2.1.1.1.48570.3
    

    当然,您的远程管理器不会提前知道行数,但这很好:管理器将使用“walk”或变体-一些 获取下一个 获取批量 请求-发现表的内容。

    将这些SMIv2定义插入MIB并将MIB提供给SNMP管理器,您应该了解它如何改进布局。如何实际填充表将取决于代理软件。

    注意,“table”和“entry”对象实际上是一种伪对象,因此必须具有 not-accessible 访问级别;条目的索引是实际值,但应该是 无法访问

    assigned 到 ;除非你是他们,否则你必须 get your own

    推荐文章