From 72d465a1a03817b0e9c8568de936c8a471e438eb Mon Sep 17 00:00:00 2001 From: Pavel Loginov Date: Sat, 6 Jun 2020 10:21:22 +0200 Subject: [PATCH] 4.3.1.0 Changelog: https://haproxy-wi.org/changelog.py#4_3_1 --- README.md | 1 + app/funct.py | 53 +++++++++++- app/options.py | 146 ++++++++++++++++++++++++++++++++++ app/templates/hapservers.html | 6 +- 4 files changed, 202 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5fd33510..0c663f07 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Web interface(user-friendly web GUI, alerting, monitoring and secure) for managi 1. Installation and updating Grafana, Prometheus servers with HAProxy-WI 1. Installation and updating HAProxy and Nginx exporters with HAProxy-WI 2. Configure HAProxy, Nginx and Keepalived In a jiffy with HAProxy-WI +3. Dynamic change of Maxconn, backend's IP address and port with saving changes to the config file 3. View and analyse Status of all Frontend/backend server via HAProxy-WI from a single control panel. 4. Enable/disable servers through stats page without rebooting HAProxy 5. View/Analyse HAproxy, Nginx logs straight from the HAProxy-WI web interface diff --git a/app/funct.py b/app/funct.py index f280fa6f..5e7f2dd9 100644 --- a/app/funct.py +++ b/app/funct.py @@ -380,8 +380,59 @@ def rewrite_section(start_line, end_line, config, section): return_config += line return return_config - + +def get_backends_from_config(serv, backends='', **kwargs): + configs_dir = get_config_var('configs', 'haproxy_save_configs_dir') + format = 'cfg' + record = False + + try: + cfg = configs_dir+get_files(dir=configs_dir, format=format)[0] + except Exception as e: + logging('localhost', str(e), haproxywi=1) + try: + cfg = configs_dir + serv + "-" + get_data('config') + '.'+format + except: + logging('localhost', ' Cannot generate cfg path', haproxywi=1) + try: + error = get_config(serv, cfg) + except: + logging('localhost', ' Cannot download config', haproxywi=1) + print('error: Cannot get backends') + sys.exit() + + with open(cfg, 'r') as f: + for line in f: + if backends == 'frontend': + if (line.startswith('listen') or line.startswith('frontend')) and 'stats' not in line: + line = line.strip() + print(line.split(' ')[1], end="
") + + +def get_all_stick_table(): + import sql + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + cmd='echo "show table"|nc %s %s |awk \'{print $3}\' | tr -d \'\n\' | tr -d \'[:space:]\'' % (serv, haproxy_sock_port) + output, stderr = subprocess_execute(cmd) + return output[0] + +def get_stick_table(table): + import sql + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + cmd='echo "show table %s"|nc %s %s |awk -F"#" \'{print $2}\' |head -1 | tr -d \'\n\'' % (table, serv, haproxy_sock_port) + output, stderr = subprocess_execute(cmd) + tables_head = [] + for i in output[0].split(','): + i = i.split(':')[1] + tables_head.append(i) + + cmd='echo "show table %s"|nc %s %s |grep -v "#"' % (table, serv, haproxy_sock_port) + output, stderr = subprocess_execute(cmd) + + return tables_head, output + + def install_haproxy(serv, **kwargs): import sql script = "install_haproxy.sh" diff --git a/app/options.py b/app/options.py index 4192898d..7b91a66b 100644 --- a/app/options.py +++ b/app/options.py @@ -8,11 +8,13 @@ form = funct.form serv = form.getvalue('serv') act = form.getvalue('act') + if form.getvalue('new_metrics') or form.getvalue('new_waf_metrics') or form.getvalue('metrics_hapwi_ram') or form.getvalue('metrics_hapwi_cpu'): print('Content-type: application/json\n') else: print('Content-type: text/html\n') + if act == "checkrestart": servers = sql.get_dick_permit(ip=serv) for server in servers: @@ -90,6 +92,150 @@ if form.getvalue('backend') is not None: funct.show_backends(serv) +if form.getvalue('ip_select') is not None: + funct.show_backends(serv) + + +if form.getvalue('ipbackend') is not None and form.getvalue('backend_server') is None: + import sql + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + backend = form.getvalue('ipbackend') + cmd='echo "show servers state"|nc %s %s |grep "%s" |awk \'{print $4}\'' % (serv, haproxy_sock_port, backend) + output, stderr = funct.subprocess_execute(cmd) + for i in output: + if i == ' ': + continue + i = i.strip() + print(i+'
') + + +if form.getvalue('ipbackend') is not None and form.getvalue('backend_server') is not None: + import sql + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + backend = form.getvalue('ipbackend') + backend_server = form.getvalue('backend_server') + cmd='echo "show servers state"|nc %s %s |grep "%s" |grep "%s" |awk \'{print $5":"$19}\' |head -1' % (serv, haproxy_sock_port, backend, backend_server) + output, stderr = funct.subprocess_execute(cmd) + print(output[0]) + + +if form.getvalue('backend_ip') is not None: + import sql + backend_backend = form.getvalue('backend_backend') + backend_server = form.getvalue('backend_server') + backend_ip = form.getvalue('backend_ip') + backend_port = form.getvalue('backend_port') + if form.getvalue('backend_ip') is None: + print('error: Backend IP must be IP and not 0') + sys.exit() + + if form.getvalue('backend_port') is None: + print('error: Backend port must be integer and not 0') + sys.exit() + + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + + MASTERS = sql.is_master(serv) + for master in MASTERS: + if master[0] != None: + cmd='echo "set server %s/%s addr %s port %s check-port %s" |nc %s %s' % (backend_backend, backend_server, backend_ip, backend_port, backend_port, master[0], haproxy_sock_port) + output, stderr = funct.subprocess_execute(cmd) + print(output[0]) + + cmd='echo "set server %s/%s addr %s port %s check-port %s" |nc %s %s' % (backend_backend, backend_server, backend_ip, backend_port, backend_port, serv, haproxy_sock_port) + output, stderr = funct.subprocess_execute(cmd) + + if stderr != '': + print('error: '+stderr[0]) + else: + print(output[0]) + configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') + cfg = configs_dir + serv + "-" + funct.get_data('config') + ".cfg" + + error = funct.get_config(serv, cfg) + cmd = 'string=`grep %s %s -n -A25 |grep "server %s" |head -1|awk -F"-" \'{print $1}\'` && sed -Ei "$( echo $string)s/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5]):[0-9]+/%s:%s/g" %s' % (backend_backend, cfg, backend_server, backend_ip, backend_port, cfg) + output, stderr = funct.subprocess_execute(cmd) + stderr = funct.master_slave_upload_and_restart(serv, cfg, just_save='save') + + + +if form.getvalue('maxconn_select') is not None: + serv = form.getvalue('maxconn_select') + funct.get_backends_from_config(serv, backends='frontend') + + +if form.getvalue('maxconn_frontend') is not None: + import sql + frontend = form.getvalue('maxconn_frontend') + maxconn = form.getvalue('maxconn_int') + if form.getvalue('maxconn_int') is None: + print('error: Maxconn must be integer and not 0') + sys.exit() + + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + + MASTERS = sql.is_master(serv) + for master in MASTERS: + if master[0] != None: + if frontend == 'global': + cmd='echo "set maxconn %s %s" |nc %s %s' % (frontend, maxconn, master[0], haproxy_sock_port) + else: + cmd='echo "set maxconn frontend %s %s" |nc %s %s' % (frontend, maxconn, master[0], haproxy_sock_port) + output, stderr = funct.subprocess_execute(cmd) + + if frontend == 'global': + cmd='echo "set maxconn %s %s" |nc %s %s' % (frontend, maxconn, serv, haproxy_sock_port) + else: + cmd='echo "set maxconn frontend %s %s" |nc %s %s' % (frontend, maxconn, serv, haproxy_sock_port) + output, stderr = funct.subprocess_execute(cmd) + + if stderr != '': + print(stderr[0]) + elif output[0] == '': + configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') + cfg = configs_dir + serv + "-" + funct.get_data('config') + ".cfg" + + error = funct.get_config(serv, cfg) + cmd = 'string=`grep %s %s -n -A5 |grep maxcon -n |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` && sed -Ei "$( echo $string)s/[0-9]+/%s/g" %s' % (frontend, cfg, maxconn, cfg) + output, stderr = funct.subprocess_execute(cmd) + stderr = funct.master_slave_upload_and_restart(serv, cfg, just_save='save') + print('Maxconn for %s has been set to %s ' % (frontend, maxconn)) + else: + print('error: '+output[0]) + + +if form.getvalue('table_serv_select') is not None: + print(funct.get_all_stick_table()) + + +if form.getvalue('table_select') is not None: + from jinja2 import Environment, FileSystemLoader + env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True,extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True) + table = form.getvalue('table_select') + + if table == 'All': + template = env.get_template('/stick_tables.html') + tables = funct.get_all_stick_table() + table = [] + for t in tables.split(','): + if t != '': + id = [] + tables_head = [] + + tables_head1, table1 = funct.get_stick_table(t) + id.append(tables_head1) + id.append(table1) + table.append(id) + + template = template.render(table=table) + else: + template = env.get_template('/stick_table.html') + tables_head, table = funct.get_stick_table(table) + template = template.render(tables_head=tables_head, table=table) + + print(template) + + if form.getvalue('change_pos') is not None: import sql pos = form.getvalue('change_pos') diff --git a/app/templates/hapservers.html b/app/templates/hapservers.html index de9a540d..6cb0f366 100644 --- a/app/templates/hapservers.html +++ b/app/templates/hapservers.html @@ -111,13 +111,13 @@ {% else %} {% set action_service = 'hap' %} {% endif %} - + - + - +