Packaged MIBs#

SNMP command responder discovers pip-installed packages extending the snmpresponder.mibs entry point.

The main advantage of packaged MIBs is easier distribution. That might make more sense for generally useful and reusable MIB implementations such as HOST-RESOURCES-MIB.

This example configuration includes example Python package, which could be used as a blueprint for packaging other MIB implementations.

You could test this configuration by running the following command (you may need to have COFFEE-POT-MIB installed locally):

$ snmpget -v2c -c public 127.0.0.1:1161 COFFEE-POT-MIB::potName.0

SNMP Command Responder is configured to:

  • listen on UDP socket at localhost

  • form a MIB tree out of all objects imported from the examples extension point (provided by installed snmpresponder-mibs-examples package)

  • respond to SNMPv2c queries

  • serve all queries against the configured MIB tree

#
# SNMP Command Responder configuration file
#

config-version: 1
program-name: snmpresponder

snmp-credentials-group {
  snmp-transport-domain: 1.3.6.1.6.1.1.100
  snmp-bind-address: 127.0.0.1:1161

  snmp-engine-id: 0x0102030405070809

  snmp-community-name: public
  snmp-security-name: public
  snmp-security-model: 2
  snmp-security-level: 1

  snmp-credentials-id: snmp-credentials
}

context-group {
  snmp-context-engine-id-pattern: .*?
  snmp-context-name-pattern: .*?

  snmp-context-id: any-context
}

content-group {
  snmp-pdu-type-pattern: .*?
  snmp-pdu-oid-prefix-pattern-list: .*?

  snmp-content-id: any-content
}

peers-group {
  snmp-transport-domain: 1.3.6.1.6.1.1.100
  snmp-bind-address-pattern-list: .*?
  snmp-peer-address-pattern-list: .*?

  snmp-peer-id: 100
}

managed-objects-group {
  mib-text-search-path-list: http://mibs.pysnmp.com/asn1/

  # List of Python packages to import in the MIB builder context
  mib-code-packages-pattern-list: examples\..*

  mib-tree-id: managed-objects-1
}

routing-map {
  matching-snmp-context-id-list: any-context
  matching-snmp-content-id-list: any-content

  matching-snmp-credentials-id-list: snmp-credentials
  matching-snmp-peer-id-list: 100

  using-mib-tree-id: managed-objects-1
}

Download configuration file.

The only implemented, read-only managed object is COFFEE-POT-MIB::potName.0:

  • serves a static value for COFFEE-POT-MIB::potName.0 object

  • only SNMP read operations are implemented

  • write operation are allowed, but has no effect

"""SNMP MIB module (COFFEE-POT-MIB) expressed in pysnmp data model.

This Python module is designed to be imported and executed by the
pysnmp library.

See https://www.pysnmp.com/pysnmp for further information.

Notes
-----
ASN.1 source http://mibs.pysnmp.com:80/asn1/COFFEE-POT-MIB
Produced by pysmi-0.4.0 at Sat Jan 12 14:01:57 2019
On host igarlic platform Darwin version 17.7.0 by user ilya
Using Python version 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)
"""
if 'mibBuilder' not in globals():
    import sys

    sys.stderr.write(__doc__)
    sys.exit(1)


mibBuilder = globals()['mibBuilder']

MibScalarInstance, = mibBuilder.importSymbols(
    'SNMPv2-SMI',
    'MibScalarInstance'
)

# Import Managed Objects to base Managed Objects Instances on

potName, = mibBuilder.importSymbols(
    "COFFEE-POT-MIB",
    "potName"
)


# MIB Managed Objects in the order of their OIDs

class PotnameObjectInstance(MibScalarInstance):
    """Scalar Managed Object Instance with MIB instrumentation hooks.

    User can override none, some or all of the method below interfacing
    them to the data source they want to manage through SNMP.
    Non-overridden methods could just be removed from this class.

    See the SMI data model documentation at `https://www.pysnmp.com/pysnmp`.
    """
    def readTest(self, varBind, **context):
        cbFun = context['cbFun']
        cbFun(varBind, **context)

    def readGet(self, varBind, **context):
        name, value = varBind

        cbFun = context['cbFun']
        value = self.syntax.clone('mypot')
        cbFun((name, value), **context)

    def readTestNext(self, varBind, **context):
        name, value = varBind

        if name >= self.name:
            MibScalarInstance.readTestNext(self, varBind, **context)

        else:
            cbFun = context['cbFun']
            cbFun((self.name, value), **context)

    def readGetNext(self, varBind, **context):
        name, value = varBind

        if name >= self.name:
            MibScalarInstance.readGetNext(self, varBind, **context)

        else:
            value = self.syntax.clone('mypot')

            cbFun = context['cbFun']
            cbFun((self.name, value), **context)


_potName = PotnameObjectInstance(
     potName.name,
     (0,),
     potName.syntax
)

# Export Managed Objects Instances to the MIB builder

mibBuilder.exportSymbols(
    "__COFFEE-POT-MIB",
    **{"potName": _potName}
)

Download MIB implementation.

For more information on MIB implementation refer to the MIB implementation chapter in the documentation.