diff --git a/classes/cronlog-renderer.class.php b/classes/cronlog-renderer.class.php index c13dfa56adecc6b71c61e5078979aa069b5eba94..759acda3781af077e6921cc801a42e39c26c96a0 100644 --- a/classes/cronlog-renderer.class.php +++ b/classes/cronlog-renderer.class.php @@ -60,7 +60,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('Startzeit', 'Label', 'Server', 'Dauer', 'TTL', 'Exitcode', 'Kommentar' /*, 'Aktionen'*/) as $sKey){ + foreach(array('Startzeit', 'Label', 'Server', 'Dauer', 'TTL', '$?', 'Expired', 'Status' /*, 'Aktionen'*/) as $sKey){ $sTblHead.='<th>'.$sKey.'</th>'; } } @@ -69,7 +69,7 @@ class cronlogrenderer extends cronlog{ $iLast=max(array($iLast, date("U", $aEntry['SCRIPTSTARTTIME']))); $aErrors=array(); - $iNextRun=$aEntry['SCRIPTSTARTTIME']+((int)$aEntry['SCRIPTTTL']*1.5*60); + $iNextRun=$aEntry['SCRIPTSTARTTIME']+((int)$aEntry['SCRIPTTTL']*60); if($iNextRun < date("U")){ $aErrors[]='outdated'; @@ -90,18 +90,28 @@ class cronlogrenderer extends cronlog{ $sClass='message-ok'; } - $sHtml.='<tr class="'.$sClass.'" onclick="showFile(\''.$aEntry['logfile'].'\');" title="Klick=['.$aEntry['logfile'].'] anzeigen ">' + $sHtml.='<tr onclick="showFile(\''.$aEntry['logfile'].'\');" title="Klick=['.$aEntry['logfile'].'] anzeigen ">' . '<td>'.date("Y-m-d H:i:s", $aEntry['SCRIPTSTARTTIME']).'</td>' // . '<td>'.$aEntry['SCRIPTNAME'].'</td>' . '<td>'.$aEntry['SCRIPTLABEL'].'</td>' . '<td>'.$aEntry['server'].'</td>' - . '<td>' + . '<td' + .($aEntry['SCRIPTEXECTIME']>$this->_iMinTime4Timeline ? ' class="message-warning"' : '' ) + . '>' .(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 class="'.($aEntry['SCRIPTRC']>0 ? 'message-error' : 'message-ok' ).'">' + .$aEntry['SCRIPTRC'] + .'</td>' + . '<td class="'.($iNextRun < date("U") + ? ($iNextRun < date("U") -600 ? 'message-error' : 'message-warning') + : '' ).'">' + . date("Y-m-d H:i", $iNextRun).'</td>' + . '<td class="'.(count($aErrors) ? 'message-error' : '' ).'">' + // .(count($aErrors) ? 'FEHLER:<br>*'.implode('<br>*', $aErrors) : 'OK').'</td>' + .(count($aErrors) ? 'FEHLER' : 'OK').'</td>' // . '<td><button onclick="showFile(\''.$aEntry['logfile'].'\');">Ansehen</button></td>' . '</tr>' ; @@ -121,7 +131,7 @@ class cronlogrenderer extends cronlog{ . ($iErrors ? ' (Fehler: <strong>' . $iErrors.'</strong>... OK: <strong>' . $iOK.'</strong>)' : '') . '<br>' . '</div>' - . '<table id="'.$sIdTable.'">' + . '<table id="'.$sIdTable.'" class="table-striped">' . '<thead><tr>'.$sTblHead.'</tr></thead>' . '<tbody>' .$sHtml @@ -177,7 +187,7 @@ class cronlogrenderer extends cronlog{ // job=dok-kvm-instances:host=kalium:start=1538358001:end=1538358001:exectime=0:ttl=60:rc=0 foreach($aData as $aEntry){ if(!$sTblHead){ - foreach(array('Startzeit', /*'Ende',*/ 'Label', 'Server', 'Dauer', 'TTL', 'Exitcode') as $sKey){ + foreach(array('Startzeit', /*'Ende',*/ 'Label', 'Server', 'Dauer', 'TTL', '$?') as $sKey){ $sTblHead.='<th>'.$sKey.'</th>'; } } @@ -191,17 +201,21 @@ class cronlogrenderer extends cronlog{ $iOK++; } - $sHtml.='<tr class="'.$sClass.'">' + $sHtml.='<tr>' . '<td>'.date("Y-m-d H:i:s", $aEntry['start']).'</td>' // . '<td>'.date("Y-m-d H:i:s", $aEntry['end']).'</td>' . '<td>'.$aEntry['job'].'</td>' . '<td>'.$aEntry['host'].'</td>' - . '<td>' + . '<td' + .($aEntry['exectime']>$this->_iMinTime4Timeline ? ' class="message-warning"' : '' ) + . '>' .$aEntry['exectime'].'s' .($aEntry['exectime']>100 ? ' ('.round($aEntry['exectime']/60).'min)' : '') . '</td>' . '<td>'.$aEntry['ttl'].'</td>' - . '<td>'.$aEntry['rc'].'</td>' + . '<td class="' + .($aEntry['rc']>0 ? 'message-error': 'message-ok') + . '">'.$aEntry['rc'].'</td>' . '</tr>' ; } @@ -212,7 +226,7 @@ class cronlogrenderer extends cronlog{ . '<h3>History</h3>' . '<p class="hint">' - . 'Von den gestarteten Cronjobs werden die Ausführungen und deren Exitcode für 6 Tage aufgehoben.' + . 'Von den gestarteten Cronjobs werden die Ausführungszeiten und deren Exitcode für 6 Tage aufgehoben.' . '</p>' . '<div>' . $this->_renderAccessAndAge($iLast) @@ -351,7 +365,7 @@ class cronlogrenderer extends cronlog{ // Create a Timeline var timeline = new vis.Timeline(container, items, options); - // fix: some timelines do not properly wirk ... but I make them visible + // fix: some timelines do not properly work ... but I make them visible $(\'#'.$sDivId.' .vis-timeline\').css(\'visibility\', \'visible\'); </script> ' : '(kein Graph)<br>') diff --git a/js/functions.js b/js/functions.js index fc1af75dee5d4b0ab34a72a4ea03fd45d7cb98c9..0c473c12e4894d736296f9660a696c4e399ee59a 100644 --- a/js/functions.js +++ b/js/functions.js @@ -2,6 +2,7 @@ var sSELECTEDSERVER = ''; var sACTIVESERVERTAB = 'cronlogs'; var bSETADDRESSBAR = false; +var sTABLEFILTER = ''; var iRefreshTime = 60; var iRefreshCounter = 0; @@ -72,8 +73,17 @@ function getPageItem(id, sMoreData, bNoAdressbarUpdate) { }); } +/** + * show a timer ad a + * @returns {undefined} + */ function refreshTimer() { - $('#counter').html('Refresh in '+(iRefreshTime-iRefreshCounter)+' sec'+'<div style="width:'+(100 - (iRefreshCounter/iRefreshTime*100))+'%;"> </div>'); + if(iRefreshCounter==0){ + $('#counter').html('Refresh in <span>'+(iRefreshTime)+'</span> sec'+'<div style="width:100%;"> </div>'); + } else { + $('#counter span').html(iRefreshTime-iRefreshCounter); + $('#counter div').css('width', (100 - (iRefreshCounter/iRefreshTime*100))+'%'); + } iRefreshCounter++; if(iRefreshCounter>iRefreshTime){ refreshPage(); @@ -87,6 +97,8 @@ function refreshTimer() { function refreshPage() { getPageItem('selectserver'); getPageItem(sACTIVESERVERTAB); + window.setTimeout("updateFilterFields();", 500); + iRefreshCounter=0; } @@ -103,7 +115,7 @@ function setAdressbar() { var url = '?' + 'server=' + sSELECTEDSERVER + '&tab=' + sACTIVESERVERTAB - + '&q=' // + $('#datatable1_filter label input').val()+$('#datatable2_filter label input').val() + + '&q=' + sTABLEFILTER// + $('#datatable1_filter label input').val()+$('#datatable2_filter label input').val() ; window.history.pushState('dummy', 'Title', url); // window.location.reload(); @@ -155,6 +167,7 @@ function setTab(oLink,sTabid) { function setTabId(sTabid){ clog("setTabId('"+sTabid+"')"); sACTIVESERVERTAB = sTabid; + sTABLEFILTER = ''; $('#tabcontent div').each(function () { $(this).removeClass('active'); // $(this).html('Moment...'); @@ -164,25 +177,39 @@ function setTabId(sTabid){ // setServer(sSELECTEDSERVER); } +/** + * open overlay and show a file + * @param {type} sLogfile + * @returns {undefined} + */ function showFile(sLogfile) { clog("showFile('"+sLogfile+"')"); $('#overlay').show(); sLOGFILE=sLogfile; getPageItem('showlog', 'logfile=' + sLOGFILE, true); } +/** + * close overlay + * @param {type} sLogfile + * @returns {undefined} + */ function closeOverlay() { $('#overlay').fadeOut(300); } -function updateFilterFields(q) { +/** + * update filter field for datatable with value of param q= + * @returns {undefined} + */ +function updateFilterFields() { if ($('#datatable1_filter label input')) { - $('#datatable1_filter label input').val(q); - $('#datatable1').dataTable().fnFilter(q); + $('#datatable1_filter label input').val(sTABLEFILTER); + $('#datatable1').dataTable().fnFilter(sTABLEFILTER); // $('#datatable1').dataTable().bind('filter', 'setAdressbar()'); } if ($('#datatable2_filter label input')) { - $('#datatable2_filter label input').val(q); - $('#datatable2').dataTable().fnFilter(q); + $('#datatable2_filter label input').val(sTABLEFILTER); + $('#datatable2').dataTable().fnFilter(sTABLEFILTER); // $('#datatable1').dataTable().bind('filter', 'setAdressbar()'); } } @@ -207,7 +234,8 @@ $(document).ready(function () { setTab(oLink); } if (q) { - window.setTimeout("updateFilterFields('" + q + "');", 500); + sTABLEFILTER=q; + window.setTimeout("updateFilterFields();", 500); } bSETADDRESSBAR = true; window.setInterval('refreshTimer()', 1000); diff --git a/main.css b/main.css index 889264faf992ced4c2c420b0354fbf4ac71e9edc..b9bd23e8b6a97decd0884e08a764e6d61b4a133d 100644 --- a/main.css +++ b/main.css @@ -57,17 +57,19 @@ td{padding:0.3em;} .log-value{color:#008;} pre div:hover{background:rgba(0,0,0,0.1);} -#counter{color:#cde;} -#counter div{background:#bcd; height: 2px; } +#counter{color:#cde;border-bottom: 1px solid #eee;} +#counter div{background:#bcd; height: 2px; transition: width 1s ;} /* ----- override datatable defaukts */ .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;padding: 1px;} +table.dataTable tbody tr.even{background: #f0f4f8;} +table.dataTable tbody tr.odd{} +table.dataTable{margin: 0; width: auto; border-spacing: 1px;} +table.dataTable tbody td{padding: 3px;} .message{border: 1px solid rgba(0,0,0,0.1); padding: 1em; float: right;} -table.dataTable tbody tr.message-ok, .message-ok{background:#cfc; color:#080 !important;} -table.dataTable tbody tr.message-error, .message-error{background:#fdd; color:#800 !important;} +table.dataTable tbody tr.message-ok, .message-ok{background:#cfc; color:#080 !important;} +table.dataTable tbody tr.message-error, .message-error{background:#fdd; color:#800 !important;} +table.dataTable tbody tr.message-warning, .message-warning{background:#fec; color:#876 !important;} table.dataTable tbody tr:hover{background:rgba(0,0,0,0.1);} @@ -76,3 +78,46 @@ table.dataTable tbody tr:hover{background:rgba(0,0,0,0.1);} .vis-item.timeline-result-error{background:#fcc; border-color: #800} .vis-item.timeline-result-ok{background:#cfc;border-color: #080} + /* see http://visjs.org/docs/timeline/#Templates */ + + alternating column backgrounds + .vis-time-axis .vis-odd { + background: #fff; + } + .vis-time-axis .vis-even { + background: #f0f4f8; + } + .vis-time-axis .vis-grid.vis-saturday, + .vis-time-axis .vis-grid.vis-sunday + { + border-bottom: 4px solid #abc; + } + + /* + .vis-h0, .vis-h1,.vis-h2,.vis-h3, .vis-h4, .vis-h5, .vis-h6,.vis-h7,.vis-h18,.vis-h19,.vis-h20,.vis-h21,.vis-h22,.vis-h23{ + background: #e0e4e8; + } + .vis-h8, .vis-h9,.vis-h10,.vis-h11, .vis-h12, .vis-h13, .vis-h14,.vis-h15,.vis-h16,.vis-h17{ + background: #f0f4f8; + } + alternating column backgrounds + .vis-time-axis .vis-odd { + background: #fff; + } + .vis-time-axis .vis-even { + background: #f0f4f8; + } + .vis-time-axis{ + background: #fea; + } + +gray background in weekends, white text color + .vis-time-axis .vis-grid.vis-saturday, + .vis-time-axis .vis-grid.vis-sunday { + background: #ed8 !important; + } + .vis-time-axis .vis-text.vis-saturday, + .vis-time-axis .vis-text.vis-sunday { + } + +*/