изменить часть OID, возвращаемую в «oid» и «oid_index», модулем Python easysnmp
Модуль Python easysnmp возвращает OID SNMP в двух частях: и . Например, если я иду по
ipAddressIfIndex.ipv4
(
.1.3.6.1.2.1.4.34.1.3.1
в числовой форме) OID:
>>> from easysnmp import Session
>>> session = Session(hostname="r1", community='public', version=2, use_long_names=True, use_sprint_value=True)
>>> session.bulkwalk("ipAddressIfIndex.1")
[<SNMPVariable value='9' (oid='.iso.org.dod.internet.mgmt.mib-2.ip.ipAddressTable.ipAddressEntry.ipAddressIfIndex', oid_index='1.4.192.0.2.1', snmp_type='INTEGER')>,
/* rest of the output is removed for brevity */
>>>
.. тогда это
.iso.org.dod.internet.mgmt.mib-2.ip.ipAddressTable.ipAddressEntry.ipAddressIfIndex
(или же
.1.3.6.1.2.1.4.34.1.3
численно) и
1.4.192.0.2.1
. Я хотел бы сдвинуть возвращенное вправо на два, чтобы
oid_id
было бы
192.0.2.1
. Это возможно? я пробовал с
session.bulkwalk("ipAddressIfIndex.1.4")
,
session.bulkwalk(("ipAddressIfIndex", "1.4"))
,
session.bulkwalk(".1.3.6.1.2.1.4.34.1.3.1.4")
и использовал различные параметры сеанса, такие как
use_long_names
или же
use_enums
, но я не могу изменить это поведение.
Это, очевидно, не большая проблема, так как я могу прочитать последние четыре поля (например, что-то вроде
oid_index.split('.')[-4:]
), но, возможно, есть хитрость, чтобы сместить "линию" между
oid
а также
oid_index
возвращается easysnmp.
1 ответ
вы можете использовать регулярное выражение для извлечения информации
import re
regex = re.compile(r'(?:\d+\.){3}\d+$')
tuple('{}/{}'.format(regex.search(item.oid).group(0), item.value)
for item in system_items)
или вы можете использовать PySNMP
class SNMPVariable(object):
def __init__(self, value, oid):
self.value = value
self.oid = oid
#example
s1 = SNMPVariable('255.255.255.0', 'iso.3.6.1.2.1.4.21.1.11.10.10.2.0')
prtin('{}/{}'.format(regex.search(s1.oid).group(0), s1.value)
проверить этот ответ