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.split(';')[0]
line = line.strip() line = line.strip()
return_config.append(line) 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: else:
if ( if (
line.startswith('listen') or line.startswith('listen') or
@ -1261,22 +1267,22 @@ def check_service(serv, service_name):
def get_services_status(): def get_services_status():
services = [] services = []
services_name = {'checker_haproxy': 'Checker backends master service', services_name = {'roxy-wi-checker': 'Checker backends master service',
'keep_alive': 'Auto start service', 'roxy-wi-keep_alive': 'Auto start service',
'metrics_haproxy': 'Metrics master service', 'roxy-wi-metrics': 'Metrics master service',
'portscanner': 'Port scanner service', 'roxy-wi-portscanner': 'Port scanner service',
'smon': 'Simple monitoring network ports', 'roxy-wi-smon': 'Simple monitoring network ports',
'prometheus': 'Prometheus service', 'prometheus': 'Prometheus service',
'grafana-server': 'Grafana service', 'grafana-server': 'Grafana service',
'fail2ban': 'Fail2ban service'} 'fail2ban': 'Fail2ban service'}
for s, v in services_name.items(): for s, v in services_name.items():
cmd = "systemctl is-active %s" % s cmd = "systemctl is-active %s" % s
status, stderr = subprocess_execute(cmd) status, stderr = subprocess_execute(cmd)
if s != 'keep_alive': if s != 'roxy-wi-keep_alive':
service_name = s.split('_')[0] service_name = s.split('_')[0]
else: else:
service_name = s 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) service_ver, stderr = subprocess_execute(cmd)
try: try:
@ -1285,3 +1291,17 @@ def get_services_status():
services.append([s, status, v, '']) services.append([s, status, v, ''])
return services 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)] commands = ["sudo systemctl %s %s" % (action, haproxy_service_name)]
funct.ssh_command(serv, commands) funct.ssh_command(serv, commands)
funct.logging(serv, 'HAProxy was ' + action + 'ed', haproxywi=1, login=1) funct.logging(serv, 'HAProxy has been ' + action + 'ed', haproxywi=1, login=1)
print("success: HAProxy was %s" % action) print("success: HAProxy has been %s" % action)
else: else:
print("error: Bad config, check please") 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] commands = ["sudo systemctl %s nginx" % action]
funct.ssh_command(serv, commands) funct.ssh_command(serv, commands)
funct.logging(serv, 'Nginx was ' + action + 'ed', haproxywi=1, login=1) funct.logging(serv, 'Nginx has been ' + action + 'ed', haproxywi=1, login=1)
print("success: Nginx was %s" % action) 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: if form.getvalue('action_waf') is not None and serv is not None:
serv = form.getvalue('serv') serv = form.getvalue('serv')
@ -429,16 +437,22 @@ if act == "overviewHapserverBackends":
env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
template = env.get_template('haproxyservers_backends.html') template = env.get_template('haproxyservers_backends.html')
service = form.getvalue('service') service = form.getvalue('service')
if service == 'haproxy': if service == 'haproxy':
configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir')
format_file = 'cfg' format_file = 'cfg'
elif service == 'nginx': elif service == 'nginx':
configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir') configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir')
format_file = 'conf' format_file = 'conf'
elif service == 'keepalived':
configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir')
format_file = 'conf'
try: try:
sections = funct.get_sections(configs_dir + funct.get_files(dir=configs_dir, format=format_file)[0], service=service) sections = funct.get_sections(configs_dir + funct.get_files(dir=configs_dir, format=format_file)[0], service=service)
except Exception as e: except Exception as e:
funct.logging('localhost', str(e), haproxywi=1) funct.logging('localhost', str(e), haproxywi=1)
try: try:
cfg = configs_dir + serv + "-" + funct.get_data('config') + '.' + format_file cfg = configs_dir + serv + "-" + funct.get_data('config') + '.' + format_file
except Exception as e: except Exception as e:
@ -446,6 +460,8 @@ if act == "overviewHapserverBackends":
try: try:
if service == 'nginx': if service == 'nginx':
error = funct.get_config(serv, cfg, nginx=1) error = funct.get_config(serv, cfg, nginx=1)
elif service == 'keepalived':
error = funct.get_config(serv, cfg, keepalived=1)
else: else:
error = funct.get_config(serv, cfg) error = funct.get_config(serv, cfg)
except Exception as e: except Exception as e:
@ -891,6 +907,8 @@ if act == "showCompareConfigs":
if form.getvalue('service') == 'nginx': if form.getvalue('service') == 'nginx':
return_files = funct.get_files(funct.get_config_var('configs', 'nginx_save_configs_dir'), 'conf') 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: else:
return_files = funct.get_files() 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') right = form.getvalue('right')
if form.getvalue('service') == 'nginx': if form.getvalue('service') == 'nginx':
configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir') 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: else:
configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir')
cmd = 'diff -pub %s%s %s%s' % (configs_dir, left, configs_dir, right) 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")) cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
user_uuid = cookie.get('uuid') user_uuid = cookie.get('uuid')
role_id = sql.get_user_role_by_uuid(user_uuid.value) 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') configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir')
cfg = '.conf' cfg = '.conf'
elif form.getvalue('service') == 'nginx': elif service == 'nginx':
configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir') configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir')
cfg = '.conf' cfg = '.conf'
else: else:
@ -936,8 +957,10 @@ if serv is not None and act == "configShow":
if form.getvalue('configver') is None: if form.getvalue('configver') is None:
cfg = configs_dir + serv + "-" + funct.get_data('config') + cfg cfg = configs_dir + serv + "-" + funct.get_data('config') + cfg
if form.getvalue('service') == 'nginx': if service == 'nginx':
funct.get_config(serv, cfg, nginx=1) funct.get_config(serv, cfg, nginx=1)
elif service == 'keepalived':
funct.get_config(serv, cfg, keepalived=1)
else: else:
funct.get_config(serv, cfg) funct.get_config(serv, cfg)
else: else:
@ -959,7 +982,7 @@ if serv is not None and act == "configShow":
serv=serv, serv=serv,
configver=form.getvalue('configver'), configver=form.getvalue('configver'),
role=role_id, role=role_id,
service=form.getvalue('service'), service=service,
is_serv_protected=is_serv_protected) is_serv_protected=is_serv_protected)
print(template) print(template)
@ -1351,7 +1374,7 @@ if form.getvalue('installwaf'):
if form.getvalue('update_haproxy_wi'): if form.getvalue('update_haproxy_wi'):
service = form.getvalue('service') 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: if service not in services:
print('error: ' + service + ' is not part of Roxy-WI') print('error: ' + service + ' is not part of Roxy-WI')
sys.exit() sys.exit()

View File

@ -72,15 +72,15 @@ try:
prometheus, stderr = funct.subprocess_execute(cmd) prometheus, stderr = funct.subprocess_execute(cmd)
host = os.environ.get('HTTP_HOST', '') 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) 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) 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) 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) 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) port_scanner, stderr = funct.subprocess_execute(cmd)
except Exception as e: except Exception as e:

View File

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

View File

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

View File

@ -1,15 +1,15 @@
<table id="ssh_enable_table" class="overview"> <table id="ssh_enable_table" class="overview">
<tr class="overviewHead" style="width: 50%;"> <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> <span title="It's just name alias. This alias will be use in 'Servers' page for choose credentials">Name<span>
</td> </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> <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> </td>
{% if page != "servers.py" %} {% if page != "servers.py" %}
<td style="width: 25%;">Group</td> <td style="width: 25%;">Group</td>
{% endif %} {% 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> <span title="Enter SSH user name. If SSH key disabled, enter password for SSH user">Credentials</span>
</td> </td>
<td></td> <td></td>
@ -63,7 +63,7 @@
<table id="ssh_key"> <table id="ssh_key">
<tr class="overviewHead" style="width: 50%;"> <tr class="overviewHead" style="width: 50%;">
<td class="padding10 first-collumn" style="width: 25%;">Upload SSH Key</td> <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> <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></td> <td></td>