Question

I have a MIB that I started working on but smilint complains about a missing conformance group. How do I add this conformance group to my file?

BLEH-PRODUCT-MIB DEFINITIONS ::= BEGIN

-- Objects in this MIB are implemented in the local SNMP agent.

   IMPORTS
           MODULE-IDENTITY, OBJECT-TYPE, Integer32, enterprises
                   FROM SNMPv2-SMI;

   blehProductMIB MODULE-IDENTITY
     LAST-UPDATED "201305290000Z"
     ORGANIZATION "Bleh Corporation"
     CONTACT-INFO "           Joe Shmoe
                   Postal:    Bleh Corporation
                              23 Telnet Road
                              Ottawa, ON, K1K 1K1
                              Canada

                   Tel:       +1 555 555 5555 x5555
                   Fax:       +1 555 555 5556
                   E-mail:    joe.shmoe@bleh.com"
     DESCRIPTION "MIB module describing Product objects."
     REVISION    "201305290000Z"
     DESCRIPTION "Initial"
     ::= { bleh 911 }

   bleh              OBJECT IDENTIFIER ::= { enterprises 54321 }

   productStatus OBJECT-TYPE
           SYNTAX       OCTET STRING (SIZE (0..65535))
           MAX-ACCESS   read-only
           STATUS       current
           DESCRIPTION  "The status of the Product system
                         Details are shown as text"
           ::= { blehProductMIB 1 }


   binaryProductStatus OBJECT-TYPE
           SYNTAX      Integer32 (0..1)
           MAX-ACCESS  read-only
           STATUS      current
           DESCRIPTION "The status of the Product system
                        Zero is unhealthy and One is healthy"
           ::= { blehProductMIB 2 }
END

Output of smilint:

$ smilint ./BLEH-PRODUCT-MIB 
./BLEH-PRODUCT-MIB:28: warning: node `productStatus' must be contained in at least one conformance group
./BLEH-PRODUCT-MIB:37: warning: node `binaryProductStatus' must be contained in at least one conformance group
Was it helpful?

Solution

It simply means you should define OBJECT-GROUP entities before defining OBJECT-TYPE entities in your MIB document.

Take RFC 1907 as example,

https://www.rfc-editor.org/rfc/rfc1907

snmpGroup OBJECT-GROUP
    OBJECTS { snmpInPkts,
              snmpInBadVersions,
              snmpInASNParseErrs,
              snmpSilentDrops,
              snmpProxyDrops,
              snmpEnableAuthenTraps }
    STATUS  current
    DESCRIPTION
            "A collection of objects providing basic instrumentation and
            control of an SNMPv2 entity."
    ::= { snmpMIBGroups 8 }

is defined first, and then

snmpInPkts OBJECT-TYPE
    SYNTAX     Counter32
    MAX-ACCESS read-only
    STATUS     current
    DESCRIPTION
            "The total number of messages delivered to the SNMP entity
            from the transport service."
    ::= { snmp 1 }

About why groups are important, you can read RFC 2580.

https://www.rfc-editor.org/rfc/rfc2580

Since you are going to define groups, then adding associated MODULE-COMPLIANCE is recommended.

OTHER TIPS

This comes a bit late but I was lately struggling with how OBJECT-GROUP, NOTIFICATION-GROUP, MODULE-COMPLIANCE. smilint was giving me errors. Then I just put all the pieces together and created this. Now it passes even with the autistic smilint -l 6

TEMPORARY-RESEARCH-MIB DEFINITIONS ::= BEGIN


IMPORTS
                      MODULE-IDENTITY, OBJECT-TYPE, enterprises, Integer32, NOTIFICATION-TYPE FROM SNMPv2-SMI
                      OBJECT-GROUP, NOTIFICATION-GROUP, MODULE-COMPLIANCE FROM SNMPv2-CONF;


exampleCorp           MODULE-IDENTITY
                      LAST-UPDATED "202111241500Z"
                      ORGANIZATION
                         "Example corp ltd"
                      CONTACT-INFO
                        "Example corp address"
                      DESCRIPTION
                        "This MIB file contains definitions for the
                         Example corps next coolest product!"
                      REVISION "202111241500Z"
                      DESCRIPTION
                        "MIB file created"
                      ::= { enterprises 55555 }


theSystem             OBJECT IDENTIFIER ::= { exampleCorp 10 }
mibMeta               OBJECT IDENTIFIER ::= { theSystem 1 }
productTypeOne        OBJECT IDENTIFIER ::= { theSystem 2 }      


productObjects        OBJECT-GROUP
                      OBJECTS {
                        devTempAlarm,
                        devVoltAlarm
                      }
                      STATUS  current
                      DESCRIPTION
                        "A collection of objects providing support for
                         the system MIB."
                      ::= { mibMeta 1 }

productNotifications  NOTIFICATION-GROUP
                      NOTIFICATIONS {
                        problemsTrap
                      }
                      STATUS  current
                      DESCRIPTION
                      "A collection of notifications providing support for
                       the system MIB."
                      ::= { mibMeta 2 }

productCompliances    MODULE-COMPLIANCE
                      STATUS     current
                      DESCRIPTION
                        "Compliance statement for the the entities in this (theSystem) MIB."
                      MODULE
                      MANDATORY-GROUPS {
                        productObjects,
                        productNotifications
                      }
                      ::= { mibMeta 3 }

-- Traps parent need to be always SOMEOID.0.
-- Ie, the zero is important.
trapsOne              OBJECT IDENTIFIER ::= { productTypeOne 0 }

problemsTrap          NOTIFICATION-TYPE
                      STATUS  current
                      DESCRIPTION
                        "This trap is send automatically if problems are detected."
                      ::= { trapsOne 1 }

trapDataTable         OBJECT-TYPE
                      SYNTAX  SEQUENCE OF DevEntry
                      MAX-ACCESS  not-accessible
                      STATUS  current
                      DESCRIPTION
                        "The table of Devices."
                      ::= { productTypeOne 1 }

trapDataTableEntry    OBJECT-TYPE
                      SYNTAX  DevEntry
                      MAX-ACCESS  not-accessible
                      STATUS  current
                      DESCRIPTION
                        "The entry to show a row of device information."
                      INDEX { devIndex }
                      ::= { trapDataTable 1 }

DevEntry              ::= SEQUENCE {
                        devIndex      Integer32,
                        devTempAlarm  Integer32,
                        devVoltAlarm  Integer32
                      }

devIndex              OBJECT-TYPE
                      SYNTAX  Integer32(1..5)
                      MAX-ACCESS  not-accessible
                      STATUS  current
                      DESCRIPTION
                        "A unique value to index the device."
                      ::= { trapDataTableEntry  1 }

devTempAlarm          OBJECT-TYPE
                      SYNTAX  Integer32(0..1)
                      MAX-ACCESS  read-only
                      STATUS  current
                      DESCRIPTION
                        "The state of the device temperature alarm:
                         0 = Alarm OFF,
                         1 = Alarm ON"
                     ::= { trapDataTableEntry  2 }

devVoltAlarm         OBJECT-TYPE
                     SYNTAX  Integer32(0..1)
                     MAX-ACCESS  read-only
                     STATUS  current
                     DESCRIPTION
                       "The state of the device voltage alarm:
                        0 = Alarm OFF,
                        1 = Alarm ON"
                    ::= { trapDataTableEntry  3 }


END
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top