New the overview HAProxy-WI page
New the overview HAProxy page
pull/145/head
Pavel Loginov 2019-09-22 18:46:26 +03:00
parent 8228168082
commit 9f8aea610c
18 changed files with 429 additions and 194 deletions

View File

@ -401,7 +401,7 @@ def update_db_v_3_4_7(**kwargs):
def update_ver(**kwargs):
con, cur = get_cur()
sql = """update version set version = '3.4.8.1'; """
sql = """update version set version = '3.4.9'; """
try:
cur.execute(sql)
con.commit()

57
app/hapservers.py Normal file
View File

@ -0,0 +1,57 @@
#!/usr/bin/env python3
import funct, sql
import create_db
import os, http.cookies
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates/'))
template = env.get_template('hapservers.html')
print('Content-type: text/html\n')
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)
users = sql.select_users()
groups = sql.select_groups()
token = sql.get_token(user_id.value)
servers = sql.get_dick_permit()
except:
pass
haproxy_sock_port = sql.get_setting('haproxy_sock_port')
servers_with_status1 = []
out1 = ""
for s in servers:
# print(s[2])
servers_with_status = list()
cmd = 'echo "show info" |nc %s %s -w 1 |grep -e "Ver\|Uptime:"' % (s[2], haproxy_sock_port)
# print(cmd )
out = funct.subprocess_execute(cmd)
servers_with_status.append(s[0])
servers_with_status.append(s[1])
servers_with_status.append(s[2])
servers_with_status.append(s[11])
for k in out:
if "Ncat: Connection refused." not in k and "Ncat: Connection timed out." not in k:
out1 = out
else:
out1 = False
servers_with_status.append(out1)
servers_with_status1.append(servers_with_status)
# print(servers_with_status1)
template = template.render(h2 = 1,
autorefresh = 1,
title = "HAProxy servers overview",
role = sql.get_user_role_by_uuid(user_id.value),
user = user,
users = users,
groups = groups,
servers = servers_with_status1,
versions = funct.versions(),
token = token)
print(template)

View File

@ -28,6 +28,8 @@ try:
metrics_master, stderr = funct.subprocess_execute(cmd)
cmd = "ps ax |grep -e 'metrics_worker\|metrics_waf_worker.py' |grep -v grep |wc -l"
metrics_worker, stderr = funct.subprocess_execute(cmd)
cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l"
keep_alive, stderr = funct.subprocess_execute(cmd)
except:
pass
@ -43,6 +45,7 @@ template = template.render(h2 = 1,
metrics_worker = ''.join(metrics_worker),
checker_master = ''.join(checker_master),
checker_worker = ''.join(checker_worker),
keep_alive = ''.join(keep_alive),
error = stderr,
versions = funct.versions(),
token = token)

View File

@ -15,15 +15,14 @@ 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 ]
commands1 = [ "ps ax |grep waf/bin/modsecurity |grep -v grep |wc -l" ]
# commands1 = [ "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 |grep -e "Process_num"' % (serv2, haproxy_sock_port)
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)),
funct.ssh_command(serv2, commands),
funct.ssh_command(serv2, commands1),
funct.ssh_command(serv2, commands),
sql.select_servers(server=serv2, keep_alive=1),
funct.subprocess_execute(commands2))
return server_status
@ -68,8 +67,13 @@ def get_overviewWaf(url):
ioloop.close()
async def async_get_overviewServers(serv1, serv2, desc):
commands = [ "top -u haproxy -b -n 1" ]
cmd = 'echo "show info" |nc %s %s |grep -e "Ver\|CurrConns\|SessRate\|Maxco\|MB\|Uptime:"' % (serv2, haproxy_sock_port)
# commands = [ "top -u haproxy -b -n 1" ]
# commands = [ "top -u haproxy -b -n 1 -o %MEM |grep -e 'haproxy\|PID' |awk '{print $1\"\t\"$5\"\t\"$9\"\t\"$10\"\t\"$11}'" ]
commands = [ "top -u haproxy -b -n 1 -w 67 |grep -e 'haproxy\|PID\|Cpu\|KiB' |grep -v Swap" ]
if desc == "hapservers.py":
cmd = 'echo "show info" |nc %s %s -w 1|grep -e "Ver\|CurrConns\|Maxco\|MB\|Uptime:"' % (serv2, haproxy_sock_port)
else:
cmd = 'echo "show info" |nc %s %s -w 1|grep -e "Ver\|CurrConns\|SessRate\|Maxco\|MB\|Uptime:"' % (serv2, haproxy_sock_port)
out = funct.subprocess_execute(cmd)
out1 = ""
user_id = cookie.get('uuid')
@ -81,7 +85,7 @@ async def async_get_overviewServers(serv1, serv2, desc):
os.system("/bin/rm -f " + cfg)
for k in out:
if "Ncat: Connection refused." not in k:
if "Ncat: Connection refused." not in k and "Ncat: Connection timed out." not in k:
for r in k:
out1 += r
out1 += "<br />"
@ -95,21 +99,27 @@ async def async_get_overviewServers(serv1, serv2, desc):
return server_status
async def get_runner_overviewServers():
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(server[1], server[2], server[11]) for server in listhap]
if kwargs.get('server1'):
futures = [async_get_overviewServers(kwargs.get('server1'), kwargs.get('server2'), 'hapservers.py')]
else:
futures = [async_get_overviewServers(server[1], server[2], server[11]) 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=role)
template = template.render(service_status=servers_sorted, role=role,page=kwargs.get('page'))
print(template)
def get_overviewServers():
def get_overviewServers(**kwargs):
server1 = kwargs.get('name')
server2 = kwargs.get('ip')
page = kwargs.get('page')
ioloop = asyncio.get_event_loop()
ioloop.run_until_complete(get_runner_overviewServers())
ioloop.run_until_complete(get_runner_overviewServers(server1=server1, server2=server2,page=page))
ioloop.close()
def get_map(serv):

View File

@ -117,5 +117,6 @@
<button type='submit' value='save' name='save' class='btn btn-default'>Just save</button>
<button type='submit' value='' name='' class='btn btn-default'>Upload and restart</button>
</form>
<div class="alert alert-info"><b>Note:</b> If you reconfigure Master server, Slave will reconfigured automatically</div>
</center>
{% endif %}

View File

@ -4,14 +4,15 @@
{% do waf_servers.append(1) %}
<tr class="{{ loop.cycle('odd', 'even') }}" id="{{service.0}}-select-line">
<td class="padding10 first-collumn">
{% if service.2|int() >= 1 %}
<span class="serverUp" title="running {{service.2 }} processes"> UP</span>
{% else %}
<span class="serverDown"> DOWN</span>
{% endif %}
<a href="#{{ service.0 }}" title="Go to {{ service.0 }} status" style="color: #000">{{ service.0 }}</a>
</td>
<td class="second-collumn">
{% if service.2|int() >= 1 %}
<span class="serverUp"> UP</span> running {{service.2 }} processes
{% else %}
<span class="serverDown"> DOWN</span> running {{service.2 }} processes
{% endif %}
</td>
<td>
{% if role <= 1 %}

View File

@ -1,12 +1,17 @@
{% for service in service_status %}
<tr class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10">
<a href="#{{ service.0 }}" title="Go to {{ service.0 }} status" style="color: #000; padding-left: 15px;">
<td class="padding10 first-collumn">
{% if service.2|int() >= 1 %}
<span class="serverUp" title="running {{service.2 }} processes"> UP</span>
{% else %}
<span class="serverDown"> DOWN</span>
{% endif %}
<a href="#{{ service.0 }}" title="Go to {{ service.0 }} status" style="color: #000;">
{{ service.0 }}
{% if service.5.0.0|int() >= 1 %}
{% if service.4.0.0|int() >= 1 %}
<img
{% if service.6.0.0|int() >= 1 %}
{% if service.5.0.0|int() >= 1 %}
src="/inc/images/shield.png" title="Auto start enabled"
{% else %}
src="/inc/images/shield-red.png" title="Auto start enabled, but keep alive service does not work"
@ -17,11 +22,7 @@
</a>
</td>
<td class="second-collumn">
{% if service.2|int() >= 1 %}
<span class="serverUp"> UP</span> running {{service.2 }} processes
{% else %}
<span class="serverDown"> DOWN</span> running {{service.2 }} processes
{% endif %}
</td>
<td>
{% if role <= 1 %}

View File

@ -1,36 +1,46 @@
{% for service in service_status %}
<tr>
<td class="overviewTr first-collumn">
<div class="server-info">
{% if page != 'hapservers.py' %}
<a name="{{ service.0 }}"></a>
{% if service.5 != "None" %}
<h4 title="IP {{ service.1 }} {{ service.5 }}"> {{ service.0 }} :</h4>
{% else %}
<h4 title="IP {{ service.1 }}"> {{ service.0 }} :</h4>
{% endif %}
</td>
<td class="overviewTd" style="padding-top: 10px;">
<pre style="font-size: 12px;">
{{ service.2 }}
</pre>
</td>
<td>
<pre style="font-size: 12px; padding-left: 0px;">
{{ service.3 }}
</pre>
</td>
<td style="padding: 10px; padding-bottom: 0;font-size: 12px;">
<span style="padding-left: 0px; margin: 0;">
{% if 'Unknown command' in service.4 %}
Too old version HAProxy
{% else %}
{% for s in service.4 %}
<a href="/app/sections.py?serv={{service.1}}&section={{ s }}" title="Edit {{s}} section" target="_blanck">
{{s}}
</a><br />
{% endfor %}
{% endif %}
<div class="haproxy-info">
{{ service.2 }}
</div>
<div class="top-info">
<pre>
{{ service.3 }}
</pre>
</div>
{% if page != 'hapservers.py' %}
<span style="padding-left: 0px; margin: 0;">
{% if 'Unknown command' in service.4 %}
Too old version HAProxy
{% else %}
{% for s in service.4 %}
{% if role <= 2 %}
<a href="/app/sections.py?serv={{service.1}}&section={{ s }}" title="Edit {{s}} section" target="_blanck">
{{s}}
</a>
{% else %}
{{ s }}
{% endif %}
<br />
{% endfor %}
{% endif %}
</span>
</td>
<td></td>
</tr>
{% endif %}
</div>
{% endfor %}

View File

@ -42,7 +42,7 @@
</li>
<li class="p_menu"><a title="Actions with Haproxy configs" class="config-show">Haproxy</a>
<ul class="v_menu">
<li><a href=/app/config.py title="Working with Haproxy Configs" class="edit head-submenu">Configs</a> </li>
<li><a href=/app/hapservers.py title="Working with Haproxy Configs" class="overview-link head-submenu">Overview</a> </li>
{% if role <= 2 %}
<li><a href=/app/add.py#listner title="Add single listen" class="add head-submenu" id="add1">Add listen</a></li>
<li><a href=/app/add.py#frontend title="Add single frontend" class="add head-submenu" id="add2">Add frontend</a></li>

View File

@ -28,9 +28,7 @@
</div>
{% endif %}
{% endif %}
{% if note %}
<div class="alert alert-info"><b>Note:</b> If you reconfigure Master server, Slave will reconfigured automatically</div>
{% endif %}
{% if open %}
<center>
<h4>Choose old version</h4>
@ -51,6 +49,7 @@
<a class="ui-button ui-widget ui-corner-all" id="show" title="Enter" onclick="showUploadConfig()">Select</a>
</p>
</form>
</center>
{% endif %}
{% if aftersave %}

View File

@ -16,10 +16,12 @@
</select>
<button type="submit" value="open" name="open" class="btn btn-default">Open</button>
</form>
{% if not aftersave and not open %}
<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
Here you can work with previous versions of HAProxy configs. Roll back to them, view or delete
</div>
{% endif %}
</p>
{% if note %}
<div class="alert alert-info"><b>Note:</b> If you reconfigure Master server, Slave will reconfigured automatically</div>
{% endif %}
{% if open %}
<center>
<h4>Choose old version</h4>
@ -40,6 +42,7 @@
</p>
</form>
</center>
<div class="alert alert-info"><b>Note:</b> If you reconfigure Master server, Slave will reconfigured automatically</div>
{% endif %}
{% if aftersave %}
<div class="alert alert-info"><b>The following files were deleted:</b><br /> </div>

View File

@ -0,0 +1,49 @@
{% extends "base.html" %}
{% block content %}
{% for s in servers %}
<div class="div-pannel">
<div id="div-server-{{s.0}}" class="div-server">
<div class="server-name">
{% if s.5 != False %}
<span class="serverUp server-status" title="{{s.5.0.0}} {{s.5.0.1}}"></span>
{% else %}
<span class="serverDown server-status" title="HAProxy is down"></span>
{% endif %}
<span title="Show info about {{s.2}}" onclick="showOverviewServer('{{s.1}}', '{{s.2}}', '{{s.0}}')" style="cursor: pointer;">{{s.1}}</span>
{% if role <= 1 %}
<span class="server-action">
<a id="{{ s.2 }}" class="start" title="Start HAProxy service">
<img src=/inc/images/start.png alt="start" class="icon" style="margin-bottom: -2px;" onclick="confirmAjaxAction('start', 'hap', '{{s.2}}')">
</a>
<a id="{{ s.2 }}" class="stop" title="Stop HAProxy service">
<img src=/inc/images/stop.png alt="stop" class="icon" width="17px" onclick="confirmAjaxAction('stop', 'hap', '{{s.2}}')">
</a>
<a id="{{ s.2 }}" class="restart" title="Restart HAProxy service">
<img src=/inc/images/update.png alt="restart" class="icon">
</a>
</span>
{% endif %}
</div>
<div class="server-desc">
{{s.3}}
</div>
<div class="server-act-links">
<a href="/app/config.py?serv={{s.2}}&showConfig" class="ui-button ui-widget ui-corner-all" title="Open running config" target="_blank">Open</a>
<a href="/app/config.py?serv={{s.2}}&showCompare" class="ui-button ui-widget ui-corner-all" title="Compare configs" target="_blank">Compare</a>
<a href="/app/config.py?serv={{s.2}}&showMap" class="ui-button ui-widget ui-corner-all" title="Show map" target="_blank">Map</a>
<a href="/app/viewsttats.py?serv={{s.2}}" class="ui-button ui-widget ui-corner-all" title="View stat" target="_blank">Stat</a>
{% if role <= 2 %}
<a href="/app/versions.py?serv={{s.2}}&open=open" class="ui-button ui-widget ui-corner-all" title="Show verisons">Verisons</a>
{% endif %}
</div>
</div>
<div id="ajax-server-{{s.0}}" class="ajax-server"></div>
</div>
{% endfor %}
<div id="dialog-confirm" style="display: none;">
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:3px 12px 20px 0;"></span>Are you sure?</p>
</div>
<script src="/inc/overview.js"></script>
{% endblock %}

View File

@ -7,7 +7,7 @@
<table class="overview">
<tr class="overviewHead">
<td class="padding10 first-collumn">Login</td>
<td class="padding10 second-collumn">Email</td>
<td class="padding10 second-collumn"><!--Email--></td>
<td class="second-collumn">Group</td>
<td>Role</td>
<td class="padding10">
@ -29,7 +29,7 @@
<img src="/inc/images/edit.png" alt="Edit" width="15" style="margin-bottom: -3px;" />
</a>
</td>
<td class="padding10 second-collumn"> {{ USER.2 }}</td>
<td class="padding10 second-collumn"> <!--{{ USER.2 }}--></td>
{% for group in groups %}
{% if USER.5 == group.0|string() %}
<td class="third-collumn">{{ group.1 }}</td>
@ -73,8 +73,8 @@
<span title="running {{ metrics_master }} master processes"><span class="serverDown"> DOWN</span>
{% endif %}
<span>Metrics master</span>
</td>
<td class="padding10 second-collumn">
<br />
<br />
{% if metrics_worker|int() >= 1 %}
<span title="running {{metrics_worker}} worker processes"><span class="serverUp"> UP</span>
{% else %}
@ -82,6 +82,7 @@
{% endif %}
<span>Metrics workers</span>
</td>
<td class="padding10 second-collumn"></td>
<td class="third-collumn">
{% if checker_master|int() >= 1 %}
<span title="running {{ checker_master }} master processes"><span class="serverUp"> UP</span>
@ -89,8 +90,8 @@
<span title="running {{ checker_master }} master processes"><span class="serverDown"> DOWN</span>
{% endif %}
<span>Checker master</span>
</td>
<td>
<br />
<br />
{% if checker_worker|int() >= 1 %}
<span title="running {{ checker_worker }} worker processes"><span class="serverUp"> UP</span>
{% else %}
@ -98,6 +99,14 @@
{% endif %}
<span>Checker workers</span>
</td>
<td class="third-collumn">
{% if keep_alive|int() >= 1 %}
<span title="Keep alive is run"><span class="serverUp"> UP</span>
{% else %}
<span title="Keep alive is down"><span class="serverDown"> DOWN</span>
{% endif %}
<span>Keep alive</span>
</td>
</tr>
</table>
{% endif %}
@ -107,7 +116,7 @@
Server
</td class="padding10 second-collumn">
<td class="padding10 second-collumn">
HAproxy status
<!-- HAproxy status-->
</td>
<td class="padding10 third-collumn">
Action
@ -124,10 +133,10 @@
<table class="overview">
<tr class="overviewHead">
<td class="padding10 first-collumn">
Server
WAF
</td class="padding10 second-collumn">
<td class="padding10 second-collumn">
WAF status
<!-- WAF status -->
</td>
<td class="padding10 third-collumn">
Action
@ -141,26 +150,26 @@
</tr>
<tbody id="ajaxwafstatus"></tbody>
</table>
<table class="overview" >
<tr class="overviewHead">
<td class="padding10 first-collumn">
Server
</td>
<td class="padding10 second-collumn">
HAproxy info
</td>
<td class="padding10 third-collumn">
Server status
</td>
<td class="padding10">
Front/Back-ends
</td>
<td>
<a onclick="showOverviewServers()" title="Refresh Server Info" style="float: right; margin-right: 25px;"><img src="/inc/images/update.png" alt="restart" class="icon"></a>
</td>
</tr>
<tbody id="ajaxservers"></tbody>
</table>
<!-- <table class="overview" > -->
<!-- <tr class="overviewHead"> -->
<!-- <td class="padding10 first-collumn"> -->
<!-- Server -->
<!-- </td> -->
<!-- <td class="padding10 second-collumn"> -->
<!-- HAproxy info -->
<!-- </td> -->
<!-- <td class="padding10 third-collumn"> -->
<!-- Server status -->
<!-- </td> -->
<!-- <td class="padding10"> -->
<!-- Front/Back-ends -->
<!-- </td> -->
<!-- <td> -->
<!-- <a onclick="showOverviewServers()" title="Refresh Server Info" style="float: right; margin-right: 25px;"><img src="/inc/images/update.png" alt="restart" class="icon"></a> -->
<!-- </td> -->
<!-- </tr> -->
<!-- <tbody id="ajaxservers"></tbody> -->
<!-- </table> -->
<div id="dialog-confirm" style="display: none;">
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:3px 12px 20px 0;"></span>Are you sure?</p>
</div>

View File

@ -4,9 +4,9 @@
<tr class="overviewHead">
<td class="padding10 first-collumn">
Server
</td class="padding10 second-collumn">
</td>
<td class="padding10 second-collumn">
WAF status
<!-- WAF status -->
</td>
<td class="padding10">
Action

View File

@ -1,5 +1,6 @@
.menu .svg-inline--fa {
margin-right: 0.5em;
width: 1.5em;
}
.auto-refresh-pause::before {
display: none;

View File

@ -14,7 +14,11 @@ function ajaxActionServers(action, id) {
if( data == 'Bad config, check please ' ) {
alert(data);
} else {
setTimeout(showOverview, 2000)
if (cur_url[0] == "hapservers.py") {
location.reload()
} else {
setTimeout(showOverview, 2000)
}
}
},
error: function(){

View File

@ -146,8 +146,7 @@ function startSetInterval(interval) {
}
intervalId = setInterval('loadMetrics()', interval);
loadMetrics();
}
else if (cur_url[0] == "waf.py") {
} else if (cur_url[0] == "waf.py") {
if(interval < 60000) {
interval = 60000;
}
@ -190,7 +189,7 @@ $( document ).ajaxComplete(function( event, request, settings ) {
});
function showOverview() {
showOverviewServers();
// showOverviewServers();
showOverviewWaf()
$.ajax( {
url: "options.py",
@ -206,6 +205,35 @@ function showOverview() {
}
} );
}
function showOverviewServer(name,ip,id) {
showOverviewServers();
showOverviewWaf()
$.ajax( {
url: "options.py",
data: {
act: "overviewServers",
name: name,
serv: ip,
page: 'hapservers.py',
token: $('#token').val()
},
type: "GET",
success: function( data ) {
$("#ajax-server-"+id).empty();
$("#ajax-server-"+id).css('display', 'block');
$("#ajax-server-"+id).css('background-color', '#f9fff8');
$("#ajax-server-"+id).css('border', '1px solid #ddd');
$(".ajax-server").css('display', 'block');
$(".div-server").css('clear', 'both');
$(".div-pannel").css('clear', 'both');
$(".div-pannel").css('display', 'block');
$(".div-pannel").css('padding-top', '10px');
$(".div-pannel").css('height', '70px');
$("#ajax-server-"+id).html(data);
// $.getScript('/inc/overview.js');
}
} );
}
function showOverviewWaf() {
$.ajax( {
url: "options.py",

View File

@ -31,12 +31,11 @@ h3 {
form {
margin: 0;
}
iframe {
width: 33%;
}
/* iframe { */
/* width: 33%; */
/* } */
pre {
padding-left: 15px;
//padding-top: 20px;
}
.icon {
@ -55,8 +54,6 @@ pre {
left: 0;
z-index: 1000;
display: block;
}
.top-menu {
background-color: #292e34;
}
.logoText {
@ -70,8 +67,8 @@ pre {
padding-top: 2px;
}
#logo_text {
display: block;
margin-top: -4px;
display: block;
margin-top: -4px;
}
.top-menu img {
max-width: 125px;
@ -235,20 +232,20 @@ margin-top: -4px;
.paramInSec {
font-weight: bold;
}
.conteinerIndex {
width: 20%;
background-color: #fff;
padding: 20px;
border-radius: 10px;
margin-top: 2%;
}
.conteinerIndex img {
max-width: 250px;
}
.copyright {
color: #23527c;
margin-left: 15px;
}
/* .conteinerIndex { */
/* width: 20%; */
/* background-color: #fff; */
/* padding: 20px; */
/* border-radius: 10px; */
/* margin-top: 2%; */
/* } */
/* .conteinerIndex img { */
/* max-width: 250px; */
/* } */
/* .copyright { */
/* color: #23527c; */
/* margin-left: 15px; */
/* } */
.copyright-menu {
font-weight: bold;
font-style: italic;
@ -280,9 +277,6 @@ margin-top: -4px;
padding-left: 0;
padding-right: 0;
}
.overviewHead:hover {
background-color: #f4f9f3e6;
}
.comment {
color: #aaa;
}
@ -334,12 +328,16 @@ margin-top: -4px;
}
.overview {
width: 100%;
/* margin-top: 1.5em; */
}
.overviewHead {
border-radius: 5px;
background-color: #f4f9f3e6;
background-color: #F9FFF8;
font-weight: bold;
}
/* .overviewHead:hover { */
/* background-color: #f4f9f3e6; */
/* } */
.overview tr{
border-bottom: 1px solid #ddd;
border-radius: 5px;
@ -407,10 +405,10 @@ margin-top: -4px;
width: 15%;
}
.second-collumn {
width: 25%;
width: 20%;
}
.third-collumn {
width: 35%;
width: 45%;
}
.ro {
border: none;
@ -425,7 +423,6 @@ margin-top: -4px;
padding: 5px;
border-radius: 3px;
}
ul{
margin: 0;
padding: 0;
@ -581,75 +578,6 @@ a {
a:active, a:hover {
outline: 0;
}
abbr[title] {
border-bottom: 1px dotted;
}
b,
strong {
font-weight: bold;
}
//button,
input,
optgroup,
select,
textarea {
margin: 0;
font: inherit;
color: inherit;
border-radius: 7px;
padding: 3px;
}
button {
overflow: visible;
}
button,
select {
text-transform: none;
}
select {
color: #000;
}
button {
background-color: #337ab7;
border-color: #2e6da4;
color: #fff;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button;
cursor: pointer;
}
button[disabled],
html input[disabled] {
cursor: default;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
padding: 0;
border: 0;
}
input {
line-height: normal;
border-radius: 4px;
}
table {
border-spacing: 0;
border-collapse: collapse;
background-color: transparent;
width: 100%;
}
caption {
color: #777;
text-align: left;
}
td,th {
padding: 0;
text-align: left;
min-width: 30px;
}
a,
a:visited {
text-decoration: underline;
@ -667,6 +595,76 @@ a:focus {
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
/* abbr[title] { */
/* border-bottom: 1px dotted; */
/* } */
/* b, */
/* strong { */
/* font-weight: bold; */
/* } */
/* //button, */
/* input, */
/* optgroup, */
/* select, */
/* textarea { */
/* margin: 0; */
/* font: inherit; */
/* color: inherit; */
/* border-radius: 7px; */
/* padding: 3px; */
/* } */
/* button { */
/* overflow: visible; */
/* } */
/* button, */
/* select { */
/* text-transform: none; */
/* } */
/* select { */
/* color: #000; */
/* } */
/* button { */
/* background-color: #337ab7; */
/* border-color: #2e6da4; */
/* color: #fff; */
/* } */
/* button, */
/* html input[type="button"], */
/* input[type="reset"], */
/* input[type="submit"] { */
/* -webkit-appearance: button; */
/* cursor: pointer; */
/* } */
/* button[disabled], */
/* html input[disabled] { */
/* cursor: default; */
/* } */
/* button::-moz-focus-inner, */
/* input::-moz-focus-inner { */
/* padding: 0; */
/* border: 0; */
/* } */
/* input { */
/* line-height: normal; */
/* border-radius: 4px; */
/* } */
table {
border-spacing: 0;
border-collapse: collapse;
background-color: transparent;
width: 100%;
}
caption {
color: #777;
text-align: left;
}
td,th {
padding: 0;
text-align: left;
min-width: 30px;
}
.row {
margin-right: -15px;
margin-left: -15px;
@ -742,4 +740,65 @@ label {
/* .mCSB_container { */
/* overflow-y: hidden !important; */
/* overflow-x: auto !important; */
/* } */
/* } */
.div-server {
background-color: #f9fff8;
border: 1px solid #ddd;
width: 25em;
padding: 20px;
margin: 20px;
margin-bottom: 0;
margin-top: 13px;
display: block;
float: left;
}
.server-name {
padding-bottom: 5px;
font-size: 1.4em;
color: #5d9ceb;
}
.server-status {
border-radius: 50% 50%;
width: 10px;
height: 10px;
display: inline-block;
margin-left: 2px;
margin-bottom: -2px;
}
.server-action {
float: right;
margin-top: 6px;
}
.server-desc {
padding-bottom: 2em;
color: #999;
}
.server-act-links a {
margin-right: 0.36em !important
}
.server-act-links a:last-child {
margin-right: 0 !important;
}
.ajax-server {
margin: 25px;
margin-left: 32em;
margin-bottom: 0;
width: 60em;
display: none;
margin-top: px;
margin-bottom: 0px;
margin-top: 14px;
height: 11em;
}
.haproxy-info {
display: inline-block;
width: 160px;
padding-left: 20px;
padding-top: 1.1em;
font-size: 0.88em;
}
.top-info {
display: inline-block;
width: 350px;
}