Ankündigung

Einklappen
Keine Ankündigung bisher.

Status Netzwerkgeräte via SNMP bzw MIBS

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Sisamiwe
    antwortet
    Hallo,
    ich habe eben einen PR gegen Develop gestellt, das neue Plugin mit aufzunehmen.
    Danke Euch.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo,
    wieder mal eine Wortmeldung von mir.
    Zitat von Onkelandy Beitrag anzeigen
    Wenn man das alles in ein feines Plugin gießen könnte, wär das ne runde Sache.. Mal sehen, ob und wann ich dazu komm oder vielleicht magst dich ja noch reinhängen
    Ich habe ein Plugin (mein erstes) für SNMP Abfragen erstellt. Es ist aktuell in meinem Github zu finden. Ich habe es mit der Abfrage meiner QNAP NAS und einem RPI getestet.

    Offen ist noch die Fertigstellung des WebInterfaces. Das habe ich bislang nicht hin bekommen, wäre für Hilfe dankbar.
    Wenn das WebIF steht, möchte ich einen PR stellen, um das Plugin mit in den nächsten Release zu bekommen.

    Rückmeldung / Verbesserung gern an mich.
    Ich mache dann später noch einen eigenen Thread dafür.

    Beste Grüße

    PS
    WebIF funktioniert nun auch. Update ist einem Github (Link oben) ;o)
    Zuletzt geändert von Sisamiwe; 16.01.2020, 22:37. Grund: Nachtrag

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Onkelandy Beitrag anzeigen
    Danke für den coolen Ansatz, finde ich sehr spannend. Für mich ist das snmp Thema komplett neu, aber die Möglichkeiten erscheinen mir cool. Habe gesehen, dass für die Daten eigene MIB Dateien angeboten werden. Für QNAS zB: http://docs.qnap.com/esnas/2.0.0/en/...3EF004A16.html
    Oder hier eine große Sammlung: http://mibs.snmplabs.com/asn1/

    Nun gibt es dafür wohl auch einen Parster, der die Dateien für pysnmp sauber aufbereitet: http://snmplabs.com/pysmi/library-reference.html

    Wenn man das alles in ein feines Plugin gießen könnte, wär das ne runde Sache.. Mal sehen, ob und wann ich dazu komm oder vielleicht magst dich ja noch reinhängen
    Ja, dass ist ein guter Ansatz, Netzwerkgeräte zu überwachen und teilweise auch zu steuern. Ich glaube nicht, dass meine Programmierkenntnisse ohne Unterstützung für ein Plugin ausreichend sind. Vielleicht können wir es gemeinsam versuchen?

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Danke für den coolen Ansatz, finde ich sehr spannend. Für mich ist das snmp Thema komplett neu, aber die Möglichkeiten erscheinen mir cool. Habe gesehen, dass für die Daten eigene MIB Dateien angeboten werden. Für QNAS zB: http://docs.qnap.com/esnas/2.0.0/en/...3EF004A16.html
    Oder hier eine große Sammlung: http://mibs.snmplabs.com/asn1/

    Nun gibt es dafür wohl auch einen Parster, der die Dateien für pysnmp sauber aufbereitet: http://snmplabs.com/pysmi/library-reference.html

    Wenn man das alles in ein feines Plugin gießen könnte, wär das ne runde Sache.. Mal sehen, ob und wann ich dazu komm oder vielleicht magst dich ja noch reinhängen Sisamiwe

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo,

    heute kann ich mal hier was beisteuern.

    Ich habe eine Logik erstellt, mit der man den Status von Netzwerkgeräten via SNMP erfassen kann.
    Das geht so:

    1) Aktivieren des SNMP-Dienstes auf dem Netzwerkgerät; Die Logik funktioniert (erstmal) nur mit dem Protokoll V1/V2

    2) Installation der Linux/Debian Pakete und Reboot:
    Code:
    sudo apt-get install snmpd
    sudo apt-get install snmp
    sudo reboot
    3) Test
    Bei meiner QNAP NAS kann ich mit
    Code:
    snmpget -v 2c -c PASSWORD -O qv NASIPADDRESS 1.3.6.1.4.1.24681.1.2.11.1.3.1
    In der Konsole testen und bekomme als Antwort:
    Code:
    "37 C/98 F"
    Also geht!

    4) Installation des entsprechendes Python Paketes:
    Code:
    sudo pip3 install pysnmp
    5) shNG Logik
    Die Logik prüft alle item.yaml im item Ordner nach Items mit dem spezifischen Attribut "oid" und fragt die in dem Attribut angegebene OID ab und weist das Abfrageergebnis als str dem entsprechenden Items zu. Die Parameter für IP-Adresse, Port und Gruppe des abzufragenden Netzwerkgerätes müssen beim Parent-Item angelegt sein. (Siehe Beispiel)

    Die Logik rufe ich bei Neustart und dann alle 10 min mit cycle auf.

    logik.py
    Code:
    #!/usr/bin/env python3
    # snmp_1.py
    
    # Abfrage von OIDs vie SNMP mit Scan der Items nach Attribut "oid".
    
    from pysnmp.entity.rfc3413.oneliner import cmdgen
    import time
    
    logger.info("Logik SNMP: by :" + trigger['by'] )
    #logger.info("Logik SNMP: source :" + trigger['source'] )
    #logger.info("Logik SNMP: dest :" + trigger['dest'] )
    #logger.info("Logik SNMP: value :" + trigger['value'] )
    
    #SNMP_HOST = '192.168.2.9'
    #SNMP_PORT = 161
    #SNMP_COMMUNITY = 'meins'
     
    for item in sh.find_items('oid'):    # findet alle Items die ein Attribut 'oid' besitzen
        oid = item.conf['oid']
        snmp_host = item.return_parent().conf['snmp_host']
        snmp_port = item.return_parent().conf['snmp_port']
        snmp_community = item.return_parent().conf['snmp_community']
        
        #logger.info(oid)
        #logger.info(snmp_host)
        #logger.info(snmp_port)
        #logger.info(snmp_community)
        
        cmdGen = cmdgen.CommandGenerator()
        
        errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
        cmdgen.CommunityData(snmp_community),
        cmdgen.UdpTransportTarget((snmp_host, snmp_port)), (oid)
        )
        # Check for errors and print out results
        if errorIndication:
            logger.info(errorIndication)
        else:
            if errorStatus:
                logger.info('%s at %s' % (
                    errorStatus.prettyPrint(),
                    errorIndex and varBinds[int(errorIndex)-1] or '?'
                )
            )
            else:
                for name, val in varBinds:
                    #logger.info('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
                    item(str(val))
    6) shNG Items
    Es wird pro OID ein Item mit dem entsprechendem Attribut angelegt. Das Formatieren (Umwandeln von str nach float, kürzen etc) erfolgt direkt in einem eval im jeweiligen Item. Anbei meine Items für eine QNAP NAS.

    item.yaml
    Code:
    %YAML 1.1
    ---
    
    snmp:
    
        ts251:
            snmp_host: '192.168.2.9'
            snmp_port: '161'
            snmp_community: 'meins'
    
            cpu_temp:
                name: CPU-Temperatur in °C
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.5.0"
                #34 C/93 F
                eval: float(value[:2])
            cpu_usage:
                name: CPU-Auslastung [0-1]
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.1.0"
                #4.40 %
                eval: float(value[:-2] / 100)
                
            system_temp:
                name: SystemTemperatur in °C
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.6.0"
                #34 C/93 F
                eval: float(value[:2])
                
            RAM_size:
                name: RAM in MB
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.2.0"
                #3839.9 MB
                eval: float(value[:-3])
                
            RAM_free:
                name: freier RAM in MB
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.3.0"
                #2785.5 MB
                eval: float(value[:-3])
                
            RAM_usage:
                name: RAM belegt [0-1]
                type: num
                eval: (sh...RAM_size() - sh...RAM_free()) / sh...RAM_size()
                eval_trigger:
                  - ..RAM_size
                  - ..RAM_free  
    
    #        hdnum:
    #            name: Anzahl der HDDs
    #            type: num
    #            oid: "1.3.6.1.4.1.24681.1.4.1.1.1.1.5.1.0"
    #            #2
    #            eval: float(value)
            
            hdd1_temp:
                name: HDD1 Temperatur in °C
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.11.1.3.1"
                #33 C/91 F
                eval: float(value[:2])
                
            hdd2_temp:
                name: HDD2 Temperatur in °C
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.11.1.3.2"
                #31 C/87 F
                eval: float(value[:2])
            
            hdd1_status:
                name: HDD1 Status
                type: str
                oid: "1.3.6.1.4.1.24681.1.2.11.1.7.1"
                #GOOD
                eval: str(value)
                
            hdd2_status:
                name: HDD2 Status
                type: str
                oid: "1.3.6.1.4.1.24681.1.2.11.1.7.2"
                #GOOD
                eval: str(value)
                
            fan_rpm:
                name: Lüfterdrehzahl in rpm
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.15.1.3.1"
                #1163 RPM
                eval: float(value[:-4])
                
    #        fan_count:
    #            name: Anzahl der Lüfter
    #            type: num
    #            oid: "1.3.6.1.4.1.24681.1.2.14.0"
    #            #1
    #            eval: float(value)
            
            disk_size:
                name: Speicher in MB
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.17.1.4.1"
                #1.37 TB
                eval: float(value[:-3]) * 1024
            
            disk_free:
                name: Freier Speicher in MB
                type: num
                oid: "1.3.6.1.4.1.24681.1.2.17.1.5.1"
                #1.37 TB
                eval: float(value[:-3]) * 1024
                
            disk_usage:
                name: HDD belegt [0-1]
                type: num
                eval: (sh...disk_size() - sh...disk_free()) / sh...disk_size()
                eval_trigger:
                  - ..disk_free
                  - ..disk_size         
    
    #        volume_count:
    #            type: num
    #            oid: "1.3.6.1.4.1.24681.1.2.16.0"
    #            #1
    #            eval: float(value)
    
            volume1_status:
                name: Status des Volume1
                type: str
                oid: "1.3.6.1.4.1.24681.1.2.17.1.6.1"
                #Ready
                eval: str(value)
            
            netuptime:
                type: num
                oid: "1.3.6.1.2.1.1.3.0"
                #9311124
                eval: float(value)
            
            sysuptime:
                type: num
                oid: "1.3.6.1.2.1.25.1.1.0"
                #68919188
                eval: float(value)
            
            model:
                type: str
                oid: "1.3.6.1.4.1.24681.1.2.12.0"
                #TS-251
                eval: str(value)
            
            name:
                type: str
                oid: "1.3.6.1.4.1.24681.1.2.13.0"
                #0x4e41532d54533235310a | NAS-TS251
            
            firmware:
                type: str
                oid: "1.3.6.1.2.1.47.1.1.1.1.9.1"
                #0x342e332e360a | 4.3.6
    Verbesserungsvorschläge etc werden gern angenommen!

    Viel Spaß bei der Anwendung.

    Einen Kommentar schreiben:


  • Sandman60
    antwortet
    Ja, ich habe da schon mal damit experimentiert um bspw. das NAS auszulesen. Hat es aber nie über Beta mangels Zeit hinausgeschafft worauf ich es eingestampft habe. Ideen und Featurerequests gab es auch schon hier im Forum, aber dann hat man nix mehr gehört. Selbst ist der Mann würde ich sagen.

    Einen Kommentar schreiben:


  • Sisamiwe
    hat ein Thema erstellt [Featurewunsch] Status Netzwerkgeräte via SNMP bzw MIBS

    Status Netzwerkgeräte via SNMP bzw MIBS

    Hallo,

    gab es schon mal Gedanken/Überlegungen für ein Plugin / Logic um den Status von Netzwerkgeräten über SNMP bzw, MIBS zu erfassen und in shNG einzubinden?
    Soweit ich recherchiert habe, gibt es ein Debian Paket für SNMP sowie ein Python Modul, um die Daten abzufragen.

    Danke für Eure Rückmeldungen.
Lädt...
X