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

    [Featurewunsch] 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.

    #2
    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.

    Kommentar


      #3
      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.

      Kommentar


        #4
        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

        Kommentar


          #5
          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?

          Kommentar


            #6
            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

            Kommentar


              #7
              Hallo,
              ich habe eben einen PR gegen Develop gestellt, das neue Plugin mit aufzunehmen.
              Danke Euch.

              Kommentar

              Lädt...
              X