|
|
|
|
|
<div id="update_notice" style="display: none; margin: -40px 0px 20px 0px">
|
|
|
<div>${_('Checking for updates...')}</div>
|
|
|
</div>
|
|
|
|
|
|
|
|
|
<div class="panel panel-default">
|
|
|
<div class="panel-heading">
|
|
|
<h3 class="panel-title">${_('Gunicorn process management')}</h3>
|
|
|
<div class="pull-right">
|
|
|
<a id="autoRefreshEnable" href="#autoRefreshEnable" onclick="enableAutoRefresh(); return false">${_('start auto refresh')}</a>
|
|
|
<a id="autoRefreshDisable" href="#autoRefreshDisable" onclick="disableAutoRefresh(); return false" style="display: none">${_('stop auto refresh')}</a>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="panel-body" id="app">
|
|
|
<h3>List of Gunicorn processes on this machine</h3>
|
|
|
<p>RhodeCode workers set: ${c.gunicorn_workers}</p>
|
|
|
<%
|
|
|
def get_name(proc):
|
|
|
cmd = ' '.join(proc.cmdline())
|
|
|
if 'vcsserver.ini' in cmd:
|
|
|
return 'VCSServer'
|
|
|
elif 'rhodecode.ini' in cmd:
|
|
|
return 'RhodeCode'
|
|
|
return proc.name()
|
|
|
%>
|
|
|
<%include file='settings_process_management_data.mako'/>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<script>
|
|
|
|
|
|
|
|
|
restart = function(elem, pid) {
|
|
|
|
|
|
if ($(elem).hasClass('disabled')){
|
|
|
return;
|
|
|
}
|
|
|
$(elem).addClass('disabled');
|
|
|
$(elem).html('processing...');
|
|
|
|
|
|
$.ajax({
|
|
|
url: pyroutes.url('admin_settings_process_management_signal'),
|
|
|
headers: {
|
|
|
"X-CSRF-Token": CSRF_TOKEN,
|
|
|
},
|
|
|
data: JSON.stringify({'pids': [pid]}),
|
|
|
dataType: 'json',
|
|
|
type: 'POST',
|
|
|
contentType: "application/json; charset=utf-8",
|
|
|
success: function (data) {
|
|
|
$(elem).html(data.result);
|
|
|
$(elem).removeClass('disabled');
|
|
|
},
|
|
|
failure: function (data) {
|
|
|
$(elem).text('FAILED TO LOAD RESULT');
|
|
|
$(elem).removeClass('disabled');
|
|
|
},
|
|
|
error: function (data) {
|
|
|
$(elem).text('FAILED TO LOAD RESULT');
|
|
|
$(elem).removeClass('disabled');
|
|
|
}
|
|
|
})
|
|
|
};
|
|
|
|
|
|
var intervalID = null;
|
|
|
var currentRequest = null;
|
|
|
|
|
|
autoRefresh = function(value) {
|
|
|
var url = pyroutes.url('admin_settings_process_management_data');
|
|
|
var loadData = function() {
|
|
|
currentRequest = $.get(url)
|
|
|
.done(function(data) {
|
|
|
|
|
|
if(data.indexOf('id="processTimeStamp"') === -1){
|
|
|
clearInterval(intervalID);
|
|
|
$('#procList').html('ERROR LOADING DATA. PLEASE REFRESH THE PAGE');
|
|
|
return
|
|
|
}
|
|
|
|
|
|
currentRequest = null;
|
|
|
$('#procList').html(data);
|
|
|
timeagoActivate();
|
|
|
var beat = function(doCallback) {
|
|
|
var callback = function () {};
|
|
|
if (doCallback){
|
|
|
var callback = function () {beat(false)};
|
|
|
}
|
|
|
$('#processTimeStamp').animate({
|
|
|
opacity: $('#processTimeStamp').css('opacity') == '1' ? '0.3' : '1'
|
|
|
}, 500, callback);
|
|
|
};
|
|
|
beat(true)
|
|
|
});
|
|
|
};
|
|
|
|
|
|
if (value) {
|
|
|
intervalID = setInterval(loadData, 5000);
|
|
|
} else {
|
|
|
clearInterval(intervalID);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
enableAutoRefresh = function() {
|
|
|
$('#autoRefreshEnable').hide();
|
|
|
$('#autoRefreshDisable').show();
|
|
|
autoRefresh(true)
|
|
|
};
|
|
|
|
|
|
disableAutoRefresh = function() {
|
|
|
$('#autoRefreshEnable').show();
|
|
|
$('#autoRefreshDisable').hide();
|
|
|
autoRefresh(false)
|
|
|
};
|
|
|
|
|
|
masterAction = function(pid, action) {
|
|
|
$.ajax({
|
|
|
url: pyroutes.url('admin_settings_process_management_master_signal'),
|
|
|
headers: {
|
|
|
"X-CSRF-Token": CSRF_TOKEN,
|
|
|
},
|
|
|
data: JSON.stringify({'pid_data': {'pid': pid, 'action': action}}),
|
|
|
dataType: 'json',
|
|
|
type: 'POST',
|
|
|
contentType: "application/json; charset=utf-8",
|
|
|
success: function (data) {
|
|
|
|
|
|
},
|
|
|
failure: function (data) {
|
|
|
|
|
|
},
|
|
|
error: function (data) {
|
|
|
|
|
|
}
|
|
|
})
|
|
|
};
|
|
|
|
|
|
addWorker = function(pid) {
|
|
|
masterAction(pid, '+');
|
|
|
};
|
|
|
|
|
|
removeWorker = function(pid) {
|
|
|
masterAction(pid, '-');
|
|
|
};
|
|
|
|
|
|
</script>
|
|
|
|