2016-04-05 2 views
0

Я смотрю на pyagentx (расширение агентов snmp) через python. https://github.com/rayed/pyagentxpyagentx snmp, как код связан с MIB?

Я не понимаю, как пример кода связан с MIB. Пример здесь будет class NetSnmpTestMibTable быть связан с netSnmpIETFWGTable от NET-SNMP-EXAMPLES-MIB.txthttp://www.net-snmp.org/docs/mibs/NET-SNMP-EXAMPLES-MIB.txt

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

''' 
Rayed Alrashed 2015-06-14 
AgentX sub agent that implement some parts of NET-SNMP-EXAMPLES-MIB: 
<http://www.net-snmp.org/docs/mibs/NET-SNMP-EXAMPLES-MIB.txt> 
snmpwalk -v 2c -c public localhost NET-SNMP-EXAMPLES-MIB::netSnmpExampleScalars 
snmptable -v 2c -c public -Ci localhost NET-SNMP-EXAMPLES-MIB::netSnmpIETFWGTable 
Try snmpset: 
snmpset -v 2c -c public localhost NET-SNMP-EXAMPLES-MIB::netSnmpExampleInteger.0 i 10 
snmpset -v 2c -c public localhost NET-SNMP-EXAMPLES-MIB::netSnmpExampleInteger.0 i 200 
snmpset -v 2c -c public localhost NET-SNMP-EXAMPLES-MIB::netSnmpExampleString.0 s "Test" 
''' 

import time 
import random 
import pyagentx 

def str_to_oid(data): 
    length = len(data) 
    oid_int = [str(ord(i)) for i in data] 
    return str(length) + '.' + '.'.join(oid_int) 


class NetSnmpTestMibScalar(pyagentx.Updater): 

    def update(self): 
     self.set_INTEGER('1.0', 1000) 
     self.set_OCTETSTRING('3.0', 'String for NET-SNMP-EXAMPLES-MIB') 
     self.set_OBJECTIDENTIFIER('4.0', '1.2') 
     self.set_IPADDRESS('5.0', '127.0.0.1') 
     self.set_COUNTER32('6.0', 2000) 
     self.set_GAUGE32('7.0', 2000) 
     self.set_TIMETICKS('8.0', 1000000) 
     self.set_OPAQUE('9.0', 'Test') 
     self.set_COUNTER64('10.0', 2000) 


class NetSnmpTestMibTable(pyagentx.Updater): 

    def update(self): 
     # implement netSnmpIETFWGTable from NET-SNMP-EXAMPLES-MIB.txt 
     # Number of entries in table is random to show that MIB is reset 
     # on every update 
     for i in range(random.randint(3, 5)): 
      idx = str_to_oid('group%s' % (i+1)) 
      self.set_OCTETSTRING('1.1.2.' + idx, 'member 1') 
      self.set_OCTETSTRING('1.1.3.' + idx, 'member 2') 


class NetSnmpIntegerSet(pyagentx.SetHandler): 

    def test(self, oid, data): 
     if int(data) > 100: 
      raise pyagentx.SetHandlerError() 

    def commit(self, oid, data): 
     print "COMMIT CALLED: %s = %s" % (oid, data) 


class MyAgent(pyagentx.Agent): 

    def setup(self): 
     self.register('1.3.6.1.4.1.8072.2.1', NetSnmpTestMibScalar) 
     self.register('1.3.6.1.4.1.8072.2.2', NetSnmpTestMibTable) 
     self.register_set('1.3.6.1.4.1.8072.2.1.1.0', NetSnmpIntegerSet) 


def main(): 
    pyagentx.setup_logging() 
    try: 
     a = MyAgent() 
     a.start() 
    except Exception as e: 
     print "Unhandled exception:", e 
     a.stop() 
    except KeyboardInterrupt: 
     a.stop() 

if __name__=="__main__": 
    main() 

Если я запускаю команду я получаю выход, как и ожидалось, но я не уверен, как это работает, как делает код знать, чтобы обновить netSnmpIETFWGTable? Как вы можете видеть, я могу прочитать значения из него установить этот пример кода:

snmptable -v 2c -c public -Ci localhost NET-SNMP-EXAMPLES-MIB::netSnmpIETFWGTable 
SNMP table: NET-SNMP-EXAMPLES-MIB::netSnmpIETFWGTable 

    index nsIETFWGChair1 nsIETFWGChair2 
"group1"  "member 1"  "member 2" 
"group2"  "member 1"  "member 2" 
"group3"  "member 1"  "member 2" 
+0

Я никогда не получал никакой обратной связи относительно ответа, который я оставил; это решило вашу проблему? Если бы это было так, то было бы оценено это как принятое. Благодарю. – miken32

+0

@ miken32 Я был в аварию после того, как написал это и не использовал компьютер за несколько месяцев до сегодняшнего дня - из-за сломанных костей, я проверю ваш ответ прямо сейчас! – Paul

ответ

1

имена объектов в MIB, как запись DNS, они просто указывают на an ugly number в фоновом режиме.

Глядя в NET-SNMP-EXAMPLES-MIB, вы можете видеть netSnmpIETFWGTable, определяемый как netSnmpExamples 2. Прокрутка по двум строкам показывает netSnmpExamples, определяемый как netSnmp 2. Это объявлено в разделе IMPORTS исходя из NET-SNMP-MIB, поэтому вам нужно посмотреть там, чтобы узнать, что такое netSnmp и т. Д. MIB является верхней частью цепочки для SNMP.

Что вы в итоге получаете то, что netSnmpIETFWGTable переводит на 1.3.6.1.4.1.8072.2.2.1. Глядя вниз на код инициализации в нижней части файла, вы можете увидеть родитель этого OID быть связан с классом:

self.register('1.3.6.1.4.1.8072.2.2', NetSnmpTestMibTable) 

Что следует надеяться ответить на ваш вопрос, «как же код знать, чтобы обновить netSnmpIETFWGTable «.


Вы также можете попробовать snmptranslate утилиту, которая проще, чем просматривать MIB файлы!

$ snmptranslate -On NET-SNMP-EXAMPLES-MIB::netSnmpIETFWGTable 
.1.3.6.1.4.1.8072.2.2.1 
$ snmptranslate -Of NET-SNMP-EXAMPLES-MIB::netSnmpIETFWGTable 
.iso.org.dod.internet.private.enterprises.netSnmp.netSnmpExamples.netSnmpExampleTables.netSnmpIETFWGTable 
$ snmptranslate 1.3.6.1.4.1.8072.2.2.1 
NET-SNMP-EXAMPLES-MIB::netSnmpIETFWGTable 
$ snmptranslate -Of 1.3.6.1.4.1.8072.2.2.1 
.iso.org.dod.internet.private.enterprises.netSnmp.netSnmpExamples.netSnmpExampleTables.netSnmpIETFWGTable 
+0

Итак, я получаю импорт NET-SNMP-MIB http://www.net-snmp.org/docs/mibs/NET-SNMP-MIB.txt Это та часть, которую я не получаю, где она отображается он переводится как 1.3.6.1.4.1.8072.2.2.1? Есть ли еще один шаг? Спасибо за помощь! Этот инструмент перевода удобен – Paul

+1

Когда MIB говорит «IMPORTS netSnmp FROM NET-SNMP-MIB», это означает, что он вытаскивает из другой MIB. Таким образом, вы можете видеть внутри MIB, что 'netSnmp' определяется как' предприятия 8072', который импортируется из 'SNMPv2-SMI' ... – miken32

Смежные вопросы