From 55b5367d76e32ce26f284913ae95f6bf17b97172 Mon Sep 17 00:00:00 2001
From: Robert Anderson <randerson@lbsd.net>
Date: Fri, 27 Mar 2009 11:16:53 +0000
Subject: [PATCH] added search for logs using timestamp

---
 webui/user-logs.php | 240 ++++++++++++++++++++++++++++++++------------
 1 file changed, 177 insertions(+), 63 deletions(-)

diff --git a/webui/user-logs.php b/webui/user-logs.php
index 8b4628b4..7c7f8c95 100644
--- a/webui/user-logs.php
+++ b/webui/user-logs.php
@@ -32,62 +32,179 @@ printHeader(array(
 		),
 ));
 
+
+
 ?>
 <p class="pageheader">User Log</p>
-
-<form id="main_form" action="user-attributes.php" method="post">
-
-<p />
-
-	<table class="results" style="width: 75%;">
-		<tr class="resultstitle">
-			<td class="textcenter">ServiceType</td>
-			<td class="textcenter">FramedProtocol</td>
-			<td class="textcenter">NASPort</td>
-			<td class="textcenter">NASPortType</td>
-			<td class="textcenter">CallingSationID</td>
-			<td class="textcenter">CalledStationID</td>
-			<td class="textcenter">NASPortID</td>
-			<td class="textcenter">AcctSessionID</td>
-			<td class="textcenter">FramedIPAddress</td>
-			<td class="textcenter">ActAuthentic</td>
-			<td class="textcenter">EventTimestamp</td>
-			<td class="textcenter">NASIdentifier</td>
-			<td class="textcenter">NASIPAddress</td>
-			<td class="textcenter">AcctDelayTime</td>
-			<td class="textcenter">AcctSessionTime</td>
-			<td class="textcenter">AcctInputOctets</td>
-			<td class="textcenter">AcctInputGigawords</td>
-			<td class="textcenter">AcctInputPackets</td>
-			<td class="textcenter">AcctOutputOctets</td>
-			<td class="textcenter">AcctOutputGigawords</td>
-			<td class="textcenter">AcctOutputPackets</td>
-			<td class="textcenter">AcctStatusType</td>
-			<td class="textcenter">AcctTerminateCause</td>
-		</tr>
 <?php
-	if (isset($_POST['user_id'])) {
+if (isset($_POST['user_id'])) {
 
-		# Fetch username from id supplied
+		# Which user in the accounting table should we look for?
 		$stmt = $db->prepare("SELECT Username FROM ${DB_TABLE_PREFIX}users WHERE ID = ?");
 		$stmt->execute(array($_POST['user_id']));
 		$row = $stmt->fetchObject();
 		$stmt->closeCursor();
-
 		$getuser = $row->username;
-		$sql = "SELECT ServiceType, FramedProtocol, NASPort, NASPortType, CallingStationID, CalledStationID, NASPortID, AcctSessionID, FramedIPAddress, AcctAuthentic, EventTimestamp, NASIdentifier, NASIPAddress, AcctDelayTime, AcctSessionTime, AcctInputOctets, AcctInputGigawords, AcctInputPackets, AcctOutputOctets, AcctOutputGigawords, AcctOutputPackets, AcctStatusType, AcctTerminateCause FROM ${DB_TABLE_PREFIX}accounting WHERE Username = '$getuser'";
 
-		$res = $db->query($sql);
+?>
+		<form id="main_form" action="user-logs.php" method="post">
+			<!-- Search things -->
+			<div>
+				<table>
+					<tr>
+						<td>From (yyyy-mm-dd)</td>
+					</tr>
+					<tr>
+						<td><input type="text" name="date_from" /></td>
+					</tr>
+					<tr>
+						<td>To (yyyy-mm-dd)</td>
+					</tr>
+					<tr>
+						<td><input type="text" name="date_to" /></td>
+					</tr>
+					<tr>
+						<input type="hidden" name="user_id" value=<?php echo $_POST['user_id']; ?> />
+						<td><input type="submit" value="Get results" /></td>
+					</tr>
+				</table>
+			</div>
+		</form>
+
+		<p />
+
+		<!-- Tables headings -->
+		<table class="results" style="width: 75%;">
+			<tr class="resultstitle">
+				<td class="textcenter">EventTimestamp</td>
+				<td class="textcenter">ServiceType</td>
+				<td class="textcenter">FramedProtocol</td>
+				<td class="textcenter">NASPort</td>
+				<td class="textcenter">NASPortType</td>
+				<td class="textcenter">CallingSationID</td>
+				<td class="textcenter">CalledStationID</td>
+				<td class="textcenter">NASPortID</td>
+				<td class="textcenter">AcctSessionID</td>
+				<td class="textcenter">FramedIPAddress</td>
+				<td class="textcenter">AcctAuthentic</td>
+				<td class="textcenter">NASIdentifier</td>
+				<td class="textcenter">NASIPAddress</td>
+				<td class="textcenter">AcctDelayTime</td>
+				<td class="textcenter">AcctSessionTime</td>
+				<td class="textcenter">Data-Input</td>
+				<td class="textcenter">Data-Output</td>
+				<td class="textcenter">AcctStatusType</td>
+				<td class="textcenter">AcctTerminateCause</td>
+			</tr>
+<?php
+			# Extra SQL
+			$extraSQL = "";
+			$extraSQLVals = array();
+			$limitSQL = "";
+
+			# Do we have a from date?, if so add it to our query
+			if (isset($_POST['date_from'])) {
+				$extraSQL .= " AND EventTimestamp >= ?";
+				array_push($extraSQLVals,$_POST['date_from']);
+			}
+			# Do we have a from date?, if so add it to our query
+			if (isset($_POST['date_to'])) {
+				$extraSQL .= " AND EventTimestamp <= ?";
+				array_push($extraSQLVals,$_POST['date_to']);
+			}
 
-		$rownums = 0;
-		while ($row = $res->fetchObject()) {
-			if ($row->framedipaddress != NULL) {
-				$rownums = $rownums + 1;
-			} else {
-				$rownums = $rownums - 1;
+			# Modify if we had a partial search or no search
+			if (count($extraSQLVals) < 2) {
+				$limitSQL = "LIMIT 50";
 			}
+
+				# Query to get all default data
+				$sql = "
+					SELECT
+							EventTimestamp, 
+							ServiceType,
+							FramedProtocol,
+							NASPort,
+							NASPortType, 
+							CallingStationID, 
+							CalledStationID, 
+							NASPortID, 
+							AcctSessionID, 
+							FramedIPAddress, 
+							AcctAuthentic, 
+							NASIdentifier, 
+							NASIPAddress, 
+							AcctDelayTime, 
+							AcctSessionTime, 
+							AcctInputOctets, 
+							AcctInputGigawords, 
+							AcctOutputOctets, 
+							AcctOutputGigawords, 
+							AcctStatusType, 
+							AcctTerminateCause 
+					FROM 
+							${DB_TABLE_PREFIX}accounting 
+					WHERE 
+							Username = '$getuser'
+							$extraSQL
+					ORDER BY
+							EventTimestamp
+					DESC
+						$limitSQL
+				";
+
+				$res = $db->prepare($sql);
+				$res->execute($extraSQLVals);
+
+				$rownums = 0;
+				while ($row = $res->fetchObject()) {
+
+					if ($row->eventtimestamp != NULL) {
+						$rownums = $rownums + 1;
+					} else {
+						$rownums = $rownums - 1;
+					}
+
+					# Data usage
+					# ==========
+
+					# Input
+					$inputData = 0;
+
+					if (!empty($row->acctinputoctets) && $row->acctinputoctets > 0) {
+						$inputData = ($row->accinputoctets / 1024 / 1024);
+					}
+					if (!empty($row->acctinputgigawords) && $row->inputgigawords > 0) {
+						$inputData = ($row->acctinputgigawords * 4096);
+					}
+					if ($inputData != 0) {
+						$inputDataDisplay = ceil($inputData * 100)/100;
+					} else {
+						$inputDataDisplay = 0;
+					}
+
+					$totalInputData = $totalInputData + $inputData;
+
+					# Output
+					$outputData = 0;
+
+					if (!empty($row->acctoutputoctets) && $row->acctoutputoctets > 0) {
+						$outputData = ($row->acctoutputoctets / 1024 / 1024);
+					}
+					if (!empty($row->acctoutputgigawords) && $row->acctoutputgigawords > 0) {
+						$outputData = ($row->acctoutputgigawords * 4096);
+					}
+					if ($outputData != 0) {
+						$outputDataDisplay = ceil($outputData * 100)/100;
+					} else {
+						$outputDataDisplay = 0;
+					}
+
+					$totalOutputData = $totalOutputData + $outputData;
+
 ?>
 			<tr class="resultsitem">
+				<td class="textcenter"><?php echo $row->eventtimestamp ?></td>
 				<td class="textcenter"><?php echo $row->servicetype ?></td>
 				<td class="textcenter"><?php echo $row->framedprotocol ?></td>
 				<td class="textcenter"><?php echo $row->nasport ?></td>
@@ -98,44 +215,41 @@ printHeader(array(
 				<td class="textcenter"><?php echo $row->acctsessionid ?></td>
 				<td class="textcenter"><?php echo $row->framedipaddress ?></td>
 				<td class="textcenter"><?php echo $row->acctauthentic ?></td>
-				<td class="textcenter"><?php echo $row->eventtimestamp ?></td>
 				<td class="textcenter"><?php echo $row->nasidentifier ?></td>
 				<td class="textcenter"><?php echo $row->nasipaddress ?></td>
 				<td class="textcenter"><?php echo $row->acctdelaytime ?></td>
 				<td class="textcenter"><?php echo $row->acctsessiontime ?></td>
-				<td class="textcenter"><?php echo $row->acctinputoctets ?></td>
-				<td class="textcenter"><?php echo $row->acctinputgigawords ?></td>
-				<td class="textcenter"><?php echo $row->acctinputpackets ?></td>
-				<td class="textcenter"><?php echo $row->acctoutputoctets ?></td>
-				<td class="textcenter"><?php echo $row->acctoutputgigawords ?></td>
-				<td class="textcenter"><?php echo $row->acctoutputpackets ?></td>
+				<td class="textcenter"><?php echo $inputDataDisplay ?> Mbytes</td>
+				<td class="textcenter"><?php echo $outputDataDisplay ?> Mbytes</td>
 				<td class="textcenter"><?php echo $row->acctstatustype ?></td>
 				<td class="textcenter"><?php echo $row->acctterminatecause ?></td>
 			</tr>
 <?php
-		}
-		$res->closeCursor();
-		if ($rownums <= 0) {
+			}
+			$res->closeCursor();
+
+			if ($rownums <= 0) {
 ?>
-			<p />
 			<tr>
 				<td colspan="23" class="textcenter">No logs found for user: <?php echo $getuser ?></td>
 			</tr>
 <?php
-		}
-		unset($rownums);
-	} else {
+			}
+				unset($rownums);
+
+
+} else {
 ?>
-		<tr class="resultitem">
-			<td colspan="5" class="textcenter">No User ID selected</td>
-		</tr>
+			<tr>
+				<td class="warning">No user ID selected</td>
+			</tr>
 <?php
-	}
+}
+
+
 ?>
-	</table>
-</form>
+		</table>
 <?php
-
 printFooter();
 
 
-- 
GitLab