diff --git a/classes/cronlog-renderer.class.php b/classes/cronlog-renderer.class.php index dbaebe8edc457e3e5a46041e426191be3b6bf2ef..295216063d071f77605dcbcdd1db8eff205e4306 100644 --- a/classes/cronlog-renderer.class.php +++ b/classes/cronlog-renderer.class.php @@ -44,7 +44,7 @@ class cronlogrenderer extends cronlog{ // Array ( [SCRIPTNAME] => apt-get update [SCRIPTTTL] => 1440 [SCRIPTSTARTTIME] => 2016-06-21 06:00:02, 1466481602 [SCRIPTLABEL] => apt-get [SCRIPTENDTIME] => 2016-06-21 06:00:49, 1466481649 [SCRIPTEXECTIME] => 47 s [SCRIPTRC] => 0 ) foreach($aData as $sDtakey=>$aEntry){ if(!$sTblHead){ - foreach(array('SCRIPTSTARTTIME', 'SCRIPTLABEL', 'Server', 'SCRIPTEXECTIME', 'SCRIPTTTL', 'SCRIPTRC', 'Kommentar', 'Aktionen') as $sKey){ + foreach(array('SCRIPTSTARTTIME', 'SCRIPTLABEL', 'Server', 'SCRIPTEXECTIME', 'SCRIPTTTL', 'SCRIPTRC', 'Kommentar' /*, 'Aktionen'*/) as $sKey){ $sTblHead.='<th>'.$sKey.'</th>'; } $iLast=date("U", $aEntry['SCRIPTSTARTTIME']); @@ -53,7 +53,7 @@ class cronlogrenderer extends cronlog{ // $sClass='message-'.($aEntry['SCRIPTRC']?'error':'ok'); $aErrors=array(); - $iNextRun=$aEntry['SCRIPTSTARTTIME']+($aEntry['SCRIPTTTL']*60); + $iNextRun=$aEntry['SCRIPTSTARTTIME']+((int)$aEntry['SCRIPTTTL']*60); if($iNextRun < date("U")){ $aErrors[]='outdated'; @@ -80,13 +80,13 @@ class cronlogrenderer extends cronlog{ . '<td>'.$aEntry['SCRIPTLABEL'].'</td>' . '<td>'.$aEntry['server'].'</td>' . '<td>' - .$aEntry['SCRIPTEXECTIME'].'s' - .($aEntry['SCRIPTEXECTIME']>100 ? ' ('.round($aEntry['SCRIPTEXECTIME']/60).'min)' : '') + .(int)$aEntry['SCRIPTEXECTIME'].'s' + .((int)$aEntry['SCRIPTEXECTIME']>100 ? ' ('.round((int)$aEntry['SCRIPTEXECTIME']/60).'min)' : '') .'</td>' . '<td>'.$aEntry['SCRIPTTTL'].'</td>' . '<td>'.$aEntry['SCRIPTRC'].'</td>' . '<td>'.(count($aErrors) ? 'FEHLER:<br>*'.implode('<br>*', $aErrors) : 'OK').'</td>' - . '<td><button onclick="showFile(\''.$aEntry['logfile'].'\');">Ansehen</button></td>' + // . '<td><button onclick="showFile(\''.$aEntry['logfile'].'\');">Ansehen</button></td>' . '</tr>' ; } @@ -113,7 +113,7 @@ class cronlogrenderer extends cronlog{ // init datatable . '<script>' - . '$(document).ready( function () {$(\'#'.$sIdTable.'\').DataTable({"bPaginate":false, "aaSorting":[[0,"desc"]]});} );' + . '$(document).ready( function () { $(\'#'.$sIdTable.'\').DataTable({"retrieve": true, "bPaginate":false, "aaSorting":[[0,"desc"]]}); } );' . '</script>' . ' @@ -211,7 +211,7 @@ class cronlogrenderer extends cronlog{ // init datatable . '<script>' - . '$(document).ready( function () {$(\'#'.$sIdTable.'\').DataTable({"aaSorting":[[0,"desc"]]});} );' + . '$(document).ready( function () {$(\'#'.$sIdTable.'\').DataTable({"retrieve": true, "aaSorting":[[0,"desc"]]});} );' . '</script>' . ' @@ -357,7 +357,9 @@ class cronlogrenderer extends cronlog{ public function renderServerlist($sSelectedItem=false){ $sHtml=''; - $sHtml.='<option value="ALL">[ALLE]</option>'; + $sHtml.='<option value="ALL"' + .($sSelectedItem===false ? ' selected="selected"' : '') + . '>[ALLE]</option>'; foreach($this->getServers() as $sServer=>$aData){ $sHtml.='<option value="'.$sServer.'"' .($sSelectedItem===$sServer ? ' selected="selected"' : '') diff --git a/classes/cronlog.class.php b/classes/cronlog.class.php index e1fc560867278f12d47a380619bf732e034b17fd..1b67e8fb198a075767019efbfaa74f645b059941 100644 --- a/classes/cronlog.class.php +++ b/classes/cronlog.class.php @@ -1,11 +1,5 @@ <?php -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - /** * Description of cronlog * @@ -71,6 +65,7 @@ class cronlog { } protected function _getCacheData($sTaskId){ + // DISABLE CACHE return false; $sFile=$this->_getCacheFile($sTaskId); if(file_exists($sFile)){ if (filemtime($sFile)>(date('U')-$this->_iTtlCache)){ diff --git a/index.php b/index.php index cf6b89c611b02a7dbc0fe1d6baa2e3ceced89356..867dcfa7029364b7f82a7e16728863b5b9457b5a 100644 --- a/index.php +++ b/index.php @@ -1,14 +1,9 @@ -<?php - -// ----- supported query params -// server=[servername] ... default: ALL -// q=[filtervalue] ... default: nothing - -?><!doctype html> -<html><head> +<!doctype html> +<html> + <head> <title>Cronjob-Viewer</title> - <script type="text/javascript" src="js/functions.js"></script> <script type="text/javascript" src="vendor/jquery/3.2.1/jquery.min.js"></script> + <script type="text/javascript" src="js/functions.js"></script> <script type="text/javascript" src="vendor/vis/4.21.0/vis.min.js"></script> <link href="vendor/vis/4.21.0/vis-timeline-graph2d.min.css" rel="stylesheet" type="text/css"/> @@ -23,6 +18,7 @@ <div id="errorlog"> </div> + <span style="float: right">Coded by Axel :-)</span> <h1><span class="imllogo"></span> CronjobViewer</h1> <nav class="servers"> <div id="selectserver" class="active">...</div> @@ -35,8 +31,10 @@ <a href="#cronlogs" onclick="setTab(this); return false;" class="active"><i class="far fa-file-alt"></i> Logs</a> <a href="#crontable" onclick="setTab(this); return false;"><i class="fas fa-history"></i> History</a> <a href="#graph" onclick="setTab(this); return false;"><i class="far fa-chart-bar"></i> Timeline</a> + </nav><br><br><br> + <button onclick="refreshPage(); return false;"><i class="fas fa-sync"></i> Reload</button> <div id="tabcontent"> <div id="cronlogs" class="active"></div> <div id="crontable"></div> @@ -44,29 +42,4 @@ </div> </div> - <script> - - // draw navigation with servers - getPageItem('selectserver'); - - // check query params and set filter - // ?server=neon&tab=crontable&q=123 - - var oQuery=getQueryParams(); - var sServer=oQuery.server ? oQuery.server : 'ALL'; - var q=oQuery.q ? oQuery.q : ''; - var sTab=oQuery.tab ? oQuery.tab : ''; - - setServer(sServer); - - if(sTab){ - var oLink=$('a[href="#'+sTab+'"]').first(); - console.log(oLink); - setTab(oLink); - } - if (q) { - window.setTimeout("$('#datatable1_filter label input').val(q); $('#datatable1').dataTable().fnFilter(q)" , 500); - window.setTimeout("$('#datatable2_filter label input').val(q); $('#datatable2').dataTable().fnFilter(q)" , 500); - } - </script> </body></html> \ No newline at end of file diff --git a/js/functions.js b/js/functions.js index 83200e1823b73b4fe0f976b2a14a247dc5225114..97091033cb390e09b0600102d87523f5123e31b7 100644 --- a/js/functions.js +++ b/js/functions.js @@ -1,6 +1,7 @@ var sSELECTEDSERVER=''; var sACTIVESERVERTAB='cronlogs'; +var bSETADDRESSBAR=false; /** @@ -38,6 +39,7 @@ function getPageItem(id, sData) { if(!sData){ sData='item='+id+'&server='+sSELECTEDSERVER; } + setAdressbar(); jQuery.ajax({ url: phpscript, data: sData, @@ -56,9 +58,36 @@ function getPageItem(id, sData) { }); } +/** + * refresh content with ajax requests + * @returns {undefined} + */ +function refreshPage(){ + getPageItem('selectserver'); + getPageItem(sACTIVESERVERTAB); +} + +/** + * manipulate url in the browser address bar + * + * @returns {undefined} + */ +function setAdressbar() { + // console.log("--- setAdressbar()"); console.log(aViewFilters); + // ?server=neon&tab=graph&q=backup + if(!bSETADDRESSBAR){ + return false; + } + var url = '?' + + 'server=' + sSELECTEDSERVER + + '&tab=' + sACTIVESERVERTAB + + '&q=' // + $('#datatable1_filter label input').val()+$('#datatable2_filter label input').val() + ; + window.history.pushState('dummy', 'Title', url); +} /** * set server (show its navigation) - * tghis action is used after clicking a servername in the navigation + * this action is used after clicking a servername in the navigation * * @param {string} sServer * @returns {undefined} @@ -98,4 +127,50 @@ function showFile(sLogfile){ } function showFileBack(){ getPageItem(sACTIVESERVERTAB); -} \ No newline at end of file +} + +function updateFilterFields(q){ + if($('#datatable1_filter label input')){ + $('#datatable1_filter label input').val(q); + $('#datatable1').dataTable().fnFilter(q); + // $('#datatable1').dataTable().bind('filter', 'setAdressbar()'); + } + if($('#datatable2_filter label input')){ + $('#datatable2_filter label input').val(q); + $('#datatable2').dataTable().fnFilter(q); + // $('#datatable1').dataTable().bind('filter', 'setAdressbar()'); + } +} + + +// ---------------------------------------------------------------------- +// MAIN +// ---------------------------------------------------------------------- + +$(document).ready( function () { + + // draw navigation with servers + + // check query params and set filter + // ?server=neon&tab=crontable&q=123 + + var oQuery=getQueryParams(); + var sServer=oQuery.server ? oQuery.server : 'ALL'; + var q=oQuery.q ? oQuery.q : ''; + var sTab=oQuery.tab ? oQuery.tab : ''; + + setServer(sServer); + getPageItem('selectserver'); + + if(sTab){ + var oLink=$('a[href="#'+sTab+'"]').first(); + setTab(oLink); + } + console.log('suchfield ' + q); + if (q) { + // window.setTimeout("$('#datatable1_filter label input').val('"+q+"'); $('#datatable1').dataTable().fnFilter('"+q+"')" , 500); + window.setTimeout("updateFilterFields('"+q+"');" , 500); + } + bSETADDRESSBAR=true; + // window.setInterval('refreshPage()', 60000); +}); \ No newline at end of file diff --git a/main.css b/main.css index b0c9e58d679b11226de3aaf781c1bbdba8f43873..43ae9240b72ea63d0a3bf04b028a09c28335a16e 100644 --- a/main.css +++ b/main.css @@ -47,7 +47,7 @@ td{padding:0.3em;} .dataTables_wrapper{clear: none;float: left; margin: auto 1px;} table.dataTable tbody tr{background: none;} table.dataTable{margin: 0; width: auto;} - +table.dataTable tbody td{padding: 3px;} .message{border: 1px solid rgba(0,0,0,0.1); padding: 1em; float: right;} .message-ok{background:#cfc !important; color:#080 !important;}