summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-11-24 20:02:43 +0100
committerErich Eckner <git@eckner.net>2015-11-24 20:02:43 +0100
commit71822b813482f1b7f416b4b3158e5ed1ec10b9e1 (patch)
tree387efcf25af6f087d6f2071a8f5adffd688213d9
parent20120166b9e462dbe17fe5137fb1dc6d39df8519 (diff)
downloadNetzwerkwatchdog-71822b813482f1b7f416b4b3158e5ed1ec10b9e1.tar.xz
ip fertig, naechstes schon angefangen, daher nicht lauffaehig
-rw-r--r--komponenten.pas496
-rw-r--r--tests.konf17
-rw-r--r--tests.txt17
-rw-r--r--unit1.lfm110
-rw-r--r--unit1.pas186
-rw-r--r--watchdog.lpi1
-rw-r--r--watchdog.lpr2
-rw-r--r--watchdog.lps135
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
diff --git a/unit1.lfm b/unit1.lfm
index 2799698..1077043 100644
--- a/unit1.lfm
+++ b/unit1.lfm
@@ -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
diff --git a/unit1.pas b/unit1.pas
index f986e0d..5ae4956 100644
--- a/unit1.pas
+++ b/unit1.pas
@@ -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>