program check_multi_af;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Data.DBXMySQL,
Data.SqlExpr,
Data.FMTBcd;
var
SQLConnection1: TSQLConnection;
SQLQuery1: TSQLQuery;
returncode : integer;
returntext, like_service, sum_o_einzeln, imc, sum_dif_s_e, start_crit, jetzt_critical :
string;
begin
returncode := 3;
returntext := '
UNKNOWN - unbekannter Fehler !';
if ParamCount = 5
then
begin
sum_dif_s_e := ParamStr(1);
start_crit := ParamStr(2);
like_service := ParamStr(3);
jetzt_critical := ParamStr(4);
sum_o_einzeln := ParamStr(5);
//CoInitialize(nil);
SQLConnection1 := TSQLConnection.Create(
nil);
SQLQuery1 := TSQLQuery.Create(
nil);
try
SQLConnection1.LoginPrompt := False;
SQLConnection1.DriverName := '
MySQL';
SQLConnection1.GetDriverFunc := '
getSQLDriverMYSQL50';
SQLConnection1.LibraryName := '
dbxopenmysql50.dll';
SQLConnection1.VendorLib := '
libmysql.dll';
SQLConnection1.Params.Values['
HostName'] := '
xxx';
SQLConnection1.Params.Values['
Database'] := '
xxx';
SQLConnection1.Params.Values['
User_Name'] := '
xxx';
SQLConnection1.Params.Values['
Password'] := '
xxx';
SQLConnection1.Open;
SQLConnection1.Connected := true;
SQLQuery1.SQLConnection := SQLConnection1;
if jetzt_critical = '
1'
then
imc := '
inner join nagios.nagios_servicestatus ss on ss.service_object_id = s.service_object_id and ss.current_state=2 '
else
imc := '
';
if uppercase(sum_o_einzeln) = '
S'
then
begin
// summe critical wahlweise über imc nur die die auch im moment critical sind
SQLQuery1.SQL.Add('
SELECT ' +
'
s.display_name, ' +
'
sum(TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time))) as ausfallzeit ' +
'
FROM nagios_hosts h ' +
'
inner join nagios_services s on s.host_object_id = h.host_object_id ' +
'
inner join nagios_servicechecks sc on sc.service_object_id = s.service_object_id ' +
imc +
'
where ' +
'
s.display_name like ' + quotedstr(like_service) + '
and ' +
'
sc.state = 2 and ' +
'
TIME_TO_SEC(TIMEDIFF(now(), sc.start_time)) < ' + start_crit + '
' +
'
group by s.display_name ' +
'
having sum(TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time))) > ' + sum_dif_s_e
);
end else
begin
// einzeln critical wahlweise über imc nur die die auch im moment critical sind
SQLQuery1.SQL.Add('
SELECT ' +
'
s.display_name, ' +
'
TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time)) ' +
'
FROM nagios_hosts h ' +
'
inner join nagios_services s on s.host_object_id = h.host_object_id ' +
'
inner join nagios_servicechecks sc on sc.service_object_id = s.service_object_id ' +
imc +
'
where ' +
'
s.display_name like ' + quotedstr(like_service) + '
and ' +
'
sc.state = 2 and ' +
'
TIME_TO_SEC(TIMEDIFF(now(), sc.start_time)) < ' + start_crit + '
and ' +
'
TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time)) > ' + sum_dif_s_e
);
end;
SQLQuery1.Active := true;
if SQLQuery1.RecordCount > 0
then
begin
repeat
returntext := returntext + SQLQuery1.FieldByName('
display_name').AsString + '
, ';
SQLQuery1.Next;
until SQLQuery1.Eof;
if copy(returntext, length(returntext) - 2, 1) = '
,'
then
returntext := copy(returntext, 1, length(returntext) - 1);
returncode := 2;
returntext := '
CRITICAL - Services laufen nicht in den angegebenen Zeitraeumen ' + returntext;
end else
begin
returncode := 0;
returntext := '
OK - alle Services laufen in den angegebenen Zeitraeumen';
end;
finally
//CoUninitialize;
writeln(returntext);
SQLQuery1.Active := false;
SQLConnection1.Close;
end;
end else
begin
writeln('
Benutzung: check_multi_af like_service start_crit sum_dif_s_e jetzt_crit sum_o_einz' +
CHR(10) + CHR(13) +
'
like_service: ist die Einschraenkung nach dem like des displaynamens. s.display_name like "like_service"' +
CHR(10) + CHR(13) +
'
start_crit: Ist die Zeit in Sekunden die das start_time kleiner sein muss damit der Service in das Ergebnis kommt. TIME_TO_SEC(TIMEDIFF(now(), sc.start_time)) < "start_crit"' +
CHR(10) + CHR(13) +
'
sum_dif_s_e: Ist die Zeit in Sekunden die entweder der einzelne Service oder die Summe des Services critisch sein muss damit der Service in das Ergebnis kommt(mit oder ohne sum). sum(TIME_TO_SEC(TIMEDIFF(sc.end_time, sc.start_time))) > "sum_dif_s_e"' +
CHR(10) + CHR(13) +
'
jetzt_crit: Bestimmt ob der Service jetzt auch critisch sein muss damit er in das Ergebnis kommt. 1=ja, 0=nein' +
CHR(10) + CHR(13) +
'
sum_o_einz: Bestimmt ob jede einzelne Zeit des Auftretens des crtitschen Service betrachtet wird oder die Summe der crtitschen Zeiten eines Services. s=summe, e=einzeln'
);
returncode := 3;
returntext := '
UNKNOWN - Nicht genuegend Parameter !';
end;
end.