diff --git a/app/create_db.py b/app/create_db.py index 4fc40cf2..ba3e2751 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -193,11 +193,6 @@ def update_db_v_31(**kwargs): con.commit() except sqltool.Error as e: pass - # if kwargs.get('silent') != 1: - # if e.args[0] == 'column param is not unique' or e == "1060 (42S21): column param is not unique ": - # print('Updating... go to version 3.2') - # else: - # print("An error occurred:", e) else: if kwargs.get('silent') != 1: print('Updating... go to version 3.2') @@ -440,7 +435,7 @@ def update_db_v_3_5_3(**kwargs): def update_ver(**kwargs): con, cur = get_cur() - sql = """update version set version = '3.5.7'; """ + sql = """update version set version = '3.5.7.1'; """ try: cur.execute(sql) con.commit() @@ -495,8 +490,7 @@ def update_all(): update_db_v_3_5_3() update_to_hash() update_ver() - - + def update_all_silent(): update_db_v_31(silent=1) @@ -516,8 +510,7 @@ def update_all_silent(): update_to_hash() update_ver() - - + if __name__ == "__main__": create_table() update_all() diff --git a/app/funct.py b/app/funct.py index 4c9a1e13..e9c4734b 100644 --- a/app/funct.py +++ b/app/funct.py @@ -602,11 +602,17 @@ def show_backends(serv, **kwargs): def get_files(dir = get_config_var('configs', 'haproxy_save_configs_dir'), format = 'cfg', **kwargs): import glob - file = set() + if format == 'log': + file = [] + else: + file = set() return_files = set() - for files in glob.glob(os.path.join(dir,'*.'+format)): - file.add(files.split('/')[-1]) + for files in glob.glob(os.path.join(dir,'*.'+format)): + if format == 'log': + file += [(files.split('/')[5], files.split('/')[5])] + else: + file.add(files.split('/')[-1]) files = sorted(file, reverse=True) if format == 'cfg': diff --git a/app/ihap.py b/app/ihap.py deleted file mode 100644 index a411771a..00000000 --- a/app/ihap.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 -import http.cookies -import cgi -import os -import funct, sql -from jinja2 import Environment, FileSystemLoader -env = Environment(loader=FileSystemLoader('templates/')) -template = env.get_template('ihap.html') - -print('Content-type: text/html\n') -funct.check_login() -funct.page_for_admin(level = 2) - -try: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_id = cookie.get('uuid') - user = sql.get_user_name_by_uuid(user_id.value) - servers = sql.get_dick_permit() - token = sql.get_token(user_id.value) -except: - pass - - -output_from_parsed_template = template.render(h2 = 1, title = "Installation HAProxy", - role = sql.get_user_role_by_uuid(user_id.value), - user = user, - select_id = "haproxyaddserv", - selects = servers, - versions = funct.versions(), - token = token) -print(output_from_parsed_template) - diff --git a/app/options.py b/app/options.py index 688de00e..adc04ee7 100644 --- a/app/options.py +++ b/app/options.py @@ -4,7 +4,7 @@ import cgi import os, sys import funct import sql -import ovw +import asyncio form = cgi.FieldStorage() serv = form.getvalue('serv') @@ -102,17 +102,21 @@ if serv and form.getvalue('ssl_cert'): os.system("mv %s %s" % (name, cert_local_dir)) funct.logging(serv, "add.py#ssl upload new ssl cert %s" % name) + if form.getvalue('backend') is not None: funct.show_backends(serv) + if form.getvalue('ip') is not None and serv is not None: commands = [ "sudo ip a |grep inet |egrep -v '::1' |awk '{ print $2 }' |awk -F'/' '{ print $1 }'" ] funct.ssh_command(serv, commands, ip="1") + if form.getvalue('showif'): commands = ["sudo ip link|grep 'UP' | awk '{print $2}' |awk -F':' '{print $1}'"] funct.ssh_command(serv, commands, ip="1") + if form.getvalue('action_hap') is not None and serv is not None: action = form.getvalue('action_hap') @@ -123,6 +127,7 @@ if form.getvalue('action_hap') is not None and serv is not None: print("HAproxy was %s" % action) else: print("Bad config, check please") + if form.getvalue('action_waf') is not None and serv is not None: serv = form.getvalue('serv') @@ -131,16 +136,123 @@ if form.getvalue('action_waf') is not None and serv is not None: commands = [ "sudo systemctl %s waf" % action ] funct.ssh_command(serv, commands) + +async def async_get_overview(serv1, serv2): + server_status = () + commands2 = [ "ps ax |grep waf/bin/modsecurity |grep -v grep |wc -l" ] + cmd = 'echo "show info" |nc %s %s -w 1|grep -e "Process_num"' % (serv2, sql.get_setting('haproxy_sock_port')) + server_status = (serv1, + serv2, + funct.server_status(funct.subprocess_execute(cmd)), + sql.select_servers(server=serv2, keep_alive=1), + funct.ssh_command(serv2, commands2), + sql.select_waf_servers(serv2)) + return server_status + +async def get_runner_overview(): + import http.cookies + from jinja2 import Environment, FileSystemLoader + env = Environment(loader=FileSystemLoader('templates/ajax'),extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do']) + + servers = [] + template = env.get_template('overview.html') + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + user_id = cookie.get('uuid') + futures = [async_get_overview(server[1], server[2]) for server in sql.get_dick_permit()] + 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=sql.get_user_role_by_uuid(user_id.value)) + print(template) + + if act == "overview": - ovw.get_overview() + ioloop = asyncio.get_event_loop() + ioloop.run_until_complete(get_runner_overview()) + ioloop.close() + + +async def async_get_overviewWaf(serv1, serv2): + haproxy_dir = sql.get_setting('haproxy_dir') + server_status = () + commands = [ "ps ax |grep waf/bin/modsecurity |grep -v grep |wc -l" ] + commands1 = [ "cat %s/waf/modsecurity.conf |grep SecRuleEngine |grep -v '#' |awk '{print $2}'" % haproxy_dir ] + + server_status = (serv1,serv2, funct.ssh_command(serv2, commands), funct.ssh_command(serv2, commands1).strip(), sql.select_waf_metrics_enable_server(serv2)) + return server_status + + +async def get_runner_overviewWaf(url): + import http.cookies + from jinja2 import Environment, FileSystemLoader + env = Environment(loader=FileSystemLoader('templates/ajax'),extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do']) + template = env.get_template('overivewWaf.html') + + servers = [] + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + user_id = cookie.get('uuid') + futures = [async_get_overviewWaf(server[1], server[2]) for server in sql.get_dick_permit()] + 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=sql.get_user_role_by_uuid(user_id.value), url=url) + print(template) + if act == "overviewwaf": - ovw.get_overviewWaf(form.getvalue('page')) + ioloop = asyncio.get_event_loop() + ioloop.run_until_complete(get_runner_overviewWaf(form.getvalue('page'))) + ioloop.close() + + +async def async_get_overviewServers(serv1, serv2): + server_status = () + commands = [ "top -u haproxy -b -n 1 -w 67 |grep -e 'haproxy\|PID\|Cpu\|KiB' |grep -v Swap" ] + 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 += "
" + else: + out1 = "Can\'t connect to HAproxy" + + server_status = (serv1,serv2, out1, funct.ssh_command(serv2, commands)) + return server_status + + +async def get_runner_overviewServers(**kwargs): + import http.cookies + from jinja2 import Environment, FileSystemLoader + env = Environment(loader=FileSystemLoader('templates/ajax'),extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do']) + template = env.get_template('overviewServers.html') + + servers = [] + 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'))] + + 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')) + print(template) + if act == "overviewServers": id = form.getvalue('id') name = form.getvalue('name') - ovw.get_overviewServers(ip=serv,name=name,id=form.getvalue('id')) + ioloop = asyncio.get_event_loop() + ioloop.run_until_complete(get_runner_overviewServers(server1=name, server2=serv, id=id)) + ioloop.close() + if act == "overviewHapwi": @@ -178,6 +290,7 @@ if form.getvalue('action'): q = requests.post('http://'+serv+':'+stats_port+'/'+stats_page, headers=headers, data=postdata, auth=(haproxy_user, haproxy_pass)) + if serv is not None and act == "stats": import requests from requests_toolbelt.utils import dump @@ -203,6 +316,7 @@ if serv is not None and act == "stats": data = response.content print(data.decode('utf-8')) + if serv is not None and form.getvalue('rows') is not None: rows = form.getvalue('rows') @@ -236,6 +350,7 @@ if serv is not None and form.getvalue('rows') is not None: funct.ssh_command(syslog_server, commands, show_log="1") + if serv is not None and form.getvalue('rows1') is not None: rows = form.getvalue('rows1') grep = form.getvalue('grep') @@ -262,6 +377,7 @@ if serv is not None and form.getvalue('rows1') is not None: funct.show_log(output) print(stderr) + if form.getvalue('viewlogs') is not None: viewlog = form.getvalue('viewlogs') @@ -287,8 +403,112 @@ if form.getvalue('viewlogs') is not None: funct.show_log(output) print(stderr) + if serv is not None and act == "showMap": - ovw.get_map(serv) + from datetime import datetime + from pytz import timezone + import networkx as nx + import matplotlib + matplotlib.use('Agg') + import matplotlib.pyplot as plt + + stats_port= sql.get_setting('stats_port') + haproxy_config_path = sql.get_setting('haproxy_config_path') + hap_configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') + date = funct.get_data('config') + cfg = hap_configs_dir + serv + "-" + date + ".cfg" + + print('
') + print("

Map from %s


" % serv) + + G = nx.DiGraph() + + error = funct.get_config(serv, cfg) + if error: + print('
'+error+'
') + try: + conf = open(cfg, "r") + except IOError: + print('
Can\'t read import config file
') + + node = "" + line_new2 = [1,""] + i,k = 800, 800 + j, m = 0, 0 + for line in conf: + if line.startswith('listen') or line.startswith('frontend'): + if "stats" not in line: + node = line + i = i - 750 + if line.find("backend") == 0: + node = line + i = i - 700 + G.add_node(node,pos=(k,i),label_pos=(k,i+100)) + + if "bind" in line or (line.startswith('listen') and ":" in line) or (line.startswith('frontend') and ":" in line): + try: + bind = line.split(":") + if stats_port not in bind[1]: + bind[1] = bind[1].strip(' ') + bind = bind[1].split("crt") + node = node.strip(' \t\n\r') + node = node + ":" + bind[0] + G.add_node(node,pos=(k,i),label_pos=(k,i+100)) + except: + pass + + if "server " in line or "use_backend" in line or "default_backend" in line and "stats" not in line and "#" not in line: + if "timeout" not in line and "default-server" not in line and "#" not in line and "stats" not in line: + i = i - 1050 + j = j + 1 + if "check" in line: + line_new = line.split("check") + else: + line_new = line.split("if ") + if "server" in line: + line_new1 = line_new[0].split("server") + line_new[0] = line_new1[1] + line_new2 = line_new[0].split(":") + line_new[0] = line_new2[0] + + line_new[0] = line_new[0].strip(' \t\n\r') + line_new2[1] = line_new2[1].strip(' \t\n\r') + + if j % 2 == 0: + G.add_node(line_new[0],pos=(k+230,i-335),label_pos=(k+225,i-180)) + else: + G.add_node(line_new[0],pos=(k-230,i-0),label_pos=(k-225,i+180)) + + if line_new2[1] != "": + G.add_edge(node, line_new[0], port=line_new2[1]) + else: + G.add_edge(node,line_new[0]) + + os.system("/bin/rm -f " + cfg) + + pos=nx.get_node_attributes(G,'pos') + pos_label=nx.get_node_attributes(G,'label_pos') + edge_labels = nx.get_edge_attributes(G,'port') + + try: + plt.figure(10,figsize=(10,15)) + nx.draw(G, pos, with_labels=False, font_weight='bold', width=3, alpha=0.1,linewidths=5) + nx.draw_networkx_nodes(G,pos, node_color="skyblue", node_size=100, alpha=0.8, node_shape="p") + nx.draw_networkx_labels(G,pos=pos_label, alpha=1, font_color="green", font_size=10) + nx.draw_networkx_edges(G,pos, width=0.5,alpha=0.5, edge_color="#5D9CEB",arrows=False) + nx.draw_networkx_edge_labels(G, pos,label_pos=0.5,font_color="blue", labels=edge_labels, font_size=8) + + plt.savefig("map.png") + plt.show() + except Exception as e: + print('
' + str(e) + '
') + + cmd = "rm -f "+os.path.dirname(os.getcwd())+"/map*.png && mv map.png "+os.path.dirname(os.getcwd())+"/map"+date+".png" + output, stderr = funct.subprocess_execute(cmd) + print(stderr) + + print('map' % date) + if form.getvalue('servaction') is not None: server_state_file = sql.get_setting('server_state_file') @@ -310,6 +530,7 @@ if form.getvalue('servaction') is not None: action = 'edit.py ' + enable + ' ' + backend funct.logging(serv, action) + if act == "showCompareConfigs": import glob from jinja2 import Environment, FileSystemLoader @@ -321,6 +542,7 @@ if act == "showCompareConfigs": template = template.render(serv=serv, right=right, left=left, return_files=funct.get_files()) print(template) + if serv is not None and form.getvalue('right') is not None: from jinja2 import Environment, FileSystemLoader left = form.getvalue('left') @@ -336,6 +558,7 @@ if serv is not None and form.getvalue('right') is not None: print(template) print(stderr) + if serv is not None and act == "configShow": hap_configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') @@ -360,6 +583,7 @@ if serv is not None and act == "configShow": if form.getvalue('configver') is None: os.system("/bin/rm -f " + cfg) + if form.getvalue('master'): master = form.getvalue('master') slave = form.getvalue('slave') @@ -390,6 +614,7 @@ if form.getvalue('master'): os.system("rm -f %s" % script) sql.update_server_master(master, slave) + if form.getvalue('masteradd'): master = form.getvalue('masteradd') slave = form.getvalue('slaveadd') @@ -412,9 +637,11 @@ if form.getvalue('masteradd'): os.system("rm -f %s" % script) + if form.getvalue('haproxyaddserv'): funct.install_haproxy(form.getvalue('haproxyaddserv'), syn_flood=form.getvalue('syn_flood'), hapver=form.getvalue('hapver')) + if form.getvalue('installwaf'): funct.waf_install(form.getvalue('installwaf')) @@ -422,8 +649,10 @@ if form.getvalue('installwaf'): if form.getvalue('update_haproxy_wi'): funct.update_haproxy_wi() + if form.getvalue('metrics_waf'): sql.update_waf_metrics_enable(form.getvalue('metrics_waf'), form.getvalue('enable')) + if form.getvalue('table_metrics'): import http.cookies @@ -498,6 +727,7 @@ if form.getvalue('get_hap_v'): output = funct.check_haproxy_version(serv) print(output) + if form.getvalue('bwlists'): list = os.path.dirname(os.getcwd())+"/"+sql.get_setting('lists_path')+"/"+form.getvalue('group')+"/"+form.getvalue('color')+"/"+form.getvalue('bwlists') try: @@ -508,6 +738,7 @@ if form.getvalue('bwlists'): except IOError: print('
Cat\'n read '+form.getvalue('color')+' list
') + if form.getvalue('bwlists_create'): list_name = form.getvalue('bwlists_create').split('.')[0] list_name += '.lst' @@ -518,6 +749,7 @@ if form.getvalue('bwlists_create'): except IOError as e: print('
Cat\'n create new '+form.getvalue('color')+' list. %s
' % e) + if form.getvalue('bwlists_save'): list = os.path.dirname(os.getcwd())+"/"+sql.get_setting('lists_path')+"/"+form.getvalue('group')+"/"+form.getvalue('color')+"/"+form.getvalue('bwlists_save') try: @@ -539,12 +771,14 @@ if form.getvalue('bwlists_save'): if form.getvalue('bwlists_restart') == 'restart': funct.ssh_command(server[2], ["sudo " + sql.get_setting('restart_command')]) + if form.getvalue('get_lists'): list = os.path.dirname(os.getcwd())+"/"+sql.get_setting('lists_path')+"/"+form.getvalue('group')+"/"+form.getvalue('color') lists = funct.get_files(dir=list, format="lst") for list in lists: print(list) + if form.getvalue('get_ldap_email'): username = form.getvalue('get_ldap_email') import ldap diff --git a/app/ovw.py b/app/ovw.py deleted file mode 100644 index d010b54b..00000000 --- a/app/ovw.py +++ /dev/null @@ -1,210 +0,0 @@ -import funct -import os -import sql -import asyncio -import http.cookies -from jinja2 import Environment, FileSystemLoader -env = Environment(loader=FileSystemLoader('templates/ajax'),extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do']) -cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) -user_id = cookie.get('uuid') -haproxy_sock_port = sql.get_setting('haproxy_sock_port') -listhap = sql.get_dick_permit() -servers = [] -server_status = () - -async def async_get_overview(serv1, serv2): - # haproxy_config_path = sql.get_setting('haproxy_config_path') - # commands = [ "ls -l %s |awk '{ print $6\" \"$7\" \"$8}'" % haproxy_config_path ] - commands2 = [ "ps ax |grep waf/bin/modsecurity |grep -v grep |wc -l" ] - # commands2 = "ps ax |grep keep_alive.py |grep -v grep |wc -l" - - cmd = 'echo "show info" |nc %s %s -w 1|grep -e "Process_num"' % (serv2, haproxy_sock_port) - server_status = (serv1, - serv2, - funct.server_status(funct.subprocess_execute(cmd)), - sql.select_servers(server=serv2, keep_alive=1), - funct.ssh_command(serv2, commands2), - sql.select_waf_servers(serv2)) - return server_status - -async def get_runner_overview(): - template = env.get_template('overview.html') - futures = [async_get_overview(server[1], server[2]) for server in listhap] - 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=sql.get_user_role_by_uuid(user_id.value)) - print(template) - -def get_overview(): - ioloop = asyncio.get_event_loop() - ioloop.run_until_complete(get_runner_overview()) - ioloop.close() - -async def async_get_overviewWaf(serv1, serv2): - haproxy_dir = sql.get_setting('haproxy_dir') - commands = [ "ps ax |grep waf/bin/modsecurity |grep -v grep |wc -l" ] - commands1 = [ "cat %s/waf/modsecurity.conf |grep SecRuleEngine |grep -v '#' |awk '{print $2}'" % haproxy_dir ] - - server_status = (serv1,serv2, funct.ssh_command(serv2, commands), funct.ssh_command(serv2, commands1).strip(), sql.select_waf_metrics_enable_server(serv2)) - return server_status - -async def get_runner_overviewWaf(url): - template = env.get_template('overivewWaf.html') - - futures = [async_get_overviewWaf(server[1], server[2]) for server in listhap] - 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=sql.get_user_role_by_uuid(user_id.value), url=url) - print(template) - -def get_overviewWaf(url): - ioloop = asyncio.get_event_loop() - ioloop.run_until_complete(get_runner_overviewWaf(url)) - ioloop.close() - -async def async_get_overviewServers(serv1, serv2): - commands = [ "top -u haproxy -b -n 1 -w 67 |grep -e 'haproxy\|PID\|Cpu\|KiB' |grep -v Swap" ] - cmd = 'echo "show info" |nc %s %s -w 1|grep -e "Ver\|CurrConns\|Maxco\|MB\|Uptime:"' % (serv2, 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 += "
" - else: - out1 = "Can\'t connect to HAproxy" - - server_status = (serv1,serv2, out1, funct.ssh_command(serv2, commands)) - return server_status - -async def get_runner_overviewServers(**kwargs): - template = env.get_template('overviewServers.html') - 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'))] - - 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')) - print(template) - -def get_overviewServers(**kwargs): - server1 = kwargs.get('name') - server2 = kwargs.get('ip') - id = kwargs.get('id') - ioloop = asyncio.get_event_loop() - ioloop.run_until_complete(get_runner_overviewServers(server1=server1, server2=server2, id=id)) - ioloop.close() - -def get_map(serv): - from datetime import datetime - from pytz import timezone - import networkx as nx - import matplotlib - matplotlib.use('Agg') - import matplotlib.pyplot as plt - - stats_port= sql.get_setting('stats_port') - haproxy_config_path = sql.get_setting('haproxy_config_path') - hap_configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') - date = funct.get_data('config') - cfg = hap_configs_dir + serv + "-" + date + ".cfg" - - print('
') - print("

Map from %s


" % serv) - - G = nx.DiGraph() - - error = funct.get_config(serv, cfg) - if error: - print('
'+error+'
') - try: - conf = open(cfg, "r") - except IOError: - print('
Can\'t read import config file
') - - node = "" - line_new2 = [1,""] - i,k = 800, 800 - j, m = 0, 0 - for line in conf: - if line.startswith('listen') or line.startswith('frontend'): - if "stats" not in line: - node = line - i = i - 750 - if line.find("backend") == 0: - node = line - i = i - 700 - G.add_node(node,pos=(k,i),label_pos=(k,i+100)) - - if "bind" in line or (line.startswith('listen') and ":" in line) or (line.startswith('frontend') and ":" in line): - try: - bind = line.split(":") - if stats_port not in bind[1]: - bind[1] = bind[1].strip(' ') - bind = bind[1].split("crt") - node = node.strip(' \t\n\r') - node = node + ":" + bind[0] - G.add_node(node,pos=(k,i),label_pos=(k,i+100)) - except: - pass - - if "server " in line or "use_backend" in line or "default_backend" in line and "stats" not in line and "#" not in line: - if "timeout" not in line and "default-server" not in line and "#" not in line and "stats" not in line: - i = i - 1050 - j = j + 1 - if "check" in line: - line_new = line.split("check") - else: - line_new = line.split("if ") - if "server" in line: - line_new1 = line_new[0].split("server") - line_new[0] = line_new1[1] - line_new2 = line_new[0].split(":") - line_new[0] = line_new2[0] - - line_new[0] = line_new[0].strip(' \t\n\r') - line_new2[1] = line_new2[1].strip(' \t\n\r') - - if j % 2 == 0: - G.add_node(line_new[0],pos=(k+230,i-335),label_pos=(k+225,i-180)) - else: - G.add_node(line_new[0],pos=(k-230,i-0),label_pos=(k-225,i+180)) - - if line_new2[1] != "": - G.add_edge(node, line_new[0], port=line_new2[1]) - else: - G.add_edge(node,line_new[0]) - - os.system("/bin/rm -f " + cfg) - - pos=nx.get_node_attributes(G,'pos') - pos_label=nx.get_node_attributes(G,'label_pos') - edge_labels = nx.get_edge_attributes(G,'port') - - try: - plt.figure(10,figsize=(10,15)) - nx.draw(G, pos, with_labels=False, font_weight='bold', width=3, alpha=0.1,linewidths=5) - nx.draw_networkx_nodes(G,pos, node_color="skyblue", node_size=100, alpha=0.8, node_shape="p") - nx.draw_networkx_labels(G,pos=pos_label, alpha=1, font_color="green", font_size=10) - nx.draw_networkx_edges(G,pos, width=0.5,alpha=0.5, edge_color="#5D9CEB",arrows=False) - nx.draw_networkx_edge_labels(G, pos,label_pos=0.5,font_color="blue", labels=edge_labels, font_size=8) - - plt.savefig("map.png") - plt.show() - except Exception as e: - print('
' + str(e) + '
') - - cmd = "rm -f "+os.path.dirname(os.getcwd())+"/map*.png && mv map.png "+os.path.dirname(os.getcwd())+"/map"+date+".png" - output, stderr = funct.subprocess_execute(cmd) - print(stderr) - - print('map' % date) \ No newline at end of file diff --git a/app/settings.py b/app/settings.py deleted file mode 100644 index 62e79973..00000000 --- a/app/settings.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 -import cgi -import os -import funct -import sql -import http -from jinja2 import Environment, FileSystemLoader -env = Environment(loader=FileSystemLoader('templates/')) -template = env.get_template('settings.html') -form = cgi.FieldStorage() - -print('Content-type: text/html\n') -funct.check_login() -funct.page_for_admin() - -try: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_id = cookie.get('uuid') - user = sql.get_user_name_by_uuid(user_id.value) - settings = sql.get_setting('', all=1) - token = sql.get_token(user_id.value) -except: - pass - - -template = template.render(h2 = 1, title = "Settings", - role = sql.get_user_role_by_uuid(user_id.value), - user = user, - settings = settings, - versions = funct.versions(), - token = token) -print(template) \ No newline at end of file diff --git a/app/sql.py b/app/sql.py index 1853fc98..e0feb09e 100644 --- a/app/sql.py +++ b/app/sql.py @@ -1405,13 +1405,13 @@ def check_token(): sys.exit() -def check_group(group): +def check_group(group, role_id): import http.cookies import os cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_id = cookie.get('uuid') user_group = get_user_group_by_uuid(user_id.value) - if user_group == group or user_group == '1': + if user_group == group or user_group == '1' or role_id == 1: return True else: funct.logging(new_user, ' tried to change user group', haproxywi=1, login=1) @@ -1430,8 +1430,8 @@ if form.getvalue('newuser') is not None: if password is None or role is None or group is None: print(error_mess) else: - if check_group(group): - role_id = get_role_id_by_name(role) + role_id = get_role_id_by_name(role) + if check_group(group, role_id): if funct.is_admin(level=role_id): if add_user(new_user, email, password, role, group, activeuser): show_update_user(new_user, page) @@ -1452,8 +1452,8 @@ if form.getvalue('updateuser') is not None: if new_user is None or role is None or group is None: print(error_mess) else: - if check_group(group): - role_id = get_role_id_by_name(role) + role_id = get_role_id_by_name(role) + if check_group(group, role_id): if funct.is_admin(level=role_id): update_user(new_user, email, role, group, id, activeuser) else: diff --git a/app/templates/admin.html b/app/templates/admin.html index 977473c3..a8aedc9b 100644 --- a/app/templates/admin.html +++ b/app/templates/admin.html @@ -17,6 +17,8 @@
  • Servers
  • SSH credentials
  • Checker
  • +
  • Settings
  • +
  • Update
  • {% if user %} {% else %} @@ -507,6 +509,92 @@ You can read the description of all parameters here + +
    + + + + + + + {% set section = namespace(section='') %} + {% for set in settings %} + {% if section.section|string() != set.2|string() %} + + {% endif %} + {% set section.section = set.2 %} + + + + + + {% endfor %} + +
    + Parameter + + Value + + Description +

    {{ set.2 }} section

    + {{set.0}} + + {% if set.0 == 'ldap_password' %} + {% if set.1 == 'None' %} + + {% else %} + + {% endif %} + {% else %} + {% if set.1 == 'None' %} + + {% else %} + + {% endif %} + {% endif %} + + {{set.3}} +
    +
    + +
    + {% set current_ver = versions.0 %} + {% set new_ver = versions.1 %} + {% set current_ver_without_dots = versions.2 %} + {% set new_ver_without_dots = versions.3 %} + + + + + + + + + + +
    Currnet versionLast version
    + {{current_ver}} + + {{new_ver}} + + + {% if new_ver_without_dots > current_ver_without_dots and new_ver != "Sorry cannot get current version" %} + Update + {% endif %} +
    +
    + Note: + For update you have to use HAProxy-WI repository. How start use repository read here +
    +
    + If server uses proxy to connection Internet add proxy settings in yum.conf +
    +
    + Read more about update in docs + and changelog +
    +
    +
    +
    + + + + + + + + + + + + + +
    VersionServerSYN flood protect
    + + + + + + Install +
    +
    +