diff --git a/src/classes/html2fpdf/fpdf.php b/src/classes/html2fpdf/fpdf.php
index 0661ae9..7dcfbee 100644
--- a/src/classes/html2fpdf/fpdf.php
+++ b/src/classes/html2fpdf/fpdf.php
@@ -1171,7 +1171,10 @@ function WriteFlowingBlock( $s , $outofblock = false )
case 'J':
foreach ( $content as $k => $chunk )
{
- $this->restoreFont( $font[ $k ] );
+// BEGIN FIX BY ANDRE
+ if ( isset($font[ $k ]) )
+ $this->restoreFont( $font[ $k ] );
+// END FIX BY ANDRE
$stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k );
// determine which borders should be used
$b = '';
@@ -1200,7 +1203,10 @@ function WriteFlowingBlock( $s , $outofblock = false )
case 'C':
foreach ( $content as $k => $chunk )
{
- $this->restoreFont( $font[ $k ] );
+// BEGIN FIX BY ANDRE
+ if ( isset($font[ $k ]) )
+ $this->restoreFont( $font[ $k ] );
+// END FIX BY ANDRE
$stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k );
// determine which borders should be used
$b = '';
diff --git a/src/classes/reports/report.eventlog.logonlogoff.class.php b/src/classes/reports/report.eventlog.logonlogoff.class.php
new file mode 100644
index 0000000..36e0b83
--- /dev/null
+++ b/src/classes/reports/report.eventlog.logonlogoff.class.php
@@ -0,0 +1,482 @@
+.
+ *
+ * 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_logonlogoff extends Report {
+ // Common Properties
+ public $_reportVersion = 1; // Internally Version of the ReportEngine
+ public $_reportID = "report.eventlog.logonlogoff.class"; // ID for the report, needs to be unique!
+ public $_reportFileBasicName = "report.eventlog.logonlogoff"; // Basic Filename for reportfiles
+ public $_reportTitle = "EventLog Logon/Logoff Report"; // Display name for the report
+ public $_reportDescription = "This is a EventLog Logon/Logoff Summary Report";
+ public $_reportHelpArticle = "http://loganalyzer.adiscon.com/plugins/reports/eventlog-logonlogoff";
+ 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 $_maxLogOnLogOffsPerHost = 100; // Threshold for maximum amount of logon/logoffs to analyse per host
+ private $_colorThreshold = 10; // Threshold for coloured display of Eventcounter
+
+ // Constructor
+ public function Report_logonlogoff() {
+// $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_SEVERITY;
+ $this->_arrProperties[] = SYSLOG_EVENT_ID;
+ $this->_arrProperties[] = SYSLOG_EVENT_SOURCE;
+ $this->_arrProperties[] = SYSLOG_EVENT_USER;
+// $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['_maxLogOnLogOffsPerHost'] =
+ array ( 'InternalID' => '_maxLogOnLogOffsPerHost',
+ 'DisplayLangID' => 'ln_report_maxLogOnLogOffsPerHost_displayname',
+ 'DescriptLangID'=> 'ln_report_maxLogOnLogOffsPerHost_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_NT_EventReport . ",=" . IUT_WEVTMONV2 . " "; /* Include EventLog v1 and v2 */
+
+ // 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_HOST, 0, SYSLOG_HOST, 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'] = $tmpReportData[SYSLOG_HOST];
+ $tmpReportData['bgcolor'] = "#BBBBBB"; // $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->ConsolidateLogonLogoffs(); // ($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 == '_maxLogOnLogOffsPerHost' )
+ $this->_maxLogOnLogOffsPerHost = 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_EVENT_ID, SYSLOG_MESSAGETYPE), null );
+
+ // 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_EVENT_ID, SYSLOG_MESSAGETYPE) );
+
+ // return results!
+ return $res;
+ }
+
+
+ /*
+ * Implementation of CreateLogStreamIndexes | Will create missing TRIGGER
+ */
+ public function CreateLogStreamTrigger( $mySourceID )
+ {
+ // Dummy return SUCCESS!
+ return SUCCESS;
+ }
+
+
+ // --- Private functions...
+ /**
+ * Helper function to consolidate events
+ */
+ private function ConsolidateLogonLogoffs() // ( $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!
+//not needed $this->_streamObj->UpdateAllMessageChecksum();
+
+ // TimeStats
+ $nowtime = microtime_float();
+ $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s ";
+
+ // Get all LOGON Data
+ // Set custom filters
+ $this->_streamObj->ResetFilters();
+ $this->_streamObj->SetFilter(
+ $this->_filterString . " " .
+ $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_NT_EventReport . ",=" . IUT_WEVTMONV2 . " " .
+ $fields[SYSLOG_EVENT_ID]['SearchField'] . ":=528,4624" ); /* Include EventIDs for new and old Eventlog API*/
+ $content["report_consdata"]['logon']['cons_events'] = $this->_streamObj->ConsolidateDataByField( SYSLOG_EVENT_USER, $this->_maxLogOnLogOffsPerHost, SYSLOG_EVENT_USER, SORTING_ORDER_DESC, null, true, true );
+ foreach ( $content["report_consdata"]['logon']['cons_events'] as &$myConsData )
+ {
+ // Set Basic data entries
+ if (!isset( $content['filter_severity_list'][$myConsData[SYSLOG_SEVERITY]] ))
+ $myConsData[SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case
+ }
+ // Set Basic properties
+ $content["report_consdata"]['logon']['DataCaption'] = "Logon Events";
+
+
+ // Get all LOGOFF Data
+ // Set custom filters
+ $this->_streamObj->ResetFilters();
+ $this->_streamObj->SetFilter(
+ $this->_filterString . " " .
+ $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_NT_EventReport . ",=" . IUT_WEVTMONV2 . " " .
+ $fields[SYSLOG_EVENT_ID]['SearchField'] . ":=538,4634" ); /* Include EventIDs for new and old Eventlog API*/
+ $content["report_consdata"]['logoff']['cons_events'] = $this->_streamObj->ConsolidateDataByField( SYSLOG_EVENT_USER, $this->_maxLogOnLogOffsPerHost, SYSLOG_EVENT_USER, SORTING_ORDER_DESC, null, true, true );
+ foreach ( $content["report_consdata"]['logoff']['cons_events'] as &$myConsData )
+ {
+ // Set Basic data entries
+ if (!isset( $content['filter_severity_list'][$myConsData[SYSLOG_SEVERITY]] ))
+ $myConsData[SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case
+ }
+ // Set Basic properties
+ $content["report_consdata"]['logoff']['DataCaption'] = "Logoff Events";
+
+/* foreach ( $arrHosts as $myHost )
+ {
+ // Set custom filters
+ $this->_streamObj->ResetFilters();
+ $this->_streamObj->SetFilter( $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_NT_EventReport . ",=" . IUT_WEVTMONV2 . " " . $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_events'] = $this->_streamObj->ConsolidateDataByField( SYSLOG_EVENT_ID, $this->_maxLogOnLogOffsPerHost, SYSLOG_EVENT_USER, SORTING_ORDER_DESC, null, true, true );
+ //print_r ($fields[SYSLOG_MESSAGE]);
+ foreach ( $content["report_consdata"][ $myHost ]['cons_events'] as &$myConsData )
+ {
+ // Set Basic data entries
+ 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 ";
+ // ---
+
+
+ // Start Postprocessing
+ foreach( $content["report_consdata"] as &$tmpConsolidatedData )
+ {
+ // First use callback function to sort array
+ uasort($tmpConsolidatedData['cons_events'], "MultiSortArrayByItemCountDesc");
+
+/*
+ // Remove entries according to _maxLogOnLogOffsPerHost
+ if ( count($tmpConsolidatedComputer['cons_events']) > $this->_maxLogOnLogOffsPerHost )
+ {
+ $iDropCount = 0;
+
+ do
+ {
+ array_pop($tmpConsolidatedComputer['cons_events']);
+ $iDropCount++;
+ } while ( count($tmpConsolidatedComputer['cons_events']) > $this->_maxLogOnLogOffsPerHost );
+
+ // Append a dummy entry which shows count of all other events
+ if ( $iDropCount > 0 )
+ {
+ $lastEntry[SYSLOG_SEVERITY] = SYSLOG_NOTICE;
+ $lastEntry[SYSLOG_EVENT_ID] = "-";
+ $lastEntry[SYSLOG_EVENT_SOURCE] = $content['LN_GEN_ALL_OTHER_EVENTS'];
+ $lastEntry[SYSLOG_MESSAGE] = $content['LN_GEN_ALL_OTHER_EVENTS'];
+ $lastEntry['itemcount'] = $iDropCount;
+ $lastEntry['FirstEvent_Date'] = "-";
+ $lastEntry['LastEvent_Date'] = "-";
+
+ $tmpConsolidatedComputer['cons_events'][] = $lastEntry;
+ }
+ }
+*/
+ // TimeStats
+ $nowtime = microtime_float();
+ $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s ";
+
+ // PostProcess Events!
+ foreach( $tmpConsolidatedData["cons_events"] as &$tmpMyEvent )
+ {
+ $tmpMyEvent['FirstEvent_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['firstoccurrence_date'] );
+ $tmpMyEvent['LastEvent_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['lastoccurrence_date'] );
+ $tmpMyEvent['syslogseverity_text'] = $content['filter_severity_list'][ $tmpMyEvent['syslogseverity'] ]["DisplayName"];
+ $tmpMyEvent['syslogseverity_bgcolor'] = $this->GetSeverityBGColor($tmpMyEvent['syslogseverity']);
+ }
+ }
+ // ---
+ }
+
+ // Work done!
+ return SUCCESS;
+ }
+
+ /*
+ * 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
+ }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.css b/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.css
new file mode 100644
index 0000000..688a9dd
--- /dev/null
+++ b/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.css
@@ -0,0 +1,576 @@
+/* Generell Tag Classes */
+BODY
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ color: #000000;
+ background-color: #f9f9f9;
+
+ scrollbar-face-color: #DEE3E7;
+ scrollbar-highlight-color: #FFFFFF;
+ scrollbar-shadow-color: #DEE3E7;
+ scrollbar-3dlight-color: #D1D7DC;
+ scrollbar-arrow-color: #006699;
+ scrollbar-track-color: #EFEFEF;
+ scrollbar-darkshadow-color: #98AAB1;
+}
+
+TD
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 11px;
+ color: #000000
+}
+
+/* Default Link Classes */
+a:link,a:active,a:visited,a.postlink
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-weight: bold;
+ text-decoration:none;
+
+ background-color: transparent;
+ color:#38140E;
+}
+a:hover
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-weight: bold;
+ color:#CC0000;
+}
+/*---*/
+
+/* Context Link Classes */
+a.contextlink:link,a.contextlink:active,a.contextlink:visited,a.contextlink
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-weight: bold;
+ background-color: transparent;
+ color:#3814BB;
+ text-decoration:underline;
+}
+a.contextlink:hover
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-weight:bold;
+ color:#3844FF;
+ text-decoration:none;
+}
+/*---*/
+
+img
+{
+ border: 0px;
+}
+
+/* Title Classes */
+.title
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 11px;
+ font-weight:bold;
+
+ background-color: #C6B097;
+ color: #032D5D;
+
+ border: 1px solid;
+ border-color: #ACBED6 #3B679B #3B679B #ACBED6;
+ height: 20px;
+ text-align:center;
+ vertical-align:middle;
+}
+A.title, A.title:active, A.title:visited
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 11px;
+ font-weight:bold;
+
+ COLOR: #ED9D10;
+ TEXT-DECORATION: none;
+}
+A.title:hover
+{
+ COLOR: #982D00;
+ TEXT-DECORATION: none;
+}
+.titleSecond
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight:bold;
+
+ background-color: #E3D2AE;
+ background-image: url(images/bg_4.png);
+ background-repeat: repeat-x;
+ color: #1A3745;
+
+ height: 18px;
+ text-align:center;
+ vertical-align:middle;
+}
+
+
+/* Default Font Classes */
+font
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+/* Table / Border Classes */
+.table_with_border
+{
+ background-color:#EEF2F6;
+ border:1px solid;
+ border-color: #CCCCCC #000000 #000000 #CCCCCC;
+}
+
+.table_with_border_second
+{
+ background-color:#D5E0E7;
+ border:1px solid;
+ border-color: #CCCCCC #000000 #000000 #CCCCCC;
+}
+
+.table_with_border_light
+{
+ background-color:#CCCCCC;
+ border:1px #AAAAAA solid;
+}
+
+.with_border
+{
+ text-indent:3px;
+ background-color:#CCCCCC;
+ border:1px #AAAAAA solid;
+}
+
+.with_border_alternate
+{
+ text-indent:3px;
+ background-color:#CCCCCC;
+ border:1px #AAAAAA ridge;
+}
+
+.mainheader
+{
+ border:1px solid;
+ background-color:#C7CBD1;
+ border-color: #44617D #203040 #203040 #44617D;
+}
+
+.mainfooter
+{
+ height: 20px;
+ background-color:#DDDDDD;
+ border-top: #97A8B9 1px solid;
+ border-bottom: #6592BD 1px solid;
+}
+
+.imageborder
+{
+ border:1px solid;
+ border-color: #44617D #203040 #203040 #44617D;
+}
+
+/* Cells for listening */
+.line0
+{
+ font-size: 7pt;
+ color: #000000;
+ background-color: #DDDDDD;
+}
+.line0:hover
+{
+ background-color:#F9F9F9;
+}
+
+.line1
+{
+ font-size: 7pt;
+ color: #000000;
+ background-color: #EEEEEE;
+}
+.line1:hover
+{
+ background-color:#F9F9F9;
+}
+
+.line2
+{
+ font-size: 7pt;
+ color: #000000;
+ background-color: #F5F5F5;
+}
+.line2:hover
+{
+ background-color:#F9F9F9;
+}
+.tableBackground
+{
+ font-size: 10px;
+ color: #000000;
+ background-color: #F5F5F5;
+}
+
+.lineColouredWhite, .lineColouredWhite:hover, a.lineColouredWhite
+{
+ font-size: 10px;
+ color: #FFFFFF;
+}
+.lineColouredBlack, .lineColouredBlack:hover, a.lineColouredBlack
+{
+ font-size: 10px;
+ color: #000000;
+}
+
+/* TOP Menu Classes */
+.topmenu1begin
+{
+ height: 16px;
+ border:0px;
+ padding: 2px 2px 0px 2px;
+ vertical-align: middle;
+
+ background-color: #4E6485;
+}
+.topmenu1
+{
+ height: 16px;
+ border:1px ridge;
+ border-color: #79AABE #09506C #79AABE #79AABE;
+ padding: 2px 2px 0px 2px;
+ vertical-align: middle;
+
+ font: 10px Verdana, Arial, Helvetica, sans-serif;
+ color: #FFFFFF;
+ background-color: #4E6485;
+}
+.topmenu1:hover
+{
+ color: #FFFF99;
+ border:1px inset;
+ border-color: #79AABE #09506C #79AABE #79AABE;
+ background-color: #6A88B8;
+ text-decoration: none;
+}
+.topmenuend
+{
+ height: 16px;
+ font: 10px Verdana, Arial, Helvetica, sans-serif;
+ color: #FFFFFF;
+ background-color: #4E6485;
+}
+.topmenuextra
+{
+ height: 16px;
+ font: 10px Verdana, Arial, Helvetica, sans-serif;
+ color: #FFFFFF;
+ background-color: #B8D4E0;
+}
+.topmenu2begin
+{
+ height: 16px;
+ border:0px;
+ padding: 2px 2px 0px 2px;
+ vertical-align: middle;
+
+ background-color: #7A92A6;
+}
+.topmenu2
+{
+ height: 16px;
+ border:1px ridge;
+ border-color: #BDEEFF #79AABE #09506C #09506C;
+ padding: 2px 2px 0px 2px;
+ vertical-align: middle;
+
+ font: 10px Verdana, Arial, Helvetica, sans-serif;
+ color: #FFFFFF;
+ background-color: #7A92A6;
+}
+.topmenu2:hover
+{
+ color: #FFFF99;
+ border:1px inset;
+ border-color: #BDEEFF #79AABE #09506C #09506C;
+ background-color: #6A88B8;
+ text-decoration: none;
+}
+.topmenu2_link, A.topmenu2_link
+{
+ color: #FFDD22;
+}
+.topmenu2_link:hover, A.topmenu2_link:hover
+{
+ color: #FFFF99;
+ text-decoration: none;
+}
+.topmenu2end
+{
+ height: 16px;
+ border:1px inset;
+ border-color: #BDEEFF #79AABE #09506C #09506C;
+ font: 10px Verdana, Arial, Helvetica, sans-serif;
+ color: #FFFFFF;
+ background-color: #7A92A6;
+}
+.topmenu3begin
+{
+ height: 16px;
+ border:0px;
+ padding: 2px 2px 0px 2px;
+ vertical-align: middle;
+
+ background-color: #D4DAE3;
+}
+.topmenu3
+{
+ height: 16px;
+ border:1px ridge;
+ border-color: #BDEEFF #79AABE #09506C #09506C;
+ padding: 2px 2px 0px 2px;
+ vertical-align: middle;
+
+ font: 10px Arial, Verdana, Helvetica, sans-serif;
+ color: #FFFFFF;
+ background-color: #D4DAE3;
+}
+.topmenu3:hover
+{
+ color: #FFFF99;
+ border:1px inset;
+ border-color: #BDEEFF #79AABE #09506C #09506C;
+ background-color: #ACCBFD;
+ text-decoration: none;
+}
+.topmenu3end
+{
+ height: 16px;
+ font: 10px Arial, Verdana, Helvetica, sans-serif;
+ color: #FFFFFF;
+ background-color: #D4DAE3;
+}
+.topmenu1_link, a.topmenu1_link, a.topmenu1_link:visited, .topmenu2_link, a.topmenu2_link, a.topmenu2_link:visited, .topmenu3_link, a.topmenu3_link, a.topmenu3_link:visited
+{
+ vertical-align: middle;
+ height: 16px;
+
+ color: #FFDD22;
+ font-weight:bold;
+ text-decoration: none;
+}
+.topmenu1_link:hover, .topmenu2_link:hover, .topmenu3_link:hover
+{
+ vertical-align: middle;
+
+ color: #FFFF99;
+ font-weight:bold;
+ text-decoration: none;
+}
+
+
+
+/* Cell Columns */
+.cellmenu1
+{
+ border:1px ridge;
+ border-color: #79AABE #09506C #09506C #79AABE;
+
+ text-indent:0px;
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight:bold;
+
+ background-color: #2E79A0;
+
+ color: #FFFFFF;
+}
+.cellmenu1_naked
+{
+ border:1px ridge;
+ border-color: #79AABE #09506C #09506C #79AABE;
+ background-color: #2E79A0;
+
+ text-indent:0px;
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight:bold;
+
+ color: #FFFFFF;
+}
+.cellmenu1:hover .cellmenu1_naked:hover
+{
+ color: #FFFF99;
+ text-decoration: none;
+}
+A.cellmenu1_link
+{
+ color: #FFFF55;
+ text-decoration: underline;
+}
+A.cellmenu1_link:hover
+{
+ color: #FFBB55;
+ text-decoration: none;
+}
+
+.cellmenu2
+{
+ border:1px inset;
+ border-color: #79AABE #09506C #09506C #79AABE;
+
+ text-indent:0px;
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight:bold;
+
+ background-color: #9FDAF1;
+ color: #393327;
+}
+.cellmenu2_naked
+{
+ text-indent:0px;
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight:bold;
+
+ color: #393327;
+ border:1px inset;
+ border-color: #79AABE #09506C #09506C #79AABE;
+ background-color: #9FDAF1;
+}
+
+.cellmenu2:hover, .cellmenu2_naked:hover
+{
+ color: #A31D32;
+ text-decoration: none;
+}
+
+/* Usefull Text Classes */
+.ErrorMsg
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 12px;
+ font-weight: bold;
+
+ COLOR: #FF0000;
+}
+.PriorityEmergency
+{
+ color: #FFFFFF;
+ background-color: #ff4444;
+ border-top: black 1px solid;
+ border-bottom: black 1px solid;
+ border-right: gray 1px solid;
+}
+.PriorityAlert
+{
+ color: #FFFFFF;
+ background-color: #dd00dd;
+ border-top: black 1px solid;
+ border-bottom: black 1px solid;
+ border-right: gray 1px solid;
+}
+.PriorityCrit
+{
+ color: #FFFFFF;
+ background-color: #dd9900;
+ border-top: black 1px solid;
+ border-bottom: black 1px solid;
+ border-right: gray 1px solid;
+}
+.PriorityError
+{
+ color: #FFFFFF;
+ background-color: #CC0000;
+ border-top: black 1px solid;
+ border-bottom: black 1px solid;
+ border-right: gray 1px solid;
+}
+.PriorityWarning
+{
+ color: #FFFFFF;
+ background-color: #FFAA00;
+ border-top: black 1px solid;
+ border-bottom: black 1px solid;
+ border-right: gray 1px solid;
+}
+.PriorityNotice
+{
+ color: #FFFFFF;
+ background-color: #66CC33;
+ border-top: black 1px solid;
+ border-bottom: black 1px solid;
+ border-right: gray 1px solid;
+}
+.PriorityInfo
+{
+ color: #000000;
+ background-color: #ABF1FF;
+ border-top: black 1px solid;
+ border-bottom: black 1px solid;
+ border-right: gray 1px solid;
+}
+.PriorityDebug
+{
+ color: #FFFFFF;
+ background-color: #3333ff;
+ border-top: black 1px solid;
+ border-bottom: black 1px solid;
+ border-right: gray 1px solid;
+}
+
+/* Form elements */
+select, input, button, textarea
+{
+ background-color: #E8E7E2;
+ color:#000000;
+
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+
+ border: 1px solid;
+ border-color: #233B51 #124A7C #124A7C #233B51;
+}
+
+.SearchFormControl
+{
+ height: 20px;
+ margin: 2px;
+ background-color: #E8E7E2;
+ color:#000000;
+
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+
+ border: 1px solid;
+ border-color: #233B51 #124A7C #124A7C #233B51;
+}
+
+.SearchFormTextbox
+{
+ height: 20px;
+ margin: 2px;
+ background-color: #E8E7E2;
+ color:#000000;
+
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+
+ border: 1px solid;
+ border-color: #233B51 #124A7C #124A7C #233B51;
+}
+
+.highlighted
+{
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+
+ color: #BB0000
+}
+
diff --git a/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.lang.en.php b/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.lang.en.php
new file mode 100644
index 0000000..b8b6393
--- /dev/null
+++ b/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.lang.en.php
@@ -0,0 +1,57 @@
+.
+ *
+ * A copy of the GPL can be found in the file "COPYING" in this
+ * distribution.
+ *********************************************************************
+*/
+global $content;
+
+// Global Stuff
+$content['ln_report_event_summary'] = "Event Summary";
+$content['ln_report_computer_summary'] = "Computer Summary";
+$content['ln_report_consolidation'] = "Logon / Logoff Events consolidated per User";
+$content['ln_report_summary'] = "Report Summary";
+$content['ln_report_number'] = "No.";
+$content['ln_report_firstevent'] = "First Event";
+$content['ln_report_lastevent'] = "Last Event";
+$content['ln_report_user'] = "Domain & Username";
+$content['ln_report_severity'] = "Type";
+$content['ln_report_host'] = "Servername";
+$content['ln_report_description'] = "Description";
+$content['ln_report_count'] = "Count";
+$content['ln_report_maxHosts_displayname'] = "Max hosts";
+$content['ln_report_maxHosts_description'] = "The maximum number of hosts which will be displayed.";
+$content['ln_report_maxLogOnLogOffsPerHost_displayname'] = "Max Logon/Logoffs per host/user";
+$content['ln_report_maxLogOnLogOffsPerHost_description'] = "The maximum number of Logon/Logoff events displayed per host/user.";
+$content['ln_report_colorThreshold_displayname'] = "Counter Threshold";
+$content['ln_report_colorThreshold_description'] = "If the amount of consolidated events is higher then this threshold, the countfield will be marked red.";
+$content['ln_report_'] = "";
+$content['ln_report_'] = "";
+$content['ln_report_'] = "";
+$content['ln_report_'] = "";
+$content['ln_report_'] = "";
+$content['ln_report_'] = "";
+$content['ln_report_'] = "";
+
+?>
\ No newline at end of file
diff --git a/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.template.html b/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.template.html
new file mode 100644
index 0000000..8ae2cda
--- /dev/null
+++ b/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.template.html
@@ -0,0 +1,152 @@
+
+
+
+ {report_title}
+
+
+
+
+
+
+
+
+ {report_title} |
+
+
+{LN_REPORT_GENERATEDTIME} {report_gentime} |
+{report_comment} |
+
+
+
+
+
+
+
+
+
+
+
+
+ {FilterDisplay} |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ {ln_report_summary} |
+
+
+
+
+
+
+
+
+
+
+
+
+ {itemcount} |
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+ {ln_report_consolidation} |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {ZAEHLER} |
+
+ {itemcount} |
+
+
+ {itemcount} |
+
+ {FirstEvent_Date_Formatted} |
+ {LastEvent_Date_Formatted} |
+ {user} |
+ {syslogseverity_text} |
+ {FROMHOST} |
+
+
+
+
+
+
+
+
+
+
+ Made by Adiscon GmbH (2009-2011) |
+
+ Report Version {report_version}
+ |
+
+ Partners:
+ |
+
+ Rsyslog |
+ WinSyslog
+ |
+
+
+
+ {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}
+ | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
+
+ |
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.template.pdf b/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.template.pdf
new file mode 100644
index 0000000..87369f5
--- /dev/null
+++ b/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.template.pdf
@@ -0,0 +1,102 @@
+
+
+
+ {report_title}
+
+
+
+
+{report_title}
+{LN_REPORT_GENERATEDTIME} {report_gentime}
+{report_comment}
+
+
+
+
+
+
+
+
+
+
+ {FilterDisplay} |
+
+
+
+
+
+
+
+{ln_report_summary}
+
+
+
+
+
+
+
+
+ {itemcount} |
+
+
+
+
+
+
+{ln_report_consolidation}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {ZAEHLER} |
+
+ {itemcount} |
+
+
+ {itemcount} |
+
+ {FirstEvent_Date_Formatted} |
+ {LastEvent_Date_Formatted} |
+ {user} |
+ {syslogseverity_text} |
+ {FROMHOST} |
+
+
+
+
+
+
+
+
+
+ Made by Adiscon GmbH (2009-2011) Report Version {report_version} |
+ Partners: Rsyslog | WinSyslog |
+
+
+
+
+
+ {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}
+ | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
+
+ |
+
+
+
+
+
+
\ No newline at end of file