From fb0759c8f28cd744c37a2c8960619d34f76145d4 Mon Sep 17 00:00:00 2001 From: geby Date: Wed, 23 Apr 2008 20:39:31 +0000 Subject: [PATCH] Release 10 git-svn-id: https://svn.code.sf.net/p/synalist/code/trunk@21 7c85be65-684b-0410-a082-b2ed4fbef004 --- asn1util.pas | 144 ++++++++++++++++++++++---------------------- snmpsend.pas | 165 ++++++++++++++++++++++++++++++++++----------------- snmptrap.pas | 6 +- sntpsend.pas | 2 +- 4 files changed, 188 insertions(+), 129 deletions(-) diff --git a/asn1util.pas b/asn1util.pas index a47878a..6087221 100644 --- a/asn1util.pas +++ b/asn1util.pas @@ -33,14 +33,14 @@ uses SysUtils, SynaUtil; const - ASN1_INT = $02; - ASN1_OCTSTR = $04; - ASN1_NULL = $05; - ASN1_OBJID = $06; - ASN1_SEQ = $30; - ASN1_IPADDR = $40; - ASN1_COUNTER = $41; - ASN1_GAUGE = $42; + ASN1_INT = $02; + ASN1_OCTSTR = $04; + ASN1_NULL = $05; + ASN1_OBJID = $06; + ASN1_SEQ = $30; + ASN1_IPADDR = $40; + ASN1_COUNTER = $41; + ASN1_GAUGE = $42; ASN1_TIMETICKS = $43; function ASNEncLen(Len: integer): string; @@ -61,11 +61,11 @@ begin if (Len < $FF) then Result := Char($81) + Char(Len) else - begin - x := Len div $FF; - y := Len mod $FF; - Result := Char($82) + Char(x) + Char(y); - end; + begin + x := Len div $FF; + y := Len mod $FF; + Result := Char($82) + Char(x) + Char(y); + end; end; function ASNDecLen(var Start: integer; Buffer: string): integer; @@ -74,25 +74,25 @@ var begin x := Ord(Buffer[Start]); if (x < $80) then - begin - Inc(Start); - Result := x; - end + begin + Inc(Start); + Result := x; + end else if (x = $81) then - begin - Inc(Start); - Result := Ord(Buffer[Start]); - Inc(Start); - end + begin + Inc(Start); + Result := Ord(Buffer[Start]); + Inc(Start); + end else - begin - Inc(Start); - x := Ord(Buffer[Start]); - Inc(Start); - Result := x * $FF + Ord(Buffer[Start]); - Inc(Start); - end; + begin + Inc(Start); + x := Ord(Buffer[Start]); + Inc(Start); + Result := x * $FF + Ord(Buffer[Start]); + Inc(Start); + end; end; function ASNEncInt(Len: integer): string; @@ -104,17 +104,17 @@ begin y := Len div $FFFFFF; Len := Len - (y * $FFFFFF); if ((y > 0) or (j = 1)) then - begin - j := 1; - Result := Result + Char(y); - end; + begin + j := 1; + Result := Result + Char(y); + end; y := Len div $FFFF; Len := Len - (y * $FFFF); if ((y > 0) or (j = 1)) then - begin - j := 1; - Result := Result + Char(y); - end; + begin + j := 1; + Result := Result + Char(y); + end; y := Len div $FF; Len := Len - (y * $FF); if ((y > 0) or (j = 1)) then @@ -140,60 +140,60 @@ begin ASNSize := ASNDecLen(Start, Buffer); Result := ''; if ((ASNType and $20) > 0) then - begin - Result := '$' + IntToHex(ASNType, 2); - end + begin + Result := '$' + IntToHex(ASNType, 2); + end else case ASNType of ASN1_INT, ASN1_COUNTER, ASN1_GAUGE, ASN1_TIMETICKS: begin y := 0; - for n:=1 to ASNSize do - begin - y := y * 256 + Ord(Buffer[Start]); - Inc(Start); - end; + for n := 1 to ASNSize do + begin + y := y * 256 + Ord(Buffer[Start]); + Inc(Start); + end; Result := IntToStr(y); end; ASN1_OCTSTR, $44: begin - for n:=1 to ASNSize do - begin - c := Char(Buffer[Start]); - Inc(Start); - s := s + c; - end; + for n := 1 to ASNSize do + begin + c := Char(Buffer[Start]); + Inc(Start); + s := s + c; + end; Result := s; end; ASN1_OBJID: begin - for n:=1 to ASNSize do - begin - c := Char(Buffer[Start]); - Inc(Start); - s := s + c; - end; + for n := 1 to ASNSize do + begin + c := Char(Buffer[Start]); + Inc(Start); + s := s + c; + end; Result := IdToMib(s); end; ASN1_IPADDR: begin - s:=''; - for n:=1 to ASNSize do - begin - if (n<>1) then - s := s + '.'; - y := Ord(Buffer[Start]); - Inc(Start); - s := s + IntToStr(y); - end; + s := ''; + for n := 1 to ASNSize do + begin + if (n <> 1) then + s := s + '.'; + y := Ord(Buffer[Start]); + Inc(Start); + s := s + IntToStr(y); + end; Result := s; end; - else // NULL - begin - Result := ''; - Inc(Start); - Start := Start + ASNSize; - end; + else // NULL + begin + Result := ''; + Inc(Start); + Start := Start + ASNSize; + end; end; end; diff --git a/snmpsend.pas b/snmpsend.pas index c21bfb9..ef58548 100644 --- a/snmpsend.pas +++ b/snmpsend.pas @@ -1,5 +1,5 @@ {==============================================================================| -| Project : Delphree - Synapse | 001.001.000 | +| Project : Delphree - Synapse | 002.000.000 | |==============================================================================| | Content: SNMP client | |==============================================================================| @@ -18,6 +18,7 @@ | All Rights Reserved. | |==============================================================================| | Contributor(s): | +| Jean-Fabien Connault (jfconnault@mail.dotcom.fr) | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.mlp.cz/space/gebauerl/synapse/) | @@ -49,9 +50,23 @@ EGenErr=5; type +TSNMPMibValueType = (smvtInteger, + smvtOctetString, + smvtNull, + smvtObjectId, + smvtSequence, + smvtIpAddress, + smvtCounter, + smvtGauge, + smvtTimeTicks); + +TSNMPMib = class + OID: string; + Value: string; + ValueType: integer; +end; + TSNMPRec=class(TObject) - private - procedure SyncMIB; public version:integer; community:string; @@ -59,16 +74,16 @@ TSNMPRec=class(TObject) ID:integer; ErrorStatus:integer; ErrorIndex:integer; - MIBOID:TStringList; - MIBValue:TStringList; + SNMPMibList: TList; constructor Create; destructor Destroy; override; procedure DecodeBuf(Buffer:string); function EncodeBuf:string; procedure Clear; - procedure MIBAdd(MIB,Value:string); + procedure MIBAdd(MIB,Value:string; ValueType:TSNMPMibValueType); procedure MIBdelete(Index:integer); function MIBGet(MIB:string):string; + function ConvertValueType(ValueType: TSNMPMibValueType): integer; end; TSNMPSend=class(TObject) @@ -76,8 +91,8 @@ TSNMPSend=class(TObject) Sock:TUDPBlockSocket; Buffer:string; public - timeout:integer; - SNMPhost:string; + Timeout:integer; + Host:string; Query:TSNMPrec; Reply:TSNMPrec; constructor Create; @@ -85,7 +100,8 @@ TSNMPSend=class(TObject) function DoIt:boolean; end; -function SNMPget (Mib, Community, SNMPHost:string; var Value:string):Boolean; +function SNMPget (Oid, Community, SNMPHost:string; var Value:string):Boolean; +function SNMPSet (Oid, Community, SNMPHost, Value: string; ValueType: TSNMPMibValueType): boolean; implementation @@ -95,34 +111,23 @@ implementation constructor TSNMPRec.Create; begin inherited create; - MIBOID:=TStringList.create; - MIBValue:=TStringList.create; + SNMPMibList := TList.create; end; {TSNMPRec.Destroy} destructor TSNMPRec.Destroy; begin - MIBValue.Free; - MIBOID.Free; + SNMPMibList.free; inherited destroy; end; -{TSNMPRec.SyncMIB} -procedure TSNMPRec.SyncMIB; -var - n,x:integer; -begin - x:=MIBValue.Count; - for n:=x to MIBOID.Count-1 do - MIBValue.Add(''); -end; - {TSNMPRec.DecodeBuf} procedure TSNMPRec.DecodeBuf(Buffer:string); var Pos:integer; endpos:integer; sm,sv:string; + svt: TSNMPMibValueType; begin Pos:=2; Endpos:=ASNDecLen(Pos,buffer); @@ -138,22 +143,33 @@ begin ASNItem(Pos,buffer); Sm:=ASNItem(Pos,buffer); Sv:=ASNItem(Pos,buffer); - Self.MIBadd(sm,sv); + Svt:=smvtNull; + Self.MIBadd(sm,sv, svt); end; end; {TSNMPRec.EncodeBuf} function TSNMPRec.EncodeBuf:string; var - data,s:string; + data,s,t:string; + SNMPMib: TSNMPMib; n:integer; begin data:=''; - SyncMIB; - for n:=0 to Self.MIBOID.Count-1 do + for n:=0 to SNMPMibList.Count-1 do begin - s:=ASNObject(MibToID(Self.MIBOID[n]),6)+ASNObject(Self.MIBValue[n],4); - data:=data+ASNObject(s,$30); + SNMPMib := SNMPMibList[n]; + case (SNMPMib.ValueType) of + ASN1_INT, ASN1_COUNTER, ASN1_GAUGE, ASN1_TIMETICKS: + begin + t := chr(strToInt('$'+copy(inttohex(strToInt(SNMPMib.Value),4),1,2))); + t := t+chr(strToInt('$'+copy(inttohex(strToInt(SNMPMib.Value),4),3,2))); + s := ASNObject(MibToID(SNMPMib.OID),6) + ASNObject(t,SNMPMib.ValueType); + end; + else + s := ASNObject(MibToID(SNMPMib.OID),6) + ASNObject(SNMPMib.Value,SNMPMib.ValueType); + end; + data := data + ASNObject(s, $30); end; data:=ASNObject(data,$30); data:=ASNObject(char(Self.ID),2) @@ -169,6 +185,8 @@ end; {TSNMPRec.Clear} procedure TSNMPRec.Clear; +var + i:integer; begin version:=0; community:=''; @@ -176,41 +194,65 @@ begin ID:=0; ErrorStatus:=0; ErrorIndex:=0; - MIBOID.Clear; - MIBValue.Clear; + for i := 0 to SNMPMibList.count - 1 do + TSNMPMib(SNMPMibList[i]).Free; + SNMPMibList.Clear; end; {TSNMPRec.MIBAdd} -procedure TSNMPRec.MIBAdd(MIB,Value:string); +procedure TSNMPRec.MIBAdd(MIB,Value:string; ValueType:TSNMPMibValueType); var - x:integer; + SNMPMib: TSNMPMib; begin - SyncMIB; - MIBOID.Add(MIB); - x:=MIBOID.Count; - if MIBValue.Count>x then MIBvalue[x-1]:=value - else MIBValue.Add(Value); + SNMPMib := TSNMPMib.Create; + SNMPMib.OID := MIB; + SNMPMib.Value := Value; + SNMPMib.ValueType := ConvertValueType(ValueType); + SNMPMibList.Add(SNMPMib); end; {TSNMPRec.MIBdelete} procedure TSNMPRec.MIBdelete(Index:integer); begin - SyncMIB; - MIBOID.Delete(Index); - if (MIBValue.Count-1)>= Index then MIBValue.Delete(Index); + if (Index >= 0) and (Index < SNMPMibList.count) then + begin + TSNMPMib(SNMPMibList[Index]).Free; + SNMPMibList.Delete(Index); + end; end; {TSNMPRec.MIBGet} function TSNMPRec.MIBGet(MIB:string):string; var - x:integer; + i: integer; begin - SyncMIB; - x:=MIBOID.IndexOf(MIB); - if x<0 then Result:='' - else Result:=MIBValue[x]; + Result := ''; + for i := 0 to SNMPMibList.count - 1 do + begin + if ((TSNMPMib(SNMPMibList[i])).OID = MIB) then + begin + Result := (TSNMPMib(SNMPMibList[i])).Value; + break; + end; + end; end; +{TSNMPRec.GetValueType} +function TSNMPRec.ConvertValueType(ValueType: TSNMPMibValueType): integer; +begin + result := ASN1_NULL; + if (ValueType = smvtInteger) then result := ASN1_INT; + if (ValueType = smvtOctetString) then result := ASN1_OCTSTR; + if (ValueType = smvtNull) then result := ASN1_NULL; + if (ValueType = smvtObjectId) then result := ASN1_OBJID; + if (ValueType = smvtSequence) then result := ASN1_SEQ; + if (ValueType = smvtIpAddress) then result := ASN1_IPADDR; + if (ValueType = smvtCounter) then result := ASN1_COUNTER; + if (ValueType = smvtGauge) then result := ASN1_GAUGE; + if (ValueType = smvtTimeTicks) then result := ASN1_TIMETICKS; +end; + + {==============================================================================} {TSNMPSend.Create} @@ -224,7 +266,7 @@ begin sock:=TUDPBlockSocket.create; sock.createsocket; timeout:=5; - SNMPhost:='localhost'; + host:='localhost'; end; {TSNMPSend.Destroy} @@ -244,7 +286,7 @@ begin Result:=false; reply.clear; Buffer:=Query.Encodebuf; - sock.connect(SNMPhost,'161'); + sock.connect(host,'161'); sock.SendBuffer(PChar(Buffer),Length(Buffer)); if sock.canread(timeout) then begin @@ -256,12 +298,13 @@ begin result:=true; end; end; - if Result then reply.DecodeBuf(Buffer); + if Result + then reply.DecodeBuf(Buffer); end; {==============================================================================} -function SNMPget (Mib, Community, SNMPHost:string; var Value:string):Boolean; +function SNMPget (Oid, Community, SNMPHost:string; var Value:string):Boolean; var SNMP:TSNMPSend; begin @@ -270,15 +313,31 @@ begin try Snmp.Query.community:=Community; Snmp.Query.PDUType:=PDUGetRequest; - Snmp.Query.MIBAdd(MIB,''); - Snmp.SNMPhost:=SNMPHost; + Snmp.Query.MIBAdd(Oid,'',smvtNull); + Snmp.host:=SNMPHost; Result:=Snmp.DoIt; if Result then - Value:=Snmp.Reply.MIBGet(MIB); + Value:=Snmp.Reply.MIBGet(Oid); finally SNMP.Free; end; end; +function SNMPSet(Oid, Community, SNMPHost, Value: string; ValueType: TSNMPMibValueType): boolean; +var + SNMPSend: TSNMPSend; +begin + SNMPSend := TSNMPSend.Create; + try + SNMPSend.Query.community := Community; + SNMPSend.Query.PDUType := PDUSetRequest; + SNMPSend.Query.MIBAdd(Oid, Value, ValueType); + SNMPSend.Host := SNMPHost; + result:= SNMPSend.DoIt=true; + finally + SNMPSend.Free; + end; +end; + end. diff --git a/snmptrap.pas b/snmptrap.pas index 9abe54c..17dccef 100644 --- a/snmptrap.pas +++ b/snmptrap.pas @@ -1,5 +1,5 @@ {==============================================================================| -| Project : Delphree - Synapse | 001.002.000 | +| Project : Delphree - Synapse | 001.002.001 | |==============================================================================| | Content: SNMP traps | |==============================================================================| @@ -223,7 +223,7 @@ var x: integer; begin Result := 0; - Sock.Connect(SNMPHost, IntToStr(Trap.TrapPort)); + Sock.Bind('0.0.0.0', IntToStr(Trap.TrapPort)); if Sock.CanRead(Timeout) then begin x := Sock.WaitingData; @@ -261,7 +261,7 @@ begin end; function RecvTrap(var Dest, Source, Enterprise, Community: string; - var Generic, Specific, Seconds: integer; var MIBName, MIBValue: TStringList): + var Generic, Specific, Seconds: integer; var MIBName, MIBValue: TStringList): integer; var SNMP: TTrapSNMP; diff --git a/sntpsend.pas b/sntpsend.pas index 21b175b..7377000 100644 --- a/sntpsend.pas +++ b/sntpsend.pas @@ -29,7 +29,7 @@ unit SNTPsend; interface uses - winsock, SysUtils, windows, blcksock, Synautil, dialogs; + winsock, SysUtils, windows, blcksock; type