Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SNMP Trap senden mit Indy ? (https://www.delphipraxis.net/140568-snmp-trap-senden-mit-indy.html)

moelski 21. Sep 2009 09:30


SNMP Trap senden mit Indy ?
 
Moin !

Ich versuche gerade mittels SNMP einen Trap zu senden.
Leider klappt das nicht wirklich.

Als Trap Receiver nutze ich den hier:
http://www.net-snmp.org/

snmptrapd -f -Lo -c SNMPAuto.txt
wobei SNMPAuto.txt so aussieht:
Zitat:

disableAuthorization yes
Als Code nutze ich das hier:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var trap : Integer;
begin
    IdSNMP1.Trap.Host := '192.168.30.105';
    IdSNMP1.Trap.Community := 'public';
    IdSNMP1.Trap.PDUType := $a4;
    IdSNMP1.Trap.GenTrap := 2;
    IdSNMP1.Trap.SpecTrap := 0;
    IdSNMP1.Trap.MIBValue.Add('Testtrap');
    IdSNMP1.Trap.MIBOID.Add('1.3.6.1.2.1.1.1');
    IdSNMP1.Trap.Port := 162;

    Trap := IdSNMP1.SendTrap;
end;
Aber leider bekomme ich als Antwort:
Zitat:

Bad PDU type received: 0x24
Und auch wenn ich einen anderen Trap Receiver nutze kommt nix an.

Hat jemand ein funktionierendes Trap Beispiel, was man mal nachvollziehen kann?
Oder sieht hier jemand einen Fehler im Code !?

Klaus01 21. Sep 2009 09:34

Re: SNMP Trap senden mit Indy ?
 
Guten Morgen,

bist Du dir sicher den PDUType für Traps auf $a4 zu setzen
und nicht nur auf $04?

Delphi-Quellcode:
IdSNMP1.Trap.PDUType := $a4;
Ich weiß, das im SNMP Packet $a4 steht aber laut
RFC ist der Type für Traps $04.

Vielleicht bastelt Indy ja aus den $04 ein $a4.

Grüße
Klaus

moelski 21. Sep 2009 09:37

Re: SNMP Trap senden mit Indy ?
 
Moin Klaus,

Zitat:

bist Du dir sicher den PDUType für Traps auf $a4 zu setzen
und nicht nur auf $04?
Nuja, in idsnmp.pas ist folgendes deklariert:
Delphi-Quellcode:
const
  //PDU type
  PDUGetRequest    = $a0;
  PDUGetNextRequest = $a1;
  PDUGetResponse   = $a2;
  PDUSetRequest    = $a3;
  PDUTrap          = $a4;
Aber auch wenn ich
Delphi-Quellcode:
    IdSNMP1.Trap.PDUType := $04;
verwende klappt das nicht wirklich. :gruebel:

Klaus01 21. Sep 2009 09:51

Re: SNMP Trap senden mit Indy ?
 
.. hast Du schon mal den Traffic mit Wireshark mitprotokolliert
und Dir das Trap (SNMP) Packet angeschaut?

Grüße
Klaus

Klaus01 21. Sep 2009 10:21

Re: SNMP Trap senden mit Indy ?
 
Hallo Dominik,

ich habe Deinen Code mal bei mir probiert (Indy 10 mit TDE)
und ich bekomme keine Fehlermeldung bzgl. eines nicht korrekten PDUTypes:

Das ist was auf der Linuxbox angekommen ist:
Zitat:

# snmptrapd -f -Lo -d -c autho.txt
Code:
Received 56 bytes from UDP: [192.168.242.1]:3407
0000: 30 36 02 01  00 04 06 70  75 62 6C 69  63 A4 29 06    06.....public.).
0016: 01 00 40 04  00 00 00 00  02 01 02 02  01 00 43 01    ..@...........C.
0032: 00 30 15 30  13 06 07 2B 06 01 02 01  01 01 04 08    .0.0...+........
0048: 54 65 73 74  74 72 61 70                              Testtrap
2009-09-21 11:18:02 0.0.0.0(via UDP: [192.168.242.1]:3407) TRAP, SNMP v1, community public
SNMPv2-SMI::zeroDotZero Link Down Trap (0) Uptime: 0:00:00.00
SNMPv2-MIB::sysDescr = STRING: Testtrap

Grüße
Klaus

moelski 21. Sep 2009 11:11

Re: SNMP Trap senden mit Indy ?
 
Moin Klaus,

das ist schon komisch.

Zitat:

Received 56 bytes from UDP: [0.0.0.0]->[192.168.30.105]:4858
0000: 30 36 02 01 00 04 06 70 75 62 6C 69 63 24 29 06 06.....public$).
0016: 01 00 40 04 41 3F 1E 69 02 01 02 02 01 00 43 01 ..@.A?.i......C.
0032: 00 30 15 30 13 06 07 2B 06 01 02 01 01 01 04 08 .0.0...+........
0048: 54 65 73 74 74 72 61 70 Testtrap

Bad PDU type received: 0x24

Received 35 bytes from UDP: [0.0.0.0]->[127.0.0.1]:4861
0000: 30 21 02 01 00 04 06 70 75 62 6C 69 63 A4 14 06 0!.....publicñ..
0016: 01 00 40 04 00 00 00 00 02 01 00 02 01 00 43 01 ..@...........C.
0032: 00 30 00 .0.

2009-09-21 11:46:19 pdb4984n [0.0.0.0] (via UDP: [0.0.0.0]->[127.0.0.1]:4861) TRAP, SNMP v1, community public
ccitt.0 Cold Start Trap (0) Uptime: 0:00:00.00
Das kommt bei mir. Der erste Teil ist von meinem Testprog und der zweite stammt von snmptrap.

Man kann gut sehen das der PDUTyp falsch ist. Frage ist nur warum ...
Kann des evtl. an Delphi 2009 / UniCode liegen ?

Klaus01 21. Sep 2009 11:30

Re: SNMP Trap senden mit Indy ?
 
Zitat:

Zitat von moelski
Kann des evtl. an Delphi 2009 / UniCode liegen ?

Hallo Dominik,

kann ich mir nicht vorstellen das dies ein Problem vom UniCode sein sollte.
Der PDUType ist ja auch nicht vom Typ String sondern ein Integer.

Die sendTrap Routine schaut auch nicht so aus als ob da
ein Fehler drin stecken würde:

Delphi-Quellcode:
//Aus Indy 10.1.5
(*----------------------------------------------------------------------------*
 | TIdSNMP.SendTrap                                                          |
 |                                                                            |
 | Send an SNMP trap.                                                        |
 |                                                                            |
 | The function returns 1                                                     |
 *----------------------------------------------------------------------------*)
function TIdSNMP.SendTrap: integer;
begin
  Trap.PDUType := PDUTrap;
  Trap.EncodeTrap;
  Send(Trap.Host, Trap.Port, Trap.Buffer);
  Result := 1;
end;
Grüße
Klaus

moelski 21. Sep 2009 11:45

Re: SNMP Trap senden mit Indy ?
 
Moin !

Es liegt an dieser Funktion:
Delphi-Quellcode:
function ToBytes(const AValue: string; const ALength: Integer; const AIndex: Integer = 1;
  const AEncoding: TIdEncoding = en7Bit): TIdBytes; overload;
var
  LLength: Integer;
begin
  ValidEncoding(AEncoding);
  LLength := IndyLength(AValue, ALength, AIndex);
  if LLength > 0 then
  begin
    if AEncoding = enUTF8 then begin
      Result := StringToUTF8Bytes(AValue, AIndex, LLength);
    end else
    begin
      // do just a byte to byte copy with no translation. VCL uses ANSI or MBCS.
      // With MBCS we still map 1:1
      SetLength(Result, LLength);
      CopyTIdString(AValue, AIndex, Result, 0, LLength,AEncoding);
    end;
  end else begin
    SetLength(Result, 0);
  end;
end;
Zu finden in IdGlobal.

Dort wird es zu en7Bit codiert und da verliert das $A4 ein $80 und "mutiert" zum $24 ...

Nu is die Frage wie man diese Codierung vorher beeinflussen kann.

Aufgerufen wird das übrigens von:
Delphi-Quellcode:
function ToBytes(const AValue: string; const AEncoding: TIdEncoding = en7Bit): TIdBytes; overload;
{$IFDEF USEINLINE}inline;{$ENDIF}
begin
  Result := ToBytes(AValue, -1, 1, AEncoding);
end;
Und das wiederum von
Delphi-Quellcode:
procedure TIdUDPBase.Send(const AHost: string; const APort: TIdPort; const AData: string);
begin
  SendBuffer(AHost, APort, ToBytes(AData));
end;
Tja nu steht man(-n) im Wald. Das Indy Buch schweigt sich dazu auch ganz brilliant aus :x

Any idea ?

Klaus01 21. Sep 2009 11:54

Re: SNMP Trap senden mit Indy ?
 
.. nun wenn ich das in der Hilfe lese, verstehe ich nicht mehr:

Zitat:

Zitat von DelphiHilfe
A TIdEncoding value is passed to to ToBytes to indicate the character set encoding required for values in the TIdBytes return value.

TIdEncoding values are used on the .Net platform. Character set encodings are ignored in the VCL.

Vielleicht doch mal das neueste Indy installieren?

Grüße
Klaus

moelski 21. Sep 2009 11:59

Re: SNMP Trap senden mit Indy ?
 
Moin !

Zitat:

Vielleicht doch mal das neueste Indy installieren?
Jo das habe ich mittlerweile auch gelesen. Nur komme ich nicht auf den SVN Server:
svn://svn.atozed.com/indy/indy10

Ist der momentan offline ?

Klaus01 21. Sep 2009 12:06

Re: SNMP Trap senden mit Indy ?
 
Zitat:

Zitat von moelski
Moin !

Zitat:

Vielleicht doch mal das neueste Indy installieren?
Jo das habe ich mittlerweile auch gelesen. Nur komme ich nicht auf den SVN Server:
svn://svn.atozed.com/indy/indy10

Ist der momentan offline ?

Es schaut ganz so aus?

Aber Du kannst es ja hier versuchen.

Grüße
Klaus

moelski 21. Sep 2009 12:13

Re: SNMP Trap senden mit Indy ?
 
Jo hab ich dann auch gemacht.

Das löst aber immer noch nicht das SNMP Problem.
Denn beim Aufruf wird kein Encoding übergeben und ich kann auch keins angeben. :pale:

moelski 21. Sep 2009 12:30

Re: SNMP Trap senden mit Indy ?
 
Moin !

Hmm selbst wenn ich das Encoding mit angebe:
Delphi-Quellcode:
function TIdSNMP.SendTrap: integer;
begin
  Trap.PDUType := PDUTrap;
  Trap.EncodeTrap;
  Send(Trap.Host, Trap.Port, Trap.Buffer, en8Bit);
  Result := 1;
end;
funktioniert das noch nicht.

Evtl. noch jemand ne Idee wie ich das nun hinbiegen kann?

Klaus01 21. Sep 2009 12:41

Re: SNMP Trap senden mit Indy ?
 
.. und Du bist Dir sicher mit der neuen zu arbeiten?

Was gibt denn idsnmp1.version für eine Versionsbezeichnung aus?

Delphi-Quellcode:
// aus tIdGlobal.pas
function ToBytes(
  const AValue: string;
  const AEncoding: TIdEncoding = enANSI
  ): TIdBytes; overload;
begin
  EIdException.IfTrue(AEncoding = enDefault, 'No encoding specified.'); {do not localize}
  {$IFDEF DotNet}
  case AEncoding of
    enANSI: Result := System.Text.Encoding.ASCII.GetBytes(AValue);
    enUTF8: Result := System.Text.Encoding.UTF8.GetBytes(AValue);
  end;
  {$ELSE}
  // For now we just ignore encodings in VCL
  SetLength(Result, Length(AValue));
  if AValue <> '' then begin
    Move(AValue[1], Result[0], Length(AValue));
  end;
  {$ENDIF}
end;
Grüße
Klaus

moelski 21. Sep 2009 14:44

Re: SNMP Trap senden mit Indy ?
 
Moin !

So, nachdem ich dann nochmal alles kontrolliert habe (da waren noch ein paar alte DCUs :angel2: ) geht es nun wenn ich folgendes mache:
Delphi-Quellcode:
function TIdSNMP.SendTrap: integer;
begin
  Trap.PDUType := PDUTrap;
  Trap.EncodeTrap;
  Send(Trap.Host, Trap.Port, Trap.Buffer, en8Bit);
  Result := 1;
end;
Das ist nun aber in der IdSNMP.pas geändert was mir nicht wirklich gefällt.
Im Prinzip könnte man es ja auch anders aufrufen wenn denn Buffer nicht protected wäre ...

Muss ich jetzt wirklich die Klasse ableiten und SendTrap überschreiben !?

Klaus01 21. Sep 2009 17:46

Re: SNMP Trap senden mit Indy ?
 
Hallo Dominik,

hast Du dir die Indy10 oder IndyTiburon gezogen?

Du solltest besser die Tiburon verwenden.
Hinweis

Grüße
Klaus

moelski 21. Sep 2009 19:43

Re: SNMP Trap senden mit Indy ?
 
Moin !

Jo ich habe das Tiburon ZIP genommen.
Das andere hatte auch nicht alle Units dabei.

Was mir aber immer noch nicht klar ist ...
was ist nun der einfachste weg um einen Trap 8Bit codiert zu versenden?

Die Original Units patchen ist sicher der schlechteste Weg .....

Klaus01 21. Sep 2009 19:53

Re: SNMP Trap senden mit Indy ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend Dominik,

ich hege den stillen Verdacht, dass Du immer noch mit den
"alten" Indys arbeitest.

Hast Du die Bibliothekspfade angepasst?

Anbei findest Du alle toBytes Funktionen aus idGlobal.
Deren default Einstellungen für das Encoding ist nil.

Grüße
Klaus

moelski 21. Sep 2009 20:11

Re: SNMP Trap senden mit Indy ?
 
Moin !

Hmm aber .version zeigt mit 10.5.7.

Zitat:

Deren default Einstellungen für das Encoding ist nil.
ebend ... Und wenn ich das recht verstanden habe dann ist Default bei Indy 7Bit Codierung.

Klaus01 21. Sep 2009 20:19

Re: SNMP Trap senden mit Indy ?
 
ach, das wird ja immer rätselhafter.
Mit der 10.1.5 (welche ja älter ist als die Deine) habe ich es ja heute
früh getestet und es lief - aus welchen Gründen auch immer.

Ich weiß da langsam keinen Rat mehr.

Grüße
Klaus

moelski 23. Sep 2009 12:39

Re: SNMP Trap senden mit Indy ?
 
Moin Klaus,

ich werde mir einfach die SNMP Unit kopieren und nach meinen Anforderungen anpassen.

Danke jedenfalls für deine Hilfe !


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz