diff --git a/app/create_db.py b/app/create_db.py
index caf7c569..491634b3 100644
--- a/app/create_db.py
+++ b/app/create_db.py
@@ -526,7 +526,7 @@ def update_db_v_4_3_2(**kwargs):
con.commit()
except sqltool.Error as e:
if kwargs.get('silent') != 1:
- if e.args[0] == 'duplicate column name: pos' or e == " 1060 (42S21): Duplicate column name 'pos' ":
+ if e.args[0] == 'column param is not unique' or e == " 1060 (42S21): column param is not unique ":
print('DB was update to 4.3.2')
else:
print("An error occurred:", e)
@@ -538,9 +538,10 @@ def update_db_v_4_3_2(**kwargs):
con.close()
+
def update_ver(**kwargs):
con, cur = get_cur()
- sql = """update version set version = '4.3.2.0'; """
+ sql = """update version set version = '4.3.3.0'; """
try:
cur.execute(sql)
con.commit()
diff --git a/app/options.py b/app/options.py
index 79e5a3ec..ab6c92a2 100644
--- a/app/options.py
+++ b/app/options.py
@@ -1,12 +1,13 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
-import os, sys
+import os
+import sys
import funct
import sql
form = funct.form
-serv = form.getvalue('serv')
-act = form.getvalue('act')
+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'):
@@ -24,11 +25,11 @@ if act == "checkrestart":
sys.exit()
-if not sql.check_token_exists(form.getvalue('token')):
+if not sql.check_token_exists(form.getvalue("token")):
print("Your token has been expired")
sys.exit()
-
+
if form.getvalue('getcerts') is not None and serv is not None:
cert_path = sql.get_setting('cert_path')
commands = [ "ls -1t "+cert_path+" |grep pem" ]
@@ -41,7 +42,7 @@ if form.getvalue('getcerts') is not None and serv is not None:
if form.getvalue('checkSshConnect') is not None and serv is not None:
print(funct.ssh_command(serv, ["ls -1t"]))
-
+
if form.getvalue('getcert') is not None and serv is not None:
id = form.getvalue('getcert')
cert_path = sql.get_setting('cert_path')
@@ -50,20 +51,20 @@ if form.getvalue('getcert') is not None and serv is not None:
funct.ssh_command(serv, commands, ip="1")
except:
print('
Can not connect to the server
')
-
-
+
+
if serv and form.getvalue('ssl_cert'):
cert_local_dir = os.path.dirname(os.getcwd())+"/"+sql.get_setting('ssl_local_path')
cert_path = sql.get_setting('cert_path')
-
+
if not os.path.exists(cert_local_dir):
os.makedirs(cert_local_dir)
-
+
if form.getvalue('ssl_name') is None:
print('
Please enter desired name
')
else:
name = form.getvalue('ssl_name') + '.pem'
-
+
try:
with open(name, "w") as ssl_cert:
ssl_cert.write(form.getvalue('ssl_cert'))
@@ -71,7 +72,7 @@ if serv and form.getvalue('ssl_cert'):
print('
Can\'t save ssl keys file. Check ssh keys path in config
')
else:
print('
SSL file was upload to %s into: %s %s
' % (serv, cert_path, name))
-
+
MASTERS = sql.is_master(serv)
for master in MASTERS:
if master[0] != None:
@@ -84,14 +85,14 @@ if serv and form.getvalue('ssl_cert'):
os.system("mv %s %s" % (name, cert_local_dir))
except OSError as e:
funct.logging('localhost', e.args[0], haproxywi=1)
-
+
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_select') is not None:
funct.show_backends(serv)
@@ -117,9 +118,9 @@ if form.getvalue('ipbackend') is not None and form.getvalue('backend_server') is
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:
+
+
+if form.getvalue('backend_ip') is not None:
import sql
backend_backend = form.getvalue('backend_backend')
backend_server = form.getvalue('backend_server')
@@ -128,92 +129,92 @@ if form.getvalue('backend_ip') is not None:
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:
+ if master[0] is not 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:
+
+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:
+ 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:
+ 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])
-
+ 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':
+
+ if table == 'All':
template = env.get_template('/stick_tables.html')
tables = funct.get_all_stick_table()
table = []
@@ -221,70 +222,82 @@ if form.getvalue('table_select') is not None:
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:
+
+
+if form.getvalue('ip_for_delete') is not None:
+ import sql
+ haproxy_sock_port = sql.get_setting('haproxy_sock_port')
+ ip = form.getvalue('ip_for_delete')
+ table = form.getvalue('table_for_delete')
+
+ cmd='echo "clear table %s key %s" |nc %s %s' % (table, ip, serv, haproxy_sock_port)
+ output, stderr = funct.subprocess_execute(cmd)
+ if stderr[0] != '':
+ print(stderr[0])
+
+
+if form.getvalue("change_pos") is not None:
import sql
pos = form.getvalue('change_pos')
sql.update_server_pos(pos, 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' |grep -v 'lo'| 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')
-
+
if funct.check_haproxy_config(serv):
commands = [ "sudo systemctl %s haproxy" % action ]
- funct.ssh_command(serv, commands)
+ funct.ssh_command(serv, commands)
funct.logging(serv, 'HAProxy was '+action+'ed', haproxywi=1, login=1)
print("HAproxy was %s" % action)
else:
print("Bad config, check please")
-
-
+
+
if form.getvalue('action_nginx') is not None and serv is not None:
action = form.getvalue('action_nginx')
-
+
if funct.check_haproxy_config(serv):
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)
print("Nginx 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')
action = form.getvalue('action_waf')
funct.logging(serv, 'WAF service was '+action+'ed', haproxywi=1, login=1)
commands = [ "sudo systemctl %s waf" % action ]
- funct.ssh_command(serv, commands)
-
-
-if form.getvalue('action_service') is not None:
+ funct.ssh_command(serv, commands)
+
+
+if form.getvalue('action_service') is not None:
action = form.getvalue('action_service')
if action == 'stop':
cmd="sudo systemctl disable %s --now" % serv
@@ -294,8 +307,8 @@ if form.getvalue('action_service') is not None:
cmd="sudo systemctl restart %s --now" % serv
output, stderr = funct.subprocess_execute(cmd)
funct.logging('localhost', ' The service '+serv+ 'was '+action+'ed', haproxywi=1, login=1)
-
-
+
+
if act == "overviewHapserverBackends":
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True)
@@ -327,11 +340,11 @@ if act == "overviewHapserverBackends":
except:
funct.logging('localhost', ' Cannot get sections from config file', haproxywi=1)
sections = 'Cannot get backends'
-
+
template = template.render(backends=sections, serv=serv, service=service)
print(template)
-
-
+
+
if act == "overviewHapservers":
if form.getvalue('service') == 'nginx':
config_path = sql.get_setting('nginx_config_path')
@@ -342,9 +355,9 @@ if act == "overviewHapservers":
print(funct.ssh_command(serv, commands))
except:
print('Cannot get last date')
-
-
-if act == "overview":
+
+
+if act == "overview":
import asyncio
async def async_get_overview(serv1, serv2):
server_status = ()
@@ -362,9 +375,9 @@ if act == "overview":
nginx_process = funct.ssh_command(serv2, command)
else:
nginx_process = ''
- server_status = (serv1,
- serv2,
- funct.server_status(funct.subprocess_execute(cmd)),
+ 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),
@@ -379,7 +392,7 @@ if act == "overview":
import http.cookies
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True,extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'])
-
+
servers = []
template = env.get_template('overview.html')
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
@@ -391,24 +404,24 @@ if act == "overview":
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)
-
-
+
+
ioloop = asyncio.get_event_loop()
ioloop.run_until_complete(get_runner_overview())
ioloop.close()
-
-
-if act == "overviewwaf":
+
+
+if act == "overviewwaf":
import asyncio
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(),
+
+ 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
@@ -418,7 +431,7 @@ if act == "overviewwaf":
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True,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')
@@ -429,22 +442,22 @@ if act == "overviewwaf":
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)
-
+
ioloop = asyncio.get_event_loop()
ioloop.run_until_complete(get_runner_overviewWaf())
ioloop.close()
-
-
+
+
if act == "overviewServers":
- import asyncio
+ import asyncio
async def async_get_overviewServers(serv1, serv2, service):
server_status = ()
-
+
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:
@@ -456,15 +469,15 @@ if act == "overviewServers":
out1 = ''
server_status = (serv1,serv2, out1)
- return server_status
-
+ 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 = []
+ 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)
@@ -475,8 +488,8 @@ if act == "overviewServers":
servers.append(result)
servers_sorted = sorted(servers, key=funct.get_key)
template = template.render(service_status=servers_sorted, role=role, id=kwargs.get('id'), service_page=service)
- print(template)
-
+ print(template)
+
id = form.getvalue('id')
name = form.getvalue('name')
service = form.getvalue('service')
@@ -484,15 +497,15 @@ if act == "overviewServers":
ioloop.run_until_complete(get_runner_overviewServers(server1=name, server2=serv, id=id, service=service))
ioloop.close()
-
+
if form.getvalue('action'):
import requests
-
+
haproxy_user = sql.get_setting('stats_user')
haproxy_pass = sql.get_setting('stats_password')
stats_port = sql.get_setting('stats_port')
stats_page = sql.get_setting('stats_page')
-
+
postdata = {
'action' : form.getvalue('action'),
's' : form.getvalue('s'),
@@ -507,11 +520,11 @@ 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
-
+
if form.getvalue('service') == 'nginx':
haproxy_user = sql.get_setting('nginx_stats_user')
haproxy_pass = sql.get_setting('nginx_stats_password')
@@ -523,7 +536,7 @@ if serv is not None and act == "stats":
stats_port = sql.get_setting('stats_port')
stats_page = sql.get_setting('stats_page')
try:
- response = requests.get('http://%s:%s/%s' % (serv, stats_port, stats_page), auth=(haproxy_user, haproxy_pass))
+ response = requests.get('http://%s:%s/%s' % (serv, stats_port, stats_page), auth=(haproxy_user, haproxy_pass))
except requests.exceptions.ConnectTimeout:
print('Oops. Connection timeout occured!')
except requests.exceptions.ReadTimeout:
@@ -536,27 +549,27 @@ if serv is not None and act == "stats":
print ("Timeout Error:",errt)
except requests.exceptions.RequestException as err:
print ("OOps: Something Else",err)
-
+
data = response.content
if form.getvalue('service') == 'nginx':
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/'), autoescape=True)
template = env.get_template('ajax/nginx_stats.html')
-
+
servers_with_status = list()
h = ()
out1 = []
for k in data.decode('utf-8').split():
- out1.append(k)
+ out1.append(k)
h = (out1, )
servers_with_status.append(h)
-
+
template = template.render(out=servers_with_status)
- print(template)
- else:
+ print(template)
+ else:
print(data.decode('utf-8'))
-
-
+
+
if serv is not None and form.getvalue('rows') is not None:
rows = form.getvalue('rows')
waf = form.getvalue('waf')
@@ -568,8 +581,8 @@ if serv is not None and form.getvalue('rows') is not None:
service = form.getvalue('service')
out = funct.show_haproxy_log(serv, rows=rows, waf=waf, grep=grep, hour=hour, minut=minut, hour1=hour1, minut1=minut1, service=service)
print(out)
-
-
+
+
if serv is not None and form.getvalue('rows1') is not None:
rows = form.getvalue('rows1')
grep = form.getvalue('grep')
@@ -579,10 +592,10 @@ if serv is not None and form.getvalue('rows1') is not None:
minut1 = form.getvalue('minut1')
out = funct.show_haproxy_log(serv, rows=rows, waf='0', grep=grep, hour=hour, minut=minut, hour1=hour1, minut1=minut1, service='apache')
print(out)
-
-
+
+
if form.getvalue('viewlogs') is not None:
- viewlog = form.getvalue('viewlogs')
+ viewlog = form.getvalue('viewlogs')
rows = form.getvalue('rows')
grep = form.getvalue('grep')
hour = form.getvalue('hour')
@@ -591,8 +604,8 @@ if form.getvalue('viewlogs') is not None:
minut1 = form.getvalue('minut1')
out = funct.show_haproxy_log(serv=viewlog, rows=rows, waf='0', grep=grep, hour=hour, minut=minut, hour1=hour1, minut1=minut1, service='internal')
print(out)
-
-
+
+
if serv is not None and act == "showMap":
from datetime import datetime
from pytz import timezone
@@ -600,40 +613,40 @@ if serv is not None and act == "showMap":
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('
')
-
+
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:
+ if "stats" not in line:
node = line
- i = i - 750
- if line.find("backend") == 0:
+ i = i - 750
+ if line.find("backend") == 0:
node = line
- i = i - 700
+ 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(":")
@@ -649,17 +662,17 @@ if serv is not None and act == "showMap":
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
+ 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_new[0] = line_new1[1]
line_new2 = line_new[0].split(":")
- line_new[0] = line_new2[0]
-
+ 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')
@@ -668,53 +681,53 @@ if serv is not None and act == "showMap":
else:
G.add_node(line_new[0],pos=(k-230,i-0),label_pos=(k-225,i+180))
- if line_new2[1] != "":
+ 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)
+ 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(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('
+ {% for t in table %}
+ {% if t != '' %}
+ {% if loop.index == 1 %}
+ {% set headers = t.split(':')[1] %}
+ {% set headers = headers.split(' ') %}
+
+
+
+ IP
+
+
+ Use
+
+
+ Exp
+
+
+ {{headers.4.split('=')[0].split('(')[0]}}
+
+ {% if headers|length > 5 %}
+
+ {{headers.5.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 6 %}
+
+ {{headers.6.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 7 %}
+
+ {{headers.7.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 8 %}
+
+ {{headers.9.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 10 %}
+
+ {{headers.10.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 11 %}
+
+ {{headers.11.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+
+
+
+
+
+ {% endif %}
+ {% set body = t.split(':')[1] %}
+ {% set body = t.split(' ') %}
+
+
+ {{body.1.split('=')[1]}}
+
+
+ {{body.2.split('=')[1]}}
+
+
+ {{body.3.split('=')[1]|int() / 1000 }} s
+
+ {% if body|length > 4 %}
+
+ {{body.4.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 5 %}
+
+ {{body.5.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 6 %}
+
+ {{body.6.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 7 %}
+
+ {{body.7.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 8 %}
+
+ {{body.8.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 9 %}
+
+ {{body.9.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 10 %}
+
+ {{body.10.split('=')[1]}}
+
+ {% endif %}
+
+
+
+
+ {% endif %}
+ {% endfor %}
+
+
\ No newline at end of file
diff --git a/app/templates/ajax/stick_tables.html b/app/templates/ajax/stick_tables.html
new file mode 100644
index 00000000..9d14f8c5
--- /dev/null
+++ b/app/templates/ajax/stick_tables.html
@@ -0,0 +1,156 @@
+{%- for t in table %}
+ {%- if t.1.0 != '' -%}
+ {% set headers = t.1.0.split(':')[1] %}
+ {% set headers = headers.split(' ') %}
+
+ {% endif %}
+
+
+
+ Table name:{{t.0.0}}
+
+
+ Type: {{t.0.1}}
+
+
+ Size: {{t.0.2|int() / 1024 / 1024}} Mb
+
+
+ Used: {{t.0.3}}
+
+
+
+
+
+
+ {%- if t.1.0 != '' -%}
+
+ {% set headers = t.1.0.split(':')[1] %}
+ {% set headers = headers.split(' ') %}
+
+
+
+ IP
+
+
+ Use
+
+
+ Exp
+
+
+ {{headers.4.split('=')[0].split('(')[0]}}
+
+ {% if headers|length > 5 %}
+
+ {{headers.5.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 6 %}
+
+ {{headers.6.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 7 %}
+
+ {{headers.7.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 8 %}
+
+ {{headers.9.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 10 %}
+
+ {{headers.10.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+ {% if headers|length > 11 %}
+
+ {{headers.11.split('=')[0].split('(')[0]}}
+
+ {% endif %}
+
+
+
+
+
+ {% for b in t.1 %}
+ {% set body = b.split(' ') %}
+ {% if body.0 != '' %}
+
+
+ {{body.1.split('=')[1]}}
+
+
+ {{body.2.split('=')[1]}}
+
+
+ {{body.3.split('=')[1]|int() / 1000 }} s
+
+ {% if body|length > 4 %}
+
+ {{body.4.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 5 %}
+
+ {{body.5.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 6 %}
+
+ {{body.6.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 7 %}
+
+ {{body.7.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 8 %}
+
+ {{body.8.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 9 %}
+
+ {{body.9.split('=')[1]}}
+
+ {% endif %}
+ {% if body|length > 10 %}
+
+ {{body.10.split('=')[1]}}
+
+ {% endif %}
+
+
+
+
+ {% endif %}
+ {% endfor %}
+
+
+ {% else %}
+ Table is empty
+ {% endif %}
+
+
+{% endfor %}
\ No newline at end of file
diff --git a/app/templates/runtimeapi.html b/app/templates/runtimeapi.html
index be988285..68c82687 100644
--- a/app/templates/runtimeapi.html
+++ b/app/templates/runtimeapi.html
@@ -1,6 +1,8 @@
{% extends "base.html" %}
{% block content %}
{% from 'include/input_macros.html' import input, checkbox %}
+
+