129 lines
2.5 KiB
ObjectPascal
129 lines
2.5 KiB
ObjectPascal
unit cgi_daemon;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, DaemonApp, ConnectionsDmUnit,eventlog;
|
|
|
|
type
|
|
TLMSReportCGI=class;
|
|
{ TDaemonThread }
|
|
|
|
TDaemonThread=class(TThread)
|
|
fOwner: TLMSReportCGI;
|
|
fData: TConnectionsDM;
|
|
fLogger: TEventLog;
|
|
procedure Execute;override;
|
|
function sleepMin(n: integer): boolean;
|
|
constructor Create(AOwner: TLMSReportCGI);
|
|
end;
|
|
|
|
{ TLMSReportCGI }
|
|
|
|
TLMSReportCGI = class(TDaemon)
|
|
procedure DataModuleCreate(Sender: TObject);
|
|
procedure DataModuleDestroy(Sender: TObject);
|
|
procedure DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
|
|
procedure DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
|
|
private
|
|
workThread: TDaemonThread;
|
|
public
|
|
|
|
end;
|
|
|
|
var
|
|
LMSReportCGI: TLMSReportCGI;
|
|
|
|
implementation
|
|
uses
|
|
LazLogger;
|
|
procedure RegisterDaemon;
|
|
begin
|
|
RegisterDaemonClass(TLMSReportCGI)
|
|
end;
|
|
|
|
{$R *.lfm}
|
|
|
|
{ TLMSReportCGI }
|
|
|
|
procedure TLMSReportCGI.DataModuleCreate(Sender: TObject);
|
|
begin
|
|
self.Logger.Active:=false;
|
|
{$IFDEF WINDOWS}
|
|
self.Logger.AppendContent:=true;
|
|
self.Logger.LogType := ltFile;
|
|
self.Logger.FileName := format('%s/server.log',[extractfilepath(paramstr(0))]);
|
|
{$ELSE}
|
|
self.Logger.LogType := ltSystem;
|
|
{$ENDIF}
|
|
self.logger.Identification:='LMS-Report-Service';
|
|
self.Logger.Active:=true;
|
|
workThread := TDaemonThread.create(self);
|
|
end;
|
|
|
|
procedure TLMSReportCGI.DataModuleDestroy(Sender: TObject);
|
|
begin
|
|
workthread.free;
|
|
end;
|
|
|
|
procedure TLMSReportCGI.DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
|
|
begin
|
|
logger.Info('Запуск сервиса');
|
|
workThread.Start;
|
|
OK := true;
|
|
end;
|
|
|
|
procedure TLMSReportCGI.DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
|
|
begin
|
|
debugln('Останов сервиса');
|
|
workThread.Terminate;
|
|
workThread.WaitFor;
|
|
end;
|
|
|
|
{ TDaemonThread }
|
|
|
|
procedure TDaemonThread.Execute;
|
|
begin
|
|
flogger.debug('TDaemonThread.Execute');
|
|
fData := TConnectionsDM.CreateWithLog(fLogger);
|
|
try
|
|
fData.Start;
|
|
while not terminated do
|
|
begin
|
|
if sleepMin(5) then
|
|
fData.Idle(self);
|
|
end;
|
|
fData.Stop;
|
|
finally
|
|
fData.free;
|
|
end;
|
|
flogger.debug('TDaemonThread.Execute.complete');
|
|
end;
|
|
|
|
function TDaemonThread.sleepMin(n: integer): boolean;
|
|
var
|
|
i: integer;
|
|
begin
|
|
for i := 1 to n*60 do
|
|
begin
|
|
if terminated then break
|
|
else sleep(1000);
|
|
end;
|
|
result := not terminated;
|
|
end;
|
|
|
|
constructor TDaemonThread.Create(AOwner: TLMSReportCGI);
|
|
begin
|
|
inherited Create(true);
|
|
fOwner:=AOwner;
|
|
fLogger:=AOwner.Logger;
|
|
end;
|
|
|
|
|
|
initialization
|
|
RegisterDaemon;
|
|
end.
|
|
|