BSOne.SFC/eCrmHE/EXE_eCrmHomeEdition/Process/ProcessServerAPI.pas

1231 lines
41 KiB
Plaintext

{*******************************************************}
{ }
{ ProcessServerAPI }
{ }
{ Copyright (C) 2023 kku }
{ }
{*******************************************************}
unit ProcessServerAPI;
interface
uses
System.SysUtils, System.Classes, Winapi.Windows, IdHTTP;
type
TReqPoKind = (rpkId, rpkAll, rpkMng, rpkSelPo, npkSelPoCate, npkSelPoKey);
function ProcessSignal(bFailChangeDestUrl: Boolean = true): Boolean;
function ProcessRcvPolicy(aKind: TReqPoKind; sPoId: String = ''; sPoAddInfo: String = ''; aHTTP: TIdHTTP = nil): Boolean;
//function CheckAip14Module: Boolean;
implementation
uses
ManagerService, superobject, Tocsg.Trace, SecureApp, Tocsg.WinInfo,
System.DateUtils, ManagerModel, Tocsg.Network, Condition, Tocsg.Convert,
Tocsg.Path, GlobalDefine, License, CrmUtil, Winapi.Messages, Tocsg.Exception,
Tocsg.Safe, AbUnzper, AbArcTyp, Tocsg.Strings, System.Zip, Tocsg.Files,
Tocsg.Process, Define, Tocsg.Registry, DeCrmHeMain, IdExceptionCore,
Tocsg.Win32, Tocsg.Cert, ProcessUninstall, Tocsg.Shell, System.IniFiles,
ProcessPrint;
const
MAX_EXP = 12;
MAX_EXP_D = 13;
var
_dwSpoolDL_Tick: DWORD = 0;
_dwAip14DL_Tick: DWORD = 0;
_dwAip17DL_Tick: DWORD = 0;
_dwKeyviewDL_Tick: DWORD = 0;
// _sChkVal1: String = ''; // 결재요청 중복 확인을 위함
// _sChkVal2: String = ''; // 결재결과 중복 확인을 위함
// _sChkVal3: String = '';
// _sChkVal4: String = '';
// _sChkVal5: String = '';
// _sChkVal6: String = '';
_arrUpdReq: array [1..MAX_EXP] of String = (
'upd_printRequestUrlList', 'upd_usbRequestUrlList', 'upd_brConnRequestUrlList',
'upd_drmDecRequestUrlList', 'upd_fileExportRequestUrlList', 'upd_mtpRequestUrlList',
'upd_btRequestUrlList', 'upd_cdDvdRequestUrlList', 'upd_watermarkRequestUrlList',
'upd_captureAppRequestUrlList', 'upd_preFileExportRequestUrlList', 'upd_printPostRequestUrlList'
);
_arrUpdDone: array [1..MAX_EXP_D] of String = (
'upd_printDoneList', 'upd_usbDoneList', 'upd_brConnDoneList',
'upd_drmDecDoneList', 'upd_fileExportDoneList', 'upd_mtpDoneList',
'upd_btDoneList', 'upd_cdDvdDoneList', 'upd_watermarkDoneList',
'upd_captureAppDoneList', 'upd_preFileExportDoneList', 'upd_printPostDoneList',
'upd_printPostRequestDoneList'
);
_arrChkReqVal: array [1..MAX_EXP] of String;
_arrChkDoneVal: array [1..MAX_EXP_D] of String;
_NewAgentInfo: TCheckAgentInfo;
function HttpPost(aHTTP: TIdHTTP; sDest, sRqType, sParam: String): String;
var
ss: TStringStream;
begin
Result := '';
try
ss := TStringStream.Create(sParam, TEncoding.UTF8);
try
aHTTP.Request.CustomHeaders.Values['requestType'] := sRqType;
Result := aHTTP.Post(sDest, ss);
if (Result = '') and (aHTTP.ResponseCode = 200) then
Result := 'true';
finally
ss.Free;
end;
except
on E: EIdReadTimeout do
begin
TTgTrace.T('HttpPost() .. ReadTimeout ..');
Result := POST_TIMEOUT;
exit;
end;
on E: Exception do
begin
{$IFDEF TRACE1}
ETgException.TraceException(Self, E, Format('Fail .. HttpPost(), RqType=%s', [sRqType]));
{$ENDIF}
end;
end;
end;
function ProcessRcvPolicy(aKind: TReqPoKind; sPoId: String = ''; sPoAddInfo: String = ''; aHTTP: TIdHTTP = nil): Boolean;
var
O, OP: ISuperObject;
sReqCmd, sReqType, sRes: String;
bCodePo: Boolean;
begin
Result := false;
try
O := SO;
O.S['KEY_AGENTID'] := gMgSvc.AgentId;
O.S['KEY_EMPNO'] := gMgSvc.EmpNo;
O.S['KEY_HOSTNAME'] := gMgSvc.UserName;
if gMgSvc.HandleConfig <> nil then
begin
if gMgSvc.HandleConfig.OsMajorVer <> '' then
O.S['KEY_OSVER'] := Format('%s (%s)', [gMgSvc.HandleConfig.OsVersion, gMgSvc.HandleConfig.OsMajorVer])
else
O.S['KEY_OSVER'] := gMgSvc.HandleConfig.OsVersion;
end else
O.S['KEY_OSVER'] := 'test';
case aKind of
rpkId : sReqType := '0';
rpkAll : sReqType := '1';
rpkMng : sReqType := '2';
rpkSelPo :
begin
sReqType := '3';
if sPoId = '' then
begin
TTgTrace.T('ProcessRcvPolicy() .. rpkSelPo .. EmptyID');
exit;
end;
O.S['KEY_POLICYID'] := sPoId;
end;
npkSelPoCate :
begin
sReqType := '4';
if sPoId = '' then
begin
TTgTrace.T('ProcessRcvPolicy() .. rpkSelPo .. EmptyID');
exit;
end;
if sPoAddInfo = '' then
begin
TTgTrace.T('ProcessRcvPolicy() .. npkSelPoCate .. EmptyCate');
exit;
end;
O.S['KEY_POLICYID'] := sPoId;
O.S['KEY_CATEGORY'] := sPoAddInfo;
end;
npkSelPoKey :
begin
sReqType := '5';
if sPoId = '' then
begin
TTgTrace.T('ProcessRcvPolicy() .. rpkSelPo .. EmptyID');
exit;
end;
if sPoAddInfo = '' then
begin
TTgTrace.T('ProcessRcvPolicy() .. npkSelPoKey .. EmptyKey');
exit;
end;
O.S['KEY_POLICYID'] := sPoId;
O.S['KEY_POLICYKEY'] := sPoAddInfo;
end;
end;
// {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\pa.json'); {$ENDIF}
bCodePo := gMgSvc.PrefModel.CodePo and gMgSvc.PrefModel.IsAbleCodePo;
if bCodePo then
sReqCmd := 'policyRequest.do?idType=n'
else
sReqCmd := 'policyRequest.do';
if aHTTP <> nil then
sRes := HttpPost(aHTTP, gMgSvc.DestIPort + sReqCmd, sReqType, O.AsString)
else
sRes := gMgSvc.HttpPost(gMgSvc.DestIPort + sReqCmd, sReqType, O.AsString);
if sRes = '' then
begin
TTgTrace.T('ProcessRcvPolicy() .. Empty .. Msg="%s", Code=%d', [gMgSvc.HttpErrorMsg, gMgSvc.HttpErrorCode]);
exit;
end else
if sRes = POST_TIMEOUT then
begin
TTgTrace.T('ProcessRcvPolicy() .. timeout .. Msg="%s", Code=%d', [gMgSvc.HttpErrorMsg, gMgSvc.HttpErrorCode]);
exit;
end;
{$IFDEF DEBUG} {$ENDIF}
SaveJsonObjToFile(SO(sRes), 'c:\pd.json');
OP := SO(sRes);
if OP = nil then
begin
TTgTrace.T('ProcessRcvPolicy() .. Invalid policy');
exit;
end;
case aKind of
rpkId : ;
rpkAll :
begin
var sGrpName: String := OP.S['GROUP_NAME'];
if gMgSvc.AgentModel.Location <> sGrpName then
begin
gMgSvc.AgentModel.Location := sGrpName;
gMgSvc.AgentModel.Save;
end;
gMgSvc.PrefModel.PolicyGroup := sGrpName;
gMgSvc.PrefModel.PolicyId := OP.S['SECUMODE'];
gMgSvc.SleepPolicy.PolicyGroup := sGrpName;
gMgSvc.SleepPolicy.PolicyId := OP.S['SLEEPMODE'];
gMgSvc.VulPolicy.PolicyGroup := sGrpName;
gMgSvc.VulPolicy.PolicyId := OP.S['VULMODE'];
gMgSvc.OffPolicy.PolicyGroup := sGrpName;
gMgSvc.OffPolicy.PolicyId := OP.S['OFFLINEMODE'];
gMgSvc.ExpPolicy.PolicyGroup := sGrpName;
gMgSvc.ExpPolicy.PolicyId := OP.S['EXCEPTMODE'];
var nOldScreenOld: Integer := gMgSvc.ModePolicy.ScreenLogoAlpha;
if OP.O['POL_SET'] <> nil then
gMgSvc.PrefModel.SetSetPolicy(OP.O['POL_SET'], bCodePo);
if OP.O['POL_MNG'] <> nil then
begin
gMgSvc.PrefModel.SetMngPolicy(OP.O['POL_MNG'], bCodePo);
if gMgSvc.PrefModel.HideMainUI and gMain.Showing then
PostMessage(gMgSvc.RcvHwnd, WM_REFRESH_VIEW, 1, 0);
end;
if (OP.S['SECUMODE'] <> '') and (OP.S['SECUMODE'].ToLower <> 'false') and
(OP.O['POL_SEC'] <> nil) then
gMgSvc.PrefModel.SetPolicy(OP.S['SECUMODE'], OP.O['POL_SEC'], bCodePo);
if (OP.S['SLEEPMODE'] <> '') and (OP.S['SLEEPMODE'].ToLower <> 'false') and
(OP.O['POL_SLP'] <> nil) then
gMgSvc.SleepPolicy.SetPolicy(OP.S['SLEEPMODE'], OP.O['POL_SLP'], bCodePo)
else
gMgSvc.SleepPolicy.Clear(true, true);
if (OP.S['VULMODE'] <> '') and (OP.S['VULMODE'].ToLower <> 'false') and
(OP.O['POL_VUL'] <> nil) then
gMgSvc.VulPolicy.SetPolicy(OP.S['VULMODE'], OP.O['POL_VUL'], bCodePo)
else
gMgSvc.VulPolicy.Clear(true, true);
if (OP.S['OFFLINEMODE'] <> '') and (OP.S['OFFLINEMODE'].ToLower <> 'false') and
(OP.O['POL_OFF'] <> nil) then
gMgSvc.OffPolicy.SetPolicy(OP.S['OFFLINEMODE'], OP.O['POL_OFF'], bCodePo)
else
gMgSvc.OffPolicy.Clear(true, true);
if (OP.S['EXCEPTMODE'] <> '') and (OP.S['EXCEPTMODE'].ToLower <> 'false') and
(OP.O['POL_EXC'] <> nil) then
begin
gMgSvc.ExpPolicy.SetPolicy(OP.S['EXCEPTMODE'], OP.O['POL_EXC'], bCodePo);
end else
if gMgSvc.IsOfflineExp then
begin
if (gMgSvc.ExpPolicy.InternalPoId <> 'TEMP') and
(gMgSvc.ExpPolicy.InternalPoId <> 'false') then // 정책 할당안된 예외모드가 아니라면
begin
gMgSvc.ClearExpPolicy;
gMgSvc.ExpPolicy.Clear(true, true);
end;
end else
gMgSvc.ExpPolicy.Clear(true, true);
if nOldScreenOld <> gMgSvc.ModePolicy.ScreenLogoAlpha then
gMgSvc.UpdateScreenLogo(true);
end;
rpkMng : ;
rpkSelPo : ;
npkSelPoCate : ;
npkSelPoKey : ;
end;
gMgSvc.RefreshView;
{$IFDEF DEBUG} SaveJsonObjToFile(OP, 'c:\ps.json'); {$ENDIF}
Result := true;
except
on E: Exception do
ETgException.TraceException(E, 'Fail .. ProcessRcvPolicy()');
end;
end;
procedure ProcessDownloadModules;
var
sCurDir,
sChkPath: String;
ms: TMemoryStream;
function ExtrZip(sDestDir: String; bIgrErr: Boolean = false): Boolean;
var
zip: TAbUnZipper;
begin
if ms.Size = 0 then
exit;
Result := bIgrErr;
if not ForceDirectories(sDestDir) then
exit;
try
Guard(zip, TAbUnzipper.Create(nil));
zip.Stream := ms;
// zip.FileName := sResPath;
zip.ExtractOptions := [eoCreateDirs, eoRestorePath];
zip.BaseDirectory := sDestDir;
// zip.OnArchiveProgress := ;
// zip.OnNeedPassword := ;
zip.ExtractFiles('*.*');
Result := true;
except
on E: Exception do
ETgException.TraceException(E, Format('Fail .. ExtrZip(), ExtrDir="%s"', [sDestDir]));
end;
end;
var
bSuccess: Boolean;
begin
try
{$IFDEF DEBUG}
exit;
{$ENDIF}
if not gMgSvc.Connected then
exit;
Guard(ms, TMemoryStream.Create);
sCurDir := GetRunExePathDir;
if not gMgSvc.IsWin7Ver and IsSupportAIP then
begin
try
// 1.17 버전 다운로드, 확인
if FileExists(sCurDir + DIR_CONF + EXE_AIP17) and
not FileExists(sCurDir + DIR_AIP17 + 'Microsoft.InformationProtection.dll') and
((_dwAip17DL_Tick = 0) or ((GetTickCount - _dwAip17DL_Tick) >= 180000 )) then // 실패 시 3분에 한번 시도
begin
TTgTrace.T('ProcessDownloadModules .. AIP17 ..');
_dwAip17DL_Tick := 0;
bSuccess := false;
ms.Clear;
try
gMgSvc.HTTP.Get(gMgSvc.DestIPort + 'aapi/static-comps/hec-aip17', ms);
except
_dwAip17DL_Tick := GetTickCount;
end;
if ms.Size > 0 then
begin
bSuccess := ExtrZip(sCurDir + DIR_AIP17);
bSuccess := bSuccess and FileExists(sCurDir + DIR_AIP17 + 'Microsoft.InformationProtection.dll');
end;
if not bSuccess then
begin
TTgTrace.T('ProcessDownloadModules .. AIP17 .. Fail');
end else begin
TTgTrace.T('ProcessDownloadModules .. AIP17 .. OK');
_dwAip17DL_Tick := GetTickCount;
end;
end;
// 1.14 버전 다운로드, 확인
if not FileExists(sCurDir + DIR_AIP17 + 'Microsoft.InformationProtection.dll') and
not FileExists(sCurDir + DIR_AIP14 + 'Microsoft.InformationProtection.dll') and
FileExists(sCurDir + DIR_CONF + EXE_AIP14) and
((_dwAip14DL_Tick = 0) or ((GetTickCount - _dwAip14DL_Tick) >= 180000 )) then // 실패 시 3분에 한번 시도
begin
TTgTrace.T('ProcessDownloadModules .. AIP14 ..');
_dwAip14DL_Tick := 0;
bSuccess := false;
ms.Clear;
try
gMgSvc.HTTP.Get(gMgSvc.DestIPort + 'agentDownloadReq/' + DOWNLOAD_TYPE_AIP14, ms);
except
_dwAip14DL_Tick := GetTickCount;
end;
if ms.Size > 0 then
begin
bSuccess := ExtrZip(sCurDir + DIR_AIP14);
bSuccess := bSuccess and FileExists(sCurDir + DIR_AIP14 + 'Microsoft.InformationProtection.dll');
end;
if not bSuccess then
begin
// _dwAip14DL_Tick := GetTickCount;
TTgTrace.T('ProcessDownloadModules .. AIP14 .. Fail');
end else begin
TTgTrace.T('ProcessDownloadModules .. AIP14 .. OK');
_dwAip14DL_Tick := GetTickCount;
end;
end;
except
on E: Exception do
begin
ETgException.TraceException(E, 'Fail .. ProcessDownloadModules() - AIP');
_dwAip14DL_Tick := GetTickCount;
_dwAip17DL_Tick := _dwAip14DL_Tick;
end;
end;
if FileExists(sCurDir + DIR_AIP17 + 'Microsoft.InformationProtection.dll') then
begin
if FileExists(sCurDir + DAT_AIPUP17) then
begin
if not FileExists(sCurDir + DIR_AIP17 + EXE_AIP) then
DeleteFile(PChar(sCurDir + DAT_AIPUP17));
end else begin
TerminateProcessByName(EXE_AIP);
// Sleep(1000);
if DeleteFile_wait(sCurDir + DIR_AIP17 + EXE_AIP) and
FileExists(sCurDir + DIR_CONF + EXE_AIP17) and
CopyFile(PChar(sCurDir + DIR_CONF + EXE_AIP17), PChar(sCurDir + DIR_AIP17 + EXE_AIP), false) then
begin
WriteLnFileEndUTF8(sCurDir + DAT_AIPUP17, DateTimeToStr(Now));
// DeleteFile(PChar(sCurDir + DIR_CONF + EXE_AIP14));
end;
// 이게 왜 사라지는지 모르겠지만... 보완 처리 23_1204 09:55:26 kku
if not FileExists(sCurDir + DIR_AIP17 + 'Newtonsoft.Json.dll') then
CopyFile(PChar(sCurDir + DIR_CONF + 'Newtonsoft.Json.dll'), PChar(sCurDir + DIR_AIP17 + 'Newtonsoft.Json.dll'), false);
Sleep(1000);
if not FileExists(sCurDir + DIR_AIP17 + EXE_AIP) or
(GetFileSize_path(sCurDir + DIR_AIP17 + EXE_AIP) = 0) then
begin
// 파일 구성이 잘못되었다면 다시 처리할 수 있도록 지움 24_0221 15:09:34 kku
DeleteFile(PChar(sCurDir + DAT_AIPUP17));
DeleteDir(sCurDir + DIR_AIP17);
end else begin
DeleteFile(PChar(sCurDir + DAT_AIPUP));
DeleteDir(sCurDir + DIR_AIP14);
end;
end;
end else
if FileExists(sCurDir + DIR_AIP14 + 'Microsoft.InformationProtection.dll') then
begin
if FileExists(sCurDir + DAT_AIPUP) then
begin
if not FileExists(sCurDir + DIR_AIP14 + EXE_AIP) then
DeleteFile(PChar(sCurDir + DAT_AIPUP));
end else begin
TerminateProcessByName(EXE_AIP);
// Sleep(1000);
if DeleteFile_wait(sCurDir + DIR_AIP14 + EXE_AIP) and
FileExists(sCurDir + DIR_CONF + EXE_AIP14) and
CopyFile(PChar(sCurDir + DIR_CONF + EXE_AIP14), PChar(sCurDir + DIR_AIP14 + EXE_AIP), false) then
begin
WriteLnFileEndUTF8(sCurDir + DAT_AIPUP, DateTimeToStr(Now));
// DeleteFile(PChar(sCurDir + DIR_CONF + EXE_AIP14));
end;
// 이게 왜 사라지는지 모르겠지만... 보완 처리 23_1204 09:55:26 kku
if not FileExists(sCurDir + DIR_AIP14 + 'Newtonsoft.Json.dll') then
CopyFile(PChar(sCurDir + DIR_CONF + 'Newtonsoft.Json.dll'), PChar(sCurDir + DIR_AIP14 + 'Newtonsoft.Json.dll'), false);
Sleep(1000);
if not FileExists(sCurDir + DIR_AIP14 + EXE_AIP) or
(GetFileSize_path(sCurDir + DIR_AIP14 + EXE_AIP) = 0) then
begin
// 파일 구성이 잘못되었다면 다시 처리할 수 있도록 지움 24_0221 15:09:34 kku
DeleteFile(PChar(sCurDir + DAT_AIPUP));
DeleteDir(sCurDir + DIR_AIP14);
end;
end;
end;
end;
// if not IsPrintWaterHook and
if (not FileExists(sCurDir + DIR_CONF + EXE_SPL) or not FileExists(sCurDir + DIR_CONF + 'spl2pdf_lib\xps.dll')) and
((_dwSpoolDL_Tick = 0) or ((GetTickCount - _dwSpoolDL_Tick) >= 180000 )) then // 실패 시 3분에 한번 시도
begin
try
TTgTrace.T('ProcessDownloadModules .. SPOOL ..');
_dwSpoolDL_Tick := 0;
bSuccess := false;
ms.Clear;
try
gMgSvc.HTTP.Get(gMgSvc.DestIPort + 'agentDownloadReq/' + DOWNLOAD_TYPE_SPOOL, ms);
except
_dwSpoolDL_Tick := GetTickCount;
end;
if ms.Size > 0 then
begin
bSuccess := ExtrZip(sCurDir + DIR_CONF);
bSuccess := bSuccess and FileExists(sCurDir + DIR_CONF + 'spl2pdf_lib\xps.dll');
end;
if not bSuccess then
begin
// _dwSpoolDL_Tick := GetTickCount;
TTgTrace.T('ProcessDownloadModules .. SPOOL .. Fail');
end else begin
TTgTrace.T('ProcessDownloadModules .. SPOOL .. OK');
_dwSpoolDL_Tick := GetTickCount;
end;
except
on E: Exception do
begin
ETgException.TraceException(E, 'Fail .. ProcessDownloadModules() - SPOOL');
_dwSpoolDL_Tick := GetTickCount;
end;
end;
end;
if not FileExists(sCurDir + 'bin\' + EXE_KV) and
((_dwKeyviewDL_Tick = 0) or ((GetTickCount - _dwKeyviewDL_Tick) >= 180000 )) then // 실패 시 3분에 한번 시도
begin
try
TTgTrace.T('ProcessDownloadModules .. KV ..');
_dwKeyviewDL_Tick := 0;
bSuccess := false;
ms.Clear;
try
gMgSvc.HTTP.Get(gMgSvc.DestIPort + 'agentDownloadReq/' + DOWNLOAD_TYPE_KEYVIEW, ms);
except
_dwKeyviewDL_Tick := GetTickCount;
end;
if ms.Size > 0 then
begin
bSuccess := ExtrZip(sCurDir + 'bin\');
bSuccess := bSuccess and FileExists(sCurDir + 'bin\' + EXE_KV);
end;
if not bSuccess then
begin
// _dwKeyviewDL_Tick := GetTickCount;
TTgTrace.T('ProcessDownloadModules .. KV .. Fail');
end else begin
TTgTrace.T('ProcessDownloadModules .. KV .. OK');
_dwKeyviewDL_Tick := GetTickCount;
end;
except
on E: Exception do
begin
ETgException.TraceException(E, 'Fail .. ProcessDownloadModules() - CTT');
_dwKeyviewDL_Tick := GetTickCount;
end;
end;
end;
except
on E: Exception do
begin
ETgException.TraceException(E, 'Fail .. ProcessDownloadModules()');
end;
end;
end;
function ProcessSignal(bFailChangeDestUrl: Boolean = true): Boolean;
function CheckUpdateAble: Boolean;
var
sNewVer,
sCurVer: String;
NewVers,
CurVers: TStringList;
ullNew, ullCur: ULONGLONG;
i: Integer;
begin
Result := false;
try
if not gMgSvc.PrefModel.IsAgentUpdateExist then
exit;
if gMgSvc.UpdateTick <> 0 then
exit;
sNewVer := gMgSvc.PrefModel.AgentPatchVersion;
if sNewVer = '' then
exit;
sCurVer := SdkVersion;
if sNewVer = sCurVer then
exit;
if gMgSvc.PrefModel.IsFixedVerUpdate then
begin
// 서버에 있는 에이전트로 강제 업데이트 추가 24_0123 09:13:15 kku
Result := true;
end else begin
Guard(NewVers, TStringList.Create);
Guard(CurVers, TStringList.Create);
if SplitString(sNewVer, '.', NewVers) = 0 then
exit;
if SplitString(sCurVer, '.', CurVers) = 0 then
begin
Result := StrToIntDef(NewVers[0], 0) > StrToIntDef(sCurVer, 0);
exit;
end;
for i := 0 to NewVers.Count - 1 do
begin
if i >= CurVers.Count then
begin
Result := true;
exit;
end;
if StrToIntDef(NewVers[i], 0) < StrToIntDef(CurVers[i], 0) then
exit;
if StrToIntDef(NewVers[i], 0) > StrToIntDef(CurVers[i], 0) then
begin
Result := true;
exit;
end;
end;
end;
except
on E: Exception do
ETgException.TraceException(E, 'Fail .. CheckUpdateAble()');
end;
end;
procedure ProcessUpdate;
var
sUrl,
sNewVer,
sPtPath: String;
fs: TFileStream;
nOldTO: Integer;
begin
try
sNewVer := gMgSvc.PrefModel.AgentPatchVersion;
sUrl := gMgSvc.DestIPort + 'agentDownReq/' + DOWNLOAD_TYPE_PATCH;
nOldTO := gMgSvc.HTTP.ReadTimeout;
gMgSvc.HTTP.ReadTimeout := 120000;
sPtPath := GetProgramFilesDir + DIR_TG;
fs := TFileStream.Create(sPtPath + ZIP_PT, fmCreate);
try
gMgSvc.HTTP.Get(sUrl, fs);
Sleep(500);
if FileExists(sPtPath + ZIP_PT) then
begin
FreeAndNil(fs);
if GetFileSize_path(sPtPath + ZIP_PT) = 0 then
begin
DeleteFile(PChar(sPtPath + ZIP_PT));
exit;
end;
TZipFile.ExtractZipFile(sPtPath + ZIP_PT, sPtPath);
DeleteFile(PChar(sPtPath + ZIP_PT));
if FileExists(sPtPath + EXE_PT) then
begin
DelRegValue(HKEY_LOCAL_MACHINE, REG_HE, 'LP');
gMgSvc.SendEventLog(URI_USERUPDATE, SYSEVT_AGENT_PATCH, 'Patch Downloaded : ' + sNewVer);
gMgSvc.UpdateTick := GetTickCount;
if not IsFileSigned(sPtPath + EXE_PT) then
begin
// 다음 정책 받을때까지 업데이트 시도 되지 않도록 조치 25_0414 10:23:33 kku
gMgSvc.PrefModel.AgentPatchVersion := '';
DeleteFile(PChar(sPtPath + EXE_PT));
TTgTrace.T('Fail .. ProcessUpdate() .. Unsigned installation file. FName=%s', [EXE_PT]);
gMgSvc.SendEventLogEx(AUDIT_AGENT_PATCH_FAIL, Format('Patch Fail : %s, Unsigned installation file.', [sNewVer]));
end else
ExecuteApp(sPtPath + EXE_PT, '', SW_HIDE);
end;
end;
finally
if fs <> nil then
FreeAndNil(fs);
gMgSvc.HTTP.ReadTimeout := nOldTO;
end;
except
on E: Exception do
ETgException.TraceException(E, 'Fail .. ProcessUpdate()');
end;
end;
var
sReqType,
sEulaCon, sHostName,
sAvInfo, sAsInfo, sFwInfo, sRes: String;
O: ISuperObject;
bChangedPolicy: Boolean;
// NewAgentInfo: TCheckAgentInfo;
bChangeAgentInfo: Boolean;
function IsChangeAgentInfo: Boolean;
begin
Result := true;
with gMgSvc.AgentInfo do
begin
if sAgentId <> _NewAgentInfo.sAgentId then exit;
if sIp <> _NewAgentInfo.sIp then exit;
if sIps <> _NewAgentInfo.sIps then exit;
if sMAC <> _NewAgentInfo.sMAC then exit;
if sAccount <> _NewAgentInfo.sAccount then exit;
if sHostName <> _NewAgentInfo.sHostName then exit;
if sEulaCon <> _NewAgentInfo.sEulaCon then exit;
if sLocation <> _NewAgentInfo.sLocation then exit;
if sPwSet <> _NewAgentInfo.sPwSet then exit;
if sPwSetTermOk <> _NewAgentInfo.sPwSetTermOk then exit;
if sScrnLock <> _NewAgentInfo.sScrnLock then exit;
if sOsVer <> _NewAgentInfo.sOsVer then exit;
if sAvInfo <> _NewAgentInfo.sAvInfo then exit;
if sFwInfo <> _NewAgentInfo.sFwInfo then exit;
if sOsSafe <> _NewAgentInfo.sOsSafe then exit;
if sPatchExist <> _NewAgentInfo.sPatchExist then exit;
if sAvSafe <> _NewAgentInfo.sAvSafe then exit;
if sAvUptodate <> _NewAgentInfo.sAvUptodate then exit;
if sFwSafe <> _NewAgentInfo.sFwSafe then exit;
if sPiSafe <> _NewAgentInfo.sPiSafe then exit;
if sEmpNo <> _NewAgentInfo.sEmpNo then exit;
// if bSafePcSHCD <> _NewAgentInfo.bSafePcSHCD then exit;
if bJoinAD <> _NewAgentInfo.bJoinAD then exit;
if sModeName <> _NewAgentInfo.sModeName then exit;
end;
Result := false;
end;
var
bUpdate,
bConnected,
bPrevConnected: Boolean;
SecuApp: TSecureApp;
wURole: WORD;
i: Integer;
sKName: String;
Label
LB_SignalComplete;
begin
Result := false;
try
if gMgSvc.EmpNo = '' then
begin
TTgTrace.T('ProcessSignal() .. Init .. Empty EmpNo ..');
Sleep(3000);
exit;
end;
// TTgTrace.T('ProcessSignal() .. exit');
// exit;
sHostName := gMgSvc.UserName;
if sHostName = '' then
begin
TTgTrace.T('ProcessSignal() .. Init .. Empty HostName?? .. GetComAct=%s', [GetComName + '\' + GetAccount]);
Sleep(5000);
exit;
end;
if gMgSvc.IsOfflineMode then
goto LB_SignalComplete;
if gMgSvc.HandleSecurity <> nil then
begin
SecuApp := gMgSvc.HandleSecurity.GetMainAv;
if (SecuApp <> nil) and (SecuApp.Name <> '') then
begin
sAvInfo := SecuApp.Name + MODEL_SEPARATOR + // MODEL_SEPARATOR +
SecuApp.Path + MODEL_SEPARATOR + SecuApp.Timestamp;
end else
sAvInfo := 'null';
SecuApp := gMgSvc.HandleSecurity.GetMainAs;
if (SecuApp <> nil) and (SecuApp.Name <> '') then
begin
sAsInfo := SecuApp.Name + MODEL_SEPARATOR +
SecuApp.Path + MODEL_SEPARATOR + SecuApp.Timestamp;
end else
sAsInfo := 'null';
SecuApp := gMgSvc.HandleSecurity.GetMainFw;
if (SecuApp <> nil) and (SecuApp.Name <> '') then
begin
sFwInfo := SecuApp.Name + MODEL_SEPARATOR +
SecuApp.Path + MODEL_SEPARATOR + SecuApp.Timestamp;
end else
sFwInfo := 'null';
end else begin
sAvInfo := 'null';
sAsInfo := 'null';
sFwInfo := 'null';
end;
sEulaCon := 'disagree';
if gMgSvc.AgentModel.EulaDT <> 0 then
sEulaCon := FormatDateTime('yyyy-mm-dd hh:nn:ss', gMgSvc.AgentModel.EulaDT);
_NewAgentInfo.sAgentId := gMgSvc.AgentId;
if gMgSvc.NicService <> nil then
begin
_NewAgentInfo.sIp := gMgSvc.NicService.GetIP;
_NewAgentInfo.sIps := gMgSvc.NicService.IpAll;
_NewAgentInfo.sMAC := gMgSvc.NicService.GetMAC;
end else begin
_NewAgentInfo.sIp := 'ip';
_NewAgentInfo.sIps := 'ips';
_NewAgentInfo.sMAC := 'mac';
end;
_NewAgentInfo.sAccount := gMgSvc.Account;
if IsUseHostNameOnly then
_NewAgentInfo.sHostName := gMgSvc.ComName
else
_NewAgentInfo.sHostName := sHostName;
_NewAgentInfo.sEulaCon := sEulaCon;
if gMgSvc.PrefModel.PolicyGroup <> '' then
_NewAgentInfo.sLocation := gMgSvc.PrefModel.PolicyGroup
else
_NewAgentInfo.sLocation := gMgSvc.PrefModel.PolicyName;
if gMgSvc.VulService <> nil then
begin
_NewAgentInfo.sPwSet := BooleanToStr(gMgSvc.VulService.IsPasswordSet, 'true', 'false');
_NewAgentInfo.sPwSetTermOk := BooleanToStr(gMgSvc.VulService.IsPasswordSetTermOk, 'true', 'false');
_NewAgentInfo.sScrnLock := BooleanToStr(gMgSvc.VulService.IsScreenSaverSet, 'true', 'false');
end else begin
_NewAgentInfo.sPwSet := 'true';
_NewAgentInfo.sPwSetTermOk := 'true';
_NewAgentInfo.sScrnLock := 'true';
end;
if gMgSvc.HandleConfig <> nil then
begin
if gMgSvc.HandleConfig.OsMajorVer <> '' then
_NewAgentInfo.sOsVer := Format('%s (%s)', [gMgSvc.HandleConfig.OsVersion, gMgSvc.HandleConfig.OsMajorVer]) // gMgSvc.VulService.OsVersion;
else
_NewAgentInfo.sOsVer := gMgSvc.HandleConfig.OsVersion;
end else
_NewAgentInfo.sOsVer := 'test2';
_NewAgentInfo.sAvInfo := sAvInfo;
_NewAgentInfo.sFwInfo := sFwInfo;
if gMgSvc.VulService <> nil then
begin
_NewAgentInfo.sOsSafe := BooleanToStr(gMgSvc.VulService.IsOsSafe, 'true', 'false');
_NewAgentInfo.sPatchExist := BooleanToStr(gMgSvc.VulService.IsOsPatchUptoDate, 'true', 'false');
_NewAgentInfo.sAvUptodate := BooleanToStr(gMgSvc.VulService.IsAntiVirusUpToDate, 'true', 'false');
_NewAgentInfo.sAvSafe := BooleanToStr(gMgSvc.VulService.IsAvOn, 'true', 'false');
_NewAgentInfo.sFwSafe := BooleanToStr(gMgSvc.VulService.IsFirewallOn, 'true', 'false');
end else begin
_NewAgentInfo.sOsSafe := 'true';
_NewAgentInfo.sPatchExist := 'true';
_NewAgentInfo.sAvUptodate := 'true';
_NewAgentInfo.sAvSafe := 'true';
_NewAgentInfo.sFwSafe := 'true';
end;
_NewAgentInfo.sPiSafe := BooleanToStr(gMgSvc.IsSchRstVul, 'false', 'true');
case gMgSvc.HeModeKind of
hmkSleep : _NewAgentInfo.sModeName := 'Sleep';
hmkSecurity : _NewAgentInfo.sModeName := 'Secu';
hmkVulnerability : _NewAgentInfo.sModeName := 'Vul';
hmkOffline : _NewAgentInfo.sModeName := 'Offline';
hmkException : _NewAgentInfo.sModeName := 'Exption';
end;
_NewAgentInfo.sEmpNo := gMgSvc.EmpNo;
// _NewAgentInfo.bSafePcSHCD := (CUSTOMER_TYPE = CUSTOMER_SHCD) and FileExists(GetRunExePathDir + EXE_SafePCUninst);
_NewAgentInfo.bJoinAD := IsJoinAD;
O := SO;
bPrevConnected := gMgSvc.Connected;
bChangeAgentInfo := IsChangeAgentInfo;
// 공통
O.S['KEY_AGENTID'] := _NewAgentInfo.sAgentId;
O.S['KEY_EMPNO'] := _NewAgentInfo.sEmpNo;
O.S['KEY_HOSTNAME'] := _NewAgentInfo.sHostName;
O.S['KEY_MODE'] := _NewAgentInfo.sModeName;
O.S['VUL_OSVER'] := _NewAgentInfo.sOsVer; // 시그널 패킷에도 OS정보 추가 23_1214 15:48:03 kku
O.S['KEY_LASTPOLICY'] := gMgSvc.LastPolicy; // 빈값을 넣으면 응답도 빈값으로 온다... 23_0802 11:06:47 kku
// O.S['KEY_LASTPUSH'] := ''; //'2024-10-10 11:11:11';//gMgSvc.LastPolicy; // 빈값을 넣으면 응답도 빈값으로 온다... 23_0802 11:06:47 kku
if CUSTOMER_TYPE = CUSTOMER_KIMCHANG then
O.S['key_xPrintVer'] := gMgSvc.xPrintVer;
sReqType := '0';
if not bPrevConnected or bChangeAgentInfo then
begin
sReqType := '1';
O.S['KEY_IP'] := _NewAgentInfo.sIp;
O.S['KEY_IPS'] := _NewAgentInfo.sIps;
O.S['KEY_MAC'] := _NewAgentInfo.sMAC;
O.S['KEY_ACCOUNT'] := _NewAgentInfo.sAccount;
O.S['KEY_GROUPNAME'] := _NewAgentInfo.sLocation;
O.S['KEY_AGENTTYPE'] := BooleanToStr(IsVDI, 'VDI', 'PC');
O.S['KEY_COLLASTCONN'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now);
O.S['KEY_COLVERSION'] := SdkVersion;
O.S['VUL_PWDSET'] := _NewAgentInfo.sPwSet;
if _NewAgentInfo.sPwSetTermOk <> 'true' then
begin
var nOver: Integer := DaysBetween(Now, gMgSvc.LastChangePwDT);
if (nOver > 0) and (nOver > gMgSvc.PrefModel.PwChkTermDay) then
begin
O.S['VUL_PWDEXPIRED'] := 'true';
O.S['VUL_PWDLASTDAYS'] := IntToStr(nOver - gMgSvc.PrefModel.PwChkTermDay);
end else
O.S['VUL_PWDEXPIRED'] := 'false';
end else
O.S['VUL_PWDEXPIRED'] := 'false';
O.S['VUL_SCRNLOCK'] := _NewAgentInfo.sScrnLock;
O.S['VUL_OSSAFEPATCH'] := _NewAgentInfo.sOsSafe;
O.S['VUL_AV'] := _NewAgentInfo.sAvInfo;
O.S['VUL_AVENABLE'] := _NewAgentInfo.sAvSafe;
O.S['VUL_AVSAFEPATCH'] := _NewAgentInfo.sAvUptodate;
O.S['VUL_FW'] := _NewAgentInfo.sFwInfo;
O.S['VUL_FWENABLE'] := _NewAgentInfo.sFwSafe;
O.S['VUL_PI'] := _NewAgentInfo.sPiSafe;
O.S['VUL_AD'] := BooleanToStr(_NewAgentInfo.bJoinAD, 'true', 'false');
end;
// {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\pa.json'); {$ENDIF}
sRes := gMgSvc.HttpPost(gMgSvc.DestIPort + 'statusRequest.do', sReqType, O.AsString);
// 접속 상태 처리를 TimerCheckConnect()에서 여기로 옮김 23_0324 12:04:45 kku
try
if sRes = 'true' then
TTgTrace.T('Status Response .. Empty');
bConnected := (sRes = POST_TIMEOUT) or
( (sRes <> '') and (sRes <> '404') and (sRes <> 'true') and sRes.Contains('SERVERTIME') );
if not bConnected then
begin
if not bPrevConnected then
begin
if bFailChangeDestUrl then
gMgSvc.ChangeDestinationUrl;
end else
gMgSvc.SetConnected(false, false);
end else
if not bPrevConnected then
begin
if sRes = POST_TIMEOUT then
begin
bConnected := false;
if bFailChangeDestUrl then
gMgSvc.ChangeDestinationUrl; // 음... 타임아웃 되도 이전 접속이 false라면 접속 정보 변경 시도해준다 23_0608 13:49:09 kku
end else begin
gMgSvc.SetConnected(true, true);
// 접속 시 CJ 사번 인증 24_1218 14:45:10 kku
// 나중에 부하 발생 시 문제가 생길거 같아서 봉인...
// if CUSTOMER_TYPE = CUSTOMER_CJOV_GLOBAL then
// gMgSvc.DoEmpNoCheck := IsCheckEmpNo and gMgSvc.PrefModel.IsEmpVerify;
end;
end;
if bConnected then
begin
// if CUSTOMER_TYPE = CUSTOMER_CJOV_GLOBAL then // 일단 봉인 24_1218 14:49:38 kku
// begin
// // CJ 사번 미인증 체크 24_1218 14:40:44 kku
// if gMgSvc.DoEmpNoCheck then
// begin
// gMgSvc.IsEmpNoOk := VerifyEmpNo(gMgSvc.DestServerUrl, gMgSvc.HTTP, gMgSvc.EmpNo);
// gMgSvc.DoEmpNoCheck := false;
// end;
// end else
if (gMgSvc.HeModeKind = hmkSecurity) and gMgSvc.DoEmpNoCheck then
begin
// 사번검증을 통해 미검증 시 보안모드 진입을 막을 예정이었으나...
// 일단 그렇게까지 동작하지 않도록 함 22_0531 16:04:58 kku
gMgSvc.IsEmpNoOk := VerifyEmpNo(gMgSvc.DestServerUrl, gMgSvc.HTTP, gMgSvc.EmpNo);
gMgSvc.DoEmpNoCheck := false;
if not gMgSvc.IsEmpNoOk then
begin
gMgSvc.PopupMessage(TYPE_MSG_VUL_EMPNO);
if CUSTOMER_TYPE = CUSTOMER_KFTC then
begin
// 금융결제원의 경우 사번이 유효하지 않은 경우 (인사연동 안된 사번)
// 보안모드 차단 되도록 기능 추가 23_0425 12:52:05 kku
if gMgSvc.VulService <> nil then
gMgSvc.VulService.SetDisconnect(true);
end;
end;
end else
gMgSvc.IsEmpNoOk := true;
end;
except
TTgTrace.T('ProcessSignal() .. Fail .. ConnectionCheck');
end;
if not bConnected or (sRes = POST_TIMEOUT) then
goto LB_SignalComplete;
// 접속 상태 처리 끝 ---------------------------------------------------------
try
O := SO(sRes);
if O = nil then
begin
// SaveStrToFile('c:\ttttt.txt', sRes, TEncoding.UTF8);
TTgTrace.T('ProcessSignal() .. Invalid Response ... 2');
exit;
end;
except
TTgTrace.T('ProcessSignal() .. Invalid Response ... 1');
exit;
end;
// {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\ss.json'); {$ENDIF}
// if ((O.S['UPD_TYPE'] <> '') and (O.S['UPD_TYPE'].ToLower <> 'false')) or
// ((O.S['UPD_MODE'] <> '') and (O.S['UPD_MODE'].ToLower <> 'false')) or
// ((O.S['UPD_CAMPAIGN'] <> '') and (O.S['UPD_CAMPAIGN'].ToLower <> 'false')) or
// ((O.S['UPD_RULE'] <> '') and (O.S['UPD_RULE'].ToLower <> 'false')) then
// begin
// O.S['1'] := '';
// end;
if CUSTOMER_TYPE = CUSTOMER_KIMCHANG then
begin
end;
bUpdate := false;
if O.S['KEY_DEPT'] <> gMgSvc.DeptName then
begin
gMgSvc.AgentModel.DeptName := O.S['KEY_DEPT'];
bUpdate := true;
end;
if O.S['KEY_USERNAME'] <> gMgSvc.UName then
begin
gMgSvc.AgentModel.UName := O.S['KEY_USERNAME'];
bUpdate := true;
end;
if O.S['KEY_USEREMAIL'] <> gMgSvc.Email then
begin
gMgSvc.AgentModel.Email := O.S['KEY_USEREMAIL'];
bUpdate := true;
end;
if (O.S['changedEmpId'] <> '') and (O.S['changedEmpId'] <> gMgSvc.EmpNo) then
begin
TTgTrace.T('[09] 사번 변경, %s > %s', [gMgSvc.AgentModel.EmpNo, O.S['changedEmpId']]);
gMgSvc.SendEventLogEx(LOG_CHANGE_EMPNO, Format('[Server] EmpId Changed. (%s > %s)', [gMgSvc.AgentModel.EmpNo, O.S['changedEmpId']]), false);
gMgSvc.AgentModel.EmpNo := O.S['changedEmpId'];
bUpdate := true;
end;
// {$IFNDEF DEBUG}
// TTgTrace.T('key_approval = %s', [O.S['key_approval']], 9);
if gMgSvc.UseApproval <> (O.S['key_approval'] = 'true') then
begin
gMgSvc.UseApproval := not gMgSvc.UseApproval;
bUpdate := true;
end;
// {$ENDIF}
// TTgTrace.T('KEY_USERNAME : %s, KEY_USEREMAIL : %s', [O.S['KEY_USERNAME'], O.S['KEY_USEREMAIL']], 2);
wURole := StrToIntDef(O.S['KEY_ROLE'], 0);
if wURole <> gMgSvc.UserRole then
begin
gMgSvc.UserRole := wURole;
bUpdate := true;
end;
{$IFNDEF DEBUG}
if not gMgSvc.RcvRemoveAgent and (Trim(O.S['KEY_FORCEUNINSTALL']).ToLower = 'true') then
begin
TTgTrace.T('Req .. AgentUninstall ..');
gMgSvc.RcvRemoveAgent := true;
gMgSvc.DirectSendEventLog(URI_USER_ACTION, SYSEVT_REQ_AGENT_UNINSTALL, '[Req] Uninstall Agent');
if gMgSvc.RcvHwnd <> 0 then
PostMessage(gMgSvc.RcvHwnd, WM_REQ_AGENT_UNINSTALL, 0, 0);
end;
{$ENDIF}
if bUpdate then
begin
gMgSvc.AgentModel.Save;
gMgSvc.UpdateAgentInfo;
end;
if CUSTOMER_TYPE = CUSTOMER_LOTTEMART then
begin
case CUSTOMER_SUB_TYPE of
1, 2 :
if gMgSvc.AgentModel.UName = '' then
begin
// 이름이 없으면 인사 정보가 없는걸로 판단 25_0402 14:00:42 kku
if not MutexExists('Global\EPI_250412') then
gMgSvc.PopupMessage(TYPE_EMPTY_PERSONAL_INFO);
end;
end;
end;
// 결재 처리 시작 --------------------------------------------------------------
// 결재요청 알림
for i := Low(_arrUpdReq) to High(_arrUpdReq) do
begin
sKName := _arrUpdReq[i];
if (O.O[sKName] <> nil) and
(O.O[sKName].DataType = stArray) and (O.A[sKName].Length > 0) then
begin
var sData: String := O.O[sKName].AsJSon;
if _arrChkReqVal[i] <> sData then
begin
_arrChkReqVal[i] := sData;
if CUSTOMER_TYPE = CUSTOMER_DEV then
TTgTrace.T('%s = %s', [sKName, O.O[sKName].AsJSon]);
// {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\ss1.json'); {$ENDIF}
var q: Integer := 0;
for q := 0 to O.A[sKName].Length - 1 do
SendMessage(gMgSvc.RcvHwnd, WM_REQUEST_APPROVAL, i, NativeInt(O.A[sKName].S[q]));
bUpdate := true;
end;
end;
end;
// 결재완료 알림
for i := Low(_arrUpdDone) to High(_arrUpdDone) do
begin
sKName := _arrUpdDone[i];
if (O.O[sKName] <> nil) and
(O.O[sKName].DataType = stArray) and (O.A[sKName].Length > 0) then
begin
var sData: String := O.O[sKName].AsJSon;
if _arrChkDoneVal[i] <> sData then
begin
_arrChkDoneVal[i] := sData;
if CUSTOMER_TYPE = CUSTOMER_DEV then
TTgTrace.T('%s = %s', [sKName, O.O[sKName].AsJSon]);
// {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\ss2.json'); {$ENDIF}
var q: Integer := 0;
for q := 0 to O.A[sKName].Length - 1 do
SendMessage(gMgSvc.RcvHwnd, WM_DONE_APPROVAL, i, NativeInt(O.A[sKName].O[q].AsJSon));
bUpdate := true;
end;
end;
end;
// 결재 처리 끝 ==--------------------------------------------------------------
if (O.S['UPD_RULE'] <> '') and (O.S['UPD_RULE'].ToLower <> 'false') then
begin
gMgSvc.MgRule.UpdateRuleEnts(O.O['UPD_RULE']);
bUpdate := true;
end;
if // not bPrevConnected or
((O.S['UPD_TYPE'] <> '') and (O.S['UPD_TYPE'].ToLower <> 'false')) or
(O.S['KEY_GROUPNAME'] <> gMgSvc.PrefModel.PolicyGroup) then
begin
ProcessRcvPolicy(rpkAll);
// TTgTrace.T('정책 업데이트됨', 1);
// gMgSvc.RefreshView;
bUpdate := true;
end;
if bChangeAgentInfo then
gMgSvc.AgentInfo := _NewAgentInfo;
if (O.S['UPD_CAMPAIGN'] <> '') and (O.S['UPD_CAMPAIGN'].ToLower <> 'false') then
begin
gMgSvc.MgCampn.UpdateCampnEnts(O.O['UPD_CAMPAIGN']);
bUpdate := true;
end;
if bUpdate then
begin
// {$IFDEF DEBUG} SaveJsonObjToFile(O, 'c:\uss.json'); {$ENDIF}
gMgSvc.LastPolicy := O.S['SERVERTIME']; // FormatDateTime('yyyy-mm-dd hh:nn:ss', Now);
end;
if gMgSvc.UpdateTick <> 0 then
begin
// 10분간 업데이트 시도가 끝나지 않으면
// 다시 시도 하기 위해 초기화 해준다 23_0830 13:41:36 kku
if (GetTickCount - gMgSvc.UpdateTick) >= 600000 then
gMgSvc.UpdateTick := 0;
end;
if CheckUpdateAble then
ProcessUpdate;
if CUSTOMER_TYPE = CUSTOMER_KIMCHANG then
CheckAndUpdate_xPrint;
ProcessDownloadModules;
LB_SignalComplete :
gMgSvc.UpdateInternalInfo;
Result := true;
except
on E: Exception do
ETgException.TraceException(E, 'Fail .. ProcessSignal()');
end;
end;
initialization
ZeroMemory(@_NewAgentInfo, SizeOf(_NewAgentInfo));
finalization
Finalize(_NewAgentInfo);
end.