Édouard Lopez Édouard Lopez - 2 months ago 15
Python Question

Do I need different MIB with those OID?

I got this legacy

powershell
script that retrieve information via SNMP, I'm trying to port it in Python using
snimpy
.

$PrintersIP = '10.100.7.47', '10.100.7.48'
Function Get-SNMPInfo ([String[]]$Printers) {
Begin {
$SNMP = New-Object -ComObject olePrn.OleSNMP
}
Process {
Foreach ($IP in $Printers) {
$SNMP.Open($IP,"public",2,3000)
[PSCustomObject][Ordered]@{
Name = $SNMP.Get(".1.3.6.1.2.1.1.5.0")
IP = $IP
UpTime = [TimeSpan]::FromSeconds(($SNMP.Get(".1.3.6.1.2.1.1.3.0"))/100)
Model = $SNMP.Get(".1.3.6.1.2.1.25.3.2.1.3.1")
Description = $SNMP.Get(".1.3.6.1.2.1.1.1.0")
#Contact = $SNMP.Get(".1.3.6.1.2.1.1.4.0")
#SN = $SNMP.Get(".1.3.6.1.2.1.43.5.1.1.17.1")
#Location = $SNMP.Get(".1.3.6.1.2.1.1.6.0")
#TonerName = $SNMP.Get("43.11.1.1.6.1.1")
}
}
}
End {
$SNMP.Close()
}
}
Get-SNMPInfo $PrintersIP | ft -AutoSize *


Snimpy usage



From the section Usage of the official documentation they use the
load
method to load MIB a file.

from snimpy.manager import Manager as M
from snimpy.manager import load

load("IF-MIB")
m = M("localhost")
print(m.ifDescr[0])


Finding
OID
name



I can't find the
OID
name for some of the identifiers. For instance:



Question




  • Depending on the
    OID
    's name
    I'm trying to use, do I need to load different MIB file ? (e.g.
    Printer-MIB
    ,
    IF-MIB
    , etc.)

  • Where can I find the missing
    OID
    's name


Answer

If you use the load() method then scalars and row names from it will be made available as an instance attributes hence you're able to query for 'sysContact' etc, but as the 'sysDescr' and 'sysName' are not part of the IF-MIB you will not be able to get it.

You will need to load in the relevant MIB such as SNMPv2-MIB or attempt to get the value via the OID directly.

UPDATE: I've had a look and snimpy and it loooks like pysnmp is doing the collection, so you could always user that directly. The sample below is collecting a new different SNMP values some by OID and others via the named variable within the MIB (you will need to have the relevant MIB available if you want to get via the name). This sample is pretty much taken from the pySNMP documentation

from pysnmp.entity.rfc3413.oneliner import cmdgen

cmdGen = cmdgen.CommandGenerator()

errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
    cmdgen.CommunityData('public'),
    cmdgen.UdpTransportTarget(('demo.snmplabs.com', 161)),
    '1.3.6.1.2.1.1.1.0',            # sysDescr
    '1.3.6.1.2.1.1.2.0',            # sysObjectId
    '1.3.6.1.2.1.1.3.0',            # upTime
    '1.3.6.1.2.1.1.4.0',            # Contact
    '1.3.6.1.2.1.1.5.0',            # sysName
    '1.3.6.1.2.1.1.6.0',            # Location
    cmdgen.MibVariable('SNMPv2-MIB', 'sysDescr', 0),     #.1.3.6.1.2.1.1.1.0 sysDescr
    cmdgen.MibVariable('SNMPv2-MIB', 'sysName', 0)     #.1.3.6.1.2.1.1.5.0 sysName
)



# Check for errors and print out results
if errorIndication:
    print(errorIndication)
else:
    if errorStatus:
        print('%s at %s' % (
            errorStatus.prettyPrint(),
            errorIndex and varBinds[int(errorIndex)-1] or '?'
            )
        )
    else:
        for name, val in varBinds:
            print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))