From 13ada6d850f2d6be01481538751ebe2a6c6f3e19 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20=C3=85kre=20Solberg?= <andreas.solberg@uninett.no>
Date: Tue, 20 Jan 2009 08:50:24 +0000
Subject: [PATCH] Adding logpeek module that allows read access to log file

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@1174 44740490-163a-0410-bde0-09ae8108e29a
---
 .../config-templates/module_logpeek.php       | 13 ++++
 modules/logpeek/default-disable               |  0
 modules/logpeek/hooks/hook_frontpage.php      | 17 +++++
 modules/logpeek/templates/default/logpeek.php | 28 +++++++++
 modules/logpeek/www/index.php                 | 62 +++++++++++++++++++
 5 files changed, 120 insertions(+)
 create mode 100644 modules/logpeek/config-templates/module_logpeek.php
 create mode 100644 modules/logpeek/default-disable
 create mode 100644 modules/logpeek/hooks/hook_frontpage.php
 create mode 100644 modules/logpeek/templates/default/logpeek.php
 create mode 100644 modules/logpeek/www/index.php

diff --git a/modules/logpeek/config-templates/module_logpeek.php b/modules/logpeek/config-templates/module_logpeek.php
new file mode 100644
index 000000000..89255736d
--- /dev/null
+++ b/modules/logpeek/config-templates/module_logpeek.php
@@ -0,0 +1,13 @@
+<?php
+/* 
+ * Configuration for the module logpeek.
+ * 
+ * $Id $
+ */
+
+$config = array (
+	'logfile'	=> '/var/log/simplesamlphp.log',
+	'lines'		=> 1500,
+);
+
+?>
diff --git a/modules/logpeek/default-disable b/modules/logpeek/default-disable
new file mode 100644
index 000000000..e69de29bb
diff --git a/modules/logpeek/hooks/hook_frontpage.php b/modules/logpeek/hooks/hook_frontpage.php
new file mode 100644
index 000000000..96af12acf
--- /dev/null
+++ b/modules/logpeek/hooks/hook_frontpage.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Hook to add the logpeek module to the frontpage.
+ *
+ * @param array &$links  The links on the frontpage, split into sections.
+ */
+function logpeek_hook_frontpage(&$links) {
+	assert('is_array($links)');
+	assert('array_key_exists("links", $links)');
+
+	$links['links'][] = array(
+		'href' => SimpleSAML_Module::getModuleURL('logpeek/'),
+		'text' => array('en' => 'SimpleSAMLphp logs access (Log peek)', 'no' => 'Vis simpleSAMLphp log'),
+	);
+
+}
+?>
\ No newline at end of file
diff --git a/modules/logpeek/templates/default/logpeek.php b/modules/logpeek/templates/default/logpeek.php
new file mode 100644
index 000000000..c89f80a70
--- /dev/null
+++ b/modules/logpeek/templates/default/logpeek.php
@@ -0,0 +1,28 @@
+<?php
+$this->data['header'] = 'Log peek';
+$this->includeAtTemplateBase('includes/header.php');
+
+
+?>
+<div id="content">
+
+<h2>SimpleSAMLphp logs (admin utility)</h2>
+
+<form method="get" action="?">
+	<input type="text" name="tag" value="<?php echo $this->data['trackid']; ?>" />
+	<input type="submit" value="Show logs" />
+</form>
+
+
+<pre style="background: #eee; border: 1px solid #666; padding: 1em; margin: .4em; overflow: scroll">
+<?php
+
+if (!empty($this->data['results'])) {
+	foreach($this->data['results'] AS $line) {
+		echo $line;
+	}
+}
+
+?>
+</pre>
+<?php $this->includeAtTemplateBase('includes/footer.php'); ?>
\ No newline at end of file
diff --git a/modules/logpeek/www/index.php b/modules/logpeek/www/index.php
new file mode 100644
index 000000000..d1bd15adb
--- /dev/null
+++ b/modules/logpeek/www/index.php
@@ -0,0 +1,62 @@
+<?php
+
+
+$config = SimpleSAML_Configuration::getInstance();
+$session = SimpleSAML_Session::getInstance();
+
+if (!$session->isValid('login-admin') ) {
+	SimpleSAML_Utilities::redirect('/' . $config->getBaseURL() . 'auth/login-admin.php',
+		array('RelayState' => SimpleSAML_Utilities::selfURL())
+	);
+}
+
+
+$logpeekconfig = $config->copyFromBase('logpeek', 'module_logpeek.php');
+
+$logfile = $logpeekconfig->getValue('logfile', '/var/simplesamlphp.log');
+
+function grepLog($logfile, $tag, $lines) {
+
+	if (!is_readable($logfile)) throw new Exception('Log file [' . $logfile . '] is not readable. Consider checking the file permissions');
+	if (!preg_match('/^[a-f0-9]{10}$/', $tag)) throw new Exception('Invalid search tag');
+	
+	$results = array();
+	$i=0 ;
+	$line = '';
+	$fp = fopen($logfile,"r") ;
+	if(is_resource($fp)){
+		fseek($fp,0,SEEK_END) ;
+		$a = ftell($fp) ;
+		while($i <= $lines){
+			if(fgetc($fp) == "\n"){
+				$line = fgets($fp);
+				$i++ ;
+				if (strstr($line, '[' . $tag . ']')) 
+					$results[] = $line;
+			}
+			fseek($fp,$a);
+			$a-- ;
+		}
+	}
+
+	$results[] = 'Start search line (' . $lines . ' lines back): ' . substr($line,0,40) . '...';
+	$results = array_reverse($results);
+	return $results;
+}
+
+$results = NULL;
+if (isset($_REQUEST['tag'])) {
+	$results = grepLog($logfile, $_REQUEST['tag'], $logpeekconfig->getValue('lines', 500));
+// 	echo('<pre>log:');
+// 	print_r($results);
+}
+
+
+
+$t = new SimpleSAML_XHTML_Template($config, 'logpeek:logpeek.php');
+$t->data['results'] = $results;
+$t->data['trackid'] = $session->getTrackID();
+$t->show();
+exit;
+
+?>
-- 
GitLab