mirror of https://github.com/Aidaho12/haproxy-wi
v1.8.1
parent
6854bcda33
commit
209650f914
|
@ -277,7 +277,7 @@ print('</select>'
|
||||||
'<td class="addName">IP and Port:</td>'
|
'<td class="addName">IP and Port:</td>'
|
||||||
'<td class="addOption">'
|
'<td class="addOption">'
|
||||||
'<input type="text" name="ip" id="ip1" size="15" placeholder="172.28.0.1" class="form-control"><b>:</b>'
|
'<input type="text" name="ip" id="ip1" size="15" placeholder="172.28.0.1" class="form-control"><b>:</b>'
|
||||||
'<input type="number" name="port" required title="Port for bind listner" size="5" placeholder="8080" class="form-control">'
|
'<input type="number" name="port" required title="Port for bind listner" placeholder="8080" class="form-control">'
|
||||||
'<div class="tooltip tooltipTop">IP for bind listner, <b>if empty will be assignet on all IPs</b>. Start typing ip, or press down.</div>'
|
'<div class="tooltip tooltipTop">IP for bind listner, <b>if empty will be assignet on all IPs</b>. Start typing ip, or press down.</div>'
|
||||||
'</td>'
|
'</td>'
|
||||||
'</tr>'
|
'</tr>'
|
||||||
|
|
|
@ -37,9 +37,8 @@ def logging(serv, action):
|
||||||
now_utc = datetime.now(timezone(time_zone))
|
now_utc = datetime.now(timezone(time_zone))
|
||||||
IP = cgi.escape(os.environ["REMOTE_ADDR"])
|
IP = cgi.escape(os.environ["REMOTE_ADDR"])
|
||||||
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
|
cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
|
||||||
firstName = cookie.get('FirstName')
|
login = cookie.get('login')
|
||||||
lastName = cookie.get('LastName')
|
mess = now_utc.strftime(dateFormat) + " from " + IP + " user: " + login.value + " " + action + " for: " + serv + "\n"
|
||||||
mess = now_utc.strftime(dateFormat) + " from " + IP + " user: " + firstName.value + " " + lastName.value + " " + action + " for: " + serv + "\n"
|
|
||||||
log = open(fullpath + "log/config_edit.log", "a")
|
log = open(fullpath + "log/config_edit.log", "a")
|
||||||
log.write(mess)
|
log.write(mess)
|
||||||
log.close
|
log.close
|
||||||
|
@ -57,11 +56,15 @@ def telegram_send_mess(mess):
|
||||||
bot = telegram.Bot(token=token_bot, request=pp)
|
bot = telegram.Bot(token=token_bot, request=pp)
|
||||||
bot.send_message(chat_id=channel_name, text=mess)
|
bot.send_message(chat_id=channel_name, text=mess)
|
||||||
|
|
||||||
def check_login():
|
def check_login(**kwargs):
|
||||||
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')
|
||||||
|
role = cookie.get('role')
|
||||||
ref = os.environ.get("SCRIPT_NAME")
|
ref = os.environ.get("SCRIPT_NAME")
|
||||||
|
|
||||||
|
if kwargs.get("admins_area") == "1" and role.value != "admin":
|
||||||
|
print('<meta http-equiv="refresh" content="0; url=/">')
|
||||||
|
|
||||||
if login is None:
|
if login is None:
|
||||||
print('<meta http-equiv="refresh" content="0; url=login.py?ref=%s">' % ref)
|
print('<meta http-equiv="refresh" content="0; url=login.py?ref=%s">' % ref)
|
||||||
|
|
||||||
|
@ -161,8 +164,8 @@ def footer():
|
||||||
print('</center></div>'
|
print('</center></div>'
|
||||||
'<center>'
|
'<center>'
|
||||||
'<h3>'
|
'<h3>'
|
||||||
'<a href="#top" title="UP">UP</a>'
|
'<a class="ui-button ui-widget ui-corner-all" href="#top" title="Move up">UP</a>'
|
||||||
'</h3>'
|
'</h3><br />'
|
||||||
'</center>'
|
'</center>'
|
||||||
'<div class="footer">'
|
'<div class="footer">'
|
||||||
'<div class="footer-link">'
|
'<div class="footer-link">'
|
||||||
|
@ -414,7 +417,7 @@ def choose_only_select(serv, **kwargs):
|
||||||
print('<option value="%s" %s>%s</option>' % (listhap.get(i), selected, i))
|
print('<option value="%s" %s>%s</option>' % (listhap.get(i), selected, i))
|
||||||
|
|
||||||
def chooseServer(formName, title, note):
|
def chooseServer(formName, title, note):
|
||||||
print('<center><h2>' + title + '</h2>')
|
print('<h2>' + title + '</h2><center>')
|
||||||
print('<h3>Choose server</h3>')
|
print('<h3>Choose server</h3>')
|
||||||
print('<form action=' + formName + ' method="get">')
|
print('<form action=' + formName + ' method="get">')
|
||||||
print('<p><select autofocus required name="serv" id="chooseServer">')
|
print('<p><select autofocus required name="serv" id="chooseServer">')
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
{ "name": "admin", "lists": "all" }
|
{ "name": "all", "lists": "all" }
|
||||||
{ "name": "mysql", "lists": "mysql" }
|
{ "name": "mysql", "lists": "mysql" }
|
||||||
{ "name": "web", "lists": "web" }
|
{ "name": "web", "lists": "web" }
|
|
@ -41,8 +41,6 @@ def login_page(error):
|
||||||
|
|
||||||
if form.getvalue('logout') is not None:
|
if form.getvalue('logout') is not None:
|
||||||
print("Set-cookie: login=; expires=Wed May 18 03:33:20 2003; path=/cgi-bin/; httponly")
|
print("Set-cookie: login=; expires=Wed May 18 03:33:20 2003; path=/cgi-bin/; httponly")
|
||||||
print("Set-cookie: FirstName=; expires=Wed May 18 03:33:20 2003; path=/cgi-bin/; httponly")
|
|
||||||
print("Set-cookie: LastName=; expires=Wed May 18 03:33:20 2003; path=/cgi-bin/; httponly")
|
|
||||||
print("Set-cookie: role=; expires=Wed May 18 03:33:20 2003; path=/cgi-bin/; httponly")
|
print("Set-cookie: role=; expires=Wed May 18 03:33:20 2003; path=/cgi-bin/; httponly")
|
||||||
print("Content-type: text/html\n")
|
print("Content-type: text/html\n")
|
||||||
print('<meta http-equiv="refresh" content="0; url=/">')
|
print('<meta http-equiv="refresh" content="0; url=/">')
|
||||||
|
@ -58,15 +56,12 @@ if login is not None and password is not None:
|
||||||
c["login"] = login
|
c["login"] = login
|
||||||
c["login"]["path"] = "/cgi-bin/"
|
c["login"]["path"] = "/cgi-bin/"
|
||||||
c["login"]["expires"] = "Wed May 18 03:33:20 2033"
|
c["login"]["expires"] = "Wed May 18 03:33:20 2033"
|
||||||
c["FirstName"] = users['firstName']
|
|
||||||
c["FirstName"]["path"] = "/cgi-bin/"
|
|
||||||
c["FirstName"]["expires"] = "Wed May 18 03:33:20 2033"
|
|
||||||
c["LastName"] = users['lastName']
|
|
||||||
c["LastName"]["path"] = "/cgi-bin/"
|
|
||||||
c["LastName"]["expires"] = "Wed May 18 03:33:20 2033"
|
|
||||||
c["role"] = users['role']
|
c["role"] = users['role']
|
||||||
c["role"]["path"] = "/cgi-bin/"
|
c["role"]["path"] = "/cgi-bin/"
|
||||||
c["role"]["expires"] = "Wed May 18 03:33:20 2033"
|
c["role"]["expires"] = "Wed May 18 03:33:20 2033"
|
||||||
|
c["group"] = users['group']
|
||||||
|
c["group"]["path"] = "/cgi-bin/"
|
||||||
|
c["group"]["expires"] = "Wed May 18 03:33:20 2033"
|
||||||
print(c)
|
print(c)
|
||||||
if form.getvalue('ref') is None:
|
if form.getvalue('ref') is None:
|
||||||
ref = "/index.html"
|
ref = "/index.html"
|
||||||
|
|
|
@ -18,9 +18,7 @@ path_config = "haproxy-webintarface.config"
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.read(path_config)
|
config.read(path_config)
|
||||||
|
|
||||||
print('<center>'
|
print('<h2>HAproxy Logs</h2>'
|
||||||
'<h2>HAproxy Logs</h2>'
|
|
||||||
'</center>'
|
|
||||||
'<table class="overview">'
|
'<table class="overview">'
|
||||||
'<tr class="overviewHead">'
|
'<tr class="overviewHead">'
|
||||||
'<td class="padding10">Server</td>'
|
'<td class="padding10">Server</td>'
|
||||||
|
@ -52,8 +50,14 @@ print('</td><td><input type="number" name="rows" %s class="form-control" require
|
||||||
print('<td><input type="text" name="grep" class="form-control" %s >' % grep)
|
print('<td><input type="text" name="grep" class="form-control" %s >' % grep)
|
||||||
print('</td>'
|
print('</td>'
|
||||||
'<td class="padding10" >'
|
'<td class="padding10" >'
|
||||||
'<button type="submit">Show</button>'
|
'<button type="submit">Show</button>')
|
||||||
'</td>'
|
if form.getvalue('serv') is not None:
|
||||||
|
print('<span style="float: right; margin-top: 8px;">'
|
||||||
|
'<a href="" title="Update logs" id="update">'
|
||||||
|
'<img alt="Update" src="/image/pic/update.png" style="max-width: 20px;">'
|
||||||
|
'</a>'
|
||||||
|
'</span>')
|
||||||
|
print('</td>'
|
||||||
'</form>'
|
'</form>'
|
||||||
'</tr></table>')
|
'</tr></table>')
|
||||||
|
|
||||||
|
|
|
@ -27,11 +27,11 @@ print('<h2>Quick Status </h2>'
|
||||||
if funct.is_admin():
|
if funct.is_admin():
|
||||||
|
|
||||||
print('<tr class="overviewHead">'
|
print('<tr class="overviewHead">'
|
||||||
'<td class="padding10">User name</td>'
|
'<td class="padding10">Login</td>'
|
||||||
'<td>Group</td>'
|
'<td>Group</td>'
|
||||||
'<td class="padding10">'
|
'<td class="padding10">'
|
||||||
'Role'
|
'Role'
|
||||||
'<!--<span class="add-button" title="Just a button, do nothing )">+ Add </span>-->'
|
'</td><td style="width: 200px;">'
|
||||||
'<span class="add-button">'
|
'<span class="add-button">'
|
||||||
'<a href="#" title="Show all users" id="show-all-users" style="color: #fff">'
|
'<a href="#" title="Show all users" id="show-all-users" style="color: #fff">'
|
||||||
'Show all'
|
'Show all'
|
||||||
|
@ -47,10 +47,10 @@ if funct.is_admin():
|
||||||
users = json.loads(f)
|
users = json.loads(f)
|
||||||
if i is 4:
|
if i is 4:
|
||||||
style = 'style="display: none;" class="show-users"'
|
style = 'style="display: none;" class="show-users"'
|
||||||
print('<tr ' + style + '><td class="padding10">' + users['firstName'] + ' ' + users['lastName'] +'</td><td>')
|
print('<tr ' + style + '><td class="padding10">' + users['login'] +'</td><td>')
|
||||||
print(users['group']+'</td><td>')
|
print(users['group']+'</td><td>')
|
||||||
print(users['role'])
|
print(users['role'])
|
||||||
print('</td></tr>')
|
print('</td><td></td></tr>')
|
||||||
|
|
||||||
print('<tr class="overviewHead">'
|
print('<tr class="overviewHead">'
|
||||||
'<td class="padding10">Server</td>'
|
'<td class="padding10">Server</td>'
|
||||||
|
@ -59,10 +59,11 @@ print('<tr class="overviewHead">'
|
||||||
'</td>'
|
'</td>'
|
||||||
'<td class="padding10">'
|
'<td class="padding10">'
|
||||||
'Action'
|
'Action'
|
||||||
'<!--<span class="add-button" title="Just a button, do nothing )">+ Add</span>-->'
|
'</td>'
|
||||||
'<a href="" title="Update status" id="update">'
|
'<td>'
|
||||||
'<img alt="Update" src="/image/pic/update.png" class="icon" style="margin-left: 20px; float: right">'
|
'<a href="" title="Update status" id="update">'
|
||||||
'</a></span>'
|
'<img alt="Update" src="/image/pic/update.png" class="icon" style="padding-right: 8px; float: right">'
|
||||||
|
'</a></span>'
|
||||||
'</td>'
|
'</td>'
|
||||||
'</tr>')
|
'</tr>')
|
||||||
|
|
||||||
|
@ -70,16 +71,16 @@ listhap = funct.get_dick_after_permit()
|
||||||
|
|
||||||
commands = [ "ps -Af |grep [h]aproxy |wc -l" ]
|
commands = [ "ps -Af |grep [h]aproxy |wc -l" ]
|
||||||
for i in sorted(listhap):
|
for i in sorted(listhap):
|
||||||
print('<tr><td class="padding10">' + i + '</td><td>')
|
print('<tr><td class="padding10"><a href="#%s" title="Go to %s status" style="color: #000">%s</a></td><td>' % (i, i, i))
|
||||||
funct.ssh_command(listhap.get(i), commands, server_status="1")
|
funct.ssh_command(listhap.get(i), commands, server_status="1")
|
||||||
print('</td><td>')
|
print('</td><td>')
|
||||||
print('<a href="/cgi-bin/configshow.py?serv=%s&open=open#conf" title="Show config"><img src=/image/pic/show.png alt="show" class="icon"></a>' % listhap.get(i))
|
print('<a href="/cgi-bin/configshow.py?serv=%s&open=open#conf" title="Show config"><img src=/image/pic/show.png alt="show" class="icon"></a>' % listhap.get(i))
|
||||||
print('<a href="/cgi-bin/config.py?serv=%s&open=open#conf" title="Edit config"><img src=/image/pic/edit.png alt="edit" class="icon"></a>' % listhap.get(i))
|
print('<a href="/cgi-bin/config.py?serv=%s&open=open#conf" title="Edit config"><img src=/image/pic/edit.png alt="edit" class="icon"></a>' % listhap.get(i))
|
||||||
print('<a href="/cgi-bin/diff.py?serv=%s&open=open#diff" title="Compare config"><img src=/image/pic/compare.png alt="compare" class="icon"></a>' % listhap.get(i))
|
print('<a href="/cgi-bin/diff.py?serv=%s&open=open#diff" title="Compare config"><img src=/image/pic/compare.png alt="compare" class="icon"></a>' % listhap.get(i))
|
||||||
print('<a href="/cgi-bin/map.py?serv=%s&open=open#map" title="Map listen/frontend/backend"><img src=/image/pic/map.png alt="map" class="icon"></a>' % listhap.get(i))
|
print('<a href="/cgi-bin/map.py?serv=%s&open=open#map" title="Map listen/frontend/backend"><img src=/image/pic/map.png alt="map" class="icon"></a>' % listhap.get(i))
|
||||||
print('</td></tr>')
|
print('</td><td></td></tr>')
|
||||||
|
|
||||||
print('</table><table><tr class="overviewHead">'
|
print('</table><table class="overview"><tr class="overviewHead">'
|
||||||
'<td class="padding10">Server</td>'
|
'<td class="padding10">Server</td>'
|
||||||
'<td class="padding10">'
|
'<td class="padding10">'
|
||||||
'Server status'
|
'Server status'
|
||||||
|
@ -87,12 +88,13 @@ print('</table><table><tr class="overviewHead">'
|
||||||
'<a href="" title="Update status" id="update">'
|
'<a href="" title="Update status" id="update">'
|
||||||
'<img alt="Update" src="/image/pic/update.png" style="max-width: 20px;">'
|
'<img alt="Update" src="/image/pic/update.png" style="max-width: 20px;">'
|
||||||
'</a>'
|
'</a>'
|
||||||
|
'</span>'
|
||||||
'</td>'
|
'</td>'
|
||||||
'</tr>')
|
'</tr>')
|
||||||
print('</td></tr>')
|
print('</td></tr>')
|
||||||
commands = [ "cat /etc/haproxy/haproxy.cfg |grep -E '^listen|^backend|^frontend' |grep -v stats |wc -l", "uname -smor", "haproxy -v |head -1", "top -u haproxy -b -n 1" ]
|
commands = [ "cat /etc/haproxy/haproxy.cfg |grep -E '^listen|^backend|^frontend' |grep -v stats |wc -l", "uname -smor", "haproxy -v |head -1", "top -u haproxy -b -n 1" ]
|
||||||
for i in sorted(listhap):
|
for i in sorted(listhap):
|
||||||
print('<tr><td class="overviewTr"><h3 title="IP ' + listhap.get(i) + '">' + i + ':</h3></td>')
|
print('<tr><td class="overviewTr"><a name="'+i+'"></a><h3 title="IP ' + listhap.get(i) + '">' + i + ':</h3></td>')
|
||||||
print('<td class="overviewTd"><span style="margin-left: -10px;">Total listen/frontend/backend:</span><pre>')
|
print('<td class="overviewTd"><span style="margin-left: -10px;">Total listen/frontend/backend:</span><pre>')
|
||||||
funct.ssh_command(listhap.get(i), commands)
|
funct.ssh_command(listhap.get(i), commands)
|
||||||
print('</pre></td></tr>')
|
print('</pre></td></tr>')
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
{ "firstName": "admin", "lastName": "admin", "login": "admin", "password": "admin", "role": "admin", "group": "admin" }
|
{ "login": "admin", "password": "admin", "role": "admin", "group": "all" }
|
||||||
{ "firstName": "Editor", "lastName": "Editor", "login": "Editor", "password": "Editor@123", "role": "editor", "group": "admin" }
|
{ "login": "Editor", "password": "Editor@123", "role": "editor", "group": "all" }
|
||||||
{ "firstName": "Guest", "lastName": "Guest", "login": "Guest", "password": "Guest@123", "role": "guest", "group": "admin" }
|
{ "login": "Guest", "password": "Guest@123", "role": "guest", "group": "all" }
|
||||||
|
|
16
script.js
16
script.js
|
@ -4,16 +4,17 @@ $( function() {
|
||||||
$( "#tabs" ).tabs( "option", "active", 2 );
|
$( "#tabs" ).tabs( "option", "active", 2 );
|
||||||
} );
|
} );
|
||||||
$( "select" ).selectmenu();
|
$( "select" ).selectmenu();
|
||||||
|
|
||||||
var tooltips = $( "[title]" ).tooltip({
|
var tooltips = $( "[title]" ).tooltip({
|
||||||
position: {
|
position: {
|
||||||
my: "left top",
|
my: "left top",
|
||||||
at: "right+5 top-5",
|
at: "right+5 top-25",
|
||||||
collision: "none"
|
collision: "none"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$( "input[type=submit], button" ).button();
|
$( "input[type=submit], button" ).button();
|
||||||
$( "input[type=checkbox]" ).checkboxradio();
|
$( "input[type=checkbox]" ).checkboxradio();
|
||||||
|
$( "#number" ).spinner();
|
||||||
$( ".controlgroup" ).controlgroup();
|
$( ".controlgroup" ).controlgroup();
|
||||||
$( ".configShow" ).accordion({
|
$( ".configShow" ).accordion({
|
||||||
collapsible: true,
|
collapsible: true,
|
||||||
|
@ -261,4 +262,13 @@ $( function() {
|
||||||
$("#optionsInput2").append(ui.item.value + " ")
|
$("#optionsInput2").append(ui.item.value + " ")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} );
|
input = $('<tr><td><input type="text" name="login-add" value="" class="form-control"></td> <td><input type="passwrod" name="passwrod-add" value="" class="form-control"></td> <td><input type="text" name="role-add" value="" class="form-control"></td><td><input type="text" name="groups-add" value="" class="form-control"></td></tr>');
|
||||||
|
$( "#add-user" ).click( function(){
|
||||||
|
$( "#users-table" ).append(input);
|
||||||
|
});
|
||||||
|
} );
|
||||||
|
|
||||||
|
function removeUser(id) {
|
||||||
|
document.getElementById(id).parentNode.removeChild(document.getElementById(id));
|
||||||
|
return false;
|
||||||
|
}
|
25
style.css
25
style.css
|
@ -150,6 +150,12 @@ iframe {
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
}
|
}
|
||||||
|
.line:hover, .line3:hover, tr:hover {
|
||||||
|
background-color: #EEEEEE;
|
||||||
|
}
|
||||||
|
.overviewHead:hover {
|
||||||
|
background-color: #EBF1F1
|
||||||
|
}
|
||||||
.comment {
|
.comment {
|
||||||
color: #aaa;
|
color: #aaa;
|
||||||
}
|
}
|
||||||
|
@ -164,6 +170,9 @@ iframe {
|
||||||
.addButton {
|
.addButton {
|
||||||
padding-top: 15px;
|
padding-top: 15px;
|
||||||
}
|
}
|
||||||
|
.addButton:hover {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
.addSuc {
|
.addSuc {
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
padding-top: 20px;
|
padding-top: 20px;
|
||||||
|
@ -220,12 +229,12 @@ iframe {
|
||||||
.add-button {
|
.add-button {
|
||||||
background-color: #5CB85C;
|
background-color: #5CB85C;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
margin-left: 20px;
|
|
||||||
color: #fff;
|
color: #fff;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
float: right;
|
float: right;
|
||||||
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
.serverDown {
|
.serverDown {
|
||||||
background-color: red;
|
background-color: red;
|
||||||
|
@ -237,6 +246,16 @@ iframe {
|
||||||
.ro {
|
.ro {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
.remove {
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0 1px 0 rgba(0,0,0,.1);
|
||||||
|
background-color: #ca4333;
|
||||||
|
background-image: linear-gradient(180deg,#d44a3a,#bc3829);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #d44a3a;
|
||||||
|
padding: 5px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
.menu {
|
.menu {
|
||||||
margin-left: 13%;
|
margin-left: 13%;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
@ -319,6 +338,10 @@ iframe {
|
||||||
background-color: #5D9CEB !important;
|
background-color: #5D9CEB !important;
|
||||||
border-color: #5D9CEB !important;
|
border-color: #5D9CEB !important;
|
||||||
}
|
}
|
||||||
|
.ui-button {
|
||||||
|
padding-left: 10px !important;
|
||||||
|
padding-right: 10px !important;
|
||||||
|
}
|
||||||
.ui-tooltip, .arrow:after {
|
.ui-tooltip, .arrow:after {
|
||||||
background: #33414E !important;
|
background: #33414E !important;
|
||||||
border: 1px solid #33414E !important;
|
border: 1px solid #33414E !important;
|
||||||
|
|
Loading…
Reference in New Issue