[geloest] snmpd - extend mit bash script - Ausgabe 4-stellig Integer Wert - wie ?

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
ds2k18
Beiträge: 6
Registriert: 22.08.2018 09:44:05

[geloest] snmpd - extend mit bash script - Ausgabe 4-stellig Integer Wert - wie ?

Beitrag von ds2k18 » 17.02.2020 11:33:51

Hallo,
ich muss via snmpd mit extend und BASH Script einen 4-stelligen Integer Wert ausgeben.
Leider hab ich das Problem das nur 0 bis 255 geht.
Und ich versteh nicht wie ich das ändern kann.

Wer kann mir sagen was man da machen kann ?
Danke

Nutze Debian 10.3 / buster + snmpd 5.7.3+dfsg-5


Ich lese von einem IoBroker via wget einen Temperaturwert aus.
Und hole mir dann die Temp. via cut aus dem file und schreibe es in eine Variable.
Und gebe diese aus.
Aber leider kommt das dann im SNMP als String raus und nicht als Integer
wenn ich mit exit 255 das script zu test beende, dann habe ich einen Integer wert von 255
aber mehr geht nicht sprich ab 256 wird der Interger Wert dann z.B: 0.

/etc/snmpd/snmpd.conf

Code: Alles auswählen

agentAddress  udp:0.0.0.0:161
rocommunity testing
extend V_TempWarm /scripts/get_V_TempWarm.sh
/scripts/get_V_TempWarm.sh

Code: Alles auswählen

#!/bin/bash
cd /scripts
wget http://192.168.1.14:8087/get/hm-rega.0.3457 >/dev/null 2>&1
TempWarm=`cat hm-rega.0.3457 | cut -d ":" -f 2 | cut -d "," -f1 | sed -e 's/\.//g' | sed -e 's/\"//g'`
echo $TempWarm
rm hm-rega.0.3457*

Code: Alles auswählen

$ snmpwalk -v2c -c testing 192.168.1.14 .1.3.6.1.4.1.8072.1.3.2.3.1.1.10.86.95.84.101.109.112.87.97.114.109
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."V_TempWarm" = STRING: 2210

Code: Alles auswählen

$ snmpwalk -v2c -c testing 192.168.1.14 nsExtendOutput1 | grep V_TempWarm
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."V_TempWarm" = STRING: 2200
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."V_TempWarm" = STRING: 2200
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."V_TempWarm" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendResult."V_TempWarm" = INTEGER: 0

Die OID hab ich per snmptranslate rausgefunden

Code: Alles auswählen

$ snmptranslate -On NET-SNMP-EXTEND-MIB::nsExtendOutput1Line.\"V_TempWarm\"
.1.3.6.1.4.1.8072.1.3.2.3.1.1.10.86.95.84.101.109.112.87.97.114.109
Zuletzt geändert von ds2k18 am 22.04.2020 14:58:30, insgesamt 2-mal geändert.

Benutzeravatar
snyborg
Beiträge: 256
Registriert: 08.08.2007 22:07:32
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: snmpd - extend mit bash script - Ausgabe 4-stellig Integer Wert - wie ?

Beitrag von snyborg » 27.02.2020 13:47:38

Hi,

exit takes only integer args in the range 0 - 255.

Musst du wohl auf anderem Wege lösen...
Wenn deine Freunde Linux haben, wechsel zu Linux.
Wenn deine Freunde BSD haben, wechsel zu BSD.
Wenn deine Freunde Windows haben, wechsel deine Freunde.

ds2k18
Beiträge: 6
Registriert: 22.08.2018 09:44:05

Re: snmpd - extend mit bash script - Ausgabe 4-stellig Integer Wert - wie ?

Beitrag von ds2k18 » 27.02.2020 13:53:44

Danke mit der zsh kann man auch andere exit Codes ausgeben.
Aber leider klappts damit auch nicht...

Code: Alles auswählen

exec zsh -c 'exit -- 12345'

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: snmpd - extend mit bash script - Ausgabe 4-stellig Integer Wert - wie ?

Beitrag von Meillo » 28.02.2020 09:46:20

Hoi.
ds2k18 hat geschrieben: ↑ zum Beitrag ↑
17.02.2020 11:33:51
ich muss via snmpd mit extend und BASH Script einen 4-stelligen Integer Wert ausgeben.
Leider hab ich das Problem das nur 0 bis 255 geht.
Und ich versteh nicht wie ich das ändern kann.
Was den Exit-Code angeht, so ist der, wie schon geschrieben wurde, nur im Bereich 0-255 definiert. Wenn die zsh irgendwie mehr kann, dann ist das schoen, aber sobald ein Programm dazwischen kommt, das kein zsh-Script ist, geht das nicht mehr. Also: Kein exit verwenden um den Wert zu transportieren.

Soweit ich das sehe, machst du das aber auch gar nicht, denn du gibst den Wert ja mit echo aus:
Ich lese von einem IoBroker via wget einen Temperaturwert aus.
Und hole mir dann die Temp. via cut aus dem file und schreibe es in eine Variable.
Und gebe diese aus.
Soweit so gut. Ich finde nur nicht die Stelle, wo der ausgegebene Wert weitergenutzt wird. Wo ist das und in welcher Weise wird er dort genutzt. Vielleicht kannst du das nochmal erklaeren.
Aber leider kommt das dann im SNMP als String raus und nicht als Integer
Die Shell, Input/Output und Kommandozeilenparameter sind immer nur Strings. Auf dieser Ebene gibt es keine Integer. Aber man kann die Strings als Integer interpraetieren, falls man damit rechnen will (z.B. expr(1) oder test(1)).

Beschreibe dein Problem doch noch genauer, dann koennen wir auch eher helfen.
Use ed once in a while!

ds2k18
Beiträge: 6
Registriert: 22.08.2018 09:44:05

Re: snmpd - extend mit bash script - Ausgabe 4-stellig Integer Wert - wie ?

Beitrag von ds2k18 » 06.04.2020 06:44:55

vielen Dank fuer die Mühe!

>Soweit so gut. Ich finde nur nicht die Stelle, wo der ausgegebene Wert weitergenutzt wird. Wo ist das und in welcher Weise wird er dort genutzt. Vielleicht kannst du das nochmal erklaeren.

SNMP Integer für Temperaturen von z.B. 0.00 - 45.00 Grad
da es mit dem Exit Code nicht klappt da 255 das höchst mögliche ist.
Wie bekomme ich es hin die Temperatur die ich vom ioBroker per WebAPI Abfrage in SNMP so abzubilden
das dies als Integer Wert abgefragt werden kann.

ich kann ja nur in /etc/snmp/snmpd.conf das extend verwenden da hab ich mein bash script
und wenn ich dann mit z.B. snmpwalk die abfrage mache is mein wert als STRING vorhanden.
sollte aber als INTEGER.

NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."V_TempWarm" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendResult."V_TempWarm" = INTEGER: 2200

statt:

NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."V_TempWarm" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendResult."V_TempWarm" = INTEGER: 0



Also das System das die Werte verarbeitet liest leider nur per SNMP aus
und benötigt einen integer Wert.


Danke

ds2k18
Beiträge: 6
Registriert: 22.08.2018 09:44:05

Re: snmpd - extend mit bash script - Ausgabe 4-stellig Integer Wert - wie ?

Beitrag von ds2k18 » 22.04.2020 14:53:10

Hab eine Loesung gefunden.

Via Perl Script als Agent

Code: Alles auswählen

apt-get install libsnmp-extension-passpersist-perl libsnmp-perl libwww-perl
/etc/snmp/snmpd.conf

Code: Alles auswählen

perl do "/scripts/get_V_temp.pl"
/scripts/get_V_temp.pl

Code: Alles auswählen

#!/usr/bin/perl
use NetSNMP::agent (':all');
use NetSNMP::ASN qw(ASN_OCTET_STR ASN_INTEGER);

sub hello_handler {
  my $url = 'http://192.168.1.14:8087/get/hm-rega.0.4028'; # V_TempKalt
  use LWP::Simple;
  my $content = get $url;
  die "Couldn't get $url" unless defined $content;
  $content =~ /.*:\"([-+]?[0-9]*\.?[0-9]+)\".*/;
  if (defined $1)
  {
  my $rounded = sprintf "%.0f", $1 * 100;

  my ($handler, $registration_info, $request_info, $requests) = @_;
  my $request;
  my $string_value = "V_TempKalt";
  my $integer_value = "$rounded";
  print $integer_value;

  for($request = $requests; $request; $request = $request->next()) {
    my $oid = $request->getOID();
    if ($request_info->getMode() == MODE_GET) {
      if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.2")) {
        $request->setValue(ASN_OCTET_STR, $string_value);
      }
      elsif ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.3")) {
        $request->setValue(ASN_INTEGER, $integer_value);
      }
    } elsif ($request_info->getMode() == MODE_GETNEXT) {
      if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.2")) {
        $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.3");
        $request->setValue(ASN_INTEGER, $integer_value);
      }
      elsif ($oid < new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.2")) {
        $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.2");
        $request->setValue(ASN_OCTET_STR, $string_value);
      }
    }
  }
}
}

my $agent = new NetSNMP::agent();
$agent->register("hello_world", ".1.3.6.1.4.1.8072.9999.9999",
                 \&hello_handler);

Code: Alles auswählen

snmpwalk -v2c -c testing 192.168.1.14 .1.3.6.1.4.1.8072.9999.9999.1.3
NET-SNMP-MIB::netSnmpPlaypen.1.3 = INTEGER: 2230

Antworten