mirror of https://github.com/Aidaho12/haproxy-wi
parent
d97f86e8fe
commit
231f989bd2
12
app/funct.py
12
app/funct.py
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
43
app/sql.py
43
app/sql.py
|
@ -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()
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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') }}">
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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' %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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";
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 288 KiB |
Binary file not shown.
After Width: | Height: | Size: 146 B |
|
@ -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
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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');
|
||||
|
|
Loading…
Reference in New Issue