mirror of
https://github.com/tuxis-ie/nsedit.git
synced 2025-04-19 20:09:14 +03:00
Merge pull request #108 from richard-underwood/issue-107
Ability to rotate and search logs
This commit is contained in:
commit
b16af25052
5 changed files with 215 additions and 55 deletions
|
@ -7,7 +7,12 @@ $apiproto = 'http'; # http | https
|
||||||
$apisslverify = FALSE; # Verify SSL Certificate if using https for apiproto
|
$apisslverify = FALSE; # Verify SSL Certificate if using https for apiproto
|
||||||
$allowzoneadd = FALSE; # Allow normal users to add zones
|
$allowzoneadd = FALSE; # Allow normal users to add zones
|
||||||
$logging = TRUE;
|
$logging = TRUE;
|
||||||
|
$allowclearlogs = TRUE; # Allow clearing of log entries
|
||||||
|
$allowrotatelogs = FALSE;# Allow rotation to text file on server
|
||||||
|
|
||||||
|
# Log directory - if allowrotatelogs is set, this is where the logs will
|
||||||
|
# be written. It must be writeable by the web server user.
|
||||||
|
$logsdirectory = "../etc";
|
||||||
|
|
||||||
# If you configure this, nsedit will try to authenticate via WeFact too.
|
# If you configure this, nsedit will try to authenticate via WeFact too.
|
||||||
# Debtors will be added to the sqlitedatabase with their crypted password.
|
# Debtors will be added to the sqlitedatabase with their crypted password.
|
||||||
|
|
|
@ -276,6 +276,58 @@ function clearlogs() {
|
||||||
writelog("Logtable truncated.");
|
writelog("Logtable truncated.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function rotatelogs() {
|
||||||
|
global $logging, $logsdirectory;
|
||||||
|
if ($logging !== TRUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if(!is_dir($logsdirectory) || !is_writable($logsdirectory)) {
|
||||||
|
writelog("Logs directory cannot be written to.");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
date_default_timezone_set('UTC');
|
||||||
|
$filename = date("Y-m-d-His") . ".json";
|
||||||
|
$file = fopen($logsdirectory . "/" . $filename, "x");
|
||||||
|
|
||||||
|
if($file === FALSE) {
|
||||||
|
writelog("Can't create file for log rotation.");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fwrite($file,json_encode(getlogs())) === FALSE) {
|
||||||
|
writelog("Can't write to file for log rotation.");
|
||||||
|
fclose($file);
|
||||||
|
return FALSE;
|
||||||
|
} else {
|
||||||
|
fclose($file);
|
||||||
|
clearlogs();
|
||||||
|
return $filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function listrotatedlogs() {
|
||||||
|
global $logging, $logsdirectory;
|
||||||
|
if ($logging !== TRUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
$list = scandir($logsdirectory,SCANDIR_SORT_DESCENDING);
|
||||||
|
|
||||||
|
if($list === FALSE) {
|
||||||
|
writelog("Logs directory cannot read.");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$list=array_filter($list,
|
||||||
|
function ($val) {
|
||||||
|
return(preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}-[0-9]{6}\.json/',$val) == 1);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
function writelog($line, $user=False) {
|
function writelog($line, $user=False) {
|
||||||
global $logging;
|
global $logging;
|
||||||
if ($logging !== TRUE)
|
if ($logging !== TRUE)
|
||||||
|
|
86
index.php
86
index.php
|
@ -114,7 +114,12 @@ if ($blocklogin === TRUE) {
|
||||||
<div id="dnssecinfo">
|
<div id="dnssecinfo">
|
||||||
</div>
|
</div>
|
||||||
<div id="clearlogs" style="display: none;">
|
<div id="clearlogs" style="display: none;">
|
||||||
Are you sure you want to clear all the logs? Maybe save them first?
|
Are you sure you want to clear the current logs? Maybe download them
|
||||||
|
first<?php if($allowrotatelogs) { ?>, or use "Rotate logs" to save
|
||||||
|
them on the server<?php } ?>?
|
||||||
|
</div>
|
||||||
|
<div id="rotatelogs" style="display: none;">
|
||||||
|
Are you sure you want to rotate the current logs?
|
||||||
</div>
|
</div>
|
||||||
<div id="searchlogs" style="display: none; text-align: right;">
|
<div id="searchlogs" style="display: none; text-align: right;">
|
||||||
<table border="0">
|
<table border="0">
|
||||||
|
@ -184,6 +189,21 @@ if ($blocklogin === TRUE) {
|
||||||
</div>
|
</div>
|
||||||
<div id="logs">
|
<div id="logs">
|
||||||
<div class="tables" id="Logs"></div>
|
<div class="tables" id="Logs"></div>
|
||||||
|
<?php if($allowrotatelogs) { ?>
|
||||||
|
<br>Log entries being viewed:
|
||||||
|
<select id="logfile">
|
||||||
|
<option value="">(Current logs)</option>
|
||||||
|
<?php
|
||||||
|
$logfiles=listrotatedlogs();
|
||||||
|
if($logfiles !== FALSE) {
|
||||||
|
foreach ($logfiles as $filename) {
|
||||||
|
echo '<option value="' . $filename . '">' . str_replace(".json","",$filename) . "</option>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?></select>
|
||||||
|
<?php } else { ?>
|
||||||
|
<input type="hidden" id="logfile" value="">
|
||||||
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
|
@ -920,18 +940,18 @@ $(document).ready(function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
<?php if (is_adminuser()) { ?>
|
<?php if (is_adminuser()) { ?>
|
||||||
$('#Logs').hide();
|
$('#logs').hide();
|
||||||
$('#Users').hide();
|
$('#Users').hide();
|
||||||
$('#AboutMe').hide();
|
$('#AboutMe').hide();
|
||||||
$('#aboutme').click(function () {
|
$('#aboutme').click(function () {
|
||||||
$('#Logs').hide();
|
$('#logs').hide();
|
||||||
$('#Users').hide();
|
$('#Users').hide();
|
||||||
$('#MasterZones').hide();
|
$('#MasterZones').hide();
|
||||||
$('#SlaveZones').hide();
|
$('#SlaveZones').hide();
|
||||||
$('#AboutMe').show();
|
$('#AboutMe').show();
|
||||||
});
|
});
|
||||||
$('#useradmin').click(function () {
|
$('#useradmin').click(function () {
|
||||||
$('#Logs').hide();
|
$('#logs').hide();
|
||||||
$('#MasterZones').hide();
|
$('#MasterZones').hide();
|
||||||
$('#SlaveZones').hide();
|
$('#SlaveZones').hide();
|
||||||
$('#AboutMe').hide();
|
$('#AboutMe').hide();
|
||||||
|
@ -939,7 +959,7 @@ $(document).ready(function () {
|
||||||
$('#Users').show();
|
$('#Users').show();
|
||||||
});
|
});
|
||||||
$('#zoneadmin').click(function () {
|
$('#zoneadmin').click(function () {
|
||||||
$('#Logs').hide();
|
$('#logs').hide();
|
||||||
$('#Users').hide();
|
$('#Users').hide();
|
||||||
$('#AboutMe').hide();
|
$('#AboutMe').hide();
|
||||||
$('#MasterZones').show();
|
$('#MasterZones').show();
|
||||||
|
@ -950,8 +970,10 @@ $(document).ready(function () {
|
||||||
$('#AboutMe').hide();
|
$('#AboutMe').hide();
|
||||||
$('#MasterZones').hide();
|
$('#MasterZones').hide();
|
||||||
$('#SlaveZones').hide();
|
$('#SlaveZones').hide();
|
||||||
$('#Logs').jtable('load');
|
$('#Logs').jtable('load', {
|
||||||
$('#Logs').show();
|
logfile: $('#logfile').val()
|
||||||
|
});
|
||||||
|
$('#logs').show();
|
||||||
});
|
});
|
||||||
$('#Users').jtable({
|
$('#Users').jtable({
|
||||||
title: 'Users',
|
title: 'Users',
|
||||||
|
@ -1004,8 +1026,7 @@ $(document).ready(function () {
|
||||||
pageSize: 20,
|
pageSize: 20,
|
||||||
sorting: false,
|
sorting: false,
|
||||||
actions: {
|
actions: {
|
||||||
listAction: 'logs.php?action=list',
|
listAction: 'logs.php?action=list'
|
||||||
deleteAction: 'logs.php?action=delete',
|
|
||||||
},
|
},
|
||||||
messages: {
|
messages: {
|
||||||
deleteConfirmation: 'This entry will be deleted. Are you sure?'
|
deleteConfirmation: 'This entry will be deleted. Are you sure?'
|
||||||
|
@ -1027,6 +1048,7 @@ $(document).ready(function () {
|
||||||
$( this ).dialog( 'close' );
|
$( this ).dialog( 'close' );
|
||||||
$('#Logs').find('.jtable-title-text').text('Logs (filtered)');
|
$('#Logs').find('.jtable-title-text').text('Logs (filtered)');
|
||||||
$('#Logs').jtable('load', {
|
$('#Logs').jtable('load', {
|
||||||
|
logfile: $('#logfile').val(),
|
||||||
user: $('#searchlogs-user').val(),
|
user: $('#searchlogs-user').val(),
|
||||||
entry: $('#searchlogs-entry').val()
|
entry: $('#searchlogs-entry').val()
|
||||||
});
|
});
|
||||||
|
@ -1036,13 +1058,40 @@ $(document).ready(function () {
|
||||||
$('#searchlogs-entry').val('');
|
$('#searchlogs-entry').val('');
|
||||||
$( this ).dialog( 'close' );
|
$( this ).dialog( 'close' );
|
||||||
$('#Logs').find('.jtable-title-text').text('Logs');
|
$('#Logs').find('.jtable-title-text').text('Logs');
|
||||||
$('#Logs').jtable('load');
|
$('#Logs').jtable('load', {
|
||||||
|
logfile: $('#logfile').val()
|
||||||
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
<?php if($allowrotatelogs === TRUE) { ?>
|
||||||
|
{
|
||||||
|
text: 'Rotate logs',
|
||||||
|
click: function() {
|
||||||
|
$("#rotatelogs").dialog({
|
||||||
|
modal: true,
|
||||||
|
title: "Rotate logs",
|
||||||
|
width: 'auto',
|
||||||
|
buttons: {
|
||||||
|
Ok: function() {
|
||||||
|
$.get("logs.php?action=rotate");
|
||||||
|
$( this ).dialog( "close" );
|
||||||
|
$('#logfile').val('');
|
||||||
|
$('#Logs').jtable('load');
|
||||||
|
},
|
||||||
|
Cancel: function() {
|
||||||
|
$( this ).dialog( "close" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
<?php } ?>
|
||||||
|
<?php if($allowclearlogs === TRUE) { ?>
|
||||||
{
|
{
|
||||||
icon: 'img/delete_inverted.png',
|
icon: 'img/delete_inverted.png',
|
||||||
text: 'Clear logs',
|
text: 'Clear logs',
|
||||||
|
@ -1055,6 +1104,7 @@ $(document).ready(function () {
|
||||||
Ok: function() {
|
Ok: function() {
|
||||||
$.get("logs.php?action=clear");
|
$.get("logs.php?action=clear");
|
||||||
$( this ).dialog( "close" );
|
$( this ).dialog( "close" );
|
||||||
|
$('#logfile').val('');
|
||||||
$('#Logs').jtable('load');
|
$('#Logs').jtable('load');
|
||||||
},
|
},
|
||||||
Cancel: function() {
|
Cancel: function() {
|
||||||
|
@ -1065,17 +1115,18 @@ $(document).ready(function () {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
<?php } ?>
|
||||||
{
|
{
|
||||||
icon: 'img/export.png',
|
icon: 'img/export.png',
|
||||||
text: 'Save logs',
|
text: 'Download logs',
|
||||||
click: function () {
|
click: function () {
|
||||||
var $zexport = $.get("logs.php?action=export", function(data) {
|
var $zexport = $.get("logs.php?action=export&logfile=" + $('#logfile').val(), function(data) {
|
||||||
console.log(data);
|
console.log(data);
|
||||||
blob = new Blob([data], { type: 'text/plain' });
|
blob = new Blob([data], { type: 'text/plain' });
|
||||||
var dl = document.createElement('a');
|
var dl = document.createElement('a');
|
||||||
dl.addEventListener('click', function(ev) {
|
dl.addEventListener('click', function(ev) {
|
||||||
dl.href = URL.createObjectURL(blob);
|
dl.href = URL.createObjectURL(blob);
|
||||||
dl.download = 'nseditlogs.txt';
|
dl.download = $('#logfile').val() == "" ? 'nseditlogs.txt':$('#logfile').val() + ".txt";
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
if (document.createEvent) {
|
if (document.createEvent) {
|
||||||
|
@ -1111,6 +1162,15 @@ $(document).ready(function () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#logfile').change(function () {
|
||||||
|
$('#Logs').jtable('load', {
|
||||||
|
logfile: $('#logfile').val(),
|
||||||
|
user: $('#searchlogs-user').val(),
|
||||||
|
entry: $('#searchlogs-entry').val()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
$('#MasterZones').jtable('load');
|
$('#MasterZones').jtable('load');
|
||||||
$('#SlaveZones').jtable('load');
|
$('#SlaveZones').jtable('load');
|
||||||
|
|
51
logs.php
51
logs.php
|
@ -20,14 +20,22 @@ if (!isset($_GET['action'])) {
|
||||||
jtable_respond(null, 'error', 'No action given');
|
jtable_respond(null, 'error', 'No action given');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($logging !== TRUE) {
|
||||||
|
jtable_respond(null, 'error', 'Logging is disabled');
|
||||||
|
} else {
|
||||||
switch ($_GET['action']) {
|
switch ($_GET['action']) {
|
||||||
|
|
||||||
case "list":
|
case "list":
|
||||||
global $logging;
|
if(!empty($_POST['logfile'])) {
|
||||||
if ($logging !== TRUE)
|
if(preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}-[0-9]{6}\.json/',$_POST['logfile']) == 1) {
|
||||||
jtable_respond(null, 'error', 'Logging is disabled');
|
$entries=json_decode(file_get_contents($logsdirectory . "/" . $_POST['logfile']),true);
|
||||||
|
} else {
|
||||||
|
jtable_respond(null, 'error', "Can't find log file");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
$entries=getlogs();
|
$entries=getlogs();
|
||||||
|
}
|
||||||
|
|
||||||
if(!empty($_POST['user'])) {
|
if(!empty($_POST['user'])) {
|
||||||
$entries=array_filter($entries,
|
$entries=array_filter($entries,
|
||||||
|
@ -48,22 +56,41 @@ case "list":
|
||||||
jtable_respond($entries);
|
jtable_respond($entries);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "delete":
|
case "export":
|
||||||
if ($emailaddress != '' and delete_user($emailaddress) !== FALSE) {
|
if(!empty($_GET['logfile'])) {
|
||||||
jtable_respond(null, 'delete');
|
if(preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}-[0-9]{6}\.json/',$_GET['logfile']) == 1) {
|
||||||
|
$entries=json_decode(file_get_contents($logsdirectory . "/" . $_GET['logfile']),true);
|
||||||
} else {
|
} else {
|
||||||
jtable_respond(null, 'error', 'Could not delete user');
|
jtable_respond(null, 'error', "Can't find log file");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$entries=getlogs();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(defined('JSON_PRETTY_PRINT')) {
|
||||||
|
print json_encode($entries,JSON_PRETTY_PRINT);
|
||||||
|
} else {
|
||||||
|
print json_encode($entries);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "export":
|
|
||||||
print json_encode(getlogs());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "clear":
|
case "clear":
|
||||||
|
if($allowclearlogs === TRUE) {
|
||||||
clearlogs();
|
clearlogs();
|
||||||
|
} else {
|
||||||
|
jtable_respond(null, 'error', 'Invalid action');
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "rotate":
|
||||||
|
if($allowrotatelogs === TRUE) {
|
||||||
|
rotatelogs();
|
||||||
|
} else {
|
||||||
|
jtable_respond(null, 'error', 'Invalid action');
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
jtable_respond(null, 'error', 'Invalid action');
|
jtable_respond(null, 'error', 'Invalid action');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
16
rotate-logs.php
Normal file
16
rotate-logs.php
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
include_once('includes/config.inc.php');
|
||||||
|
include_once('includes/session.inc.php');
|
||||||
|
include_once('includes/misc.inc.php');
|
||||||
|
|
||||||
|
if(php_sapi_name() !== 'cli') {
|
||||||
|
echo "This script is intended to be run from the command line";
|
||||||
|
} else {
|
||||||
|
if($allowrotatelogs === TRUE) {
|
||||||
|
$current_user['username']='<system>';
|
||||||
|
rotatelogs();
|
||||||
|
} else {
|
||||||
|
echo "Rotating logs has been disabled."
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue