首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为SNMP - MIB文件中的部分创建某种模板

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

Stack Overflow用户
提问于 2018-10-23 20:27:20
回答 1查看 298关注 0票数 1

我们有一个软件套件,可以从它的模块(服务)中收集健康信息。我们在内部处理此运行状况信息,但我们还希望使用SNMP让外部世界知道模块的状态。与使用MIB文件并在每个模块中实现SNMP不同,我们希望在一个具有一个MIB文件的集中式服务中使用SNMP。这有它的优点,但随附的MIB文件变得越来越大,因为每个模块都可能包含其对等模块的完整副本。这看起来像这样,这只是一个非常简单的例子。

问题是:有没有一种方法可以在MIB树中构造子部分,以使MIB文件更易于维护?如果能为一个模块及其所有子对象创建一种模板,并从这个模板创建对象,那就太好了。

这是不是有可能呢?

以下是此示例mib树的mib文件:

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

发布于 2018-10-23 21:26:59

我不完全理解您的用例(我不完全理解“每个模块可能包含其同级模块的完整副本”部分,特别是因为如果您将信息集中在一个地方,那么您的模块本身实际上“一无所有”),但这似乎是表的绝佳机会。这类似于类C语言中的结构数组。

您不必重复使用Version、Uptime、ErrorA、ErrorB和ErrorC (在管理信息库和实际的逻辑树中)一百万次,而是拥有一个包含5列的表,并用所需的行数填充它。每列的语法/形式只需要指定一次。

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

我的SMI是生疏的,但其定义如下所示:

代码语言:javascript
复制
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 }

仅此而已--不需要重复定义。在运行时,可以根据需要添加任意多的行。

单个条目将可直接访问,如下所示:

代码语言:javascript
复制
4.1.12345.40.2.1.1.1.<ID>.<FIELD>

例如,模块2的ErrorB是

代码语言:javascript
复制
4.1.12345.40.2.1.1.1.2.5

模块48,570的正常运行时间是

代码语言:javascript
复制
4.1.12345.40.2.1.1.1.48570.3

当然,您的远程管理器不会提前知道行数,但这很好:管理器将使用“遍历”或变体- GetNext或GetBulk请求的某种组合-来发现表的内容。

将这些SMIv2定义插入到MIB中,并将MIB提供给SNMP Manager,您应该会看到它是如何改进布局的。如何实际填充表将取决于您的代理软件。

请注意,“表”和“条目”对象实际上是一种伪对象,因此必须具有not-accessible访问级别;条目的索引是一个实数值,但应该为not-accessible,因为它的值在逻辑上是每个条目的OID的一部分,而不是您可以轮询的不同对象。

顺便说一句,企业编号12345已经assigned到VWB集团;除非你是他们,否则你将需要get your own

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52949089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档