Change log: https://roxy-wi.org/changelog.py#6_1_1
pull/328/head
Pavel Loginov 2022-07-03 09:11:34 +03:00
parent 6448ca20e0
commit 8e9b5f861a
14 changed files with 265 additions and 77 deletions

View File

@ -33,7 +33,7 @@ def default_values():
{'param': 'haproxy_path_logs', 'value': '/var/log/haproxy/', 'section': 'haproxy',
'desc': 'The path for HAProxy logs', 'group': '1'},
{'param': 'syslog_server_enable', 'value': '0', 'section': 'logs',
'desc': 'Enable getting logs from a syslog server; (0 - no, 1 - yes)', 'group': '1'},
'desc': 'Enable getting logs from a syslog server', 'group': '1'},
{'param': 'syslog_server', 'value': '', 'section': 'logs', 'desc': 'IP address of the syslog_server',
'group': '1'},
{'param': 'log_time_storage', 'value': '14', 'section': 'logs',
@ -59,7 +59,7 @@ def default_values():
{'param': 'haproxy_sock_port', 'value': '1999', 'section': 'haproxy', 'desc': 'HAProxy sock port',
'group': '1'},
{'param': 'apache_log_path', 'value': '/var/log/' + apache_dir + '/', 'section': 'logs',
'desc': 'Path to Apache logs. Apache service for Roxy-WI', 'group': '1'},
'desc': 'Path to Apache logs. Apache service for Roxy-WI', 'group': '1'},
{'param': 'nginx_path_logs', 'value': '/var/log/nginx/', 'section': 'nginx',
'desc': 'The path for NGINX logs', 'group': '1'},
{'param': 'nginx_stats_user', 'value': 'admin', 'section': 'nginx', 'desc': 'Username for accessing NGINX stats page',
@ -744,7 +744,7 @@ def update_db_v_6_1_0(**kwargs):
def update_ver():
query = Version.update(version='6.1.0.0')
query = Version.update(version='6.1.1.0')
try:
query.execute()
except Exception:

View File

@ -226,6 +226,16 @@ class NginxMetrics(BaseModel):
primary_key = False
class ApacheMetrics(BaseModel):
serv = CharField()
conn = IntegerField()
date = DateTimeField(default=datetime.now)
class Meta:
table_name = 'apache_metrics'
primary_key = False
class Version(BaseModel):
version = CharField()
@ -268,7 +278,7 @@ class WafRules(BaseModel):
serv = CharField()
rule_name = CharField()
rule_file = CharField()
desc = CharField(null=True)
desc = TextField(null=True)
en = IntegerField(constraints=[SQL('DEFAULT 1')])
class Meta:
@ -532,4 +542,4 @@ def create_tables():
Setting, Cred, Backup, Metrics, WafMetrics, Version, Option, SavedServer, Waf, ActionHistory,
PortScannerSettings, PortScannerPorts, PortScannerHistory, ProvidersCreds, ServiceSetting,
ProvisionedServers, MetricsHttpStatus, SMON, WafRules, Alerts, GeoipCodes, NginxMetrics,
SystemInfo, Services, UserName, GitSetting, CheckerSetting])
SystemInfo, Services, UserName, GitSetting, CheckerSetting, ApacheMetrics])

View File

@ -712,7 +712,7 @@ def install_haproxy(server_ip, **kwargs):
os.system("cp scripts/%s ." % script)
if haproxy_ver is None:
haproxy_ver = '2.5.1-1'
haproxy_ver = '2.6.0-1'
if proxy is not None and proxy != '' and proxy != 'None':
proxy_serv = proxy
@ -1330,16 +1330,13 @@ def show_haproxy_log(serv, rows=10, waf='0', grep=None, hour='00', minut='00', h
return show_log(output, grep=grep)
def haproxy_wi_log(**kwargs):
def roxy_wi_log(**kwargs):
log_path = get_config_var('main', 'log_path')
if kwargs.get('log_id'):
selects = get_files(log_path, format="log")
for key, value in selects:
if kwargs.get('with_date'):
log_file = kwargs.get('file') + get_data('logs') + ".log"
else:
log_file = kwargs.get('file') + ".log"
log_file = kwargs.get('file') + ".log"
if log_file == value:
return key
else:

View File

@ -29,10 +29,15 @@ try:
if funct.check_login(service=2):
title = "NGINX`s metrics"
servers = sql.select_nginx_servers_metrics_for_master()
elif service == 'apache':
if funct.check_login(service=4):
title = "Apache`s metrics"
servers = sql.select_apache_servers_metrics_for_master()
else:
if funct.check_login(service=1):
title = "HAProxy`s metrics"
servers = sql.select_servers_metrics()
service = 'haproxy'
services = '1'
except Exception:
pass

View File

@ -15,6 +15,7 @@ if (
or form.getvalue('new_http_metrics')
or form.getvalue('new_waf_metrics')
or form.getvalue('new_nginx_metrics')
or form.getvalue('new_apache_metrics')
or form.getvalue('metrics_hapwi_ram')
or form.getvalue('metrics_hapwi_cpu')
or form.getvalue('getoption')
@ -1335,7 +1336,10 @@ if form.getvalue('master'):
group_id = sql.get_group_id_by_server_ip(master)
cred_id = sql.get_cred_id_by_server_ip(master)
hostname = sql.get_hostname_by_server_ip(master)
sql.add_server(hostname + '-VIP', IP, group_id, '1', '1', '0', cred_id, ssh_port, 'VRRP IP for ' + master, haproxy, nginx, '0')
firewall = 1 if funct.is_service_active(master, 'firewalld') else 0
sql.add_server(
hostname + '-VIP', IP, group_id, '1', '1', '0', cred_id, ssh_port, 'VRRP IP for ' + master, haproxy, nginx, '0', firewall
)
if form.getvalue('master_slave'):
master = form.getvalue('master_slave')
@ -1934,35 +1938,16 @@ if form.getvalue('new_http_metrics'):
print(json.dumps(metrics))
if form.getvalue('new_waf_metrics'):
if any((form.getvalue('new_nginx_metrics'), form.getvalue('new_apache_metrics'), form.getvalue('new_waf_metrics'))):
serv = form.getvalue('server')
hostname = sql.get_hostname_by_server_ip(serv)
time_range = form.getvalue('time_range')
metric = sql.select_waf_metrics(serv, time_range=time_range)
metrics = {'chartData': {}}
metrics['chartData']['labels'] = {}
labels = ''
curr_con = ''
for i in metric:
label = str(i[2])
label = label.split(' ')[1]
labels += label + ','
curr_con += str(i[1]) + ','
metrics['chartData']['labels'] = labels
metrics['chartData']['curr_con'] = curr_con
metrics['chartData']['server'] = hostname + ' (' + serv + ')'
import json
print(json.dumps(metrics))
if form.getvalue('new_nginx_metrics'):
serv = form.getvalue('server')
hostname = sql.get_hostname_by_server_ip(serv)
time_range = form.getvalue('time_range')
metric = sql.select_nginx_metrics(serv, time_range=time_range)
if form.getvalue('new_nginx_metrics'):
metric = sql.select_nginx_metrics(serv, time_range=time_range)
elif form.getvalue('new_apache_metrics'):
metric = sql.select_apache_metrics(serv, time_range=time_range)
elif form.getvalue('new_waf_metrics'):
metric = sql.select_waf_metrics(serv, time_range=time_range)
metrics = {'chartData': {}}
metrics['chartData']['labels'] = {}
labels = ''

View File

@ -9,7 +9,7 @@
- name: Creates directory
file:
path: "{{ RPATH }}/haproxy-wi-configs-backup/configs"
path: "{{ RPATH }}/roxy-wi-configs-backup/configs"
state: directory
owner: "{{ ansible_user }}"
when: DELJOB|length == 0
@ -22,21 +22,23 @@
- name: Creates backup jobs
cron:
name: "Backup HAProxy configs for user {{ SERVER }} {{ item }}"
name: "Roxy-WI Backup configs for server {{ SERVER }} {{ item }}"
special_time: "{{ TIME }}"
job: "rsync -arv {{ TYPE }} /var/www/haproxy-wi/configs/{{ item }}/{{ SERVER }}* {{ ansible_user }}@{{ HOST }}:{{ RPATH }}/haproxy-wi-configs-backup/configs/{{ item }} -e 'ssh -i {{ KEY }} -o StrictHostKeyChecking=no' --log-file=/var/www/haproxy-wi/log/backup.log"
job: "rsync -arv {{ TYPE }} /var/www/haproxy-wi/configs/{{ item }}/{{ SERVER }}* {{ ansible_user }}@{{ HOST }}:{{ RPATH }}/roxy-wi-configs-backup/configs/{{ item }} -e 'ssh -i {{ KEY }} -o StrictHostKeyChecking=no' --log-file=/var/www/haproxy-wi/log/backup.log"
when: DELJOB|length == 0
with_items:
- kp_config
- hap_config
- nginx_config
- apache_config
- name: Removes backup jobs
cron:
name: "Backup HAProxy configs for user {{ SERVER }} {{ item }}"
name: "Roxy-WI Backup configs for server {{ SERVER }} {{ item }}"
state: absent
when: DELJOB|length > 0
with_items:
- kp_config
- hap_config
- nginx_config
- nginx_config
- apache_config

View File

@ -297,7 +297,7 @@ def update_hapwi_server(server_id, alert, metrics, active, service_name):
update_hapwi = Server.update(keepalived_alert=alert, keepalived_active=active).where(
Server.server_id == server_id)
elif service_name == 'apache':
update_hapwi = Server.update(apache_alert=alert, apache_active=active).where(
update_hapwi = Server.update(apache_alert=alert, apache_active=active, apache_metrics=metrics).where(
Server.server_id == server_id)
else:
update_hapwi = Server.update(alert=alert, metrics=metrics, active=active).where(
@ -872,7 +872,8 @@ def get_dick_permit(**kwargs):
try:
cursor.execute(sql)
except Exception as e:
out_error(e)
# out_error(e)
pass
else:
return cursor.fetchall()
@ -1233,6 +1234,13 @@ def insert_nginx_metrics(serv, conn):
out_error(e)
def insert_apache_metrics(serv, conn):
try:
ApacheMetrics.insert(serv=serv, conn=conn, date=funct.get_data('regular')).execute()
except Exception as e:
out_error(e)
def select_waf_metrics_enable_server(ip):
query = Waf.select(Waf.metrics).join(Server, on=(Waf.server_id == Server.server_id)).where(Server.ip == ip)
try:
@ -1365,6 +1373,44 @@ def select_nginx_metrics(serv, **kwargs):
return cursor.fetchall()
def select_apache_metrics(serv, **kwargs):
cursor = conn.cursor()
if mysql_enable == '1':
if kwargs.get('time_range') == '60':
date_from = "and date > now() - INTERVAL 60 minute group by `date` div 100"
elif kwargs.get('time_range') == '180':
date_from = "and date > now() - INTERVAL 180 minute group by `date` div 200"
elif kwargs.get('time_range') == '360':
date_from = "and date > now() - INTERVAL 360 minute group by `date` div 300"
elif kwargs.get('time_range') == '720':
date_from = "and date > now() - INTERVAL 720 minute group by `date` div 500"
else:
date_from = "and date > now() - INTERVAL 30 minute"
sql = """ select * from apache_metrics where serv = '{serv}' {date_from} order by `date` desc limit 60 """.format(
serv=serv, date_from=date_from)
else:
if kwargs.get('time_range') == '60':
date_from = "and date > datetime('now', '-60 minutes', 'localtime') and rowid % 2 = 0"
elif kwargs.get('time_range') == '180':
date_from = "and date > datetime('now', '-180 minutes', 'localtime') and rowid % 5 = 0"
elif kwargs.get('time_range') == '360':
date_from = "and date > datetime('now', '-360 minutes', 'localtime') and rowid % 7 = 0"
elif kwargs.get('time_range') == '720':
date_from = "and date > datetime('now', '-720 minutes', 'localtime') and rowid % 9 = 0"
else:
date_from = "and date > datetime('now', '-30 minutes', 'localtime')"
sql = """ select * from (select * from apache_metrics where serv = '{serv}' {date_from} order by `date`) order by `date` """.format(
serv=serv, date_from=date_from)
try:
cursor.execute(sql)
except Exception as e:
out_error(e)
else:
return cursor.fetchall()
def insert_waf_metrics_enable(serv, enable):
try:
server_id = Server.get(Server.ip == serv).server_id
@ -1544,6 +1590,14 @@ def delete_nginx_metrics():
out_error(e)
def delete_apache_metrics():
query = ApacheMetrics.delete().where(ApacheMetrics.date < funct.get_data('regular', timedelta_minus=3))
try:
query.execute()
except Exception as e:
out_error(e)
def select_metrics(serv, **kwargs):
cursor = conn.cursor()
@ -1624,10 +1678,28 @@ def select_metrics_http(serv, **kwargs):
def select_servers_metrics_for_master(**kwargs):
if kwargs.get('group') is not None:
query = Server.select(Server.ip).where((Server.metrics == 1) & (Server.groups == kwargs.get('group')))
if kwargs.get('group') != 1:
query = Server.select(Server.ip).where(
((Server.metrics == 1) | (Server.nginx_metrics == 1) | (Server.apache_metrics == 1))
& (Server.groups == kwargs.get('group'))
)
else:
query = Server.select(Server.ip).where(Server.metrics == 1)
query = Server.select(Server.ip).where(
(Server.metrics == 1)
| (Server.nginx_metrics == 1)
| (Server.apache_metrics == 1)
)
try:
query_res = query.execute()
except Exception as e:
out_error(e)
else:
return query_res
def select_haproxy_servers_metrics_for_master():
query = Server.select(Server.ip).where(Server.metrics == 1)
try:
query_res = query.execute()
except Exception as e:
@ -1646,6 +1718,16 @@ def select_nginx_servers_metrics_for_master():
return query_res
def select_apache_servers_metrics_for_master():
query = Server.select(Server.ip).where(Server.apache_metrics == 1)
try:
query_res = query.execute()
except Exception as e:
out_error(e)
else:
return query_res
def select_servers_metrics():
group_id = funct.get_user_group(id=1)
if funct.check_user_group():

View File

@ -55,3 +55,8 @@
</tr>
{% endif %}
{% endfor %}
{% if users|length > 3 %}
<script>
$('#show_all_users').show();
</script>
{% endif %}

View File

@ -103,7 +103,9 @@
<ul class="v_menu">
<li><a href="/app/hapservers.py?service=apache" title="Overview Apache servers" class="overview-link head-submenu">Overview</a></li>
<li><a href="/app/config.py?service=apache" title="Working with Apache configs" class="edit head-submenu">Configs</a></li>
<li><a href="/app/viewsttats.py?service=apache" title="Apache statistics" class="stats head-submenu">Stats</a></li>
<li><a href="/app/logs.py?service=apache" title="Apache logs " class="logs head-submenu">Logs</a></li>
<li><a href="/app/metrics.py?service=apache" title="Apache's metrics" class="metrics head-submenu">Metrics</a></li>
{% if role <= 3 %}
<li><a href="/app/versions.py?service=apache" title="Working with versions Apache configs" class="version head-submenu">Versions</a></li>
<li><a href="/app/add.py?service=apache#ssl" title="Add proxy: Upload SSL certificates - Roxy-WI" class="cert head-submenu" id="add3">SSL</a></li>

View File

@ -71,6 +71,8 @@
{% if service == 'nginx' %}
showNginxConnections(server_ip)
getNginxChartData(server_ip)
{% elif service == 'apache' %}
getApacheChartData(server_ip)
{% elif service == 'haproxy' %}
showBytes(server_ip)
{% endif %}
@ -82,13 +84,15 @@
let metrics = new Promise(
(resolve, reject) => {
{% for s in servers %}
{% if service == 'haproxy' %}
getChartData(server_ip)
getHttpChartData(server_ip)
getWafChartData(server_ip)
{% elif service == 'nginx' %}
getNginxChartData(server_ip)
{% endif %}
{% if service == 'haproxy' %}
getChartData(server_ip)
getHttpChartData(server_ip)
getWafChartData(server_ip)
{% elif service == 'nginx' %}
getNginxChartData(server_ip)
{% elif service == 'apache' %}
getApacheChartData(server_ip)
{% endif %}
{% endfor %}
});
metrics.then();
@ -248,7 +252,7 @@
{{ checkbox(id, title=checker_desc, value='1', desc='Checker') }}
{% endif %}
{% endif %}
{% if role <= 2 and service != 'keepalived' and service != 'apache' %}
{% if role <= 2 and service != 'keepalived' %}
{% set id = 'metrics-' + s.8.0.0|string() %}
{% if is_metrics_enabled == 1 %}
{{ checkbox(id, title='Collecting metrics is enabled', value='1', desc='Metrics', checked='checked') }}
@ -303,7 +307,7 @@
{% endfor %}
</div>
{% if serv %}
{% if service == 'haproxy' or service == 'nginx' %}
{% if service in ('haproxy', 'nginx', 'apache') %}
<div style="clear: both; width: 97%;">
<div style="padding-left: 25px;float: left;margin-top: -15px;">
<b>Time range:</b>
@ -331,10 +335,15 @@
<div id="waf_metrics_div" class="chart-container_overview">
<canvas id="s_{{s.2}}" role="img"></canvas>
</div>
{% endif %}
{% elif service == 'nginx' %}
<div id="nginx_metrics_div" class="chart-container" style="display: block; width: 90%; height: 300px;">
<canvas id="nginx_{{s.2}}" role="img"></canvas>
</div>
{% elif service == 'apache' %}
<div id="apache_metrics_div" class="chart-container" style="display: block; width: 90%; height: 300px;">
<canvas id="apache_{{s.2}}" role="img"></canvas>
</div>
{% endif %}
{% endfor %}
{% endif %}
<div id="dialog-confirm" style="display: none;">

View File

@ -29,7 +29,7 @@
{% if servers|length == 0 %}
{% include 'include/getstarted.html' %}
{% else %}
{% if service != 'nginx' %}
{% if service == 'haproxy' %}
<table style="min-width: 40%;">
<tr class="overviewHead">
<th colspan=13 style="background-color: #d1ecf1">
@ -51,7 +51,7 @@
<option value="720">12 hours</option>
</select>
</div>
{% if service != 'nginx' %}
{% if service == 'haproxy' %}
<div style="margin-top: 6px;">
{{ checkbox('hide_http_metrics', desc='Hide HTTP metrics', title='Hide HTTP metrics') }}
</div>
@ -60,13 +60,17 @@
<span class="refresh"></span>
</div>
{% for s in servers %}
{% if service != 'nginx' %}
{% if service == 'haproxy' %}
<div class="chart-container">
<canvas id="{{s.ip}}" role="img"></canvas>
</div>
<div class="chart-container http_metrics_div" style="display: none">
<canvas id="http_{{s.ip}}" role="img"></canvas>
</div>
{% elif service == 'apache' %}
<div class="chart-container">
<canvas id="apache_{{s.ip}}" role="img"></canvas>
</div>
{% else %}
<div class="chart-container">
<canvas id="nginx_{{s.ip}}" role="img"></canvas>
@ -79,14 +83,16 @@
(resolve, reject) => {
removeData();
{% for s in servers %}
{% if service != 'nginx' %}
getChartData('{{s.ip}}')
getHttpChartData('{{s.ip}}')
{% if service == 'haproxy' %}
getChartData('{{s.ip}}')
getHttpChartData('{{s.ip}}')
{% elif service == 'apache' %}
getApacheChartData('{{s.ip}}')
{% else %}
getNginxChartData('{{s.ip}}')
getNginxChartData('{{s.ip}}')
{% endif %}
{% endfor %}
{% if service != 'nginx' %}
{% if service == 'haproxy' %}
if (localStorage.getItem('table_metrics') == 0 || localStorage.getItem('table_metrics') === null) {
$('#dis_table_metric').css('display', 'none');
} else {
@ -104,12 +110,14 @@
let metrics = new Promise(
(resolve, reject) => {
{% for s in servers %}
{% if service != 'nginx' %}
getChartData('{{s.ip}}')
getHttpChartData('{{s.ip}}')
{% else %}
getNginxChartData('{{s.ip}}')
{% endif %}
{% if service == 'haproxy' %}
getChartData('{{s.ip}}')
getHttpChartData('{{s.ip}}')
{% elif service == 'apache' %}
getApacheChartData('{{s.ip}}')
{% else %}
getNginxChartData('{{s.ip}}')
{% endif %}
{% endfor %}
});
metrics.then();

View File

@ -320,7 +320,7 @@
<td class="second-collumn">Groups</td>
<td>Role</td>
<td>
<span class="add-button-wi">
<span class="add-button-wi" id="show_all_users" style="display: none;">
<span title="Show all users" id="show-all-users" style="color: #fff">
Show all
</span>
@ -344,11 +344,13 @@
</td>
<td class="second-collumn" style="width: 40%">Description</td>
<td>
{% if groups|length > 3 %}
<span class="add-button-wi">
<span title="Show all groups" id="show-all-groups" style="color: #fff">
Show all
</span>
</span>
{% endif %}
</td>
</tr>
{% set counter = 0 -%}
@ -404,11 +406,13 @@
</a>
</td>
<td>
{% if haproxy_wi_log|length > 3 %}
<span class="add-button-wi">
<span title="Show more log" id="show-all-haproxy-wi-log" style="color: #fff">
Show more log
</span>
</span>
{% endif %}
</td>
</tr>
<tr>
@ -418,13 +422,13 @@
{% if counter <= 2 %}
<tr class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi" style="font-size: 12.5px;" colspan="2">
{{log }}
{{ log }}
</td>
</tr>
{% else %}
<tr style="display: none;" class="show-haproxy-wi-log" class="{{ loop.cycle('odd', 'even') }}">
<tr style="display: none;" class="show-haproxy-wi-log {{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn-wi" style="font-size: 12.5px" colspan="2">
{{log }}
{{ log }}
</td>
</tr>
{% endif %}
@ -448,5 +452,4 @@
<script>
showOverview(ip, hostnamea)
</script>
{% endblock %}

View File

@ -355,6 +355,82 @@ function renderNginxChart(data, labels, server) {
});
charts.push(myChart);
}
function getApacheChartData(server) {
$.ajax({
url: "options.py",
data: {
new_apache_metrics: '1',
server: server,
time_range: $( "#time-range option:selected" ).val(),
token: $('#token').val()
},
type: "POST",
success: function (result) {
var data = [];
data.push(result.chartData.curr_con);
data.push(result.chartData.server);
var labels = result.chartData.labels;
renderApacheChart(data, labels, server);
}
});
}
function renderApacheChart(data, labels, server) {
var ctx = 'apache_'+server
var myChart = new Chart(ctx, {
type: 'line',
data: {
labels: labels.split(','),
datasets: [
{
parsing: false,
normalized: true,
label: 'Connections',
data: data[0].split(','),
borderColor: 'rgba(75, 192, 192, 1)',
backgroundColor: 'rgba(75, 192, 192, 0.2)',
}
]
},
options: {
animation: false,
maintainAspectRatio: false,
title: {
display: true,
text: data[1],
fontSize: 20,
padding: 0,
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}],
xAxes: [{
ticks: {
major: {
enabled: true,
fontStyle: 'bold'
},
source: 'data',
autoSkip: true,
autoSkipPadding: 45,
maxRotation: 0
}
}]
},
legend: {
display: true,
labels: {
fontColor: 'rgb(255, 99, 132)',
defaultFontSize: '10',
defaultFontFamily: 'BlinkMacSystemFont'
},
}
}
});
charts.push(myChart);
}
$("#secIntervals").css("display", "none");
function loadMetrics() {

View File

@ -54,6 +54,8 @@ $( function() {
show_current_page($(this))
} else if(cur_url[0] == 'viewsttats.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'viewsttats.py?service=nginx'){
show_current_page($(this))
} else if(cur_url[0] == 'viewsttats.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'viewsttats.py?service=apache'){
show_current_page($(this))
} else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=view' && link2 == 'smon.py?action=view'){
show_current_page($(this))
} else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=add' && link2 == 'smon.py?action=add'){
@ -68,6 +70,8 @@ $( function() {
show_current_page($(this))
} else if(cur_url[0] == 'metrics.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'metrics.py?service=nginx'){
show_current_page($(this))
} else if(cur_url[0] == 'metrics.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'metrics.py?service=apache'){
show_current_page($(this))
} else if(cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'hapservers.py?service=apache'){
show_current_page($(this))
} else if(cur_url[0] == 'versions.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'versions.py?service=apache'){