Pavel Loginov 2021-06-11 21:18:33 +06:00
parent 7d4e504337
commit 6e4e2520e5
7 changed files with 88 additions and 45 deletions

View File

@ -383,6 +383,12 @@ def get_sections(config, **kwargs):
line = line.split(';')[0]
line = line.strip()
return_config.append(line)
elif kwargs.get('service') == 'keepalived':
import re
ip_pattern = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
find_ip = re.findall(ip_pattern,line)
if find_ip:
return_config.append(find_ip[0])
else:
if (
line.startswith('listen') or
@ -915,7 +921,7 @@ def show_haproxy_log(serv, rows=10, waf='0', grep=None, hour='00', minut='00', h
else:
local_path_logs = sql.get_setting('local_path_logs')
commands = ["sudo cat %s| awk '$3>\"%s:00\" && $3<\"%s:00\"' |tail -%s %s %s" % (local_path_logs, date, date1, rows, grep_act, exgrep_act)]
syslog_server = serv
syslog_server = serv
else:
commands = ["sudo cat /var/log/%s/syslog.log | sed '/ %s:00/,/ %s:00/! d' |tail -%s %s %s %s" % (serv, date, date1, rows, grep_act, grep, exgrep_act)]
syslog_server = sql.get_setting('syslog_server')
@ -1261,22 +1267,22 @@ def check_service(serv, service_name):
def get_services_status():
services = []
services_name = {'checker_haproxy': 'Checker backends master service',
'keep_alive': 'Auto start service',
'metrics_haproxy': 'Metrics master service',
'portscanner': 'Port scanner service',
'smon': 'Simple monitoring network ports',
services_name = {'roxy-wi-checker': 'Checker backends master service',
'roxy-wi-keep_alive': 'Auto start service',
'roxy-wi-metrics': 'Metrics master service',
'roxy-wi-portscanner': 'Port scanner service',
'roxy-wi-smon': 'Simple monitoring network ports',
'prometheus': 'Prometheus service',
'grafana-server': 'Grafana service',
'fail2ban': 'Fail2ban service'}
for s, v in services_name.items():
cmd = "systemctl is-active %s" % s
status, stderr = subprocess_execute(cmd)
if s != 'keep_alive':
if s != 'roxy-wi-keep_alive':
service_name = s.split('_')[0]
else:
service_name = s
cmd = "rpm --query haproxy-wi-" + service_name + "-* |awk -F\"" + service_name + "\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'"
cmd = "rpm --query " + service_name + "-* |awk -F\"" + service_name + "\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'"
service_ver, stderr = subprocess_execute(cmd)
try:
@ -1285,3 +1291,17 @@ def get_services_status():
services.append([s, status, v, ''])
return services
def is_file_exists(serv: str, file: str):
cmd = ['[ -f ' + file + ' ] && echo yes || echo no']
out = ssh_command(serv, cmd)
return True if 'yes' in out else False
def is_service_active(serv: str, service_name: str):
cmd = ['systemctl is-active ' + service_name]
out = ssh_command(serv, cmd)
return True if 'active' in out else False

View File

@ -392,8 +392,8 @@ if form.getvalue('action_hap') is not None and serv is not None:
commands = ["sudo systemctl %s %s" % (action, haproxy_service_name)]
funct.ssh_command(serv, commands)
funct.logging(serv, 'HAProxy was ' + action + 'ed', haproxywi=1, login=1)
print("success: HAProxy was %s" % action)
funct.logging(serv, 'HAProxy has been ' + action + 'ed', haproxywi=1, login=1)
print("success: HAProxy has been %s" % action)
else:
print("error: Bad config, check please")
@ -402,8 +402,16 @@ if form.getvalue('action_nginx') is not None and serv is not None:
commands = ["sudo systemctl %s nginx" % action]
funct.ssh_command(serv, commands)
funct.logging(serv, 'Nginx was ' + action + 'ed', haproxywi=1, login=1)
print("success: Nginx was %s" % action)
funct.logging(serv, 'Nginx has been ' + action + 'ed', haproxywi=1, login=1)
print("success: Nginx has been %s" % action)
if form.getvalue('action_keepalived') is not None and serv is not None:
action = form.getvalue('action_keepalived')
commands = ["sudo systemctl %s keepalived" % action]
funct.ssh_command(serv, commands)
funct.logging(serv, 'Keepalived has been ' + action + 'ed', haproxywi=1, login=1)
print("success: Keepalived has been %s" % action)
if form.getvalue('action_waf') is not None and serv is not None:
serv = form.getvalue('serv')
@ -429,16 +437,22 @@ if act == "overviewHapserverBackends":
env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
template = env.get_template('haproxyservers_backends.html')
service = form.getvalue('service')
if service == 'haproxy':
configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir')
format_file = 'cfg'
elif service == 'nginx':
configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir')
format_file = 'conf'
elif service == 'keepalived':
configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir')
format_file = 'conf'
try:
sections = funct.get_sections(configs_dir + funct.get_files(dir=configs_dir, format=format_file)[0], service=service)
except Exception as e:
funct.logging('localhost', str(e), haproxywi=1)
try:
cfg = configs_dir + serv + "-" + funct.get_data('config') + '.' + format_file
except Exception as e:
@ -446,6 +460,8 @@ if act == "overviewHapserverBackends":
try:
if service == 'nginx':
error = funct.get_config(serv, cfg, nginx=1)
elif service == 'keepalived':
error = funct.get_config(serv, cfg, keepalived=1)
else:
error = funct.get_config(serv, cfg)
except Exception as e:
@ -891,6 +907,8 @@ if act == "showCompareConfigs":
if form.getvalue('service') == 'nginx':
return_files = funct.get_files(funct.get_config_var('configs', 'nginx_save_configs_dir'), 'conf')
elif form.getvalue('service') == 'keepalived':
return_files = funct.get_files(funct.get_config_var('configs', 'kp_save_configs_dir'), 'conf')
else:
return_files = funct.get_files()
@ -904,6 +922,8 @@ if serv is not None and form.getvalue('right') is not None:
right = form.getvalue('right')
if form.getvalue('service') == 'nginx':
configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir')
elif form.getvalue('service') == 'keepalived':
configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir')
else:
configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir')
cmd = 'diff -pub %s%s %s%s' % (configs_dir, left, configs_dir, right)
@ -923,11 +943,12 @@ if serv is not None and act == "configShow":
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
user_uuid = cookie.get('uuid')
role_id = sql.get_user_role_by_uuid(user_uuid.value)
service = form.getvalue('service')
if form.getvalue('service') == 'keepalived':
if service == 'keepalived':
configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir')
cfg = '.conf'
elif form.getvalue('service') == 'nginx':
elif service == 'nginx':
configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir')
cfg = '.conf'
else:
@ -936,8 +957,10 @@ if serv is not None and act == "configShow":
if form.getvalue('configver') is None:
cfg = configs_dir + serv + "-" + funct.get_data('config') + cfg
if form.getvalue('service') == 'nginx':
if service == 'nginx':
funct.get_config(serv, cfg, nginx=1)
elif service == 'keepalived':
funct.get_config(serv, cfg, keepalived=1)
else:
funct.get_config(serv, cfg)
else:
@ -959,7 +982,7 @@ if serv is not None and act == "configShow":
serv=serv,
configver=form.getvalue('configver'),
role=role_id,
service=form.getvalue('service'),
service=service,
is_serv_protected=is_serv_protected)
print(template)
@ -1351,7 +1374,7 @@ if form.getvalue('installwaf'):
if form.getvalue('update_haproxy_wi'):
service = form.getvalue('service')
services = ['checker_haproxy', 'haproxy-wi', 'keep_alive', 'smon', 'metrics_haproxy']
services = ['roxy-wi-checker', 'haproxy-wi', 'roxy-wi-keep_alive', 'roxy-wi-smon', 'roxy-wi-metrics']
if service not in services:
print('error: ' + service + ' is not part of Roxy-WI')
sys.exit()

View File

@ -72,15 +72,15 @@ try:
prometheus, stderr = funct.subprocess_execute(cmd)
host = os.environ.get('HTTP_HOST', '')
cmd = "systemctl is-active metrics_haproxy"
cmd = "systemctl is-active roxy-wi-metrics"
metrics_master, stderr = funct.subprocess_execute(cmd)
cmd = "systemctl is-active checker_haproxy"
cmd = "systemctl is-active roxy-wi-checker"
checker_master, stderr = funct.subprocess_execute(cmd)
cmd = "systemctl is-active keep_alive"
cmd = "systemctl is-active roxy-wi-keep_alive"
keep_alive, stderr = funct.subprocess_execute(cmd)
cmd = "systemctl is-active smon"
cmd = "systemctl is-active roxy-wi-smon"
smon, stderr = funct.subprocess_execute(cmd)
cmd = "systemctl is-active portscanner"
cmd = "systemctl is-active roxy-wi-portscanner"
port_scanner, stderr = funct.subprocess_execute(cmd)
except Exception as e:

View File

@ -22,38 +22,38 @@
</td>
</tr>
{% for s in services %}
{% if s.0 == 'smon' or s.0 == 'checker_haproxy' or s.0 == 'keep_alive' or s.0 == 'metrics_haproxy' or s.0 == 'portscanner' %}
{% if s.0 == 'roxy-wi-smon' or s.0 == 'roxy-wi-checker' or s.0 == 'roxy-wi-keep_alive' or s.0 == 'roxy-wi-metrics' or s.0 == 'roxy-wi-portscanner' %}
<tr>
{% set is_need_update = 0 %}
{% if s.0 == 'smon' %}
{% if s.0 == 'roxy-wi-smon' %}
{% set service_name = 'SMON' %}
{% set service_link = 'smon' %}
{% set desc_link = 'https://haproxy-wi.org/services.py?service=smon' %}
{% if s.3|float < smon_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'checker_haproxy' %}
{% elif s.0 == 'roxy-wi-checker' %}
{% set service_name = 'Checker' %}
{% set service_link = 'checker' %}
{% set desc_link = 'https://haproxy-wi.org/services.py?service=checker' %}
{% if s.3|float < checker_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'keep_alive' %}
{% elif s.0 == 'roxy-wi-keep_alive' %}
{% set service_name = 'Auto start' %}
{% set service_link = 'auto_start' %}
{% set desc_link = 'https://haproxy-wi.org/services.py?service=auto_start' %}
{% if s.3|float < keep_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'metrics_haproxy' %}
{% elif s.0 == 'roxy-wi-metrics' %}
{% set service_name = 'Metrics' %}
{% set service_link = 'metrics' %}
{% set desc_link = 'https://haproxy-wi.org/services.py?service=metrics' %}
{% if s.3|float < metrics_ver|float %}
{% set is_need_update = 1 %}
{% endif %}
{% elif s.0 == 'portscanner' %}
{% elif s.0 == 'roxy-wi-portscanner' %}
{% set service_name = 'Port scanner' %}
{% set service_link = 'portscanner' %}
{% set desc_link = 'https://haproxy-wi.org/services.py?service={{service_link}}' %}
@ -71,15 +71,15 @@
</td>
<td class="padding10">
<b>
{% if s.0 == 'smon' %}
{% if s.0 == 'roxy-wi-smon' %}
{{smon_ver}}
{% elif s.0 == 'checker_haproxy' %}
{% elif s.0 == 'roxy-wi-checker' %}
{{checker_ver}}
{% elif s.0 == 'keep_alive' %}
{% elif s.0 == 'roxy-wi-keep_alive' %}
{{keep_ver}}
{% elif s.0 == 'metrics_haproxy' %}
{% elif s.0 == 'roxy-wi-metrics' %}
{{metrics_ver}}
{% elif s.0 == 'portscanner' %}
{% elif s.0 == 'roxy-wi-portscanner' %}
{{portscanner_ver}}
{% endif %}
</b>

View File

@ -7,16 +7,16 @@
<input name="prefix" class="prefix form-control" title="servers prefix" size="3" placeholder="web" style="display: none;">
<input name="template-number" class="prefix form-control" title="servers num" value="3" type="number" style="width: 35px; display: none;">
<input name="servers" required title="Backend IP" size=14 placeholder="xxx.xxx.xxx.xxx" class="form-control">:
<input name="server_port" required title="Backend IP" size=3 placeholder="yyy" class="form-control add_server_number" type="number">
<input name="server_port" required title="Backend port" size=3 placeholder="yyy" class="form-control add_server_number" type="number">
<input name="server_maxconn" required title="Maxconn. Default 200" size=5 value="200" class="form-control add_server_number" type="number">
<span class="send_proxy"></span>
<br />
<input name="servers" title="Backend port" size=14 placeholder="xxx.xxx.xxx.xxx" class="form-control second-server"><span class="second-server">:</span>
<input name="servers" title="Backend IP" size=14 placeholder="xxx.xxx.xxx.xxx" class="form-control second-server"><span class="second-server">:</span>
<input name="server_port" title="Backend port" size=3 placeholder="yyy" class="form-control second-server add_server_number" type="number">
<input name="server_maxconn" title="Maxconn. Default 200" size=5 value="200" class="form-control add_server_number" type="number">
<span class="send_proxy"></span>
<br />
<input name="servers" title="Backend port" size=14 placeholder="xxx.xxx.xxx.xxx" class="form-control second-server"><span class="second-server">:</span>
<input name="servers" title="Backend IP" size=14 placeholder="xxx.xxx.xxx.xxx" class="form-control second-server"><span class="second-server">:</span>
<input name="server_port" title="Backend port" size=3 placeholder="yyy" class="form-control second-server add_server_number" type="number">
<input name="server_maxconn" required title="Maxconn. Default 200" size=5 value="200" class="form-control add_server_number" type="number">
<span class="send_proxy"></span>

View File

@ -5,23 +5,23 @@
<tr class="overviewHead">
<th class="padding10 first-collumn">Hostname</th>
<th class="ip-field" style="width: 5%">IP</th>
<th class="checkbox-head" style="width: 5%"><span title="SSH port">Port</span></th>
<th class="checkbox-head" style="width: 5%" class="help_cursor"><span title="SSH port">Port</span></th>
{% if page != "servers.py" %}
<th style="width: 10%">Group</th>
{% endif %}
<th class="checkbox-head" style="width: 5%">Enabled</th>
<th style="width: 5%; padding-left: 5px;">
<th style="width: 5%; padding-left: 5px;" class="help_cursor">
<span title="Virtual IP, something like VRRP">Virt</span>
</th>
<th class="checkbox-head" style="width: 5%">HAProxy</th>
<th style="width: 5%">Nginx</th>
<th style="width: 10%;">
<th style="width: 10%;" class="help_cursor">
<span title="If the server has a firewall enabled, enable this option">Firewalld</span>
</th>
<th class="checkbox-head" style="width: 5%">
<th class="checkbox-head" style="width: 5%" class="help_cursor">
<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%">
<th style="width: 10%" class="help_cursor">
<span title="Actions with the master config will automatically apply on the slave">Slave for</span>
</th>
<th class="cred-field">Credentials</th>

View File

@ -1,15 +1,15 @@
<table id="ssh_enable_table" class="overview">
<tr class="overviewHead" style="width: 50%;">
<td class="padding10 first-collumn" style="width: 15%;">
<td class="padding10 first-collumn" style="width: 15%;" class="help_cursor">
<span title="It's just name alias. This alias will be use in 'Servers' page for choose credentials">Name<span>
</td>
<td class="padding10 first-collumn" style="width: 25%;">
<td class="padding10 first-collumn" style="width: 25%;" class="help_cursor">
<span title="If it is enabled, the key will be used, if turned off - the password. Do not forget to download the keys to all servers or install the sudo without a password">SSH key</span>
</td>
{% if page != "servers.py" %}
<td style="width: 25%;">Group</td>
{% endif %}
<td style="width: 100%;">
<td style="width: 100%;" class="help_cursor">
<span title="Enter SSH user name. If SSH key disabled, enter password for SSH user">Credentials</span>
</td>
<td></td>
@ -63,7 +63,7 @@
<table id="ssh_key">
<tr class="overviewHead" style="width: 50%;">
<td class="padding10 first-collumn" style="width: 25%;">Upload SSH Key</td>
<td>
<td class="help_cursor">
<span title="Private key. Note: The public key must be pre-installed on all servers to which you plan to connect">Key</span>
</td>
<td></td>