Attack to privilege escalation, saved servers, bug fix
pull/161/head
Pavel Loginov 2019-10-09 09:35:35 +03:00
parent 949e485afb
commit 6933f41644
15 changed files with 453 additions and 142 deletions

View File

@ -59,7 +59,7 @@ Support the project
## RPM
Install repository:
```
yum install https://repo.haproxy-wi.org/el7/haproxy-wi-release-7-1-0.noarch.rpm
yum install https://repo.haproxy-wi.org/haproxy-wi-release-7-1-0.noarch.rpm
```
After install HAProxy-WI:
```
@ -182,13 +182,6 @@ For Runtime API, Metrics and Alerting enable state file and stat socket on HApro
```
![alt text](image/haproxy-wi-logs.png "View logs page")
# Update
```
# cd /var/www/haproxy-wi
# ./update.sh
```
After update old config saved at /tmp/ folder. Compare new and old config, if in new no changes overwrite the new configuration with the old one, or edit new with your ENV.
# Update DB
```

View File

@ -25,7 +25,6 @@ try:
servers = sql.get_dick_permit()
user_group = sql.get_user_group_by_uuid(user_id.value)
token = sql.get_token(user_id.value)
except:
pass
@ -39,6 +38,7 @@ template = template.render(title = "Add",
group = user_group,
versions = funct.versions(),
options = sql.select_options(),
saved_servers = sql.select_saved_servers(),
token = token)
print(template)

View File

@ -123,6 +123,7 @@ def create_table(**kwargs):
CREATE TABLE IF NOT EXISTS `settings` (`param` varchar(64) UNIQUE, value varchar(64), section varchar(64), `desc` varchar(100));
CREATE TABLE IF NOT EXISTS `version` (`version` varchar(64));
CREATE TABLE IF NOT EXISTS `options` ( `id` INTEGER NOT NULL, `options` VARCHAR ( 64 ), `groups` VARCHAR ( 120 ), PRIMARY KEY(`id`));
CREATE TABLE IF NOT EXISTS `saved_servers` ( `id` INTEGER NOT NULL, `server` VARCHAR ( 64 ), `description` VARCHAR ( 120 ), `groups` VARCHAR ( 120 ), PRIMARY KEY(`id`));
"""
try:
cur.executescript(sql)
@ -360,7 +361,7 @@ def update_db_v_3_4_5_2(**kwargs):
if e.args[0] == 'duplicate column name: version' or e == "1060 (42S21): Duplicate column name 'version' ":
print('Updating... go to version 3.4.7')
else:
print("DB was update to 3.4.5.2")
print("DB was update to 3.4.5.3")
return False
else:
return True
@ -418,6 +419,25 @@ def update_db_v_3_4_9_5(**kwargs):
con.close()
def update_db_v_3_5_3(**kwargs):
con, cur = get_cur()
sql = """CREATE TABLE IF NOT EXISTS `saved_servers` ( `id` INTEGER NOT NULL, `server` VARCHAR ( 64 ), `description` VARCHAR ( 120 ), `groups` VARCHAR ( 120 ), PRIMARY KEY(`id`)); """
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
if kwargs.get('silent') != 1:
if e.args[0] == 'duplicate column name: id' or e == "1060 (42S21): Duplicate column name 'id' ":
print('DB was update to 3.5.3')
else:
print("DB was update to 3.5.3")
return False
else:
return True
cur.close()
con.close()
def update_ver(**kwargs):
con, cur = get_cur()
sql = """update version set version = '3.5.2'; """
@ -472,6 +492,7 @@ def update_all():
update_db_v_3_4_5_22()
update_db_v_3_4_7()
update_db_v_3_4_9_5()
update_db_v_3_5_3()
update_to_hash()
update_ver()
@ -491,6 +512,7 @@ def update_all_silent():
update_db_v_3_4_5_22()
update_db_v_3_4_7(silent=1)
update_db_v_3_4_9_5(silent=1)
update_db_v_3_5_3(silent=1)
update_to_hash()
update_ver()

View File

@ -16,4 +16,5 @@ CREATE TABLE IF NOT EXISTS `telegram` (`id` integer primary key auto_increment,
CREATE TABLE IF NOT EXISTS `metrics` (`serv` varchar(64), curr_con INTEGER, cur_ssl_con INTEGER, sess_rate INTEGER, max_sess_rate INTEGER,`date` DATETIME default '0000-00-00 00:00:00');
CREATE TABLE IF NOT EXISTS `settings` (`param` varchar(64) UNIQUE, value varchar(64), section varchar(64), `desc` varchar(100));
CREATE TABLE IF NOT EXISTS `version` (`version` varchar(64), `hash` INTEGER NOT NULL DEFAULT 1,);
CREATE TABLE IF NOT EXISTS `options` ( `id` INTEGER NOT NULL, `options` VARCHAR ( 64 ), `groups` VARCHAR ( 120 ), PRIMARY KEY(`id`));
CREATE TABLE IF NOT EXISTS `options` ( `id` INTEGER NOT NULL, `options` VARCHAR ( 64 ), `groups` VARCHAR ( 120 ), PRIMARY KEY(`id`));
CREATE TABLE IF NOT EXISTS `saved_servers` ( `id` INTEGER NOT NULL, `server` VARCHAR ( 64 ), `description` VARCHAR ( 120 ), `groups` VARCHAR ( 120 ), PRIMARY KEY(`id`));

View File

@ -425,6 +425,21 @@ def get_user_role_by_uuid(uuid):
cur.close()
con.close()
def get_role_id_by_name(name):
con, cur = create_db.get_cur()
sql = """ select id from role where name = '%s' """ % name
try:
cur.execute(sql)
except sqltool.Error as e:
out_error(e)
else:
for user_id in cur.fetchall():
return user_id[0]
cur.close()
con.close()
def get_user_group_by_uuid(uuid):
con, cur = create_db.get_cur()
sql = """ select user.groups from user left join uuid as uuid on user.id = uuid.user_id where uuid.uuid = '%s' """ % uuid
@ -681,7 +696,6 @@ def select_options(**kwargs):
sql = """select * from options where options = '%s' """ % kwargs.get('option')
if kwargs.get('group'):
sql = """select options from options where groups = '{}' and options like '{}%' """.format(kwargs.get('group'), kwargs.get('term'))
#print(sql)
try:
cur.execute(sql)
except sqltool.Error as e:
@ -720,6 +734,66 @@ def delete_option(id):
con.close()
def insert_new_savedserver(server, description, group):
con, cur = create_db.get_cur()
sql = """insert into saved_servers(`server`, `description`, `groups`) values ('%s', '%s', '%s') """ % (server, description, group)
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
out_error(e)
con.rollback()
else:
return True
cur.close()
con.close()
def select_saved_servers(**kwargs):
con, cur = create_db.get_cur()
sql = """select * from saved_servers """
if kwargs.get('server'):
sql = """select * from saved_servers where server = '%s' """ % kwargs.get('server')
if kwargs.get('group'):
sql = """select server,description from saved_servers where groups = '{}' and server like '{}%' """.format(kwargs.get('group'), kwargs.get('term'))
try:
cur.execute(sql)
except sqltool.Error as e:
out_error(e)
else:
return cur.fetchall()
cur.close()
con.close()
def update_savedserver(server, description, id):
con, cur = create_db.get_cur()
sql = """ update saved_servers set
server = '%s',
description = '%s'
where id = '%s' """ % (server, description, id)
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
out_error(e)
con.rollback()
cur.close()
con.close()
def delete_savedserver(id):
con, cur = create_db.get_cur()
sql = """ delete from saved_servers where id = %s """ % (id)
try:
cur.execute(sql)
con.commit()
except sqltool.Error as e:
out_error(e)
con.rollback()
else:
return True
cur.close()
con.close()
def insert_mentrics(serv, curr_con, cur_ssl_con, sess_rate, max_sess_rate):
con, cur = create_db.get_cur()
if mysql_enable == '1':
@ -1203,6 +1277,17 @@ def show_update_option(option):
template = template.render(options=select_options(option=option))
print(template)
def show_update_savedserver(server):
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/ajax'))
template = env.get_template('/new_saved_servers.html')
print('Content-type: text/html\n')
template = template.render(server=select_saved_servers(server=server))
print(template)
def show_update_telegram(token, page):
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/ajax'))
@ -1293,6 +1378,7 @@ def check_token():
if form.getvalue('token') is None:
print('Content-type: text/html\n')
print("What the fuck?! U r hacker Oo?!")
import sys
sys.exit()
@ -1304,13 +1390,16 @@ if form.getvalue('newuser') is not None:
new_user = form.getvalue('newusername')
page = form.getvalue('page')
activeuser = form.getvalue('activeuser')
print('Content-type: text/html\n')
check_token()
if password is None or role is None or group is None:
print(error_mess)
else:
if add_user(new_user, email, password, role, group, activeuser):
show_update_user(new_user, page)
role_id = get_role_id_by_name(role)
if funct.is_admin(level=role_id):
if add_user(new_user, email, password, role, group, activeuser):
show_update_user(new_user, page)
else:
funct.logging(new_user, ' tried to do privilege escalation', haproxywi=1, login=1)
if form.getvalue('updateuser') is not None:
email = form.getvalue('email')
@ -1324,7 +1413,11 @@ if form.getvalue('updateuser') is not None:
if new_user is None or role is None or group is None:
print(error_mess)
else:
update_user(new_user, email, role, group, id, activeuser)
role_id = get_role_id_by_name(role)
if funct.is_admin(level=role_id):
update_user(new_user, email, role, group, id, activeuser)
else:
funct.logging(new_user, ' tried to do privilege escalation', haproxywi=1, login=1)
if form.getvalue('updatepassowrd') is not None:
@ -1550,6 +1643,56 @@ if form.getvalue('optiondel') is not None:
if delete_option(form.getvalue('optiondel')):
print("Ok")
if form.getvalue('getsavedserver'):
group = form.getvalue('getsavedserver')
term = form.getvalue('term')
print('Content-type: application/json\n')
check_token()
servers = select_saved_servers(group=group,term=term)
a = {}
v = 0
for i in servers:
a[v] = {}
a[v]['value'] = {}
a[v]['desc'] = {}
a[v]['value'] = i[0]
a[v]['desc'] = i[1]
v = v + 1
import json
print(json.dumps(a))
if form.getvalue('newsavedserver'):
savedserver = form.getvalue('newsavedserver')
description = form.getvalue('newsavedserverdesc')
group = form.getvalue('newsavedservergroup')
print('Content-type: text/html\n')
check_token()
if savedserver is None or group is None:
print(error_mess)
else:
if insert_new_savedserver(savedserver, description, group):
show_update_savedserver(savedserver)
if form.getvalue('updatesavedserver') is not None:
savedserver = form.getvalue('updatesavedserver')
description = form.getvalue('description')
id = form.getvalue('id')
print('Content-type: text/html\n')
check_token()
if savedserver is None or id is None:
print(error_mess)
else:
update_savedserver(savedserver, description, id)
if form.getvalue('savedserverdel') is not None:
print('Content-type: text/html\n')
check_token()
if delete_savedserver(form.getvalue('savedserverdel')):
print("Ok")
if form.getvalue('updatetoken') is not None:
token = form.getvalue('updatetoken')
chanel = form.getvalue('updategchanel')

View File

@ -3,7 +3,10 @@
<style>
.container {
margin-right: 0;
}
}
h3 {
width: 98.8%
}
</style>
<script src="/inc/add.js"></script>
<div id="tabs">
@ -14,6 +17,7 @@
<li><a href="#backend">Backend</a></li>
<li><a href="#ssl">SSL certificates</a></li>
<li><a href="#option">Options</a></li>
<li><a href="#add-servers">Servers</a></li>
{% if user %}
<a href=/app/login.py?logout=logout title="Logout, user name: {{ user }}" class="login"> Logout</a>
{% else %}
@ -809,7 +813,6 @@
Enter option for save:
</td>
<td>
<input type="hidden" id="newoptiongroup" name="newoptiongroup" value="{{ group }}">
<input type="text" name="new-option" id="new-option" class="form-control" size="100">
</td>
<td>
@ -817,12 +820,61 @@
</td>
</tr>
</table>
<div id="ajax-option">
<div id="ajax-option"></div>
<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
In this section you can create, edit and delete options with given parameters. And after use them as autocomplete in the "Add" sections
</div>
</div>
<div id="add-servers">
<table class="overview" id="servers_table">
<tr class="overviewHead">
<td class="padding10 first-collumn">Server</td>
<td class="padding10 first-collumn">Description</td>
<td></td>
</tr>
{% for s in saved_servers %}
<tr id="servers-saved-{{ s.0 }}" class="{{ loop.cycle('odd', 'even') }}">
{% if s.3 == group or group == '1' %}
<td class="padding10 first-collumn">
<input type="text" id="servers-ip-{{ s.0 }}" value="{{ s.1 }}" size="15" class="form-control">
</td>
<td class="padding10 first-collumn" style="width: 100%;">
<input type="text" id="servers-desc-{{ s.0 }}" value="{{ s.2 }}" size="60" class="form-control">
</td>
<td>
<a class="delete" onclick="confirmDeleteSavedServer({{ s.0 }})" title="Delete server {{s.1}}" style="cursor: pointer;"></a>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
<br /><span class="add-button" title="Add server" id="add-saved-server-button">+ Add</span>
<br /><br />
<table class="overview" id="saved-server-add-table" style="display: none;">
<tr class="overviewHead">
<td class="padding10 first-collumn">Server</td>
<td>Description</td>
<td></td>
</tr>
<tr>
<td class="padding10 first-collumn">
<input type="text" name="new-saved-servers" id="new-saved-servers" class="form-control" size="15">
</td>
<td style="width: 100%;">
<input type="text" name="new-saved-servers-description" id="new-saved-servers-description" class="form-control" size="60">
</td>
<td>
<a class="add-admin" id="add-saved-server-new" title="Add new server" style="cursor: pointer;"></a>
</td>
</tr>
</table>
<div id="ajax-servers"></div>
<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
In this section you can create, edit and delete servers. And after use them as autocomplete in the "Add" sections
</div>
</div>
<div id="dialog-confirm-delete" title="Are you sure you want to delete?" style="display: none;">
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:3px 12px 20px 0;"></span>Deleting all data will be lost?</p>
</div>

View File

@ -0,0 +1,13 @@
{% for s in server %}
<tr style="width: 50%;" id="servers-saved-{{s.0}}" class="newsavedserver update">
<td class="padding10 first-collumn">
<input type="text" id="servers-ip-{{s.0}}" class="form-control" value="{{s.1}}">
</td>
<td class="first-collumn" style="width: 50%;">
<input type="text" id="servers-desc-{{s.0}}" class="form-control" value="{{s.2}}">
</td>
<td>
<a class="delete" onclick="confirmDeleteSavedServer({{s.0}})" style="cursor: pointer;"></a>
</td>
</tr>
{% endfor %}

View File

@ -60,7 +60,15 @@
});
$("#usergroup-{{user.0}}" ).selectmenu({
width: 100
});
});
$( ".newuser" ).addClass( "update", 1000 );
$( "input[type=submit], button" ).button();
$( "input[type=checkbox]" ).checkboxradio();
$( "select" ).selectmenu();
$.getScript(awesome);
setTimeout(function() {
$( ".newuser" ).removeClass( "update" );
}, 2500 );
});
</script>
{% endfor %}

View File

@ -53,6 +53,7 @@
<li><a href=/app/versions.py title="Actions with configs versions" class="version head-submenu">Versions</a></li>
<li><a href=/app/add.py#ssl title="Upload SSL cert" class="cert head-submenu" id="add4">SSL</a></li>
<li><a href=/app/add.py#option title="Save custom options" class="option head-submenu" id="add5">Options</a></li>
<li><a href=/app/add.py#add-servers title="Save servers" class="runtime head-submenu" id="add6">Servers</a></li>
<li><a href=/app/lists.py title="Manage black and white lists" class="lists head-submenu">Lists</a> </li>
<li><a href=/app/waf.py title="Web application firewall" class="waf head-submenu">WAF</a> </li>
<li><a href=/app/ihap.py title="Installation HAProxy" class="hap head-submenu">Installation</a> </li>

View File

@ -11,7 +11,7 @@
</div>
<input type="hidden" id="new-group" name="new-group" value="{{ group }}">
<input type="hidden" id="new-server-group-add" name="new-server-group-add" value="{{ group }}" >
<input type="hidden" id="new-ssh-group-add" name="new-ssh-group-add" value="{{ ssh_group }}" >
<input type="hidden" id="new-ssh-group-add" name="new-ssh-group-add" value="{{ group }}" >
<div id="tabs">
<ul>
<li><a href="#users">Users</a></li>

View File

@ -341,7 +341,6 @@ $( function() {
$( "#option_table input" ).change(function() {
var id = $(this).attr('id').split('-');
updateOptions(id[2])
console.log(id)
});
$( "#options" ).autocomplete({
source: availableTags,
@ -354,7 +353,7 @@ $( function() {
});
$( "#saved-options" ).autocomplete({
dataType: "json",
source: "sql.py?getoption="+$('#newoptiongroup').val()+'&token='+$('#token').val(),
source: "sql.py?getoption="+$('#group').val()+'&token='+$('#token').val(),
autoFocus: true,
minLength: 1,
select: function( event, ui ) {
@ -373,7 +372,7 @@ $( function() {
});
$( "#saved-options1" ).autocomplete({
dataType: "json",
source: "sql.py?getoption="+$('#newoptiongroup').val()+'&token='+$('#token').val(),
source: "sql.py?getoption="+$('#group').val()+'&token='+$('#token').val(),
autoFocus: true,
minLength: 1,
select: function( event, ui ) {
@ -392,7 +391,7 @@ $( function() {
});
$( "#saved-options2" ).autocomplete({
dataType: "json",
source: "sql.py?getoption="+$('#newoptiongroup').val()+'&token='+$('#token').val(),
source: "sql.py?getoption="+$('#group').val()+'&token='+$('#token').val(),
autoFocus: true,
minLength: 1,
select: function( event, ui ) {
@ -414,7 +413,7 @@ $( function() {
url: "sql.py",
data: {
newtoption: $('#new-option').val(),
newoptiongroup: $('#newoptiongroup').val(),
newoptiongroup: $('#group').val(),
token: $('#token').val()
},
type: "GET",
@ -435,7 +434,64 @@ $( function() {
}
} );
});
$( "#servers_table input" ).change(function() {
var id = $(this).attr('id').split('-');
updateSavedServer(id[2])
});
$( '[name=servers]' ).autocomplete({
source: "sql.py?getsavedserver="+$('#group').val()+'&token='+$('#token').val(),
autoFocus: true,
minLength: 1,
focus: function( event, ui ) {
$(this).val( ui.item.value );
return false;
},
select: function( event, ui ) {
$(this).append(ui.item.value + " ");
$(this).next().focus();
}
})
.autocomplete( "instance" )._renderItem = function( ul, item ) {
return $( "<li>" )
.append( "<div>" + item.value + "<br>" + item.desc + "</div>" )
.appendTo( ul );
};
$('#add-saved-server-button').click(function() {
if ($('#saved-server-add-table').css('display', 'none')) {
$('#saved-server-add-table').show("blind", "fast");
}
});
$('#add-saved-server-new').click(function() {
$('#error').remove();
$('.alert-danger').remove();
$.ajax( {
url: "sql.py",
data: {
newsavedserver: $('#new-saved-servers').val(),
newsavedservergroup: $('#group').val(),
newsavedserverdesc: $('#new-saved-servers-description').val(),
token: $('#token').val()
},
type: "GET",
success: function( data ) {
if (data.indexOf('error') != '-1') {
$("#ajax-option").append(data);
$('#errorMess').click(function() {
$('#error').remove();
$('.alert-danger').remove();
});
} else {
$("#servers_table").append(data);
setTimeout(function() {
$( ".newsavedserver" ).removeClass( "update" );
}, 2500 );
$.getScript("/inc/fontawesome.min.js");
}
}
} );
});
var forward_for_var = "option forwardfor if-none\n";
$('#forward_for').click(function() {
if($('#optionsInput').val().indexOf(forward_for_var) == '-1') {
@ -909,4 +965,130 @@ function createHttps(TabId, proxy) {
$('#'+proxy+'-mode-select').selectmenu('refresh');
history.pushState('Add'+proxy, 'Add'+proxy, 'add.py#'+proxy)
}
function confirmDeleteOption(id) {
$( "#dialog-confirm-delete" ).dialog({
resizable: false,
height: "auto",
width: 400,
modal: true,
title: "Are you sure you want to delete " +$('#option-'+id).val() + "?",
buttons: {
"Delete": function() {
$( this ).dialog( "close" );
removeOption(id);
},
Cancel: function() {
$( this ).dialog( "close" );
}
}
});
}
function removeOption(id) {
$("#option-"+id).css("background-color", "#f2dede");
$.ajax( {
url: "sql.py",
data: {
optiondel: id,
token: $('#token').val()
},
type: "GET",
success: function( data ) {
data = data.replace(/\s+/g,' ');
if(data == "Ok ") {
$("#option-"+id).remove();
}
}
} );
}
function updateOptions(id) {
$('#error').remove();
$.ajax( {
url: "sql.py",
data: {
updateoption: $('#option-body-'+id).val(),
id: id,
token: $('#token').val()
},
type: "GET",
success: function( data ) {
data = data.replace(/\s+/g,' ');
if (data.indexOf('error') != '-1') {
$("#ajax-ssh").append(data);
$('#errorMess').click(function() {
$('#error').remove();
$('.alert-danger').remove();
});
} else {
$('.alert-danger').remove();
$("#option-"+id).addClass( "update", 1000 );
setTimeout(function() {
$( "#option-"+id ).removeClass( "update" );
}, 2500 );
}
}
} );
}
function confirmDeleteSavedServer(id) {
$( "#dialog-confirm-delete" ).dialog({
resizable: false,
height: "auto",
width: 400,
modal: true,
title: "Are you sure you want to delete " +$('#servers-saved-'+id).val() + "?",
buttons: {
"Delete": function() {
$( this ).dialog( "close" );
removeSavedServer(id);
},
Cancel: function() {
$( this ).dialog( "close" );
}
}
});
}
function removeSavedServer(id) {
$("#servers-saved-"+id).css("background-color", "#f2dede");
$.ajax( {
url: "sql.py",
data: {
savedserverdel: id,
token: $('#token').val()
},
type: "GET",
success: function( data ) {
data = data.replace(/\s+/g,' ');
if(data == "Ok ") {
$("#servers-saved-"+id).remove();
}
}
} );
}
function updateSavedServer(id) {
$('#error').remove();
$.ajax( {
url: "sql.py",
data: {
updatesavedserver: $('#servers-ip-'+id).val(),
description: $('#servers-desc-'+id).val(),
id: id,
token: $('#token').val()
},
type: "GET",
success: function( data ) {
data = data.replace(/\s+/g,' ');
if (data.indexOf('error') != '-1') {
$("#ajax-ssh").append(data);
$('#errorMess').click(function() {
$('#error').remove();
$('.alert-danger').remove();
});
} else {
$('.alert-danger').remove();
$("#option-"+id).addClass( "update", 1000 );
setTimeout(function() {
$( "#option-"+id ).removeClass( "update" );
}, 2500 );
}
}
} );
}

View File

@ -240,7 +240,6 @@ function showOverviewServer(name,ip,id) {
$("#ajax-server-"+id).removeClass( "update" );
$("#ajax-server-"+id).css('background-color', '#f9fff8');
}, 2500 );
// $.getScript('/inc/overview.js');
}
} );
}
@ -266,7 +265,7 @@ function showOverviewWaf() {
$( "input[type=submit], button" ).button();
$( "input[type=checkbox]" ).checkboxradio();
} else {
$('.first-collumn-wi').css('padding', '15px');
$('.first-collumn-wi').css('padding', '10px');
}
}
} );
@ -818,69 +817,6 @@ $( function() {
} );
}
});
function updateOptions(id) {
$('#error').remove();
$.ajax( {
url: "sql.py",
data: {
updateoption: $('#option-body-'+id).val(),
id: id,
token: $('#token').val()
},
type: "GET",
success: function( data ) {
data = data.replace(/\s+/g,' ');
if (data.indexOf('error') != '-1') {
$("#ajax-ssh").append(data);
$('#errorMess').click(function() {
$('#error').remove();
$('.alert-danger').remove();
});
} else {
$('.alert-danger').remove();
$("#option-"+id).addClass( "update", 1000 );
setTimeout(function() {
$( "#option-"+id ).removeClass( "update" );
}, 2500 );
}
}
} );
}
function confirmDeleteOption(id) {
$( "#dialog-confirm-delete" ).dialog({
resizable: false,
height: "auto",
width: 400,
modal: true,
title: "Are you sure you want to delete " +$('#option-'+id).val() + "?",
buttons: {
"Delete": function() {
$( this ).dialog( "close" );
removeOption(id);
},
Cancel: function() {
$( this ).dialog( "close" );
}
}
});
}
function removeOption(id) {
$("#option-"+id).css("background-color", "#f2dede");
$.ajax( {
url: "sql.py",
data: {
optiondel: id,
token: $('#token').val()
},
type: "GET",
success: function( data ) {
data = data.replace(/\s+/g,' ');
if(data == "Ok ") {
$("#option-"+id).remove();
}
}
} );
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

View File

@ -1,4 +1,3 @@
var users = '/inc/usersdop.js'
var awesome = "/inc/fontawesome.min.js"
jQuery.expr[':'].regex = function(elem, index, match) {
@ -510,15 +509,7 @@ function addUser() {
});
} else {
$('.alert-danger').remove();
$("#ajax-users").append(data);
$( ".newuser" ).addClass( "update", 1000 );
setTimeout(function() {
$( ".newuser" ).removeClass( "update" );
}, 2500 );
$.getScript(awesome);
$( "input[type=submit], button" ).button();
$( "input[type=checkbox]" ).checkboxradio();
$( "select" ).selectmenu();
$("#ajax-users").append(data);
}
}
} );
@ -779,8 +770,10 @@ function cloneServer(id) {
$('#slavefor').selectmenu("refresh");
$('#credentials').val($('#credentials-'+id+' option:selected').val()).change()
$('#credentials').selectmenu("refresh");
$('#new-server-group-add').val($('#servergroup-'+id+' option:selected').val()).change()
$('#new-server-group-add').selectmenu("refresh");
if (cur_url[0] == 'users.py') {
$('#new-server-group-add').val($('#servergroup-'+id+' option:selected').val()).change()
$('#new-server-group-add').selectmenu("refresh");
}
}
function cloneUser(id) {
$( "#add-user-button" ).trigger( "click" );
@ -792,8 +785,10 @@ function cloneUser(id) {
$('#activeuser').checkboxradio("refresh");
$('#new-role').val($('#role-'+id+' option:selected').val()).change()
$('#new-role').selectmenu("refresh");
$('#new-group').val($('#usergroup-'+id+' option:selected').val()).change()
$('#new-group').selectmenu("refresh");
if (cur_url[0] == 'users.py') {
$('#new-group').val($('#usergroup-'+id+' option:selected').val()).change();
$('#new-group').selectmenu("refresh");
}
}
function cloneTelegram(id) {
$( "#add-telegram-button" ).trigger( "click" );

View File

@ -292,7 +292,6 @@ sudo mkdir /var/www/$HOME_HAPROXY_WI/configs/kp_config/
sudo mkdir /var/www/$HOME_HAPROXY_WI/log/
sudo sudo chmod +x /var/www/$HOME_HAPROXY_WI/app/*.py
sudo chmod +x /var/www/$HOME_HAPROXY_WI/app/tools/*.py
chmod +x /var/www/$HOME_HAPROXY_WI/update.sh
sudo ln -s /usr/bin/python3.5 /usr/bin/python3
cd /var/www/$HOME_HAPROXY_WI/app

View File

@ -1,34 +0,0 @@
#!/bin/bash
cp app/haproxy-wi.cfg /tmp/
mv -f /tmp/haproxy-wi.cfg app/haproxy-wi.cfg
git reset --hard
git pull https://github.com/Aidaho12/haproxy-wi.git
chmod +x app/*py
chmod +x app/tools/*py
if hash apt-get 2>/dev/null; then
sudo chown -R www-data:www-data app/
else
sudo chown -R apache:apache app/
fi
cd app/
./create_db.py
LOG='/tmp/haproxy-wi_install.log'
pip3.5 install -r /var/www/haproxy-wi/requirements.txt &> $LOG
chmod +x ../update.sh
echo "################"
echo ""
echo "ATTENTION!!! New config file name is: haproxy-wi.cfg"
echo ""
echo ""
echo "Install log in $LOG"
echo ""
echo "################"