Add "Virt" servers, shown only on pages: "Stats" and "Runtime". Bugs fixed
pull/19/head
Aidaho12 2018-04-18 02:06:18 +06:00
parent 66d6a19502
commit 6534d9ca43
7 changed files with 104 additions and 49 deletions

View File

@ -26,7 +26,7 @@ print('<h2>Runtime API</h2>'
'<select required name="serv" id="serv">' '<select required name="serv" id="serv">'
'<option disabled selected>Choose server</option>') '<option disabled selected>Choose server</option>')
funct.choose_only_select(serv) funct.choose_only_select(serv, virt=1)
print('</select></td>' print('</select></td>'
'<td style="width: 30%;">' '<td style="width: 30%;">'

View File

@ -157,13 +157,11 @@ def links():
print('<div class="top-link">' print('<div class="top-link">'
'<nav class="menu">' '<nav class="menu">'
'<ul>' '<ul>'
'<li><a title="Statistics, monitoring and logs" class="stats">Stats</a>' '<li><a title="Statistics, monitoring and logs" class="stats">Stats</a>'
'<li><a href=/cgi-bin/overview.py title="Server and service status" class="overview-link head-submenu">Overview</a> </li>' '<li><a href=/cgi-bin/overview.py title="Server and service status" class="overview-link head-submenu">Overview</a> </li>'
'<li><a href=/cgi-bin/viewsttats.py title"Show stats" class="stats head-submenu">Stats</a> </li>' '<li><a href=/cgi-bin/viewsttats.py title"Show stats" class="stats head-submenu">Stats</a> </li>'
'<li><a href=/cgi-bin/logs.py title="View logs" class="logs head-submenu">Logs</a></li>' '<li><a href=/cgi-bin/logs.py title="View logs" class="logs head-submenu">Logs</a></li>'
'<li><a href=/cgi-bin/map.py title="View map" class="map head-submenu">Map</a></li>' '<li><a href=/cgi-bin/map.py title="View map" class="map head-submenu">Map</a></li>'
'</li>' '</li>'
'<li><a href=/cgi-bin/edit.py title="Runtime API" class="runtime">Runtime API</a> </li>' '<li><a href=/cgi-bin/edit.py title="Runtime API" class="runtime">Runtime API</a> </li>'
'<li><a title="Actions with configs" class="config-show">Configs</a>' '<li><a title="Actions with configs" class="config-show">Configs</a>'
@ -192,7 +190,7 @@ def links():
'</li>') '</li>')
print('</ul>' print('</ul>'
'</nav>' '</nav>'
'<div class="copyright-menu">HAproxy-WI v2.0.0.1</div>' '<div class="copyright-menu">HAproxy-WI v2.0.1</div>'
'</div>') '</div>')
def show_login_links(): def show_login_links():
@ -490,14 +488,16 @@ def ssh_command(serv, commands, **kwargs):
print(stderr.read().decode(encoding='UTF-8')) print(stderr.read().decode(encoding='UTF-8'))
def choose_only_select(serv, **kwargs): def choose_only_select(serv, **kwargs):
listhap = sql.get_dick_permit() if kwargs.get("virt"):
listhap = sql.get_dick_permit(virt=1)
else:
listhap = sql.get_dick_permit()
if kwargs.get("servNew"): if kwargs.get("servNew"):
servNew = kwargs.get("servNew") servNew = kwargs.get("servNew")
else: else:
servNew = "" servNew = ""
for i in listhap: for i in listhap:
if i[2] == serv or i[2] == servNew: if i[2] == serv or i[2] == servNew:
selected = 'selected' selected = 'selected'

View File

@ -15,7 +15,7 @@ def add_user(user, email, password, role, group):
with con: with con:
cur.executescript(sql) cur.executescript(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
return False return False
else: else:
return True return True
@ -34,7 +34,7 @@ def update_user(user, email, password, role, group, id):
with con: with con:
cur.executescript(sql) cur.executescript(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
return False return False
else: else:
return True return True
@ -60,7 +60,7 @@ def add_group(name, description):
with con: with con:
cur.executescript(sql) cur.executescript(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
return False return False
else: else:
return True return True
@ -74,7 +74,7 @@ def delete_group(id):
with con: with con:
cur.executescript(sql) cur.executescript(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
else: else:
return True return True
cur.close() cur.close()
@ -91,21 +91,21 @@ def update_group(name, descript, id):
with con: with con:
cur.executescript(sql) cur.executescript(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
return False return False
else: else:
return True return True
cur.close() cur.close()
con.close() con.close()
def add_server(hostname, ip, group): def add_server(hostname, ip, group, typeip):
con, cur = get_cur() con, cur = get_cur()
sql = """INSERT INTO servers (hostname, ip, groups) VALUES ('%s', '%s', '%s')""" % (hostname, ip, group) sql = """INSERT INTO servers (hostname, ip, groups, type_ip) VALUES ('%s', '%s', '%s', '%s')""" % (hostname, ip, group, typeip)
try: try:
with con: with con:
cur.executescript(sql) cur.executescript(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
return False return False
else: else:
return True return True
@ -119,24 +119,25 @@ def delete_server(id):
with con: with con:
cur.executescript(sql) cur.executescript(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
else: else:
return True return True
cur.close() cur.close()
con.close() con.close()
def update_server(hostname, ip, group, id): def update_server(hostname, ip, group, typeip, id):
con, cur = get_cur() con, cur = get_cur()
sql = """update servers set sql = """update servers set
hostname = '%s', hostname = '%s',
ip = '%s', ip = '%s',
groups = '%s' groups = '%s',
where id = '%s'""" % (hostname, ip, group, id) type_ip = '%s'
where id = '%s'""" % (hostname, ip, group, typeip, id)
try: try:
with con: with con:
cur.executescript(sql) cur.executescript(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
cur.close() cur.close()
con.close() con.close()
@ -162,7 +163,7 @@ def select_groups(**kwargs):
try: try:
cur.execute(sql) cur.execute(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
else: else:
return cur.fetchall() return cur.fetchall()
cur.close() cur.close()
@ -174,14 +175,14 @@ def select_user_name_group(id):
try: try:
cur.execute(sql) cur.execute(sql)
except sqlite.Error as e: except sqlite.Error as e:
print('<br /><span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + '</span>') print('<span class="alert alert-danger" id="error">An error occurred: ' + e.args[0] + ' <a title="Close" id="errorMess"><b>X</b></a></span>')
else: else:
return cur.fetchone() return cur.fetchone()
cur.close() cur.close()
con.close() con.close()
def get_groups_select(id, **kwargs): def get_groups_select(id, **kwargs):
print('<select id="%s" name="%s">' % (id, id)) print('<select class="multiselect" id="%s" name="%s">' % (id, id))
print('<option disabled selected>Choose group</option>') print('<option disabled selected>Choose group</option>')
GROUPS = select_groups() GROUPS = select_groups()
selected = "" selected = ""
@ -199,7 +200,7 @@ def get_groups_select(id, **kwargs):
def select_servers(**kwargs): def select_servers(**kwargs):
con, cur = get_cur() con, cur = get_cur()
sql = """select * from servers ORDER BY id""" sql = """select * from servers ORDER BY groups """
if kwargs.get("server") is not None: if kwargs.get("server") is not None:
sql = """select * from servers where hostname='%s' """ % kwargs.get("server") sql = """select * from servers where hostname='%s' """ % kwargs.get("server")
try: try:
@ -211,13 +212,34 @@ def select_servers(**kwargs):
cur.close() cur.close()
con.close() con.close()
def get_dick_permit(): def get_type_ip_checkbox(id, **kwargs):
con, cur = get_cur()
sql = """select id, type_ip from servers where id='%s' """ % id
try:
cur.execute(sql)
except sqlite.Error as e:
print("An error occurred:", e.args[0])
else:
for server in cur.fetchall():
if server[1] == 1:
checked = 'checked'
else:
checked = ""
print('<label for="typeip-%s"> Virt </label><input type="checkbox" id="typeip-%s" %s>' % (server[0],server[0], checked))
cur.close()
con.close()
def get_dick_permit(**kwargs):
import http.cookies import http.cookies
import os import os
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
login = cookie.get('login') login = cookie.get('login')
con, cur = get_cur() con, cur = get_cur()
sql = """ select * from user where username = '%s' """ % login.value sql = """ select * from user where username = '%s' """ % login.value
if kwargs.get('virt'):
type_ip = ""
else:
type_ip = "type_ip = 0"
try: try:
cur.execute(sql) cur.execute(sql)
except sqlite.Error as e: except sqlite.Error as e:
@ -225,9 +247,13 @@ def get_dick_permit():
else: else:
for group in cur: for group in cur:
if group[5] == '1': if group[5] == '1':
sql = """ select * from servers """ if kwargs.get('virt') is None:
type_ip = 'where ' + type_ip
sql = """ select * from servers %s """ % type_ip
else: else:
sql = """ select * from servers where groups = '%s' """ % group[5] if kwargs.get('virt') is None:
type_ip = 'and ' + type_ip
sql = """ select * from servers where groups like '%{group}%' {type_ip} """.format(group=group[5], type_ip=type_ip)
try: try:
cur.execute(sql) cur.execute(sql)
except sqlite.Error as e: except sqlite.Error as e:
@ -252,6 +278,9 @@ def show_update_servers():
print('<td>') print('<td>')
get_groups_select("123", selected=server[3]) get_groups_select("123", selected=server[3])
print('</td>') print('</td>')
print('<td>')
get_type_ip_checkbox(server[0])
print('</td>')
print('<td><a class="delete" onclick="removeServer(%s)" style="cursor: pointer;"></a></td>' % server[0]) print('<td><a class="delete" onclick="removeServer(%s)" style="cursor: pointer;"></a></td>' % server[0])
print('</tr>') print('</tr>')
@ -283,6 +312,9 @@ def show_update_server(server):
print('<td>') print('<td>')
get_groups_select("123", selected=server[3]) get_groups_select("123", selected=server[3])
print('</td>') print('</td>')
print('<td>')
get_type_ip_checkbox(server[0])
print('</td>')
print('<td><a class="update-row" onclick="updateServer(%s)" style="cursor: pointer;"></a></td>' % server[0]) print('<td><a class="update-row" onclick="updateServer(%s)" style="cursor: pointer;"></a></td>' % server[0])
print('<td><a class="delete" onclick="removeServer(%s)" style="cursor: pointer;"></a></td>' % server[0]) print('<td><a class="delete" onclick="removeServer(%s)" style="cursor: pointer;"></a></td>' % server[0])
print('</tr>') print('</tr>')
@ -340,7 +372,7 @@ def get_roles_select(id, **kwargs):
print('</select>') print('</select>')
form = cgi.FieldStorage() form = cgi.FieldStorage()
error_mess = '<br /><span class="alert alert-danger" id="error">All fields must be completed <a title="Close" id="errorMess"><b>X</b></a></span>' error_mess = '<span class="alert alert-danger" id="error">All fields must be completed <a title="Close" id="errorMess"><b>X</b></a></span>'
if form.getvalue('newusername') is not None: if form.getvalue('newusername') is not None:
email = form.getvalue('newemail') email = form.getvalue('newemail')
@ -379,12 +411,13 @@ if form.getvalue('newserver') is not None:
hostname = form.getvalue('newserver') hostname = form.getvalue('newserver')
ip = form.getvalue('newip') ip = form.getvalue('newip')
group = form.getvalue('newservergroup') group = form.getvalue('newservergroup')
typeip = form.getvalue('typeip')
if ip is None or group is None: if ip is None or group is None:
print('Content-type: text/html\n') print('Content-type: text/html\n')
print(error_mess) print(error_mess)
else: else:
print('Content-type: text/html\n') print('Content-type: text/html\n')
if add_server(hostname, ip, group): if add_server(hostname, ip, group, typeip):
show_update_server(hostname) show_update_server(hostname)
if form.getvalue('serverdel') is not None: if form.getvalue('serverdel') is not None:
@ -419,11 +452,12 @@ if form.getvalue('updateserver') is not None:
name = form.getvalue('updateserver') name = form.getvalue('updateserver')
ip = form.getvalue('ip') ip = form.getvalue('ip')
group = form.getvalue('servergroup') group = form.getvalue('servergroup')
typeip = form.getvalue('typeip')
id = form.getvalue('id') id = form.getvalue('id')
if name is None or ip is None: if name is None or ip is None:
print('Content-type: text/html\n') print('Content-type: text/html\n')
print(error_mess) print(error_mess)
else: else:
print('Content-type: text/html\n') print('Content-type: text/html\n')
update_server(name, ip, group, id) update_server(name, ip, group, typeip, id)

View File

@ -36,7 +36,7 @@ print('<br />'
'<select autofocus required name="serv" id="serv">' '<select autofocus required name="serv" id="serv">'
'<option disabled>Choose server</option>') '<option disabled>Choose server</option>')
funct.choose_only_select(serv) funct.choose_only_select(serv, virt=1)
print('</select>' print('</select>'
'<a class="ui-button ui-widget ui-corner-all" id="show" title="Show stats" onclick="showStats()">Show</a>' '<a class="ui-button ui-widget ui-corner-all" id="show" title="Show stats" onclick="showStats()">Show</a>'

View File

@ -326,7 +326,7 @@ pre {
.menu { .menu {
font-weight: bold; font-weight: bold;
font-style: italic; font-style: italic;
min-height: calc(100vh - 90px); min-height: calc(100vh - 70px);
} }
.menu ul li{ .menu ul li{
padding: 10px; padding: 10px;
@ -396,7 +396,6 @@ pre {
background-color: #4A89D8 !important; background-color: #4A89D8 !important;
border: none !important; border: none !important;
border-color: #5D9CEB !important; border-color: #5D9CEB !important;
font-weight: bold !important;
} }
.ui-tooltip, .arrow:after { .ui-tooltip, .arrow:after {
background: #33414E !important; background: #33414E !important;
@ -411,7 +410,7 @@ pre {
background: #5d9ceb !important; background: #5d9ceb !important;
} }
.ui-menu, .ui-menu-item { .ui-menu, .ui-menu-item {
background: #EBF1F133 !important; background: #EBF1F1 !important;
} }
a { a {
background-color: transparent; background-color: transparent;
@ -530,9 +529,13 @@ a:focus {
padding-left: 10px; padding-left: 10px;
} }
.alert-danger { .alert-danger {
color:#a94442; color: #a94442;
background-color:#f2dede; background-color: #f2dede;
border-color:#ebccd1 border-color: #ebccd1;
width: 230px;
display: block;
margin-top: 15px;
margin-bottom: -50px;
} }
label { label {
display: inline-block; display: inline-block;

View File

@ -1,9 +1,11 @@
var users = '/inc/usersdop.js' var users = '/inc/usersdop.js'
var awesome = "/inc/fontawesome.min.js"
$( function() { $( function() {
$('#error').hide(); $('.alert-danger').remove();
$('#add-user').click(function() { $('#add-user').click(function() {
$('#error').hide(); $('#error').remove();
$.ajax( { $.ajax( {
url: "sql.py", url: "sql.py",
data: { data: {
@ -16,13 +18,16 @@ $( function() {
type: "GET", type: "GET",
success: function( data ) { success: function( data ) {
data = data.replace(/\s+/g,' '); data = data.replace(/\s+/g,' ');
if (data == '<br /><span class="alert alert-danger" id="error">All fields must be completed <a title="Close" id="errorMess"><b>X</b></a></span> ') { if (data.indexOf('error') != '-1') {
$("#ajax-users").append(data); $("#ajax-users").append(data);
$.getScript(users); $.getScript(users);
} else { } else {
$('.alert-danger').remove();
$("#ajax-users").append(data); $("#ajax-users").append(data);
$( "#ajax-users tr td" ).addClass( "update", 1000, callbackUser ); $( "#ajax-users tr td" ).addClass( "update", 1000, callbackUser );
$.getScript(url); $.getScript(url);
$.getScript(awesome);
$.getScript(users);
} }
} }
} ); } );
@ -43,24 +48,32 @@ $( function() {
} ); } );
}); });
$('#add-server').click(function() { $('#add-server').click(function() {
$('#error').hide(); $('#error').remove();
var typeip;
if ($('#typeip').is(':checked')) {
typeip = '1';
}
$.ajax( { $.ajax( {
url: "sql.py", url: "sql.py",
data: { data: {
newserver: $('#new-server-add').val(), newserver: $('#new-server-add').val(),
newip: $('#new-ip').val(), newip: $('#new-ip').val(),
newservergroup: $('#new-server-group-add').val(), newservergroup: $('#new-server-group-add').val(),
typeip: typeip
}, },
type: "GET", type: "GET",
success: function( data ) { success: function( data ) {
data = data.replace(/\s+/g,' '); data = data.replace(/\s+/g,' ');
if (data == '<br /><span class="alert alert-danger" id="error">All fields must be completed <a title="Close" id="errorMess"><b>X</b></a></span> ') { if (data.indexOf('error') != '-1') {
$("#ajax-servers").append(data); $("#ajax-servers").append(data);
$.getScript(users); $.getScript(users);
} else { } else {
$('.alert-danger').hide();
$("#ajax-servers").append(data); $("#ajax-servers").append(data);
$( "#ajax-servers tr td" ).addClass( "update", 1000, callback ); $( "#ajax-servers tr td" ).addClass( "update", 1000, callback );
$.getScript(url); $.getScript(url);
$.getScript(awesome);
$.getScript(users);
} }
} }
} ); } );
@ -196,12 +209,17 @@ function updateGroup(id) {
} ); } );
} }
function updateServer(id) { function updateServer(id) {
var typeip;
if ($('#typeip-'+id).is(':checked')) {
typeip = '1';
}
$.ajax( { $.ajax( {
url: "sql.py", url: "sql.py",
data: { data: {
updateserver: $('#hostname-'+id).val(), updateserver: $('#hostname-'+id).val(),
ip: $('#ip-'+id).val(), ip: $('#ip-'+id).val(),
servergroup: $('#servergroup-'+id+' option:selected' ).val(), servergroup: $('#servergroup-'+id+' option:selected' ).val(),
typeip: typeip,
id: id id: id
}, },
type: "GET", type: "GET",

View File

@ -1,5 +1,5 @@
$( function() { $( function() {
$('#errorMess').click(function() { $('.alert-danger').click(function() {
$('#error').hide(); $('.alert-danger').remove();
}); });
}); });