Commit 7beebddd authored by Alain Takoudjou's avatar Alain Takoudjou

Update log management, add custom log file...

parent c3b7acf3
...@@ -94,7 +94,7 @@ body { ...@@ -94,7 +94,7 @@ body {
font-size: 1.08em; font-size: 1.08em;
color: #2D73B1; color: #2D73B1;
} }
#running p.instance{ #running p.software{
border-left: 4px solid #1E73BD; border-left: 4px solid #1E73BD;
} }
#running img{ #running img{
...@@ -472,12 +472,11 @@ padding: 10px;height: 80px;padding-bottom:15px;} ...@@ -472,12 +472,11 @@ padding: 10px;height: 80px;padding-bottom:15px;}
} }
.log_info_box h2{ .log_info_box h2{
font-weight: bold; font-weight: bold;
padding: 5px; padding: 2px;
padding-left: 20px; padding-left: 20px;
text-align: left; text-align: left;
color: #fff; color: #fff;
display: block; display: block;
height: 20px;
font-size: 16px; font-size: 16px;
margin-top: 20px; margin-top: 20px;
} }
...@@ -485,20 +484,26 @@ padding: 10px;height: 80px;padding-bottom:15px;} ...@@ -485,20 +484,26 @@ padding: 10px;height: 80px;padding-bottom:15px;}
margin-top: 0; margin-top: 0;
} }
.log_info_box h2.software{ .log_info_box h2.software, h2.boxtitle{
background: #1E73BD; background: #1E73BD;
} }
.log_info_box h2.instance{ .log_info_box h2.instance{
background: #C753C4; background: #C753C4;
} }
.log_info_box ul li{padding: 5px; font-size: 14px;color: #777B7C; font-weight: bold; margin: 3px 0; cursor: pointer;border: 1px solid #fff}
.log_info_box ul li:hover{background: #EBEBEB}
.log_info_box ul li.checked{border: 1px solid #DADADA}
.add_btn{background: url(../images/plus.png) center left no-repeat; display: block; margin: 2px; opacity: 0.6; min-width:22px; height: 22px;
text-indent: 30px; font-weight: bold; padding-top: 7px;}
.add_btn:hover{opacity: 1;}
#sr_run_state, #instance_run_state{ #software_run_state, #instance_run_state{
color: #000; color: #000;
font-weight: bold; font-weight: bold;
margin-bottom: 10px; margin-bottom: 10px;
} }
#sr_run_state p, #instance_run_state p{ #software_run_state p, #instance_run_state p{
padding-top: 3px; padding-top: 2px;
font-size: 16px; font-size: 16px;
} }
......
...@@ -10,10 +10,10 @@ ...@@ -10,10 +10,10 @@
var url = $SCRIPT_ROOT + "/slapgridResult"; var url = $SCRIPT_ROOT + "/slapgridResult";
var currentState = false; var currentState = false;
var running = true; var running = true;
var $current;
var processType = ""; var processType = "";
var currentProcess; var currentProcess;
var sendStop = false; var sendStop = false;
var forcedStop = false;
var processState = "Checking"; //define slapgrid running state var processState = "Checking"; //define slapgrid running state
var openedlogpage = ""; //content software or instance if the current page is software or instance log, otherwise nothing var openedlogpage = ""; //content software or instance if the current page is software or instance log, otherwise nothing
var logReadingPosition = 0; var logReadingPosition = 0;
...@@ -56,7 +56,7 @@ function getRunningState() { ...@@ -56,7 +56,7 @@ function getRunningState() {
log_info = "", log_info = "",
param = { param = {
position: logReadingPosition, position: logReadingPosition,
log: (processState !== "Checking" && openedlogpage === processType.toLowerCase()) ? openedlogpage : "" log: (processState !== "Checking" && openedlogpage !== "") ? processType.toLowerCase() : ""
}, },
jqxhr = $.post(url, param, function (data) { jqxhr = $.post(url, param, function (data) {
setRunningState(data); setRunningState(data);
...@@ -75,6 +75,8 @@ function getRunningState() { ...@@ -75,6 +75,8 @@ function getRunningState() {
if (running && processState === "Checking" && openedlogpage !== "") { if (running && processState === "Checking" && openedlogpage !== "") {
$("#salpgridLog").show(); $("#salpgridLog").show();
$("#manualLog").hide(); $("#manualLog").hide();
$("#slapstate").show();
$("#openloglist").hide();
} }
processState = running ? "Running" : "Stopped"; processState = running ? "Running" : "Stopped";
currentLogSize += parseInt(size, 10); currentLogSize += parseInt(size, 10);
...@@ -107,7 +109,7 @@ function stopProcess() { ...@@ -107,7 +109,7 @@ function stopProcess() {
var urlfor = $SCRIPT_ROOT + "stopSlapgrid", var urlfor = $SCRIPT_ROOT + "stopSlapgrid",
type = "slapgrid-sr"; type = "slapgrid-sr";
if ($("#instrun").text() === "Stop instance") { if (processType === "Instance") {
type = "slapgrid-cp"; type = "slapgrid-cp";
} }
$.post(urlfor, {type: type}, function (data) { $.post(urlfor, {type: type}, function (data) {
...@@ -121,6 +123,7 @@ function stopProcess() { ...@@ -121,6 +123,7 @@ function stopProcess() {
.complete(function () { .complete(function () {
sendStop = false; sendStop = false;
processState = "Stopped"; processState = "Stopped";
forcedStop = true;
}); });
} }
} }
...@@ -128,29 +131,50 @@ function stopProcess() { ...@@ -128,29 +131,50 @@ function stopProcess() {
function bindRun() { function bindRun() {
"use strict"; "use strict";
$("#softrun").click(function () { $("#softrun").click(function () {
if ($("#softrun").text() === "Stop software") { if ($(this).hasClass('slapos_stop')) {
stopProcess(); stopProcess();
} else { } else {
if (!isRunning()) { if (!isRunning()) {
setCookie("slapgridCMD", "Software"); setCookie("slapgridCMD", "Software");
window.location.href = $SCRIPT_ROOT + "/viewSoftwareLog"; window.location.href = $SCRIPT_ROOT + "/viewLog";
} }
} }
return false; return false;
}); });
$("#instrun").click(function () { $("#instrun").click(function () {
if ($("#instrun").text() === "Stop instance") { if ($("#softrun").hasClass('slapos_stop')) {
stopProcess(); stopProcess();
} else { } else {
if (!isRunning()) { if (!isRunning()) {
setCookie("slapgridCMD", "Instance"); setCookie("slapgridCMD", "Instance");
window.location.href = $SCRIPT_ROOT + "/viewInstanceLog"; window.location.href = $SCRIPT_ROOT + "/viewLog";
} }
} }
return false; return false;
}); });
} }
function updateStatus(elt, val) {
"use strict";
var src = '#' + elt + '_run_state', value = 'state_' + val;
$(src).removeClass();
$(src).addClass(value);
switch (val) {
case "waiting":
$(src).children('p').text("Waiting for starting");
break;
case "stopped":
$(src).children('p').text("Stopped by user");
break;
case "terminated":
$(src).children('p').text("Complete");
break;
case "running":
$(src).children('p').text("Processing");
break;
}
}
function setRunningState(data) { function setRunningState(data) {
"use strict"; "use strict";
if (data.result) { if (data.result) {
...@@ -159,31 +183,45 @@ function setRunningState(data) { ...@@ -159,31 +183,45 @@ function setRunningState(data) {
running = true; running = true;
//change run menu title and style //change run menu title and style
if (data.software) { if (data.software) {
$("#softrun").empty(); if ( $("#running").children('span').length === 0 ) {
$("#softrun").append("Stop software"); $("#softrun").removeClass('slapos_run');
$("#softrun").css("color", "#0271BF"); $("#softrun").addClass('slapos_stop');
$current = $("#softrun"); $("#running img").before('<p id="running_info" class="software">Building software...</p>');
}
processType = "Software"; processType = "Software";
} }
if (data.instance) { if (data.instance) {
$("#instrun").empty(); ///Draft!!
$("#instrun").append("Stop instance"); if ( $("#running").children('span').length === 0 ) {
$("#instrun").css("color", "#0271BF"); $("#softrun").removeClass('slapos_run');
$current = $("#instrun"); $("#softrun").addClass('slapos_stop');
$("#running img").before('<p id="running_info" class="instance">Running instance...</p>');
}
processType = "Instance"; processType = "Instance";
} }
} }
} else { } else {
if ( $("#running").is(":visible") ) {
$("#error").Popup("Slapgrid finished running your " + processType + " Profile", {type: 'info', duration: 3000});
if ( forcedStop ) {
updateStatus('instance', 'stopped');
updateStatus('software', 'stopped');
}
else {
updateStatus(processType.toLowerCase(), 'terminated');
}
//Update window!!!
$("#slapswitch").attr('rel', 'opend');
$("#slapswitch").text('Access application');
}
$("#running").hide(); $("#running").hide();
running = false; //nothing is currently running running = false; //nothing is currently running
if ($current !== undefined) { $("#softrun").removeClass('slapos_stop');
$current.empty(); $("#softrun").addClass('slapos_run');
$current.append("Run " + processType.toLowerCase()); if ( $("#running").children('span').length > 0 ) {
$current.css("color", "#275777"); $("#running").children('p').remove();
$current = undefined;
currentState = false;
$("#error").Popup("Slapgrid finished running your " + processType + " Profile", {type: 'info', duration: 3000});
} }
currentState = false;
} }
currentState = data.result; currentState = data.result;
} }
...@@ -197,6 +235,9 @@ function runProcess(urlfor, data) { ...@@ -197,6 +235,9 @@ function runProcess(urlfor, data) {
.error(function () { .error(function () {
$("#error").Popup("Failled to run Slapgrid", {type: 'error', duration: 3000}); $("#error").Popup("Failled to run Slapgrid", {type: 'error', duration: 3000});
}); });
if ( $("#running_info").children('span').length > 0 ) {
$("#running_info").children('p').remove();
}
setRunningState(data); setRunningState(data);
setTimeout(getRunningState, 6000); setTimeout(getRunningState, 6000);
} }
...@@ -208,14 +249,19 @@ function checkSavedCmd() { ...@@ -208,14 +249,19 @@ function checkSavedCmd() {
if (!result) { if (!result) {
return false; return false;
} }
forcedStop = false;
if (result === "Software") { if (result === "Software") {
running = false; running = false;
runProcess(($SCRIPT_ROOT + "/runSoftwareProfile"), runProcess(($SCRIPT_ROOT + "/runSoftwareProfile"),
{result: true, instance: false, software: true}); {result: true, instance: false, software: true});
updateStatus('software', 'running');
updateStatus('instance', 'waiting');
} else if (result === "Instance") { } else if (result === "Instance") {
running = false; running = false;
runProcess(($SCRIPT_ROOT + "/runInstanceProfile"), runProcess(($SCRIPT_ROOT + "/runInstanceProfile"),
{result: true, instance: true, software: false}); {result: true, instance: true, software: false});
updateStatus('software', 'terminated');
updateStatus('instance', 'running');
} }
deleteCookie("slapgridCMD"); deleteCookie("slapgridCMD");
return (result !== null); return (result !== null);
......
...@@ -551,7 +551,7 @@ $(document).ready(function () { ...@@ -551,7 +551,7 @@ $(document).ready(function () {
function addToFavourite(filepath){ function addToFavourite(filepath){
var i = favourite_list.length, var i = favourite_list.length,
filename = filepath.replace(/^.*(\\|\/|\:)/, '');; filename = filepath.replace(/^.*(\\|\/|\:)/, '');
if (i === 0){ if (i === 0){
$("#tooltip-filelist ul").empty(); $("#tooltip-filelist ul").empty();
} }
......
...@@ -6,6 +6,28 @@ ...@@ -6,6 +6,28 @@
$(document).ready(function () { $(document).ready(function () {
"use strict"; "use strict";
// Current_log is not used for auto displaying mode, only for manual reload of log file!!!
var current_log = 'instance.log',
sending,
state,
selectedFile = "",
logfilelist = "instance_root/.log_list";
var getCurrentLogFile = function () {
if ( $("#manual").is(":checked") ) {
return "";
}
if (current_log === "software.log") {
return "software";
}
else if (current_log === "instance.log") {
return "instance";
}
else {
return "";
}
};
function setupBox() { function setupBox() {
var state = $("#logconfigbox").css("display"); var state = $("#logconfigbox").css("display");
if (state === "none") { if (state === "none") {
...@@ -23,59 +45,281 @@ $(document).ready(function () { ...@@ -23,59 +45,281 @@ $(document).ready(function () {
if (processState === "Stopped" || processState === "Checking" || $("#manual").is(":checked")) { if (processState === "Stopped" || processState === "Checking" || $("#manual").is(":checked")) {
$("#salpgridLog").hide(); $("#salpgridLog").hide();
$("#manualLog").show(); $("#manualLog").show();
$("#manualLog") $("#slapstate").hide();
.scrollTop($("#manualLog")[0].scrollHeight - $("#manualLog").height()); $("#openloglist").show();
loadLog(current_log);
$("#salpgridLog").empty();
} else { } else {
$("#salpgridLog").show(); $("#salpgridLog").show();
$("#manualLog").hide(); $("#manualLog").hide();
$("#slapstate").show();
$("#openloglist").hide();
} }
} }
openedlogpage = $("input#type").val(); function loadLog(filepath, $elt) {
if (sending){
return;
}
sending = true;
var info = $("#logheader").html();
$("#logheader").html("LOADING FILE... <img src='"+$SCRIPT_ROOT+"/static/images/loading.gif' />");
var jqxhr = $.ajax({
type: "POST",
url: $SCRIPT_ROOT + '/getFileLog',
data: {filename: filepath, truncate: 1500}
})
.done(function(data) {
if (data.code === 0) {
$("#error").Popup(data.result, {type: 'alert', duration: 5000});
} else {
$("#manualLog").empty();
$("#manualLog").html(data.result);
$("#logheader").empty();
info = "Log from file " + filepath;
$("#manualLog")
.scrollTop($("#manualLog")[0].scrollHeight - $("#manualLog").height());
current_log = filepath;
if ($elt) {
$("#openloglist ul li").each(function () {
if ($(this).hasClass("checked")){
$(this).removeClass("checked");
return;
}
});
$elt.addClass('checked');
}
}
})
.fail(function(jqXHR, exception) {
if (jqXHR.status == 404) {
$("#error").Popup("Requested page not found. [404]", {type: 'error'});
} else if (jqXHR.status == 500) {
$("#error").Popup("Internal Error. Cannot respond to your request, please check your parameters", {type: 'error'});
} else {
$("#error").Popup("An Error occured: \n" + jqXHR.responseText, {type: 'error'});
}
})
.always(function() {
sending = false;
$("#logheader").html(info);
});
}
function init() {
openedlogpage = getCurrentLogFile();
state = getCookie("autoUpdate");
if (state) {
$("#" + state).attr('checked', true);
//updatelogBox();
if (state === "manual") {
openedlogpage = "";
setSpeed(0);
} else {
setSpeed((state === "live") ? 100 : 2500);
}
} else {
$("#slow").attr('checked', true);
}
$("#inlineViewer").colorbox({inline:true, width: "600px",
title: "Please select your log file",
onComplete:function () {
selectedFile = "";
}
});
//Load Custom file list if exist!
$.ajax({
type: "POST",
url: $SCRIPT_ROOT + '/getFileContent',
data: {file: logfilelist}
})
.done(function(data) {
if (data.code === 0) {
// nothing
} else {
var list = data.result.split('#'), i, filename;
for (i = 0; i < list.length; i += 1) {
if ( list[i] === "" ) {
continue;
}
filename = list[i].replace(/^.*(\\|\/|\:)/, '');
$("#openloglist ul").append("<li rel='" + list[i] + "'>" +
"<span class='bt_close' title='Remove this element!'" +
"style='display:none'>×</span>" + filename + "</li>");
}
}
})
.fail(function(jqXHR, exception) {
// nothing
})
.always(function() {
$("#openloglist ul li").click(function () {
var logfile = $(this).attr('rel');
if (current_log === logfile){
return false;
}
loadLog(logfile, $(this));
return false;
});
});
}
function initTree(tree, path, key) {
if (!key){
key = '0';
}
$(tree).fancytree({
activate: function(event, data) {
var node = data.node;
},
click: function(event, data) {
if (!data.node.isFolder()){
selectedFile = data.node.data.path;
}
},
source: {
url: $SCRIPT_ROOT + "/fileBrowser",
data:{opt: 20, dir: path, key: key, listfiles: 'yes'},
cache: false
},
lazyload: function(event, data) {
var node = data.node;
data.result = {
url: $SCRIPT_ROOT + "/fileBrowser",
data: {opt: 20, dir: node.data.path , key: node.key, listfiles: 'yes'}
}
},
});
}
init();
updatelogBox(); updatelogBox();
var state = getCookie("autoUpdate"); initTree('#fileTree', "instance_root");
$("#logheader").click(function () { $("#logheader").click(function () {
setupBox(); setupBox();
}); });
$("#manual").change(function () { $("#manual").change(function () {
if ( $(this).is(':checked') ) {
setCookie("autoUpdate", "manual"); setCookie("autoUpdate", "manual");
updatelogBox();
openedlogpage = "";
}
/*
if ($("input#type").val() === "instance") { if ($("input#type").val() === "instance") {
window.location.href = $SCRIPT_ROOT + "/viewInstanceLog"; window.location.href = $SCRIPT_ROOT + "/viewInstanceLog";
} else { } else {
window.location.href = $SCRIPT_ROOT + "/viewSoftwareLog"; window.location.href = $SCRIPT_ROOT + "/viewSoftwareLog";
} }*/
}); });
$("#live").change(function () { $("#live").change(function () {
if ( $(this).is(':checked') ) {
updatelogBox(); updatelogBox();
$("#logconfigbox").find("input:radio").attr('checked', false);
$("#live").attr('checked', true);
setSpeed(100); setSpeed(100);
setCookie("autoUpdate", "live"); setCookie("autoUpdate", "live");
openedlogpage = $("input#type").val(); }
}); });
$("#slow").change(function () { $("#slow").change(function () {
if ( $(this).is(':checked') ) {
updatelogBox(); updatelogBox();
$("#logconfigbox").find("input:radio").attr('checked', false);
$("#slow").attr('checked', true);
setSpeed(2500); setSpeed(2500);
setCookie("autoUpdate", "slow"); setCookie("autoUpdate", "slow");
openedlogpage = $("input#type").val(); }
});
$("#refreshlog").click(function () {
loadLog(current_log);
return false;
});
$("#addfile").click(function () {
var filename;
$.colorbox.close();
if (selectedFile !== "") {
$.ajax({
type: "POST",
url: $SCRIPT_ROOT + '/checkFileType',
data: {path: selectedFile}
})
.done(function(data) {
if (data.code === 0) {
$("#error").Popup(data.result, {type: 'alert', duration: 5000});
} else {
filename = selectedFile.replace(/^.*(\\|\/|\:)/, '');
$("#openloglist ul").append("<li rel='" + selectedFile + "'>" +
"<span class='bt_close' title='Remove this element!'" +
">×</span>" + filename + "</li>");
}
})
.fail(function(jqXHR, exception) {
$("#error").Popup("An Error occured: \n" + jqXHR.responseText, {type: 'error'});
});
}
else{
$("#error").Popup("No log file selected!", {type: 'alert', duration: 3000});
}
});
$("#logEdit").click(function () {
if ( $(this).text() === "Save list") {
$(this).text("Edit list");
$("#addbox").hide();
$("#openloglist ul li").click(function () {
var logfile = $(this).attr('rel');
if (current_log === logfile){
return false;
}
loadLog(logfile, $(this));
return false;
});
var savelist = "";
$("#openloglist ul li").each(function () {
$(this).children( "span" ).hide();
$(this).children( "span" ).unbind('click');
if ( $(this).children('span').length > 0 ) {
savelist += $(this).attr('rel') + "#"
}
});
//Send result to be saved!!
$.ajax({
type: "POST",
url: $SCRIPT_ROOT + '/saveFileContent',
data: {file: logfilelist, content: savelist}
})
.done(function(data) {
if (data.code === 0) {
$("#error").Popup(data.result, {type: 'error', duration: 5000});
} else {
$("#error").Popup("Done! Your log file list has been saved.", {type: 'confirm', duration: 5000});
}
})
.fail(function(jqXHR, exception) {
$("#error").Popup("An Error occured: \n" + jqXHR.responseText, {type: 'error'});
});
}
else {
$(this).text("Save list");
$("#openloglist ul li").unbind('click');
$("#addbox").show();
$("#openloglist ul li").each(function () {
$(this).children( "span" ).show();
$(this).children( "span" ).click(function () {
$(this).parent().remove();
});
});
}
});
$("#slapswitch").click( function () {
if ( $(this).attr('rel') === 'opend' ) {
window.location.href = $SCRIPT_ROOT + "/inspectInstance";
}
else {
$("#softrun").click();
}
}); });
if (state) {
$("#" + state).attr('checked', true);
updatelogBox();
if (state === "manual") {
openedlogpage = "";
setSpeed(0);
} else {
setSpeed((state === "live") ? 100 : 2500);
}
} else {
$("#slow").attr('checked', true);
}
}); });
...@@ -70,9 +70,7 @@ ...@@ -70,9 +70,7 @@
<div class="line"></div> <div class="line"></div>
<h2 class="info">{% block title %}{% endblock %} - {{session.title}}</h2> <h2 class="info">{% block title %}{% endblock %} - {{session.title}}</h2>
<div class="run"> <div class="run">
<div id="running"> <div id="running" style="display:none">
<p id="running_info" class='software'>Building software...</p>
<!--<p id="running_info" class='instance'>Running instance...</p>-->
<img alt="" src="{{ url_for('static', filename='images/ajax_roller.gif') }}" height='26' title="slapgrid is currently running"/> <img alt="" src="{{ url_for('static', filename='images/ajax_roller.gif') }}" height='26' title="slapgrid is currently running"/>
<div class="clear"></div> <div class="clear"></div>
</div> </div>
...@@ -82,8 +80,8 @@ ...@@ -82,8 +80,8 @@
<ul class="sf-menu"> <ul class="sf-menu">
<li><a href="{{ url_for('editCurrentProject') }}">Editor</a></li> <li><a href="{{ url_for('editCurrentProject') }}">Editor</a></li>
<li><a href="{{ url_for('inspectInstance') }}">Services</a></li> <li><a href="{{ url_for('inspectInstance') }}">Services</a></li>
<li><a href="{{ url_for('viewInstanceLog') }}">Logs</a></li> <li><a href="{{ url_for('viewLog') }}">Logs</a></li>
<li><a href="{{ url_for('viewSoftwareLog') }}">Terminal</a></li> <li><a href="{{ url_for('viewLog') }}">Terminal</a></li>
<li><a href="{{ url_for('manageRepository')}}#tab2">Git</a></li> <li><a href="{{ url_for('manageRepository')}}#tab2">Git</a></li>
<li class='right_menu main_menu'><a href="#"></a> <li class='right_menu main_menu'><a href="#"></a>
<ul> <ul>
...@@ -93,7 +91,7 @@ ...@@ -93,7 +91,7 @@
<li><a href="{{ url_for('openProject', method='new')}}">Create Software Release</a></li> <li><a href="{{ url_for('openProject', method='new')}}">Create Software Release</a></li>
<li class='sep'></li> <li class='sep'></li>
<li><a href="{{ url_for('removeInstance') }}" id="removeIst">Destroy All Services</a></li> <li><a href="{{ url_for('removeInstance') }}" id="removeIst">Destroy All Services</a></li>
<li><a href="{{ url_for('runInstanceProfile') }}">Redeploy Services</a></li> <li><a href="{{ url_for('runInstanceProfile') }}" id="instrun">Redeploy Services</a></li>
<li class='sep'></li> <li class='sep'></li>
<li><a href="{{ url_for('browseWorkspace') }}">Browse Workspace</a></li> <li><a href="{{ url_for('browseWorkspace') }}">Browse Workspace</a></li>
<li><a href="{{ url_for('inspectSoftware') }}">My Softwares Releases</a></li> <li><a href="{{ url_for('inspectSoftware') }}">My Softwares Releases</a></li>
...@@ -101,7 +99,7 @@ ...@@ -101,7 +99,7 @@
<li><a href="{{ url_for('dologout') }}">Log out</a></li> <li><a href="{{ url_for('dologout') }}">Log out</a></li>
</ul> </ul>
</li> </li>
<li class='right_menu slapos_run'><a href="{{ url_for('runSoftwareProfile') }}" id="instrun"></a> <li class='right_menu slapos_run' id="softrun"><a href="{{ url_for('runSoftwareProfile') }}"></a>
<!--<li class='right_menu slapos_top'><a href="{{ url_for('runInstanceProfile') }}" id="instrun"></a>--> <!--<li class='right_menu slapos_top'><a href="{{ url_for('runInstanceProfile') }}" id="instrun"></a>-->
</li> </li>
</ul> </ul>
......
{% extends "layout.html" %} {% extends "layout.html" %}
{% block title %}View {{ type }} log{% endblock %} {% block title %}View log{% endblock %}
{% block head %} {% block head %}
{{ super() }} {{ super() }}
<script src="{{ url_for('static', filename='js/scripts/viewlog.js') }}" type="text/javascript" charset="utf-8"></script> <script src="{{ url_for('static', filename='js/scripts/viewlog.js') }}" type="text/javascript" charset="utf-8"></script>
<link href="{{ url_for('static', filename='css/ui.fancytree.css', _external=False) }}" rel="stylesheet" type="text/css" media="screen" />
<script src="{{ url_for('static', filename='js/jquery/jquery.fancytree.min.js') }}" type="text/javascript" charset="utf-8"></script>
<link href="{{ url_for('static', filename='css/colorbox.css', _external=False) }}" rel="stylesheet" type="text/css" media="screen" />
<script src="{{ url_for('static', filename='js/jquery/jquery.colorbox-min.js') }}" type="text/javascript" charset="utf-8"></script>
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<input type="hidden" name="type" value="{{type}}" id="type" />
<h2 class="hight hide" id="logheader">Slapgrid result for {{ type }}</h2>
<h2 class="hight hide" id="logheader">Inspecting current slapgrid log - Click for more options</h2>
<div class="log_btn" id="logconfigbox" style="display:none"> <div class="log_btn" id="logconfigbox" style="display:none">
<span style="margin-left:15px; font-size: 18px;"> Update parameters </span> <span style="margin-left:15px; font-size: 18px;"> Update parameters </span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
...@@ -20,37 +25,67 @@ ...@@ -20,37 +25,67 @@
<div class='space'></div> <div class='space'></div>
<div class="log_content"> <div class="log_content">
<div class="log" id="salpgridLog"></div> <div class="log" id="salpgridLog"></div>
<textarea class="log" readonly id="manualLog" style="display:none">{{result}}</textarea> <div class="log" id="manualLog" style="display:none"></div>
</div> </div>
<div class="log_information"> <div class="log_information">
<div class="log_info_box"> <div class="log_info_box">
<h2 class="software">Building State</h2> <div id="slapstate">
<div class="log_content_box"> <h2 class="software">Building State</h2>
<div id="sr_run_state" class="state_running"> <div class="log_content_box">
<span class="legend"></span> <div id="software_run_state" class="state_running">
<p>Processing</p> <span class="legend"></span>
<div class="clear"></div> <p>Processing</p>
<div class="clear"></div>
</div>
<p>SlapOS rebuild your software from source, allowing you to easily patch or add any free software. <a href="#">Lean how!</a></p>
</div> </div>
<p>SlapOS rebuild your software from source, allowing you to easily patch or add any free software. <a href="#">Lean how!</a></p>
</div>
<h2 class="instance">Running State</h2> <h2 class="instance">Running State</h2>
<div class="log_content_box"> <div class="log_content_box">
<!--<div id="instance_run_state" class="state_terminated">--> <!--<div id="instance_run_state" class="state_terminated">-->
<!--<div id="instance_run_state" class="state_stopped">--> <!--<div id="instance_run_state" class="state_stopped">-->
<div id="instance_run_state" class="state_waiting"> <div id="instance_run_state" class="state_waiting">
<span class="legend"></span> <span class="legend"></span>
<p>Waiting for starting</p> <p>Waiting for starting</p>
<div class="clear"></div> <div class="clear"></div>
</div>
<p>SlapOS configure your running environment to match your needs. <a href="#">Lean how!</a></p>
</div> </div>
<p>SlapOS configure your running environment to match your needs. <a href="#">Lean how!</a></p>
</div>
<div class="separator"></div> <div class="separator"></div>
<div style="height: 38px; text-align: center; padding-top: 25px;"> <div style="height: 38px; text-align: center; padding-top: 25px;">
<a href="#" id="switch" class="lshare" rel="stop">STOP PROCESS</a> <a href="#" id="slapswitch" class="lshare" rel="stop">STOP PROCESS</a>
</div>
</div>
<div id="openloglist">
<h2 class="boxtitle">Select log file to view</h2>
<div style="height: 340px; margin-bottom: 10px;">
<div id='addbox' style="display:none">
<a href="#inline_content" id="inlineViewer" class="add_btn">ADD FILE</a>
<div class="separator"></div>
</div>
<ul>
<li rel='software.log'>Software.log</li>
<li rel='instance.log' class='checked'>Instance.log</li>
</ul>
</div>
<div class="separator"></div>
<div style="height: 38px; text-align: left; padding: 20px 0 0 15px;">
<a id="logEdit" class="lshare no-right-border" style="float:left">Edit list</a>
<a id="refreshlog" class="lshare" style="float:left">Refresh log</a>
</div>
</div> </div>
</div> </div>
</div> </div>
<div class='clear'></div> <div class='clear'></div>
<!-- This contains the hidden content for inline calls -->
<div style='display:none'>
<div id='inline_content' style='padding:10px; background:#fff;'>
<div style='border: solid 1px #678dad; height: 300px; overflow: auto;'>
<div id="fileTree"></div>
</div>
<input type=submit value="Add file" id="addfile" class="button">
</div>
</div>
{% endblock %} {% endblock %}
...@@ -160,16 +160,6 @@ def runSoftwareProfile(): ...@@ -160,16 +160,6 @@ def runSoftwareProfile():
return jsonify(result=False) return jsonify(result=False)
@login_required()
def viewSoftwareLog():
if os.path.exists(app.config['software_log']):
result = tail(open(app.config['software_log']), lines=1500)
else:
result = 'Not found yet'
return render_template('viewLog.html', type='software',
result=result.encode("utf-8"))
# instance views # instance views
@login_required() @login_required()
def editInstanceProfile(): def editInstanceProfile():
...@@ -240,13 +230,30 @@ def runInstanceProfile(): ...@@ -240,13 +230,30 @@ def runInstanceProfile():
@login_required() @login_required()
def viewInstanceLog(): def viewLog():
if os.path.exists(app.config['instance_log']): return render_template('viewLog.html')
result = open(app.config['instance_log']).read()
@login_required()
def getFileLog():
logfile = request.form.get('filename', '').encode('utf-8')
if logfile == "instance.log":
file_path = app.config['instance_log']
elif logfile == "software.log":
file_path = app.config['software_log']
else: else:
result = 'Not found yet' file_path = realpath(app.config, logfile)
return render_template('viewLog.html', type='instance', try:
result=result.encode("utf-8")) if not isText(file_path):
return jsonify(code=0,
result="Can not open binary file, please select a text file!")
if 'truncate' in request.form:
content = tail(open(file_path), int(request.form['truncate']))
return jsonify(code=1, result=content)
else:
with open(file_path) as f:
return jsonify(code=1, result=f.read())
except:
return jsonify(code=0, result="Warning: Log file doesn't exist yet or empty log!!")
@login_required() @login_required()
...@@ -388,12 +395,13 @@ def getFileContent(): ...@@ -388,12 +395,13 @@ def getFileContent():
@login_required() @login_required()
def saveFileContent(): def saveFileContent():
file_path = realpath(app.config, request.form['file']) file_path = realpath(app.config, request.form['file'], False)
if file_path: if file_path:
open(file_path, 'w').write(request.form['content'].encode("utf-8")) with open(file_path, 'w') as f:
f.write(request.form['content'].encode("utf-8"))
return jsonify(code=1, result="") return jsonify(code=1, result="")
else: else:
return jsonify(code=0, result="Error: No such file!") return jsonify(code=0, result="Rejected!! Cannot access to this location.")
@login_required() @login_required()
...@@ -705,8 +713,6 @@ app.add_url_rule('/inspectSoftware', 'inspectSoftware', inspectSoftware) ...@@ -705,8 +713,6 @@ app.add_url_rule('/inspectSoftware', 'inspectSoftware', inspectSoftware)
app.add_url_rule('/removeSoftware', 'removeSoftware', removeSoftware) app.add_url_rule('/removeSoftware', 'removeSoftware', removeSoftware)
app.add_url_rule('/runSoftwareProfile', 'runSoftwareProfile', app.add_url_rule('/runSoftwareProfile', 'runSoftwareProfile',
runSoftwareProfile, methods=['GET', 'POST']) runSoftwareProfile, methods=['GET', 'POST'])
app.add_url_rule('/viewSoftwareLog', 'viewSoftwareLog',
viewSoftwareLog, methods=['GET'])
app.add_url_rule('/editInstanceProfile', 'editInstanceProfile', app.add_url_rule('/editInstanceProfile', 'editInstanceProfile',
editInstanceProfile) editInstanceProfile)
app.add_url_rule('/inspectInstance', 'inspectInstance', app.add_url_rule('/inspectInstance', 'inspectInstance',
...@@ -716,8 +722,10 @@ app.add_url_rule('/supervisordStatus', 'supervisordStatus', ...@@ -716,8 +722,10 @@ app.add_url_rule('/supervisordStatus', 'supervisordStatus',
app.add_url_rule('/runInstanceProfile', 'runInstanceProfile', app.add_url_rule('/runInstanceProfile', 'runInstanceProfile',
runInstanceProfile, methods=['GET', 'POST']) runInstanceProfile, methods=['GET', 'POST'])
app.add_url_rule('/removeInstance', 'removeInstance', removeInstance) app.add_url_rule('/removeInstance', 'removeInstance', removeInstance)
app.add_url_rule('/viewInstanceLog', 'viewInstanceLog', app.add_url_rule('/viewLog', 'viewLog',
viewInstanceLog, methods=['GET']) viewLog, methods=['GET'])
app.add_url_rule("/getFileLog", 'getFileLog', getFileLog,
methods=['POST'])
app.add_url_rule('/stopAllPartition', 'stopAllPartition', app.add_url_rule('/stopAllPartition', 'stopAllPartition',
stopAllPartition, methods=['GET']) stopAllPartition, methods=['GET'])
app.add_url_rule('/tailProcess/name/<process>', 'tailProcess', app.add_url_rule('/tailProcess/name/<process>', 'tailProcess',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment