mirror of https://github.com/Aidaho12/haproxy-wi
parent
aa552c91be
commit
710575dbab
|
@ -534,12 +534,12 @@ def update_db_v_4_3_2(**kwargs):
|
|||
except sqltool.Error as e:
|
||||
if kwargs.get('silent') != 1:
|
||||
if e.args[0] == 'columns param, group are not unique' or e == " 1060 (42S21): columns param, group are not unique ":
|
||||
print('DB was update to 4.3.2')
|
||||
print('Updating... go to version 4.4.0')
|
||||
else:
|
||||
print("An error occurred:", e)
|
||||
return False
|
||||
else:
|
||||
print("DB was update to 4.3.2")
|
||||
print("Updating... go to version 4.4.0")
|
||||
return True
|
||||
cur.close()
|
||||
con.close()
|
||||
|
@ -630,11 +630,38 @@ def update_db_v_4_4_2_1(**kwargs):
|
|||
return True
|
||||
cur.close()
|
||||
con.close()
|
||||
|
||||
|
||||
def update_db_v_4_5(**kwargs):
|
||||
con, cur = get_cur()
|
||||
sql = """CREATE TABLE IF NOT EXISTS `alerts` (`id` INTEGER NOT NULL,
|
||||
`message` varchar(64),
|
||||
`level` varchar(64),
|
||||
`ip` varchar(64),
|
||||
`port` INTEGER,
|
||||
`user_group` INTEGER default 1,
|
||||
`service` varchar(64),
|
||||
`date` DATETIME default '0000-00-00 00:00:00',
|
||||
PRIMARY KEY(`id`) ); """
|
||||
try:
|
||||
cur.execute(sql)
|
||||
con.commit()
|
||||
except sqltool.Error as e:
|
||||
if kwargs.get('silent') != 1:
|
||||
if e.args[0] == 'duplicate column name: version' or e == "1060 (42S21): Duplicate column name 'version' ":
|
||||
print('Updating... go to version 4.5.1')
|
||||
else:
|
||||
print("Updating... go to version to 4.5.1")
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
cur.close()
|
||||
con.close()
|
||||
|
||||
|
||||
def update_ver(**kwargs):
|
||||
con, cur = get_cur()
|
||||
sql = """update version set version = '4.4.2.0'; """
|
||||
sql = """update version set version = '4.4.3.0'; """
|
||||
try:
|
||||
cur.execute(sql)
|
||||
con.commit()
|
||||
|
@ -666,6 +693,7 @@ def update_all():
|
|||
update_db_v_4_4()
|
||||
update_db_v_4_4_2()
|
||||
update_db_v_4_4_2_1()
|
||||
update_db_v_4_5()
|
||||
update_ver()
|
||||
|
||||
|
||||
|
@ -691,6 +719,7 @@ def update_all_silent():
|
|||
update_db_v_4_4(silent=1)
|
||||
update_db_v_4_4_2(silent=1)
|
||||
update_db_v_4_4_2_1(silent=1)
|
||||
update_db_v_4_5(silent=1)
|
||||
update_ver()
|
||||
|
||||
|
||||
|
|
|
@ -25,9 +25,10 @@ if act == "checkrestart":
|
|||
sys.exit()
|
||||
|
||||
|
||||
if not sql.check_token_exists(form.getvalue("token")):
|
||||
print('error: Your token has been expired')
|
||||
sys.exit()
|
||||
if form.getvalue('alert_consumer') is None:
|
||||
if not sql.check_token_exists(form.getvalue("token")):
|
||||
print('error: Your token has been expired')
|
||||
sys.exit()
|
||||
|
||||
|
||||
if form.getvalue('getcerts') is not None and serv is not None:
|
||||
|
@ -244,6 +245,16 @@ if form.getvalue('ip_for_delete') is not None:
|
|||
print('error: ' + stderr[0])
|
||||
|
||||
|
||||
if form.getvalue('table_for_clear') is not None:
|
||||
haproxy_sock_port = sql.get_setting('haproxy_sock_port')
|
||||
table = form.getvalue('table_for_clear')
|
||||
|
||||
cmd='echo "clear table %s " |nc %s %s' % (table, serv, haproxy_sock_port)
|
||||
output, stderr = funct.subprocess_execute(cmd)
|
||||
if stderr[0] != '':
|
||||
print('error: ' + stderr[0])
|
||||
|
||||
|
||||
if form.getvalue('list_serv_select') is not None:
|
||||
haproxy_sock_port = sql.get_setting('haproxy_sock_port')
|
||||
cmd='echo "show acl"|nc %s %s |grep "loaded from" |awk \'{print $1,$2}\'' % (serv, haproxy_sock_port)
|
||||
|
@ -2023,4 +2034,39 @@ if form.getvalue('showBytes') is not None:
|
|||
env = Environment(loader=FileSystemLoader('templates'), autoescape=True)
|
||||
template = env.get_template('ajax/bin_bout.html')
|
||||
template = template.render(bin_bout=bin_bout,serv=serv)
|
||||
print(template)
|
||||
print(template)
|
||||
|
||||
|
||||
if form.getvalue('alert_consumer'):
|
||||
try:
|
||||
user_group = funct.get_user_group(id=1)
|
||||
if funct.check_user_group():
|
||||
message = sql.select_alerts(user_group)
|
||||
for m in message:
|
||||
print(m[0]+ ': '+ m[1] +' date: '+m[2]+';')
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
if form.getvalue('waf_rule_id'):
|
||||
enable = form.getvalue('waf_en')
|
||||
rule_id = form.getvalue('waf_rule_id')
|
||||
haproxy_path = sql.get_setting('haproxy_dir')
|
||||
rule_file = sql.select_waf_rule_by_id(rule_id)
|
||||
conf_file_path = haproxy_path + 'waf/modsecurity.conf'
|
||||
rule_file_path = 'Include ' + haproxy_path + '/waf/rules/' + rule_file
|
||||
|
||||
if enable == '0':
|
||||
cmd = ["sudo sed -i 's!"+rule_file_path+"!#"+rule_file_path+"!' "+conf_file_path]
|
||||
en_for_log = 'disable'
|
||||
else:
|
||||
cmd = ["sudo sed -i 's!#"+rule_file_path+"!"+rule_file_path+"!' "+conf_file_path]
|
||||
en_for_log = 'enable'
|
||||
|
||||
try:
|
||||
funct.logging('WAF', ' Has been '+en_for_log+' WAF rule: '+rule_file+' for the server '+serv, haproxywi=1, login=1)
|
||||
except:
|
||||
pass
|
||||
|
||||
print(funct.ssh_command(serv, cmd))
|
||||
sql.update_enable_waf_rules(rule_id, serv, enable)
|
|
@ -25,13 +25,15 @@ if action == 'add':
|
|||
smon = sql.select_smon(user_group,action='add')
|
||||
funct.page_for_admin(level=2)
|
||||
title = "SMON Admin"
|
||||
autorefresh = 0
|
||||
else:
|
||||
smon = sql.smon_list(user_group)
|
||||
title = "SMON Dashboard"
|
||||
autorefresh = 1
|
||||
|
||||
|
||||
template = template.render(h2 = 1, title = title,
|
||||
autoreœfresh = 1,
|
||||
autorefresh = autorefresh,
|
||||
role = role,
|
||||
user = user,
|
||||
group = user_group,
|
||||
|
|
|
@ -33,9 +33,9 @@
|
|||
<td class="padding10 first-collumn">
|
||||
Used: {{tables_head.3}}
|
||||
</td>
|
||||
<!-- <td> -->
|
||||
<!-- <button title="Clear table {{tables_head.0}}">Clear table</button> -->
|
||||
<!-- </td> -->
|
||||
<td>
|
||||
<button title="Clear table {{tables_head.0}}" onclick="clearTable('{{tables_head.0}}')">Clear table</button>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table class="overview hover order-column display compact" id="{{tables_head.0.strip()}}">
|
||||
|
|
|
@ -34,9 +34,9 @@
|
|||
<td class="padding10 first-collumn">
|
||||
Used: {{t.0.3}}
|
||||
</td>
|
||||
<!-- <td> -->
|
||||
<!-- <button title="Clear table {{t.0.0}}">Clear table</button> -->
|
||||
<!-- </td> -->
|
||||
<td>
|
||||
<button title="Clear table {{t.0.0}}" onclick="clearTable('{{t.0.0}}')">Clear table</button>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{%- if t.1.0 != '' -%}
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
{% block content %}
|
||||
{% from 'include/input_macros.html' import input, checkbox, select %}
|
||||
<br />
|
||||
{% if selects|length == 0 %}
|
||||
{% include 'include/getstarted.html' %}
|
||||
{% else %}
|
||||
<style>
|
||||
|
||||
</style>
|
||||
<form style="padding-left: 5px;" action="viewsttats.py" method="post">
|
||||
<input type="hidden" id="service" value="{{service}}" />
|
||||
<select autofocus required name="serv" id="serv">
|
||||
|
@ -17,12 +21,24 @@
|
|||
{% endfor %}
|
||||
</select>
|
||||
<a class="ui-button ui-widget ui-corner-all" id="show" title="Show stats" onclick="{{ onclick }}">Show</a>
|
||||
<div id="stats_filter">
|
||||
<div id="stats_filter_text">Filter:</div>
|
||||
{{ checkbox('stats_active', title='Show active servers', desc='Active', checked='checked') }}
|
||||
{{ checkbox('stats_drain', title='Show drain servers', desc='Drain', checked='checked') }}
|
||||
{{ checkbox('stats_maintain', title='Show maintain servers', desc='Maintain', checked='checked') }}
|
||||
{{ checkbox('stats_down', title='Show DOWN servers', desc='DOWN', checked='checked') }}
|
||||
{{ checkbox('stats_not_checked', title='Show not checked servers', desc='Not checked', checked='checked') }}
|
||||
{{ checkbox('stats_backup', title='Show backup servers', desc='Backup', checked='checked') }}
|
||||
{{ checkbox('stats_frontends', title='Show frontends servers', desc='Frontends', checked='checked') }}
|
||||
{{ checkbox('stats_backends', title='Show backends servers', desc='Backends', checked='checked') }}
|
||||
</div>
|
||||
</form>
|
||||
<br />
|
||||
|
||||
<div id="ajax" style="margin-left: 5px; margin-right: 5px;"></div>
|
||||
<div id="notice" style="padding-left: 15px; font-size: 25px;">
|
||||
Please choose a server
|
||||
</div>
|
||||
<br />
|
||||
</div>
|
||||
<script>
|
||||
if (cur_url[1]) {
|
||||
showStats();
|
||||
|
@ -56,6 +72,62 @@
|
|||
$('h1').next().next().next().next().css('display', 'none');
|
||||
$('body').css('font-family', '-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol');
|
||||
$( "select" ).selectmenu();
|
||||
$('#stats_filter').show();
|
||||
var backends = $('.backend').parents('p');
|
||||
var backends_form = $('.backend').parents('form');
|
||||
var frontends = $('.frontend').parents('p');
|
||||
var filter_array = {'#stats_active': '.active_up', '#stats_maintain': '.maintain', '#stats_drain': '.active_draining',
|
||||
'#stats_down': '.active_down', '#stats_not_checked': '.active_no_check', '#stats_backup': '.backup_up',
|
||||
'#stats_backends': backends, '#stats_backends': backends_form,'#stats_frontends': frontends};
|
||||
trigger_filter(filter_array);
|
||||
$('#stats_active').click(function() {
|
||||
var stats_active = {'#stats_active': '.active_up'};
|
||||
trigger_filter(stats_active);
|
||||
});
|
||||
$('#stats_maintain').click(function() {
|
||||
var stats_maintain = {'#stats_maintain': '.maintain'};
|
||||
trigger_filter(stats_maintain);
|
||||
});
|
||||
$('#stats_drain').click(function() {
|
||||
var stats_drain = {'#stats_drain': '.active_draining'};
|
||||
trigger_filter(stats_drain);
|
||||
});
|
||||
$('#stats_down').click(function() {
|
||||
var stats_down = {'#stats_down': '.active_down'};
|
||||
trigger_filter(stats_down);
|
||||
});
|
||||
$('#stats_not_checked').click(function() {
|
||||
var stats_not_checked = {'#stats_not_checked': '.active_no_check'};
|
||||
trigger_filter(stats_not_checked);
|
||||
});
|
||||
$('#stats_backup').click(function() {
|
||||
var stats_backup = {'#stats_backup': '.backup_up'};
|
||||
trigger_filter(stats_backup);
|
||||
});
|
||||
$('#stats_backends').click(function() {
|
||||
var stats_backends = {'#stats_backends': backends};
|
||||
trigger_filter(stats_backends);
|
||||
var stats_backends = {'#stats_backends': backends_form};
|
||||
trigger_filter(stats_backends);
|
||||
});
|
||||
$('#stats_frontends').click(function() {
|
||||
var stats_frontends = {'#stats_frontends': frontends};
|
||||
trigger_filter(stats_frontends);
|
||||
});
|
||||
function trigger_filter(filter_array) {
|
||||
for (var filter_id in filter_array) {
|
||||
if ($(filter_id).prop('checked')) {
|
||||
if (filter_id == '#stats_backends' || filter_id == '#stats_frontends' || filter_id == '#stats_listens') {
|
||||
$(filter_array[filter_id]).css('display', 'block');
|
||||
$(filter_array[filter_id]).css('addClass', 'tbl');
|
||||
} else {
|
||||
$(filter_array[filter_id]).css('display', 'table-row');
|
||||
}
|
||||
} else {
|
||||
$(filter_array[filter_id]).css('display', 'none');
|
||||
}
|
||||
}
|
||||
}
|
||||
{% if role == 3 %}
|
||||
$('input[type=checkbox]').remove()
|
||||
{% endif %}
|
||||
|
@ -76,7 +148,7 @@
|
|||
}
|
||||
$('#serv').on('selectmenuchange',function() {
|
||||
showStats();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<link href="/inc/style.css" rel="stylesheet">
|
||||
{% endif %}
|
||||
|
|
|
@ -1,79 +1,113 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<style>
|
||||
.alert-danger {
|
||||
width: 450px;
|
||||
display: inline-block;
|
||||
height: 25px;
|
||||
padding-top: 0px;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
$("#secIntervals").css("display", "none");
|
||||
var ip = []
|
||||
var hostnamea = []
|
||||
{% for s in servers_all %}
|
||||
ip.push("{{s[2]}}")
|
||||
var host = "{{s[1]}}"
|
||||
host = host.replace(/\./g, '\\.');
|
||||
hostnamea.push(host)
|
||||
{% endfor %}
|
||||
</script>
|
||||
{% if servers_all|length == 0 %}
|
||||
{% include 'include/getstarted.html' %}
|
||||
{% else %}
|
||||
<table class="overview">
|
||||
<tr class="overviewHead">
|
||||
<td class="padding10 first-collumn">
|
||||
Server
|
||||
</td>
|
||||
<td class="padding10">
|
||||
Action
|
||||
</td>
|
||||
<td class="padding10">
|
||||
WAF mode
|
||||
</td class="padding10">
|
||||
<td>
|
||||
Metrics
|
||||
</td>
|
||||
<td>
|
||||
<a onclick="showOverviewWaf(ip, hostnamea)" title="Refresh" style="float: right; margin-right: 25px;">
|
||||
<span class="service-reload"></span>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% for s in servers_all %}
|
||||
<tr class="{{ loop.cycle('odd', 'even') }}" id="{{s[1]}}"></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<link href="/inc/chart.min.css" rel="stylesheet">
|
||||
<script src="/inc/overview.js"></script>
|
||||
<script src="/inc/metrics.js"></script>
|
||||
<script src="/inc/chart.min.js"></script>
|
||||
{% block content %}
|
||||
<script src="/inc/waf.js"></script>
|
||||
<div id="refresh" style="text-align: right;margin-top: 20px;margin-right: 20px;" title="Refresh metrics" onclick="showWafMetrics()">
|
||||
<span class="service-reload"></span>
|
||||
</div>
|
||||
{% for s in servers %}
|
||||
<div class="chart-container">
|
||||
<canvas id="s_{{s.0}}" role="img"></canvas>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div id="dialog-confirm" style="display: none;">
|
||||
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:3px 12px 20px 0;"></span>Are you sure?</p>
|
||||
</div>
|
||||
<script>
|
||||
function showWafMetrics() {
|
||||
{% for s in servers %}
|
||||
getWafChartData('{{s.0}}')
|
||||
{% if manage_rules == '1' %}
|
||||
{% from 'include/input_macros.html' import input, checkbox %}
|
||||
<table class="overview" id="waf_rules">
|
||||
<tr class="overviewHead">
|
||||
<td class="padding10 first-collumn">
|
||||
Rule name
|
||||
</td>
|
||||
<td style="width: 100px;">
|
||||
Enabled
|
||||
</td>
|
||||
<td>
|
||||
Description
|
||||
</td>
|
||||
</tr>
|
||||
{% for r in rules %}
|
||||
<tr class="{{ loop.cycle('odd', 'even') }}" id="rule-{{r.0}}">
|
||||
<td class="padding10 first-collumn">{{r.1}}</td>
|
||||
<td class="checkbox">
|
||||
{% set id = 'rule_id-' + r.0|string() %}
|
||||
{% if r.2 == 1 %}
|
||||
{{ checkbox(id, checked='checked') }}
|
||||
{% else %}
|
||||
{{ checkbox(id) }}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td style="padding-top: 5px;padding-bottom: 10px;">{{r.3}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% else %}
|
||||
<style>
|
||||
.alert-danger {
|
||||
width: 450px;
|
||||
display: inline-block;
|
||||
height: 25px;
|
||||
padding-top: 0px;
|
||||
}
|
||||
showWafMetrics()
|
||||
showOverviewWaf(ip, hostnamea)
|
||||
</script>
|
||||
<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px; clear: both;">
|
||||
You can read the description and watch a video about WAF <a href="https://haproxy-wi.org/description.py?description=waf" title="WAF" target="_blank">here</a>
|
||||
</div>
|
||||
</style>
|
||||
<script>
|
||||
$("#secIntervals").css("display", "none");
|
||||
var ip = []
|
||||
var hostnamea = []
|
||||
{% for s in servers_all %}
|
||||
ip.push("{{s[2]}}");
|
||||
var host = "{{s[1]}}";
|
||||
host = host.replace(/\./g, '\\.');
|
||||
hostnamea.push(host);
|
||||
{% endfor %}
|
||||
</script>
|
||||
{% if servers_all|length == 0 %}
|
||||
{% include 'include/getstarted.html' %}
|
||||
{% else %}
|
||||
<table class="overview">
|
||||
<tr class="overviewHead">
|
||||
<td class="padding10 first-collumn">
|
||||
Server
|
||||
</td>
|
||||
<td class="padding10">
|
||||
Actions
|
||||
</td>
|
||||
<td class="padding10">
|
||||
WAF mode
|
||||
</td class="padding10">
|
||||
<td>
|
||||
Metrics
|
||||
</td>
|
||||
<td>
|
||||
Manage rules
|
||||
</td>
|
||||
<td>
|
||||
<a onclick="showOverviewWaf(ip, hostnamea)" title="Refresh" style="float: right; margin-right: 25px;">
|
||||
<span class="service-reload"></span>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% for s in servers_all %}
|
||||
<tr class="{{ loop.cycle('odd', 'even') }}" id="{{s[1]}}"></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<link href="/inc/chart.min.css" rel="stylesheet">
|
||||
<script src="/inc/overview.js"></script>
|
||||
<script src="/inc/metrics.js"></script>
|
||||
<script src="/inc/chart.min.js"></script>
|
||||
<div id="refresh" style="text-align: right;margin-top: 20px;margin-right: 20px;" title="Refresh metrics" onclick="showWafMetrics()">
|
||||
<span class="service-reload"></span>
|
||||
</div>
|
||||
{% for s in servers %}
|
||||
<div class="chart-container">
|
||||
<canvas id="s_{{s.0}}" role="img"></canvas>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div id="dialog-confirm" style="display: none;">
|
||||
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:3px 12px 20px 0;"></span>Are you sure?</p>
|
||||
</div>
|
||||
<script>
|
||||
function showWafMetrics() {
|
||||
{% for s in servers %}
|
||||
getWafChartData('{{s.0}}');
|
||||
{% endfor %}
|
||||
}
|
||||
showWafMetrics();
|
||||
showOverviewWaf(ip, hostnamea);
|
||||
</script>
|
||||
<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px; clear: both;">
|
||||
You can read the description and watch a video about WAF <a href="https://haproxy-wi.org/description.py?description=waf" title="WAF" target="_blank">here</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
|
@ -1,123 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
import subprocess
|
||||
import time
|
||||
import argparse
|
||||
import os, sys
|
||||
sys.path.append(os.path.join(sys.path[0], os.path.dirname(os.getcwd())))
|
||||
sys.path.append(os.path.join(sys.path[0], os.getcwd()))
|
||||
import funct
|
||||
import sql
|
||||
import signal
|
||||
|
||||
class GracefulKiller:
|
||||
kill_now = False
|
||||
def __init__(self):
|
||||
signal.signal(signal.SIGINT, self.exit_gracefully)
|
||||
signal.signal(signal.SIGTERM, self.exit_gracefully)
|
||||
|
||||
def exit_gracefully(self,signum, frame):
|
||||
self.kill_now = True
|
||||
|
||||
def main():
|
||||
sql.delete_mentrics()
|
||||
sql.delete_waf_mentrics()
|
||||
servers = sql.select_servers_metrics_for_master()
|
||||
started_workers = get_worker()
|
||||
servers_list = []
|
||||
|
||||
for serv in servers:
|
||||
servers_list.append(serv[0])
|
||||
|
||||
need_kill=list(set(started_workers) - set(servers_list))
|
||||
need_start=list(set(servers_list) - set(started_workers))
|
||||
|
||||
if need_kill:
|
||||
for serv in need_kill:
|
||||
kill_worker(serv)
|
||||
|
||||
if need_start:
|
||||
for serv in need_start:
|
||||
start_worker(serv)
|
||||
|
||||
try:
|
||||
waf_servers = sql.select_all_waf_servers()
|
||||
waf_started_workers = get_waf_worker()
|
||||
waf_servers_list = []
|
||||
|
||||
for serv in waf_servers:
|
||||
waf_servers_list.append(serv[0])
|
||||
|
||||
waf_need_kill=list(set(waf_started_workers) - set(waf_servers_list))
|
||||
waf_need_start=list(set(waf_servers_list) - set(waf_started_workers))
|
||||
|
||||
if waf_need_kill:
|
||||
for serv in waf_need_kill:
|
||||
kill_waf_worker(serv)
|
||||
|
||||
if waf_need_start:
|
||||
for serv in waf_need_start:
|
||||
start_waf_worker(serv)
|
||||
except Exception as e:
|
||||
funct.logging("localhost", 'Problems with WAF worker metrics '+e, metrics=1)
|
||||
pass
|
||||
|
||||
def start_worker(serv):
|
||||
port = sql.get_setting('haproxy_sock_port')
|
||||
cmd = "tools/metrics_worker.py %s --port %s &" % (serv, port)
|
||||
os.system(cmd)
|
||||
funct.logging("localhost", " Master started new metrics worker for: "+serv, metrics=1)
|
||||
|
||||
def kill_worker(serv):
|
||||
cmd = "ps ax |grep 'tools/metrics_worker.py %s'|grep -v grep |awk '{print $1}' |xargs kill" % serv
|
||||
output, stderr = funct.subprocess_execute(cmd)
|
||||
funct.logging("localhost", " Master killed metrics worker for: "+serv, metrics=1)
|
||||
if stderr:
|
||||
funct.logging("localhost", stderr, metrics=1)
|
||||
|
||||
def start_waf_worker(serv):
|
||||
port = sql.get_setting('haproxy_sock_port')
|
||||
cmd = "tools/metrics_waf_worker.py %s --port %s &" % (serv, port)
|
||||
os.system(cmd)
|
||||
funct.logging("localhost", " Master started new WAF metrics worker for: "+serv, metrics=1)
|
||||
|
||||
def kill_waf_worker(serv):
|
||||
cmd = "ps ax |grep 'tools/metrics_waf_worker.py %s'|grep -v grep |awk '{print $1}' |xargs kill" % serv
|
||||
output, stderr = funct.subprocess_execute(cmd)
|
||||
funct.logging("localhost", " Master killed WAF metrics worker for: "+serv, metrics=1)
|
||||
if stderr:
|
||||
funct.logging("localhost", stderr, metrics=1)
|
||||
|
||||
def kill_all_workers():
|
||||
cmd = "ps ax |grep -e 'tools/metrics_worker.py\|tools/metrics_waf_worker.py' |grep -v grep |awk '{print $1}' |xargs kill"
|
||||
output, stderr = funct.subprocess_execute(cmd)
|
||||
funct.logging("localhost", " Master killing all metrics workers", metrics=1)
|
||||
if stderr:
|
||||
funct.logging("localhost", stderr, metrics=1)
|
||||
|
||||
def get_worker():
|
||||
cmd = "ps ax |grep 'tools/metrics_worker.py' |grep -v grep |awk '{print $7}'"
|
||||
output, stderr = funct.subprocess_execute(cmd)
|
||||
if stderr:
|
||||
funct.logging("localhost", stderr, metrics=1)
|
||||
return output
|
||||
|
||||
def get_waf_worker():
|
||||
cmd = "ps ax |grep 'tools/metrics_waf_worker.py' |grep -v grep |awk '{print $7}'"
|
||||
output, stderr = funct.subprocess_execute(cmd)
|
||||
if stderr:
|
||||
funct.logging("localhost", stderr, metrics=1)
|
||||
return output
|
||||
|
||||
if __name__ == "__main__":
|
||||
funct.logging("localhost", " Metrics master started", metrics=1)
|
||||
killer = GracefulKiller()
|
||||
|
||||
while True:
|
||||
main()
|
||||
time.sleep(20)
|
||||
|
||||
if killer.kill_now:
|
||||
break
|
||||
|
||||
kill_all_workers()
|
||||
funct.logging("localhost", " Master shutdown", metrics=1)
|
|
@ -1,64 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
import subprocess
|
||||
from subprocess import check_output, CalledProcessError
|
||||
import time
|
||||
import argparse
|
||||
import os, sys
|
||||
sys.path.append(os.path.join(sys.path[0], os.path.dirname(os.getcwd())))
|
||||
sys.path.append(os.path.join(sys.path[0], os.getcwd()))
|
||||
import sql
|
||||
import signal
|
||||
|
||||
class GracefulKiller:
|
||||
kill_now = False
|
||||
def __init__(self):
|
||||
signal.signal(signal.SIGINT, self.exit_gracefully)
|
||||
signal.signal(signal.SIGTERM, self.exit_gracefully)
|
||||
|
||||
def exit_gracefully(self,signum, frame):
|
||||
self.kill_now = True
|
||||
|
||||
def main(serv, port):
|
||||
port = str(port)
|
||||
firstrun = True
|
||||
readstats = ""
|
||||
killer = GracefulKiller()
|
||||
|
||||
while True:
|
||||
try:
|
||||
cmd = "echo 'show stat' |nc "+serv+" "+port+" | cut -d ',' -f 1-2,5 |grep waf |grep BACKEND |awk -F',' '{print $3}'"
|
||||
readstats = subprocess.check_output([cmd], shell=True)
|
||||
except CalledProcessError as e:
|
||||
print("Command error")
|
||||
except OSError as e:
|
||||
print(e)
|
||||
sys.exit()
|
||||
readstats = readstats.decode(encoding='UTF-8')
|
||||
metric = readstats.splitlines()
|
||||
|
||||
try:
|
||||
sql.insert_waf_mentrics(serv, metric[0])
|
||||
except:
|
||||
pass
|
||||
|
||||
time.sleep(30)
|
||||
|
||||
if killer.kill_now:
|
||||
break
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Metrics HAProxy service.', prog='metrics_worker.py', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
|
||||
parser.add_argument('IP', help='Start get metrics from HAProxy service at this ip', nargs='?', type=str)
|
||||
parser.add_argument('--port', help='Start get metrics from HAProxy service at this port', nargs='?', default=1999, type=int)
|
||||
|
||||
args = parser.parse_args()
|
||||
if args.IP is None:
|
||||
parser.print_help()
|
||||
import sys
|
||||
sys.exit()
|
||||
else:
|
||||
try:
|
||||
main(args.IP, args.port)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
|
@ -1,68 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
import subprocess
|
||||
from subprocess import check_output, CalledProcessError
|
||||
import time
|
||||
import argparse
|
||||
import os, sys
|
||||
sys.path.append(os.path.join(sys.path[0], os.path.dirname(os.getcwd())))
|
||||
sys.path.append(os.path.join(sys.path[0], os.getcwd()))
|
||||
import sql
|
||||
import signal
|
||||
|
||||
class GracefulKiller:
|
||||
kill_now = False
|
||||
def __init__(self):
|
||||
signal.signal(signal.SIGINT, self.exit_gracefully)
|
||||
signal.signal(signal.SIGTERM, self.exit_gracefully)
|
||||
|
||||
def exit_gracefully(self,signum, frame):
|
||||
self.kill_now = True
|
||||
|
||||
def main(serv, port):
|
||||
port = str(port)
|
||||
firstrun = True
|
||||
readstats = ""
|
||||
killer = GracefulKiller()
|
||||
|
||||
while True:
|
||||
try:
|
||||
cmd = "echo show info | nc "+serv+" "+port+" |grep -e 'CurrConns\|CurrSslConns\|MaxSessRate:\|SessRate:'|awk '{print $2}'"
|
||||
readstats = subprocess.check_output([cmd], shell=True)
|
||||
except CalledProcessError as e:
|
||||
print("Command error")
|
||||
except OSError as e:
|
||||
print(e)
|
||||
sys.exit()
|
||||
|
||||
try:
|
||||
readstats = readstats.decode(encoding='UTF-8')
|
||||
metric = readstats.splitlines()
|
||||
metrics = []
|
||||
for i in range(0,len(metric)):
|
||||
metrics.append(metric[i])
|
||||
|
||||
sql.insert_mentrics(serv, metrics[0], metrics[1], metrics[2], metrics[3])
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
|
||||
time.sleep(30)
|
||||
|
||||
if killer.kill_now:
|
||||
break
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Metrics HAProxy service.', prog='metrics_worker.py', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
|
||||
parser.add_argument('IP', help='Start get metrics from HAProxy service at this ip', nargs='?', type=str)
|
||||
parser.add_argument('--port', help='Start get metrics from HAProxy service at this port', nargs='?', default=1999, type=int)
|
||||
|
||||
args = parser.parse_args()
|
||||
if args.IP is None:
|
||||
parser.print_help()
|
||||
import sys
|
||||
sys.exit()
|
||||
else:
|
||||
try:
|
||||
main(args.IP, args.port)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
|
@ -1,9 +0,0 @@
|
|||
/var/www/haproxy-wi/log/metrics-error.log {
|
||||
daily
|
||||
rotate 10
|
||||
missingok
|
||||
notifempty
|
||||
create 0644 apache apache
|
||||
dateext
|
||||
sharedscripts
|
||||
}
|
|
@ -1,2 +0,0 @@
|
|||
if $programname startswith 'metrics' then /var/www/haproxy-wi/log/metrics-error.log
|
||||
& stop
|
|
@ -1,19 +0,0 @@
|
|||
[Unit]
|
||||
Description=Haproxy metrics
|
||||
After=syslog.target network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/var/www/haproxy-wi/app/
|
||||
ExecStart=/var/www/haproxy-wi/app/tools/metrics_master.py
|
||||
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=metrics
|
||||
|
||||
RestartSec=2s
|
||||
Restart=on-failure
|
||||
TimeoutStopSec=1s
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -222,25 +222,7 @@ $( function() {
|
|||
} );
|
||||
});
|
||||
$('#runtimeapitable').submit(function() {
|
||||
$.ajax( {
|
||||
url: "options.py",
|
||||
data: {
|
||||
serv: $('#table_serv_select').val(),
|
||||
table_select: $('#table_select').val(),
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function( data ) {
|
||||
if (data.indexOf('error:') != '-1') {
|
||||
toastr.error(data);
|
||||
} else {
|
||||
$("#ajaxtable").html(data);
|
||||
$( "input[type=submit], button" ).button();
|
||||
$.getScript("/inc/fontawesome.min.js");
|
||||
FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false };
|
||||
}
|
||||
}
|
||||
} );
|
||||
getTable();
|
||||
return false;
|
||||
});
|
||||
$('#runtimeapilist').submit(function() {
|
||||
|
@ -309,6 +291,45 @@ function deleteTableEntry(id, table, ip) {
|
|||
}
|
||||
} );
|
||||
}
|
||||
function clearTable(table) {
|
||||
$.ajax( {
|
||||
url: "options.py",
|
||||
data: {
|
||||
serv: $('#table_serv_select').val(),
|
||||
table_for_clear: table,
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function( data ) {
|
||||
if (data.indexOf('error: ') != '-1') {
|
||||
toastr.error(data);
|
||||
} else {
|
||||
getTable();
|
||||
}
|
||||
}
|
||||
} );
|
||||
}
|
||||
function getTable() {
|
||||
$.ajax( {
|
||||
url: "options.py",
|
||||
data: {
|
||||
serv: $('#table_serv_select').val(),
|
||||
table_select: $('#table_select').val(),
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function( data ) {
|
||||
if (data.indexOf('error:') != '-1') {
|
||||
toastr.error(data);
|
||||
} else {
|
||||
$("#ajaxtable").html(data);
|
||||
$( "input[type=submit], button" ).button();
|
||||
$.getScript("/inc/fontawesome.min.js");
|
||||
FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false };
|
||||
}
|
||||
}
|
||||
} );
|
||||
}
|
||||
function getList() {
|
||||
$.ajax( {
|
||||
url: "options.py",
|
||||
|
|
|
@ -823,7 +823,6 @@ $( function() {
|
|||
success: function( data ) {
|
||||
if (data.indexOf('ok') != '-1') {
|
||||
window.location.replace(ref);
|
||||
console.log(data)
|
||||
} else if (data.indexOf('disabled') != '-1') {
|
||||
$('.alert').show();
|
||||
$('.alert').html(data);
|
||||
|
|
19
inc/waf.js
19
inc/waf.js
|
@ -109,20 +109,29 @@ function waf_rules_en(id) {
|
|||
if ($('#rule_id-'+id).is(':checked')) {
|
||||
enable = '1';
|
||||
}
|
||||
var serv = findGetParameter('serv')
|
||||
console.log(serv)
|
||||
console.log(id)
|
||||
console.log(enable)
|
||||
$.ajax( {
|
||||
url: "options.py",
|
||||
data: {
|
||||
waf_rule_id: id,
|
||||
waf_en: enable,
|
||||
serv: serv,
|
||||
token: $('#token').val()
|
||||
},
|
||||
type: "POST",
|
||||
success: function( data ) {
|
||||
toastr.info('Do not forget restart WAF service');
|
||||
$( '#rule-'+id ).addClass( "update", 1000 );
|
||||
setTimeout(function() {
|
||||
$( '#rule-'+id ).removeClass( "update" );
|
||||
}, 2500 );
|
||||
if (data.indexOf('sed:') != '-1' || data.indexOf('error: ') != '-1' ) {
|
||||
toastr.error(data);
|
||||
} else {
|
||||
toastr.info('Do not forget restart WAF service');
|
||||
$('#rule-' + id).addClass("update", 1000);
|
||||
setTimeout(function () {
|
||||
$('#rule-' + id).removeClass("update");
|
||||
}, 2500);
|
||||
}
|
||||
}
|
||||
} );
|
||||
}
|
Loading…
Reference in New Issue