Aidaho 2024-05-03 15:22:58 +03:00
parent bd5af37255
commit b66c4d0793
23 changed files with 390 additions and 394 deletions

View File

@ -755,7 +755,7 @@ def update_db_v_7_2_3():
def update_ver(): def update_ver():
try: try:
Version.update(version='7.2.4.0').execute() Version.update(version='7.2.5.0').execute()
except Exception: except Exception:
print('Cannot update version') print('Cannot update version')

View File

@ -174,6 +174,8 @@ def select_metrics(serv, service, **kwargs):
date_from = "and date > CONVERT_TZ(NOW(),'SYSTEM','+0:00') - INTERVAL 360 minute group by `date` div 300" date_from = "and date > CONVERT_TZ(NOW(),'SYSTEM','+0:00') - INTERVAL 360 minute group by `date` div 300"
elif kwargs.get('time_range') == '720': elif kwargs.get('time_range') == '720':
date_from = "and date > CONVERT_TZ(NOW(),'SYSTEM','+0:00') - INTERVAL 720 minute group by `date` div 500" date_from = "and date > CONVERT_TZ(NOW(),'SYSTEM','+0:00') - INTERVAL 720 minute group by `date` div 500"
elif kwargs.get('time_range') == '1':
date_from = "and date > CONVERT_TZ(NOW(),'SYSTEM','+0:00') - INTERVAL 1 minute"
else: else:
date_from = "and date > CONVERT_TZ(NOW(),'SYSTEM','+0:00') - INTERVAL 30 minute" date_from = "and date > CONVERT_TZ(NOW(),'SYSTEM','+0:00') - INTERVAL 30 minute"
sql = """ select * from {metrics_table} where serv = '{serv}' {date_from} order by `date` asc """.format( sql = """ select * from {metrics_table} where serv = '{serv}' {date_from} order by `date` asc """.format(
@ -188,6 +190,8 @@ def select_metrics(serv, service, **kwargs):
date_from = "and date > datetime('now', '-360 minutes', 'UTC') and rowid % 7 = 0" date_from = "and date > datetime('now', '-360 minutes', 'UTC') and rowid % 7 = 0"
elif kwargs.get('time_range') == '720': elif kwargs.get('time_range') == '720':
date_from = "and date > datetime('now', '-720 minutes', 'UTC') and rowid % 9 = 0" date_from = "and date > datetime('now', '-720 minutes', 'UTC') and rowid % 9 = 0"
elif kwargs.get('time_range') == '1':
date_from = "and date > datetime('now', '-1 minutes', 'UTC')"
else: else:
date_from = "and date > datetime('now', '-30 minutes', 'UTC')" date_from = "and date > datetime('now', '-30 minutes', 'UTC')"

View File

@ -61,7 +61,7 @@ def is_admin(level=1, **kwargs):
def page_for_admin(level=1) -> None: def page_for_admin(level=1) -> None:
if not is_admin(level=level): if not is_admin(level=level):
return abort(400, 'bad permission') return abort(404, 'Not found')
def check_in_ldap(user, password): def check_in_ldap(user, password):

View File

@ -11,14 +11,14 @@ def show_ram_metrics(metrics_type: str) -> dict:
if metrics_type == '1': if metrics_type == '1':
rams_list = psutil.virtual_memory() rams_list = psutil.virtual_memory()
rams += str(round(rams_list.total / 1048576, 2)) + ' '
rams += str(round(rams_list.used / 1048576, 2)) + ' ' rams += str(round(rams_list.used / 1048576, 2)) + ' '
rams += str(round(rams_list.free / 1048576, 2)) + ' ' rams += str(round(rams_list.free / 1048576, 2)) + ' '
rams += str(round(rams_list.shared / 1048576, 2)) + ' ' rams += str(round(rams_list.shared / 1048576, 2)) + ' '
rams += str(round(rams_list.cached / 1048576, 2)) + ' ' rams += str(round(rams_list.cached / 1048576, 2)) + ' '
rams += str(round(rams_list.available / 1048576, 2)) + ' ' rams += str(round(rams_list.available / 1048576, 2)) + ' '
rams += str(round(rams_list.total / 1048576, 2)) + ' '
else: else:
commands = ["free -m |grep Mem |awk '{print $2,$3,$4,$5,$6,$7}'"] commands = ["free -m |grep Mem |awk '{print $3,$4,$5,$6,$7,$2}'"]
metric, error = server_mod.subprocess_execute(commands[0]) metric, error = server_mod.subprocess_execute(commands[0])
for i in metric: for i in metric:
@ -34,7 +34,8 @@ def show_cpu_metrics(metrics_type: str) -> dict:
cpus = '' cpus = ''
if metrics_type == '1': if metrics_type == '1':
cpus_list = psutil.cpu_times_percent(interval=1, percpu=False) total = psutil.cpu_percent(0.5)
cpus_list = psutil.cpu_times_percent(interval=0.5, percpu=False)
cpus += str(cpus_list.user) + ' ' cpus += str(cpus_list.user) + ' '
cpus += str(cpus_list.system) + ' ' cpus += str(cpus_list.system) + ' '
cpus += str(cpus_list.nice) + ' ' cpus += str(cpus_list.nice) + ' '
@ -43,13 +44,15 @@ def show_cpu_metrics(metrics_type: str) -> dict:
cpus += str(cpus_list.irq) + ' ' cpus += str(cpus_list.irq) + ' '
cpus += str(cpus_list.softirq) + ' ' cpus += str(cpus_list.softirq) + ' '
cpus += str(cpus_list.steal) + ' ' cpus += str(cpus_list.steal) + ' '
cpus += str(total) + ' '
else: else:
commands = [ cmd = "top -d 0.5 -b -n2 | grep 'Cpu(s)'|tail -n 1 | awk '{print $2 + $4}'"
"top -b -n 1 |grep Cpu |awk -F':' '{print $2}'|awk -F' ' 'BEGIN{ORS=\" \";} { for (i=1;i<=NF;i+=2) print $i}'"] total, error = server_mod.subprocess_execute(cmd)
metric, error = server_mod.subprocess_execute(commands[0]) cmd = "top -b -n 1 |grep Cpu |awk -F':' '{print $2}'|awk -F' ' 'BEGIN{ORS=\" \";} { for (i=1;i<=NF;i+=2) print $i}'"
metric, error = server_mod.subprocess_execute(cmd)
for i in metric: for i in metric:
cpus = i cpus = i
cpus += f'{total[0]}'
metrics['chartData']['cpus'] = cpus metrics['chartData']['cpus'] = cpus

View File

@ -2,6 +2,7 @@ import os
from cryptography.fernet import Fernet from cryptography.fernet import Fernet
import paramiko import paramiko
from paramiko import RSAKey, DSSKey, ECDSAKey, Ed25519Key, PKey
from flask import render_template, request from flask import render_template, request
import app.modules.db.cred as cred_sql import app.modules.db.cred as cred_sql
@ -117,7 +118,36 @@ def create_ssh_cread_api(name: str, enable: str, group: str, username: str, pass
roxywi_common.handle_exceptions(e, 'Roxy-WI server', f'Cannot create SSH credentials {name}', roxywi=1) roxywi_common.handle_exceptions(e, 'Roxy-WI server', f'Cannot create SSH credentials {name}', roxywi=1)
def get_key_class_name(uploaded_key, passphrase):
for pkey_class in (ECDSAKey, RSAKey, DSSKey, Ed25519Key):
try:
key = pkey_class.from_private_key(uploaded_key, passphrase)
class_name = str(pkey_class).split('.')[-1].rstrip(">'")
print(class_name)
# return class_name
return key
except Exception as e:
print("An exception occurred: {}".format(e))
pass
def proper_method_call(filepath, passphrase):
key_class_name = get_key_class_name(filepath, passphrase)
print('key_class_name',key_class_name)
key_class = getattr(paramiko, key_class_name)
key_method = getattr(key_class, "from_private_key")
print('filepath',filepath)
try:
key = key_method(filepath, passphrase)
except Exception as e:
raise Exception(f'something went wrong: {e}')
return key
def upload_ssh_key(name: str, user_group: str, key: str, passphrase: str) -> str: def upload_ssh_key(name: str, user_group: str, key: str, passphrase: str) -> str:
import io
if '..' in name: if '..' in name:
raise Exception('error: nice try') raise Exception('error: nice try')
@ -125,9 +155,15 @@ def upload_ssh_key(name: str, user_group: str, key: str, passphrase: str) -> str
raise Exception('error: please select credentials first') raise Exception('error: please select credentials first')
try: try:
key = paramiko.pkey.load_private_key(key, password=passphrase) print('key1',key)
key = io.StringIO(key)
print('key2',key)
# key = paramiko.pkey.load_private_key(key, password=passphrase)
key = paramiko.Ed25519Key.from_private_key(key, password=passphrase)
# key = get_key_class_name(key, passphrase)
# key = proper_method_call(key, passphrase)
except Exception as e: except Exception as e:
raise Exception(f'error: Cannot save SSH key file: {e}') raise Exception(f'error: Cannot read SSH key: {e}')
lib_path = get_config.get_config_var('main', 'lib_path') lib_path = get_config.get_config_var('main', 'lib_path')
full_dir = f'{lib_path}/keys/' full_dir = f'{lib_path}/keys/'

View File

@ -33,22 +33,35 @@ def before_request():
@bp.route('') @bp.route('')
@get_user_params() @get_user_params()
def admin(): def admin():
roxywi_auth.page_for_admin() roxywi_auth.page_for_admin(level=2)
user_group = roxywi_common.get_user_group(id=1)
if g.user_params['role'] == 1:
users = user_sql.select_users()
servers = server_sql.select_servers(full=1)
masters = server_sql.select_servers(get_master_servers=1)
sshs = cred_sql.select_ssh()
else:
users = user_sql.select_users(group=user_group)
servers = roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1)
masters = server_sql.select_servers(get_master_servers=1, uuid=g.user_params['user_uuid'])
sshs = cred_sql.select_ssh(group=user_group)
kwargs = { kwargs = {
'lang': g.user_params['lang'], 'lang': g.user_params['lang'],
'users': user_sql.select_users(), 'users': users,
'groups': group_sql.select_groups(), 'groups': group_sql.select_groups(),
'sshs': cred_sql.select_ssh(), 'group': roxywi_common.get_user_group(id=1),
'servers': server_sql.select_servers(full=1), 'sshs': sshs,
'servers': servers,
'roles': sql.select_roles(), 'roles': sql.select_roles(),
'timezones': pytz.all_timezones,
'settings': sql.get_setting('', all=1),
'ldap_enable': sql.get_setting('ldap_enable'), 'ldap_enable': sql.get_setting('ldap_enable'),
'services': service_sql.select_services(), 'services': service_sql.select_services(),
'masters': server_sql.select_servers(get_master_servers=1), 'masters': masters,
'guide_me': 1, 'guide_me': 1,
'user_subscription': roxywi_common.return_user_subscription() 'user_subscription': roxywi_common.return_user_subscription(),
'user_roles': user_sql.select_user_roles_by_group(user_group),
} }
return render_template('admin.html', **kwargs) return render_template('admin.html', **kwargs)
@ -203,6 +216,16 @@ def action_openvpn(action, openvpn):
return f'error: Cannot {action} OpenVPN: {e}' return f'error: Cannot {action} OpenVPN: {e}'
@bp.get('/settings')
@get_user_params()
def get_settings():
kwargs = {
'settings': sql.get_setting('', all=1),
'timezones': pytz.all_timezones,
}
return render_template('include/admin_settings.html', **kwargs)
@bp.post('/setting/<param>') @bp.post('/setting/<param>')
def update_settings(param): def update_settings(param):
roxywi_auth.page_for_admin(level=2) roxywi_auth.page_for_admin(level=2)

View File

@ -1,6 +1,5 @@
import os import os
import sys import sys
import pytz
from flask import render_template, request, session, g, abort, jsonify from flask import render_template, request, session, g, abort, jsonify
from flask_login import login_required from flask_login import login_required
@ -9,10 +8,7 @@ sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app'))
from app import app, cache from app import app, cache
from app.routes.main import bp from app.routes.main import bp
import app.modules.db.sql as sql
import app.modules.db.cred as cred_sql
import app.modules.db.user as user_sql import app.modules.db.user as user_sql
import app.modules.db.group as group_sql
import app.modules.db.server as server_sql import app.modules.db.server as server_sql
import app.modules.db.service as service_sql import app.modules.db.service as service_sql
import app.modules.db.history as history_sql import app.modules.db.history as history_sql
@ -174,37 +170,6 @@ def service_history(service, server_ip):
return render_template('history.html', **kwargs) return render_template('history.html', **kwargs)
@bp.route('/servers')
@login_required
@get_user_params()
def servers():
roxywi_auth.page_for_admin(level=2)
user_group = roxywi_common.get_user_group(id=1)
kwargs = {
'h2': 1,
'users': user_sql.select_users(group=user_group),
'groups': group_sql.select_groups(),
'servers': roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1),
'roles': sql.select_roles(),
'sshs': cred_sql.select_ssh(group=user_group),
'masters': server_sql.select_servers(get_master_servers=1, uuid=g.user_params['user_uuid']),
'group': roxywi_common.get_user_group(id=1),
'services': service_sql.select_services(),
'timezones': pytz.all_timezones,
'guide_me': 1,
'settings': sql.get_setting('', all=1),
'page': 'servers.py',
'ldap_enable': sql.get_setting('ldap_enable'),
'user_roles': user_sql.select_user_roles_by_group(user_group),
'user_subscription': roxywi_common.return_user_subscription(),
'lang': g.user_params['lang']
}
return render_template('servers.html', **kwargs)
@bp.route('/internal/show_version') @bp.route('/internal/show_version')
@cache.cached() @cache.cached()
def show_roxywi_version(): def show_roxywi_version():

View File

@ -1,5 +1,8 @@
import json
import time
import distro import distro
from flask import render_template, request, jsonify, g from flask import render_template, request, jsonify, g, Response, stream_with_context
from flask_login import login_required from flask_login import login_required
from app.routes.metric import bp from app.routes.metric import bp
@ -120,3 +123,38 @@ def show_http_metric(service, server_ip):
return jsonify(metric.haproxy_http_metrics(server_ip, hostname, time_range)) return jsonify(metric.haproxy_http_metrics(server_ip, hostname, time_range))
return 'error: Wrong service' return 'error: Wrong service'
@bp.route('/<service>/<server_ip>/<is_http>/chart-stream')
@check_services
def chart_data(service, server_ip, is_http):
def get_chart_data():
while True:
json_metric = {}
if service in ('nginx', 'apache', 'waf'):
chart_metrics = metric_sql.select_metrics(server_ip, service, time_range=1)
for i in chart_metrics:
json_metric['time'] = common.get_time_zoned_date(i[2], '%H:%M:%S')
json_metric['value'] = str(i[1])
elif service == 'haproxy' and not is_http:
chart_metrics = metric_sql.select_metrics(server_ip, 'haproxy', time_range=1)
for i in chart_metrics:
json_metric['time'] = common.get_time_zoned_date(i[5], '%H:%M:%S')
json_metric['value'] = str(i[1])
json_metric['value1'] = str(i[2])
json_metric['value2'] = str(i[3])
else:
chart_metrics = metric_sql.select_metrics(server_ip, 'http_metrics', time_range=1)
for i in chart_metrics:
json_metric['time'] = common.get_time_zoned_date(i[5], '%H:%M:%S')
json_metric['value'] = str(i[1])
json_metric['value1'] = str(i[2])
json_metric['value2'] = str(i[3])
json_metric['value3'] = str(i[4])
yield f"data:{json.dumps(json_metric)}\n\n"
time.sleep(60)
response = Response(stream_with_context(get_chart_data()), mimetype="text/event-stream")
response.headers["Cache-Control"] = "no-cache"
response.headers["X-Accel-Buffering"] = "no"
return response

View File

@ -1373,12 +1373,12 @@ label {
margin-top: var(--indent); margin-top: var(--indent);
margin-left: var(--indent); margin-left: var(--indent);
} }
.metrics-refresh { /*.metrics-refresh {*/
text-align: right; /* text-align: right;*/
margin-top: -25px; /* margin-top: -25px;*/
margin-right: 10px; /* margin-right: 10px;*/
margin-bottom: 20px; /* margin-bottom: 20px;*/
} /*}*/
.ajaxwafstatus { .ajaxwafstatus {
padding-top: 2px; padding-top: 2px;
padding-left: 10px; padding-left: 10px;

View File

@ -1,10 +1,97 @@
function return_service_chart_config() {
var config = {
type: 'line',
data: {
labels: [],
datasets: [
{
normalized: true,
label: 'Connections',
data: [],
borderColor: 'rgba(75, 192, 192, 1)',
backgroundColor: 'rgba(75, 192, 192, 0.2)',
fill: true
}
]
},
options: {
animation: false,
maintainAspectRatio: false,
plugins: {
title: {
display: true,
text: '',
font: {
size: 20
},
legend: {
position: 'bottom'
}
},
legend: {
display: true,
labels: {
color: 'rgb(255, 99, 132)',
font: {
size: '10',
family: 'BlinkMacSystemFont'
}
},
position: 'bottom'
}
},
scales: {
y: {
beginAtZero: true
},
x: {
ticks: {
major: {
enabled: true,
fontStyle: 'bold'
},
source: 'data',
autoSkip: true,
autoSkipPadding: 45,
maxRotation: 0
}
}
}
}
}
return config;
}
function stream_chart(chart_id, service, service_ip, is_http=0) {
let random_sleep = getRandomArbitrary(500, 2000);
console.log(`stream_chart ${random_sleep}`);
sleep(random_sleep);
console.log('stop sleep')
const source = new EventSource(`/app/metrics/${service}/${service_ip}/${is_http}/chart-stream`);
source.onmessage = function (event) {
const data = JSON.parse(event.data);
if (chart_id.data.labels.length >= 30) {
chart_id.data.labels.shift();
chart_id.data.datasets[0].data.shift();
}
chart_id.data.labels.push(data.time);
chart_id.data.datasets[0].data.push(data.value);
if (service == 'haproxy') {
chart_id.data.datasets[1].data.push(data.value1);
chart_id.data.datasets[2].data.push(data.value2);
}
if (is_http) {
chart_id.data.datasets[3].data.push(data.value3);
}
chart_id.update();
}
}
function getHttpChartData(server) { function getHttpChartData(server) {
var hide_http_metrics = localStorage.getItem('hide_http_metrics'); var hide_http_metrics = localStorage.getItem('hide_http_metrics');
if (hide_http_metrics == 'disabled') { if (hide_http_metrics == 'disabled') {
return false; return false;
} }
$.ajax({ $.ajax({
url: "/app/metrics/haproxy/" + server + "/http", url: `/app/metrics/haproxy/${server}/http`,
data: { data: {
time_range: $( "#time-range option:selected" ).val(), time_range: $( "#time-range option:selected" ).val(),
}, },
@ -122,7 +209,7 @@ function renderHttpChart(data, labels, server) {
}, },
}, },
}); });
charts.push(myChart); stream_chart(myChart, 'haproxy', server, 1);
} }
function getChartData(server) { function getChartData(server) {
$.ajax({ $.ajax({
@ -226,7 +313,7 @@ function renderChart(data, labels, server) {
} }
} }
}); });
charts.push(myChart); stream_chart(myChart, 'haproxy', server);
} }
function getWafChartData(server) { function getWafChartData(server) {
$.ajax({ $.ajax({
@ -249,72 +336,24 @@ function renderServiceChart(data, labels, server, service) {
// Удаление последнего пустого элемента в каждом массиве // Удаление последнего пустого элемента в каждом массиве
dataArray.pop(); dataArray.pop();
dataArray.pop();
var label = labels.split(',');
label.pop();
label.pop();
var ctx = document.getElementById(service + '_' + server).getContext('2d'); var ctx = document.getElementById(service + '_' + server).getContext('2d');
var additional_title = ''; var additional_title = '';
if (service === 'waf') { if (service === 'waf') {
additional_title = 'WAF '; additional_title = 'WAF ';
} }
var myChart = new Chart(ctx, { config = return_service_chart_config();
type: 'line', for (var i=0; i<label.length; i++) {
data: { config.data.labels.push(label[i])
labels: labels.split(','), config.data.datasets[0].data.push(dataArray[i])
datasets: [ }
{ config.options.plugins.title.text = data[1] + ' ' + additional_title;
normalized: true, var myChart = new Chart(ctx, config);
label: 'Connections', myChart.update();
data: dataArray, stream_chart(myChart, service, server);
borderColor: 'rgba(75, 192, 192, 1)',
backgroundColor: 'rgba(75, 192, 192, 0.2)',
fill: true
}
]
},
options: {
animation: false,
maintainAspectRatio: false,
plugins: {
title: {
display: true,
text: additional_title + data[1],
font: {
size: 20
},
legend: {
position: 'bottom'
}
},
legend: {
display: true,
labels: {
color: 'rgb(255, 99, 132)',
font: {
size: '10',
family: 'BlinkMacSystemFont'
}
},
position: 'bottom'
}
},
scales: {
y: {
beginAtZero: true
},
x: {
ticks: {
major: {
enabled: true,
fontStyle: 'bold'
},
source: 'data',
autoSkip: true,
autoSkipPadding: 45,
maxRotation: 0
}
}
}
}
});
charts.push(myChart);
} }
function getNginxChartData(server) { function getNginxChartData(server) {
$.ajax({ $.ajax({
@ -394,18 +433,18 @@ function renderChartHapWiRam(data) {
var myChart = new Chart(ctx, { var myChart = new Chart(ctx, {
type: 'bar', type: 'bar',
data: { data: {
labels: ['total','used','free','shared','buff','available'], labels: ['used','free','shared','buff','available','total'],
datasets: [ datasets: [
{ {
normalized: true, normalized: true,
data: data, data: data,
backgroundColor: [ backgroundColor: [
'#36a2eb',
'#ff6384', '#ff6384',
'#33ff26', '#33ff26',
'#ff9f40', '#ff9f40',
'#ffcd56', '#ffcd56',
'#4bc0c0', '#4bc0c0',
'#36a2eb',
] ]
} }
] ]
@ -467,7 +506,7 @@ function renderChartHapWiCpu(data) {
var myChart = new Chart(ctx, { var myChart = new Chart(ctx, {
type: 'bar', type: 'bar',
data: { data: {
labels: ['user','sys','nice','idle','wait','hi','si','steal'], labels: ['user','sys','nice','idle','wait','hi','si','steal', 'total'],
datasets: [ datasets: [
{ {
normalized: true, normalized: true,
@ -480,6 +519,7 @@ function renderChartHapWiCpu(data) {
'#4bc0c0', '#4bc0c0',
'#5d9ceb', '#5d9ceb',
'#2c6969', '#2c6969',
'#5e1313',
] ]
} }
] ]
@ -568,9 +608,6 @@ function updatingCpuRamCharts() {
} else if (cur_url[0] == 'service' && cur_url[2]) { } else if (cur_url[0] == 'service' && cur_url[2]) {
NProgress.configure({showSpinner: false}); NProgress.configure({showSpinner: false});
showOverviewHapWI(); showOverviewHapWI();
getChartData(server_ip);
getHttpChartData(server_ip);
getWafChartData(server_ip);
} else { } else {
removeData(); removeData();
} }

View File

@ -189,10 +189,6 @@ $( function() {
if (valid) { if (valid) {
$.ajax({ $.ajax({
url: "/app/user/ldap/" + $('#new-username').val(), url: "/app/user/ldap/" + $('#new-username').val(),
// data: {
// token: $('#token').val()
// },
// type: "POST",
success: function (data) { success: function (data) {
data = data.replace(/\s+/g, ' '); data = data.replace(/\s+/g, ' ');
if (data.indexOf('error:') != '-1') { if (data.indexOf('error:') != '-1') {
@ -217,6 +213,7 @@ $( function() {
}); });
$("#tabs ul li").click(function() { $("#tabs ul li").click(function() {
var activeTab = $(this).find("a").attr("href"); var activeTab = $(this).find("a").attr("href");
console.log(activeTab);
var activeTabClass = activeTab.replace('#', ''); var activeTabClass = activeTab.replace('#', '');
$('.menu li ul li').each(function () { $('.menu li ul li').each(function () {
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
@ -228,6 +225,8 @@ $( function() {
}); });
if (activeTab == '#tools') { if (activeTab == '#tools') {
loadServices(); loadServices();
} else if (activeTab == '#settings') {
loadSettings();
} else if (activeTab == '#updatehapwi') { } else if (activeTab == '#updatehapwi') {
loadupdatehapwi(); loadupdatehapwi();
} else if (activeTab == '#openvpn'){ } else if (activeTab == '#openvpn'){
@ -243,17 +242,15 @@ window.onload = function() {
if (cur_url[0].split('#')[0] == 'admin') { if (cur_url[0].split('#')[0] == 'admin') {
if (activeTabIdx == 6) { if (activeTabIdx == 6) {
loadServices(); loadServices();
} else if (activeTabIdx == 3) {
loadSettings();
} else if (activeTabIdx == 4) {
loadBackup();
} else if (activeTabIdx == 7) { } else if (activeTabIdx == 7) {
loadupdatehapwi(); loadupdatehapwi();
} else if (activeTabIdx == 8) { } else if (activeTabIdx == 8) {
loadBackup();
} else if (activeTabIdx == 4) {
loadopenvpn(); loadopenvpn();
} }
} else if (cur_url[0].split('#')[0] == 'servers') {
if (activeTabIdx == 4) {
loadBackup();
}
} }
} }
function addUser(dialog_id) { function addUser(dialog_id) {
@ -1322,6 +1319,22 @@ function viewFirewallRules(ip) {
} }
} ); } );
} }
function loadSettings() {
$.ajax({
url: "/app/admin/settings",
success: function (data) {
data = data.replace(/\s+/g, ' ');
if (data.indexOf('error:') != '-1') {
toastr.error(data);
} else {
$('#settings').html(data);
$.getScript(awesome);
$( "input[type=checkbox]" ).checkboxradio();
$( "select" ).selectmenu();
}
}
} );
}
function loadServices() { function loadServices() {
$.ajax({ $.ajax({
url: "/app/admin/tools", url: "/app/admin/tools",

View File

@ -10,19 +10,21 @@
<div id="tabs"> <div id="tabs">
<ul id="admin-tabs"> <ul id="admin-tabs">
<li><a href="#users" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.users}} - Roxy-WI">{{lang.words.users|title()}}</a></li> <li><a href="#users" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.users}} - Roxy-WI">{{lang.words.users|title()}}</a></li>
<li><a href="#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups}} - Roxy-WI">{{lang.words.groups|title()}}</a></li> <li><a href="#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers}} - Roxy-WI">{{lang.words.servers|title()}}</a></li>
<li><a href="#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers}} - Roxy-WI">{{lang.words.servers|title()}}</a></li>
<li><a href="#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds}} - Roxy-WI">SSH {{lang.words.creds}}</a></li> <li><a href="#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds}} - Roxy-WI">SSH {{lang.words.creds}}</a></li>
<li><a href="#openvpn" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} OpenVPN - Roxy-WI" id="admin-tabs-vpn">OpenVPN</a></li>
<li><a href="#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings}} - Roxy-WI">{{lang.words.settings|title()}}</a></li> <li><a href="#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings}} - Roxy-WI">{{lang.words.settings|title()}}</a></li>
<li><a href="#backup" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.backup|title()}} {{lang.words.configs}} - Roxy-WI" id="admin-tabs-backup">{{lang.words.backup|title()}}</a></li>
{% if g.user_params['role'] == 1 %}
<li><a href="#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups}} - Roxy-WI">{{lang.words.groups|title()}}</a></li>
<li><a href="#tools" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.tools}} - Roxy-WI">{{lang.words.tools|title()}}</a></li> <li><a href="#tools" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.tools}} - Roxy-WI">{{lang.words.tools|title()}}</a></li>
<li><a href="#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI - Roxy-WI">{{lang.words.w_update|title()}}</a></li> <li><a href="#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI - Roxy-WI">{{lang.words.w_update|title()}}</a></li>
<li><a href="#backup" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.backup|title()}} {{lang.words.configs}} - Roxy-WI" id="admin-tabs-backup">{{lang.words.backup|title()}}</a></li> <li><a href="#openvpn" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} OpenVPN - Roxy-WI" id="admin-tabs-vpn">OpenVPN</a></li>
{% endif %}
</ul> </ul>
<div id="users"> <div id="users">
{% include 'include/admin_users.html' %} {% include 'include/admin_users.html' %}
</div> </div>
{% if g.user_params['role'] == 1 %}
<div id="groups"> <div id="groups">
<table class="overview" id="ajax-group"> <table class="overview" id="ajax-group">
<thead> <thead>
@ -68,6 +70,7 @@
{{lang.words.and}} {{lang.words.this2}} <a href="https://roxy-wi.org/howto/setup" title="How to setup servers, group and SSH credentials" target="_blank">{{lang.words.article}}</a> {{lang.words.and}} {{lang.words.this2}} <a href="https://roxy-wi.org/howto/setup" title="How to setup servers, group and SSH credentials" target="_blank">{{lang.words.article}}</a>
</div> </div>
</div> </div>
{% endif %}
<div id="servers"> <div id="servers">
{% include 'include/admin_servers.html' %} {% include 'include/admin_servers.html' %}
</div> </div>
@ -76,12 +79,10 @@
{% include 'include/admin_ssh.html' %} {% include 'include/admin_ssh.html' %}
</div> </div>
<div id="openvpn"></div> <div id="settings"></div>
<div id="settings">
{% include 'include/admin_settings.html' %}
</div>
<div id="backup"></div>
{% if g.user_params['role'] == 1 %}
<div id="tools"> <div id="tools">
<table id="services_table" class="overview"> <table id="services_table" class="overview">
<thead> <thead>
@ -132,7 +133,8 @@
<div id="ajax-update"></div> <div id="ajax-update"></div>
</div> </div>
<div id="backup"></div> <div id="openvpn"></div>
{% endif %}
</div> </div>
{% include 'include/admins_dialogs.html' %} {% include 'include/admins_dialogs.html' %}
<script> <script>
@ -143,9 +145,11 @@
}); });
{% endfor %} {% endfor %}
{% for server in servers %} {% for server in servers %}
{% if g.user_params['role'] == 1 %}
$("#servergroup-{{ server.0}}" ).selectmenu({ $("#servergroup-{{ server.0}}" ).selectmenu({
width: 100 width: 100
}); });
{% endif %}
$("#slavefor-{{server.0}}" ).selectmenu({ $("#slavefor-{{server.0}}" ).selectmenu({
width: 115 width: 115
}); });
@ -174,6 +178,10 @@
}); });
</script> </script>
<link href="{{ url_for('static', filename='css/servers.css') }}" rel="stylesheet"/> <link href="{{ url_for('static', filename='css/servers.css') }}" rel="stylesheet"/>
{% include 'include/intro/admin.html' %} {% if g.user_params['role'] == 1 %}
{% include 'include/intro/admin.html' %}
{% else %}
{% include 'include/intro/servers.html' %}
{% endif %}
{% include 'include/intro/js_script.html' %} {% include 'include/intro/js_script.html' %}
{% endblock %} {% endblock %}

View File

@ -6,7 +6,7 @@
<th class="padding10 first-collumn" id="server-name-th">{{lang.words.name|title()}}</th> <th class="padding10 first-collumn" id="server-name-th">{{lang.words.name|title()}}</th>
<th class="ip-field" style="width: 10% " id="server-ip-th">IP</th> <th class="ip-field" style="width: 10% " id="server-ip-th">IP</th>
<th style="width: 5%" class="help_cursor"><span title="SSH port">{{lang.words.port|title()}}</span></th> <th style="width: 5%" class="help_cursor"><span title="SSH port">{{lang.words.port|title()}}</span></th>
{% if page != "servers.py" %} {% if g.user_params['role'] == 1 %}
<th style="width: 10%">{{lang.words.group|title()}}</th> <th style="width: 10%">{{lang.words.group|title()}}</th>
{% endif %} {% endif %}
<th class="checkbox-head" style="min-width: 70px;">{{lang.words.enabled|title()}}</th> <th class="checkbox-head" style="min-width: 70px;">{{lang.words.enabled|title()}}</th>
@ -33,7 +33,7 @@
</thead> </thead>
<tbody> <tbody>
{% endif %} {% endif %}
{% for server in servers %} {% for server in servers %}
<tr id="server-{{server.0}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newserver{% endif %}"> <tr id="server-{{server.0}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newserver{% endif %}">
<td class="padding10 first-collumn"> <td class="padding10 first-collumn">
<span class="serverNone server-status-small" title="{{lang.phrases.server_unknown}}" id="server_status-{{server.0}}"></span> <span class="serverNone server-status-small" title="{{lang.phrases.server_unknown}}" id="server_status-{{server.0}}"></span>
@ -48,7 +48,7 @@
{% set id = 'port-' + server.0|string() %} {% set id = 'port-' + server.0|string() %}
{{ input(id, value=server.10, type='number', style='width: 50px;') }} {{ input(id, value=server.10, type='number', style='width: 50px;') }}
</td> </td>
{% if page != "servers.py" %} {% if g.user_params['role'] == 1 %}
<td> <td>
<select id="servergroup-{{server.0}}" name="servergroup-{{server.0}}"> <select id="servergroup-{{server.0}}" name="servergroup-{{server.0}}">
<option disabled selected>------</option> <option disabled selected>------</option>
@ -152,7 +152,7 @@
<a class="delete" onclick="confirmDeleteServer({{server.0}})" title="{{lang.words.delete|title()}} {{lang.words.server}} {{server.1}}" style="cursor: pointer;"></a> <a class="delete" onclick="confirmDeleteServer({{server.0}})" title="{{lang.words.delete|title()}} {{lang.words.server}} {{server.1}}" style="cursor: pointer;"></a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
{% if not adding %} {% if not adding %}
</tbody> </tbody>
</table> </table>

View File

@ -1,3 +1,5 @@
{% from 'include/input_macros.html' import input, checkbox %}
{% import 'languages/'+lang|default('en')+'.html' as lang %}
{% set sections_name = { {% set sections_name = {
'rabbitmq': 'RabbitMQ', 'rabbitmq': 'RabbitMQ',
'nginx': 'NGINX', 'nginx': 'NGINX',
@ -17,7 +19,7 @@
<tbody> <tbody>
{% set section = namespace(section='') %} {% set section = namespace(section='') %}
{% for set in settings %} {% for set in settings %}
{% if page == "servers.py" and (set.section in ('monitoring', 'rabbitmq', 'mail', 'smon')) %} {% if g.user_params['role'] == 2 and (set.section in ('monitoring', 'rabbitmq', 'mail', 'smon')) %}
<!-- continue --> <!-- continue -->
{% else %} {% else %}
{% if section.section|string() != set.section|string() %} {% if section.section|string() != set.section|string() %}
@ -33,7 +35,7 @@
</tr> </tr>
{% endif %} {% endif %}
{% set section.section = set.section %} {% set section.section = set.section %}
{% if page == "servers.py" and (set.param == 'proxy') %} {% if g.user_params['role'] == 2 and (set.param == 'proxy') %}
<!-- continue --> <!-- continue -->
{% else %} {% else %}
<tr class="{{ loop.cycle('odd', 'even') }} {{set.section}}-section" style="display: none"> <tr class="{{ loop.cycle('odd', 'even') }} {{set.section}}-section" style="display: none">

View File

@ -6,7 +6,7 @@
<td class="first-collumn" style="width: 25%;" class="help_cursor" id="ssh-key-enabled-td"> <td class="first-collumn" style="width: 25%;" class="help_cursor" id="ssh-key-enabled-td">
<span title="If it is enabled, the key will be used, if turned off - the password. Do not forget to download the keys to all servers or install the sudo without a password">SSH {{lang.words.key}}</span> <span title="If it is enabled, the key will be used, if turned off - the password. Do not forget to download the keys to all servers or install the sudo without a password">SSH {{lang.words.key}}</span>
</td> </td>
{% if page != "servers.py" %} {% if g.user_params['role'] == 1 %}
<td style="width: 25%;">{{lang.words.group|title()}}</td> <td style="width: 25%;">{{lang.words.group|title()}}</td>
{% endif %} {% endif %}
<td style="width: 100%;" class="help_cursor" id="ssh-user-name-td"> <td style="width: 100%;" class="help_cursor" id="ssh-user-name-td">
@ -27,7 +27,7 @@
<label for="ssh_enable-{{ssh.id}}">{{lang.words.enable|title()}} SSH {{lang.words.key}}</label><input type="checkbox" id="ssh_enable-{{ssh.id}}"> <label for="ssh_enable-{{ssh.id}}">{{lang.words.enable|title()}} SSH {{lang.words.key}}</label><input type="checkbox" id="ssh_enable-{{ssh.id}}">
{% endif %} {% endif %}
</td> </td>
{% if page != "servers.py" %} {% if g.user_params['role'] == 1 %}
<td> <td>
<select id="sshgroup-{{ssh.id}}" name="sshgroup-{{ssh.id}}"> <select id="sshgroup-{{ssh.id}}" name="sshgroup-{{ssh.id}}">
{% for group in groups %} {% for group in groups %}

View File

@ -7,7 +7,7 @@
<th style="width: 10%">{{lang.words.password|title()}}</th> <th style="width: 10%">{{lang.words.password|title()}}</th>
<th style="width: 10%" class="checkbox-head" id="user-active-th">{{lang.words.active|title()}}</th> <th style="width: 10%" class="checkbox-head" id="user-active-th">{{lang.words.active|title()}}</th>
<th style="width: 20%">{{lang.words.email|title()}}</th> <th style="width: 20%">{{lang.words.email|title()}}</th>
{% if page == "servers.py" %} {% if g.user_params['role'] == 2 %}
<th style="width: 10%" id="user-role-th">{{lang.words.role|title()}}</th> <th style="width: 10%" id="user-role-th">{{lang.words.role|title()}}</th>
{% else %} {% else %}
<th style="width: 10%" id="user-group-role-th">{{lang.words.groups|title()}} {{lang.words.and}} {{lang.words.roles|title()}}</th> <th style="width: 10%" id="user-group-role-th">{{lang.words.groups|title()}} {{lang.words.and}} {{lang.words.roles|title()}}</th>
@ -20,7 +20,7 @@
<tbody> <tbody>
{% endif %} {% endif %}
{% for user in users %} {% for user in users %}
{% if user.role == '1' and page == "servers.py" %} {% if user.role == '1' and g.user_params['role'] == 2 %}
{% set disable_superAdmin = "disabled" %} {% set disable_superAdmin = "disabled" %}
{% endif %} {% endif %}
<tr id="user-{{user.user_id}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newuser{% endif %}"> <tr id="user-{{user.user_id}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newuser{% endif %}">
@ -55,13 +55,13 @@
{% endif %} {% endif %}
</td> </td>
<td> <td>
{% if page == "servers.py" %} {% if g.user_params['role'] == 2 %}
<select id="role-{{user.user_id}}" name="role-{{user.user_id}}" {{disable_superAdmin}}> <select id="role-{{user.user_id}}" name="role-{{user.user_id}}" {{disable_superAdmin}}>
<option disabled selected>Select a role</option> <option disabled selected>Select a role</option>
{% for r in roles %} {% for r in roles %}
{% for user_role in user_roles %} {% for user_role in user_roles %}
{% if r.role_id|int() != 1 and user.user_id == user_role.user_id %} {% if r.role_id|int() != 1 and user.user_id|string() == user_role.user_id|string() %}
{% if user_role.user_role_id == r.role_id %} {% if user_role.user_role_id|string() == r.role_id|string() %}
<option value="{{ r.role_id }}" selected>{{ r.name }}</option> <option value="{{ r.role_id }}" selected>{{ r.name }}</option>
{% else %} {% else %}
<option value="{{ r.role_id }}">{{ r.name }}</option> <option value="{{ r.role_id }}">{{ r.name }}</option>

View File

@ -1,4 +1,4 @@
{% if page != "servers.py" %} {% if g.user_params['role'] == 1 %}
<div id="user-add-table" style="display: none;"> <div id="user-add-table" style="display: none;">
<table class="overview" id="user-add-table-overview" title="{{lang.words.add|title()}} {{lang.words.w_a}} {{lang.words.new2}} {{lang.words.user2}}"> <table class="overview" id="user-add-table-overview" title="{{lang.words.add|title()}} {{lang.words.w_a}} {{lang.words.new2}} {{lang.words.user2}}">
{% include 'include/tr_validate_tips.html' %} {% include 'include/tr_validate_tips.html' %}
@ -91,7 +91,7 @@
</select> </select>
</td> </td>
</tr> </tr>
{% if page != "servers.py" %} {% if g.user_params['role'] == 1 %}
<tr> <tr>
<td class="padding20"> <td class="padding20">
{{lang.words.group|title()}} {{lang.words.group|title()}}
@ -127,7 +127,7 @@
<label for="new-ssh_enable">{{lang.words.enabled|title()}} SSH {{lang.words.key}}</label><input type="checkbox" id="new-ssh_enable" checked> <label for="new-ssh_enable">{{lang.words.enabled|title()}} SSH {{lang.words.key}}</label><input type="checkbox" id="new-ssh_enable" checked>
</td> </td>
</tr> </tr>
{% if page != "servers.py" %} {% if g.user_params['role'] == 1 %}
<tr> <tr>
<td class="padding20">{{lang.words.group|title()}}</td> <td class="padding20">{{lang.words.group|title()}}</td>
<td> <td>

View File

@ -107,30 +107,22 @@
<li><a href="{{ url_for('install.install_monitoring') }}#geolite2" title="{{lang.words.installation|title()}} GeoLite2" class="hap-menu geolite2 installgeo head-submenu">GeoLite2</a> </li> <li><a href="{{ url_for('install.install_monitoring') }}#geolite2" title="{{lang.words.installation|title()}} GeoLite2" class="hap-menu geolite2 installgeo head-submenu">GeoLite2</a> </li>
</ul> </ul>
</li> </li>
<li class="p_menu">
<a href="{{ url_for('main.servers') }}#users" title="{{lang.menu_links.servers.title}}" class="runtime">{{lang.menu_links.servers.link}}</a>
<ul class="v_menu">
<li><a href="{{ url_for('main.servers') }}#users" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu">{{lang.words.users|title()}}</a></li>
<li><a href="{{ url_for('main.servers') }}#servers" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu">{{lang.words.servers|title()}}</a></li>
<li><a href="{{ url_for('main.servers') }}#ssh" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu">SSH {{lang.words.creds|title()}}</a></li>
<li><a href="{{ url_for('main.servers') }}#settings" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu">{{lang.words.settings|title()}}</a></li>
<li><a href="{{ url_for('main.servers') }}#backup" title="{{lang.words.servers|title()}}: {{lang.words.backup|title()}} {{lang.words.configs2}}" class="backup head-submenu">{{lang.words.backup|title()}}</a> </li>
<li><a href="{{ url_for('logs.logs_internal') }}?type=2" title="{{lang.words.servers|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li>
</ul>
</li>
{% endif %} {% endif %}
{% if g.user_params['role'] <= 1 %} {% if g.user_params['role'] <= 2 %}
<li class="p_menu" id="admin-area"> <li class="p_menu" id="admin-area">
<a href="{{ url_for('admin.admin') }}#users" title="{{lang.menu_links.admin_area.title}}" class="admin">{{lang.menu_links.admin_area.link}}</a> <a href="{{ url_for('admin.admin') }}#users" title="{{lang.menu_links.admin_area.title}}" class="admin">{{lang.menu_links.admin_area.link}}</a>
<ul class="v_menu"> <ul class="v_menu">
<li><a href="{{ url_for('admin.admin') }}#users" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu" id="admin-area-users">{{lang.words.users|title()}}</a></li> <li><a href="{{ url_for('admin.admin') }}#users" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu" id="admin-area-users">{{lang.words.users|title()}}</a></li>
<li><a href="{{ url_for('admin.admin') }}#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups3}}" class="group groups head-submenu" id="admin-area-groups">{{lang.words.groups|title()}}</a></li>
<li><a href="{{ url_for('admin.admin') }}#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu" id="admin-area-servers">{{lang.words.servers|title()}}</a></li> <li><a href="{{ url_for('admin.admin') }}#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu" id="admin-area-servers">{{lang.words.servers|title()}}</a></li>
<li><a href="{{ url_for('admin.admin') }}#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu" id="admin-area-ssh">SSH {{lang.words.creds|title()}}</a></li> <li><a href="{{ url_for('admin.admin') }}#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu" id="admin-area-ssh">SSH {{lang.words.creds|title()}}</a></li>
<li><a href="{{ url_for('admin.admin') }}#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu" id="admin-area-settings">{{lang.words.settings|title()}}</a></li> <li><a href="{{ url_for('admin.admin') }}#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu" id="admin-area-settings">{{lang.words.settings|title()}}</a></li>
<li><a href="{{ url_for('admin.admin') }}#tools" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.tools}}" class="tools head-submenu" id="admin-area-services">{{lang.words.tools|title()}}</a></li> <li><a href="{{ url_for('logs.logs_internal') }}" title="{{lang.words.admin_area|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu" id="admin-area-logs">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li>
<li><a href="{{ url_for('logs.logs_internal') }}" title="{{lang.words.admin_area|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu" id="admin-area-logs">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li> <li><a href="{{ url_for('admin.admin') }}#backup" title="{{lang.words.servers|title()}}: {{lang.words.backup|title()}} {{lang.words.configs2}}" class="backup head-submenu">{{lang.words.backup|title()}}</a> </li>
{% if g.user_params['role'] <= 1 %}
<li><a href="{{ url_for('admin.admin') }}#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups3}}" class="group groups head-submenu" id="admin-area-groups">{{lang.words.groups|title()}}</a></li>
<li><a href="{{ url_for('admin.admin') }}#tools" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.tools}}" class="tools head-submenu" id="admin-area-services">{{lang.words.tools|title()}}</a></li>
<li><a href="{{ url_for('admin.admin') }}#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI" class="upload updatehapwi head-submenu" id="admin-area-update">{{lang.words.w_update|title()}}</a></li> <li><a href="{{ url_for('admin.admin') }}#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI" class="upload updatehapwi head-submenu" id="admin-area-update">{{lang.words.w_update|title()}}</a></li>
{% endif %}
</ul> </ul>
</li> </li>
{% endif %} {% endif %}

View File

@ -59,9 +59,6 @@
</div> </div>
{% endif %} {% endif %}
<div style="clear: both;"></div> <div style="clear: both;"></div>
<div id="refresh" class="metrics-refresh" title="{{lang.words.refresh|title}} {{lang.words.metrics}}" onclick="showMetrics()">
<span class="refresh"></span>
</div>
{% for s in servers %} {% for s in servers %}
{% if service == 'haproxy' %} {% if service == 'haproxy' %}
<div class="chart-container"> <div class="chart-container">

View File

@ -1,80 +0,0 @@
{% extends "base.html" %}
{% block title %}{{lang.menu_links.servers.title}}{% endblock %}
{% block h2 %}{{lang.menu_links.servers.title}}{% endblock %}
{% block content %}
{% from 'include/input_macros.html' import input, checkbox, select, copy_to_clipboard %}
<script src="/app/static/js/users.js"></script>
<script src="{{ url_for('static', filename='js/backup.js') }}"></script>
{% include 'include/del_confirm.html' %}
<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-sshgroup" name="new-sshgroup" value="{{ group }}" >
{{ input('new-telegram-group-add', type='hidden', value=group) }}
{{ input('new-slack-group-add', type='hidden', value=group) }}
{{ input('new-pd-group-add', type='hidden', value=group) }}
<div id="tabs">
<ul>
<li><a href="#users" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.users}} - Roxy-WI">{{lang.words.users|title()}}</a></li>
<li><a href="#servers" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.servers}} - Roxy-WI">{{lang.words.servers|title()}}</a></li>
<li><a href="#ssh" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds}} - Roxy-WI">SSH {{lang.words.creds}}</a></li>
<li><a href="#settings" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings}} - Roxy-WI">{{lang.words.settings|title()}}</a></li>
<li><a href="#backup" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.backup|title()}} configs - Roxy-WI" id="admin-tabs-backup">{{lang.words.backup|title()}}</a></li>
</ul>
<div id="users">
{% include 'include/admin_users.html' %}
</div>
<div id="servers">
{% include 'include/admin_servers.html' %}
</div>
<div id="ssh">
{% include 'include/admin_ssh.html' %}
</div>
<div id="settings">
{% include 'include/admin_settings.html' %}
</div>
<div id="backup"></div>
</div>
{% include 'include/admins_dialogs.html' %}
{% include 'include/change_pass_form.html' %}
<script>
$( function() {
{% for user in users %}
$("#role-{{user.0}}" ).selectmenu({
width: 100
});
{% endfor %}
{% for server in servers %}
$("#slavefor-{{server.0}}" ).selectmenu({
width: 100
});
$("#credentials-{{server.0}}" ).selectmenu({
width: 150
});
{% endfor %}
{% for ssh in sshs %}
$("#sshgroup-{{ ssh.0}}" ).selectmenu({
width: 150
});
{% endfor %}
{% for server in backups %}
$("#backup-time-{{ server.id}}" ).selectmenu({
width: 100
});
$("#backup-type-{{server.id}}" ).selectmenu({
width: 130
});
$("#backup-credentials-{{server.id}}" ).selectmenu({
width: 150
});
{% endfor %}
});
</script>
<link href="{{ url_for('static', filename='css/servers.css') }}" rel="stylesheet"/>
{% include 'include/intro/servers.html' %}
{% include 'include/intro/js_script.html' %}
{% endblock %}

View File

@ -406,14 +406,10 @@
<option value="720">12 {{lang.words.hours2}}</option> <option value="720">12 {{lang.words.hours2}}</option>
</select> </select>
</div> </div>
<div style="clear: both;"></div>
<div id="refresh" class="metrics-refresh" style="margin-right: 140px;" title="{{lang.words.refresh|title()}}" onclick="showMetrics()">
<span class="refresh"></span>
</div>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if service == 'haproxy' and s.7.0.9 %} {% if service == 'haproxy' and s.7.0.9 %}
<div id="server_metrics_div" class="chart-container_overview"> <div id="server_metrics_div" class="chart-container_overview" style="margin-top: -35px;">
<canvas id="{{s.2}}" role="img"></canvas> <canvas id="{{s.2}}" role="img"></canvas>
</div> </div>
<div class="chart-container_overview http_metrics_div"> <div class="chart-container_overview http_metrics_div">
@ -425,11 +421,11 @@
</div> </div>
{% endif %} {% endif %}
{% elif service == 'nginx' and s.7.0.21 %} {% elif service == 'nginx' and s.7.0.21 %}
<div id="nginx_metrics_div" class="chart-container" style="display: block; width: 90%; height: 300px;"> <div id="nginx_metrics_div" class="chart-container_overview" style="margin-top: -35px;">
<canvas id="nginx_{{s.2}}" role="img"></canvas> <canvas id="nginx_{{s.2}}" role="img"></canvas>
</div> </div>
{% elif service == 'apache' and s.7.0.27 %} {% elif service == 'apache' and s.7.0.27 %}
<div id="apache_metrics_div" class="chart-container" style="display: block; width: 90%; height: 300px;"> <div id="apache_metrics_div" class="chart-container_overview" style="margin-top: -35px;">
<canvas id="apache_{{s.2}}" role="img"></canvas> <canvas id="apache_{{s.2}}" role="img"></canvas>
</div> </div>
{% endif %} {% endif %}

View File

@ -192,9 +192,6 @@
</select> </select>
</div> </div>
<div style="clear: both;"></div> <div style="clear: both;"></div>
<div id="refresh" class="metrics-refresh" title="{{lang.words.refresh|title()}}" onclick="showWafMetrics()">
<span class="refresh"></span>
</div>
{% for s in servers %} {% for s in servers %}
<div class="chart-container"> <div class="chart-container">
<canvas id="waf_{{s.server.ip}}" role="img"></canvas> <canvas id="waf_{{s.server.ip}}" role="img"></canvas>

View File

@ -74,6 +74,8 @@ $( function() {
show_current_page($(this)) show_current_page($(this))
} else if (full_uri == 'logs/apache' && full_uri1 == 'logs/apache') { } else if (full_uri == 'logs/apache' && full_uri1 == 'logs/apache') {
show_current_page($(this)) show_current_page($(this))
} else if (full_uri == 'logs/internal' && full_uri1 == 'logs/internal') {
show_current_page($(this))
} else if (full_uri == 'service/haproxy' && full_uri1 == 'service/haproxy') { } else if (full_uri == 'service/haproxy' && full_uri1 == 'service/haproxy') {
show_current_page($(this)) show_current_page($(this))
} else if (full_uri == 'service/nginx' && full_uri1 == 'service/nginx') { } else if (full_uri == 'service/nginx' && full_uri1 == 'service/nginx') {
@ -693,8 +695,7 @@ $( function() {
try { try {
var cur_path = window.location.pathname; var cur_path = window.location.pathname;
var attr = $(this).attr('href'); var attr = $(this).attr('href');
if (cur_path == '/app/add/haproxy' || cur_path == '/app/add/nginx' || cur_path == '/app/servers' || if (cur_path == '/app/add/haproxy' || cur_path == '/app/add/nginx' || cur_path == '/app/admin' || cur_path == '/app/install' || cur_path == '/app/runtimeapi') {
cur_path == '/app/admin' || cur_path == '/app/install' || cur_path == '/app/runtimeapi') {
if (typeof attr !== typeof undefined && attr !== false) { if (typeof attr !== typeof undefined && attr !== false) {
$('title').text($(this).attr('title')); $('title').text($(this).attr('title'));
history.pushState({}, '', $(this).attr('href')); history.pushState({}, '', $(this).attr('href'));
@ -941,10 +942,6 @@ $( function() {
} }
$.ajax({ $.ajax({
url: "/app/user/group/current", url: "/app/user/group/current",
// data: {
// token: $('#token').val()
// },
// type: "POST",
success: function (data) { success: function (data) {
if (data.indexOf('danger') != '-1') { if (data.indexOf('danger') != '-1') {
$("#ajax").html(data); $("#ajax").html(data);
@ -993,7 +990,7 @@ $( function() {
$("#tabs").tabs("option", "active", 2); $("#tabs").tabs("option", "active", 2);
}); });
} }
if (cur_url[0].indexOf('admin') != '-1' || cur_url[0].indexOf('servers') != '-1') { if (cur_url[0].indexOf('admin') != '-1') {
$(".users").on("click", function () { $(".users").on("click", function () {
$('.menu li ul li').each(function () { $('.menu li ul li').each(function () {
$(this).find('a').css('padding-left', '20px') $(this).find('a').css('padding-left', '20px')
@ -1005,122 +1002,87 @@ $( function() {
}); });
$("#tabs").tabs("option", "active", 0); $("#tabs").tabs("option", "active", 0);
}); });
if (cur_url[0].indexOf('admin') != '-1') { $(".runtime").on("click", function () {
$(".group").on("click", function () { $('.menu li ul li').each(function () {
$('.menu li ul li').each(function () { $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
$(this).find('a').css('padding-left', '20px'); $(this).find('a').css('padding-left', '20px');
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); $(this).find('a').css('background-color', '#48505A');
$(this).find('a').css('background-color', '#48505A'); $(this).children(".runtime").css('padding-left', '30px');
$(this).children(".group").css('padding-left', '30px'); $(this).children(".runtime").css('border-left', '4px solid var(--right-menu-blue-rolor)');
$(this).children(".group").css('border-left', '4px solid var(--right-menu-blue-rolor)'); $(this).children(".runtime").css('background-color', 'var(--right-menu-blue-rolor)');
$(this).children(".group").css('background-color', 'var(--right-menu-blue-rolor)');
});
$("#tabs").tabs("option", "active", 1);
}); });
$(".runtime").on("click", function () { $("#tabs").tabs("option", "active", 1);
$('.menu li ul li').each(function () { });
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); $(".admin").on("click", function () {
$(this).find('a').css('padding-left', '20px'); $('.menu li ul li').each(function () {
$(this).find('a').css('background-color', '#48505A'); $(this).find('a').css('padding-left', '20px');
$(this).children(".runtime").css('padding-left', '30px'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
$(this).children(".runtime").css('border-left', '4px solid var(--right-menu-blue-rolor)'); $(this).find('a').css('background-color', '#48505A');
$(this).children(".runtime").css('background-color', 'var(--right-menu-blue-rolor)'); $(this).children(".admin").css('padding-left', '30px');
}); $(this).children(".admin").css('border-left', '4px solid var(--right-menu-blue-rolor)');
$("#tabs").tabs("option", "active", 2); $(this).children(".admin").css('background-color', 'var(--right-menu-blue-rolor)');
}); });
$(".admin").on("click", function () { $("#tabs").tabs("option", "active", 2);
$('.menu li ul li').each(function () { });
$(this).find('a').css('padding-left', '20px'); $(".settings").on("click", function () {
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); $('.menu li ul li').each(function () {
$(this).find('a').css('background-color', '#48505A'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
$(this).children(".admin").css('padding-left', '30px'); $(this).find('a').css('padding-left', '20px');
$(this).children(".admin").css('border-left', '4px solid var(--right-menu-blue-rolor)'); $(this).find('a').css('background-color', '#48505A');
$(this).children(".admin").css('background-color', 'var(--right-menu-blue-rolor)'); $(this).children(".settings").css('padding-left', '30px');
}); $(this).children(".settings").css('border-left', '4px solid var(--right-menu-blue-rolor)');
$("#tabs").tabs("option", "active", 3); $(this).children(".settings").css('background-color', 'var(--right-menu-blue-rolor)');
}); });
$(".settings").on("click", function () { $("#tabs").tabs("option", "active", 3);
$('.menu li ul li').each(function () { loadSettings();
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); });
$(this).find('a').css('padding-left', '20px'); $(".backup").on("click", function () {
$(this).find('a').css('background-color', '#48505A'); $('.menu li ul li').each(function () {
$(this).children(".settings").css('padding-left', '30px'); $(this).find('a').css('padding-left', '20px');
$(this).children(".settings").css('border-left', '4px solid var(--right-menu-blue-rolor)'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
$(this).children(".settings").css('background-color', 'var(--right-menu-blue-rolor)'); $(this).find('a').css('background-color', '#48505A');
}); $(this).children(".backup").css('padding-left', '30px');
$("#tabs").tabs("option", "active", 5); $(this).children(".backup").css('border-left', '4px solid var(--right-menu-blue-rolor)');
$(this).children(".backup").css('background-color', 'var(--right-menu-blue-rolor)');
}); });
$(".services").on("click", function () { $("#tabs").tabs("option", "active", 4);
$('.menu li ul li').each(function () { loadBackup();
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); });
$(this).find('a').css('padding-left', '20px'); $(".group").on("click", function () {
$(this).find('a').css('background-color', '#48505A'); $('.menu li ul li').each(function () {
$(this).children(".services").css('padding-left', '30px'); $(this).find('a').css('padding-left', '20px');
$(this).children(".services").css('border-left', '4px solid var(--right-menu-blue-rolor)'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
$(this).children(".services").css('background-color', 'var(--right-menu-blue-rolor)'); $(this).find('a').css('background-color', '#48505A');
}); $(this).children(".group").css('padding-left', '30px');
$("#tabs").tabs("option", "active", 6); $(this).children(".group").css('border-left', '4px solid var(--right-menu-blue-rolor)');
loadServices(); $(this).children(".group").css('background-color', 'var(--right-menu-blue-rolor)');
}); });
$(".updatehapwi").on("click", function () { $("#tabs").tabs("option", "active", 5);
$('.menu li ul li').each(function () { });
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); $(".tools").on("click", function () {
$(this).find('a').css('padding-left', '20px'); $('.menu li ul li').each(function () {
$(this).find('a').css('background-color', '#48505A'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
$(this).children(".updatehapwi").css('padding-left', '30px'); $(this).find('a').css('padding-left', '20px');
$(this).children(".updatehapwi").css('border-left', '4px solid var(--right-menu-blue-rolor)'); $(this).find('a').css('background-color', '#48505A');
$(this).children(".updatehapwi").css('background-color', 'var(--right-menu-blue-rolor)'); $(this).children(".tools").css('padding-left', '30px');
}); $(this).children(".tools").css('border-left', '4px solid var(--right-menu-blue-rolor)');
$("#tabs").tabs("option", "active", 7); $(this).children(".tools").css('background-color', 'var(--right-menu-blue-rolor)');
loadupdatehapwi();
}); });
} else { $("#tabs").tabs("option", "active", 6);
$(".runtime").on("click", function () { loadServices();
$('.menu li ul li').each(function () { });
$(this).find('a').css('padding-left', '20px'); $(".updatehapwi").on("click", function () {
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); $('.menu li ul li').each(function () {
$(this).find('a').css('background-color', '#48505A'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
$(this).children(".runtime").css('padding-left', '30px'); $(this).find('a').css('padding-left', '20px');
$(this).children(".runtime").css('border-left', '4px solid var(--right-menu-blue-rolor)'); $(this).find('a').css('background-color', '#48505A');
$(this).children(".runtime").css('background-color', 'var(--right-menu-blue-rolor)'); $(this).children(".updatehapwi").css('padding-left', '30px');
}); $(this).children(".updatehapwi").css('border-left', '4px solid var(--right-menu-blue-rolor)');
$("#tabs").tabs("option", "active", 1); $(this).children(".updatehapwi").css('background-color', 'var(--right-menu-blue-rolor)');
}); });
$(".admin").on("click", function () { $("#tabs").tabs("option", "active", 7);
$('.menu li ul li').each(function () { loadupdatehapwi();
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); });
$(this).find('a').css('padding-left', '20px');
$(this).find('a').css('background-color', '#48505A');
$(this).children(".admin").css('padding-left', '30px');
$(this).children(".admin").css('border-left', '4px solid var(--right-menu-blue-rolor)');
$(this).children(".admin").css('background-color', 'var(--right-menu-blue-rolor)');
});
$("#tabs").tabs("option", "active", 2);
});
$(".settings").on("click", function () {
$('.menu li ul li').each(function () {
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
$(this).find('a').css('padding-left', '20px');
$(this).find('a').css('background-color', '#48505A');
$(this).children(".settings").css('padding-left', '30px');
$(this).children(".settings").css('border-left', '4px solid var(--right-menu-blue-rolor)');
$(this).children(".settings").css('background-color', 'var(--right-menu-blue-rolor)');
});
$("#tabs").tabs("option", "active", 3);
});
$(".backup").on("click", function () {
$('.menu li ul li').each(function () {
$(this).find('a').css('padding-left', '20px');
$(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)');
$(this).find('a').css('background-color', '#48505A');
$(this).children(".backup").css('padding-left', '30px');
$(this).children(".backup").css('border-left', '4px solid var(--right-menu-blue-rolor)');
$(this).children(".backup").css('background-color', 'var(--right-menu-blue-rolor)');
});
$("#tabs").tabs("option", "active", 4);
loadBackup();
});
}
} }
$('.copyToClipboard').hover(function (){ $('.copyToClipboard').hover(function (){
$.getScript("/app/static/js/overview.js"); $.getScript("/app/static/js/overview.js");
@ -1150,6 +1112,9 @@ function saveUserSettings(){
function sleep(ms) { function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms)); return new Promise(resolve => setTimeout(resolve, ms));
} }
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
async function ban() { async function ban() {
$( '#login').attr('disabled', 'disabled'); $( '#login').attr('disabled', 'disabled');
$( '#pass').attr('disabled', 'disabled'); $( '#pass').attr('disabled', 'disabled');