Changelog: https://roxy-wi.org/changelog.py#6
pull/321/head
Pavel Loginov 2022-04-27 21:10:26 +03:00
parent d97f86e8fe
commit 231f989bd2
25 changed files with 198 additions and 58 deletions

View File

@ -200,7 +200,7 @@ def keep_action_history(service: str, action: str, server_ip: str, login: str, u
sql.insert_action_history(service, action, server_id, user_id, user_ip)
except Exception as e:
logging('localhost', 'Cannot save a history: ' + srt(e), haproxywi=1)
logging('localhost', 'Cannot save a history: ' + str(e), haproxywi=1)
def telegram_send_mess(mess, **kwargs):
@ -1701,7 +1701,6 @@ def get_services_status():
cmd = "apt list --installed 2>&1 |grep " + service_name + "|awk '{print $2}'|sed 's/-/./'"
else:
cmd = "rpm -q " + service_name + "|awk -F\"" + service_name + "\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'"
print(cmd)
service_ver, stderr = subprocess_execute(cmd)
try:
@ -1988,3 +1987,12 @@ def is_restarted(server_ip, action):
if sql.is_serv_protected(server_ip) and int(user_role) > 2:
print('error: This server is protected. You cannot ' + action + ' it')
sys.exit()
def return_user_status():
import sql
user_status = sql.select_user_status()
user_plan = sql.select_user_plan()
return user_status, user_plan

View File

@ -16,6 +16,12 @@ try:
except Exception:
pass
try:
user_status, user_plan = funct.return_user_status()
except Exception as e:
user_status, user_plan = 0, 0
funct.logging('localhost', 'Cannot get a user plan: ' + str(e), haproxywi=1)
output_from_parsed_template = template.render(h2=1,
title="Create and configure HA cluster",
@ -24,5 +30,7 @@ output_from_parsed_template = template.render(h2=1,
serv=serv,
selects=servers,
user_services=user_services,
user_status=user_status,
user_plan=user_plan,
token=token)
print(output_from_parsed_template)

View File

@ -496,8 +496,14 @@ if form.getvalue('action_service') is not None:
cmd = "sudo systemctl disable %s --now" % serv
elif action == "start":
cmd = "sudo systemctl enable %s --now" % serv
if not sql.select_user_status():
print('warning: The service is disabled because you are not subscribed. Read <a href="https://roxy-wi.org/pricing.py" title="Roxy-WI pricing" target="_blank">here</a> about subscriptions')
sys.exit()
elif action == "restart":
cmd = "sudo systemctl restart %s --now" % serv
if not sql.select_user_status():
print('warning: The service is disabled because you are not subscribed. Read <a href="https://roxy-wi.org/pricing.py" title="Roxy-WI pricing" target="_blank">here</a> about subscriptions')
sys.exit()
output, stderr = funct.subprocess_execute(cmd)
funct.logging('localhost', ' The service ' + serv + ' has been ' + action + 'ed', haproxywi=1, login=1)
@ -4178,4 +4184,4 @@ if form.getvalue('show_sub_ovw'):
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
template = env.get_template('ajax/show_sub_ovw.html')
template = template.render(sub=sql.select_user_all())
print(template)
print(template)

View File

@ -19,6 +19,11 @@ try:
except Exception as e:
pass
try:
user_status, user_plan = funct.return_user_status()
except Exception as e:
user_status, user_plan = 0, 0
funct.logging('localhost', 'Cannot get a user plan: ' + str(e), haproxywi=1)
output_from_parsed_template = template.render(title="Servers: ",
role=role,
@ -37,5 +42,7 @@ output_from_parsed_template = template.render(title="Servers: ",
geoip_country_codes=geoip_country_codes,
user_services=user_services,
ldap_enable=ldap_enable,
user_status=user_status,
user_plan=user_plan,
services=services)
print(output_from_parsed_template)

View File

@ -1236,13 +1236,13 @@ def select_waf_metrics(serv, **kwargs):
if mysql_enable == '1':
if kwargs.get('time_range') == '60':
date_from = "and date > now() - INTERVAL 60 minute and rowid % 2 = 0"
date_from = "and date > now() - INTERVAL 60 minute group by `date` div 100"
elif kwargs.get('time_range') == '180':
date_from = "and date > now() - INTERVAL 180 minute and rowid % 5 = 0"
date_from = "and date > now() - INTERVAL 180 minute group by `date` div 200"
elif kwargs.get('time_range') == '360':
date_from = "and date > now() - INTERVAL 360 minute and rowid % 7 = 0"
date_from = "and date > now() - INTERVAL 360 minute group by `date` div 300"
elif kwargs.get('time_range') == '720':
date_from = "and date > now() - INTERVAL 720 minute and rowid % 9 = 0"
date_from = "and date > now() - INTERVAL 720 minute group by `date` div 500"
else:
date_from = "and date > now() - INTERVAL 30 minute"
sql = """ select * from waf_metrics where serv = '{serv}' {date_from} order by `date` desc limit 60 """.format(serv=serv, date_from=date_from)
@ -1272,13 +1272,13 @@ def select_nginx_metrics(serv, **kwargs):
if mysql_enable == '1':
if kwargs.get('time_range') == '60':
date_from = "and date > now() - INTERVAL 60 minute and rowid % 2 = 0"
date_from = "and date > now() - INTERVAL 60 minute group by `date` div 100"
elif kwargs.get('time_range') == '180':
date_from = "and date > now() - INTERVAL 180 minute and rowid % 5 = 0"
date_from = "and date > now() - INTERVAL 180 minute group by `date` div 200"
elif kwargs.get('time_range') == '360':
date_from = "and date > now() - INTERVAL 360 minute and rowid % 7 = 0"
date_from = "and date > now() - INTERVAL 360 minute group by `date` div 400"
elif kwargs.get('time_range') == '720':
date_from = "and date > now() - INTERVAL 720 minute and rowid % 9 = 0"
date_from = "and date > now() - INTERVAL 720 minute group by `date` div 500"
else:
date_from = "and date > now() - INTERVAL 30 minute"
sql = """ select * from nginx_metrics where serv = '{serv}' {date_from} order by `date` desc limit 60 """.format(serv=serv, date_from=date_from)
@ -1462,16 +1462,16 @@ def select_metrics(serv, **kwargs):
if mysql_enable == '1':
if kwargs.get('time_range') == '60':
date_from = "and date > now() - INTERVAL 60 minute and rowid % 2 = 0"
date_from = "and date > now() - INTERVAL 60 minute group by `date` div 100"
elif kwargs.get('time_range') == '180':
date_from = "and date > now() - INTERVAL 180 minute and rowid % 5 = 0"
date_from = "and date > now() - INTERVAL 180 minute group by `date` div 200"
elif kwargs.get('time_range') == '360':
date_from = "and date > now() - INTERVAL 360 minute and rowid % 7 = 0"
date_from = "and date > now() - INTERVAL 360 minute group by `date` div 300"
elif kwargs.get('time_range') == '720':
date_from = "and date > now() - INTERVAL 720 minute and rowid % 9 = 0"
date_from = "and date > now() - INTERVAL 720 minute group by `date` div 500"
else:
date_from = "and date > now() - INTERVAL 30 minute"
sql = """ select * from metrics where serv = '{serv}' {date_from} order by `date` desc """.format(serv=serv, date_from=date_from)
sql = """ select * from metrics where serv = '{serv}' {date_from} order by `date` asc """.format(serv=serv, date_from=date_from)
else:
if kwargs.get('time_range') == '60':
date_from = "and date > datetime('now', '-60 minutes', 'localtime') and rowid % 2 = 0"
@ -1499,13 +1499,13 @@ def select_metrics_http(serv, **kwargs):
if mysql_enable == '1':
if kwargs.get('time_range') == '60':
date_from = "and date > now() - INTERVAL 60 minute and rowid % 2 = 0"
date_from = "and date > now() - INTERVAL 60 minute group by `date` div 100"
elif kwargs.get('time_range') == '180':
date_from = "and date > now() - INTERVAL 180 minute and rowid % 5 = 0"
date_from = "and date > now() - INTERVAL 180 minute group by `date` div 200"
elif kwargs.get('time_range') == '360':
date_from = "and date > now() - INTERVAL 360 minute and rowid % 7 = 0"
date_from = "and date > now() - INTERVAL 360 minute group by `date` div 300"
elif kwargs.get('time_range') == '720':
date_from = "and date > now() - INTERVAL 720 minute and rowid % 9 = 0"
date_from = "and date > now() - INTERVAL 720 minute group by `date` div 500"
else:
date_from = "and date > now() - INTERVAL 30 minute"
sql = """ select * from metrics_http_status where serv = '{serv}' {date_from} order by `date` desc """.format(serv=serv, date_from=date_from)
@ -3184,6 +3184,15 @@ def select_user_status():
return query_res
def select_user_plan():
try:
query_res = UserName.get().Plan
except Exception:
return False
else:
return query_res
def select_user_all():
try:
query_res = UserName.select()

View File

@ -96,7 +96,7 @@
</td>
<td class="padding10">Version</td>
<td style="width: 100%">Description</td>
<td><span onclick="loadServices()" class="service-reload" title="Reload services"></span></td>
<td><span onclick="loadServices()" class="refresh" title="Reload services"></span></td>
</tr>
</thead>
<tbody id="ajax-services-body"></tbody>
@ -111,13 +111,13 @@
<thead>
<tr class="overviewHead">
<td class="padding10 first-collumn" style="width: 25%;">Service</td>
<td>Current version</td>
<td class="padding10">Current version</td>
<td class="padding10">Latest version</td>
<td></td>
<td>
<td class="padding10"></td>
<td style="width: 100%">
Description
</td>
<td><span onclick="loadupdatehapwi()" class="service-reload" title="Reload Update"></span></td>
<td><span onclick="loadupdatehapwi()" class="refresh" title="Reload Update"></span></td>
</tr>
</thead>
<tbody id="ajax-updatehapwi-body"></tbody>

View File

@ -14,7 +14,7 @@
{% endif %}
<td style="width: 100%;"></td>
<td></td>
<td><span onclick="loadchecker()" class="service-reload" title="Reload Telegram channels"></span></td>
<td><span onclick="loadchecker()" class="refresh" title="Reload Telegram channels"></span></td>
</tr>
{% for telegram in telegrams %}
<tr id="telegram-table-{{telegram.id}}" class="{{ loop.cycle('odd', 'even') }}">
@ -66,7 +66,7 @@
{% endif %}
<td style="width: 100%;"></td>
<td></td>
<td><span onclick="loadchecker()" class="service-reload" title="Reload Slack channels"></span></td>
<td><span onclick="loadchecker()" class="refresh" title="Reload Slack channels"></span></td>
</tr>
{% for slack in slacks %}
<tr id="slack-table-{{slack.id}}" class="{{ loop.cycle('odd', 'even') }}">

View File

@ -45,11 +45,13 @@
$(document).ready(function() {
$('#config_file_name').select2();
$('#finding_words_from').submit(function() {
if ($('#words').val() == '') {
let words = $('#words').val();
if (words == '') {
toastr.warning('Enter words for searching');
return false;
}
findInConfig();
findInConfig(words);
window.history.pushState("Find in config", "Find in config", cur_url[0] + '?service='+ $('#service').val()+'&serv='+$('#serv').val()+'&showConfigFiles&findInConfig='+ words);
return false;
});
$( "input[type=submit], button" ).button()

View File

@ -5,15 +5,17 @@
{% set plan = 'Enterprise' %}
{% elif s.Plan == 'support' %}
{% set plan = 'Premium' %}
{% elif s.Plan == 'Trial' %}
{% set plan = 'Trial' %}
{% else %}
{% set plan = 'Free' %}
{% endif %}
<tr class="odd">
<td class="padding10 first-collumn-wi">Subscription plan</td>
<td class="padding10 first-collumn-wi">Plan</td>
<td>{{plan}}</td>
</tr>
<tr class="even">
<td class="padding10 first-collumn-wi">Subscription status</td>
<td class="padding10 first-collumn-wi">Status</td>
<td>
{% if plan == 'Free' %}
N/A
@ -35,8 +37,14 @@
{% if plan == 'Free' %}
N/A
{% else %}
{{s.Method}}
{% if s.Method == 'Boosty' %}
<a href="https://boosty.to/roxy-wi" title="Boosty.to" class="logs_link" target="_blank">Boosty</a>
{% elif s.Method == 'Patreon' %}
<a href="https://www.patreon.com/roxy_wi" title="Patreon.con" class="logs_link" target="_blank">Patreon</a>
{% else %}
{{s.Method}}
{% endif %}
{% endif %}
</td>
</tr>
{% endfor %}
{% endfor %}

View File

@ -1,7 +1,7 @@
{% if not system_info %}
<td style="padding-top: 20px;" colspan="16">
<a onclick="updateServerInfo('{{server_ip}}', '{{server_id}}')" title="Refresh" style="float: right; margin-bottom: 10px;">
<span class="service-reload"></span>
<span class="refresh"></span>
</a>
</td>
{% else %}
@ -38,7 +38,7 @@
</td>
<td>
<a onclick="updateServerInfo('{{server_ip}}', '{{server_id}}')" title="Update System info" style="float: right; margin-right: 15px;">
<span class="service-reload"></span>
<span class="refresh"></span>
</a>
</td>
</tr>

View File

@ -89,6 +89,14 @@
if (cur_url[1].split('&')[2] == 'showConfigFiles') {
showConfigFiles();
}
if (cur_url[1].split('&')[3].split('=')[0] == 'findInConfig') {
var words = findGetParameter('findInConfig');
waitForElm('#finding_words_from').then((elm) => {
$('#find_p').show();
$('#words').val(words);
findInConfig(words);
});
}
if (cur_url[1].split('&')[3].split('=')[0] == 'config_file_name') {
showConfigFilesForEditing();
}

View File

@ -7,6 +7,9 @@
<style>
p {margin: 0;}
</style>
{% if user_status == 0 or user_plan == 'user' %}
{% include 'include/no_sub.html' %}
{% else %}
<table class="overview" style="margin-bottom: 20px;">
<caption><h3>Create a new HA cluster</h3></caption>
<tr class="overviewHead">
@ -149,4 +152,5 @@
<div id="creating-progress-add" style="width: 0%;"></div>
</div>
</div>
{% endblock %}
{% endif %}
{% endblock %}

View File

@ -79,9 +79,13 @@
let metrics = new Promise(
(resolve, reject) => {
{% for s in servers %}
{% if service == 'haproxy' %}
getChartData(server_ip)
getHttpChartData(server_ip)
getWafChartData(server_ip)
{% elif service == 'nginx' %}
getNginxChartData(server_ip)
{% endif %}
{% endfor %}
});
metrics.then();
@ -272,7 +276,7 @@
<a href="/app/viewsttats.py?service={{service}}&serv={{s.2}}" class="ui-button ui-widget ui-corner-all" title="View {{service}} statistics">Stat</a>
{% endif %}
{% if service != 'keepalived' %}
<a href="/app/logs.py?service={{service}}&serv={{s.2}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" class="ui-button ui-widget ui-corner-all" title="View {{service}} log">Log</a>
<a href="/app/logs.py?service={{service}}&serv={{s.2}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" class="ui-button ui-widget ui-corner-all" title="View {{service}} logs">Logs</a>
{% endif %}
{% if role <= 2 %}
<a href="/app/versions.py?service={{service}}&serv={{s.2}}&open=open" class="ui-button ui-widget ui-corner-all" title="View/Rollback to previous config">Versions</a>
@ -311,7 +315,7 @@
</select>
</div>
<div id="refresh" style="text-align: right;margin-right: 3%;" title="Refresh metrics" onclick="showMetrics()">
<span class="service-reload"></span>
<span class="refresh"></span>
</div>
</div>
{% endif %}

View File

@ -1,4 +1,16 @@
{% from 'include/input_macros.html' import input, checkbox, copy_to_clipboard %}
{% if user_status == 0 or user_plan == 'user' %}
<script>
$( function() {
$('select:regex(id, slavefor)').selectmenu("disable");
{% if user_status == 0 %}
$('#slavefor-th').attr("title", "Actions with the master config will automatically apply on the slave. You are not subscribed. Please subscribe to have access to this feature");
{% elif user_plan == 'user' %}
$('#slavefor-th').attr("title", "Actions with the master config will automatically apply on the slave. This feature is not available for your plan");
{% endif %}
});
</script>
{% endif %}
{% if not adding %}
<table class="overview" id="ajax-servers">
<thead>
@ -23,7 +35,7 @@
<span title="If protection is enabled, then the server is inaccessible for editing by everyone except the admin role">Protected</span>
</th>
<th style="width: 10%" class="help_cursor">
<span title="Actions with the master config will automatically apply on the slave">Slave for</span>
<span id="slavefor-th" title="Actions with the master config will automatically apply on the slave">Slave for</span>
</th>
<th class="cred-field">Credentials</th>
<th style="width: 100%">Description</th>

View File

@ -0,0 +1,22 @@
<style>
#oops_div {
position: absolute;
right: 0;
top: 10px;
}
</style>
<center>
<h4>
{% if user_status == 0 %}
You are not subscribed. Please subscribe to have access to this feature.
<p>
Read <a href="https://roxy-wi.org/pricing.py" title="Roxy-WI pricing" target="_blank">here</a> about subscriptions
</p>
{% elif user_plan == 'user' %}
This feature is not available for your plan. To change the plan, follow this <a href="https://roxy-wi.org/pricing.py" title="Roxy-WI pricing" target="_blank">link</a>
{% endif %}
</h4>
</center>
<div id="oops_div">
<img src="/inc/images/oops.png" alt="Oops">
</div>

View File

@ -55,7 +55,7 @@
</div>
{% endif %}
<div id="refresh" style="text-align: right;margin-top: 20px;margin-right: 10px;" title="Refresh metrics" onclick="showMetrics()">
<span class="service-reload"></span>
<span class="refresh"></span>
</div>
{% for s in servers %}
{% if service != 'nginx' %}

View File

@ -55,7 +55,7 @@
</td>
<td class="padding10">
<a onclick="showOverview(ip, hostnamea)" title="Refresh" style="float: right;">
<span class="service-reload"></span>
<span class="refresh"></span>
</a>
</td>
</tr>
@ -76,7 +76,7 @@
</td>
<td>
<a onclick="showOverviewHapWI()" title="Refresh" style="float: right; margin-right: 15px;">
<span class="service-reload"></span>
<span class="refresh"></span>
</a>
</td>
</tr>
@ -327,7 +327,7 @@
</td>
<td style="padding-right: 10px;">
<a onclick="showUsersOverview()" title="Refresh" style="float: right;">
<span class="service-reload"></span>
<span class="refresh"></span>
</a>
</td>
</tr>

View File

@ -98,7 +98,7 @@
<td>Log</td>
<td>
<a onclick="showOverviewWaf(ip, hostnamea)" title="Refresh" style="float: right; margin-right: 25px;">
<span class="service-reload"></span>
<span class="refresh"></span>
</a>
</td>
</tr>
@ -122,7 +122,7 @@
</select>
</div>
<div id="refresh" style="text-align: right;margin-top: 10px;margin-right: 20px; margin-bottom: 10px;" title="Refresh metrics" onclick="showWafMetrics()">
<span class="service-reload"></span>
<span class="refresh"></span>
</div>
{% for s in servers %}
<div class="chart-container">

View File

@ -23,6 +23,12 @@ try:
except Exception:
pass
try:
user_status, user_plan = funct.return_user_status()
except Exception as e:
user_status, user_plan = 0, 0
funct.logging('localhost', 'Cannot get a user plan: ' + str(e), haproxywi=1)
template = template.render(title="Admin area: Manage users",
role=role,
@ -40,5 +46,7 @@ template = template.render(title="Admin area: Manage users",
page="users.py",
user_services=user_services,
ldap_enable=ldap_enable,
user_status=user_status,
user_plan=user_plan,
services=services)
print(template)

View File

@ -73,6 +73,9 @@
.add .fa-clone, .plus .fa-plus, .plus-after .fa-plus, .minus-after .fa-minus {
color: var(--green-color);
}
.plus-after > .fa-plus, .minus-after > .fa-minus {
color: var(--blue-color);
}
.add-proxy::before {
display: none;
font-family: "Font Awesome 5 Solid";
@ -239,13 +242,16 @@
}
.fa-pencil-alt{
padding-left: 7px;
color: #5cb85c !important;
color: var(--blue-color) !important;
}
.service-start::after {
display: none;
font-family: "Font Awesome 5 Solid";
content: "\f04b";
}
.refresh > .fa-sync-alt {
color: var(--blue-color) !important;
}
.fa-play, .fa-stop, .fa-sync-alt {
width: 3px;
color: var(--green-color) !important;
@ -263,7 +269,7 @@
.service-restart > .fa-sync-alt {
color: orange !important;
}
.service-reload::after {
.service-reload::after, .refresh::after {
display: none;
font-family: "Font Awesome 5 Solid";
content: "\f2f1";

BIN
inc/images/oops.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

View File

@ -534,7 +534,9 @@ function showConfigFiles() {
} else {
toastr.clear();
$("#ajax-config_file_name").html(data);
window.history.pushState("Show config", "Show config", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() + "&showConfigFiles");
if (findGetParameter('findInConfig') === null) {
window.history.pushState("Show config", "Show config", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() + "&showConfigFiles");
}
}
}
} );
@ -809,7 +811,7 @@ $( function() {
if($('#time_range_out_hour').val() != '' && $('#time_range_out_hour').val() != 'None') {
var date1 = parseInt($('#time_range_out_hour').val(), 10) * 60 + parseInt($('#time_range_out_minut').val(), 10)
} else {
var date1 = now.getHours() * 60 - 1 * 60;
var date1 = now.getHours() * 60 - 3 * 60;
}
if($('#time_range_out_hour').val() != '' && $('#time_range_out_hour').val() != 'None') {
var date2 = parseInt($('#time_range_out_hour1').val(), 10) * 60 + parseInt($('#time_range_out_minut1').val(), 10)
@ -1361,7 +1363,7 @@ function changeUserPasswordItOwn(d) {
} );
}
}
function findInConfig() {
function findInConfig(words) {
clearAllAjaxFields();
$.ajax( {
url: "options.py",
@ -1369,7 +1371,7 @@ function findInConfig() {
serv: $("#serv").val(),
act: "findInConfigs",
service: $("#service").val(),
words: $('#words').val(),
words: words,
token: $('#token').val()
},
type: "POST",
@ -1383,3 +1385,22 @@ function findInConfig() {
}
} );
}
function waitForElm(selector) {
return new Promise(resolve => {
if (document.querySelector(selector)) {
return resolve(document.querySelector(selector));
}
const observer = new MutationObserver(mutations => {
if (document.querySelector(selector)) {
resolve(document.querySelector(selector));
observer.disconnect();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
});
}

View File

@ -1,7 +1,7 @@
:root {
--green-color: #5CB85C;
--red-color: #be2424;
--blue-color: #5d9ceb;
--blue-color: #4a89dc;
--link-dark-blue: #23527c;
--light-blue-color: #d1ecf1;
--menu-color: #06212a;
@ -50,11 +50,16 @@ ul#browse_histroy {
ul#browse_histroy li {
display: inline;
}
ul#browse_histroy li+li:before {
ul#browse_histroy li:before {
content: "/";
color: #767676;
margin: 0 5px 0px 5px;
}
ul#browse_histroy li+li:before {
content: "->";
color: #767676;
margin: 0 5px 0px 5px;
}
#browse_histroy a {
color: #767676;
font-size: 9.1px;
@ -408,7 +413,7 @@ pre {
background-color: #ddd;
}
.add-button, .add-button-wi {
background-color: var(--green-color);
background-color: var(--blue-color);
border-radius: 5px;
color: #fff;
padding: 5px 10px;
@ -417,10 +422,10 @@ pre {
cursor: pointer;
}
.add-button:hover, .add-button-wi:hover {
background-color: #5bbf5b;
background-color: #5094ee;
}
.add-button:active, .add-button-wi:active {
background-color: #3e863e;
background-color: #5499f4;
box-shadow: 0 1px #666;
}
.add-button-wi {

View File

@ -666,7 +666,7 @@ $( function() {
$('#search_ldap_user').click(function() {
var valid = true;
toastr.clear();
allFields = $( [] ).add( $('#new-username') )
allFields = $( [] ).add( $('#new-username') );
allFields.removeClass( "ui-state-error" );
valid = valid && checkLength( $('#new-username'), "user name", 1 );
user = $('#new-username').val()
@ -2127,6 +2127,8 @@ function ajaxActionServies(action, service) {
success: function( data ) {
if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') {
toastr.error(data);
} else if (data.indexOf('warning: ') != '-1') {
toastr.warning(data);
} else {
window.history.pushState("services", "services", cur_url[0].split("#")[0] + "#services");
toastr.success('The ' + service + ' has been ' + action +'ed');
@ -2502,7 +2504,7 @@ function showServerInfo(id, ip) {
$.getScript(awesome);
}
}
});
} );
} else {
$('#server_info-'+id).hide();
$('#server_info_link-'+id).attr('title', 'Show System info');