diff --git a/src/classes/logstreammongodb.class.php b/src/classes/logstreammongodb.class.php index a2762ce..feb26bc 100644 --- a/src/classes/logstreammongodb.class.php +++ b/src/classes/logstreammongodb.class.php @@ -248,11 +248,32 @@ class LogStreamMongoDB extends LogStream { */ public function VerifyIndexes( $arrProperitesIn ) { - /* - TODO!!! - needed ? - */ + global $dbmapping, $fields; + // Get List of Indexes as Array + $arrIndexKeys = $this->GetIndexesAsArray(); + $szTableType = $this->_logStreamConfigObj->DBTableType; + + // Loop through all fields to see which one is missing! + foreach ( $arrProperitesIn as $myproperty ) + { +// echo $dbmapping[$szTableType]['DBMAPPINGS'][$myproperty] . "
"; + if ( isset($dbmapping[$szTableType]['DBMAPPINGS'][$myproperty]) ) + { + if ( in_array($dbmapping[$szTableType]['DBMAPPINGS'][$myproperty], $arrIndexKeys) ) + { + OutputDebugMessage("LogStreamDB|VerifyIndexes: Found INDEX for '" . $dbmapping[$szTableType]['DBMAPPINGS'][$myproperty] . "'", DEBUG_ULTRADEBUG); + continue; + } + else + { + // Index is missing for this field! + OutputDebugMessage("LogStreamDB|VerifyIndexes: Missing INDEX for '" . $dbmapping[$szTableType]['DBMAPPINGS'][$myproperty] . "'", DEBUG_WARN); + return ERROR_DB_INDEXESMISSING; + } + } + } + // Successfull return SUCCESS; } @@ -272,6 +293,45 @@ class LogStreamMongoDB extends LogStream { */ public function CreateMissingIndexes( $arrProperitesIn ) { + global $dbmapping, $fields, $querycount; + + // Get List of Indexes as Array + $arrIndexKeys = $this->GetIndexesAsArray(); + $szTableType = $this->_logStreamConfigObj->DBTableType; + + // Loop through all fields to see which one is missing! + foreach ( $arrProperitesIn as $myproperty ) + { + if ( isset($dbmapping[$szTableType]['DBMAPPINGS'][$myproperty]) ) + { + if (in_array($dbmapping[$szTableType]['DBMAPPINGS'][$myproperty], $arrIndexKeys) ) + continue; + else + { + try + { + // Add Unique Index for DBMapping + $this->_myMongoCollection->ensureIndex(array( $dbmapping[$szTableType]['DBMAPPINGS'][$myproperty] => 1) /*, array("unique" => true) */ ); + + // Index is missing for this field! + OutputDebugMessage("LogStreamDB|CreateMissingIndexes: Createing missing INDEX for '" . $dbmapping[$szTableType]['DBMAPPINGS'][$myproperty] . "'", DEBUG_INFO); + } + catch ( MongoException $e ) + { + // Log error! + $this->PrintDebugError("CreateMissingIndexes failed with error ' " . $e->getMessage() . " '"); + + // Return error code + return ERROR_DB_QUERYFAILED; + } + + // // Return failure! + // $this->PrintDebugError("Dynamically Adding INDEX for '" . $dbmapping[$szTableType]['DBMAPPINGS'][$myproperty] . "' failed with Statement: '" . $szSql . "'"); + // return ERROR_DB_INDEXFAILED; + } + } + } + // Successfull return SUCCESS; } @@ -993,31 +1053,38 @@ class LogStreamMongoDB extends LogStream { $groupReduce = " function (obj, prev) { - prev." . $myDBSortedFieldName . "++; "; + try {\n + prev." . $myDBSortedFieldName . "++;\n"; // Add fields! foreach( $myMongoFields as $key => $myfield ) { if ( $key != $myDBConsFieldName ) - $groupReduce .= "prev." . $key . " = obj." . $key . ";"; + $groupReduce .= "if ( prev.$key == null )\n prev.$key = obj.$key;\n"; } if ( $bIncludeMinMaxDateFields ) { $groupReduce .= " - if ( prev.firstoccurrence_date == null || prev.firstoccurrence_date > obj." . $dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE] . " ) { - prev.firstoccurrence_date = obj." . $dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE] . "; + if ( prev.firstoccurrence_date == null || prev.firstoccurrence_date > obj." . $dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE] . " ) {\n + prev.firstoccurrence_date = obj." . $dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE] . ";\n } - if ( prev.lastoccurrence_date == null || prev.lastoccurrence_date < obj." . $dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE] . " ) { - prev.lastoccurrence_date = obj." . $dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE] . "; + if ( prev.lastoccurrence_date == null || prev.lastoccurrence_date < obj." . $dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE] . " ) {\n + prev.lastoccurrence_date = obj." . $dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE] . ";\n }"; } $groupReduce .= " + } + catch ( e ){ + // For now ingore error! + theerror = e.toString(); + } + // assert( theerror, \"B3\" ) } "; try { // Output Debug Informations - OutputDebugMessage("LogStreamMongoDB|ConsolidateDataByField: Running MongoDB group query", DEBUG_ULTRADEBUG); + OutputDebugMessage("LogStreamMongoDB|ConsolidateDataByField: Running MongoDB group query with Recude Function:
" . $groupReduce . "
", DEBUG_ULTRADEBUG); // mongodb group is simular to groupby from MYSQL $myResult = $this->_myMongoCollection->group( array($myDBConsFieldName => 1), $myMongoInit, $groupReduce, $myOptions); @@ -1035,46 +1102,55 @@ class LogStreamMongoDB extends LogStream { $aResult = array(); // Loop through results - foreach ($myResult['retval'] as $myid => $myRow) + if ( isset($myResult['retval']) ) { - - // Create new row for resultarray - $aNewRow = array(); - - // Handly Datefields for min and max! - if ( $bIncludeMinMaxDateFields ) + foreach ($myResult['retval'] as $myid => $myRow) { - if ( isset($myRow['firstoccurrence_date']) && isset($myRow['lastoccurrence_date']) ) + + // Create new row for resultarray + $aNewRow = array(); + + // Handly Datefields for min and max! + if ( $bIncludeMinMaxDateFields ) { - $aNewRow['firstoccurrence_date'] = date( "Y-m-d H:i:s ", $myRow['firstoccurrence_date']->sec ); - $aNewRow['lastoccurrence_date'] = date( "Y-m-d H:i:s", $myRow['lastoccurrence_date']->sec ); - } - else - { - // Get default date - $myDate = $myRow[$dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE]]; - if ( gettype($myDate) == "object" && get_class($myDate) == "MongoDate" ) + if ( isset($myRow['firstoccurrence_date']) && isset($myRow['lastoccurrence_date']) ) { - $aNewRow['firstoccurrence_date'] = date( "Y-m-d H:i:s ", $myDate->sec ); - $aNewRow['lastoccurrence_date'] = date( "Y-m-d H:i:s", $myDate->sec ); + $aNewRow['firstoccurrence_date'] = date( "Y-m-d H:i:s ", $myRow['firstoccurrence_date']->sec ); + $aNewRow['lastoccurrence_date'] = date( "Y-m-d H:i:s", $myRow['lastoccurrence_date']->sec ); + } + else + { + // Get default date + $myDate = $myRow[$dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_DATE]]; + if ( gettype($myDate) == "object" && get_class($myDate) == "MongoDate" ) + { + $aNewRow['firstoccurrence_date'] = date( "Y-m-d H:i:s ", $myDate->sec ); + $aNewRow['lastoccurrence_date'] = date( "Y-m-d H:i:s", $myDate->sec ); + } + } + //echo "!". gettype($myDate); + //echo "!" . $myDate->sec; + //var_dump ( $myRow ); + //exit; + } + + foreach ( $myRow as $myFieldName => $myFieldValue ) + { + if ( !is_array($myFieldValue) && !is_object($myFieldValue) ) // Only Copy NON-Array and NON-Object values! + { + $myFieldID = $this->GetFieldIDbyDatabaseMapping($szTableType, $myFieldName); + $aNewRow[ $myFieldID ] = $myFieldValue; } } -//echo "!". gettype($myDate); -//echo "!" . $myDate->sec; -//var_dump ( $myRow ); -//exit; + // Add new row to result + $aResult[] = $aNewRow; } - - foreach ( $myRow as $myFieldName => $myFieldValue ) - { - if ( !is_array($myFieldValue) && !is_object($myFieldValue) ) // Only Copy NON-Array and NON-Object values! - { - $myFieldID = $this->GetFieldIDbyDatabaseMapping($szTableType, $myFieldName); - $aNewRow[ $myFieldID ] = $myFieldValue; - } - } - // Add new row to result - $aResult[] = $aNewRow; + } + else + { + // Return error code + OutputDebugMessage("LogStreamMongoDB|ConsolidateDataByField: myResult['retval'] was empty, see myResult: " . var_export($myResult, true) . ")", DEBUG_WARN); + return ERROR_NOMORERECORDS; } // return finished array @@ -1717,7 +1793,6 @@ class LogStreamMongoDB extends LogStream { // Uncomment for debug! // OutputDebugMessage("LogStreamMongoDB|ReadNextRecordsFromDB: bufferedRecords = Array
" . var_export($this->bufferedRecords, true) . "
", DEBUG_ULTRADEBUG); - OutputDebugMessage("LogStreamMongoDB|ReadNextRecordsFromDB: ibegin = $iBegin, recordnum = " . $this->_currentRecordNum, DEBUG_ULTRADEBUG); // --- Check if results were found @@ -1757,20 +1832,57 @@ class LogStreamMongoDB extends LogStream { } } + /* + * Helper function to return a list of Indexes for the logstream table + */ + private function GetIndexesAsArray() + { + global $querycount; + + // Verify database connection (This also opens the database!) + $res = $this->Verify(); + if ( $res != SUCCESS ) + return $res; + + // Init Array + $arrIndexKeys = array(); + $aMongoIndexes = $this->_myMongoCollection->getIndexInfo(); + if (is_array($aMongoIndexes) && count($aMongoIndexes) > 0 ) + { + // LOOP through indexes + foreach($aMongoIndexes as $myIndex) + { + if ( strpos($myIndex['ns'], $this->_logStreamConfigObj->DBCollection) !== FALSE ) + { + // LOOP through keys + foreach($myIndex['key'] as $myKeyID => $myKey) + { + // Add to index keys + $arrIndexKeys[] = strtolower($myKeyID); + } + } + } + } + + //echo "
" . var_export($this->_myMongoCollection->getIndexInfo(), true) . "
"; + //echo "
" . var_export($arrIndexKeys, true) . "
"; + //exit; + + // Increment for the Footer Stats + $querycount++; + + // return Array + return $arrIndexKeys; + } + /* * Helper function to display SQL Errors for now! */ private function PrintDebugError($szErrorMsg) { global $extraErrorDescription; - - $errdesc = mysql_error(); - $errno = mysql_errno(); - $errormsg="$szErrorMsg
"; - $errormsg.="Detail error: $errdesc
"; - $errormsg.="Error Code: $errno
"; - + // Add to additional error output $extraErrorDescription = $errormsg; diff --git a/src/classes/reports/report.syslog.syslogsummary.class.php b/src/classes/reports/report.syslog.syslogsummary.class.php index 1082d2c..8405160 100644 --- a/src/classes/reports/report.syslog.syslogsummary.class.php +++ b/src/classes/reports/report.syslog.syslogsummary.class.php @@ -1,594 +1,516 @@ -. - * - * A copy of the GPL can be found in the file "COPYING" in this - * distribution. - ********************************************************************* -*/ - -// --- Avoid directly accessing this file! -if ( !defined('IN_PHPLOGCON') ) -{ - die('Hacking attempt'); - exit; -} -// --- - -// --- Basic Includes! -require_once($gl_root_path . 'classes/reports/report.class.php'); -// --- - -class Report_syslogsummary extends Report { - // Common Properties - public $_reportVersion = 1; // Internally Version of the ReportEngine - public $_reportID = "report.syslog.syslogsummary.class"; // ID for the report, needs to be unique! - public $_reportFileBasicName = "report.syslog.syslogsummary"; // Basic Filename for reportfiles - public $_reportTitle = "Syslog Summary Report"; // Display name for the report - public $_reportDescription = "This is a Syslog Summary Report"; - public $_reportHelpArticle = "http://loganalyzer.adiscon.com/plugins/reports/syslog-syslogsummary"; - public $_reportNeedsInit = false; // True means that this report needs additional init stuff - public $_reportInitialized = false; // True means report is installed - - // Advanced Report Options - private $_maxHosts = 20; // Threshold for maximum hosts to analyse! - private $_maxMsgsPerHost = 100; // Threshold for maximum amount of syslogmessages to analyse per host - private $_colorThreshold = 10; // Threshold for coloured display of Eventcounter - - // Constructor - public function Report_syslogsummary() { -// $this->_logStreamConfigObj = $streamConfigObj; - - // Fill fields we need for this report - $this->_arrProperties[] = SYSLOG_UID; - $this->_arrProperties[] = SYSLOG_DATE; - $this->_arrProperties[] = SYSLOG_HOST; - $this->_arrProperties[] = SYSLOG_MESSAGETYPE; - $this->_arrProperties[] = SYSLOG_FACILITY; - $this->_arrProperties[] = SYSLOG_SEVERITY; - $this->_arrProperties[] = SYSLOG_SYSLOGTAG; - // $this->_arrProperties[] = SYSLOG_PROCESSID; - $this->_arrProperties[] = SYSLOG_MESSAGE; - $this->_arrProperties[] = MISC_CHECKSUM; - - // Init Customfilters Array - $this->_arrCustomFilters['_maxHosts'] = array ( 'InternalID' => '_maxHosts', - 'DisplayLangID' => 'ln_report_maxHosts_displayname', - 'DescriptLangID'=> 'ln_report_maxHosts_description', - FILTER_TYPE => FILTER_TYPE_NUMBER, - 'DefaultValue' => 20, - 'MinValue' => 1, -/* 'MaxValue' => 0,*/ - ); - $this->_arrCustomFilters['_maxMsgsPerHost'] = - array ( 'InternalID' => '_maxMsgsPerHost', - 'DisplayLangID' => 'ln_report_maxMsgsPerHost_displayname', - 'DescriptLangID'=> 'ln_report_maxMsgsPerHost_description', - FILTER_TYPE => FILTER_TYPE_NUMBER, - 'DefaultValue' => 100, - 'MinValue' => 1, -/* 'MaxValue' => 0,*/ - ); - $this->_arrCustomFilters['_colorThreshold'] = - array ( 'InternalID' => '_colorThreshold', - 'DisplayLangID' => 'ln_report_colorThreshold_displayname', - 'DescriptLangID'=> 'ln_report_colorThreshold_description', - FILTER_TYPE => FILTER_TYPE_NUMBER, - 'DefaultValue' => 10, - 'MinValue' => 1, -/* 'MaxValue' => 0,*/ - ); - - - - } - - /** - * startDataProcessing, analysing data - * - * @param arrProperties array in: Properties wish list. - * @return integer Error stat - */ - public function startDataProcessing() - { - global $content, $severity_colors, $gl_starttime, $fields; - - // Create Filter string, append filter for EventLog Type msgs! - $szFilters = $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_Syslog; - - // Set Filter string - $this->_streamObj->SetFilter( $szFilters ); - - // Need to Open stream first! - $res = $this->_streamObj->Open( $this->_arrProperties, true ); - if ( $res == SUCCESS ) - { - // Set to common content variables - $this->SetCommonContentVariables(); - - // Set report specific content variables - $content["_colorThreshold"] = $this->_colorThreshold; - - // --- Report logic starts here - $content["report_rendertime"] = ""; - - // Step 1: Gather Summaries - // Obtain data from the logstream! - $content["report_summary"] = $this->_streamObj->ConsolidateDataByField( SYSLOG_SEVERITY, 0, SYSLOG_SEVERITY, SORTING_ORDER_DESC, null, false ); - - // TimeStats - $nowtime = microtime_float(); - $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s, "; - - // If data is valid, we have an array! - if ( is_array($content["report_summary"]) && count($content["report_summary"]) > 0 ) - { - // Count Total Events - $iTotalEvents = 0; - - foreach ($content["report_summary"] as &$tmpReportData ) - { - $tmpReportData['DisplayName'] = $this->GetSeverityDisplayName( $tmpReportData[SYSLOG_SEVERITY] ); - $tmpReportData['bgcolor'] = $this->GetSeverityBGColor( $tmpReportData[SYSLOG_SEVERITY] ); // $severity_colors[ $tmpReportData[SYSLOG_SEVERITY] ]; - - $iTotalEvents += $tmpReportData['itemcount']; - } - - // Prepent Item with totalevents count - $totalItem['DisplayName'] = "Total Events"; - $totalItem['bgcolor'] = "#999999"; - $totalItem['itemcount'] = $iTotalEvents; - - // Prepent to array - array_unshift( $content["report_summary"], $totalItem ); - } - else - return ERROR_REPORT_NODATA; - - // Get List of hosts - $content["report_computers"] = $this->_streamObj->ConsolidateItemListByField( SYSLOG_HOST, $this->_maxHosts, SYSLOG_HOST, SORTING_ORDER_DESC ); - - // TimeStats - $nowtime = microtime_float(); - $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s, "; - - if ( is_array($content["report_computers"]) && count($content["report_computers"]) > 0 ) - { - // Create plain hosts list for Consolidate function - foreach ( $content["report_computers"] as $tmpComputer ) - $arrHosts[] = $tmpComputer[SYSLOG_HOST]; - } - else - return ERROR_REPORT_NODATA; - - // This function will consolidate the Events based per Host! - $this->ConsolidateSyslogmessagesPerHost($arrHosts); - - // TimeStats - $nowtime = microtime_float(); - $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; - // --- - } - else - return $ret; - - // Return success! - return SUCCESS; - } - - - /** - * InitReport, empty - * - */ - public function InitReport() - { - // Nothing to do - return SUCCESS; - } - - - /** - * RemoveReport, empty - * - */ - public function RemoveReport() - { - // Nothing to do - return SUCCESS; - } - - - /** - * validateLicense, check license code - * - */ - public function validateLicense() - { - // This is a free report! - return SUCCESS; - } - - /** - * Init advanced settings from _customFilters string - */ - public function InitAdvancedSettings() - { - // Parse and Split _customFilters - if ( strlen($this->_customFilters) > 0 ) - { - // First of all split by comma - $tmpFilterValues = explode( ",", $this->_customFilters ); - - //Loop through mappings - foreach ($tmpFilterValues as &$myFilterValue ) - { - // Split subvalues - $tmpArray = explode( "=>", $myFilterValue ); - - // Set into temporary array - $tmpfilterid = trim($tmpArray[0]); - - // Set advanced property - if ( isset($this->_arrCustomFilters[$tmpfilterid]) ) - { - // Copy New value first! - $szNewVal = trim($tmpArray[1]); - - // Negated logic - if ( - $this->_arrCustomFilters[$tmpfilterid][FILTER_TYPE] == FILTER_TYPE_NUMBER && - !(isset($this->_arrCustomFilters[$tmpfilterid]['MinValue']) && intval($szNewVal) < $this->_arrCustomFilters[$tmpfilterid]['MinValue']) && - !(isset($this->_arrCustomFilters[$tmpfilterid]['MaxValue']) && intval($szNewVal) >= $this->_arrCustomFilters[$tmpfilterid]['MaxValue']) - ) - { - if ( $tmpfilterid == '_maxHosts' ) - $this->_maxHosts = intval($szNewVal); - else if ( $tmpfilterid == '_maxMsgsPerHost' ) - $this->_maxMsgsPerHost = intval($szNewVal); - else if ( $tmpfilterid == '_colorThreshold' ) - $this->_colorThreshold = intval($szNewVal); - } - else - { - // Write to debuglog - OutputDebugMessage("Failed setting advanced report option property '" . $tmpfilterid . "', value not in value range!", DEBUG_ERROR); - } - } - } - } - } - - - /* - * Implementation of CheckLogStreamSource - */ - public function CheckLogStreamSource( $mySourceID ) - { - // Call basic report Check function - $res = $this->CheckLogStreamSourceByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_SEVERITY, SYSLOG_MESSAGETYPE), SYSLOG_MESSAGE ); - - // return results! - return $res; - } - - - /* - * Implementation of CreateLogStreamIndexes | Will create missing INDEXES - */ - public function CreateLogStreamIndexes( $mySourceID ) - { - // Call basic report Check function - $res = $this->CreateLogStreamIndexesByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_SEVERITY, SYSLOG_MESSAGETYPE) ); - - // return results! - return $res; - } - - - /* - * Implementation of CreateLogStreamIndexes | Will create missing INDEXES - */ - public function CreateLogStreamTrigger( $mySourceID ) - { - // Call basic report Check function - $res = $this->CreateLogStreamTriggerByPropertyArray( $mySourceID, SYSLOG_MESSAGE, MISC_CHECKSUM ); - - // return results! - return $res; - } - - - // --- Private functions... - /** - * Helper function to consolidate syslogmessages - */ - private function ConsolidateSyslogmessagesPerHost( $arrHosts ) - { - global $content, $gl_starttime, $fields; - - // Now open the stream for data processing - $res = $this->_streamObj->Open( $this->_arrProperties, true ); - if ( $res == SUCCESS ) - { - // --- New Method to consolidate data! - // TimeStats - $nowtime = microtime_float(); - $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; - - // Update all Checksums first! - $this->_streamObj->UpdateAllMessageChecksum(); - - // TimeStats - $nowtime = microtime_float(); - $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; - - foreach ( $arrHosts as $myHost ) - { - // Set custom filters - $this->_streamObj->ResetFilters(); - $this->_streamObj->SetFilter( $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_Syslog ); - $this->_streamObj->RemoveFilters( SYSLOG_HOST ); - $this->_streamObj->AppendFilter( $fields[SYSLOG_HOST]['SearchField'] . ":=" . $myHost ); - - // Set Host Item Basics if not set yet - $content["report_consdata"][ $myHost ][SYSLOG_HOST] = $myHost; - - // Get Data for single host - $content["report_consdata"][ $myHost ]['cons_msgs'] = $this->_streamObj->ConsolidateDataByField( MISC_CHECKSUM, $this->_maxMsgsPerHost, MISC_CHECKSUM, SORTING_ORDER_DESC, null, true, true ); - - //print_r ($fields[SYSLOG_MESSAGE]); - foreach ( $content["report_consdata"][ $myHost ]['cons_msgs'] as &$myConsData ) - { - // Set Basic data entries - if (!isset( $content['filter_facility_list'][$myConsData[SYSLOG_FACILITY]] )) - $myConsData[SYSLOG_FACILITY] = SYSLOG_LOCAL0; // Set default in this case - if (!isset( $content['filter_severity_list'][$myConsData[SYSLOG_SEVERITY]] )) - $myConsData[SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case - } - } - - // TimeStats - $nowtime = microtime_float(); - $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; - // --- - -/* - // --- Old Method! - // Init uid helper - $uID = UID_UNKNOWN; - - // Set position to BEGIN of FILE - $this->_streamObj->Sseek($uID, EnumSeek::BOS, 0); - - // Start reading data - $ret = $this->_streamObj->Read($uID, $logArray); - - // TimeStats - $nowtime = microtime_float(); - $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; - - // Found first data record - if ( $ret == SUCCESS ) - { - do - { - // Check if Event from host is in our hosts array - if ( in_array($logArray[SYSLOG_HOST], $arrHosts) ) - { - // Set Host Item Basics if not set yet - if ( !isset($content["report_consdata"][ $logArray[SYSLOG_HOST] ][SYSLOG_HOST]) ) - { - $content["report_consdata"][ $logArray[SYSLOG_HOST] ][SYSLOG_HOST] = $logArray[SYSLOG_HOST]; - } - - // Calc checksum - if ( !isset($logArray[MISC_CHECKSUM]) || $logArray[MISC_CHECKSUM] == 0 ) - { - // Calc crc32 from message, we use this as index - $logArray[MISC_CHECKSUM] = crc32( $logArray[SYSLOG_MESSAGE] ); // Maybe useful somewhere else: sprintf( "%u", crc32 ( $logArray[SYSLOG_MESSAGE] )); - $strChecksum = $logArray[MISC_CHECKSUM]; - - // Save calculated Checksum into DB! - $this->_streamObj->SaveMessageChecksum($logArray); - } - else // Get checksum - $strChecksum = $logArray[MISC_CHECKSUM]; - - // Check if entry exists in result array - if ( isset($content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ]) ) - { - // Increment counter and set First/Last Event date - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ]['itemcount']++; - - // Set FirstEvent date if necessary! - if ( $logArray[SYSLOG_DATE][EVTIME_TIMESTAMP] < $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ]['firstoccurrence_date'][EVTIME_TIMESTAMP] ) - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ]['firstoccurrence_date'] = $logArray[SYSLOG_DATE]; - - // Set LastEvent date if necessary! - if ( $logArray[SYSLOG_DATE][EVTIME_TIMESTAMP] > $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ]['lastoccurrence_date'][EVTIME_TIMESTAMP] ) - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ]['lastoccurrence_date'] = $logArray[SYSLOG_DATE]; - } - else - { - // Set Basic data entries - if (isset( $content['filter_facility_list'][$logArray[SYSLOG_FACILITY]] )) - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ][SYSLOG_FACILITY] = $logArray[SYSLOG_FACILITY]; - else - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ][SYSLOG_FACILITY] = SYSLOG_LOCAL0; // Set default in this case - if (isset( $content['filter_severity_list'][$logArray[SYSLOG_SEVERITY]] )) - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ][SYSLOG_SEVERITY] = $logArray[SYSLOG_SEVERITY]; - else - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ][SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ][SYSLOG_SYSLOGTAG] = $logArray[SYSLOG_SYSLOGTAG]; - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ][SYSLOG_MESSAGE] = $logArray[SYSLOG_MESSAGE]; - - // Set Counter and First/Last Event date - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ]['itemcount'] = 1; - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ]['firstoccurrence_date'] = $logArray[SYSLOG_DATE]; - $content["report_consdata"][ $logArray[SYSLOG_HOST] ]['cons_msgs'][ $strChecksum ]['lastoccurrence_date'] = $logArray[SYSLOG_DATE]; - } - } - - // Get next data record - $ret = $this->_streamObj->ReadNext($uID, $logArray); - } while ( $ret == SUCCESS ); - - // TimeStats - $nowtime = microtime_float(); - $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; - } - else - return $ret; -*/ - - // --- Start Postprocessing - foreach( $content["report_consdata"] as &$tmpConsolidatedComputer ) - { - // First use callback function to sort array - uasort($tmpConsolidatedComputer['cons_msgs'], "MultiSortArrayByItemCountDesc"); - - // Remove entries according to _maxMsgsPerHost - if ( count($tmpConsolidatedComputer['cons_msgs']) > $this->_maxMsgsPerHost ) - { - $iDropCount = 0; - - do - { - array_pop($tmpConsolidatedComputer['cons_msgs']); - $iDropCount++; - } while ( count($tmpConsolidatedComputer['cons_msgs']) > $this->_maxMsgsPerHost ); - - // Append a dummy entry which shows count of all other events - if ( $iDropCount > 0 ) - { - $lastEntry[SYSLOG_SEVERITY] = SYSLOG_NOTICE; - $lastEntry[SYSLOG_FACILITY] = SYSLOG_LOCAL0; - $lastEntry[SYSLOG_SYSLOGTAG] = $content['LN_GEN_ALL_OTHER_EVENTS']; - $lastEntry[SYSLOG_MESSAGE] = $content['LN_GEN_ALL_OTHER_EVENTS']; - $lastEntry['itemcount'] = $iDropCount; - $lastEntry['firstoccurrence_date'] = "-"; - $lastEntry['lastoccurrence_date'] = "-"; - - $tmpConsolidatedComputer['cons_msgs'][] = $lastEntry; - } - } - - // TimeStats - $nowtime = microtime_float(); - $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; - - // PostProcess Events! - foreach( $tmpConsolidatedComputer["cons_msgs"] as &$tmpMyEvent ) - { - $tmpMyEvent['FirstOccurrence_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['firstoccurrence_date'] ); - $tmpMyEvent['LastOccurrence_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['lastoccurrence_date'] ); - $tmpMyEvent['syslogseverity_text'] = $this->GetSeverityDisplayName($tmpMyEvent['syslogseverity']); //$content['filter_severity_list'][ $tmpMyEvent['syslogseverity'] ]["DisplayName"]; - $tmpMyEvent['syslogfacility_text'] = $this->GetFacilityDisplayName($tmpMyEvent['syslogfacility']); //$content['filter_facility_list'][ $tmpMyEvent['syslogfacility'] ]["DisplayName"]; - $tmpMyEvent['syslogseverity_bgcolor'] = $this->GetSeverityBGColor($tmpMyEvent['syslogseverity']); - $tmpMyEvent['syslogfacility_bgcolor'] = $this->GetSeverityBGColor($tmpMyEvent['syslogfacility']); - } - } - // --- - } - - // Work done! - return SUCCESS; - } - - /* - * Helper function to convert a facility string into a facility number - */ - private function GetFacilityDisplayName($nFacility) - { - global $content; - if ( isset($nFacility) && is_numeric($nFacility) ) - { - foreach ( $content['filter_facility_list'] as $myfacility ) - { - // check if valid! - if ( $myfacility['ID'] == $nFacility ) - return $myfacility['DisplayName']; - } - } - - // If we reach this point, facility is not valid - return $content['LN_GEN_UNKNOWN']; - } - - /* - * Helper function to convert a severity string into a severity number - */ - private function GetSeverityDisplayName($nSeverity) - { - global $content; - if ( isset($nSeverity) && is_numeric($nSeverity) ) - { - foreach ( $content['filter_severity_list'] as $myseverity ) - { - // check if valid! - if ( $myseverity['ID'] == $nSeverity ) - return $myseverity['DisplayName']; - } - } - - // If we reach this point, severity is not valid - return $content['LN_GEN_UNKNOWN']; - } - - /* - * Helper function to obtain Severity background color - */ - private function GetSeverityBGColor( $nSeverity ) - { - global $severity_colors; - - if ( isset( $severity_colors[$nSeverity] ) ) - return $severity_colors[$nSeverity]; - else - return $severity_colors[SYSLOG_INFO]; //Default - } - - /* - * Helper function to obtain Severity background color - */ - private function GetFacilityBGColor( $nFacility ) - { - global $facility_colors; - - if ( isset( $facility_colors[$nFacility] ) ) - return $facility_colors[$nFacility]; - else - return $facility_colors[SYSLOG_LOCAL0]; //Default - } - - //--- -} - +. + * + * A copy of the GPL can be found in the file "COPYING" in this + * distribution. + ********************************************************************* +*/ + +// --- Avoid directly accessing this file! +if ( !defined('IN_PHPLOGCON') ) +{ + die('Hacking attempt'); + exit; +} +// --- + +// --- Basic Includes! +require_once($gl_root_path . 'classes/reports/report.class.php'); +// --- + +class Report_syslogsummary extends Report { + // Common Properties + public $_reportVersion = 1; // Internally Version of the ReportEngine + public $_reportID = "report.syslog.syslogsummary.class"; // ID for the report, needs to be unique! + public $_reportFileBasicName = "report.syslog.syslogsummary"; // Basic Filename for reportfiles + public $_reportTitle = "Syslog Summary Report"; // Display name for the report + public $_reportDescription = "This is a Syslog Summary Report"; + public $_reportHelpArticle = "http://loganalyzer.adiscon.com/plugins/reports/syslog-syslogsummary"; + public $_reportNeedsInit = false; // True means that this report needs additional init stuff + public $_reportInitialized = false; // True means report is installed + + // Advanced Report Options + private $_maxHosts = 20; // Threshold for maximum hosts to analyse! + private $_maxMsgsPerHost = 100; // Threshold for maximum amount of syslogmessages to analyse per host + private $_colorThreshold = 10; // Threshold for coloured display of Eventcounter + + // Constructor + public function Report_syslogsummary() { +// $this->_logStreamConfigObj = $streamConfigObj; + + // Fill fields we need for this report + $this->_arrProperties[] = SYSLOG_UID; + $this->_arrProperties[] = SYSLOG_DATE; + $this->_arrProperties[] = SYSLOG_HOST; + $this->_arrProperties[] = SYSLOG_MESSAGETYPE; + $this->_arrProperties[] = SYSLOG_FACILITY; + $this->_arrProperties[] = SYSLOG_SEVERITY; + $this->_arrProperties[] = SYSLOG_SYSLOGTAG; + // $this->_arrProperties[] = SYSLOG_PROCESSID; + $this->_arrProperties[] = SYSLOG_MESSAGE; + $this->_arrProperties[] = MISC_CHECKSUM; + + // Init Customfilters Array + $this->_arrCustomFilters['_maxHosts'] = array ( 'InternalID' => '_maxHosts', + 'DisplayLangID' => 'ln_report_maxHosts_displayname', + 'DescriptLangID'=> 'ln_report_maxHosts_description', + FILTER_TYPE => FILTER_TYPE_NUMBER, + 'DefaultValue' => 20, + 'MinValue' => 1, +/* 'MaxValue' => 0,*/ + ); + $this->_arrCustomFilters['_maxMsgsPerHost'] = + array ( 'InternalID' => '_maxMsgsPerHost', + 'DisplayLangID' => 'ln_report_maxMsgsPerHost_displayname', + 'DescriptLangID'=> 'ln_report_maxMsgsPerHost_description', + FILTER_TYPE => FILTER_TYPE_NUMBER, + 'DefaultValue' => 100, + 'MinValue' => 1, +/* 'MaxValue' => 0,*/ + ); + $this->_arrCustomFilters['_colorThreshold'] = + array ( 'InternalID' => '_colorThreshold', + 'DisplayLangID' => 'ln_report_colorThreshold_displayname', + 'DescriptLangID'=> 'ln_report_colorThreshold_description', + FILTER_TYPE => FILTER_TYPE_NUMBER, + 'DefaultValue' => 10, + 'MinValue' => 1, +/* 'MaxValue' => 0,*/ + ); + + + + } + + /** + * startDataProcessing, analysing data + * + * @param arrProperties array in: Properties wish list. + * @return integer Error stat + */ + public function startDataProcessing() + { + global $content, $severity_colors, $gl_starttime, $fields; + + // Create Filter string, append filter for EventLog Type msgs! + $szFilters = $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_Syslog; + + // Set Filter string + $this->_streamObj->SetFilter( $szFilters ); + + // Need to Open stream first! + $res = $this->_streamObj->Open( $this->_arrProperties, true ); + if ( $res == SUCCESS ) + { + // Set to common content variables + $this->SetCommonContentVariables(); + + // Set report specific content variables + $content["_colorThreshold"] = $this->_colorThreshold; + + // --- Report logic starts here + $content["report_rendertime"] = ""; + + // Step 1: Gather Summaries + // Obtain data from the logstream! + $content["report_summary"] = $this->_streamObj->ConsolidateDataByField( SYSLOG_SEVERITY, 0, SYSLOG_SEVERITY, SORTING_ORDER_DESC, null, false ); + + // TimeStats + $nowtime = microtime_float(); + $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s, "; + + // If data is valid, we have an array! + if ( is_array($content["report_summary"]) && count($content["report_summary"]) > 0 ) + { + // Count Total Events + $iTotalEvents = 0; + + foreach ($content["report_summary"] as &$tmpReportData ) + { + $tmpReportData['DisplayName'] = $this->GetSeverityDisplayName( $tmpReportData[SYSLOG_SEVERITY] ); + $tmpReportData['bgcolor'] = $this->GetSeverityBGColor( $tmpReportData[SYSLOG_SEVERITY] ); // $severity_colors[ $tmpReportData[SYSLOG_SEVERITY] ]; + + $iTotalEvents += $tmpReportData['itemcount']; + } + + // Prepent Item with totalevents count + $totalItem['DisplayName'] = "Total Events"; + $totalItem['bgcolor'] = "#999999"; + $totalItem['itemcount'] = $iTotalEvents; + + // Prepent to array + array_unshift( $content["report_summary"], $totalItem ); + } + else + return ERROR_REPORT_NODATA; + + // Get List of hosts + $content["report_computers"] = $this->_streamObj->ConsolidateItemListByField( SYSLOG_HOST, $this->_maxHosts, SYSLOG_HOST, SORTING_ORDER_DESC ); + + // TimeStats + $nowtime = microtime_float(); + $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s, "; + + if ( is_array($content["report_computers"]) && count($content["report_computers"]) > 0 ) + { + // Create plain hosts list for Consolidate function + foreach ( $content["report_computers"] as $tmpComputer ) + $arrHosts[] = $tmpComputer[SYSLOG_HOST]; + } + else + return ERROR_REPORT_NODATA; + + // This function will consolidate the Events based per Host! + $this->ConsolidateSyslogmessagesPerHost($arrHosts); + + // TimeStats + $nowtime = microtime_float(); + $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; + // --- + } + else + return $ret; + + // Return success! + return SUCCESS; + } + + + /** + * InitReport, empty + * + */ + public function InitReport() + { + // Nothing to do + return SUCCESS; + } + + + /** + * RemoveReport, empty + * + */ + public function RemoveReport() + { + // Nothing to do + return SUCCESS; + } + + + /** + * validateLicense, check license code + * + */ + public function validateLicense() + { + // This is a free report! + return SUCCESS; + } + + /** + * Init advanced settings from _customFilters string + */ + public function InitAdvancedSettings() + { + // Parse and Split _customFilters + if ( strlen($this->_customFilters) > 0 ) + { + // First of all split by comma + $tmpFilterValues = explode( ",", $this->_customFilters ); + + //Loop through mappings + foreach ($tmpFilterValues as &$myFilterValue ) + { + // Split subvalues + $tmpArray = explode( "=>", $myFilterValue ); + + // Set into temporary array + $tmpfilterid = trim($tmpArray[0]); + + // Set advanced property + if ( isset($this->_arrCustomFilters[$tmpfilterid]) ) + { + // Copy New value first! + $szNewVal = trim($tmpArray[1]); + + // Negated logic + if ( + $this->_arrCustomFilters[$tmpfilterid][FILTER_TYPE] == FILTER_TYPE_NUMBER && + !(isset($this->_arrCustomFilters[$tmpfilterid]['MinValue']) && intval($szNewVal) < $this->_arrCustomFilters[$tmpfilterid]['MinValue']) && + !(isset($this->_arrCustomFilters[$tmpfilterid]['MaxValue']) && intval($szNewVal) >= $this->_arrCustomFilters[$tmpfilterid]['MaxValue']) + ) + { + if ( $tmpfilterid == '_maxHosts' ) + $this->_maxHosts = intval($szNewVal); + else if ( $tmpfilterid == '_maxMsgsPerHost' ) + $this->_maxMsgsPerHost = intval($szNewVal); + else if ( $tmpfilterid == '_colorThreshold' ) + $this->_colorThreshold = intval($szNewVal); + } + else + { + // Write to debuglog + OutputDebugMessage("Failed setting advanced report option property '" . $tmpfilterid . "', value not in value range!", DEBUG_ERROR); + } + } + } + } + } + + + /* + * Implementation of CheckLogStreamSource + */ + public function CheckLogStreamSource( $mySourceID ) + { + // Call basic report Check function + $res = $this->CheckLogStreamSourceByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_SEVERITY, SYSLOG_MESSAGETYPE), SYSLOG_MESSAGE ); + + // return results! + return $res; + } + + + /* + * Implementation of CreateLogStreamIndexes | Will create missing INDEXES + */ + public function CreateLogStreamIndexes( $mySourceID ) + { + // Call basic report Check function + $res = $this->CreateLogStreamIndexesByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_SEVERITY, SYSLOG_MESSAGETYPE) ); + + // return results! + return $res; + } + + + /* + * Implementation of CreateLogStreamIndexes | Will create missing INDEXES + */ + public function CreateLogStreamTrigger( $mySourceID ) + { + // Call basic report Check function + $res = $this->CreateLogStreamTriggerByPropertyArray( $mySourceID, SYSLOG_MESSAGE, MISC_CHECKSUM ); + + // return results! + return $res; + } + + + // --- Private functions... + /** + * Helper function to consolidate syslogmessages + */ + private function ConsolidateSyslogmessagesPerHost( $arrHosts ) + { + global $content, $gl_starttime, $fields; + + // Now open the stream for data processing + $res = $this->_streamObj->Open( $this->_arrProperties, true ); + if ( $res == SUCCESS ) + { + // --- New Method to consolidate data! + // TimeStats + $nowtime = microtime_float(); + $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; + + // Update all Checksums first! + $this->_streamObj->UpdateAllMessageChecksum(); + + // TimeStats + $nowtime = microtime_float(); + $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; + + foreach ( $arrHosts as $myHost ) + { + // Set custom filters + $this->_streamObj->ResetFilters(); + $this->_streamObj->SetFilter( $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_Syslog ); + $this->_streamObj->RemoveFilters( SYSLOG_HOST ); + $this->_streamObj->AppendFilter( $fields[SYSLOG_HOST]['SearchField'] . ":=" . $myHost ); + + // Set Host Item Basics if not set yet + $content["report_consdata"][ $myHost ][SYSLOG_HOST] = $myHost; + + // Get Data for single host + $content["report_consdata"][ $myHost ]['cons_msgs'] = $this->_streamObj->ConsolidateDataByField( MISC_CHECKSUM, $this->_maxMsgsPerHost, MISC_CHECKSUM, SORTING_ORDER_DESC, null, true, true ); + + // Only process results if valid! + if ( is_array($content["report_consdata"][ $myHost ]['cons_msgs']) ) + { + foreach ( $content["report_consdata"][ $myHost ]['cons_msgs'] as &$myConsData ) + { + // Set Basic data entries + if (!isset( $content['filter_facility_list'][$myConsData[SYSLOG_FACILITY]] )) + $myConsData[SYSLOG_FACILITY] = SYSLOG_LOCAL0; // Set default in this case + if (!isset( $content['filter_severity_list'][$myConsData[SYSLOG_SEVERITY]] )) + $myConsData[SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case + } + } + else + { + // Write to debuglog + OutputDebugMessage("Failed consolidating data for '" . $myHost . "' with error " . $content["report_consdata"][ $myHost ]['cons_msgs'], DEBUG_ERROR); + + // Set to empty array + $content["report_consdata"][ $myHost ]['cons_msgs'] = array(); + } + } + + // TimeStats + $nowtime = microtime_float(); + $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; + // --- + + // --- Start Postprocessing + foreach( $content["report_consdata"] as &$tmpConsolidatedComputer ) + { + // First use callback function to sort array + uasort($tmpConsolidatedComputer['cons_msgs'], "MultiSortArrayByItemCountDesc"); + + // Remove entries according to _maxMsgsPerHost + if ( count($tmpConsolidatedComputer['cons_msgs']) > $this->_maxMsgsPerHost ) + { + $iDropCount = 0; + + do + { + array_pop($tmpConsolidatedComputer['cons_msgs']); + $iDropCount++; + } while ( count($tmpConsolidatedComputer['cons_msgs']) > $this->_maxMsgsPerHost ); + + // Append a dummy entry which shows count of all other events + if ( $iDropCount > 0 ) + { + $lastEntry[SYSLOG_SEVERITY] = SYSLOG_NOTICE; + $lastEntry[SYSLOG_FACILITY] = SYSLOG_LOCAL0; + $lastEntry[SYSLOG_SYSLOGTAG] = $content['LN_GEN_ALL_OTHER_EVENTS']; + $lastEntry[SYSLOG_MESSAGE] = $content['LN_GEN_ALL_OTHER_EVENTS']; + $lastEntry['itemcount'] = $iDropCount; + $lastEntry['firstoccurrence_date'] = "-"; + $lastEntry['lastoccurrence_date'] = "-"; + + $tmpConsolidatedComputer['cons_msgs'][] = $lastEntry; + } + } + + // TimeStats + $nowtime = microtime_float(); + $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; + + // PostProcess Events! + foreach( $tmpConsolidatedComputer["cons_msgs"] as &$tmpMyEvent ) + { + $tmpMyEvent['FirstOccurrence_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['firstoccurrence_date'] ); + $tmpMyEvent['LastOccurrence_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['lastoccurrence_date'] ); + $tmpMyEvent['syslogseverity_text'] = $this->GetSeverityDisplayName($tmpMyEvent['syslogseverity']); //$content['filter_severity_list'][ $tmpMyEvent['syslogseverity'] ]["DisplayName"]; + $tmpMyEvent['syslogfacility_text'] = $this->GetFacilityDisplayName($tmpMyEvent['syslogfacility']); //$content['filter_facility_list'][ $tmpMyEvent['syslogfacility'] ]["DisplayName"]; + $tmpMyEvent['syslogseverity_bgcolor'] = $this->GetSeverityBGColor($tmpMyEvent['syslogseverity']); + $tmpMyEvent['syslogfacility_bgcolor'] = $this->GetSeverityBGColor($tmpMyEvent['syslogfacility']); + } + } + // --- + } + + // Work done! + return SUCCESS; + } + + /* + * Helper function to convert a facility string into a facility number + */ + private function GetFacilityDisplayName($nFacility) + { + global $content; + if ( isset($nFacility) && is_numeric($nFacility) ) + { + foreach ( $content['filter_facility_list'] as $myfacility ) + { + // check if valid! + if ( $myfacility['ID'] == $nFacility ) + return $myfacility['DisplayName']; + } + } + + // If we reach this point, facility is not valid + return $content['LN_GEN_UNKNOWN']; + } + + /* + * Helper function to convert a severity string into a severity number + */ + private function GetSeverityDisplayName($nSeverity) + { + global $content; + if ( isset($nSeverity) && is_numeric($nSeverity) ) + { + foreach ( $content['filter_severity_list'] as $myseverity ) + { + // check if valid! + if ( $myseverity['ID'] == $nSeverity ) + return $myseverity['DisplayName']; + } + } + + // If we reach this point, severity is not valid + return $content['LN_GEN_UNKNOWN']; + } + + /* + * Helper function to obtain Severity background color + */ + private function GetSeverityBGColor( $nSeverity ) + { + global $severity_colors; + + if ( isset( $severity_colors[$nSeverity] ) ) + return $severity_colors[$nSeverity]; + else + return $severity_colors[SYSLOG_INFO]; //Default + } + + /* + * Helper function to obtain Severity background color + */ + private function GetFacilityBGColor( $nFacility ) + { + global $facility_colors; + + if ( isset( $facility_colors[$nFacility] ) ) + return $facility_colors[$nFacility]; + else + return $facility_colors[SYSLOG_LOCAL0]; //Default + } + + //--- +} + ?> \ No newline at end of file