diff options
author | Erich Eckner <git@eckner.net> | 2015-11-24 20:02:43 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-11-24 20:02:43 +0100 |
commit | 71822b813482f1b7f416b4b3158e5ed1ec10b9e1 (patch) | |
tree | 387efcf25af6f087d6f2071a8f5adffd688213d9 | |
parent | 20120166b9e462dbe17fe5137fb1dc6d39df8519 (diff) | |
download | Netzwerkwatchdog-71822b813482f1b7f416b4b3158e5ed1ec10b9e1.tar.xz |
ip fertig, naechstes schon angefangen, daher nicht lauffaehig
-rw-r--r-- | komponenten.pas | 496 | ||||
-rw-r--r-- | tests.konf | 17 | ||||
-rw-r--r-- | tests.txt | 17 | ||||
-rw-r--r-- | unit1.lfm | 110 | ||||
-rw-r--r-- | unit1.pas | 186 | ||||
-rw-r--r-- | watchdog.lpi | 1 | ||||
-rw-r--r-- | watchdog.lpr | 2 | ||||
-rw-r--r-- | watchdog.lps | 135 |
8 files changed, 685 insertions, 279 deletions
diff --git a/komponenten.pas b/komponenten.pas index 3b39ccb..93f39f8 100644 --- a/komponenten.pas +++ b/komponenten.pas @@ -16,93 +16,93 @@ type boMove: (Welches, wohin: integer); end; tBedingung = array of tBearbeitungsschritt; - T_pipe = record - m_read_handle: tHandle; - m_write_handle: tHandle; - end; tLogEvent = procedure(s: string) of object; + tTestAufgabe = class; + tAufgabenThread = class(tThread) private - _status: byte; // 0 = error; 1 = OK; 2 = disabled/unknown - _pr: tProcess; - _beendet: boolean; + _status: byte; // 0 = error; 1 = OK; 2 = disabled/unknown + _beendet: boolean; + _besitzer: tTestAufgabe; procedure _statusAenderung; + procedure wStatus(s: byte); public - statusAenderung: tNotifyEvent; - beenden: boolean; - property status: byte read _status; + beenden,warten: boolean; + fehlerIntervall, + okIntervall: longint; + property status: byte + read _status + write wStatus; property beendet: boolean read _beendet; - constructor create; - destructor destroy; override; + constructor create(besitzer: tTestAufgabe); + procedure execute; override; + procedure ausfuehren; virtual; abstract; end; tTestAufgabe = class(tComponent) private - _status: Byte; // 0 = error; 1 = OK; 2 = disabled/unknown _thread: tAufgabenThread; - procedure setStatus(b: byte); + function rStatus: byte; + procedure wOkIntervall(l: longint); + procedure wFehlerIntervall(l: longint); procedure outerLog(s: string); public bedingung: tBedingung; - fehlerIntervall,okIntervall: Integer; fehlerNachricht: string; statusAenderung: tNotifyEvent; log: tLogEvent; ernst: boolean; property status: byte - read _status - write setStatus; - function bedingungErfuellt(vorgaben: array of boolean): boolean; - function aktivieren(vorgaben: array of boolean): boolean; - function nimmParameter(s: string): boolean; virtual; + read rstatus; + property okIntervall: longint + write wOkIntervall; + property fehlerIntervall: longint + write wFehlerIntervall; constructor create(aOwner: tComponent); override; destructor destroy; override; + function bedingungErfuellt(vorgaben: array of boolean): boolean; + function aktivieren(vorgaben: array of boolean): boolean; + function nimmParameter(s: string): boolean; virtual; abstract; + procedure threadBeenden; end; tTestIpThread = class(tAufgabenThread) private - _werBinIch: string; - //IPAddress1: TIPAddress; - procedure setWerBinIch; public - werBinIch: string; - procedure execute; override; - constructor create(AOwner: TComponent); + werSollIchSein,geraet: string; + constructor create(besitzer: tTestAufgabe); destructor destroy; override; + procedure ausfuehren; override; end; tTestIp = class(tTestAufgabe) private public - werBinIch: string; - function nimmParameter(s: string): boolean; override; constructor create(aOwner: tComponent); override; - destructor destroy; override; + function nimmParameter(s: string): boolean; override; end; -(* tPingThread = class(tAufgabenThread) + tPingThread = class(tAufgabenThread) private public - werBinIch: string; - procedure execute; override; - constructor create(AOwner: TComponent); + wen: string; + procedure ausfuehren; override; + constructor create(besitzer: tTestAufgabe); destructor destroy; override; end; - tTestPing = class (tTestAufgabe) + tTestPing = class(tTestAufgabe) private - procedure OnTimerProcedure(Sender: TObject); - procedure OnIdIcmpClientReply(ASender: TComponent; const AReplyStatus: TReplyStatus); + procedure wWen(w: string); public - pingsocket: tIdICMPClient; - wen: String; - function nimmParameter(s: String): boolean; override; - constructor create(AOwner: TComponent); override; - destructor destroy; override; + function nimmParameter(s: string): boolean; override; + constructor create(aOwner: tComponent); override; + property wen: string + write wWen; end; - TTestDnsLookup = class (TTestAufgabe) +(* TTestDnsLookup = class (TTestAufgabe) private DNS_IP,HTTP_IP, host,ipVergleich, @@ -162,80 +162,76 @@ type destructor destroy; override; end; *) -//function loese_logischen_term(S: String): TBedingung; +function loeseLogischenTerm(s: string): tBedingung; //function unescape(s: string): string; //function mystrtotime(s: string): TDatetime; implementation -(* +uses lowlevelunit; + + // logischer Term ************************************************************** -function loese_logischen_term(S: String): TBedingung; -var I: Integer; - T: String; - Zahlenstack: array of integer; +function loeseLogischenTerm(s: string): tBedingung; +var + i: integer; + t: string; + zahlenStack: array of integer; begin - T:=''; - setlength(Result,0); - setlength(Zahlenstack,0); - For I:=1 to length(S) do - case S[I] of - '0'..'9': T:=T+S[I]; - '-': - begin - setlength(Result,length(Result)+1); - Result[length(Result)-1].was:=boNot; - Result[length(Result)-1].womit:=Zahlenstack[length(Zahlenstack)-1]; - setlength(Zahlenstack,length(Zahlenstack)-1); - end; - '&': - begin - setlength(Result,length(Result)+1); - Result[length(Result)-1].was:=boAnd; - Result[length(Result)-1].w1:=Zahlenstack[length(Zahlenstack)-2]; - Result[length(Result)-1].w2:=Zahlenstack[length(Zahlenstack)-1]; - setlength(Zahlenstack,length(Zahlenstack)-2); - end; - '|','#': - begin - setlength(Result,length(Result)+1); - Result[length(Result)-1].was:=boOr; - Result[length(Result)-1].w1:=Zahlenstack[length(Zahlenstack)-2]; - Result[length(Result)-1].w2:=Zahlenstack[length(Zahlenstack)-1]; - setlength(Zahlenstack,length(Zahlenstack)-2); - end; - 'c': - begin - setlength(Result,length(Result)+1); - Result[length(Result)-1].was:=boClr; - Result[length(Result)-1].womit:=Zahlenstack[length(Zahlenstack)-1]; - setlength(Zahlenstack,length(Zahlenstack)-1); - end; - 's': - begin - setlength(Result,length(Result)+1); - Result[length(Result)-1].was:=boSet; - Result[length(Result)-1].womit:=Zahlenstack[length(Zahlenstack)-1]; - setlength(Zahlenstack,length(Zahlenstack)-1); - end; - '~': - begin - setlength(Result,length(Result)+1); - Result[length(Result)-1].was:=boMove; - Result[length(Result)-1].welches:=Zahlenstack[length(Zahlenstack)-2]; - Result[length(Result)-1].wohin:=Zahlenstack[length(Zahlenstack)-1]; - setlength(Zahlenstack,length(Zahlenstack)-2); - end; - '_': - begin - setlength(Zahlenstack,length(Zahlenstack)+1); - Zahlenstack[length(Zahlenstack)-1]:=strtoint(T); - T:=''; - end; - end; + t:=''; + setlength(result,0); + setlength(zahlenStack,0); + for i:=1 to length(s) do + case s[i] of + '0'..'9': t:=t+s[i]; + '-': begin + setlength(result,length(result)+1); + result[length(result)-1].was:=boNot; + result[length(result)-1].womit:=zahlenStack[length(zahlenStack)-1]; + setlength(zahlenStack,length(zahlenStack)-1); + end; + '&': begin + setlength(result,length(result)+1); + result[length(result)-1].was:=boAnd; + result[length(result)-1].w1:=zahlenStack[length(zahlenStack)-2]; + result[length(result)-1].w2:=zahlenStack[length(zahlenStack)-1]; + setlength(zahlenStack,length(zahlenStack)-2); + end; + '|','#': begin + setlength(result,length(result)+1); + result[length(result)-1].was:=boOr; + result[length(result)-1].w1:=zahlenStack[length(zahlenStack)-2]; + result[length(result)-1].w2:=zahlenStack[length(zahlenStack)-1]; + setlength(zahlenStack,length(zahlenStack)-2); + end; + 'c': begin + setlength(result,length(result)+1); + result[length(result)-1].was:=boClr; + result[length(result)-1].womit:=zahlenStack[length(zahlenStack)-1]; + setlength(zahlenStack,length(zahlenStack)-1); + end; + 's': begin + setlength(result,length(result)+1); + result[length(result)-1].was:=boSet; + result[length(result)-1].womit:=zahlenStack[length(zahlenStack)-1]; + setlength(zahlenStack,length(zahlenStack)-1); + end; + '~': begin + setlength(result,length(result)+1); + result[length(result)-1].was:=boMove; + result[length(result)-1].welches:=zahlenStack[length(zahlenStack)-2]; + result[length(result)-1].wohin:=zahlenStack[length(zahlenStack)-1]; + setlength(zahlenStack,length(zahlenStack)-2); + end; + '_': begin + setlength(zahlenStack,length(zahlenStack)+1); + zahlenStack[length(zahlenStack)-1]:=strtoint(t); + t:=''; + end; + end{of case}; end; - +(* // Hilfskonvertierung ********************************************************** function unescape(s: string): string; @@ -307,27 +303,55 @@ end; *) // tAufgabenThread ************************************************************* -constructor tAufgabenThread.create; +constructor tAufgabenThread.create(besitzer: tTestAufgabe); begin inherited create(true); + _besitzer:=besitzer; _status:=2; - _pr:=tProcess.create(nil); - _pr.options:=[poUsePipes]; _beendet:=false; - statusAenderung:=nil; + fehlerIntervall:=60; + okIntervall:=60; beenden:=false; + warten:=true; + suspended:=false; end; -destructor tAufgabenThread.destroy; +procedure tAufgabenThread._statusAenderung; begin - _pr.free; - inherited destroy; + if assigned(_besitzer.statusAenderung) then + _besitzer.statusAenderung(_besitzer); end; -procedure tAufgabenThread._statusAenderung; +procedure tAufgabenThread.wStatus(s: byte); begin - if assigned(statusAenderung) then - statusAenderung(self); + if _status=s then exit; + _status:=s; + synchronize(@_statusAenderung); +end; + +procedure tAufgabenThread.execute; +var + i: longint; +begin + while not beenden do begin + while warten do + sleep(10); + ausfuehren; + if beenden then + continue; + i:=0; + if _status=1 then + for i:=0 to okIntervall-1 do begin + if beenden then break; + sleep(100); + end + else + for i:=0 to fehlerIntervall-1 do begin + if beenden then break; + sleep(100); + end; + end; + _beendet:=true; end; // tTestAufgabe **************************************************************** @@ -335,10 +359,7 @@ end; constructor tTestAufgabe.create(aOwner: tComponent); begin inherited create(aOwner); - _status:=2; setlength(bedingung,0); - fehlerIntervall:=60; - okIntervall:=60; fehlerNachricht:='leer'; statusAenderung:=nil; log:=nil; @@ -352,11 +373,19 @@ begin inherited destroy; end; -procedure tTestAufgabe.setStatus(b: byte); +function tTestAufgabe.rStatus: byte; +begin + result:=_thread.status; +end; + +procedure tTestAufgabe.wOkIntervall(l: longint); +begin + _thread.okIntervall:=l; +end; + +procedure tTestAufgabe.wFehlerIntervall(l: longint); begin - _status:=b; - if assigned(statusAenderung) then - statusAenderung(self); + _thread.fehlerIntervall:=l; end; procedure tTestAufgabe.outerLog(s: string); @@ -364,9 +393,9 @@ begin if assigned(log) then begin if self is tTestIP then s:=s+' (testIP)'; -(* if self is tTestPing then + if self is tTestPing then s:=s+' (testPing)'; - if self is tTestDnsLookup then +(* if self is tTestDnsLookup then s:=s+' (testDnsLookup)'; if self is tFtpFileCompare then s:=s+' (ftpFileCompare)'; @@ -374,7 +403,7 @@ begin s:=s+' (ftpDate)'; if self is tHttpCompare then s:=s+' (httpCompare)'; *) - log(datetimetostr(now)+': '+s); + log(s); end; end; @@ -386,8 +415,8 @@ begin setlength(reg,length(vorgaben)); for i:=0 to length(vorgaben)-1 do reg[i]:=vorgaben[i]; - for i:=0 to length(Bedingung)-1 do - case Bedingung[i].was of + for i:=0 to length(bedingung)-1 do + case bedingung[i].was of boNot: reg[bedingung[i].womit]:=not reg[bedingung[i].womit]; boSet: begin @@ -417,20 +446,136 @@ function tTestAufgabe.aktivieren(vorgaben: array of boolean): boolean; var tmp: boolean; begin - tmp:=Bedingung_erfuellt(Vorgaben); - result:=tmp xor Zeitwarter.enabled; + tmp:=not bedingungErfuellt(vorgaben); + result:=tmp xor _thread.warten; + if result then + _thread.warten:=tmp; +end; + +procedure tTestAufgabe.threadBeenden; +begin + _thread.beenden:=true; +end; + +// tTestIpThread *************************************************************** + +constructor tTestIpThread.create(besitzer: tTestAufgabe); +begin + inherited create(besitzer); + fillchar(werSollIchSein,sizeof(werSollIchSein),#0); + setlength(werSollIchSein,0); + fillchar(geraet,sizeof(geraet),#0); + setlength(geraet,0); +end; + +destructor tTestIpThread.destroy; +begin + setlength(werSollIchSein,0); + setlength(geraet,0); + inherited destroy; +end; + +procedure tTestIpThread.ausfuehren; +var + ausgabe: string; + argumente: array of string; +begin + ausgabe:=''; + setlength(argumente,4); + argumente[0]:='addr'; + argumente[1]:='show'; + argumente[2]:='dev'; + argumente[3]:=geraet; + if (not runCommand('/sbin/ip',argumente,ausgabe)) or (pos('inet',ausgabe)=0) then begin + status:=0; + setlength(argumente,0); + exit; + end; + delete(ausgabe,1,pos('inet',ausgabe)-1); + status:=byte(pos('inet '+werSollIchSein+' ',ausgabe)=1); +end; + +// tTestIp ********************************************************************* + +constructor tTestIp.create(aOwner: tComponent); +begin + inherited create(aOwner); + _thread:=tTestIpThread.create(self); +end; + +function tTestIp.nimmParameter(s: string): boolean; +var + i,j: longint; + ger,ip: string; +begin + result:=false; + ger:=erstesArgument(s,':'); + ip:=s; + if pos('/',s)=0 then exit; + s[pos('/',s)]:='.'; + s:=s+'.'; + for j:=0 to 4 do begin + i:=pos('.',s); + if (i<2) or (i>4) then exit; + for i:=1 to pos('.',s)-1 do + if not (s[i] in ['0'..'9']) then + exit; + delete(s,1,pos('.',s)); + end; + result:=length(s)=0; if result then begin - if tmp then Zeitwarter.Interval:=1000; - Zeitwarter.enabled:=tmp; + (_thread as tTestIpThread).werSollIchSein:=ip; + (_thread as tTestIpThread).geraet:=ger; end; end; -function tTestAufgabe.nimmParameter(s: string): boolean; virtual; +// tPingThread ***************************************************************** + +constructor tPingThread.create(besitzer: tTestAufgabe); +begin + inherited create(besitzer); + fillchar(wen,sizeof(wen),#0); + setlength(wen,0); +end; + +destructor tPingThread.destroy; +begin + wen:=''; + inherited destroy; +end; + +procedure tPingThread.ausfuehren; +var + ausgabe: string; + argumente: array of string; +begin + ausgabe:=''; + setlength(argumente,2); + argumente[0]:='-c1'; + argumente[1]:=wen; + if (not runCommand('ping',argumente,ausgabe)) or (pos('inet',ausgabe)=0) then begin + status:=0; + setlength(argumente,0); + exit; + end; + delete(ausgabe,1,pos('inet',ausgabe)-1); + status:=byte(pos('inet '+werSollIchSein+' ',ausgabe)=1); +end; + +// tTestPing ******************************************************************* + +constructor tTestPing.create(aOwner: tComponent); +begin +end; + +procedure tTestPing.wWen(w: string); +begin +end; + +function tTestPing.nimmParameter(s: string): boolean; begin - result:=true; end; -(* // TTestPing ******************************************************************* procedure TTestPing.OnTimerProcedure(Sender: TObject); @@ -472,72 +617,7 @@ begin PingSocket.Host:=wen; result:=true; end; - -// TTestIP ********************************************************************* - -procedure TTestIP.OnTimerProcedure(Sender: TObject); -begin - try - IPChecker.Resume; - if IPChecker.Returnvalue = 0 then - Status:=Byte(IPChecker.WerBinIch = WerBinIch); - except - Log('Ich bin aus dem try-except geflogen!'); - Status:=0; - end; -end; - -constructor TTestIP.create(AOwner: TComponent); -begin - inherited create(AOwner); - InnerTimerProcedure:=OnTimerProcedure; - IPChecker:=TIPCheckThread.Create(AOwner); -end; - -destructor TTestIP.destroy; -begin - IPChecker.Destroy; - inherited destroy; -end; - -function TTestIP.nimmParameter(s: String): boolean; -begin - werBinIch:=unescape(s); - result:=true; -end; - -// TIPCheckThread ************************************************************** - -constructor TIPCheckThread.Create(AOwner: TComponent); -begin - inherited Create(true); - IPAddress1:=TIPAddress.Create(AOwner); - Werbinich:=''; - Werbinich_:=''; - FreeOnTerminate:= false; - Returnvalue:=1; -end; - -destructor TIPCheckThread.destroy; -begin - IPAddress1.destroy; - inherited destroy; -end; - -procedure TIPCheckThread.setWerBinIch; -begin - werBinIch:=werBinIch_; -end; - -procedure TIPCheckThread.execute; -begin - werbinich_:=''; - Synchronize(setWerBinIch); - werbinich_:=IPAddress1.GetIpAddress; - Synchronize(setWerBinIch); - Returnvalue:=0; -end; - +(* // TTestDNSLookup ************************************************************** constructor TTestDNSLookup.create(AOwner: TComponent); @@ -587,7 +667,7 @@ end; function TTestDNSLookup.nimmParameter(s: String): boolean; begin - Result:=false; + result:=false; if (length(S)=0) or (S[1]<>'"') then exit; delete(S,1,1); if pos('"',S)=0 then exit; @@ -609,7 +689,7 @@ begin klammerZu:=unescape(uppercase(copy(S,1,pos('"',S)-1))); delete(S,1,pos('"',S)); if length(S)>0 then exit; - Result:=true; + result:=true; end; procedure TTestDNSLookup.HTTPdata(Sender: TObject; Buffer: Pointer; Len: Integer); @@ -786,7 +866,7 @@ begin FTPCLient1.HostName:=Host; FTPCLient1.HostDirName:=HostDir; FTPCLient1.HostFileName:=HostFile; - Result:=true; + result:=true; end; constructor TFtpFileCompare.create(AOwner: TComponent); @@ -904,7 +984,7 @@ begin FTPCLient1.HostName:=Host; FTPCLient1.HostDirName:=HostDir; FTPCLient1.HostFileName:=HostFile; - Result:=true; + result:=true; end; constructor TFtpDate.create(AOwner: TComponent); @@ -994,7 +1074,7 @@ begin Vergleich:=Vergl; HTTPClient1.URL:=s; - Result:=true; + result:=true; end; constructor THttpCompare.create(AOwner: TComponent); @@ -1041,7 +1121,7 @@ end; function TCheckProcess.nimmParameter(s: String): boolean; begin exeFileName:=s; - Result:=true; + result:=true; end; constructor TCheckProcess.create(AOwner: TComponent); diff --git a/tests.konf b/tests.konf new file mode 100644 index 0000000..37e4c1a --- /dev/null +++ b/tests.konf @@ -0,0 +1,17 @@ +#was Bed. time;ok time;error msg. wen
+ip 0_s 100 50 keine IP eno1:192.168.0.12/24
+ping 100 50 .9 (ping) 192.168.0.9
+ping 100 50 .13 (ping) 192.168.0.13
+(ping) 100 50 .15 (ping) 192.168.0.15
+(ping) 100 50 .18 (ping) 192.168.0.18
+ping 0_1_& 600 50 google (ping) www.google.de
+ping 0_1_& 600 50 eckner.net (ping) eckner.net
+##ping 0_1_& 600 50 ... (ping) www.wieistmeineip.de
+#ftpcmp 0_3_& 600 50 Festplatte status.txt/erich:erichmitgrossemE@192.168.0.15/tmp/ftpstatus
+#ftpdate 0_3_&0_7_& 60000 60000 Festplattenjob 90/erich:erichmitgrossemE@192.168.0.15/tmp/ftpstatus.time
+#ping 100 50 .9 (ping) 192.168.0.9
+#httpcmp 0_4_& 600 50 Musik-Crypto musikStatus.txt:http://192.168.0.18/status.php
+#httpcmp 0_2_&0_6_& 600 100 dns dnsStatus.txt:http://eckner.net/iptest.php
+#checkprocess 600 50 rsync rsync.exe
+##dnslookup 0_2_&0_7_& 600 100 dns "home.eckner.net","http://www.wieistmeineip.de/","<div class="title"><strong>","</strong></div>"
+##ping 0_1_& 600 50 cwsurf (ping) overlock.cwsurf.de
diff --git a/tests.txt b/tests.txt deleted file mode 100644 index c6da5f9..0000000 --- a/tests.txt +++ /dev/null @@ -1,17 +0,0 @@ -#was Bed. time;ok time;error msg. wen
-ip 0_s 10000 5000 keine IP 192.168.0.12
-ping 10000 5000 .9 (ping) 192.168.0.9
-ping 10000 5000 .13 (ping) 192.168.0.13
-(ping) 10000 5000 .15 (ping) 192.168.0.15
-(ping) 10000 5000 .18 (ping) 192.168.0.18
-ping 0_1_& 60000 5000 google (ping) www.google.de
-ping 0_1_& 60000 5000 eckner.net (ping) eckner.net
-#ping 0_1_& 60000 5000 ... (ping) www.wieistmeineip.de
-ftpcmp 0_3_& 60000 5000 Festplatte status.txt/erich:erichmitgrossemE@192.168.0.15/tmp/ftpstatus
-ftpdate 0_3_&0_7_& 60000 60000 Festplattenjob 90/erich:erichmitgrossemE@192.168.0.15/tmp/ftpstatus.time
-ping 10000 5000 .9 (ping) 192.168.0.9
-httpcmp 0_4_& 60000 5000 Musik-Crypto musikStatus.txt:http://192.168.0.18/status.php
-httpcmp 0_2_&0_6_& 60000 10000 dns dnsStatus.txt:http://eckner.net/iptest.php
-checkprocess 60000 5000 rsync rsync.exe
-#dnslookup 0_2_&0_7_& 60000 10000 dns "home.eckner.net","http://www.wieistmeineip.de/","<div class="title"><strong>","</strong></div>"
-#ping 0_1_& 60000 5000 cwsurf (ping) overlock.cwsurf.de
@@ -1,8 +1,110 @@ object Form1: TForm1 - Left = 1690 - Height = 240 - Top = 180 - Width = 320 + Left = 417 + Height = 340 + Top = 564 + Width = 531 Caption = 'Form1' + ClientHeight = 340 + ClientWidth = 531 + OnClose = FormClose + OnCreate = FormCreate + OnResize = FormResize + OnShow = FormShow LCLVersion = '1.4.4.0' + object Memo1: TMemo + Left = 0 + Height = 288 + Top = 0 + Width = 424 + Lines.Strings = ( + 'Memo1' + ) + TabOrder = 0 + end + object gruenIcon: TImage + Left = 0 + Height = 18 + Top = 0 + Width = 18 + Picture.Data = { + 055449636F6E3E01000000000100010010101000000000002801000016000000 + 2800000010000000200000000100040000000000C00000000000000000000000 + 0000000000000000000000000000800000800000008080008000000080008000 + 8080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00 + FFFF0000FFFFFF00000000000000000000000AAAAAA000000000AAAAAAAA0000 + 000AAA0000AAA00000AAA0AAAA0AAA000AAA0AAAAAA0AAA00AAAAAAAAAAAAAA0 + 0AAAAAAAAAAAAAA00AAAAAAAAAAAAAA00AAAA00AA00AAAA00AAAA00AA00AAAA0 + 00AAAAAAAAAAAA00000AAAAAAAAAA0000000AAAAAAAA000000000AAAAAA00000 + 0000000000000000F81F0000F00F0000C0030000C00300008001000000000000 + 000000000000000000000000000000000000000080010000C0030000C0030000 + F00F0000F81F0000 + } + Visible = False + end + object gelbIcon: TImage + Left = 28 + Height = 18 + Top = 0 + Width = 18 + Picture.Data = { + 055449636F6E3E01000000000100010010101000000000002801000016000000 + 2800000010000000200000000100040000000000C00000000000000000000000 + 0000000000000000000000000000800000800000008080008000000080008000 + 8080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00 + FFFF0000FFFFFF00000000000000000000000BBBBBB000000000BBBBBBBB0000 + 000BBBBBBBBBB00000BB00000000BB000BBBBBBBBBBBBBB00BBBBBBBBBBBBBB0 + 0BBBBBBBBBBBBBB00BBBBBBBBBBBBBB00BBBB00BB00BBBB00BBBB00BB00BBBB0 + 00BBBBBBBBBBBB00000BBBBBBBBBB0000000BBBBBBBB000000000BBBBBB00000 + 0000000000000000F81F0000F00F0000C0030000C00300008001000000000000 + 000000000000000000000000000000000000000080010000C0030000C0030000 + F00F0000F81F0000 + } + Visible = False + end + object rotIcon: TImage + Left = 56 + Height = 18 + Top = 0 + Width = 18 + Picture.Data = { + 055449636F6E3E01000000000100010010101000000000002801000016000000 + 2800000010000000200000000100040000000000C00000000000000000000000 + 0000000000000000000000000000800000800000008080008000000080008000 + 8080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00 + FFFF0000FFFFFF00000000000000000000000999999000000000999999990000 + 0009099999909000009990999909990009999900009999900999999999999990 + 0999999999999990099999999999999009999009900999900999900990099990 + 0099999999999900000999999999900000009999999900000000099999900000 + 0000000000000000F81F0000F00F0000C0030000C00300008001000000000000 + 000000000000000000000000000000000000000080010000C0030000C0030000 + F00F0000F81F0000 + } + Visible = False + end + object najaGruenIcon: TImage + Left = 84 + Height = 18 + Top = 0 + Width = 18 + Picture.Data = { + 055449636F6E3E01000000000100010010101000000000002801000016000000 + 2800000010000000200000000100040000000000C00000000000000000000000 + 0000000000000000000000000000800000800000008080008000000080008000 + 8080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00 + FFFF0000FFFFFF00000000000000000000000AAAAAA000000000AAAAAAAA0000 + 000AAAAAAAAAA00000AA00AAAAAAAA000AAAAA0000AAAAA00AAAAAAAAA00AAA0 + 0AAAAAAAAAAAAAA00AAAAAAAAAAAAAA00AAAA00AA00AAAA00AAAA00AA00AAAA0 + 00AAAAAAAAAAAA00000AAAAAAAAAA0000000AAAAAAAA000000000AAAAAA00000 + 0000000000000000F81F0000F00F0000C0030000C00300008001000000000000 + 000000000000000000000000000000000000000080010000C0030000C0030000 + F00F0000F81F0000 + } + Visible = False + end + object TrayIcon1: TTrayIcon + OnDblClick = TrayIcon1DblClick + OnMouseDown = TrayIcon1MouseDown + left = 16 + top = 56 + end end @@ -5,22 +5,204 @@ unit Unit1; interface uses - Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs; + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, + StdCtrls, Komponenten; type + + { TForm1 } + TForm1 = class(TForm) + gruenIcon: TImage; + gelbIcon: TImage; + rotIcon: TImage; + najaGruenIcon: TImage; + Memo1: TMemo; + TrayIcon1: TTrayIcon; + procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure FormResize(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure TrayIcon1DblClick(Sender: TObject); + procedure TrayIcon1MouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); private { private declarations } + lmb: tMouseButton; + procedure readOptions(nam: string); public { public declarations } + logDateiName: string; + pruefListe: array of tTestAufgabe; + procedure statusAenderung(sender: tObject); + procedure log(s: string); end; var - Form1: TForm1; + form1: tForm1; implementation +uses lowlevelunit; + {$R *.lfm} +procedure TForm1.FormCreate(Sender: TObject); +begin + lmb:=mbLeft; + logDateiName:='/tmp/watchdog.log'; + + setlength(pruefListe,0); + readOptions(extractFilePath(application.exeName)+'tests.konf'); + + form1.visible:=false; + statusAenderung(self); +end; + +procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); +var + i: longint; +begin + for i:=0 to length(pruefListe)-1 do + pruefListe[i].threadBeenden; +end; + +procedure TForm1.FormResize(Sender: TObject); +begin + memo1.width:=form1.clientWidth; + memo1.height:=form1.clientHeight; +end; + +procedure TForm1.FormShow(Sender: TObject); +begin + form1.left:=screen.monitors[0].left+(screen.monitors[0].width-form1.width) div 2; + form1.top:=screen.monitors[0].top+(screen.monitors[0].height-form1.height-24) div 2; +end; + +procedure TForm1.TrayIcon1DblClick(Sender: TObject); +begin + case lmb of + mbLeft: + form1.visible:=not form1.visible; + mbRight: + form1.close; + end{of case}; +end; + +procedure TForm1.TrayIcon1MouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + lmb:=button; +end; + +procedure tForm1.readOptions(nam: string); +var + f: textFile; + s,t: string; + bol: boolean; +begin + assignFile(F,nam); + reset(f); + while not eof(f) do begin + readln(f,s); + if (length(s)=0) or (s[1]='#') then continue; + setlength(pruefListe,length(pruefListe)+1); + t:=erstesArgument(s,#9); + bol:=(leftStr(t,1)='(') and (rightStr(t,1)=')'); + if bol then + t:=copy(t,2,length(t)-2); + if t='ip' then pruefListe[length(pruefliste)-1]:=tTestIp.create(form1) +(* else if t='ping' then pruefListe[length(pruefListe)-1]:=TTestping.create(Form1) + else if t='dnslookup' then pruefListe[length(pruefListe)-1]:=TTestDNSLookup.create(Form1) + else if t='ftpcmp' then pruefListe[length(pruefListe)-1]:=TFtpFileCompare.create(Form1) + else if t='ftpdate' then pruefListe[length(pruefListe)-1]:=TFtpDate.create(Form1) + else if t='httpcmp' then pruefListe[length(pruefListe)-1]:=THttpCompare.create(Form1) + else if t='checkprocess' then pruefListe[length(pruefListe)-1]:=TCheckProcess.create(Form1) *) + else begin + log('Unbekannter Test '''+t+'''.'); + setlength(pruefListe,length(pruefListe)-1); + continue; + end; + pruefListe[length(pruefListe)-1].ernst:=not bol; + pruefListe[length(pruefListe)-1].log:=@form1.log; + t:=erstesArgument(s,#9); + pruefListe[length(pruefListe)-1].bedingung:=loeseLogischenTerm(t); + t:=erstesArgument(s,#9); + pruefListe[length(pruefListe)-1].okIntervall:=strToInt(t); + t:=erstesArgument(s,#9); + pruefListe[length(pruefListe)-1].fehlerIntervall:=strToInt(t); + t:=erstesArgument(s,#9); + pruefListe[length(pruefListe)-1].fehlerNachricht:=t; + if not pruefListe[length(pruefListe)-1].nimmParameter(s) then + raise exception.create('Unverständliche Parameter: '''+s+'''!'); + pruefListe[length(pruefListe)-1].statusAenderung:=@form1.statusAenderung; + end; + closeFile(f); +end; + +procedure TForm1.statusAenderung(sender: TObject); +var + i,j: longint; + stati: array of boolean; + s: string; +begin + setlength(stati,length(pruefListe)); + for i:=0 to length(pruefListe)-1 do + stati[i]:=pruefListe[i].status = 1; + for i:=0 to length(pruefListe)-1 do + pruefListe[i].aktivieren(stati); + + j:=0; + for i:=0 to length(pruefListe)-1 do + if pruefListe[i].bedingungErfuellt(stati) then + if pruefListe[i].status<>1 then + j:=j or + (1 shl (pruefListe[i].status + byte((pruefListe[i].status=0) and pruefListe[i].ernst))); + + memo1.lines.clear; + if j=0 then begin + s:= 'Alles OK!'#0; + form1.icon:=gruenIcon.picture.icon; + end + else begin + s:=''; + if odd(j shr 1) then begin + form1.icon:=rotIcon.picture.icon; + j:=8; + end + else if odd(j shr 2) then begin + form1.icon:=gelbIcon.picture.icon; + j:=14; + end + else begin + form1.icon:=najaGruenIcon.picture.icon; + j:=4; + end; + For i:=0 to length(pruefListe)-1 do + if (j mod 4 = pruefListe[i].status) and + (pruefListe[i].bedingungErfuellt(stati)) and + odd(j shr (2+Byte(pruefListe[i].ernst))) then begin + s:=s + ','#$0D#$0A + pruefListe[i].fehlerNachricht; + memo1.lines.add(pruefListe[i].fehlerNachricht); + end; + s:=s+'!'#0; + delete(s,1,3); + end; + trayIcon1.hint:=s; + trayIcon1.icon:=form1.icon; + trayIcon1.visible:=true; +end; + +procedure TForm1.log(s: string); +var + f: textFile; +begin + assignFile(f,logDateiName); + if fileExists(logDateiName) then append(f) + else rewrite(f); + writeln(f,dateTimeToStr(now)+': '+s); + closeFile(f); +end; + end. diff --git a/watchdog.lpi b/watchdog.lpi index 6cb0e96..0828e4a 100644 --- a/watchdog.lpi +++ b/watchdog.lpi @@ -41,6 +41,7 @@ <Filename Value="unit1.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="Form1"/> + <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="Unit1"/> </Unit1> diff --git a/watchdog.lpr b/watchdog.lpr index fa8d850..3c9d091 100644 --- a/watchdog.lpr +++ b/watchdog.lpr @@ -3,9 +3,7 @@ program watchdog; {$mode objfpc}{$H+} uses - {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, - {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset Forms, Unit1, komponenten { you can add units after this }; diff --git a/watchdog.lps b/watchdog.lps index a03f8d5..d71e6ff 100644 --- a/watchdog.lps +++ b/watchdog.lps @@ -3,23 +3,24 @@ <ProjectSession> <Version Value="9"/> <BuildModes Active="Default"/> - <Units Count="3"> + <Units Count="6"> <Unit0> <Filename Value="watchdog.lpr"/> <IsPartOfProject Value="True"/> <EditorIndex Value="-1"/> - <WindowIndex Value="-1"/> - <TopLine Value="-1"/> - <CursorPos X="-1" Y="-1"/> - <UsageCount Value="20"/> + <CursorPos X="12" Y="6"/> + <UsageCount Value="25"/> </Unit0> <Unit1> <Filename Value="unit1.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="Form1"/> + <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="Unit1"/> - <UsageCount Value="20"/> + <TopLine Value="47"/> + <CursorPos X="20" Y="69"/> + <UsageCount Value="25"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> </Unit1> @@ -27,114 +28,156 @@ <Filename Value="komponenten.pas"/> <IsPartOfProject Value="True"/> <IsVisibleTab Value="True"/> - <EditorIndex Value="1"/> - <TopLine Value="395"/> - <CursorPos X="23" Y="418"/> - <UsageCount Value="20"/> + <EditorIndex Value="3"/> + <CursorPos Y="19"/> + <FoldState Value=" TKjI0w1 T3l30v917n"/> + <UsageCount Value="25"/> <Loaded Value="True"/> </Unit2> + <Unit3> + <Filename Value="tests.txt"/> + <EditorIndex Value="-1"/> + <CursorPos X="69" Y="2"/> + <UsageCount Value="10"/> + <DefaultSyntaxHighlighter Value="None"/> + </Unit3> + <Unit4> + <Filename Value="../../../Sicherung_Windows/EIGDATEI/DELPHANW/NetzwerkWatchDog/Unit1.pas"/> + <EditorIndex Value="2"/> + <TopLine Value="153"/> + <CursorPos Y="209"/> + <UsageCount Value="12"/> + <Loaded Value="True"/> + </Unit4> + <Unit5> + <Filename Value="tests.konf"/> + <EditorIndex Value="1"/> + <CursorPos X="2" Y="9"/> + <UsageCount Value="11"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="None"/> + </Unit5> </Units> - <JumpHistory Count="25" HistoryIndex="24"> + <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="komponenten.pas"/> - <Caret Line="1014" Column="3" TopLine="972"/> + <Caret Line="520" TopLine="482"/> </Position1> <Position2> - <Filename Value="komponenten.pas"/> - <Caret Line="146" Column="3" TopLine="128"/> + <Filename Value="unit1.pas"/> + <Caret Line="129" TopLine="94"/> </Position2> <Position3> - <Filename Value="komponenten.pas"/> - <Caret Line="28" Column="23" TopLine="8"/> + <Filename Value="unit1.pas"/> + <Caret Line="97" TopLine="88"/> </Position3> <Position4> - <Filename Value="komponenten.pas"/> - <Caret Line="29" Column="35" TopLine="5"/> + <Filename Value="unit1.pas"/> + <Caret Line="98" TopLine="88"/> </Position4> <Position5> <Filename Value="komponenten.pas"/> - <Caret Line="35" Column="45" TopLine="14"/> + <Caret Line="445" Column="19" TopLine="428"/> </Position5> <Position6> <Filename Value="komponenten.pas"/> - <Caret Line="27" Column="15" TopLine="6"/> + <Caret Line="352" Column="23" TopLine="315"/> </Position6> <Position7> <Filename Value="komponenten.pas"/> - <Caret Line="8" Column="29" TopLine="6"/> + <Caret Line="390" TopLine="373"/> </Position7> <Position8> <Filename Value="komponenten.pas"/> - <Caret Line="44" Column="33" TopLine="16"/> + <Caret Line="399" TopLine="382"/> </Position8> <Position9> <Filename Value="komponenten.pas"/> - <Caret Line="77" Column="39" TopLine="55"/> + <Caret Line="400" TopLine="382"/> </Position9> <Position10> <Filename Value="komponenten.pas"/> - <Caret Line="75" Column="10" TopLine="64"/> + <Caret Line="401" TopLine="382"/> </Position10> <Position11> <Filename Value="komponenten.pas"/> - <Caret Line="313" Column="29" TopLine="290"/> + <Caret Line="402" TopLine="382"/> </Position11> <Position12> <Filename Value="komponenten.pas"/> - <Caret Line="271" Column="3" TopLine="240"/> + <Caret Line="413" TopLine="382"/> </Position12> <Position13> - <Filename Value="komponenten.pas"/> - <Caret Line="330" Column="27" TopLine="307"/> + <Filename Value="unit1.pas"/> + <Caret Line="190" TopLine="156"/> </Position13> <Position14> - <Filename Value="komponenten.pas"/> - <Caret Line="329" Column="20" TopLine="307"/> + <Filename Value="unit1.pas"/> + <Caret Line="191" TopLine="156"/> </Position14> <Position15> - <Filename Value="komponenten.pas"/> - <Caret Line="307" TopLine="284"/> + <Filename Value="unit1.pas"/> + <Caret Line="192" TopLine="156"/> </Position15> <Position16> - <Filename Value="komponenten.pas"/> - <Caret Line="336" Column="54" TopLine="316"/> + <Filename Value="unit1.pas"/> + <Caret Line="194" TopLine="156"/> </Position16> <Position17> - <Filename Value="komponenten.pas"/> - <Caret Line="62" TopLine="28"/> + <Filename Value="unit1.pas"/> + <Caret Line="195" TopLine="156"/> </Position17> <Position18> - <Filename Value="komponenten.pas"/> - <Caret Line="362" Column="31" TopLine="332"/> + <Filename Value="unit1.pas"/> + <Caret Line="196" TopLine="156"/> </Position18> <Position19> <Filename Value="komponenten.pas"/> - <Caret Line="335" TopLine="320"/> + <Caret Line="486" Column="45" TopLine="466"/> </Position19> <Position20> <Filename Value="komponenten.pas"/> - <Caret Line="359" Column="26" TopLine="330"/> + <Caret Line="51" Column="14" TopLine="36"/> </Position20> <Position21> <Filename Value="komponenten.pas"/> - <Caret Line="409" Column="36" TopLine="376"/> + <Caret Line="374" TopLine="352"/> </Position21> <Position22> <Filename Value="komponenten.pas"/> - <Caret Line="364" Column="15" TopLine="342"/> + <Caret Line="336" Column="49" TopLine="180"/> </Position22> <Position23> <Filename Value="komponenten.pas"/> - <Caret Line="51" Column="6" TopLine="23"/> + <Caret Line="35" TopLine="18"/> </Position23> <Position24> <Filename Value="komponenten.pas"/> - <Caret Line="344" Column="4" TopLine="322"/> + <Caret Line="319" TopLine="239"/> </Position24> <Position25> - <Filename Value="komponenten.pas"/> - <Caret Line="376" Column="32" TopLine="345"/> + <Filename Value="unit1.pas"/> + <Caret Line="75" Column="85" TopLine="55"/> </Position25> + <Position26> + <Filename Value="komponenten.pas"/> + <Caret Line="332" Column="21" TopLine="239"/> + </Position26> + <Position27> + <Filename Value="komponenten.pas"/> + <Caret Line="240" Column="77" TopLine="85"/> + </Position27> + <Position28> + <Filename Value="komponenten.pas"/> + </Position28> + <Position29> + <Filename Value="komponenten.pas"/> + <Caret Line="53" Column="23" TopLine="17"/> + </Position29> + <Position30> + <Filename Value="komponenten.pas"/> + <Caret Line="516" Column="50" TopLine="475"/> + </Position30> </JumpHistory> </ProjectSession> </CONFIG> |