539 lines
22 KiB
Plaintext
539 lines
22 KiB
Plaintext
Function Logging_Services(@Service, @Params)
|
|
/***********************************************************************************************************************
|
|
|
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
|
permission from SRP Computer Solutions, Inc.
|
|
|
|
Name : Logging_Services
|
|
|
|
Description : Handler program for all module related services.
|
|
|
|
Notes : The generic parameters should contain all the necessary information to process the services. Often
|
|
this will be information like the data Record and Key ID.
|
|
|
|
Parameters :
|
|
Service [in] -- Name of the service being requested
|
|
Param1-10 [in/out] -- Additional request parameter holders
|
|
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
|
|
|
|
|
|
|
History : (Date, Initials, Notes)
|
|
08/30/17 dmb Original programmer.
|
|
02/17/18 dmb [SRPFW-225] Use the new named cache feature of Memory_Services so logging data is
|
|
protected when other processes release a cache table.
|
|
05/07/18 sgb [SRPFW-225] Fix bug in NewLog service by using the LogFullPath variable instead of the
|
|
04/24/20 gac Modified the AppendLog service to refresh the FielSize if the ColumnHeaders are added.
|
|
05/09/20 dmb [SRPFW-313] Merged with other versions.
|
|
08/28/24 djm Add CreateDirectory argument to NewLog service. If set to true, non-existent directories
|
|
will be created if necessary to save the log.
|
|
|
|
***********************************************************************************************************************/
|
|
|
|
#pragma precomp SRP_PreCompiler
|
|
|
|
$insert LOGICAL
|
|
$insert SERVICE_SETUP
|
|
$insert SRPMail_Inserts
|
|
|
|
Equ CRLF$ to \0D0A\
|
|
Equ CR$ to \0D\
|
|
Equ LF$ to \0A\
|
|
Equ TAB$ to \09\
|
|
Equ COMMA$ to ','
|
|
|
|
Common /LoggingServices/ Unused1@, Unused2@, Unused3@, Unused4@, Unused5@, Unused6@, Unused7@, Unused8@
|
|
|
|
Declare function Logging_Services, Memory_Services, SRP_Hash, SRP_Path, SRP_Send_Mail, Environment_Services
|
|
Declare function RTI_OS_Directory
|
|
Declare subroutine Logging_Services, Memory_Services, SetInitDirOptions
|
|
|
|
GoToService else
|
|
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
|
end
|
|
|
|
Return Response OR ''
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Service Parameter Options
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
Options BOOLEAN = True$, False$
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Services
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// NewLog
|
|
//
|
|
// LogPath - Path to where the log file is located. - [Required]
|
|
// LogFileName - Name of the log file. - [Required]
|
|
// RowDelimiter - Delimiter used to separate each log row. Default is CR/LF. - [Optional]
|
|
// ColumnDelimiter - Delimiter used to separate each column value. If ColumnWidths is empty then this will default to a
|
|
// comma. - [Optional]
|
|
// ColumnHeaders - @FM list of Column headers to use in the log file. Default is no column headers will be used.
|
|
// - [Optional]
|
|
// ColumnWidths - @FM list of Column widths for each column data value. If empty then the entire column value will
|
|
// be stored. - [Optional]
|
|
// QuoteValues - Boolean flag to indicate if column values should be quoted. Default is false. - [Optional]
|
|
// ClearLog - Boolean flag to indicate if any existing log file should be cleared. Default is false.
|
|
// - [Optional]
|
|
// CreateDirectory - Boolean flag to indicate if dependent directories should be created. Default is false.
|
|
// - [Optional]
|
|
//
|
|
// Returns an object handle to a log file.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service NewLog(LogPath, LogFileName, RowDelimiter, ColumnDelimiter, ColumnHeaders, ColumnWidths, QuoteValues=BOOLEAN, ClearLog=BOOLEAN, CreateDirectory=BOOLEAN)
|
|
|
|
DirectoryCreated = ''
|
|
objLog = ''
|
|
If CreateDirectory EQ '' then CreateDirectory = TRUE$
|
|
|
|
If (LogPath NE '') AND (LogFileName NE '') then
|
|
If (SRP_Path('Exists', LogPath) EQ False$) AND (CreateDirectory EQ TRUE$) then
|
|
GoSub CreateDependentDirectories
|
|
end
|
|
If SRP_Path('Exists', LogPath) then
|
|
LogFullPath = SRP_Path('Combine', LogPath, LogFileName)
|
|
If LogFullPath[1, 1] EQ '\' AND LogFullPath[2, 1] NE '\' then LogFullPath = '\' : LogFullPath
|
|
objLog = SRP_Hash(LogFullPath, 'SHA-1', 'BASE32')
|
|
Memory_Services('SetValue', objLog : '*LogPath', LogPath, ServiceModule)
|
|
Memory_Services('SetValue', objLog : '*LogFileName', LogFileName, ServiceModule)
|
|
Memory_Services('SetValue', objLog : '*LogFullPath', LogFullPath, ServiceModule)
|
|
If Dir(LogFullPath) NE '' then
|
|
If ClearLog then
|
|
Logging_Services('CreateLogFile', objLog)
|
|
end
|
|
end else
|
|
Logging_Services('CreateLogFile', objLog)
|
|
end
|
|
If Error_Services('NoError') then
|
|
If RowDelimiter EQ '' then RowDelimiter = CRLF$
|
|
Memory_Services('SetValue', objLog : '*RowDelimiter', RowDelimiter, ServiceModule)
|
|
If (ColumnDelimiter EQ '') AND (ColumnWidths EQ '') then ColumnDelimiter = COMMA$
|
|
Memory_Services('SetValue', objLog : '*ColumnDelimiter', ColumnDelimiter, ServiceModule)
|
|
Memory_Services('SetValue', objLog : '*ColumnHeaders', ColumnHeaders, ServiceModule)
|
|
Memory_Services('SetValue', objLog : '*ColumnWidths', ColumnWidths, ServiceModule)
|
|
If QuoteValues NE True$ then QuoteValues = False$
|
|
Memory_Services('SetValue', objLog : '*QuoteValues', QuoteValues, ServiceModule)
|
|
If Dir(LogFullPath)<1> EQ 0 AND ColumnHeaders NE '' then
|
|
// Add the column headers since this is a new log file.
|
|
Logging_Services('AppendLog', objLog, ColumnHeaders, '', @FM, True$)
|
|
end
|
|
end
|
|
|
|
end else
|
|
If CreateDirectory EQ False$ then
|
|
Error_Services('Add', LogPath : ' does not exist.')
|
|
end else
|
|
If (CreateDirectory EQ True$) and (DirectoryCreated EQ False$) then
|
|
Error_Services('Add', LogPath : ' could not be created.')
|
|
end
|
|
end
|
|
end
|
|
end else
|
|
Error_Services('Add', 'LogPath or LogFileName argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = objLog
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// AppendLog
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
// LogData - Data to be appended to the log file. - [Required]
|
|
// IncomingRowDelimiter - Delimiter used to separate each log row coming in. This allows incoming log data to have
|
|
// a different delimiter than what will be used in the log file. Default is the RowDelimiter
|
|
// used for appending the log data. - [Optional]
|
|
// IncomingColumnDelimiter - Delimiter used to separate each column value in the log data. This allows incoming log
|
|
// data to have a different delimiter than what will be used in the log file. Default is the
|
|
// column delimiter used to separate the log data or a comma if fixed widths only are
|
|
// indicated. - [Optional]
|
|
// IgnoreColumnHeaders - Boolean flag to indicate if the service should attempt to add column headers to an empty
|
|
// log file. Default is false. - [Optional]
|
|
// EmailAddresses - Comma delimited list of email addresses that should be notified when this log is appended.
|
|
// - [Optional]
|
|
// EmailMessage - Message to be sent to the email addresses.
|
|
//
|
|
// Appends data to the log file associated with the indicated log object handle.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service AppendLog(objLog, LogData, IncomingRowDelimiter, IncomingColumnDelimiter, IgnoreColumnHeaders, EmailAddresses, EmailMessage)
|
|
|
|
If (objLog NE '') AND (LogData NE '') then
|
|
If IgnoreColumnHeaders NE True$ then IgnoreColumnHeaders = False$
|
|
LogFullPath = Logging_Services('GetLogFullPath', objLog)
|
|
ColumnDelimiter = Logging_Services('GetColumnDelimiter', objLog)
|
|
LenColDel = Len(ColumnDelimiter)
|
|
ColumnHeaders = Logging_Services('GetColumnHeaders', objLog)
|
|
ColumnWidths = Logging_Services('GetColumnWidths', objLog)
|
|
QuoteValues = Logging_Services('GetQuoteValues', objLog)
|
|
RowDelimiter = Logging_Services('GetRowDelimiter', objLog)
|
|
If IncomingRowDelimiter EQ '' then IncomingRowDelimiter = RowDelimiter
|
|
If (IncomingColumnDelimiter EQ '') AND (ColumnWidths EQ '') then IncomingColumnDelimiter = ColumnDelimiter
|
|
LenRowDel = Len(RowDelimiter)
|
|
FileInfo = Dir(LogFullPath)
|
|
FileSize = FileInfo<1>
|
|
Status() = 0
|
|
OutData = ''
|
|
OSOpen LogFullPath to hFile then
|
|
If (FileSize EQ 0) AND (ColumnHeaders NE '') AND (Not(IgnoreColumnHeaders)) then
|
|
Logging_Services('AppendLog', objLog, ColumnHeaders, @RM, @FM, True$)
|
|
// Need to refresh FileSize to prevent the Column Headers being overwritten - gac 04/24/20
|
|
FileInfo = Dir(LogFullPath)
|
|
FileSize = FileInfo<1>
|
|
end
|
|
For Each RowData in LogData using IncomingRowDelimiter
|
|
If RowData NE '' then
|
|
For Each ColumnData in RowData using IncomingColumnDelimiter setting cPos
|
|
If ColumnWidths NE '' then
|
|
ColumnWidth = ColumnWidths<cPos>
|
|
ColumnData = ColumnData[1, ColumnWidth] : Str(' ', ColumnWidth - Len(ColumnData))
|
|
end
|
|
If QuoteValues then
|
|
Swap '"' with '""' in ColumnData ; // Encode the quotes properly.
|
|
ColumnData = Quote(ColumnData)
|
|
end
|
|
OutData := ColumnData : ColumnDelimiter
|
|
Next ColumnData
|
|
OutData[Neg(LenColDel), LenColDel] = '' ; // Strip off the last column delimiter.
|
|
OutData := RowDelimiter ; // Append a row delimiter.
|
|
end
|
|
Next RowData
|
|
OutData[Neg(LenRowDel), LenRowDel] = '' ; // Strip off the last row delimiter.
|
|
If (FileSize NE 0) then OutData = RowDelimiter : OutData ; // Prepend a row delimiter since there is existing data.
|
|
OSBWrite OutData to hFile at FileSize
|
|
OSError = Status()
|
|
If OSError then
|
|
Error_Services('Add', 'OSBWrite error code ' : OSError : ' in the ' : Service : ' service.')
|
|
end
|
|
OSClose hFile
|
|
end else
|
|
OSError = Status()
|
|
Error_Services('Add', 'OSOpen error code ' : OSError : ' in the ' : Service : ' service.')
|
|
end
|
|
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
If EmailAddresses NE '' then
|
|
GoSub EmailMessage
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetLogPath
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
//
|
|
// Returns the path for the log file associated with the indicated log object handle. This will not include the name of
|
|
// the log file itself.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetLogPath(objLog)
|
|
|
|
LogPath = ''
|
|
|
|
If objLog NE '' then
|
|
LogPath = Memory_Services('GetValue', objLog : '*LogPath', '', '', ServiceModule)
|
|
If LogPath EQ '' then
|
|
Error_Services('Add', 'Log path not found in the ' : Service : ' service.')
|
|
end
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = LogPath
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetLogFileName
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
//
|
|
// Returns the file name for the log file associated with the indicated log object handle. This will not include the
|
|
// path to where the log file is located.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetLogFileName(objLog)
|
|
|
|
LogFileName = ''
|
|
|
|
If objLog NE '' then
|
|
LogFileName = Memory_Services('GetValue', objLog : '*LogFileName', '', '', ServiceModule)
|
|
If LogFileName EQ '' then
|
|
Error_Services('Add', 'Log file name not found in the ' : Service : ' service.')
|
|
end
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = LogFileName
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetLogFullPath
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
//
|
|
// Returns the full path for the log file associated with the indicated log object handle.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetLogFullPath(objLog)
|
|
|
|
LogFullPath = ''
|
|
|
|
If objLog NE '' then
|
|
LogFullPath = Memory_Services('GetValue', objLog : '*LogFullPath', '', '', ServiceModule)
|
|
If LogFullPath EQ '' then
|
|
Error_Services('Add', 'Log full path not found in the ' : Service : ' service.')
|
|
end
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = LogFullPath
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetRowDelimiter
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
//
|
|
// Returns the delimiter to use to separate each row in the log.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetRowDelimiter(objLog)
|
|
|
|
RowDelimiter = ''
|
|
|
|
If objLog NE '' then
|
|
RowDelimiter = Memory_Services('GetValue', objLog : '*RowDelimiter', '', '', ServiceModule)
|
|
If RowDelimiter EQ '' then
|
|
Error_Services('Add', 'Row delimiter not found in the ' : Service : ' service.')
|
|
end
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = RowDelimiter
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetColumnDelimiter
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
//
|
|
// Returns the delimiter to use to separate each column in the log.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetColumnDelimiter(objLog)
|
|
|
|
ColumnDelimiter = ''
|
|
|
|
If objLog NE '' then
|
|
ColumnDelimiter = Memory_Services('GetValue', objLog : '*ColumnDelimiter', '', '', ServiceModule)
|
|
If ColumnDelimiter EQ '' then
|
|
Error_Services('Add', 'Column delimiter not found in the ' : Service : ' service.')
|
|
end
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = ColumnDelimiter
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetColumnHeaders
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
//
|
|
// Returns the column headers that should be in the log.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetColumnHeaders(objLog)
|
|
|
|
ColumnHeaders = ''
|
|
|
|
If objLog NE '' then
|
|
ColumnHeaders = Memory_Services('GetValue', objLog : '*ColumnHeaders', '', '', ServiceModule)
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = ColumnHeaders
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetColumnWidths
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
//
|
|
// Returns the column widths that should be used to truncate or pad each column in the log.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetColumnWidths(objLog)
|
|
|
|
ColumnWidths = ''
|
|
|
|
If objLog NE '' then
|
|
ColumnWidths = Memory_Services('GetValue', objLog : '*ColumnWidths', '', '', ServiceModule)
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = ColumnWidths
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetQuoteValues
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
//
|
|
// Returns the flag to indicate whether column values should be quoted or not.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetQuoteValues(objLog)
|
|
|
|
QuoteValues = ''
|
|
|
|
If objLog NE '' then
|
|
QuoteValues = Memory_Services('GetValue', objLog : '*QuoteValues', '', '', ServiceModule)
|
|
If QuoteValues NE True$ then QuoteValues = False$
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = QuoteValues
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// CreateLogFile
|
|
//
|
|
// objLog - Object handle to the log file. - [Required]
|
|
//
|
|
// Creates (or clears out) a log file associated with the indicated log object handle.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service CreateLogFile(objLog)
|
|
|
|
If objLog NE '' then
|
|
LogFullPath = Logging_Services('GetLogFullPath', objLog)
|
|
If Error_Services('NoError') then
|
|
Status() = 0
|
|
OSWrite '' to LogFullPath
|
|
Status = Status()
|
|
If Status GT 0 then
|
|
Error_Services('Add', 'Unable to clear ' : LogFullPath : ' in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
end else
|
|
Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
End Service
|
|
|
|
|
|
Service CleanLogFolders(NumDays)
|
|
|
|
FileExclusionList = 'Canary.txt':@VM:'Canary.vbs'
|
|
AppRootPath = Environment_Services('GetApplicationRootPath')
|
|
LogPath = AppRootPath : '\LogFiles\'
|
|
SetInitDirOptions("D")
|
|
InitDir LogPath:'*'
|
|
FolderList = DirList()
|
|
// Remove . directory listing
|
|
FolderList = Delete(FolderList, 1, 0, 0)
|
|
// Remove .. directory listing
|
|
FolderList = Delete(FolderList, 1, 0, 0)
|
|
Today = Date()
|
|
SetInitDirOptions("")
|
|
For each Folder in FolderList
|
|
FolderPath = LogPath:Folder:'\'
|
|
InitDir FolderPath:'*'
|
|
FileList = DirList()
|
|
If FileList NE '' then
|
|
For each Filename in FileList
|
|
Locate FileName in FileExclusionList using @VM setting vPos else
|
|
FilePath = FolderPath:Filename
|
|
FileInfo = Dir(FilePath)
|
|
LastWriteDate = FileInfo<2>
|
|
FileAge = Today - LastWriteDate
|
|
If FileAge GT NumDays then
|
|
OSDelete FilePath
|
|
end
|
|
end
|
|
Next Filename
|
|
end
|
|
Next Folder
|
|
|
|
end service
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Internal GoSubs
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
EmailMessage:
|
|
|
|
Done = False$
|
|
Error = False$
|
|
MsgSent = ''
|
|
|
|
ConfigFile = ''
|
|
ConfigFile<1> = SendUsing_Port$
|
|
ConfigFile<2> = ''
|
|
ConfigFile<3> = 25 ; // Server port
|
|
*ConfigFile<4> = 'appmail.eu.infineon.com' ; // Mail server
|
|
ConfigFile<4> = 'mailrelay-external.infineon.com' ; // Mail server
|
|
ConfigFile<5> = True$ ; // Authenticate
|
|
ConfigFile<6> = 'oinotify@infineon.com' ; // Username
|
|
ConfigFile<7> = 'oinotify1' ; // Password
|
|
ConfigFile<8> = False$ ; // Use SSL
|
|
|
|
If EmailMessage EQ '' then
|
|
EmailMessage = LogData : \0D0A0D0A\ : RetStack()<2>
|
|
end else
|
|
EmailMessage := \0D0A0D0A\ : LogData : \0D0A0D0A\ : RetStack()<2>
|
|
end
|
|
|
|
SentFrom = ''
|
|
SentTo = ''
|
|
Message = ''
|
|
Message<1> = 'AppendLog Message' ; // Subject
|
|
Message<2> = 'oinotify@infineon.com' ; // From (email address)
|
|
Message<3> = EmailAddresses ; // Send to (email address)
|
|
Message<5> = '' ; // Blind Carbon Copy (email address)
|
|
Message<6> = '' ; // Reply To (email address)
|
|
Message<7> = 'TEXT' ; // Content Type (TEXT or HTML)
|
|
Message<8> = EmailMessage ; // Content / Body
|
|
Message<9> = '' ; // Attachment(s) (path to file name(s))
|
|
|
|
Result = SRP_Send_Mail(Message, ConfigFile)
|
|
|
|
return
|
|
|
|
CreateDependentDirectories:
|
|
|
|
CreatePath = True$
|
|
DirectoryCreated = RTI_OS_Directory( 'CREATE', LogPath, CreatePath)
|
|
|
|
return
|
|
|
|
|
|
|