Changelog: https://roxy-wi.org/changelog#7.1.1
pull/375/head
Aidaho 2024-01-17 09:08:27 +03:00
parent ce51059ed0
commit fdc7badc61
59 changed files with 772 additions and 912 deletions

View File

@ -93,7 +93,7 @@ def login_page():
except Exception:
lang = 'en'
return render_template('login.html', role=role, user=user1, lang=lang)
return render_template('login.html', user_params='', role=role, user=user1, lang=lang)
@app.route('/logout', methods=['GET', 'POST'])

View File

@ -4498,3 +4498,16 @@ def check_ha_virt(vip_id: int) -> bool:
except Exception:
return False
return True
def select_ha_cluster_name_and_slaves() -> object:
try:
query = (
HaCluster.select(HaCluster.id, HaCluster.name, HaClusterSlave.server_id)
.join(HaClusterSlave)
)
result = query.execute()
except Exception as e:
out_error(e)
else:
return result

View File

@ -11,9 +11,11 @@ def create_cluster(cluster: object, group_id: int) -> str:
vip = common.is_ip_or_dns(cluster['vip'])
syn_flood = int(cluster['syn_flood'])
return_master = int(cluster['return_to_master'])
cluster_name = common.checkAjaxInput(cluster['name'])
desc = common.checkAjaxInput(cluster['desc'])
try:
cluster_id = sql.create_cluster(cluster['name'], syn_flood, group_id, cluster['desc'])
cluster_id = sql.create_cluster(cluster_name, syn_flood, group_id, desc)
roxywi_common.logging(cluster_id, 'New cluster has been created', keep_history=1, roxywi=1, service='HA cluster')
except Exception as e:
return f'error: Cannot create new HA cluster: {e}'
@ -69,7 +71,8 @@ def create_cluster(cluster: object, group_id: int) -> str:
def update_cluster(cluster: object, group_id: int) -> str:
cluster_id = int(cluster['cluster_id'])
syn_flood = int(cluster['syn_flood'])
cluster_name = cluster['name']
cluster_name = common.checkAjaxInput(cluster['name'])
desc = common.checkAjaxInput(cluster['desc'])
try:
router_id = sql.get_router_id(cluster_id, default_router=1)
@ -77,7 +80,7 @@ def update_cluster(cluster: object, group_id: int) -> str:
raise Exception(f'error: Cannot get router: {e}')
try:
sql.update_cluster(cluster_id, cluster['name'], cluster['desc'], syn_flood)
sql.update_cluster(cluster_id, cluster_name, desc, syn_flood)
except Exception as e:
raise Exception(f'error: Cannot update HA cluster: {e}')
@ -193,7 +196,7 @@ def update_slaves(json_data: object, router_id: int) -> None:
for slave_id, value in cluster['servers'].items():
if value['master']:
master_ip = value['ip']
master_ip = common.is_ip_or_dns(value['ip'])
for server in server_ids_from_db:
server_ids.append(server[0])
@ -227,7 +230,7 @@ def update_slaves(json_data: object, router_id: int) -> None:
if value['master']:
continue
try:
sql.update_server_master(master_ip, value['ip'])
sql.update_server_master(master_ip, common.is_ip_or_dns((value['ip'])))
except Exception as e:
raise Exception(f'error: Cannot update master on slave {value["ip"]}: {e}')

View File

@ -189,8 +189,7 @@ def generate_kp_inv(json_data: json, install_service) -> object:
cluster_id = int(json_data['cluster_id'])
haproxy = json_data['services']['haproxy']['enabled']
nginx = json_data['services']['nginx']['enabled']
# apache = json_data['apache']
apache = 0
apache = json_data['services']['apache']['enabled']
keepalived_path_logs = sql.get_setting('keepalived_path_logs')
syn_flood_protect = str(json_data['syn_flood'])
routers = {}

View File

@ -2,7 +2,6 @@ from flask import render_template, abort
import modules.db.sql as sql
import modules.roxywi.common as roxywi_common
import modules.server.server as server_mod
def create_smon(name: str, hostname: str, port: int, enable: int, url: str, body: str, group: int, desc: str, telegram: int,

View File

@ -30,10 +30,13 @@ def before_request():
@get_user_params()
def add(service):
roxywi_auth.page_for_admin(level=3)
user_params = g.user_params
add = request.form.get('add')
conf_add = request.form.get('conf')
kwargs = {
'h2': 1,
'user_params': g.user_params,
'add': request.form.get('add'),
'conf_add': request.form.get('conf'),
'lang': g.user_params['lang']
}
if service == 'haproxy':
user_group = request.cookies.get('group')
@ -51,21 +54,15 @@ def add(service):
if not os.path.exists(black_dir):
os.makedirs(black_dir)
white_lists = roxywi_common.get_files(folder=white_dir, file_format="lst")
black_lists = roxywi_common.get_files(folder=black_dir, file_format="lst")
maps = roxywi_common.get_files(folder=f'{lib_path}/maps/{user_group}', file_format="map")
kwargs.setdefault('options', sql.select_options())
kwargs.setdefault('saved_servers', sql.select_saved_servers())
kwargs.setdefault('white_lists', roxywi_common.get_files(folder=white_dir, file_format="lst"))
kwargs.setdefault('black_lists', roxywi_common.get_files(folder=black_dir, file_format="lst"))
kwargs.setdefault('maps', roxywi_common.get_files(folder=f'{lib_path}/maps/{user_group}', file_format="map"))
return render_template(
'add.html', h2=1, role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=add,
conf_add=conf_add, group=user_group, options=sql.select_options(), saved_servers=sql.select_saved_servers(),
white_lists=white_lists, black_lists=black_lists, user_services=user_params['user_services'],
token=user_params['token'], lang=user_params['lang'], maps=maps
)
return render_template('add.html', **kwargs)
elif service == 'nginx':
return render_template(
'add_nginx.html', h2=1, role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=add,
conf_add=conf_add, user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
)
return render_template('add_nginx.html', **kwargs)
else:
return redirect(url_for('index'))

View File

@ -28,32 +28,34 @@ def before_request():
@get_user_params()
def admin():
roxywi_auth.page_for_admin()
user_params = g.user_params
users = sql.select_users()
settings = sql.get_setting('', all=1)
ldap_enable = sql.get_setting('ldap_enable')
services = sql.select_services()
gits = sql.select_gits()
masters = sql.select_servers(get_master_servers=1)
is_needed_tool = common.is_tool('ansible')
grafana = 0
backups = sql.select_backups()
s3_backups = sql.select_s3_backups()
user_subscription = roxywi_common.return_user_subscription()
if not roxy.is_docker():
grafana, stderr = server_mod.subprocess_execute("systemctl is-active grafana-server")
grafana = grafana[0]
grafana = tools_common.is_tool_active('grafana-server')
return render_template(
'admin.html', role=user_params['role'], user=user_params['user'], users=users, groups=sql.select_groups(),
servers=sql.select_servers(full=1), masters=masters, sshs=sql.select_ssh(), roles=sql.select_roles(),
settings=settings, backups=backups, s3_backups=s3_backups, services=services, timezones=pytz.all_timezones,
page="users.py", user_services=user_params['user_services'], ldap_enable=ldap_enable, gits=gits, guide_me=1,
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
token=user_params['token'], is_needed_tool=is_needed_tool, lang=user_params['lang'], grafana=grafana
)
kwargs = {
'user_params': g.user_params,
'lang': g.user_params['lang'],
'users': sql.select_users(),
'groups': sql.select_groups(),
'sshs': sql.select_ssh(),
'servers': sql.select_servers(full=1),
'roles': sql.select_roles(),
'timezones': pytz.all_timezones,
'settings': sql.get_setting('', all=1),
'ldap_enable': sql.get_setting('ldap_enable'),
'services': sql.select_services(),
'gits': sql.select_gits(),
'masters': sql.select_servers(get_master_servers=1),
'is_needed_tool': common.is_tool('ansible'),
'grafana': grafana,
'backups': sql.select_backups(),
's3_backups': sql.select_s3_backups(),
'guide_me': 1,
'user_subscription': roxywi_common.return_user_subscription()
}
return render_template('admin.html', **kwargs)
@bp.route('/tools')

View File

@ -21,12 +21,9 @@ def before_request():
@get_user_params()
def checker_settings():
roxywi_common.check_user_group_for_flask()
user_params = g.user_params
kwargs = {'user_params': g.user_params}
return render_template(
'checker.html', role=user_params['role'], user=user_params['user'], lang=user_params['lang'],
token=user_params['token'], user_services=user_params['user_services']
)
return render_template('checker.html', **kwargs)
@bp.post('/settings/update')
@ -62,16 +59,11 @@ def load_checker():
def checker_history():
roxywi_common.check_user_group_for_flask()
alerts_history = sql.alerts_history('Checker', g.user_params['group_id'])
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'role': g.user_params['role'],
'user': g.user_params['user'],
'user_services': g.user_params['user_services'],
'token': g.user_params['token'],
'user_params': g.user_params,
'lang': g.user_params['lang'],
'smon': alerts_history,
'user_subscription': user_subscription,
'smon': sql.alerts_history('Checker', g.user_params['group_id']),
'user_subscription': roxywi_common.return_user_subscription(),
}
return render_template('smon/checker_history.html', **kwargs)

View File

@ -78,14 +78,10 @@ def find_in_config(service):
def config(service, serv, edit, config_file_name, new):
config_read = ""
cfg = ""
stderr = ""
error = ""
aftersave = ""
is_restart = ''
is_serv_protected = ''
new_config = new
user_params = g.user_params
service_desc = sql.select_service(service)
if serv and config_file_name:
cfg = config_mod.return_cfg(service, serv, config_file_name)
@ -118,12 +114,23 @@ def config(service, serv, edit, config_file_name, new):
if new_config is not None:
config_read = ' '
return render_template(
'config.html', role=user_params['role'], user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave,
config=config_read, cfg=cfg, selects=user_params['servers'], stderr=stderr, error=error, service=service,
is_restart=is_restart, user_services=user_params['user_services'], config_file_name=config_file_name,
is_serv_protected=is_serv_protected, token=user_params['token'], lang=user_params['lang'], service_desc=service_desc
)
kwargs = {
'user_params': g.user_params,
'serv': serv,
'aftersave': '',
'config': config_read,
'cfg': cfg,
'stderr': '',
'error': error,
'service': service,
'is_restart': is_restart,
'config_file_name': config_file_name,
'is_serv_protected': is_serv_protected,
'service_desc': sql.select_service(service),
'lang': g.user_params['lang']
}
return render_template('config.html', **kwargs)
@bp.route('/<service>/<server_ip>/save', methods=['POST'])
@ -173,7 +180,6 @@ def versions(service, server_ip):
aftersave = ''
file = set()
stderr = ''
user_params = g.user_params
if service in ('haproxy', 'keepalived'):
conf_format = 'cfg'
@ -205,11 +211,16 @@ def versions(service, server_ip):
except OSError as e:
stderr = "Error: %s - %s." % (e.filename, e.strerror)
return render_template(
'delver.html', role=user_params['role'], user=user_params['user'], select_id="serv", serv=server_ip, aftersave=aftersave,
selects=user_params['servers'], file=file, service=service, user_services=user_params['user_services'],
token=user_params['token'], lang=user_params['lang'], stderr=stderr
)
kwargs = {
'user_params': g.user_params,
'serv': server_ip,
'aftersave': aftersave,
'file': file,
'service': service,
'stderr': stderr,
'lang': g.user_params['lang']
}
return render_template('delver.html', **kwargs)
@bp.route('/version/<service>/list', methods=['POST'])
@ -228,11 +239,9 @@ def list_of_version(service):
@get_user_params(disable=1)
def show_version(service, server_ip, configver, save):
roxywi_auth.page_for_admin(level=3)
user_params = g.user_params
service_desc = sql.select_service(service)
configs_dir = get_config.get_config_var('configs', f'{service_desc.service}_save_configs_dir')
configver = configs_dir + configver
servers = roxywi_common.get_dick_permit(service=service_desc.slug)
aftersave = 0
stderr = ''
@ -256,41 +265,47 @@ def show_version(service, server_ip, configver, save):
else:
stderr = config_mod.master_slave_upload_and_restart(server_ip, configver, save_action, service)
return render_template(
'configver.html', role=user_params['role'], user=user_params['user'], select_id="serv", serv=server_ip, aftersave=aftersave,
selects=servers, stderr=stderr, save=save, configver=configver, service=service,
user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
)
kwargs = {
'user_params': g.user_params,
'serv': server_ip,
'aftersave': aftersave,
'configver': configver,
'service': service,
'stderr': stderr,
'lang': g.user_params['lang']
}
return render_template('configver.html', **kwargs)
@bp.route('/section/haproxy/<server_ip>')
@get_user_params()
def haproxy_section(server_ip):
user_params = g.user_params
is_restart = 0
hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
error = config_mod.get_config(server_ip, cfg)
sections = section_mod.get_sections(cfg)
kwargs = {
'user_params': g.user_params,
'is_restart': 0,
'config': '',
'serv': server_ip,
'sections': section_mod.get_sections(cfg),
'error': error,
'lang': g.user_params['lang']
}
return render_template(
'sections.html', role=user_params['role'], user=user_params['user'], serv=server_ip, selects=user_params['servers'],
sections=sections, error=error, token=user_params['token'], lang=user_params['lang'], is_restart=is_restart, config='',
user_services=user_params['user_services']
)
return render_template('sections.html', **kwargs)
@bp.route('/section/haproxy/<server_ip>/<section>')
@get_user_params()
def haproxy_section_show(server_ip, section):
user_params = g.user_params
hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir')
cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg"
error = config_mod.get_config(server_ip, cfg)
sections = section_mod.get_sections(cfg)
start_line, end_line, config_read = section_mod.get_section_from_config(cfg, section)
server_id = sql.select_server_id_by_ip(server_ip)
is_restart = sql.select_service_setting(server_id, 'haproxy', 'restart')
sections = section_mod.get_sections(cfg)
os.system(f"/bin/mv {cfg} {cfg}.old")
@ -299,12 +314,21 @@ def haproxy_section_show(server_ip, section):
except Exception:
pass
return render_template(
'sections.html', role=user_params['role'], user=user_params['user'], serv=server_ip, selects=user_params['servers'],
error=error, sections=sections, cfg=cfg, token=user_params['token'], lang=user_params['lang'],
is_restart=is_restart, config=config_read, start_line=start_line, end_line=end_line, section=section,
user_services=user_params['user_services']
)
kwargs = {
'user_params': g.user_params,
'is_restart': sql.select_service_setting(server_id, 'haproxy', 'restart'),
'serv': server_ip,
'sections': sections,
'cfg': cfg,
'config': config_read,
'start_line': start_line,
'end_line': end_line,
'section': section,
'error': error,
'lang': g.user_params['lang']
}
return render_template('sections.html', **kwargs)
@bp.route('/section/haproxy/<server_ip>/save', methods=['POST'])
@ -342,24 +366,23 @@ def haproxy_section_save(server_ip):
@bp.route('/map/<service>/<serv>')
@get_user_params()
def show_compare_config(service, serv):
config_read = ""
cfg = ""
stderr = ""
error = ""
aftersave = ""
is_restart = ''
is_serv_protected = ''
config_file_name = ''
user_params = g.user_params
service_desc = sql.select_service(service)
kwargs = {
'user_params': g.user_params,
'aftersave': '',
'serv': serv,
'cfg': '',
'config': '',
'config_file_name': '',
'is_serv_protected': '',
'is_restart': '',
'service': service,
'stderr': '',
'error': '',
'service_desc': sql.select_service(service),
'lang': g.user_params['lang']
}
return render_template(
'config.html', role=user_params['role'], user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave,
config=config_read, cfg=cfg, selects=user_params['servers'], stderr=stderr, error=error, service=service,
is_restart=is_restart, user_services=user_params['user_services'], config_file_name=config_file_name,
is_serv_protected=is_serv_protected, token=user_params['token'], lang=user_params['lang'],
service_desc=service_desc
)
return render_template('config.html', **kwargs)
@bp.route('/compare/<service>/<server_ip>/files')

View File

@ -6,7 +6,7 @@ from flask_login import login_required
from app.routes.ha import bp
from middleware import get_user_params, check_services
import modules.db.sql as sql
import app.modules.common.common as common
import modules.common.common as common
import modules.server.server as server_mod
import modules.roxywi.common as roxywi_common
import modules.service.keepalived as keepalived
@ -24,17 +24,16 @@ def before_request():
@check_services
@get_user_params()
def cluster_function(service):
user_params = g.user_params
group_id = user_params['group_id']
group_id = g.user_params['group_id']
if request.method == 'GET':
clusters = sql.select_clusters(group_id)
is_needed_tool = common.is_tool('ansible')
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'user_params': g.user_params,
'clusters': sql.select_clusters(group_id),
'is_needed_tool': common.is_tool('ansible'),
'user_subscription': roxywi_common.return_user_subscription()
}
return render_template(
'ha_cluster.html', role=user_params['role'], user=user_params['user'], clusters=clusters, is_needed_tool=is_needed_tool,
user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'], user_subscription=user_subscription
)
return render_template('ha_cluster.html', **kwargs)
elif request.method == 'PUT':
cluster = json.loads(request.form.get('jsonData'))
@ -61,23 +60,22 @@ def cluster_function(service):
@check_services
@get_user_params()
def get_ha_cluster(service, cluster_id):
user_params = g.user_params
group_id = user_params['group_id']
clusters = sql.select_cluster(cluster_id)
router_id = sql.get_router_id(cluster_id, default_router=1)
slaves = sql.select_cluster_slaves(cluster_id, router_id)
virts = sql.select_clusters_virts()
vips = sql.select_cluster_vips(cluster_id)
servers = roxywi_common.get_dick_permit(virt=1)
cluster_services = sql.select_cluster_services(cluster_id)
services = sql.select_services()
kwargs = {
'user_params': g.user_params,
'servers': roxywi_common.get_dick_permit(virt=1),
'clusters': sql.select_cluster(cluster_id),
'slaves': sql.select_cluster_slaves(cluster_id, router_id),
'virts': sql.select_clusters_virts(),
'vips': sql.select_cluster_vips(cluster_id),
'cluster_services': sql.select_cluster_services(cluster_id),
'services': sql.select_services(),
'group_id': g.user_params['group_id'],
'router_id': router_id,
'lang': g.user_params['lang']
}
return render_template(
'ajax/ha/clusters.html', role=user_params['role'], user=user_params['user'], servers=servers,
user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'],
clusters=clusters, slaves=slaves, virts=virts, vips=vips, cluster_services=cluster_services, services=services,
group_id=group_id, router_id=router_id
)
return render_template('ajax/ha/clusters.html', **kwargs)
@bp.route('/<service>/settings/<int:cluster_id>')
@ -120,12 +118,11 @@ def get_cluster_settings(service, cluster_id):
@check_services
@get_user_params()
def show_ha_cluster(service, cluster_id):
user_params = g.user_params
services = []
service = 'keepalived'
service_desc = sql.select_service(service)
router_id = sql.get_router_id(cluster_id, default_router=1)
servers = sql.select_cluster_master_slaves(cluster_id, user_params['group_id'], router_id)
servers = sql.select_cluster_master_slaves(cluster_id, g.user_params['group_id'], router_id)
waf_server = ''
cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l"
keep_alive, stderr = server_mod.subprocess_execute(cmd)
@ -161,14 +158,20 @@ def show_ha_cluster(service, cluster_id):
servers_with_status1.append(servers_with_status)
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'user_params': g.user_params,
'servers': servers_with_status1,
'waf_server': waf_server,
'service': service,
'services': services,
'service_desc': service_desc,
'keep_alive': ''.join(keep_alive),
'restart_settings': restart_settings,
'user_subscription': user_subscription,
'lang': g.user_params['lang']
}
return render_template(
'service.html', role=user_params['role'], user=user_params['user'],
servers=servers_with_status1, keep_alive=''.join(keep_alive), service=service, services=services,
user_services=user_params['user_services'], user_status=user_subscription['user_status'],
user_plan=user_subscription['user_plan'], waf_server=waf_server, restart_settings=restart_settings,
service_desc=service_desc, token=user_params['token'], lang=user_params['lang']
)
return render_template('service.html', **kwargs)
@bp.route('/<service>/slaves/<int:cluster_id>', methods=['GET', 'POST'])

View File

@ -23,16 +23,13 @@ def before_request():
@get_user_params()
def install_monitoring():
roxywi_auth.page_for_admin(level=2)
user_params = g.user_params
is_needed_tool = common.is_tool('ansible')
geoip_country_codes = sql.select_geoip_country_codes()
return render_template(
'install.html', role=user_params['role'], user=user_params['user'], servers=user_params['servers'],
user_services=user_params['user_services'], lang=user_params['lang'], geoip_country_codes=geoip_country_codes,
is_needed_tool=is_needed_tool, token=user_params['token']
)
kwargs = {
'user_params': g.user_params,
'is_needed_tool': common.is_tool('ansible'),
'geoip_country_codes': sql.select_geoip_country_codes(),
'lang': g.user_params['lang']
}
return render_template('install.html', **kwargs)
@bp.post('/<service>')

View File

@ -25,26 +25,27 @@ def before_request():
@get_user_params()
def logs_internal():
log_type = request.args.get('type')
log_path = get_config.get_config_var('main', 'log_path')
selects = roxywi_common.get_files(log_path, file_format="log")
if log_type == '2':
roxywi_auth.page_for_admin(level=2)
else:
roxywi_auth.page_for_admin()
user_params = g.user_params
log_path = get_config.get_config_var('main', 'log_path')
selects = roxywi_common.get_files(log_path, file_format="log")
if log_type is None:
selects.append(['fail2ban.log', 'fail2ban.log'])
selects.append(['roxy-wi.error.log', 'error.log'])
selects.append(['roxy-wi.access.log', 'access.log'])
return render_template(
'logs_internal.html', autorefresh=1, role=user_params['role'], user=user_params['user'],
user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'],
selects=selects, serv='viewlogs'
)
kwargs = {
'user_params': g.user_params,
'autorefresh': 1,
'selects': selects,
'serv': 'viewlogs',
'lang': g.user_params['lang']
}
return render_template('logs_internal.html', **kwargs)
@bp.route('/<service>', defaults={'waf': None})
@ -52,15 +53,14 @@ def logs_internal():
@check_services
@get_user_params()
def logs(service, waf):
user_params = g.user_params
serv = request.args.get('serv')
rows = request.args.get('rows')
grep = request.args.get('grep')
exgrep = request.args.get('exgrep')
hour = request.args.get('hour')
minute = request.args.get('minute')
hour1 = request.args.get('hour1')
minute1 = request.args.get('minute1')
# exgrep = request.args.get('exgrep')
# hour = request.args.get('hour')
# minute = request.args.get('minute')
# hour1 = request.args.get('hour1')
# minute1 = request.args.get('minute1')
log_file = request.args.get('file')
if rows is None:
@ -78,11 +78,21 @@ def logs(service, waf):
else:
return redirect(url_for('index'))
return render_template(
'logs.html', autorefresh=1, role=user_params['role'], user=user_params['user'], select_id='serv', rows=rows,
remote_file=log_file, selects=servers, waf=waf, service=service, user_services=user_params['user_services'],
token=user_params['token'], lang=user_params['lang'], service_name=service_name, grep=grep, serv=serv
)
kwargs = {
'user_params': g.user_params,
'autorefresh': 1,
'servers': servers,
'serv': serv,
'service': service,
'service_name': service_name,
'grep': grep,
'rows': rows,
'remote_file': log_file,
'waf': waf,
'lang': g.user_params['lang']
}
return render_template('logs.html', **kwargs)
@bp.route('/<service>/<serv>', methods=['GET', 'POST'])
@ -92,12 +102,11 @@ def show_remote_log_files(service, serv):
serv = common.checkAjaxInput(serv)
log_path = sql.get_setting(f'{service}_path_logs')
return_files = server_mod.get_remote_files(serv, log_path, 'log')
lang = roxywi_common.get_user_lang_for_flask()
if 'error: ' in return_files:
return return_files
lang = roxywi_common.get_user_lang_for_flask()
return render_template(
'ajax/show_log_files.html', serv=serv, return_files=return_files, path_dir=log_path, lang=lang
)
@ -106,22 +115,13 @@ def show_remote_log_files(service, serv):
@bp.route('/<service>/<serv>/<rows>', defaults={'waf': '0'}, methods=['GET', 'POST'])
@bp.route('/<service>/waf/<serv>/<rows>', defaults={'waf': '1'}, methods=['GET', 'POST'])
def show_logs(service, serv, rows, waf):
if request.method == 'GET':
grep = request.args.get('grep')
exgrep = request.args.get('exgrep')
hour = request.args.get('hour')
minute = request.args.get('minute')
hour1 = request.args.get('hour1')
minute1 = request.args.get('minute1')
log_file = request.args.get('file')
else:
grep = request.form.get('grep')
exgrep = request.form.get('exgrep')
hour = request.form.get('hour')
minute = request.form.get('minute')
hour1 = request.form.get('hour1')
minute1 = request.form.get('minute1')
log_file = request.form.get('file')
grep = request.form.get('grep') or request.args.get('grep')
exgrep = request.form.get('exgrep') or request.args.get('exgrep')
hour = request.form.get('hour') or request.args.get('hour')
minute = request.form.get('minute') or request.args.get('minute')
hour1 = request.form.get('hour1') or request.args.get('hour1')
minute1 = request.form.get('minute1') or request.args.get('minute1')
log_file = request.form.get('file') or request.args.get('file')
if roxywi_common.check_user_group_for_flask():
try:

View File

@ -24,41 +24,45 @@ import modules.service.haproxy as service_haproxy
@app.errorhandler(403)
@get_user_params()
def page_is_forbidden(e):
user_params = g.user_params
return render_template(
'error.html', user=user_params['user'], role=user_params['role'], user_services=user_params['user_services'],
title=e, e=e
), 403
kwargs = {
'user_params': g.user_params,
'title': e,
'e': e
}
return render_template('error.html', **kwargs), 403
@app.errorhandler(404)
@get_user_params()
def page_not_found(e):
user_params = g.user_params
return render_template(
'error.html', user=user_params['user'], role=user_params['role'], user_services=user_params['user_services'],
title=e, e=e
), 404
kwargs = {
'user_params': g.user_params,
'title': e,
'e': e
}
return render_template('error.html', **kwargs), 404
@app.errorhandler(405)
@get_user_params()
def method_not_allowed(e):
user_params = g.user_params
return render_template(
'error.html', user=user_params['user'], role=user_params['role'], user_services=user_params['user_services'],
title=e, e=e
), 405
kwargs = {
'user_params': g.user_params,
'title': e,
'e': e
}
return render_template('error.html', **kwargs), 405
@app.errorhandler(500)
@get_user_params()
def internal_error(e):
user_params = g.user_params
return render_template(
'error.html', user=user_params['user'], role=user_params['role'], user_services=user_params['user_services'],
title=e, e=e
), 500
kwargs = {
'user_params': g.user_params,
'title': e,
'e': e
}
return render_template('error.html', **kwargs), 500
@app.before_request
@ -78,24 +82,15 @@ def _db_close(exc):
@check_services
@get_user_params()
def stats(service, serv):
user_params = g.user_params
service_desc = sql.select_service(service)
try:
if serv is None:
first_serv = user_params['servers']
for i in first_serv:
serv = i[2]
break
except Exception:
pass
servers = roxywi_common.get_dick_permit(service=service_desc.slug)
return render_template(
'statsview.html', autorefresh=1, role=user_params['role'], user=user_params['user'], selects=servers, serv=serv,
service=service, user_services=user_params['user_services'], token=user_params['token'],
select_id="serv", lang=user_params['lang'], service_desc=service_desc
)
kwargs = {
'user_params': g.user_params,
'autorefresh': 1,
'serv': serv,
'service': service,
'service_desc': sql.select_service(service),
'lang': g.user_params['lang']
}
return render_template('statsview.html', **kwargs)
@bp.route('/stats/view/<service>/<server_ip>')
@ -114,11 +109,7 @@ def show_stats(service, server_ip):
@login_required
@get_user_params(1)
def nettools():
user_params = g.user_params
return render_template(
'nettools.html', autorefresh=0, role=user_params['role'], user=user_params['user'], servers=user_params['servers'],
user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang']
)
return render_template('nettools.html', user_params=g.user_params, lang=g.user_params['lang'])
@bp.post('/nettols/<check>')
@ -146,10 +137,7 @@ def nettols_check(check):
@login_required
@get_user_params()
def service_history(service, server_ip):
users = sql.select_users()
server_ip = common.checkAjaxInput(server_ip)
user_subscription = roxywi_common.return_user_subscription()
user_params = g.user_params
if service in ('haproxy', 'nginx', 'keepalived', 'apache', 'cluster'):
service_desc = sql.select_service(service)
@ -167,11 +155,16 @@ def service_history(service, server_ip):
elif service == 'user':
history = sql.select_action_history_by_user_id(server_ip)
return render_template(
'history.html', role=user_params['role'], user=user_params['user'], users=users, serv=server_ip, service=service,
history=history, user_services=user_params['user_services'], token=user_params['token'],
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], lang=user_params['lang']
)
kwargs = {
'user_params': g.user_params,
'user_subscription': roxywi_common.return_user_subscription(),
'users': sql.select_users(),
'serv': server_ip,
'service': service,
'history': history
}
return render_template('history.html', **kwargs)
@bp.route('/servers')
@ -180,35 +173,33 @@ def service_history(service, server_ip):
def servers():
roxywi_auth.page_for_admin(level=2)
user_params = g.user_params
ldap_enable = sql.get_setting('ldap_enable')
user_group = roxywi_common.get_user_group(id=1)
settings = sql.get_setting('', all=1)
services = sql.select_services()
gits = sql.select_gits()
servers = roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1)
masters = sql.select_servers(get_master_servers=1, uuid=user_params['user_uuid'])
is_needed_tool = common.is_tool('ansible')
user_roles = sql.select_user_roles_by_group(user_group)
backups = sql.select_backups()
s3_backups = sql.select_s3_backups()
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'user_params': g.user_params,
'h2': 1,
'users': sql.select_users(group=user_group),
'groups': sql.select_groups(),
'servers': roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1),
'roles': sql.select_roles(),
'sshs': sql.select_ssh(group=user_group),
'masters': sql.select_servers(get_master_servers=1, uuid=g.user_params['user_uuid']),
'group': roxywi_common.get_user_group(id=1),
'services': sql.select_services(),
'timezones': pytz.all_timezones,
'guide_me': 1,
'settings': sql.get_setting('', all=1),
'backups': sql.select_backups(),
's3_backups': sql.select_s3_backups(),
'page': 'servers.py',
'ldap_enable': sql.get_setting('ldap_enable'),
'gits': sql.select_gits(),
'is_needed_tool': common.is_tool('ansible'),
'user_roles': sql.select_user_roles_by_group(user_group),
'user_subscription': roxywi_common.return_user_subscription(),
'lang': g.user_params['lang']
}
if user_params['lang'] == 'ru':
title = 'Сервера: '
else:
title = "Servers: "
return render_template(
'servers.html',
h2=1, title=title, role=user_params['role'], user=user_params['user'], users=sql.select_users(group=user_group),
groups=sql.select_groups(), servers=servers, roles=sql.select_roles(), sshs=sql.select_ssh(group=user_group),
masters=masters, group=user_group, services=services, timezones=pytz.all_timezones, guide_me=1,
token=user_params['token'], settings=settings, backups=backups, s3_backups=s3_backups, page="servers.py",
user_services=user_params['user_services'], ldap_enable=ldap_enable,
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], gits=gits,
is_needed_tool=is_needed_tool, lang=user_params['lang'], user_roles=user_roles
)
return render_template('servers.html', **kwargs)
@bp.route('/internal/show_version')

View File

@ -22,8 +22,6 @@ def before_request():
@check_services
@get_user_params()
def metrics(service):
user_params = g.user_params
service_desc = sql.select_service(service)
roxywi_common.check_user_group_for_flask()
servers = ''
services = '0'
@ -53,14 +51,18 @@ def metrics(service):
except Exception as e:
return f'error: on Metrics page: {e}', 500
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'user_params': g.user_params,
'autorefresh': 1,
'servers': servers,
'service': service,
'services': services,
'service_desc': sql.select_service(service),
'user_subscription': roxywi_common.return_user_subscription(),
'lang': g.user_params['lang']
}
return render_template(
'metrics.html', autorefresh=1, role=user_params['role'], user=user_params['user'], servers=servers,
services=services, user_services=user_params['user_services'], service=service,
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
token=user_params['token'], lang=user_params['lang'], service_desc=service_desc
)
return render_template('metrics.html', **kwargs)
@bp.route('/cpu', methods=['POST'])

View File

@ -19,13 +19,15 @@ def before_request():
@bp.route('/overview')
@get_user_params()
def index():
user_params = g.user_params
groups = sql.select_groups()
return render_template(
'ovw.html', autorefresh=1, role=user_params['role'], user=user_params['user'], roles=sql.select_roles(),
servers=user_params['servers'], user_services=user_params['user_services'], groups=groups,
token=user_params['token'], guide_me=1, lang=user_params['lang']
)
kwargs = {
'user_params': g.user_params,
'autorefresh': 1,
'roles': sql.select_roles(),
'groups': sql.select_groups(),
'guide_me': 1,
'lang': g.user_params['lang']
}
return render_template('ovw.html', **kwargs)
@bp.route('/overview/services')
@ -51,5 +53,4 @@ def overview_sub():
@bp.route('/overview/logs')
@get_user_params()
def overview_logs():
user_params = g.user_params
return render_template('ajax/ovw_log.html', role=user_params['role'], lang=user_params['lang'], roxy_wi_log=roxy_logs.roxy_wi_log())
return render_template('ajax/ovw_log.html', role=g.user_params['role'], lang=g.user_params['lang'], roxy_wi_log=roxy_logs.roxy_wi_log())

View File

@ -20,31 +20,26 @@ def before_request():
@bp.route('')
@get_user_params(virt=1)
def portscanner():
user_params = g.user_params
port_scanner_settings = sql.select_port_scanner_settings(user_params['group_id'])
port_scanner = tools_common.is_tool_active('roxy-wi-portscanner')
user_subscription = roxywi_common.return_user_subscription()
port_scanner_settings = sql.select_port_scanner_settings(g.user_params['group_id'])
if not port_scanner_settings:
port_scanner_settings = ''
count_ports = ''
else:
count_ports = list()
for s in user_params['servers']:
for s in g.user_params['servers']:
count_ports_from_sql = sql.select_count_opened_ports(s[2])
i = (s[2], count_ports_from_sql)
count_ports.append(i)
kwargs = {
'role': user_params['role'],
'user': user_params['user'],
'servers': user_params['servers'],
'user_params': g.user_params,
'servers': g.user_params['servers'],
'port_scanner_settings': port_scanner_settings,
'count_ports': count_ports,
'port_scanner': port_scanner,
'token': user_params['token'],
'lang': user_params['lang'],
'user_subscription': user_subscription
'port_scanner': tools_common.is_tool_active('roxy-wi-portscanner'),
'lang': g.user_params['lang'],
'user_subscription': roxywi_common.return_user_subscription()
}
return render_template('portscanner.html', **kwargs)
@ -53,18 +48,12 @@ def portscanner():
@bp.route('/history/<server_ip>')
@get_user_params()
def portscanner_history(server_ip):
history = sql.select_port_scanner_history(server_ip)
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'h2': 1,
'role': g.user_params['role'],
'user': g.user_params['user'],
'servers': g.user_params['servers'],
'user_services': g.user_params['user_services'],
'token': g.user_params['token'],
'user_params': g.user_params,
'lang': g.user_params['lang'],
'history': history,
'user_subscription': user_subscription
'history': sql.select_port_scanner_history(server_ip),
'user_subscription': roxywi_common.return_user_subscription()
}
return render_template('include/port_scan_history.html', **kwargs)

View File

@ -18,14 +18,7 @@ def before_request():
@bp.route('')
@get_user_params()
def runtimeapi():
user_params = g.user_params
servbackend = ""
return render_template(
'runtimeapi.html', title="RunTime API", role=user_params['role'], user=user_params['user'], select_id="serv",
selects=user_params['servers'], token=user_params['token'], user_services=user_params['user_services'],
servbackend=servbackend, lang=user_params['lang']
)
return render_template('runtimeapi.html', user_params=g.user_params, lang=g.user_params['lang'])
@bp.route('/backends/<server_ip>')

View File

@ -95,7 +95,7 @@ def create_server():
return render_template(
'ajax/new_server.html', groups=sql.select_groups(), servers=sql.select_servers(server=ip), lang=lang,
masters=sql.select_servers(get_master_servers=1), sshs=sql.select_ssh(group=group), page=page,
user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], adding=1
user_subscription=user_subscription, adding=1
)
except Exception as e:
return f'{e}'

View File

@ -10,6 +10,7 @@ import app.modules.common.common as common
import app.modules.server.server as server_mod
import app.modules.service.action as service_action
import app.modules.service.common as service_common
import app.modules.service.keepalived as keepalived
import app.modules.roxywi.common as roxywi_common
import app.modules.roxywi.overview as roxy_overview
@ -26,16 +27,20 @@ def before_request():
@check_services
@get_user_params()
def services(service, serv):
user_params = g.user_params
services = []
tools = []
service_desc = sql.select_service(service)
servers = roxywi_common.get_dick_permit(virt=1, service=service_desc.slug)
if len(servers) == 1:
serv = servers[0][2]
servers_with_status1 = []
autorefresh = 0
waf_server = ''
cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l"
keep_alive, stderr = server_mod.subprocess_execute(cmd)
services_name = {'roxy-wi-checker': 'Master backends checker service',
'roxy-wi-keep_alive': 'Auto start service',
'roxy-wi-metrics': 'Master metrics service'}
if len(servers) == 1:
serv = servers[0][2]
if serv:
if roxywi_common.check_is_server_in_group(serv):
@ -48,13 +53,9 @@ def services(service, serv):
else:
raise Exception('error: wrong group')
else:
docker_settings = sql.select_docker_services_settings(service_desc.slug)
restart_settings = sql.select_restart_services_settings(service_desc.slug)
services_name = {'roxy-wi-checker': 'Master backends checker service',
'roxy-wi-keep_alive': 'Auto start service',
'roxy-wi-metrics': 'Master metrics service'}
for s, v in services_name.items():
if distro.id() == 'ubuntu':
if s == 'roxy-wi-keep_alive':
@ -64,12 +65,10 @@ def services(service, serv):
cmd = "rpm --query " + s + "-* |awk -F\"" + s + "\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'"
service_ver, stderr = server_mod.subprocess_execute(cmd)
try:
services.append([s, service_ver[0]])
tools.append([s, service_ver[0]])
except Exception:
services.append([s, ''])
tools.append([s, ''])
haproxy_sock_port = sql.get_setting('haproxy_sock_port')
servers_with_status1 = []
for s in servers:
servers_with_status = list()
servers_with_status.append(s[0])
@ -104,24 +103,10 @@ def services(service, serv):
servers_with_status.append(h)
servers_with_status.append(s[17])
elif service == 'keepalived':
h = (['', ''],)
cmd = [
"/usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}' && systemctl status keepalived |"
"grep -e 'Active' |awk '{print $2, $9$10$11$12$13}' && ps ax |grep keepalived|grep -v grep |wc -l"
]
try:
out = server_mod.ssh_command(s[2], cmd)
out1 = []
for k in out.split():
out1.append(k)
h = (out1,)
servers_with_status.append(h)
servers_with_status.append(h)
servers_with_status.append(s[22])
except Exception:
servers_with_status.append(h)
servers_with_status.append(h)
servers_with_status.append(s[22])
status1, status2 = keepalived.get_status(s[2])
servers_with_status.append(status1)
servers_with_status.append(status2)
servers_with_status.append(s[22])
elif service == 'apache':
h = (['', ''],)
apache_stats_user = sql.get_setting('apache_stats_user')
@ -142,6 +127,7 @@ def services(service, serv):
servers_with_status.append(h)
servers_with_status.append(s[22])
else:
haproxy_sock_port = sql.get_setting('haproxy_sock_port')
cmd = f'echo "show info" |nc {s[2]} {haproxy_sock_port} -w 1 -v|grep -e "Ver\|Uptime:\|Process_num"'
out = server_mod.subprocess_execute(cmd)
@ -154,9 +140,7 @@ def services(service, serv):
servers_with_status.append(s[12])
servers_with_status.append(sql.is_master(s[2]))
servers_with_status.append(sql.select_servers(server=s[2]))
is_keepalived = sql.select_keepalived(s[2])
if is_keepalived:
@ -173,15 +157,25 @@ def services(service, serv):
servers_with_status1.append(servers_with_status)
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'user_params': g.user_params,
'clusters': sql.select_ha_cluster_name_and_slaves(),
'master_slave': sql.is_master(0, master_slave=1),
'user_subscription': roxywi_common.return_user_subscription(),
'autorefresh': autorefresh,
'servers': servers_with_status1,
'lang': g.user_params['lang'],
'serv': serv,
'service': service,
'services': tools,
'service_desc': service_desc,
'restart_settings': restart_settings,
'docker_settings': docker_settings,
'waf_server': waf_server,
'keep_alive': ''.join(keep_alive)
}
return render_template(
'service.html', autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], servers=servers_with_status1,
keep_alive=''.join(keep_alive), serv=serv, service=service, services=services, user_services=user_params['user_services'],
docker_settings=docker_settings, user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'],
waf_server=waf_server, restart_settings=restart_settings, service_desc=service_desc, token=user_params['token'],
lang=user_params['lang']
)
return render_template('service.html', **kwargs)
@bp.post('/action/<service>/check-service')
@ -210,8 +204,6 @@ def last_edit(service, server_ip):
@bp.route('/cpu-ram-metrics/<server_ip>/<server_id>/<name>/<service>')
@get_user_params()
def cpu_ram_metrics(server_ip, server_id, name, service):
user_params = g.user_params
if service == 'haproxy':
sock_port = sql.get_setting('haproxy_sock_port')
cmd = f'echo "show info" |nc {server_ip} {sock_port} -w 1|grep -e "node\|Nbproc\|Maxco\|MB\|Nbthread"'
@ -228,19 +220,18 @@ def cpu_ram_metrics(server_ip, server_id, name, service):
else:
return_out = ''
server_status = (name, server_ip, return_out)
servers = []
servers = [[name, server_ip, return_out]]
user_id = request.cookies.get('uuid')
group_id = int(request.cookies.get('group'))
role = sql.get_user_role_by_uuid(user_id, group_id)
kwargs = {
'service_status': sorted(servers, key=common.get_key),
'role': sql.get_user_role_by_uuid(user_id, group_id),
'id': server_id,
'service_page': service,
'lang': g.user_params['lang']
}
servers.append(server_status)
servers_sorted = sorted(servers, key=common.get_key)
return render_template(
'ajax/overviewServers.html', service_status=servers_sorted, role=role, id=server_id, service_page=service, lang=user_params['lang']
)
return render_template('ajax/overviewServers.html', **kwargs)
@bp.post('/haproxy/bytes')

View File

@ -20,20 +20,14 @@ import app.modules.tools.common as tools_common
def smon():
roxywi_common.check_user_group_for_flask()
smon = sql.smon_list(g.user_params['group_id'])
smon_status = tools_common.is_tool_active('roxy-wi-smon')
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'autorefresh': 1,
'role': g.user_params['role'],
'user': g.user_params['user'],
'user_services': g.user_params['user_services'],
'token': g.user_params['token'],
'user_params': g.user_params,
'lang': g.user_params['lang'],
'smon': smon,
'smon': sql.smon_list(g.user_params['group_id']),
'group': g.user_params['group_id'],
'smon_status': smon_status,
'user_subscription': user_subscription,
'smon_status': tools_common.is_tool_active('roxy-wi-smon'),
'user_subscription': roxywi_common.return_user_subscription(),
}
return render_template('smon/dashboard.html', **kwargs)
@ -43,17 +37,13 @@ def smon():
@login_required
@get_user_params()
def smon_dashboard(dashboard_id, check_id):
check_id = int(check_id)
roxywi_common.check_user_group_for_flask()
user_subscription = roxywi_common.return_user_subscription()
smon_name = sql.get_smon_service_name_by_id(dashboard_id)
check_interval = sql.get_setting('smon_check_interval')
check_id = int(check_id)
smon = sql.select_one_smon(dashboard_id, check_id)
present = datetime.now(timezone('UTC'))
present = present.strftime('%b %d %H:%M:%S %Y %Z')
present = datetime.strptime(present, '%b %d %H:%M:%S %Y %Z')
cert_day_diff = 'N/A'
uptime = smon_mod.check_uptime(dashboard_id)
try:
avg_res_time = round(sql.get_avg_resp_time(dashboard_id, check_id), 2)
@ -71,18 +61,15 @@ def smon_dashboard(dashboard_id, check_id):
kwargs = {
'autorefresh': 1,
'role': g.user_params['role'],
'user': g.user_params['user'],
'user_services': g.user_params['user_services'],
'token': g.user_params['token'],
'user_params': g.user_params,
'lang': g.user_params['lang'],
'smon': smon,
'group': g.user_params['group_id'],
'user_subscription': user_subscription,
'check_interval': check_interval,
'uptime': uptime,
'user_subscription': roxywi_common.return_user_subscription(),
'check_interval': sql.get_setting('smon_check_interval'),
'uptime': smon_mod.check_uptime(dashboard_id),
'avg_res_time': avg_res_time,
'smon_name': smon_name,
'smon_name': sql.get_smon_service_name_by_id(dashboard_id),
'cert_day_diff': cert_day_diff,
'check_id': check_id,
'dashboard_id': dashboard_id,
@ -97,20 +84,13 @@ def smon_dashboard(dashboard_id, check_id):
@get_user_params()
def status_page():
if request.method == 'GET':
smon_list = sql.smon_list(g.user_params['group_id'])
pages = sql.select_status_pages(g.user_params['group_id'])
smon_status = tools_common.is_tool_active('roxy-wi-smon')
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'role': g.user_params['role'],
'user': g.user_params['user'],
'user_services': g.user_params['user_services'],
'token': g.user_params['token'],
'user_params': g.user_params,
'lang': g.user_params['lang'],
'smon': smon_list,
'pages': pages,
'smon_status': smon_status,
'user_subscription': user_subscription
'smon': sql.smon_list(g.user_params['group_id']),
'pages': sql.select_status_pages(g.user_params['group_id']),
'smon_status': tools_common.is_tool_active('roxy-wi-smon'),
'user_subscription': roxywi_common.return_user_subscription()
}
return render_template('smon/manage_status_page.html', **kwargs)
@ -184,18 +164,12 @@ def smon_history_statuses_avg(page_id):
def smon_history():
roxywi_common.check_user_group_for_flask()
smon = sql.alerts_history('SMON', g.user_params['group_id'])
smon_status = tools_common.is_tool_active('roxy-wi-smon')
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'role': g.user_params['role'],
'user': g.user_params['user'],
'user_services': g.user_params['user_services'],
'token': g.user_params['token'],
'user_params': g.user_params,
'lang': g.user_params['lang'],
'smon': smon,
'smon_status': smon_status,
'user_subscription': user_subscription
'smon': sql.alerts_history('SMON', g.user_params['group_id']),
'smon_status': tools_common.is_tool_active('roxy-wi-smon'),
'user_subscription': roxywi_common.return_user_subscription()
}
return render_template('smon/history.html', **kwargs)
@ -212,10 +186,7 @@ def smon_host_history(server_ip):
smon = sql.alerts_history('SMON', g.user_params['group_id'], host=needed_host)
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'role': g.user_params['role'],
'user': g.user_params['user'],
'user_services': g.user_params['user_services'],
'token': g.user_params['token'],
'user_params': g.user_params,
'lang': g.user_params['lang'],
'smon': smon,
'smon_status': smon_status,
@ -248,32 +219,19 @@ def smon_history_cur_status(dashboard_id, check_id):
def smon_admin():
roxywi_auth.page_for_admin(level=3)
user_group = g.user_params['group_id']
smon_status = tools_common.is_tool_active('roxy-wi-smon')
telegrams = sql.get_user_telegram_by_group(user_group)
slacks = sql.get_user_slack_by_group(user_group)
pds = sql.get_user_pd_by_group(user_group)
smon_checks = sql.select_smon(user_group)
smon_ping = sql.select_smon_ping()
smon_tcp = sql.select_smon_tcp()
smon_http = sql.select_smon_http()
smon_dns = sql.select_smon_dns()
user_subscription = roxywi_common.return_user_subscription()
kwargs = {
'role': g.user_params['role'],
'user': g.user_params['user'],
'user_services': g.user_params['user_services'],
'token': g.user_params['token'],
'user_params': g.user_params,
'lang': g.user_params['lang'],
'smon': smon_checks,
'smon_status': smon_status,
'user_subscription': user_subscription,
'telegrams': telegrams,
'slacks': slacks,
'pds': pds,
'smon_ping': smon_ping,
'smon_tcp:': smon_tcp,
'smon_http': smon_http,
'smon_dns': smon_dns
'smon': sql.select_smon(user_group),
'smon_status': tools_common.is_tool_active('roxy-wi-smon'),
'user_subscription': roxywi_common.return_user_subscription(),
'telegrams': sql.get_user_telegram_by_group(user_group),
'slacks': sql.get_user_slack_by_group(user_group),
'pds': sql.get_user_pd_by_group(user_group),
'smon_ping': sql.select_smon_ping(),
'smon_tcp:': sql.select_smon_tcp(),
'smon_http': sql.select_smon_http(),
'smon_dns': sql.select_smon_dns()
}
return render_template('smon/add.html', **kwargs)
@ -315,7 +273,8 @@ def smon_add():
'pds': sql.get_user_pd_by_group(user_group),
'slacks': sql.get_user_slack_by_group(user_group),
'telegrams': sql.get_user_telegram_by_group(user_group),
'smon_service': sql.select_smon_check_by_id(last_id, check_type)
'smon_service': sql.select_smon_check_by_id(last_id, check_type),
'lang': lang
}
return render_template('ajax/smon/show_new_smon.html', **kwargs)

View File

@ -34,32 +34,29 @@ def waf(service):
if not roxywi_auth.is_access_permit_to_service(service):
abort(403, f'You do not have needed permissions to access to {service.title()} service')
manage_rules = ''
waf_rule_id = ''
config_file_name = ''
waf_rule_file = ''
config_read = ''
rules = ''
serv = ''
cfg = ''
user_params = g.user_params
if service == 'nginx':
servers = roxywi_common.get_dick_permit(nginx=1)
else:
servers = user_params['servers']
servers = g.user_params['servers']
title = "Web application firewall"
servers_waf = sql.select_waf_servers_metrics(user_params['user_uuid'])
autorefresh = 1
return render_template(
'waf.html', title=title, autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], serv=serv,
servers=servers_waf, servers_all=servers, manage_rules=manage_rules, rules=rules,
user_services=user_params['user_services'], waf_rule_file=waf_rule_file, waf_rule_id=waf_rule_id,
config=config_read, cfg=cfg, token=user_params['token'], config_file_name=config_file_name, service=service,
lang=user_params['lang']
)
kwargs = {
'user_params': g.user_params,
'title': 'Web application firewall',
'autorefresh': 1,
'serv': '',
'servers': sql.select_waf_servers_metrics(g.user_params['user_uuid']),
'servers_all': servers,
'manage_rules': '',
'rules': '',
'waf_rule_file': '',
'waf_rule_id': '',
'config': '',
'cfg': '',
'config_file_name': '',
'service': service,
'lang': g.user_params['lang']
}
return render_template('waf.html', **kwargs)
@bp.route('/<service>/<server_ip>/rules')
@ -70,28 +67,27 @@ def waf_rules(service, server_ip):
if not roxywi_auth.is_access_permit_to_service(service):
abort(403, f'You do not have needed permissions to access to {service.title()} service')
manage_rules = '1'
waf_rule_id = ''
config_file_name = ''
waf_rule_file = ''
servers_waf = ''
config_read = ''
servers = ''
cfg = ''
user_params = g.user_params
title = "Manage rules - Web application firewall"
rules = sql.select_waf_rules(server_ip, service)
kwargs = {
'user_params': g.user_params,
'title': 'Manage rules - Web application firewall',
'serv': server_ip,
'servers': sql.select_waf_servers_metrics(g.user_params['user_uuid']),
'servers_all': '',
'manage_rules': '1',
'rules': sql.select_waf_rules(server_ip, service),
'waf_rule_file': '',
'waf_rule_id': '',
'config': '',
'cfg': '',
'config_file_name': '',
'service': service,
'lang': g.user_params['lang']
}
return render_template(
'waf.html', title=title, autorefresh=0, role=user_params['role'], user=user_params['user'], serv=server_ip,
servers=servers_waf, servers_all=servers, manage_rules=manage_rules, rules=rules,
user_services=user_params['user_services'], waf_rule_file=waf_rule_file, waf_rule_id=waf_rule_id,
config=config_read, cfg=cfg, token=user_params['token'], config_file_name=config_file_name, service=service,
lang=user_params['lang']
)
return render_template('waf.html', **kwargs)
@bp.route('/<service>/<server_ip>/rule/<rule_id>')
@bp.route('/<service>/<server_ip>/rule/<int:rule_id>')
@get_user_params()
def waf_rule_edit(service, server_ip, rule_id):
roxywi_auth.page_for_admin(level=2)
@ -99,24 +95,17 @@ def waf_rule_edit(service, server_ip, rule_id):
abort(403, f'You do not have needed permissions to access to {service.title()} service')
roxywi_common.check_is_server_in_group(server_ip)
manage_rules = ''
servers_waf = ''
config_read = ''
servers = ''
user_params = g.user_params
rules = sql.select_waf_rules(server_ip, service)
if service == 'nginx':
config_path = sql.get_setting('nginx_dir')
else:
config_path = sql.get_setting('haproxy_dir')
title = 'Edit a WAF rule'
waf_rule_file = sql.select_waf_rule_by_id(rule_id)
configs_dir = sql.get_setting('tmp_config_path')
cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}-{waf_rule_file}"
error = config_mod.get_config(server_ip, cfg, waf=service, waf_rule_file=waf_rule_file)
config_file_name = common.return_nice_path(config_path) + 'waf/rules/' + waf_rule_file
config_read = ''
try:
conf = open(cfg, "r")
@ -125,12 +114,24 @@ def waf_rule_edit(service, server_ip, rule_id):
except IOError:
print('Cannot read imported config file')
return render_template(
'waf.html', title=title, autorefresh=0, role=user_params['role'], user=user_params['user'], serv=server_ip,
servers=servers_waf, servers_all=servers, manage_rules=manage_rules, rules=rules,
user_services=user_params['user_services'], waf_rule_file=waf_rule_file, waf_rule_id=rule_id, config=config_read,
cfg=cfg, token=user_params['token'], config_file_name=config_file_name, service=service, lang=user_params['lang']
)
kwargs = {
'user_params': g.user_params,
'title': 'Edit a WAF rule',
'serv': server_ip,
'servers': sql.select_waf_servers_metrics(g.user_params['user_uuid']),
'servers_all': '',
'manage_rules': '',
'rules': sql.select_waf_rules(server_ip, service),
'waf_rule_file': sql.select_waf_rule_by_id(rule_id),
'waf_rule_id': rule_id,
'config': config_read,
'cfg': cfg,
'config_file_name': config_file_name,
'service': service,
'lang': g.user_params['lang']
}
return render_template('waf.html', **kwargs)
@bp.route('/<service>/<server_ip>/rule/<rule_id>/save', methods=['POST'])

View File

@ -44,12 +44,7 @@
<tr>
<td class="addName">{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: </td>
<td class="addOption">
<select required name="serv" id="serv">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv', values=user_params['servers'], is_servers='true') }}
<div class="tooltip tooltipTop"><b>{{lang.words.note|title()}}:</b> {{lang.phrases.master_slave}}</div>
</td>
<td rowspan="5" class="add-note addName alert-info">
@ -312,12 +307,7 @@
<tr>
<td class="addName">{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: </td>
<td class="addOption">
<select required name="serv" id="serv2">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv2', values=user_params['servers'], is_servers='true') }}
<div class="tooltip tooltipTop"><b>{{lang.words.note|title()}}:</b> {{lang.phrases.master_slave}}</div>
</td>
<td rowspan="5" class="add-note addName alert-info">
@ -508,12 +498,7 @@
<tr>
<td class="addName">{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: </td>
<td class="addOption">
<select required name="serv" id="serv3">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv3', values=user_params['servers'], is_servers='true') }}
<div class="tooltip tooltipTop"><b>{{lang.words.note|title()}}:</b> {{lang.phrases.master_slave}}</div>
</td>
<td rowspan="4" class="add-note addName alert-info">
@ -736,12 +721,7 @@
</tr>
<tr>
<td class="padding10 first-collumn">
<select required name="serv" id="serv5">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv5', values=user_params['servers'], is_servers='true') }}
<button id="ssl_key_view" title="{{lang.words.view|title()}} {{lang.words.certs}}">{{lang.words.view|title()}}</button>
</td>
<td colspan="2" style="padding: 10px 0 10px 0;">
@ -759,12 +739,7 @@
</tr>
<tr>
<td class="first-collumn padding10" valign="top" style="padding-top: 15px;">
<select required id="serv4">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv4', values=user_params['servers'], is_servers='true') }}
</td>
<td valign="top" style="padding-top: 27px;">
{{ input('ssl_name') }}
@ -785,12 +760,7 @@
</tr>
<tr>
<td class="padding10 first-collumn">
<select required id="serv_for_lets">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv_for_lets', values=user_params['servers'], is_servers='true') }}
</td>
<td>
{{ input('lets_domain', placeholder="example.com") }}
@ -909,12 +879,7 @@
<tr>
<td class="addName">{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: </td>
<td class="addOption">
<select required name="serv" id="userlist_serv">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('userlist_serv', name='serv', values=user_params['servers'], is_servers='true') }}
<div class="tooltip tooltipTop"><b>{{lang.words.note|title()}}:</b> {{lang.phrases.master_slave}}</div>
</td>
<td rowspan="4" class="add-note addName alert-info">{{lang.add_page.desc.userlist_desc}}</td>
@ -967,12 +932,7 @@
<tr>
<td class="addName">{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: </td>
<td class="addOption">
<select required name="serv" id="existing_userlist_serv">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('existing_userlist_serv', name='serv', values=user_params['servers'], is_servers='true') }}
<div class="tooltip tooltipTop"><b>{{lang.words.note|title()}}:</b> {{lang.phrases.master_slave}}</div>
</td>
<td>
@ -1002,12 +962,7 @@
<tr>
<td class="addName">{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: </td>
<td class="addOption">
<select required name="serv" id="peers_serv">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('peers_serv', name='serv', values=user_params['servers'], is_servers='true') }}
<div class="tooltip tooltipTop"><b>{{lang.words.note|title()}}:</b> {{lang.phrases.master_slave}}</div>
</td>
<td rowspan="4" class="add-note addName alert-info">
@ -1074,13 +1029,7 @@
<button onclick="createList('black')">{{lang.words.create|title()}}</button>
</td>
<td class="first-collumn">
<select required name="serv-black-list" id="serv-black-list">
<option disabled selected>------</option>
<option value="all">{{lang.words.all|title()}}</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv-black-list', values=user_params['servers'], is_servers='true') }}
</td>
<td style="width: 30%; padding: 10px 0 10px 0;">
{% for list in black_lists %}
@ -1105,13 +1054,7 @@
<button onclick="createList('white')">{{lang.words.create|title()}}</button>
</td>
<td class="first-collumn">
<select required name="serv-white-list" id="serv-white-list">
<option disabled selected>------</option>
<option value="all">{{lang.words.all|title()}}</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv-white-list', values=user_params['servers'], is_servers='true') }}
</td>
<td style="width: 30%; padding: 10px 0 10px 0;">
{% for list in white_lists %}
@ -1146,13 +1089,7 @@
<button onclick="createMap()">{{lang.words.create|title()}}</button>
</td>
<td class="first-collumn">
<select required name="serv-map" id="serv-map">
<option disabled selected>------</option>
<option value="all">{{lang.words.all|title()}}</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv-map', values=user_params['servers'], is_servers='true') }}
</td>
<td style="width: 30%; padding: 10px 0 10px 0;">
{% for map in maps %}

View File

@ -20,12 +20,7 @@
<tr>
<td class="addName">{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: </td>
<td class="addOption">
<select required name="serv" id="serv">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('serv', values=user_params['servers'], is_servers='true') }}
<div class="tooltip tooltipTop"><b>{{lang.words.note|title()}}:</b> {{lang.phrases.master_slave}}</div>
</td>
<td rowspan="5" class="add-note addName alert-info">

View File

@ -8,13 +8,10 @@
<span id="cluster-desc-{{cluster.id}}">{% if cluster.desc != '' %} ({{cluster.desc}}) {% endif %}</span>
</a>
<span class="server-action">
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
<a class="plus" onclick="add_vip_ha_cluster('{{cluster.id}}', '{{cluster.name}}')"></a>
<a class="edit" onclick="createHaClusterStep1(true, '{{cluster.id}}')"></a>
<a class="delete" onclick="confirmDeleteCluster('{{cluster.id}}')"></a>
<span class="portlet-header" title="{{lang.words.change2|title()}} {{lang.words.position}} {{cluster.name}}">
<i class="fas fa-grip-vertical"></i>
</span>
{% endif %}
</span>
</div>
@ -47,7 +44,7 @@
VIP:
<span id="cluster-vip">
{%- for vip in vips %}
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
<a style="cursor: pointer;" onclick="add_vip_ha_cluster('{{vip.cluster_id}}', '{{cluster.name}}', '{{vip.router_id}}', '{{vip.vip}}', 1)" title="{{lang.words.edit|title()}} VIP">{{vip.vip}}</a>
{% else %}
{{vip.vip}}
@ -67,9 +64,6 @@
{% endif %}
{% endfor %}
</div>
<!-- <div>-->
<!-- {{lang.ha_page.return_master_desc}}: {% if cluster.return_master %} {{lang.words.true|title()}} {% else %} {{lang.words.false|title()}} {% endif %}-->
<!-- </div>-->
</div>
{{ input('router_id-'+ cluster.id|string(), type='hidden') }}
</div>

View File

@ -147,6 +147,12 @@
<td>{{d.mac}}</td>
</tr>
<tr class="odd">
<td class="padding10 first-collumn-wi">
UP
</td>
<td>{{d.up}}</td>
</tr>
<tr class="even">
<td class="padding10 first-collumn-wi" style="width: 20%;">
Description
</td>

View File

@ -20,7 +20,7 @@
<td class="third-collumn-wi">
{% for group in users_groups %}
{% if USER.user_id|string() == group.user_id|string() %}
{{ group.groups.name }}
<span title="{{ group.groups.name }}: {{ group.groups.description }}"> {{ group.groups.name }}</span>
{% endif %}
{% endfor %}
</td>
@ -52,7 +52,7 @@
<td class="third-collumn-wi">
{% for group in users_groups %}
{% if group.user_id|string() == USER.user_id|string() %}
{{ group.groups.name }}{{ "," if not loop.last }}
<span title="{{ group.groups.name }}: {{ group.groups.description }}"> {{ group.groups.name }}</span>
{% endif %}
{% endfor %}
</td>

View File

@ -70,8 +70,8 @@
<script src="/inc/toastr.js"></script>
</head>
<body>
{% if user %}
<input type="hidden" id="token" value="{{ token }}">
{% if user_params['user'] %}
<input type="hidden" id="token" value="{{ user_params['token'] }}">
<script>show_version();</script>
{% include 'include/main_menu.html' %}
<div class="container">

View File

@ -25,16 +25,16 @@
<script src="/inc/codemirror/mode/haproxy.js"></script>
<script src="/inc/codemirror/keymap/sublime.js"></script>
<script src="/inc/configshow.js"></script>
{% if is_serv_protected and role > 2 %}
{% if is_serv_protected and user_params['role'] > 2 %}
<meta http-equiv="refresh" content="0; url=/app/service">
{% else %}
{% if selects|length == 0 %}
{% if user_params['servers']|length == 0 %}
{% include 'include/getstarted.html' %}
{% else %}
<p>
<form action="{{ action }}" method="post" class="left-space">
<input type="hidden" id="service" value="{{service|default('haproxy', true)}}" />
{% include 'include/select.html' %}
{{ select('serv', values=user_params['servers'], is_servers='true', selected=serv) }}
{% if service == 'nginx' or service == 'apache' %}
<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.running}} {{lang.words.config}}" onclick="showConfigFiles()">{{lang.words.open|title()}}</a>
{% else %}
@ -47,10 +47,10 @@
<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.map}}" onclick="showMap()">{{lang.words.map|title()}}</a>
{% endif %}
<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.compare|title()}} {{lang.words.configs}}" onclick="showCompareConfigs()">{{lang.words.compare|title()}}</a>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.versions}}" onclick="openVersions()">{{lang.menu_links.versions.link}}</a>
{% endif %}
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
<a href="/app/servers#backup" class="ui-button ui-widget ui-corner-all" title="Git">Git</a>
{% endif %}
</form>
@ -63,7 +63,7 @@
{% endif %}
{% if config %}
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<h4 class="left-space">{{lang.words.config|title()}} {% if config_file_name and config_file_name != 'undefined' %}{{config_file_name.replace('92', '/')}}{%endif%} {{lang.words.from}} {{ serv }}</h4>
<form action="/app/config/{{service}}/{{serv}}/save" name="saveconfig" id="saveconfig" method="post" class="left-space">
<input type="hidden" value="{{ serv }}" name="serv">

View File

@ -5,7 +5,7 @@
<p>
<form action="/app/config/versions/{{service}}/{{serv}}" method="post" class="left-space">
<input type="hidden" id="service" value="{{service}}">
{% include 'include/select.html' %}
{{ select('serv', values=user_params['servers'], is_servers='true') }}
<button type="submit" value="open" name="open" class="btn btn-default">{{lang.words.open|title()}}</button>
</form>
</p>

View File

@ -2,7 +2,7 @@
{% block title %}{{ lang.menu_links.versions.h2 }} {{ lang.words[service] }}{% endblock %}
{% block h2 %}{{ lang.menu_links.versions.h2 }} {{ lang.words[service] }}{% endblock %}
{% block content %}
{% if selects|length == 0 %}
{% if user_params['servers']|length == 0 %}
{% include 'include/getstarted.html' %}
{% else %}
<link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css">
@ -10,7 +10,7 @@
<p>
<form action="{{ action }}" method="post" class="left-space">
<input type="hidden" value="{{service}}" name="service" id="service">
{% include 'include/select.html' %}
{{ select('serv', values=user_params['servers'], is_servers='true', selected=serv) }}
<a class="ui-button ui-widget ui-corner-all" title="Open versions" onclick="showListOfVersion(1)">{{lang.words.open|title()}}</a>
<a href="/app/config/{{service}}" class="ui-button ui-widget ui-corner-all" title="Configs page">{{lang.words.configs|title()}}</a>
{% if service != 'keepalived' %}
@ -37,7 +37,7 @@
</div>
{% endif %}
{% if serv and not aftersave %}
{% for select in selects %}
{% for select in user_params['servers'] %}
{% if select.2 == serv %}
<script>showListOfVersion(1)</script>
{% endif %}

View File

@ -9,27 +9,6 @@
<link href="/inc/css/servers.css" rel="stylesheet"/>
<link href="/inc/css/smon.css" rel="stylesheet">
<link href="/inc/css/ha.css" rel="stylesheet">
<script>
$( function() {
$( ".sortable" ).sortable({
revert: true,
placeholder: "ui-state-highlight"
});
$( ".sortable" ).disableSelection();
$( ".sortable" ).sortable({
handle: ".portlet-header",
stop: function(event, ui) {
var itemOrder = $('.sortable').sortable("toArray");
for (var i = 0; i < itemOrder.length; i++) {
var pos = i;
var id = itemOrder[i].split('-')[2]
change_pos(pos, id);
}
}
});
});
</script>
{% if user_subscription.user_status == 0 or user_subscription.user_plan == 'user' %}
{% include 'include/no_sub.html' %}
{% elif not is_needed_tool %}
@ -41,10 +20,10 @@
</h4>
</div>
{% else %}
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
<div class="add-button add-button-big" title="{{lang.phrases.create_ha}}" onclick="createHaClusterStep1();">+ {{lang.ha_page.create_ha}}</div>
{% endif %}
<div class="up-pannel">
<div class="up-pannel" class="sortable">
{% for cluster in clusters %}
<div id="cluster-{{cluster.id}}" class="div-server-hapwi animated-background"></div>
{% endfor %}
@ -155,6 +134,10 @@
{{ checkbox('nginx_docker', title=lang.ha_page.try_install+' NGINX '+lang.ha_page.as_docker) }}
</td>
</tr>
<tr>
<td class="padding20 help_cursor"><span title="{{lang.ha_page.try_install}} Apache">Apache</span></td>
<td class="help_cursor">{{ checkbox('apache', title=lang.ha_page.try_install+' Apache') }}</td>
</tr>
</table>
<div class="alert alert-warning">
{{lang.ha_page.save_apply|safe}}

View File

@ -44,7 +44,7 @@
<th class="padding10 first-collumn" style="width: 100px;">{{lang.words.service|title()}}</th>
<th>{{lang.words.user|title()}}</th>
<th style="width: 100px">{{lang.words.service|title()}} IP</th>
<th style="width: 100px">{{lang.words.server|title()}}</th>
<th style="width: 100px">{%if service == 'cluster' %}{{lang.words.cluster|title()}} {%else%}{{lang.words.server|title()}}{% endif %}</th>
<th>{{lang.words.action|title()}}</th>
<th>{{lang.words.date|title()}}</th>
</tr>
@ -56,7 +56,7 @@
<td>
{% for u in users %}
{% if u.user_id == h.user_id %}
<a href="/app/history.py?service=user&user_id={{u.user_id}}" title="Open history for {{u.username}}">{{ u.username }}</a>
<a href="/app/history/user/{{u.user_id}}" title="Open history for {{u.username}}">{{ u.username }}</a>
{% endif %}
{% endfor %}
</td>
@ -64,7 +64,9 @@
<td>
{% if h.server_ip != None %}
{% if h.service in ('haproxy', 'nginx', 'apache', 'keepalived') %}
<a href="/app/hapservers.py?service={{h.service}}&serv={{h.server_ip}}" title="Open history for {{h.hostname}}">{{ h.hostname }}</a>
<a href="/app/service/{{h.service}}/{{h.server_ip}}" title="Open history for {{h.hostname}}">{{ h.hostname }}</a>
{% elif h.service == 'HA cluster' %}
{{h.hostname}}
{% endif %}
{% endif %}
</td>

View File

@ -14,7 +14,7 @@
</ul>
<div id="git_tab">
{% if user_status == 0 or user_plan != 'support' %}
{% if user_subscription['user_status'] == 0 or user_subscription['user_plan'] != 'support' %}
{% include 'include/no_sub.html' %}
{% else %}
<table class="overview" id="ajax-git-table">

View File

@ -163,14 +163,14 @@
{{lang.phrases.read_about_parameters}} <a href="https://roxy-wi.org/description/servers" title="{{lang.words.servers|title()}} {{lang.words.desc}}" target="_blank">{{lang.words.here}}</a>, {{lang.phrases.read_howto}} <a href="https://roxy-wi.org/howto/setup" title="How to setup servers, group and SSH credentials" target="_blank">{{lang.words.article}}</a>
</div>
{% endif %}
{% if user_status == 0 or user_plan == 'user' %}
{% if user_subscription['user_status'] == 0 or user_subscription['user_plan'] == 'user' %}
<script>
$( function() {
$('select:regex(id, slavefor)').selectmenu();
$('select:regex(id, slavefor)').selectmenu("disable");
{% if user_status == 0 %}
{% if user_subscription['user_status'] == 0 %}
$('#slavefor-th').attr("title", "{{lang.phrases.slave_for_title}}. {{lang.phrases.no_sub}}. {{lang.phrases.pls_sub}}.");
{% elif user_plan == 'user' %}
{% elif user_subscription['user_plan'] == 'user' %}
$('#slavefor-th').attr("title", "{{lang.phrases.slave_for_title}}. {{lang.phrases.no_av_feat}}");
{% endif %}
});

View File

@ -18,7 +18,7 @@
<label for="{{id}}" title="{{title}}" class="{{id}}" style="{{style}}" data-help="{{title}}">{{desc}}</label><input name="{{name}}" type="checkbox" id="{{id}}" value="{{value|e}}" {{checked}} {{disabled}} />
{%- endmacro %}
{%- macro select(id, values, name='', required='', first='', class='', selected='', title='', disabled='true') -%}
{%- macro select(id, values, name='', required='', first='', class='', selected='', title='', disabled='true', is_servers='') -%}
{% if name == '' %}
{% set name = id %}
{% endif %}
@ -30,14 +30,26 @@
<select {{required}} name="{{name}}" id="{{id}}" title="{{title}}" data-help="{{title}}" class="{{class}}">
{% if first %}
<option {{disabled}} selected>{{first}}</option>
{% else %}
<option {{disabled}} selected>------</option>
{% endif %}
{% if is_servers %}
{% for value in values %}
{% if value.2 == selected|string() %}
<option value="{{value.2}}" selected>{{value.1}}</option>
{% else %}
<option value="{{ value.2 }}">{{ value.1 }}</option>
{% endif %}
{% endfor %}
{% else %}
{% for v, des in values.items() %}
{% if v == selected|string() %}
<option value="{{v}}" selected>{{des}}</option>
{% else %}
<option value="{{v}}">{{des}}</option>
{% endif %}
{% endfor %}
{% endif %}
{% for v, des in values.items() %}
{% if v == selected|string() %}
<option value="{{v}}" selected>{{des}}</option>
{% else %}
<option value="{{v}}">{{des}}</option>
{% endif %}
{% endfor %}
</select>
{%- endmacro %}

View File

@ -45,8 +45,8 @@
intro: "Roles description",
},
{% endif %}
{% if role < 3 %}
{% if role > 1 %}
{% if user_params['role'] < 3 %}
{% if user_params['role'] > 1 %}
{% set board_id = 4 %}
{% else %}
{% set board_id = 7 %}
@ -57,7 +57,7 @@
intro: "Last log entries",
},
{% endif %}
{% if role == 1 %}
{% if user_params['role'] == 1 %}
{
element: document.querySelector('#overview-subs'),
title: "Dashboard #8",

View File

@ -1,5 +1,5 @@
{% if user %}
<span id="show-user-settings-button" class="user-circle login" title="{{lang.words.user3|title()}} {{lang.words.settings}}" style="margin-top: 5px;">{{user}}</span>
{% if user_params['user'] %}
<span id="show-user-settings-button" class="user-circle login" title="{{lang.words.user3|title()}} {{lang.words.settings}}" style="margin-top: 5px;">{{user_params['user']}}</span>
{% else %}
<a href=/app/login title="Login" class="login"> Login</a>
{% endif %}

View File

@ -10,12 +10,12 @@
<nav id="menu">
<ul class="menu">
<li><a href="{{ url_for('overview.index') }}" title="{{lang.menu_links.overview.title}}" class="overview-link ">{{lang.menu_links.overview.link}}</a></li>
{% if '5' in user_services %}
{% if role <= 3 %}
{% if '5' in user_params['user_services'] %}
{% if user_params['role'] <= 3 %}
{% endif %}
<li><a href="{{ url_for('ha.cluster_function', service='cluster') }}" title="{{lang.menu_links.ha.title}}" class="keepalived">HA {{lang.words.cluster}}</a></li>
{% endif %}
{% if '1' in user_services %}
{% if '1' in user_params['user_services'] %}
<li class="p_menu">
<a href="{{ url_for('service.services', service='haproxy') }}" title="{{lang.menu_links.hapservers.haproxy.title}}" class="config-show">HAProxy</a>
<ul class="v_menu">
@ -25,7 +25,7 @@
<li><a href="{{ url_for('logs.logs', service='haproxy') }}" title="HAProxy {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
<li><a href="{{ url_for('runtime.runtimeapi') }}" title="Runtime API" class="runtime head-submenu">Runtime API</a></li>
<li><a href="{{ url_for('metric.metrics', service='haproxy') }}" title="HAProxy {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<li><a href="{{ url_for('add.add', service='haproxy') }}#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu" id="add1">{{lang.menu_links.add_proxy.link}}</a></li>
<li><a href="{{ url_for('config.versions', service='haproxy') }}" title="{{lang.menu_links.versions.haproxy.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li>
<li><a href="{{ url_for('add.add', service='haproxy') }}#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li>
@ -35,7 +35,7 @@
</ul>
</li>
{% endif %}
{% if '2' in user_services %}
{% if '2' in user_params['user_services'] %}
<li class="p_menu">
<a href="{{ url_for('service.services', service='nginx') }}" title="{{lang.menu_links.hapservers.nginx.title}}" class="nginx-menu">NGINX</a>
<ul class="v_menu">
@ -44,7 +44,7 @@
<li><a href="{{ url_for('main.stats', service='nginx') }}" title="{{lang.menu_links.stats.nginx.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li>
<li><a href="{{ url_for('logs.logs', service='nginx') }}" title="NGINX {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
<li><a href="{{ url_for('metric.metrics', service='nginx') }}" title="NGINX {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<li><a href="{{ url_for('add.add', service='nginx') }}#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu">{{lang.menu_links.add_proxy.link}}</a></li>
<li><a href="{{ url_for('config.versions', service='nginx') }}" title="{{lang.menu_links.versions.nginx.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li>
<li><a href="{{ url_for('add.add', service='haproxy') }}?service=nginx#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu">{{lang.menu_links.ssl.link}}</a></li>
@ -53,7 +53,7 @@
</ul>
</li>
{% endif %}
{% if '4' in user_services %}
{% if '4' in user_params['user_services'] %}
<li class="p_menu">
<a href="{{ url_for('service.services', service='apache') }}" title="{{lang.menu_links.hapservers.apache.title}}" class="apache-menu">Apache</a>
<ul class="v_menu">
@ -62,15 +62,15 @@
<li><a href="{{ url_for('main.stats', service='apache') }}" title="{{lang.menu_links.stats.apache.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li>
<li><a href="{{ url_for('logs.logs', service='apache') }}" title="Apache {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li>
<li><a href="{{ url_for('metric.metrics', service='apache') }}" title="Apache {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<li><a href="{{ url_for('config.versions', service='apache') }}" title="{{lang.menu_links.versions.apache.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li>
<li><a href="{{ url_for('add.add', service='haproxy') }}?service=apache#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li>
{% endif %}
</ul>
</li>
{% endif %}
{% if '3' in user_services %}
{% if role <= 2 %}
{% if '3' in user_params['user_services'] %}
{% if user_params['role'] <= 2 %}
<li class="p_menu">
<a href="{{ url_for('service.services', service='keepalived') }}" title="{{lang.menu_links.hapservers.keepalived.title}}" class="ha">Keepalived</a>
<ul class="v_menu">
@ -88,7 +88,7 @@
<li><a href="{{ url_for('smon.smon') }}" title="{{lang.menu_links.monitoring.smon.dashboard}}" class="overview-link head-submenu">{{lang.menu_links.monitoring.smon.dashboard}}</a></li>
<li><a href="{{ url_for('smon.status_page') }}" title="{{lang.menu_links.monitoring.smon.status_page}}" class="overview-link head-submenu">{{lang.menu_links.monitoring.smon.status_page}}</a></li>
<li><a href="{{ url_for('smon.smon_history') }}" title="{{lang.menu_links.monitoring.smon.history}}" class="lists head-submenu">{{lang.menu_links.monitoring.smon.history}}</a></li>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<li><a href="{{ url_for('smon.smon_admin') }}" title="{{lang.menu_links.monitoring.smon.admin}}" class="edit head-submenu">{{lang.menu_links.monitoring.smon.admin}}</a></li>
<li><a href="{{ url_for('checker.checker_settings') }}" title="Checker: {{lang.words.settings}}" class="checker head-submenu">Checker: {{lang.words.settings|title()}}</a></li>
{% endif %}
@ -97,7 +97,7 @@
<li><a href="{{ url_for('main.nettools') }}" title="{{lang.menu_links.monitoring.net_tools}}" class="net-tools head-submenu">{{lang.menu_links.monitoring.net_tools}}</a></li>
</ul>
</li>
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
<li class="p_menu">
<a href="{{ url_for('install.install_monitoring') }}" title="{{lang.menu_links.servers.title}}" class="hap-menu">{{lang.words.installation|title()}}</a>
<ul class="v_menu">
@ -118,7 +118,7 @@
</ul>
</li>
{% endif %}
{% if role <= 1 %}
{% if user_params['role'] <= 1 %}
<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>
<ul class="v_menu">

View File

@ -1,11 +0,0 @@
<select autofocus required name="serv" id="{{ select_id }}">
<option disabled>------</option>
{% for select in selects %}
{% if select.2 == serv %}
<option value="{{ select.2 }}" selected>{{ select.1 }}</option>
{% else %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endif %}
{% endfor %}
</select>

View File

@ -45,8 +45,8 @@
<td class="padding10 first-collumn">
<select autofocus required name="haproxyaddserv" id="haproxyaddserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% for select in user_params['servers'] %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
@ -54,7 +54,7 @@
{{ checkbox('haproxy_docker', title=lang.admin_page.desc.install_as_docker) }}
</td>
<td class="syn-flood-protection-field">
{{ checkbox('syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }}
{{ checkbox('haproxy_syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }}
</td>
<td>
<span class="ui-button ui-widget ui-corner-all" id="install" title="{{lang.words.install|title()}} HAProxy">{{lang.words.install|title()}}</span>
@ -80,8 +80,8 @@
<td class="padding10 first-collumn">
<select autofocus required name="nginxaddserv" id="nginxaddserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% for select in user_params['servers'] %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
@ -115,8 +115,8 @@
<td class="padding10 first-collumn">
<select autofocus required name="apacheaddserv" id="apacheaddserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% for select in user_params['servers'] %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
@ -145,7 +145,7 @@
</h4>
</div>
{% else %}
{% if role|int() == 1 %}
{% if user_params['role']|int() == 1 %}
<table id="grafana-table">
<caption><i class="fas fa-chart-bar caption-icon2"></i><h3>Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}</h3></caption>
<tr class="overviewHead">
@ -172,7 +172,7 @@
<td></td>
<td>
{% if grafana != "active" %}
<span class="ui-button ui-widget ui-corner-all" id="grafna_install" title="{{lang.words.install|title()}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}">{{lang.words.install|title()}}</span>
<span class="ui-button ui-widget ui-corner-all" id="grafana_install" title="{{lang.words.install|title()}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}">{{lang.words.install|title()}}</span>
{% endif %}
</td>
</tr>
@ -198,8 +198,8 @@
<td class="padding10 first-collumn">
<select autofocus required name="haproxy_exp_addserv" id="haproxy_exp_addserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% for select in user_params['servers'] %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
@ -223,14 +223,14 @@
<td id="cur_nginx_exp_ver" class="padding10 first-collumn"></td>
<td class="padding10 first-collumn" style="width: 20%;">
{% set values = dict() %}
{% set values = {'0.6.0':'0.6.0', '0.7.0':'0.7.0', '0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0'} %}
{{ select('nginxexpver', values=values, selected='0.11.0') }}
{% set values = {'0.7.0':'0.7.0', '0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0', '1.0.0':'1.0.0', '1.1.0':'1.1.0'} %}
{{ select('nginxexpver', values=values, selected='1.1.0') }}
</td>
<td class="padding10 first-collumn">
<select autofocus required name="nginx_exp_addserv" id="nginx_exp_addserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% for select in user_params['servers'] %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
@ -254,14 +254,14 @@
<td id="cur_apache_exp_ver" class="padding10 first-collumn"></td>
<td class="padding10 first-collumn" style="width: 20%;">
{% set values = dict() %}
{% set values = {'0.10.0':'0.10.0', '0.13.4':'0.13.4', '1.0.1':'1.0.1'} %}
{{ select('apacheexpver', values=values, selected='1.0.1') }}
{% set values = {'0.10.0':'0.10.0', '0.13.4':'0.13.4', '1.0.4':'1.0.4'} %}
{{ select('apacheexpver', values=values, selected='1.0.4') }}
</td>
<td class="padding10 first-collumn">
<select autofocus required name="apache_exp_addserv" id="apache_exp_addserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% for select in user_params['servers'] %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
@ -291,8 +291,8 @@
<td class="padding10 first-collumn">
<select autofocus required name="keepalived_exp_addserv" id="keepalived_exp_addserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% for select in user_params['servers'] %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
@ -316,14 +316,14 @@
<td id="cur_node_exp_ver" class="padding10 first-collumn"></td>
<td class="padding10 first-collumn" style="width: 20%;">
{% set values = dict() %}
{% set values = {'1.2.0':'1.2.0', '1.2.2':'1.2.2', '1.3.0':'1.3.0', '1.3.1':'1.3.1', '1.5.0':'1.5.0', '1.6.1':'1.6.1'} %}
{{ select('nodeexpver', values=values, selected='1.6.1') }}
{% set values = {'1.2.0':'1.2.0', '1.2.2':'1.2.2', '1.3.0':'1.3.0', '1.3.1':'1.3.1', '1.5.0':'1.5.0', '1.6.1':'1.6.1', '1.7.0':'1.7.0'} %}
{{ select('nodeexpver', values=values, selected='1.7.0') }}
</td>
<td class="padding10 first-collumn">
<select autofocus required name="node_exp_addserv" id="node_exp_addserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% for select in user_params['servers'] %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
@ -363,8 +363,8 @@
<td class="padding10 first-collumn">
<select autofocus required name="geoipserv" id="geoipserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% for select in user_params['servers'] %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>

View File

@ -321,6 +321,7 @@
"resource_record_type": "Resource Record Type",
"add_to_smon_desc": "Add the server for checking by SMON ping",
"create_page_status": "Create status page",
"not_in_cluster": "Not in a cluster",
}
%}
{% set roles = {

View File

@ -321,6 +321,7 @@
"resource_record_type": "Type d'enregistrement de ressource",
"add_to_smon_desc": "Ajouter le serveur pour vérification par SMON ping",
"create_page_status": "Créer une page de statut",
"not_in_cluster": "Pas dans un cluster",
}
%}
{% set roles = {

View File

@ -321,6 +321,7 @@
"resource_record_type": "Tipo de registro de recurso",
"add_to_smon_desc": "Adicione o servidor para verificação por ping SMON",
"create_page_status": "Criar página de status",
"not_in_cluster": "Não em um cluster",
}
%}
{% set roles = {

View File

@ -321,6 +321,7 @@
"resource_record_type": "Тип записи ресурса",
"add_to_smon_desc": "Добавить сервер для проверки с помощью SMON ping",
"create_page_status": "Создать страницу статуса",
"not_in_cluster": "Не в кластере",
}
%}
{% set roles = {

View File

@ -28,7 +28,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 10%;">
<form action="" method="post" id="show_log_form">
{% include 'include/select.html' %}
{{ select('serv', values=servers, is_servers='true', selected=serv) }}
</td>
{% if not waf %}
<td id="remote_log_files"></td>

View File

@ -24,7 +24,7 @@
<td class="padding10 first-collumn" style="width: 10%;">
<form action="" method="post" id="show_internal_log_form">
<select autofocus required name="serv" id="viewlogs">
<option selected>------</option>
<option disabled selected>------</option>
{% for select in selects %}
{% if select.0 == serv %}
<option value="{{ select.0 }}" selected>{{ select.1 }}</option>

View File

@ -19,7 +19,7 @@
<script src="/inc/metrics.js"></script>
<script src="/inc/chart.min-4.3.0.js"></script>
<input type="hidden" id="service" value="{{service}}">
{% if user_status == 0 %}
{% if user_subscription['user_status'] == 0 %}
{% include 'include/no_sub.html' %}
{% elif services == '0' %}
<div style="text-align: center;">

View File

@ -3,21 +3,6 @@
{% block h2 %}{{ lang.menu_links.monitoring.net_tools }}{% endblock %}
{% block content %}
{% from 'include/input_macros.html' import input, checkbox, select %}
<style>
.ping_pre {
display: block;
padding: 10px;
margin: 0 0 10px;
font-family: 'Courier New', monospace;
font-size: 14px;
line-height: 1.42857143;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: #f5f5f5;
border: 1px solid #ccc;
}
</style>
<script src="/inc/nettools.js"></script>
<form name="nettools_icmp_form" id="nettools_icmp_form" method="post" action="/app/nettols/icmp">
<table class="overview">
@ -33,7 +18,7 @@
<select autofocus required name="server_from" id="nettools_icmp_server_from">
<option disabled selected>------</option>
<option value="localhost">Roxy-WI</option>
{% for server in servers %}
{% for server in user_params['servers'] %}
<option value="{{ server.2 }}">{{ server.1 }}</option>
{% endfor %}
</select>
@ -65,7 +50,7 @@
<select autofocus required name="server_from" id="nettools_telnet_server_from">
<option disabled selected>------</option>
<option value="localhost">Roxy-WI</option>
{% for server in servers %}
{% for server in user_params['servers'] %}
<option value="{{ server.2 }}">{{ server.1 }}</option>
{% endfor %}
</select>
@ -97,7 +82,7 @@
<select autofocus required name="server_from" id="nettools_nslookup_server_from">
<option disabled selected>------</option>
<option value="localhost">Roxy-WI</option>
{% for server in servers %}
{% for server in user_params['servers'] %}
<option value="{{ server.2 }}">{{ server.1 }}</option>
{% endfor %}
</select>
@ -106,7 +91,7 @@
{% set values = dict() %}
{% set values = {'A':'A','AAA':'AAA', 'CNAME':'CNAME', 'MX':'MX', 'TXT':'TXT', 'PTR':'PTR', 'SRV':'SRV',
'SOA':'SOA', 'CAA':'CAA'} %}
{{ select('nettools_nslookup_record_type', values=values, selected='A', required='required') }}
{{ select('nettools_nslookup_record_type', values=values, selected='A', required='required') }}
</td>
<td class="padding10 first-collumn">
{{ input('nettools_nslookup_name', title='Enter a DNS name') }}

View File

@ -10,7 +10,7 @@
$("#secIntervals").css("display", "none");
var ip = []
var hostnamea = []
{% for s in servers %}
{% for s in user_params['servers'] %}
ip.push("{{s[2]}}")
var host = "{{s[2]}}"
host = host.replace(/\./g, '\\.');
@ -24,7 +24,7 @@
<table class="overview-wi" id="overview-roxy-wi">
<tr class="overviewHead">
<td class="padding10 first-collumn-wi">
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
<a href="servers#servers" title="{{lang.words.manage|title()}} {{lang.words.servers}}">{{lang.words.servers|title()}}</a>
{% else %}
{{lang.words.servers|title()}}
@ -61,14 +61,14 @@
</a>
</td>
</tr>
{% for s in servers %}
{% for s in user_params['servers'] %}
<tr class="{{ loop.cycle('odd', 'even') }}" id="{{s[2]}}"></tr>
{% endfor %}
</table>
<table class="overview-wi" id="overview-load">
<tr class="overviewHead" style="height: 30px;">
<td class="padding10 first-collumn-wi" colspan="2">
{% if role <= 1 %}
{% if user_params['role'] <= 1 %}
<a href="/app/logs/internal" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link">
Roxy-WI {{lang.words.server_status}}
</a>
@ -97,7 +97,7 @@
<thead>
<tr class="overviewHead">
<td class="padding10 first-collumn-wi" colspan=2>
{% if role <= 1 %}
{% if user_params['role'] <= 1 %}
<a href="admin#tools" title="{{lang.words.view|title()}} {{lang.words.services}} {{lang.words.status}}" class="logs_link">
Roxy-WI {{lang.words.services_status}}
</a>
@ -114,11 +114,11 @@
</thead>
<tbody id="services_ovw"></tbody>
</table>
{% if role <= 2 %}
{% if role == 2 %}
{% if user_params['role'] <= 2 %}
{% if user_params['role'] == 2 %}
{% set admin_uri = 'servers' %}
{% elif role == 1 %}
{% set admin_uri = 'users.py' %}
{% elif user_params['role'] == 1 %}
{% set admin_uri = 'admin' %}
{% endif %}
<table class="overview-wi" id="overview-users">
<thead>
@ -148,11 +148,11 @@
<tbody id="users-table"></tbody>
</table>
{% endif %}
{% if role <= 1 %}
{% if user_params['role'] <= 1 %}
<table class="overview-wi" id="overview-groups">
<tr class="overviewHead">
<td class="padding10 first-collumn-wi">
<a href="/app/users#groups" title="Manage groups" class="logs_link">{{lang.words.groups|title()}}</a>
<a href="/app/users#groups" title="{{lang.words.manage|title()}} {{lang.words.groups3}}" class="logs_link">{{lang.words.groups|title()}}</a>
</td>
<td class="second-collumn" style="width: 40%">{{lang.words.desc|title()}}</td>
<td>
@ -204,11 +204,11 @@
{% endfor %}
</table>
{% endif %}
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
<script>ShowOverviewLogs();</script>
<table class="overview-wi" id="overview-logs"></table>
{% endif %}
{% if role <= 1 %}
{% if user_params['role'] <= 1 %}
<table class="overview-wi" id="overview-subs">
<tr class="overviewHead" style="height: 30px;">
<td class="padding10 first-collumn-wi" colspan="2">

View File

@ -29,10 +29,10 @@
</div>
{% else %}
<div id="up-pannel">
{% if servers|length == 0 %}
{% if user_params['servers']|length == 0 %}
{% include 'include/getstarted.html' %}
{% endif %}
{% for s in servers %}
{% for s in user_params['servers'] %}
<div id="div-server-{{s.0}}" class="div-server-hapwi
{%- if port_scanner == 'active' %}
div-server-head-up
@ -64,7 +64,7 @@
{% else %}
{{s.1}}
{% endif %}
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
<span class="server-action"></span>
{% endif %}
</div>
@ -93,7 +93,7 @@
<br />
</div>
<div class="server-act-links" id="server-{{s.0}}">
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
{% set portscanner_enable_id = 'portscanner_enable-' + s.0|string() %}
{% set portscanner_notify_id = 'portscanner_notify-' + s.0|string() %}
{% set portscanner_history_id = 'portscanner_history-' + s.0|string() %}

View File

@ -2,14 +2,14 @@
{% block title %}Runtime API{% endblock %}
{% block h2 %}Runtime API{% endblock %}
{% block content %}
{% from 'include/input_macros.html' import input, checkbox %}
{% from 'include/input_macros.html' import input, checkbox, select %}
<link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css">
<script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script>
<script type="text/javascript" charset="utf8" src="/inc/runtimeapi.js"></script>
<div id="tabs">
<ul>
<li><a href="#runtimeapi" title="Runtime API - Roxy-WI">Runtime API</a></li>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<li><a href="#maxconn" title="Runtime API: {{lang.words.change|title()}} Maxconn - Roxy-WI">{{lang.words.change|title()}} Maxconn</a></li>
<li><a href="#servers" title="Runtime API: {{lang.words.servers|title()}} - Roxy-WI">{{lang.words.servers|title()}}</a></li>
<li><a href="#table" title="Runtime API: Stick Table - Roxy-WI">Stick Table</a></li>
@ -23,7 +23,7 @@
<td class="padding10 first-collumn">{{lang.words.server|title()}}</td>
<td>{{lang.words.action|title()}}</td>
<td>{{lang.words.command|title()}}</td>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<td class="checkbox-head">{{lang.words.save|title()}} {{lang.words.change}}</td>
{% endif %}
<td></td>
@ -31,12 +31,12 @@
<tr>
<td class="padding10 first-collumn" style="width: 25%;">
<form action="" method="post" id="runtimeapiform">
{% include 'include/select.html' %}
{{ select('serv', values=user_params['servers'], is_servers='true') }}
</td>
<td style="width: 30%;">
<select required name="servaction" id="servaction">
<option disabled>{{lang.words.select|title()}} {{lang.words.action}}</option>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<option value="disable">Disable</option>
<option value="shutdown">Shutdown</option>
<option value="enable">Enable</option>
@ -52,7 +52,7 @@
<td>
{{ input('servbackend', value=servbackend, title='Frontend, backend/server, show: info, pools or help') }}
</td>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<td class="checkbox">
{{ checkbox('save', value='123') }}
</td>
@ -78,7 +78,7 @@
{{lang.phrases.read_desc_runtime_api}} <a href="https://roxy-wi.org/description/runtimeapi#commands" title="Runtime API {{lang.words.desc}}" target="_blank">{{lang.words.here}}</a>
</div>
</div>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<div id="maxconn">
<table class="overview">
<caption><h3>{{lang.words.global|title()}}</h3></caption>
@ -93,12 +93,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 20%;">
<form action="" method="post" id="maxconnglobalform">
<select autofocus required name="serv" id="maxconn_global_select">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('maxconn_global_select', values=user_params['servers'], is_servers='true') }}
</td>
<td style="width: 75%;">
{{ input('maxconnintglobal', title=lang.words.enter|title() + ' maxconn', type="number", required='required') }}
@ -124,12 +119,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 20%;">
<form action="" method="post" id="maxconnform">
<select autofocus required name="serv" id="maxconn_select">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('maxconn_select', values=user_params['servers'], is_servers='true') }}
</td>
<td style="width: 25%">
<select required name="maxconnfront" id="maxconnfront">
@ -160,12 +150,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 20%;">
<form action="" method="post" id="maxconnbackform">
<select autofocus required name="serv" id="maxconn_backend_select">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('maxconn_backend_select', values=user_params['servers'], is_servers='true') }}
</td>
<td style="width: 25%;"><select required name="maxconnbackend" id="maxconnbackend"></select></td>
<td style="width: 25%;"><select required name="maxconn_backend_server" id="maxconn_backend_server"></select></td>
@ -200,12 +185,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 25%;">
<form action="" method="post" id="runtimeapiServerIp">
<select autofocus required name="ip_select_server" id="ip_select_server">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('ip_select_server', values=user_params['servers'], is_servers='true') }}
</td>
<td class="padding10 first-collumn">
<select required name="ipBackendServer" id="ipBackendServer"></select>
@ -241,12 +221,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 25%;">
<form action="" method="post" id="runtimeapiip">
<select autofocus required name="ip_select" id="ip_select">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('ip_select', values=user_params['servers'], is_servers='true') }}
</td>
<td class="padding10 first-collumn">
<select required name="ipbackend" id="ipbackend"></select>
@ -277,12 +252,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 25%;">
<form action="" method="post" id="runtimeapiip_delete">
<select autofocus required name="ip_select_delete" id="ip_select_delete">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('ip_select_delete', values=user_params['servers'], is_servers='true') }}
</td>
<td class="padding10 first-collumn">
<select required name="ipbackend_delete" id="ipbackend_delete"></select>
@ -311,12 +281,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 25%;">
<form action="" method="post" id="runtimeapitable">
<select autofocus required name="table_serv_select" id="table_serv_select">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('table_serv_select', values=user_params['servers'], is_servers='true') }}
</td>
<td>
<select required name="table_select" id="table_select">
@ -343,12 +308,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 25%;">
<form action="" method="post" id="runtimeapilist">
<select autofocus required name="list_serv_select" id="list_serv_select">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('list_serv_select', values=user_params['servers'], is_servers='true') }}
</td>
<td>
<select required name="list_select" id="list_select">
@ -374,12 +334,7 @@
<tr>
<td class="padding10 first-collumn" style="width: 25%;">
<form action="" method="post" id="runtimeapisessions">
<select autofocus required name="sessions_serv_select" id="sessions_serv_select">
<option disabled selected>------</option>
{% for select in selects %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
{{ select('sessions_serv_select', values=user_params['servers'], is_servers='true') }}
</td>
<td>
<button type="submit" name="Enter" value="Enter" id="enter">{{lang.words.w_get|title()}} {{lang.words.sessions}}</button>

View File

@ -2,7 +2,7 @@
{% block title %}{{lang.words.edit|title()}} {{lang.words.section2}}{% endblock %}
{% block h2 %}{{lang.words.edit|title()}} {{lang.words.section2}} {% endblock %}
{% block content %}
{% if is_serv_protected and role > 2 %}
{% if is_serv_protected and user_params['role'] > 2 %}
<meta http-equiv="refresh" content="0; url=/app/service/{{service}}">
{% else %}
<link rel="stylesheet" href="/inc/codemirror/lib/codemirror.css">
@ -39,12 +39,12 @@
{% endfor %}
</select>
<input type="hidden" value="{{ serv }}" name="serv" id="serv">
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<a class="ui-button ui-widget ui-corner-all" title="{{lang.words.edit|title()}} {{lang.words.running}} {{lang.words.config}}" onclick="openSection()">{{lang.words.edit|title()}}</a>
{% endif %}
</div>
{% if config %}
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<div id="config" class="left-space">
<h4>{{lang.phrases.you_are_editing}} "{{section}}" {{lang.phrases.section_from_server}} {{ serv }}</h4>
<form action="/app/config/section/haproxy/{{serv}}/save" name="saveconfig" id="saveconfig" method="post">
@ -56,7 +56,7 @@
<div style="width: 95%;">
<textarea name="config" class="config" id="config_text_area" rows="35" cols="100" style="height: 40%">{{ config }}</textarea>
</div>
{% if not is_serv_protected or role <= 2 %}
{% if not is_serv_protected or user_params['role'] <= 2 %}
<p>
<button type="submit" value="test" name="save" class="btn btn-default" title="{{lang.words.check|title()}} {{lang.words.config}} {{lang.words.without}} {{lang.words.saving}}">{{lang.phrases.check_config}}</button>
<button type="submit" value="save" name="save" class="btn btn-default" title="{{lang.phrases.save_title}}">{{lang.words.save|title()}}</button>

View File

@ -45,7 +45,7 @@
}
});
{% for s in services %}
{% if 'is not installed' in s.1 or s.1 == '' or user_status == 0 %}
{% if 'is not installed' in s.1 or s.1 == '' or user_subscription['user_status'] == 0 %}
{% if s.0 == 'roxy-wi-checker' %}
$(':regex(id, alert-)').checkboxradio('disable');
{% elif s.0 == 'roxy-wi-keep_alive' or s.0 == 'roxy-wi-keep-alive' %}
@ -72,7 +72,7 @@
removeData();
{%- if service == 'haproxy' %}
{%- for s in servers %}
{%- if s.8.0.9 %}
{%- if s.7.0.9 %}
getChartData(server_ip)
getHttpChartData(server_ip)
getWafChartData(server_ip)
@ -82,12 +82,12 @@
showOverviewServer('{{s.1}}', server_ip, '{{s.0}}', '{{service}}');
{%- if service == 'nginx' %}
showNginxConnections(server_ip)
{% if s.8.0.21 %}
{% if s.7.0.21 %}
getNginxChartData(server_ip)
{% endif %}
{%- elif service == 'apache' %}
showApachekBytes(server_ip)
{% if s.8.0.27 %}
{% if s.7.0.27 %}
getApacheChartData(server_ip)
{% endif %}
{%- elif service == 'haproxy' %}
@ -163,35 +163,35 @@
{% endif %}
{% set checker_desc = lang.services.hapservers_desc %}
{% if service == 'nginx' %}
{% set is_auto_start_enabled = s.8.0.17 %}
{% set is_checker_enabled = s.8.0.19 %}
{% set is_metrics_enabled = s.8.0.21 %}
{% set is_auto_start_enabled = s.7.0.17 %}
{% set is_checker_enabled = s.7.0.19 %}
{% set is_metrics_enabled = s.7.0.21 %}
{% if s.5.0.1 == 'active' or s.5.0.1 == 'Up' %}
{% set additional_status_class = 'div-server-head-up' %}
{% else %}
{% set additional_status_class = 'div-server-head-down' %}
{% endif %}
{% elif service == 'keepalived' %}
{% set is_auto_start_enabled = s.8.0.22 %}
{% set is_checker_enabled = s.8.0.23 %}
{% set is_auto_start_enabled = s.7.0.22 %}
{% set is_checker_enabled = s.7.0.23 %}
{% if s.5.0.1 == 'active' %}
{% set additional_status_class = 'div-server-head-up' %}
{% else %}
{% set additional_status_class = 'div-server-head-down' %}
{% endif %}
{% elif service == 'apache' %}
{% set is_auto_start_enabled = s.8.0.25 %}
{% set is_checker_enabled = s.8.0.26 %}
{% set is_metrics_enabled = s.8.0.27 %}
{% set is_auto_start_enabled = s.7.0.25 %}
{% set is_checker_enabled = s.7.0.26 %}
{% set is_metrics_enabled = s.7.0.27 %}
{% if 'Apache' in s.4.0 %}
{% set additional_status_class = 'div-server-head-up' %}
{% else %}
{% set additional_status_class = 'div-server-head-down' %}
{% endif %}
{% elif service == 'haproxy' %}
{% set is_auto_start_enabled = s.8.0.12 %}
{% set is_checker_enabled = s.8.0.8 %}
{% set is_metrics_enabled = s.8.0.9 %}
{% set is_auto_start_enabled = s.7.0.12 %}
{% set is_checker_enabled = s.7.0.8 %}
{% set is_metrics_enabled = s.7.0.9 %}
{% if s.5 != False %}
{% set additional_status_class = 'div-server-head-up' %}
{% else %}
@ -216,7 +216,7 @@
{% endif %}
</span>
{% endif %}
{% if s.8.0.20 == 1 %}
{% if s.7.0.20 == 1 %}
<span class="lock" title="{{lang.phrases.server_is_inaccessible_for_editing}}"></span>
{% endif %}
{% for set in docker_settings %}
@ -224,7 +224,7 @@
<span class="box" title="This server is dockerized"></span>
{% endif %}
{% endfor %}
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<span class="server-action">
<a id="start-{{ s.2 }}" class="start" title="{{lang.words.start|title()}} {{service}} {{lang.words.service}}">
<span class="service-start" onclick="confirmAjaxAction('start', '{{service}}', '{{s.2}}')"></span>
@ -262,6 +262,7 @@
{% endif %}
</div>
<div class="server-desc">
IP: {{ copy_to_clipboard(value=s.2, style='font-weight: bold') }}
{% if s.3 == '' %}
{{lang.words.no_desc|title()}}
{% else %}
@ -299,40 +300,52 @@
<span id="edit_date_{{s.2}}"></span>
</span>
<div class="overflow_div">
IP: {{ copy_to_clipboard(value=s.2, style='font-weight: bold') }}
{% if s.7.0.0 != None %}
Master for: <b>{{ copy_to_clipboard(value=s.7.0.1, style='font-weight: bold') }}</b>
{% endif %}
{% if s.9.0 == '1' %}
{% for cluster in clusters %}
{% if cluster.haclusterslave.server_id|string() == s.0|string() %}
{{lang.words.cluster|title()}}:
<a href="/app/ha/cluster/{{cluster.id}}" title="{{lang.words.open|title()}} {{lang.words.cluster}}">{{cluster.name}}</a>
{% break %}
{% else %}
{% if loop.last %}
{{lang.phrases.not_in_cluster}}
{% endif %}
{% endif %}
{% endfor %}
{% for master in master_slave %}
{% if master.3 == s.2 %}
{{lang.words.slave_for}}: <b>{{ copy_to_clipboard(value=master.0, style='font-weight: bold') }}</b>
{% endif %}
{% endfor %}
{% if s.8.0 == '1' %}
VRRP: <b>
{% if s.9.1 == 'MASTER' or s.9.1 == 'BACKUP' or s.9.1 == 'INIT' or s.9.1 == 'FAULT' %}
{{s.9.1}}
{% if s.8.1 == 'MASTER' or s.8.1 == 'BACKUP' or s.8.1 == 'INIT' or s.8.1 == 'FAULT' %}
{{s.8.1}}
{% else %}
<span title="{{lang.errors.cannot_get_info}} Keepalived" class="help_cursor">{{lang.words.error|title()}}</span>
{% endif %}
</b>
{% endif %}
{% endif %}
</div>
</div>
<div class="server-act-links" id="server-{{s.8.0.0|string()}}-{{service}}">
{% if role <= 2 %}
{% set id = 'alert-' + s.8.0.0|string() %}
<div class="server-act-links" id="server-{{s.7.0.0|string()}}-{{service}}">
{% if user_params['role'] <= 2 %}
{% set id = 'alert-' + s.7.0.0|string() %}
{% if is_checker_enabled == 1 %}
{{ checkbox(id, title=checker_desc, value='1', desc='Checker', checked='checked') }}
{% else %}
{{ checkbox(id, title=checker_desc, value='1', desc='Checker') }}
{% endif %}
{% endif %}
{% if role <= 2 and service != 'keepalived' %}
{% set id = 'metrics-' + s.8.0.0|string() %}
{% if user_params['role'] <= 2 and service != 'keepalived' %}
{% set id = 'metrics-' + s.7.0.0|string() %}
{% if is_metrics_enabled == 1 %}
{{ checkbox(id, title='Collecting metrics is enabled', value='1', desc='Metrics', checked='checked') }}
{% else %}
{{ checkbox(id, title='Enable collecting metrics', value='1', desc='Metrics') }}
{% endif %}
{% endif %}
{% if role <= 2 %}
{% set id = 'active-' + s.8.0.0|string() %}
{% if user_params['role'] <= 2 %}
{% set id = 'active-' + s.7.0.0|string() %}
{% if is_auto_start_enabled == 1 %}
{{ checkbox(id, title='Auto Start is enabled', value='1', desc='Auto Start', checked='checked') }}
{% else %}
@ -354,7 +367,7 @@
<a href="{{ url_for('main.stats', service=service, serv=s.2) }}" class="ui-button ui-widget ui-corner-all" {{stats_id}} title="{{lang.words.view|title()}} {{service}} {{lang.words.statistics}}">{{lang.menu_links.stats.link}}</a>
{% endif %}
<a href="{{ url_for('logs.logs', service=service) }}" {{logs_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{service}} {{lang.words.logs}}">{{lang.menu_links.logs.link}}</a>
{% if role <= 2 %}
{% if user_params['role'] <= 2 %}
<a href="{{ url_for('config.versions', service=service, server_ip=s.2) }}" class="ui-button ui-widget ui-corner-all" {{versions_id}} title="{{lang.words.view|title()}}/{{lang.words.rollback|title()}} {{lang.words.to}} {{lang.words.previous}} {{lang.words.config}}">{{lang.menu_links.versions.link}}</a>
{% endif %}
</div>
@ -380,9 +393,9 @@
{% if serv %}
{% for s in servers %}
{% if service in ('haproxy', 'nginx', 'apache') %}
{% if (service == 'haproxy' and s.8.0.9)
or (service == 'nginx' and s.8.0.21)
or (service == 'apache' and s.8.0.27) %}
{% if (service == 'haproxy' and s.7.0.9)
or (service == 'nginx' and s.7.0.21)
or (service == 'apache' and s.7.0.27) %}
<div class="metrics-time-range">
<b>{{lang.words.time_range|title()}}:</b>
<select title="Choose time range" id="time-range">
@ -399,7 +412,7 @@
</div>
{% endif %}
{% endif %}
{% if service == 'haproxy' and s.8.0.9 %}
{% if service == 'haproxy' and s.7.0.9 %}
<div id="server_metrics_div" class="chart-container_overview">
<canvas id="{{s.2}}" role="img"></canvas>
</div>
@ -411,11 +424,11 @@
<canvas id="waf_{{s.2}}" role="img"></canvas>
</div>
{% endif %}
{% elif service == 'nginx' and s.8.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;">
<canvas id="nginx_{{s.2}}" role="img"></canvas>
</div>
{% elif service == 'apache' and s.8.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;">
<canvas id="apache_{{s.2}}" role="img"></canvas>
</div>

View File

@ -4,21 +4,12 @@
{% block content %}
{% from 'include/input_macros.html' import input, checkbox, select %}
<br />
{% if selects|length == 0 %}
{% if user_params['servers']|length == 0 %}
{% include 'include/getstarted.html' %}
{% else %}
<form action="" method="post" class="left-space">
<input type="hidden" id="service" value="{{service}}" />
<select autofocus required name="serv" id="serv">
<option disabled>------</option>
{% for select in selects %}
{% if select.2 == serv %}
<option value="{{ select.2 }}" selected>{{ select.1 }}</option>
{% else %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endif %}
{% endfor %}
</select>
{{ select('serv', values=user_params['servers'], is_servers='true', selected=serv) }}
<a class="ui-button ui-widget ui-corner-all" id="show" title="{{lang.words.show|title()}} {{lang.words.stats}}" onclick="showStats()">{{lang.words.open|title()}}</a>
{% if service != 'nginx' and service != 'apache' %}
<div id="stats_filter">

View File

@ -83,7 +83,7 @@
</div>
<p>
<a href="/app/waf/{{service}}/{{serv}}/rules" class="ui-button ui-widget ui-corner-all" title="Return to rules management">{{lang.words.back|title()}}</a>
{% if role <= 3 %}
{% if user_params['role'] <= 3 %}
<button type="submit" value="save" name="save" class="btn btn-default" title="{{lang.words.save|title()}} {{lang.words.without}} {{lang.words.reloading}}">{{lang.words.save|title()}}</button>
{% if service == 'haproxy' %}
<button type="submit" value="" name="" class="btn btn-default">{{lang.phrases.save_and_restart}}</button>

View File

@ -29,6 +29,24 @@ $( function() {
$('#mail-section-head').click(function () {
hideAndShowSettings('mail');
});
$( "#settings select" ).on('select2:select',function() {
var id = $(this).attr('id');
var val = $(this).val();
updateSettings(id, val);
updateSettings(id[1])
});
$( "#settings input" ).change(function() {
var id = $(this).attr('id');
var val = $(this).val();
if($('#'+id).is(':checkbox')) {
if ($('#'+id).is(':checked')){
val = 1;
} else {
val = 0;
}
}
updateSettings(id, val);
});
});
function hideAndShowSettings(section) {
var ElemId = $('#' + section + '-section-h3');
@ -44,3 +62,31 @@ function hideAndShowSettings(section) {
$.getScript(awesome);
}
}
function updateSettings(param, val) {
try {
val = val.replace(/\//g, "92");
} catch (e) {
val = val;
}
toastr.clear();
$.ajax({
url: "/app/admin/setting/" + param,
data: {
val: val,
token: $('#token').val()
},
type: "POST",
success: function (data) {
data = data.replace(/\s+/g, ' ');
if (data.indexOf('error:') != '-1') {
toastr.error(data);
} else {
toastr.clear();
$("#" + param).parent().parent().addClass("update", 1000);
setTimeout(function () {
$("#" + param).parent().parent().removeClass("update");
}, 2500);
}
}
});
}

View File

@ -1392,7 +1392,6 @@ label {
background-position: 800px 0
}
}
.animated-background {
animation-duration: 2s;
animation-fill-mode: forwards;
@ -1403,4 +1402,15 @@ label {
background: linear-gradient(to right, #eeeeee 8%, #bbbbbb 18%, #eeeeee 33%);
background-size: 800px 104px;
position: relative;
}
}
.ping_pre {
padding: 10px;
font-family: 'Courier New', monospace;
font-size: 14px;
line-height: 1.42857143;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: #f5f5f5;
border: 1px solid #ccc;
}

View File

@ -306,6 +306,7 @@ function saveCluster(jsonData, cluster_id=0, edited=0, reconfigure=0) {
let hap_docker = 0;
let nginx = 0;
let nginx_docker = 0;
let apache = 0;
req_method = 'POST';
if (edited) {
req_method = 'PUT';
@ -331,6 +332,9 @@ function saveCluster(jsonData, cluster_id=0, edited=0, reconfigure=0) {
if ($('#nginx_docker').is(':checked')) {
nginx_docker = '1';
}
if ($('#apache').is(':checked')) {
apache = '1';
}
jsonData['cluster_id'] = cluster_id;
jsonData['name'] = $('#ha-cluster-name').val();
jsonData['desc'] = $('#ha-cluster-desc').val();
@ -340,6 +344,7 @@ function saveCluster(jsonData, cluster_id=0, edited=0, reconfigure=0) {
jsonData['syn_flood'] = syn_flood;
jsonData['services'] = {'haproxy': {'enabled': hap, 'docker': hap_docker}};
jsonData['services']['nginx'] = {'enabled': nginx, 'docker': nginx_docker};
jsonData['services']['apache'] = {'enabled': apache, 'docker': 0};
jsonData['router_id'] = $('#router_id-' + cluster_id).val();
$.ajax({
url: "/app/ha/cluster",
@ -380,6 +385,9 @@ function Reconfigure(jsonData, cluster_id) {
if (servers['services']['nginx']['enabled']) {
total_installation = total_installation + 1;
}
if (servers['services']['apache']['enabled']) {
total_installation = total_installation + 1;
}
var server_creating_title = $("#server_creating1").attr('title');
var server_creating = $("#server_creating1").dialog({
autoOpen: false,
@ -401,10 +409,31 @@ function Reconfigure(jsonData, cluster_id) {
let progress_step = 100 / total_installation;
$.when(installServiceCluster(jsonData, 'keepalived', progress_step, cluster_id)).done(function () {
if (servers['services']['haproxy']['enabled']) {
installServiceCluster(jsonData, 'haproxy', progress_step, cluster_id);
}
if (servers['services']['nginx']['enabled']) {
installServiceCluster(jsonData, 'nginx', progress_step, cluster_id);
$.when(installServiceCluster(jsonData, 'haproxy', progress_step, cluster_id)).done(function () {
if (servers['services']['nginx']['enabled']) {
$.when(installServiceCluster(jsonData, 'nginx', progress_step, cluster_id)).done(function () {
if (servers['services']['apache']['enabled']) {
installServiceCluster(jsonData, 'apache', progress_step, cluster_id);
}
});
} else {
if (servers['services']['apache']['enabled']) {
installServiceCluster(jsonData, 'apache', progress_step, cluster_id);
}
}
});
} else {
if (servers['services']['nginx']['enabled']) {
$.when(installServiceCluster(jsonData, 'nginx', progress_step, cluster_id)).done(function () {
if (servers['services']['apache']['enabled']) {
installServiceCluster(jsonData, 'apache', progress_step, cluster_id);
}
});
} else {
if (servers['services']['apache']['enabled']) {
installServiceCluster(jsonData, 'apache', progress_step, cluster_id);
}
}
}
});
}

View File

@ -15,7 +15,7 @@ $( function() {
$('#apache_install').click(function() {
installService('apache');
});
$('#grafna_install').click(function() {
$('#grafana_install').click(function() {
$("#ajaxmon").html('');
$("#ajaxmon").html(wait_mess);
$.ajax({
@ -688,24 +688,6 @@ $( function() {
updateSSH(id[1])
sshKeyEnableShow(id[1])
});
$( "#settings select" ).on('select2:select',function() {
var id = $(this).attr('id');
var val = $(this).val();
updateSettings(id, val);
updateSettings(id[1])
});
$( "#settings input" ).change(function() {
var id = $(this).attr('id');
var val = $(this).val();
if($('#'+id).is(':checkbox')) {
if ($('#'+id).is(':checked')){
val = 1;
} else {
val = 0;
}
}
updateSettings(id, val);
});
$('#new-ssh_enable').click(function() {
if ($('#new-ssh_enable').is(':checked')) {
$('#ssh_pass').css('display', 'none');
@ -1347,34 +1329,6 @@ function addGit(dialog_id) {
});
}
}
function updateSettings(param, val) {
try {
val = val.replace(/\//g, "92");
} catch (e) {
val = val;
}
toastr.clear();
$.ajax({
url: "/app/admin/setting/" + param,
data: {
val: val,
token: $('#token').val()
},
type: "POST",
success: function (data) {
data = data.replace(/\s+/g, ' ');
if (data.indexOf('error:') != '-1') {
toastr.error(data);
} else {
toastr.clear();
$("#" + param).parent().parent().addClass("update", 1000);
setTimeout(function () {
$("#" + param).parent().parent().removeClass("update");
}, 2500);
}
}
});
}
function sshKeyEnableShow(id) {
$('#ssh_enable-'+id).click(function() {
if ($('#ssh_enable-'+id).is(':checked')) {