감사 데이터 내보내기를 위한 샘플 응용 프로그램
이 샘플 응용 프로그램은 ThingWorx Marketplace의 Tools 섹션에서 SSH File Transfer Protocol(SFTP) Extension을 사용하여 원격 SFTP 서버에 내보낸 감사 기록을 푸시하는 ThingWorx SchedulerThing입니다. 사용자의 환경에 가장 잘 맞는 시간과 빈도에 따라 실행되도록 SchedulerThing을 구성할 수 있습니다. SchedulerThing은 내보내기가 성공적으로 실행될 때마다 업데이트되는 lastExportDate 속성을 유지합니다.
ThingWorx 감사 하위 시스템은 다음 그림에서 표시되고 아래에 설명된 대로 감사 항목의 내보내기를 관리합니다.
이 플랫폼에 의해 생성된 감사 데이터는 ThingWorx 데이터베이스에 보관됩니다. 감사 카테고리 및 날짜 범위를 기준으로 이 데이터를 질의 및 필터링할 수 있습니다. 온라인 스토리지의 데이터 양은 감사 하위 시스템의 DaysOnline 매개 변수에 대해 구성된 보존 기간으로 제한됩니다.
온라인 감사 데이터는 AuditArchiveScheduler 사물에 대해 지정된 빈도에 따라 주기적으로 보관됩니다. 감사 데이터는 PurgeAuditScheduler 사물에 대해 지정된 빈도에 따라 주기적으로 제거됩니다. 두 작업의 기본 빈도는 24시간마다입니다.
이 샘플 응용 프로그램을 사용하여 감사 기록을 내보내면 ExportAuditData 서비스에는 현재 온라인 감사 데이터를 보관하는 호출이 포함됩니다. 이 호출은 내보낸 감사 데이터에 생성되었지만 아직 보관되지는 않은 감사 항목에 대해 어떤 간격도 없도록 합니다.
확장 설치 및 구성
SFTP 확장을 설치하고 구성하려면 다음 단계를 따르십시오.
1. ThingWorx Marketplace에서 "SSH File Transfer Protocol" 확장 및 확장에 대한 사용자 안내서를 다운로드합니다.
2. 확장을 설치하려면 ThingWorx SFTP Extension User Guide(ThingWorx SFTP Extension 사용자 안내서)의 지침을 따릅니다.
3. ThingWorx Composer에서 새 SFTP 사물을 생성하고 확장과 함께 가져온 SFTPRepositoryTemplate을 선택합니다. SFTP 사물에 대한 구성 페이지에서 원하는 원격 서버 위치 및 자격 증명을 구성합니다. 자세한 내용은 확장에 대한 사용자 안내서를 참조하십시오.
4. Composer에서 스케줄러 사물 템플릿을 사용하는 새 사물을 생성합니다. 이 스케줄러를 설정하려면 다음 단원으로 계속 진행합니다.
SFTP 감사 익스포터 스케줄러 설정
새 스케줄러를 다음과 같이 구성합니다.
1. 일반 정보 페이지에서 다음 속성을 구성합니다.
이름 - SFTPAuditExporter
사물 템플릿 - Scheduler
2. 속성 페이지에서 다음 속성을 추가합니다.
속성
기본 유형
사물 템플릿
기본값 있음
지속
lastExportDate
DATETIME
해당 없음
선택됨. 기본값: 1/1/1970 00:00:00
선택됨
targetRepository
THINGNAME
FileRepository
해당 없음
선택됨
sftpThing
THINGNAME
SftpRepositoryTemplate
해당 없음
선택됨
sftpDirectory
STRING
해당 없음
선택됨. 기본값: *.*
선택됨
3. 구독 페이지에서 다음 구독 정보와 코드를 추가합니다.
소스 - 이 필드는 비워 둡니다.
이벤트 - ScheduledEvent를 지정합니다.
활성화됨 - 이 확인란을 선택합니다.
스크립트 - 아래의 코드 블록에서 코드를 추가합니다.
다음은 스크립트 필드에 복사할 스크립트입니다.

// Sample script for a scheduleThing that will periodically call the ExportAuditData service on the
// AuditSubsystem to capture audit records prior to those records aging off the system.
// These then are transferred to an external SFTP server using the SFTP Thingworx Extension.

logger.info("Audit export starting");

// Property validation checks
if (me.sftpThing == undefined) {
throw "sftpThing property not set. Cannot continue.";
}
if (me.targetRepository == undefined) {
throw "targetRepository property not set. Cannot continue.";
}
if (me.sftpDirectory == undefined || me.sftpDirectory == null || me.sftpDirectory == "") {
// set a default value if not setup previously.
me.sftpDirectory = ".";
}

var exportEndTime = new Date();
var uploadDirFormatted = dateFormat(exportEndTime, "yyyy-MM"); // store in directories by month

var exportParams = {
startDate: me.lastExportDate, // Start after the last successsful export
endDate: exportEndTime, // Use the end time recorded above
targetRepositoryName: me.targetRepository, // destination repository from the scheduler's properties

// Set the targetPath to custom folder for exporting. The files will be deleted from this folder on
// completion of the export.
targetPath: "scheduledExport",

// Add the current date to the targetFileName
// The targetFileName must be unique. The ExportAuditData service will not overwrite an existing file.
targetFileName: "AuditArchive-" + dateFormat(exportEndTime, "yyyy-MM-dd-HHmm"),

// The locale for the exported audit messages. If undefined, the system default is used
locale: undefined
};

try {

Subsystems["AuditSubsystem"].ExportAuditData(exportParams);

// The export to the target repository now needs to be transferred to an external location.
// This example uses the SFTP Extension to transfer to a remote SFTP server.
// The location and credentials for the SFTP server are configured on the SFTP Thing.

// Check to make sure the destination directory exists as the SFTP server will not auto create it.
var checkDirParams = {
path: me.sftpDirectory
};
var findDirObj = {
name: uploadDirFormatted
};
if (Things[me.sftpThing].ListDirectories(checkDirParams).Find(findDirObj) == undefined) {
var createDirParams = {
path: me.sftpDirectory + "/" + uploadDirFormatted
};
Things[me.sftpThing].CreateFolder(createDirParams);
}

var uploadParams = {
FileRepository: me.targetRepository,
RepoFilePath: exportParams.targetPath + "/" + exportParams.targetFileName + ".zip",
RemoteFilePath: me.sftpDirectory + "/" + uploadDirFormatted + "/" + exportParams.targetFileName + ".zip"
};
Things[me.sftpThing].UploadFile(uploadParams);

// Upon successfully storing the export file, update the start time
// breadcrumb to the time the export was started.
me.lastExportDate = exportEndTime;

} catch (err) {
logger.error("Failed to export the auditing records: " + err);
} finally {
// Delete the temporary export file from the local repository
var deleteFileParams = {
path: exportParams.targetPath + "/" + exportParams.targetFileName + ".zip"
};
Things[me.targetRepository].DeleteFile(deleteFileParams);
}
logger.info("Audit export completed");
구성
SFTPAuditExporter에는 사용하기 전에 설정해야 하는 다음 구성 속성이 있습니다.
targetRepository - 내보낸 감사 항목에 대한 임시 위치로 사용할 ThingWorx FileRepository 사물을 지정합니다. 감사 항목을 내보낼 때 이 응용 프로그램은 구성된 SFTP 서버로 보내기 전에 해당 감사 항목을 로컬 항목으로 만듭니다. 전송이 완료되면 로컬 파일이 제거됩니다.
sftpThing - 위의 설치 단계 중 3단계에서 생성한 SFTP 사물을 지정합니다.
sftpDirectory - 원격 SFTP 서버에서 감사 항목 파일을 저장할 상위 디렉터리를 지정합니다. 원격 서버에 각 사용자에 대한 기본 디렉터리가 있다고 가정하여 기본값 *.*은 해당 기본 디렉터리가 사용되어야 한다고 지정합니다. 원하는 경우 이 값을 변경할 수 있습니다.
또한 이 스케줄러의 구성 페이지에서 스케줄 시간을 선택하여 내보내기를 수행할 시기를 조정할 수 있습니다. 기본적으로 스케줄은 매일 자정에 실행됩니다.
작업 메모
원격 SFTP 서버에 감사 항목을 저장하면 저장된 파일의 이름이 AuditArchive-<year>-<month>-<day>-<hour><minute>.zip으로 지정됩니다. 여기서 시간은 보관 파일이 생성된 시기를 나타냅니다. 각 zip 파일에는 번역된 감사 기록이 있는 단일 JSON 형식 파일이 포함되어 있습니다. 보관 파일은 <year>-<month> 이름 규약을 사용하여 월별로 하위 디렉터리로 분류됩니다. 예를 들어 2019-08입니다.
감사 항목에 사용된 로캘을 변경하려면 스케줄러 스크립트를 편집하고 exportParams 정의의 locale 필드를 설정합니다.
* 
기본적으로 ThingWorx Platform의 스크립트 제한 시간 설정은 30초입니다. 스크립트가 이보다 길게 실행되면 Platform에서 실행을 종료합니다. ThingWorx 관리자는 platform-settings.json 구성 파일의 기본 설정 섹션에서 스크립트 제한 시간을 구성할 수 있습니다. 자세한 내용은 platform-settings.json 구성 세부 정보 항목을 참조하십시오.