Pavel Loginov 2020-04-21 23:07:54 +02:00
parent d6f79bff7b
commit 2e331a4582
11 changed files with 175 additions and 76 deletions

View File

@ -432,7 +432,7 @@ def update_db_v_42(**kwargs):
def update_ver(**kwargs):
con, cur = get_cur()
sql = """update version set version = '4.2.2.0'; """
sql = """update version set version = '4.2.3.0'; """
try:
cur.execute(sql)
con.commit()

View File

@ -102,7 +102,13 @@ def telegram_send_mess(mess, **kwargs):
for telegram in telegrams:
token_bot = telegram[1]
channel_name = telegram[2]
if token_bot == '' or channel_name == '':
mess = " Fatal: Can't send message. Add Telegram chanel before use alerting at this servers group"
print(mess)
logging('localhost', mess, haproxywi=1)
sys.exit()
if proxy is not None and proxy != '' and proxy != 'None':
apihelper.proxy = {'https': proxy}
try:
@ -280,26 +286,33 @@ def diff_config(oldcfg, cfg):
pass
def get_sections(config):
def get_sections(config, **kwargs):
record = False
return_config = list()
with open(config, 'r') as f:
for line in f:
if (
line.startswith('listen') or
line.startswith('frontend') or
line.startswith('backend') or
line.startswith('cache') or
line.startswith('defaults') or
line.startswith('global') or
line.startswith('#HideBlockEnd') or
line.startswith('#HideBlockStart') or
line.startswith('peers') or
line.startswith('resolvers') or
line.startswith('userlist')
):
if kwargs.get('service') == 'nginx':
if 'server_name' in line:
line = line.split('server_name')[1]
line = line.split(';')[0]
line = line.strip()
return_config.append(line)
else:
if (
line.startswith('listen') or
line.startswith('frontend') or
line.startswith('backend') or
line.startswith('cache') or
line.startswith('defaults') or
line.startswith('global') or
line.startswith('#HideBlockEnd') or
line.startswith('#HideBlockStart') or
line.startswith('peers') or
line.startswith('resolvers') or
line.startswith('userlist')
):
line = line.strip()
return_config.append(line)
return return_config
@ -834,22 +847,21 @@ def get_files(dir = get_config_var('configs', 'haproxy_save_configs_dir'), forma
file = set()
return_files = set()
i = 0
for files in glob.glob(os.path.join(dir,'*.'+format)):
for files in sorted(glob.glob(os.path.join(dir,'*.'+format))):
if format == 'log':
file += [(i, files.split('/')[5])]
else:
else:
file.add(files.split('/')[-1])
i += 1
files = sorted(file, reverse=True)
files = file
if format == 'cfg' or format == 'conf':
for file in files:
for file in files:
ip = file.split("-")
if serv == ip[0]:
return_files.add(file)
return_files.add(file)
return sorted(return_files, reverse=True)
else:
return files
return file
def get_key(item):

View File

@ -136,26 +136,35 @@ if act == "overviewHapserverBackends":
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
template = env.get_template('haproxyservers_backends.html')
hap_configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir')
service = form.getvalue('service')
if service == 'haproxy':
configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir')
format = 'cfg'
elif service == 'nginx':
configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir')
format = 'conf'
try:
sections = funct.get_sections(hap_configs_dir +funct.get_files()[0])
except:
sections = funct.get_sections(configs_dir+funct.get_files(dir=configs_dir, format=format)[0], service=service)
except Exception as e:
funct.logging('localhost', str(e), haproxywi=1)
try:
cfg = hap_configs_dir + serv + "-" + funct.get_data('config') + ".cfg"
cfg = configs_dir + serv + "-" + funct.get_data('config') + '.'+format
except:
funct.logging('localhost', ' Cannot generate cfg path', haproxywi=1)
try:
error = funct.get_config(serv, cfg)
if service == 'nginx':
error = funct.get_config(serv, cfg, nginx=1)
else:
error = funct.get_config(serv, cfg)
except:
funct.logging('localhost', ' Cannot download config', haproxywi=1)
try:
sections = funct.get_sections(cfg)
sections = funct.get_sections(cfg, service=service)
except:
funct.logging('localhost', ' Cannot get sections from config file', haproxywi=1)
sections = 'Cannot get backends'
template = template.render(backends=sections, serv=serv)
template = template.render(backends=sections, serv=serv, service=service)
print(template)
@ -264,20 +273,27 @@ if act == "overviewwaf":
if act == "overviewServers":
import asyncio
async def async_get_overviewServers(serv1, serv2):
async def async_get_overviewServers(serv1, serv2, service):
server_status = ()
commands = [ "top -u haproxy -b -n 1" ]
cmd = 'echo "show info" |nc %s %s -w 1|grep -e "Ver\|CurrConns\|Maxco\|MB\|Uptime:"' % (serv2, sql.get_setting('haproxy_sock_port'))
out = funct.subprocess_execute(cmd)
out1 = ""
if service == 'haproxy':
commands = [ "top -u haproxy -b -n 1" ]
else:
commands = [ "top -u nginx -b -n 1" ]
for k in out:
if "Ncat:" not in k:
for r in k:
out1 += r
out1 += "<br />"
else:
out1 = "Can\'t connect to HAproxy"
if service == 'haproxy':
cmd = 'echo "show info" |nc %s %s -w 1|grep -e "Ver\|CurrConns\|Maxco\|MB\|Uptime:"' % (serv2, sql.get_setting('haproxy_sock_port'))
out = funct.subprocess_execute(cmd)
out1 = ""
for k in out:
if "Ncat:" not in k:
for r in k:
out1 += r
out1 += "<br />"
else:
out1 = "Can\'t connect to HAproxy"
else:
out1 = ''
server_status = (serv1,serv2, out1, funct.ssh_command(serv2, commands))
return server_status
@ -292,19 +308,20 @@ if act == "overviewServers":
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
user_id = cookie.get('uuid')
role = sql.get_user_role_by_uuid(user_id.value)
futures = [async_get_overviewServers(kwargs.get('server1'), kwargs.get('server2'))]
futures = [async_get_overviewServers(kwargs.get('server1'), kwargs.get('server2'), kwargs.get('service'))]
for i, future in enumerate(asyncio.as_completed(futures)):
result = await future
servers.append(result)
servers_sorted = sorted(servers, key=funct.get_key)
template = template.render(service_status=servers_sorted, role=role, id=kwargs.get('id'))
template = template.render(service_status=servers_sorted, role=role, id=kwargs.get('id'), service_page=service)
print(template)
id = form.getvalue('id')
name = form.getvalue('name')
service = form.getvalue('service')
ioloop = asyncio.get_event_loop()
ioloop.run_until_complete(get_runner_overviewServers(server1=name, server2=serv, id=id))
ioloop.run_until_complete(get_runner_overviewServers(server1=name, server2=serv, id=id, service=service))
ioloop.close()

View File

@ -33,6 +33,17 @@ try:
grafana, stderr = funct.subprocess_execute(cmd)
cmd = "ps ax |grep 'prometheus ' |grep -v grep|wc -l"
prometheus, stderr = funct.subprocess_execute(cmd)
is_checker_workers = sql.select_alert()
i = 0
for s in sql.select_alert():
i += 1
is_checker_worker = i
is_metrics_workers = sql.select_servers_metrics_for_master()
i = 0
for s in is_metrics_workers:
i += 1
is_metrics_worker = i
except:
role = ''
user = ''
@ -51,6 +62,9 @@ except:
haproxy_wi_log = ''
servers = ''
stderr = ''
is_checker_worker = ''
is_metrics_worker = ''
token = ''
template = template.render(h2 = 1,
@ -79,5 +93,7 @@ template = template.render(h2 = 1,
versions = funct.versions(),
haproxy_wi_log = funct.haproxy_wi_log(),
servers = servers,
is_checker_worker = is_checker_worker,
is_metrics_worker = is_metrics_worker,
token = token)
print(template)

View File

@ -32,4 +32,27 @@
- dashboard_id: 11879
revision_id: 3
datasource: prometheus
tasks:
- name: populate service facts
service_facts:
- name: Open stat port for firewalld
firewalld:
port: "{{ item }}/tcp"
state: enabled
permanent: yes
immediate: yes
ignore_errors: yes
no_log: True
debugger: never
when: (ansible_facts['os_family'] == "RedHat" or ansible_facts['os_family'] == 'CentOS') and ansible_facts.services["firewalld.service"]['state'] == "running"
with_items: [ "3000", "9090" ]
- name: Open stat port for iptables
iptables:
chain: INPUT
destination_port: "{{ item }}"
jump: ACCEPT
protocol: tcp
ignore_errors: yes
with_items: [ "3000", "9090" ]

View File

@ -7,8 +7,12 @@
{{backends}}
{% else %}
{% for b in backends %}
{% if service == 'haproxy' %}
<a href="/app/sections.py?serv={{ serv}}&section={{b}}" title="Edit backend {{b}}" target="_blank" style="padding-right: 10px;">
{{b}}
</a>
{% else %}
{{b}}
{% endif %}
{% endfor %}
{% endif %}

View File

@ -1,17 +1,27 @@
{%- for service in service_status -%}
<div class="server-info">
{% if service_page == 'nginx' %}
<div class="server-name" style="padding-bottom: 0px;">
{% else %}
<div class="server-name">
{% endif %}
Server status
<span class="update-icon">
<a onclick="showOverviewServer('{{ service.0 }}', '{{ service.1 }}', '{{id}}')" title="Refresh">
<a onclick="showOverviewServer('{{ service.0 }}', '{{ service.1 }}', '{{id}}', '{{service_page}}')" title="Refresh">
<span class="service-reload"></span>
</a>
</span>
</div>
{% if service_page == 'haproxy' %}
<div class="haproxy-info">
{{ service.2 }}
</div>
{% endif %}
{% if service_page == 'nginx' %}
<div class="top-info" style="margin-top: 5px;">
{% else %}
<div class="top-info">
{% endif %}
<pre>
{{ service.3 }}
</pre>

View File

@ -31,7 +31,7 @@
hostnamea.push(host)
{% endfor %}
</script>
<div id="up-pannel">
<div id="up-pannel" class="sortable">
{% for s in servers %}
{% if serv %}
<link href="/inc/chart.min.css" rel="stylesheet">
@ -45,35 +45,33 @@
getWafChartData('{{s.2}}')
{% endfor %}
{% endif %}
showOverviewServer('{{s.1}}', '{{s.2}}', '{{s.0}}');
showOverviewServer('{{s.1}}', '{{s.2}}', '{{s.0}}', '{{service}}');
}
showMetrics();
</script>
{% endif %}
<div class="div-pannel" id="div-pannel-{{s.0}}">
<div id="div-server-{{s.0}}" class="div-server-hapwi" {% if service == 'nginx' %}style="height:138px;"{%endif%}>
<div class="server-name">
<input type="hidden" id="server-name-{{s.0}}" value="{{s.1}}" />
<input type="hidden" id="service" value="{{service}}" />
{% if service == 'nginx' %}
<input type="hidden" id="service" value="nginx" />
{% if s.5.0.3 == 'active' %}
<span class="serverUp server-status" title="Uptime: {{s.5.0.4}}"></span>
{% else %}
<span class="serverDown server-status" title="Downtime: : {{s.5.0.4}}"></span>
{% endif %}
{{s.1}}
{% endif %}
{% else %}
<input type="hidden" id="service" value="haproxy" />
{% if s.5 != False %}
<span class="serverUp server-status" title="{{s.5.0.2}}"></span>
{% else %}
<span class="serverDown server-status" title="HAProxy is down"></span>
{% endif %}
{% if not serv %}
<a href="/app/hapservers.py?serv={{s.2}}" title="More about {{s.1}}" style="color: #5d9ceb">{{s.1}}</a>
{% endif %}
{% if not serv %}
<a href="/app/hapservers.py?service={{service}}&serv={{s.2}}" title="More about {{s.1}}" style="color: #5d9ceb">{{s.1}}</a>
{% else %}
{{s.1}}
{% endif %}
{% endif %}
{% if service == 'haproxy' %}
{% if s.6|int() >= 1 %}
<img
@ -165,17 +163,22 @@
</div>
</div>
{% if serv %}
<div id="ajax-server-{{s.0}}" class="ajax-server"></div>
{% if service == 'haproxy' %}
<div id="ajax-server-{{s.0}}" class="ajax-server"></div>
{% else %}
<div id="ajax-server-{{s.0}}" class="ajax-server" style="height: 158px;"></div>
{% endif %}
<div class="div-server div-backends">
<div class="server-name backends">
Backends:
{% if service == 'haproxy' %}
Backends:
{% else %}
Virtual hosts:
{% endif %}
</div>
<div style="margin-top: 10px;" id="top-{{s.1}}"></div>
</div>
{% endif %}
{% endif %}
</div>
{% endfor %}
</div>
{% if serv and service == 'haproxy' %}
@ -195,9 +198,9 @@
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:3px 12px 20px 0;"></span>Are you sure?</p>
</div>
<script>
{% if serv and service == 'haproxy' %}
overviewHapserverBackends(ip, hostnamea);
{% if serv %}
overviewHapserverBackends(ip, hostnamea, '{{service}}');
{% endif %}
showHapservers(ip, hostnamea, '{{service}}');
</script>
{% endblock %}
{% endblock %}

View File

@ -111,7 +111,7 @@
{% if keep_alive|int() >= 1 %}
<span title="running {{ keep_alive }} processe"><span class="serverUp server-status"></span></span>
{% else %}
<span class="serverDown server-status"></span>
<span class="serverDown server-status"></span>
{% endif %}
{% if role <= 1 %}
<a href="/app/viewlogs.py?viewlogs={{keep_alive_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="View keep alive logs" class="logs_link">
@ -127,7 +127,11 @@
{% if metrics_worker|int() >= 1 %}
<span title="running {{metrics_worker}} worker processes"><span class="serverUp server-status"></span></span>
{% else %}
<span title="running {{metrics_worker}} worker processes"><span class="serverDown server-status"></span></span>
{% if is_metrics_worker|int == 0 %}
<span title="There is not jobs for metrics"><span class="serverNone server-status"></span></span>
{% else %}
<span title="running {{is_checker_worker}} worker processes"><span class="serverDown server-status"></span></span>
{% endif %}
{% endif %}
{% if role <= 1 %}
<a href="/app/viewlogs.py?viewlogs={{metrics_error_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="View worker's logs" class="logs_link">
@ -141,7 +145,11 @@
{% if checker_worker|int() >= 1 %}
<span title="running {{ checker_worker }} worker processes"><span class="serverUp server-status"></span></span>
{% else %}
{% if is_checker_worker|int == 0 %}
<span title="There is not jobs for checker"><span class="serverNone server-status"></span> </span>
{% else %}
<span title="running {{ checker_worker }} worker processes"><span class="serverDown server-status"></span> </span>
{% endif %}
{% endif %}
{% if role <= 1 %}
<a href="/app/viewlogs.py?viewlogs={{checker_error_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="View checker's logs" class="logs_link">

View File

@ -33,14 +33,18 @@ def main(serv, port):
except OSError as e:
print(e)
sys.exit()
readstats = readstats.decode(encoding='UTF-8')
metric = readstats.splitlines()
metrics = []
for i in range(0,len(metric)):
metrics.append(metric[i])
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))
sql.insert_mentrics(serv, metrics[0], metrics[1], metrics[2], metrics[3])
time.sleep(30)
if killer.kill_now:

View File

@ -41,12 +41,13 @@ function showHapserversCallBack(serv, hostnamea, service) {
}
} );
}
function overviewHapserverBackends(serv, hostnamea) {
function overviewHapserverBackends(serv, hostnamea, service) {
$.ajax( {
url: "options.py",
data: {
act: "overviewHapserverBackends",
serv: serv[0],
service: service,
token: $('#token').val()
},
beforeSend: function() {
@ -85,7 +86,7 @@ function showOverviewCallBack(serv, hostnamea) {
}
} );
}
function showOverviewServer(name,ip,id) {
function showOverviewServer(name,ip,id, service) {
$.ajax( {
url: "options.py",
data: {
@ -93,6 +94,7 @@ function showOverviewServer(name,ip,id) {
name: name,
serv: ip,
id: id,
service: service,
page: 'hapservers.py',
token: $('#token').val()
},