2016-04-05 16 views
0

Python ile pyagentx (snmp ajanlarını uzatma) arıyorum. https://github.com/rayed/pyagentxpyagentx snmp, kod MIB'ye nasıl bağlanır?

Örnek kodun MIB'ye nasıl bağlandığını takip etmiyorum. Beklediğim gibi çıktı almak bir komutu çalıştırmak ama nasıl çalıştığını, nasıl kod netSnmpIETFWGTable güncellemek için biliyor emin isem Örnek burada olacağını class NetSnmpTestMibTableNET-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() 

den netSnmpIETFWGTable ile bağlantılı olduğundan? Eğer bu örnek kod tarafından belirlenen dan i değerlerini okuyabilir görebileceğiniz gibi : MIB yılında

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

Kaldığım cevapla ilgili hiçbir geri bildirim almadım; sorununu çözdü mü? Eğer yapmış olsaydı, kabul edilmiş olarak kabul edilirdi; Teşekkürler. – miken32

+0

@ miken32 Bunu yazdıktan ve aylar arasında bugüne kadar bilgisayar kullanmadığım bir kaza geçirdim - kırık kemikler yüzünden, şimdi cevabınızı kontrol edeceğim! – Paul

cevap

1

Nesne adları DNS girişi gibiler, sadece arka planda an ugly number işaret ediyoruz.

NET-SNMP-EXAMPLES-MIB'da, netSnmpExamples 2 olarak tanımlanmış netSnmpIETFWGTable'u görebilirsiniz. Birkaç satırda kaydırma yapmaknetSnmp 2 olarak tanımlanmıştır. Bu, IMPORTS bölümünde NET-SNMP-MIB'dan itibaren bildirilmiştir, dolayısıyla netSnmp'un neye benzediğini görmek için oraya bakmanız gerekir. SNMPv2-SMI MIB, SNMP için zincirin en üstündedir.

Sonunda elde ettiğiniz sonuç netSnmpIETFWGTable'un 1.3.6.1.4.1.8072.2.2.1'a çevrilmesidir. Dosyanızın altındaki başlatma kodu aşağı baktığımızda, bu OSB üst sınıfa ile bağlantılı olduğundan görebiliriz:

self.register('1.3.6.1.4.1.8072.2.2', NetSnmpTestMibTable) 

umarım sorunuza cevap gerektiğini "nasıl kod netSnmpIETFWGTable güncellemek biliyor ."


Ayrıca snmptranslate programı, MIB dosyaları bakarak daha kolay deneyebilirsiniz!

$ 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'nin içeri aktarımı için http://www.net-snmp.org/docs/mibs/NET-SNMP-MIB.txt Bu benim elde edemediğim bölüm, nerede gösteriliyor? 1.3.6.1.4.1.8072.2.2.1 olarak tercüme edildi mi? Başka bir adım var mı? Yardım için teşekkürler! Bu çevirme aracı kullanışlı – Paul

+1

MIB, NET-SNMP-MIB'DEN NETPINTS IMPORTS diyorsa, başka bir MIB'den geliyor demektir. Yani bu MIB'nin içinde 'netSnmp'' SNMPv2-SMI'den içe aktarılan '8072' işletmeleri olarak tanımlandığını görebilirsiniz ... – miken32