From df04d52eab372222217163c1968cbed15a4a1bc1 Mon Sep 17 00:00:00 2001 From: Aidaho Date: Mon, 13 Feb 2023 17:45:45 +0300 Subject: [PATCH] v6.3.5.0 Changelog: https://roxy-wi.org/changelog#6_3_5 --- app/add.py | 6 +- app/add_nginx.py | 4 +- app/config.py | 14 +- app/create_db.py | 6 +- app/ha.py | 5 +- app/hapservers.py | 6 +- app/history.py | 12 +- app/login.py | 17 +- app/logs.py | 11 +- app/metrics.py | 11 +- app/modules/config/runtime.py | 9 +- app/modules/roxywi/common.py | 18 +- app/modules/roxywi/logs.py | 2 +- app/modules/roxywi/overview.py | 10 +- app/modules/roxywi/roxy.py | 12 +- app/modules/roxywi/user.py | 16 +- app/modules/server/server.py | 11 +- app/modules/service/installation.py | 7 +- app/nettools.py | 4 +- app/options.py | 65 +- app/overview.py | 8 +- app/portscanner.py | 13 +- app/provisioning.py | 7 +- app/sections.py | 8 +- app/servers.py | 11 +- app/smon.py | 23 +- app/statsview.py | 5 +- app/templates/add.html | 558 ++++++------ app/templates/add_nginx.html | 40 +- app/templates/admin.html | 68 +- app/templates/ajax/alerts_history.html | 18 +- app/templates/ajax/config_show.html | 49 +- app/templates/ajax/firewall_rules.html | 28 +- app/templates/ajax/load_services.html | 36 +- app/templates/ajax/load_telegram.html | 201 ++--- app/templates/ajax/load_updateroxywi.html | 35 +- app/templates/ajax/new_git.html | 2 +- app/templates/ajax/overivewWaf.html | 25 +- .../ajax/provisioning/aws_edit_dialog.html | 1 + .../ajax/provisioning/do_edit_dialog.html | 1 + .../ajax/provisioning/gcore_edit_dialog.html | 1 + app/templates/ajax/scan_ports.html | 9 +- app/templates/ajax/sessions_table.html | 21 +- app/templates/ajax/show_list_version.html | 31 +- app/templates/ajax/show_log_files.html | 3 +- app/templates/ajax/show_new_smon.html | 3 +- app/templates/ajax/show_sub_ovw.html | 9 +- .../ajax/show_user_current_group.html | 3 +- app/templates/ajax/show_user_groups.html | 5 +- app/templates/ajax/show_user_services.html | 5 +- app/templates/ajax/show_users_ovw.html | 17 +- app/templates/ajax/smon_dashboard.html | 49 +- app/templates/ajax/stick_table.html | 17 +- app/templates/ajax/stick_tables.html | 15 +- app/templates/ajax/table_metrics.html | 62 +- app/templates/base.html | 214 +++-- app/templates/config.html | 28 +- app/templates/configver.html | 9 +- app/templates/delver.html | 15 +- app/templates/ha.html | 72 +- app/templates/hapservers.html | 54 +- app/templates/history.html | 22 +- app/templates/include/add_backup.html | 11 +- app/templates/include/add_nginx_proxy.html | 6 +- app/templates/include/add_nginx_servers.html | 28 +- app/templates/include/add_proxy.html | 71 +- app/templates/include/add_servers.html | 30 +- app/templates/include/admin_add_server.html | 24 +- app/templates/include/admin_backup.html | 68 +- app/templates/include/admin_servers.html | 48 +- app/templates/include/admin_settings.html | 2 +- app/templates/include/admin_ssh.html | 28 +- app/templates/include/admin_users.html | 30 +- app/templates/include/admins_dialogs.html | 104 +-- app/templates/include/change_pass_form.html | 10 +- app/templates/include/del_confirm.html | 4 +- app/templates/include/mon_installation.html | 86 +- app/templates/include/port_scan_history.html | 12 +- .../provisioning/providers_dialogs.html | 26 +- .../include/show_success_installation.html | 2 + app/templates/include/smon_server.html | 10 +- app/templates/include/tr_validate_tips.html | 4 +- app/templates/languages/en.html | 814 +++++++++++++++++ app/templates/languages/ru.html | 821 ++++++++++++++++++ app/templates/logs.html | 22 +- app/templates/metrics.html | 30 +- app/templates/nettools.html | 58 +- app/templates/ovw.html | 72 +- app/templates/portscanner.html | 63 +- app/templates/provisioning.html | 32 +- app/templates/sections.html | 21 +- app/templates/servers.html | 106 +-- app/templates/smon.html | 64 +- app/templates/statsview.html | 18 +- app/templates/waf.html | 56 +- app/users.py | 11 +- app/versions.py | 6 +- app/viewlogs.py | 11 +- app/waf.py | 2 +- inc/add.js | 92 +- inc/css/jquery-ui.min.css | 2 +- inc/css/servers.css | 11 +- inc/css/style.css | 14 +- inc/ha.js | 4 +- inc/runtimeapi.js | 4 +- inc/script.js | 43 +- inc/smon.js | 37 +- inc/users.js | 289 ++++-- 108 files changed, 3641 insertions(+), 1713 deletions(-) create mode 100644 app/templates/include/show_success_installation.html create mode 100644 app/templates/languages/en.html create mode 100644 app/templates/languages/ru.html diff --git a/app/add.py b/app/add.py index 572d8716..555ba01f 100644 --- a/app/add.py +++ b/app/add.py @@ -27,7 +27,7 @@ user_params = roxywi_common.get_users_params(haproxy=1) try: roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) -except Exception as e: +except Exception: print('error: your session is expired') sys.exit() @@ -62,9 +62,9 @@ if all(v is None for v in [ black_lists = roxywi_common.get_files(folder=black_dir, file_format="lst") template = template.render( - title="Add: ", role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=form.getvalue('add'), conf_add=form.getvalue('conf'), + role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=form.getvalue('add'), conf_add=form.getvalue('conf'), 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'] + black_lists=black_lists, user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'] ) print(template) diff --git a/app/add_nginx.py b/app/add_nginx.py index 6ef00c45..ba79204d 100755 --- a/app/add_nginx.py +++ b/app/add_nginx.py @@ -31,8 +31,8 @@ if all(v is None for v in [form.getvalue('upstream'), form.getvalue('generatecon env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('add_nginx.html') template = template.render( - title="Add: ", role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=form.getvalue('add'), conf_add=form.getvalue('conf'), - user_services=user_params['user_services'], token=user_params['token'] + role=user_params['role'], user=user_params['user'], selects=user_params['servers'], add=form.getvalue('add'), conf_add=form.getvalue('conf'), + user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'] ) print(template) elif form.getvalue('upstream') is not None: diff --git a/app/config.py b/app/config.py index 9b6ac34a..5e862ed8 100644 --- a/app/config.py +++ b/app/config.py @@ -5,11 +5,11 @@ import sys from jinja2 import Environment, FileSystemLoader import modules.db.sql as sql +import modules.common.common as common +import modules.roxywi.auth as roxywi_auth import modules.config.config as config_mod import modules.roxy_wi_tools as roxy_wi_tools -import modules.roxywi.auth as roxywi_auth import modules.roxywi.common as roxywi_common -import modules.common.common as common time_zone = sql.get_setting('time_zone') get_date = roxy_wi_tools.GetDate(time_zone) @@ -39,13 +39,17 @@ stderr = "" error = "" aftersave = "" is_restart = '' +service_desc = '' user_params = roxywi_common.get_users_params(service='nginx') if service in ('haproxy', 'nginx', 'keepalived', 'apache'): service_desc = sql.select_service(service) if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id): - title = f"Working with {service_desc.service} configuration files" + if user_params['lang'] == 'ru': + title = f"Работа с конфигурационным файлом {service_desc.service}" + else: + title = f"Working with {service_desc.service} configuration files" action = f"config.py?service={service_desc.slug}" configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir') file_format = 'conf' @@ -146,9 +150,9 @@ if serv is not None and form.getvalue('config') is not None: sys.exit() template = template.render( - h2=1, title=title, role=user_params['role'], action=action, user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave, + h2=1, role=user_params['role'], action=action, user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave, config=config_read, cfg=cfg, selects=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'] + token=user_params['token'], lang=user_params['lang'], service_desc=service_desc ) print(template) diff --git a/app/create_db.py b/app/create_db.py index dfc40510..ed29383a 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -86,7 +86,7 @@ def default_values(): {'param': 'ldap_domain', 'value': '', 'section': 'ldap', 'desc': 'LDAP domain for logging in', 'group': '1'}, {'param': 'ldap_class_search', 'value': 'user', 'section': 'ldap', 'desc': 'Class for searching the user', 'group': '1'}, - {'param': 'ldap_user_attribute', 'value': 'sAMAccountName', 'section': 'ldap', + {'param': 'ldap_user_attribute', 'value': 'userPrincipalName', 'section': 'ldap', 'desc': 'Attribute to search users by', 'group': '1'}, {'param': 'ldap_search_field', 'value': 'mail', 'section': 'ldap', 'desc': 'User\'s email address', 'group': '1'}, {'param': 'ldap_type', 'value': '0', 'section': 'ldap', 'desc': 'Use LDAPS', 'group': '1'}, @@ -982,8 +982,6 @@ def update_db_v_6_3_4(): print('Updating... DB has been updated to version 6.3.4.0') - - def update_db_v_6_3_5(): cursor = conn.cursor() sql = list() @@ -1000,7 +998,7 @@ def update_db_v_6_3_5(): def update_ver(): try: - Version.update(version='6.3.4.0').execute() + Version.update(version='6.3.5.0').execute() except Exception: print('Cannot update version') diff --git a/app/ha.py b/app/ha.py index d9a92a76..7871d59c 100644 --- a/app/ha.py +++ b/app/ha.py @@ -8,7 +8,6 @@ import modules.roxywi.common as roxywi_common from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ha.html') -title = "Create and configure HA cluster" print('Content-type: text/html\n') @@ -33,8 +32,8 @@ except Exception as e: roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1) parsed_template = template.render( - h2=1, title=title, role=user_params['role'], user=user_params['user'], serv=serv, selects=user_params['servers'], - user_services=user_params['user_services'], user_status=user_subscription['user_status'], + h2=1, role=user_params['role'], user=user_params['user'], serv=serv, selects=user_params['servers'], + user_services=user_params['user_services'], user_status=user_subscription['user_status'], lang=user_params['lang'], user_plan=user_subscription['user_plan'], is_needed_tool=is_needed_tool, token=user_params['token'] ) print(parsed_template) diff --git a/app/hapservers.py b/app/hapservers.py index d3f26d1d..c2945ba6 100644 --- a/app/hapservers.py +++ b/app/hapservers.py @@ -34,7 +34,6 @@ restart_settings = '' if service in ('haproxy', 'nginx', 'keepalived', 'apache'): service_desc = sql.select_service(service) if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id): - title = f'{service_desc.service} servers overview' if serv: if roxywi_common.check_is_server_in_group(serv): servers = sql.select_servers(server=serv) @@ -180,9 +179,10 @@ except Exception as e: roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1) template = template.render( - h2=1, autorefresh=autorefresh, title=title, role=user_params['role'], user=user_params['user'], servers=servers_with_status1, + h2=1, 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'], - servers_waf=servers_waf, restart_settings=restart_settings, service_desc=service_desc, token=user_params['token'] + servers_waf=servers_waf, restart_settings=restart_settings, service_desc=service_desc, token=user_params['token'], + lang=user_params['lang'] ) print(template) diff --git a/app/history.py b/app/history.py index e21c5c77..e6c969c6 100644 --- a/app/history.py +++ b/app/history.py @@ -21,21 +21,15 @@ user_id_history = form.getvalue('user_id') if service in ('haproxy', 'nginx', 'keepalived', 'apache'): service_desc = sql.select_service(service) if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id): - title = f'{service_desc.service} service history' server_id = sql.select_server_id_by_ip(serv) - history = sql.select_action_history_by_server_id_and_service( - server_id, - service_desc.service - ) + history = sql.select_action_history_by_server_id_and_service(server_id, service_desc.service) elif service == 'server': if serv: - title = f'{serv} history' if roxywi_common.check_is_server_in_group(serv): server_id = sql.select_server_id_by_ip(serv) history = sql.select_action_history_by_server_id(server_id) elif service == 'user': if user_id_history: - title = 'User history' history = sql.select_action_history_by_user_id(user_id_history) users = sql.select_users() @@ -47,8 +41,8 @@ except Exception as e: roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1) rendered_template = template.render( - h2=1, autorefresh=0, title=title, role=user_params['role'], user=user_params['user'], users=users, serv=serv, + h2=1, autorefresh=0, role=user_params['role'], user=user_params['user'], users=users, serv=serv, 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'] + user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], lang=user_params['lang'] ) print(rendered_template) diff --git a/app/login.py b/app/login.py index e81faaef..ba0e5dbf 100644 --- a/app/login.py +++ b/app/login.py @@ -154,21 +154,19 @@ def check_in_ldap(user, password): bind = ldap_bind.simple_bind_s(result[0][0], password) except ldap.INVALID_CREDENTIALS: - print("Content-type: text/html\n") - print('
Invalid credentials


') - sys.exit() + ban() except ldap.SERVER_DOWN: print("Content-type: text/html\n") - print('
Server down


') + print('error: LDAP server is down') sys.exit() except ldap.LDAPError as e: if type(e.message) == dict and 'desc' in e.message: print("Content-type: text/html\n") - print('
Other LDAP error: %s


' % e.message['desc']) + print(f'error: {e.message["desc"]}') sys.exit() else: print("Content-type: text/html\n") - print('
Other LDAP error: %s


' % e) + print(f'error: {e}') sys.exit() else: send_cookie(user) @@ -229,7 +227,12 @@ if login is not None and password is not None: if login is None: print("Content-type: text/html\n") +try: + lang = roxywi_common.get_user_lang() +except Exception: + lang = 'en' + parsed_template = template.render( - h2=0, title="Login page", role=role, user=user, error_log=error_log, error=error, ref=ref + h2=0, title="Login page", role=role, user=user, error_log=error_log, error=error, ref=ref, lang=lang ) print(parsed_template) diff --git a/app/logs.py b/app/logs.py index fbdc09db..fee5ea16 100644 --- a/app/logs.py +++ b/app/logs.py @@ -34,23 +34,24 @@ minut1 = form.getvalue('minut1') waf = form.getvalue('waf') service = common.checkAjaxInput(form.getvalue('service')) remote_file = form.getvalue('file') +service_name = '' -if service in ('haproxy', 'nginx', 'keepalived', 'apache'): +if service in ('haproxy', 'nginx', 'keepalived', 'apache') and waf != '1': service_desc = sql.select_service(service) + service_name = service_desc.service if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id): - title = f"{service_desc.service}`s logs" servers = roxywi_common.get_dick_permit(service=service_desc.slug) elif waf == '1': + service_name = 'WAF' if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1): - title = "WAF logs" servers = roxywi_common.get_dick_permit(haproxy=1) else: print('') template = template.render( - h2=1, autorefresh=1, title=title, role=user_params['role'], user=user_params['user'], select_id="serv", + h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], select_id="serv", selects=servers, serv=form.getvalue('serv'), rows=rows, grep=grep, exgrep=exgrep, hour=hour, hour1=hour1, minut=minut, minut1=minut1, waf=waf, service=service, user_services=user_params['user_services'], - token=user_params['token'], remote_file=remote_file + token=user_params['token'], remote_file=remote_file, lang=user_params['lang'], service_name=service_name ) print(template) diff --git a/app/metrics.py b/app/metrics.py index 5efcb680..63231cbe 100644 --- a/app/metrics.py +++ b/app/metrics.py @@ -12,7 +12,7 @@ env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('metrics.html') form = common.form service = form.getvalue('service') -title = 'Metrics service' +service_desc = '' print('Content-type: text/html\n') @@ -32,17 +32,16 @@ try: if service_ver[0] == ' is not installed' or service_ver == '': servers = '' else: + service_desc = sql.select_service(service) + if service == 'nginx': if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2): - title = "NGINX`s metrics" user_params['servers'] = sql.select_nginx_servers_metrics_for_master() elif service == 'apache': if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=4): - title = "Apache`s metrics" user_params['servers'] = sql.select_apache_servers_metrics_for_master() else: if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1): - title = "HAProxy`s metrics" group_id = roxywi_common.get_user_group(id=1) user_params['servers'] = sql.select_servers_metrics(group_id) service = 'haproxy' @@ -57,8 +56,8 @@ except Exception as e: roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1) template = template.render( - h2=1, title=title, autorefresh=1, role=user_params['role'], user=user_params['user'], servers=user_params['servers'], + h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], servers=user_params['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'] + user_plan=user_subscription['user_plan'], token=user_params['token'], lang=user_params['lang'], service_desc=service_desc ) print(template) diff --git a/app/modules/config/runtime.py b/app/modules/config/runtime.py index 439fd184..ac81572f 100644 --- a/app/modules/config/runtime.py +++ b/app/modules/config/runtime.py @@ -214,6 +214,7 @@ def table_select(): env = Environment(loader=FileSystemLoader('templates'), autoescape=True, extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True) table = form.getvalue('table_select') + lang = roxywi_common.get_user_lang() if table == 'All': template = env.get_template('ajax/stick_tables.html') @@ -227,11 +228,11 @@ def table_select(): table_id.append(table1) table.append(table_id) - template = template.render(table=table) + template = template.render(table=table, lang=lang) else: template = env.get_template('ajax/stick_table.html') tables_head, table = get_stick_table(table) - template = template.render(tables_head=tables_head, table=table) + template = template.render(tables_head=tables_head, table=table, lang=lang) print(template) @@ -345,14 +346,14 @@ def select_session() -> None: env = Environment(loader=FileSystemLoader('templates'), autoescape=True, extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True) serv = common.checkAjaxInput(form.getvalue('sessions_select')) - + lang = roxywi_common.get_user_lang() haproxy_sock_port = sql.get_setting('haproxy_sock_port') cmd = f'echo "show sess" |nc {serv} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) template = env.get_template('ajax/sessions_table.html') - template = template.render(sessions=output) + template = template.render(sessions=output, lang=lang) print(template) diff --git a/app/modules/roxywi/common.py b/app/modules/roxywi/common.py index dacf8cbd..2e73864a 100644 --- a/app/modules/roxywi/common.py +++ b/app/modules/roxywi/common.py @@ -229,7 +229,7 @@ def get_users_params(**kwargs): user = sql.get_user_name_by_uuid(user_uuid.value) except Exception: print('') - return + return try: role = sql.get_user_role_by_uuid(user_uuid.value) except Exception: @@ -256,18 +256,32 @@ def get_users_params(**kwargs): else: servers = get_dick_permit() + user_lang = get_user_lang() + user_params = { 'user': user, 'user_uuid': user_uuid, 'role': role, 'token': token, 'servers': servers, - 'user_services': user_services + 'user_services': user_services, + 'lang': user_lang } return user_params +def get_user_lang() -> str: + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + + try: + user_lang = cookie.get('lang') + user_lang = user_lang.value + except Exception: + return 'en' + + return user_lang + def return_user_status() -> dict: user_subscription = {} user_subscription.setdefault('user_status', sql.select_user_status()) diff --git a/app/modules/roxywi/logs.py b/app/modules/roxywi/logs.py index 65fcbcf2..ccef16ca 100644 --- a/app/modules/roxywi/logs.py +++ b/app/modules/roxywi/logs.py @@ -110,7 +110,7 @@ def show_roxy_log( a = server_mod.ssh_command(syslog_server, commands) return show_log(a, html=0, grep=grep) else: - return server_mod.ssh_command(syslog_server, commands, show_log='1', grep=grep) + return server_mod.ssh_command(syslog_server, commands, show_log='1', grep=grep, timeout=10) elif service == 'apache_internal': apache_log_path = sql.get_setting('apache_log_path') diff --git a/app/modules/roxywi/overview.py b/app/modules/roxywi/overview.py index cd093cc8..8ea914b1 100644 --- a/app/modules/roxywi/overview.py +++ b/app/modules/roxywi/overview.py @@ -13,9 +13,10 @@ import modules.service.common as service_common def user_ovw() -> None: - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) - template = env.get_template('/show_users_ovw.html') + env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) + template = env.get_template('ajax/show_users_ovw.html') + lang = roxywi_common.get_user_lang() user_params = roxywi_common.get_users_params() users_groups = sql.select_user_groups_with_names(1, all=1) user_group = roxywi_common.get_user_group(id=1) @@ -25,14 +26,15 @@ def user_ovw() -> None: else: users = sql.select_users() - template = template.render(users=users, users_groups=users_groups) + template = template.render(users=users, users_groups=users_groups, lang=lang) print(template) def show_sub_ovw() -> None: env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) + lang = roxywi_common.get_user_lang() template = env.get_template('ajax/show_sub_ovw.html') - template = template.render(sub=sql.select_user_all()) + template = template.render(sub=sql.select_user_all(), lang=lang) print(template) diff --git a/app/modules/roxywi/roxy.py b/app/modules/roxywi/roxy.py index 4348b1fc..1ba3406d 100644 --- a/app/modules/roxywi/roxy.py +++ b/app/modules/roxywi/roxy.py @@ -84,12 +84,12 @@ def get_services_status(): services = [] is_in_docker = is_docker() services_name = { - 'roxy-wi-checker': 'Checker is designed for monitoring HAProxy, NGINX, Apache and Keepalived services as well as HAProxy backends and maxconn', - 'roxy-wi-keep_alive': ' The Auto Start service allows to restart the HAProxy, NGINX, Apache and Keepalived services if they are down', - 'roxy-wi-metrics': 'Collects number of connections for HAProxy, NGINX, Apache and HAProxy WAF services', - 'roxy-wi-portscanner': 'Probes and saves a server or host for open ports', - 'roxy-wi-smon': 'SMON stands for Simple MONitoring', - 'roxy-wi-socket': 'Socket is a service for sending alerts and notifications', + 'roxy-wi-checker': '', + 'roxy-wi-keep_alive': '', + 'roxy-wi-metrics': '', + 'roxy-wi-portscanner': '', + 'roxy-wi-smon': '', + 'roxy-wi-socket': '', 'roxy-wi-prometheus-exporter': 'Prometheus exporter', 'prometheus': 'Prometheus service', 'grafana-server': 'Grafana service', diff --git a/app/modules/roxywi/user.py b/app/modules/roxywi/user.py index 7da1300e..aa88a05c 100644 --- a/app/modules/roxywi/user.py +++ b/app/modules/roxywi/user.py @@ -19,6 +19,8 @@ def create_user(new_user: str, email: str, password: str, role: str, activeuser: sql.add_user(new_user, email, password, role, activeuser, group) roxywi_common.logging(f'a new user {new_user}', ' has been created ', roxywi=1, login=1) try: + if password == 'aduser': + password = 'your domain password' message = f"A user has been created for you on Roxy-WI portal!\n\n" \ f"Now you can login to https://{os.environ.get('HTTP_HOST', '')}\n\n" \ f"Your credentials are:\n" \ @@ -85,15 +87,16 @@ def update_user_password(): def get_user_services() -> None: user_id = common.checkAjaxInput(form.getvalue('getuserservices')) + lang = roxywi_common.get_user_lang() groups = [] u_g = sql.select_user_groups(user_id) services = sql.select_services() for g in u_g: groups.append(g.user_group_id) - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) - template = env.get_template('/show_user_services.html') - template = template.render(user_services=sql.select_user_services(user_id), id=user_id, services=services) + env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) + template = env.get_template('ajax/show_user_services.html') + template = template.render(user_services=sql.select_user_services(user_id), id=user_id, services=services, lang=lang) print(template) @@ -112,14 +115,15 @@ def change_user_services() -> None: def get_user_groups() -> None: user_id = common.checkAjaxInput(form.getvalue('getusergroups')) + lang = roxywi_common.get_user_lang() groups = [] u_g = sql.select_user_groups(user_id) for g in u_g: groups.append(g.user_group_id) - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) - template = env.get_template('/show_user_groups.html') - template = template.render(groups=sql.select_groups(), user_groups=groups, id=user_id) + env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) + template = env.get_template('ajax/show_user_groups.html') + template = template.render(groups=sql.select_groups(), user_groups=groups, id=user_id, lang=lang) print(template) diff --git a/app/modules/server/server.py b/app/modules/server/server.py index 64a8a104..039582ab 100644 --- a/app/modules/server/server.py +++ b/app/modules/server/server.py @@ -15,7 +15,7 @@ def ssh_command(server_ip: str, commands: list, **kwargs): if kwargs.get('timeout'): timeout = kwargs.get('timeout') else: - timeout = 1 + timeout = 2 try: with mod_ssh.ssh_connect(server_ip) as ssh: for command in commands: @@ -411,9 +411,10 @@ def show_firewalld_rules() -> None: in_public_allow = ssh_command(serv, cmd1, raw=1) output_chain = ssh_command(serv, cmd2, raw=1) + lang = roxywi_common.get_user_lang() env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('ajax/firewall_rules.html') - template = template.render(input=input_chain2, IN_public_allow=in_public_allow, output=output_chain) + template = template.render(input_chain=input_chain2, IN_public_allow=in_public_allow, output_chain=output_chain, lang=lang) print(template) @@ -468,3 +469,9 @@ def create_server(hostname, ip, group, typeip, enable, master, cred, port, desc, return True else: return False + + +def server_is_up(server_ip: str) -> None: + cmd = [f'if ping -c 1 -W 1 {server_ip} >> /dev/null; then echo up; else echo down; fi'] + server_status, stderr = subprocess_execute(cmd) + print(server_status) diff --git a/app/modules/service/installation.py b/app/modules/service/installation.py index ae94d172..446e73f8 100644 --- a/app/modules/service/installation.py +++ b/app/modules/service/installation.py @@ -26,7 +26,12 @@ def show_installation_output(error: str, output: str, service: str) -> bool: print(output) break else: - print(f'success: {service} has been installed') + from jinja2 import Environment, FileSystemLoader + env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) + template = env.get_template('include/show_success_installation.html') + lang = roxywi_common.get_user_lang() + rendered_template = template.render(service=service, lang=lang) + print(rendered_template) roxywi_common.logging('Roxy-WI server', error, roxywi=1, keep_history=1, service=service) return True diff --git a/app/nettools.py b/app/nettools.py index 9e63b1f0..f927634c 100644 --- a/app/nettools.py +++ b/app/nettools.py @@ -22,11 +22,11 @@ except Exception as e: sys.exit() output_from_parsed_template = template.render(h2=1, autorefresh=0, - title="Network tools", role=user_params['role'], user=user_params['user'], servers=user_params['servers'], versions=roxywi_mod.versions(), user_services=user_params['user_services'], - token=user_params['token']) + token=user_params['token'], + lang=user_params['lang']) print(output_from_parsed_template) diff --git a/app/options.py b/app/options.py index 197b4200..bd0b2278 100644 --- a/app/options.py +++ b/app/options.py @@ -364,9 +364,10 @@ if act == 'showRemoteLogFiles': print(return_files) sys.exit() + lang = roxywi_common.get_user_lang() env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ajax/show_log_files.html') - template = template.render(serv=serv, return_files=return_files, path_dir=log_path) + template = template.render(serv=serv, return_files=return_files, path_dir=log_path, lang=lang) print(template) if form.getvalue('master'): @@ -499,9 +500,10 @@ if form.getvalue('git_backup'): gits = sql.select_gits(server_id=server_id, service_id=service_id) sshs = sql.select_ssh() + lang = roxywi_common.get_user_lang() env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('new_git.html') - template = template.render(gits=gits, sshs=sshs, servers=servers, services=services, new_add=1) + template = template.render(gits=gits, sshs=sshs, servers=servers, services=services, new_add=1, lang=lang) print(template) print('success: Git job has been created') roxywi_common.logging( @@ -561,16 +563,17 @@ if form.getvalue('metrics_waf'): if form.getvalue('table_metrics'): service = form.getvalue('service') roxywi_common.check_user_group() + lang = roxywi_common.get_user_lang() group_id = roxywi_common.get_user_group(id=1) if service in ('nginx', 'apache'): metrics = sql.select_service_table_metrics(service, group_id) else: metrics = sql.select_table_metrics(group_id) - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) - template = env.get_template('table_metrics.html') + env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) + template = env.get_template('ajax/table_metrics.html') - template = template.render(table_stat=metrics, service=service) + template = template.render(table_stat=metrics, service=service, lang=lang) print(template) if form.getvalue('metrics_hapwi_ram'): @@ -1138,14 +1141,17 @@ if form.getvalue('newsmon') is not None: last_id = sql.insert_smon(server, port, enable, http, uri, body, group, desc, telegram, slack, user_group) if last_id: + lang = roxywi_common.get_user_lang() env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/show_new_smon.html') template = template.render( smon=sql.select_smon_by_id(last_id), telegrams=sql.get_user_telegram_by_group(user_group), - slacks=sql.get_user_slack_by_group(user_group)) + slacks=sql.get_user_slack_by_group(user_group), + lang=lang + ) print(template) - roxywi_common.logging('SMON', ' Has been add a new server ' + server + ' to SMON ', roxywi=1, login=1) + roxywi_common.logging('SMON', f' Has been add a new server {server} to SMON ', roxywi=1, login=1) if form.getvalue('smondel') is not None: user_group = roxywi_common.get_user_group(id=1) @@ -1161,10 +1167,11 @@ if form.getvalue('smondel') is not None: if form.getvalue('showsmon') is not None: user_group = roxywi_common.get_user_group(id=1) + lang = roxywi_common.get_user_lang() sort = common.checkAjaxInput(form.getvalue('sort')) env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/smon_dashboard.html') - template = template.render(smon=sql.smon_list(user_group), sort=sort) + template = template.render(smon=sql.smon_list(user_group), sort=sort, lang=lang, update=1) print(template) if form.getvalue('updateSmonIp') is not None: @@ -1198,7 +1205,7 @@ if form.getvalue('updateSmonIp') is not None: try: if sql.update_smon(smon_id, ip, port, body, telegram, slack, group, desc, en): print("Ok") - roxywi_common.logging('SMON', ' Has been update the server ' + ip + ' to SMON ', roxywi=1, login=1) + roxywi_common.logging('SMON', f' Has been update the server {ip} to SMON ', roxywi=1, login=1) except Exception as e: print(e) @@ -1354,9 +1361,10 @@ if form.getvalue('scan_ports') is not None: if stderr != '': print(stderr) else: + lang = roxywi_common.get_user_lang() env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/scan_ports.html') - template = template.render(ports=stdout, info=stdout1) + template = template.render(ports=stdout, info=stdout1, lang=lang) print(template) if form.getvalue('viewFirewallRules') is not None: @@ -1558,10 +1566,11 @@ if any((form.getvalue('do_new_name'), form.getvalue('aws_new_name'), form.getval else: groups = '' + lang = roxywi_common.get_user_lang() env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/provisioning/providers.html') template = template.render(providers=providers, role=role_id, groups=groups, user_group=provider_group, - adding=1, params=params) + adding=1, params=params, lang=lang) print(template) if form.getvalue('providerdel'): @@ -1722,11 +1731,12 @@ if form.getvalue('doworkspace'): user_params = roxywi_common.get_users_params() new_server = sql.select_provisioned_servers(new=workspace, group=group, type='do') params = sql.select_provisioning_params() + lang = roxywi_common.get_user_lang() env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) template = env.get_template('ajax/provisioning/provisioned_servers.html') template = template.render( - servers=new_server, groups=sql.select_groups(), user_group=group, + servers=new_server, groups=sql.select_groups(), user_group=group, lang=lang, providers=sql.select_providers(group), role=user_params['role'], adding=1, params=params ) print(template) @@ -1819,11 +1829,12 @@ if form.getvalue('awsworkspace'): user_params = roxywi_common.get_users_params() new_server = sql.select_provisioned_servers(new=workspace, group=group, type='aws') params = sql.select_provisioning_params() + lang = roxywi_common.get_user_lang() env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) template = env.get_template('ajax/provisioning/provisioned_servers.html') template = template.render( - servers=new_server, groups=sql.select_groups(), user_group=group, + servers=new_server, groups=sql.select_groups(), user_group=group, lang=lang, providers=sql.select_providers(group), role=user_params['role'], adding=1, params=params ) print(template) @@ -2108,6 +2119,7 @@ if form.getvalue('gcoreworkspace'): user_params = roxywi_common.get_users_params() new_server = sql.select_provisioned_servers(new=workspace, group=group, type='gcore') params = sql.select_provisioning_params() + lang = roxywi_common.get_user_lang() env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) template = env.get_template('ajax/provisioning/provisioned_servers.html') @@ -2117,7 +2129,8 @@ if form.getvalue('gcoreworkspace'): providers=sql.select_providers(group), role=user_params['role'], adding=1, - params=params) + params=params, + lang=lang) print(template) except Exception as e: print(e) @@ -2170,9 +2183,10 @@ if form.getvalue('editAwsServer'): params = sql.select_provisioning_params() providers = sql.select_providers(int(user_group)) server = sql.select_gcore_server(server_id=server_id) + lang = roxywi_common.get_user_lang() env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) template = env.get_template('ajax/provisioning/aws_edit_dialog.html') - template = template.render(server=server, providers=providers, params=params) + template = template.render(server=server, providers=providers, params=params, lang=lang) print(template) if form.getvalue('editGcoreServer'): @@ -2182,9 +2196,10 @@ if form.getvalue('editGcoreServer'): params = sql.select_provisioning_params() providers = sql.select_providers(int(user_group)) server = sql.select_gcore_server(server_id=server_id) + lang = roxywi_common.get_user_lang() env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) template = env.get_template('ajax/provisioning/gcore_edit_dialog.html') - template = template.render(server=server, providers=providers, params=params) + template = template.render(server=server, providers=providers, params=params, lang=lang) print(template) if form.getvalue('editDoServer'): @@ -2194,9 +2209,10 @@ if form.getvalue('editDoServer'): params = sql.select_provisioning_params() providers = sql.select_providers(int(user_group)) server = sql.select_do_server(server_id=server_id) + lang = roxywi_common.get_user_lang() env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) template = env.get_template('ajax/provisioning/do_edit_dialog.html') - template = template.render(server=server, providers=providers, params=params) + template = template.render(server=server, providers=providers, params=params, lang=lang) print(template) if form.getvalue('edit_do_provider'): @@ -2243,6 +2259,7 @@ if form.getvalue('edit_aws_provider'): if form.getvalue('loadservices'): from modules.roxywi.roxy import get_services_status + lang = roxywi_common.get_user_lang() env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('ajax/load_services.html') try: @@ -2250,12 +2267,13 @@ if form.getvalue('loadservices'): except Exception as e: print(e) - template = template.render(services=services) + template = template.render(services=services, lang=lang) print(template) if form.getvalue('loadchecker'): from modules.roxywi.roxy import get_services_status + lang = roxywi_common.get_user_lang() env = Environment(loader=FileSystemLoader('templates'), autoescape=True) template = env.get_template('ajax/load_telegram.html') services = get_services_status() @@ -2306,7 +2324,8 @@ if form.getvalue('loadchecker'): nginx_settings=nginx_settings, keepalived_settings=keepalived_settings, apache_settings=apache_settings, - page=page) + page=page, + lang=lang) print(template) if form.getvalue('load_update_hapwi'): @@ -2324,6 +2343,7 @@ if form.getvalue('load_update_hapwi'): socket_ver = roxy.check_new_version('socket') prometheus_exp_ver = roxy.check_new_version('prometheus-exporter') services = roxy.get_services_status() + lang = roxywi_common.get_user_lang() template = template.render(services=services, versions=versions, @@ -2333,7 +2353,8 @@ if form.getvalue('load_update_hapwi'): portscanner_ver=portscanner_ver, socket_ver=socket_ver, prometheus_exp_ver=prometheus_exp_ver, - keep_ver=keep_ver) + keep_ver=keep_ver, + lang=lang) print(template) if form.getvalue('loadopenvpn'): @@ -2567,6 +2588,7 @@ if act == 'showListOfVersion': style = common.checkAjaxInput(form.getvalue('style')) users = sql.select_users() service_desc = sql.select_service(service) + lang = roxywi_common.get_user_lang() if service in ('haproxy', 'nginx', 'keepalived', 'apache'): configs = sql.select_config_version(serv, service_desc.slug) @@ -2594,7 +2616,8 @@ if act == 'showListOfVersion': for_delver=for_delver, configs=configs, users=users, - style=style) + style=style, + lang=lang) print(template) if act == 'getSystemInfo': diff --git a/app/overview.py b/app/overview.py index a660038a..0a213c05 100644 --- a/app/overview.py +++ b/app/overview.py @@ -9,7 +9,7 @@ import modules.roxywi.logs as roxy_logs import modules.roxywi.auth as roxywi_auth import modules.roxywi.common as roxywi_common -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) +env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates/'), autoescape=True) template = env.get_template('ovw.html') print('Content-type: text/html\n') @@ -18,7 +18,7 @@ user_params = roxywi_common.get_users_params() try: roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) -except Exception as e: +except Exception: print('error: your session is expired') sys.exit() @@ -29,8 +29,8 @@ except Exception as e: print(e) rendered_template = template.render( - h2=1, autorefresh=1, title="Overview", role=user_params['role'], user=user_params['user'], groups=groups, + h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], groups=groups, roles=sql.select_roles(), servers=user_params['servers'], user_services=user_params['user_services'], - roxy_wi_log=roxy_logs.roxy_wi_log(), token=user_params['token'], guide_me=1 + roxy_wi_log=roxy_logs.roxy_wi_log(), token=user_params['token'], guide_me=1, lang=user_params['lang'] ) print(rendered_template) diff --git a/app/portscanner.py b/app/portscanner.py index 710df97e..7442dd5a 100644 --- a/app/portscanner.py +++ b/app/portscanner.py @@ -17,6 +17,7 @@ serv = form.getvalue('history') print('Content-type: text/html\n') user_params = roxywi_common.get_users_params(virt=1) +lang = user_params['lang'] try: roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) @@ -25,7 +26,10 @@ except Exception as e: sys.exit() if serv: - title = f'Port scanner history for {serv}' + if lang == 'ru': + title = f'История Port scanner для {serv}' + else: + title = f'Port scanner history for {serv}' port_scanner_settings = sql.select_port_scanner_history(serv) history = '1' port_scanner = '' @@ -33,7 +37,10 @@ if serv: count_ports = '' else: history = '' - title = 'Port scanner dashboard' + if lang == 'ru': + title = 'Дашборд Port scanner' + else: + title = 'Port scanner dashboard' user_group = roxywi_common.get_user_group(id=1) port_scanner_settings = sql.select_port_scanner_settings(user_group) if not port_scanner_settings: @@ -59,6 +66,6 @@ rendered_template = template.render( h2=1, autorefresh=0, title=title, role=user_params['role'], user=user_params['user'], servers=user_params['servers'], port_scanner_settings=port_scanner_settings, count_ports=count_ports, history=history, port_scanner=''.join(port_scanner), port_scanner_stderr=port_scanner_stderr, user_services=user_params['user_services'], user_status=user_subscription['user_status'], - user_plan=user_subscription['user_plan'], token=user_params['token'] + user_plan=user_subscription['user_plan'], token=user_params['token'], lang=lang ) print(rendered_template) diff --git a/app/provisioning.py b/app/provisioning.py index 0382cbb7..25f49c28 100644 --- a/app/provisioning.py +++ b/app/provisioning.py @@ -36,8 +36,13 @@ try: except Exception as e: print(str(e)) +if user_params['lang'] == 'ru': + title = 'Предоставление серверов' +else: + title = 'Servers provisioning' + rendered_template = template.render( - title="Servers provisioning", role=user_params['role'], user=user_params['user'], groups=groups, + title=title, role=user_params['role'], user=user_params['user'], groups=groups, lang=user_params['lang'], user_group=user_group, servers=sql.select_provisioned_servers(), providers=sql.select_providers(user_group), is_needed_tool=is_needed_tool, user_services=user_params['user_services'], token=user_params['token'], params=params ) diff --git a/app/sections.py b/app/sections.py index 78995a18..54538dae 100644 --- a/app/sections.py +++ b/app/sections.py @@ -98,12 +98,16 @@ if serv is not None and form.getvalue('config') is not None: os.system(f"/bin/rm -f {hap_configs_dir}*.old") +if user_params['lang'] == 'ru': + title = 'Работа с секциями HAProxy' +else: + title = 'Working with HAProxy config sections' rendered_template = template.render( - h2=1, title="Working with HAProxy config sections", role=user_params['role'], action="sections.py", user=user_params['user'], + h2=1, title=title, role=user_params['role'], action="sections.py", user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave, config=config_read, cfg=cfg, selects=user_params['servers'], stderr=stderr, error=error, start_line=start_line, end_line=end_line, section=section, sections=sections, is_serv_protected=is_serv_protected, user_services=user_params['user_services'], token=user_params['token'], - warning=warning, is_restart=is_restart + warning=warning, is_restart=is_restart, lang=user_params['lang'] ) print(rendered_template) diff --git a/app/servers.py b/app/servers.py index 1f939ead..d1b5bf22 100644 --- a/app/servers.py +++ b/app/servers.py @@ -18,7 +18,7 @@ user_params = roxywi_common.get_users_params() try: roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) -except Exception as e: +except Exception: print('error: your session is expired') sys.exit() @@ -42,13 +42,18 @@ except Exception as e: user_subscription = roxywi_common.return_unsubscribed_user_status() roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1) +if user_params['lang'] == 'ru': + title = 'Сервера: ' +else: + title = "Servers: " + rendered_template = template.render( - title="Servers: ", role=user_params['role'], user=user_params['user'], users=sql.select_users(group=user_group), + 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=sql.select_backups(), page="servers.py", geoip_country_codes=geoip_country_codes, 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 + is_needed_tool=is_needed_tool, lang=user_params['lang'] ) print(rendered_template) diff --git a/app/smon.py b/app/smon.py index 349ffe48..f1fd63c2 100644 --- a/app/smon.py +++ b/app/smon.py @@ -26,6 +26,7 @@ form = common.form action = form.getvalue('action') sort = form.getvalue('sort') autorefresh = 0 +lang = user_params['lang'] user_group = roxywi_common.get_user_group(id=1) cmd = "systemctl is-active roxy-wi-smon" @@ -35,20 +36,32 @@ smon_status, stderr = server_mod.subprocess_execute(cmd) if action == 'add': smon = sql.select_smon(user_group, action='add') roxywi_auth.page_for_admin(level=3) - title = "SMON Admin" + if lang == 'ru': + title = "SMON: Админка" + else: + title = "SMON: Admin" elif action == 'history': if form.getvalue('host'): needed_host = common.is_ip_or_dns(form.getvalue('host')) smon = sql.alerts_history('SMON', user_group, host=needed_host) else: smon = sql.alerts_history('SMON', user_group) - title = "SMON History" + if lang == 'ru': + title = "SMON: История" + else: + title = "SMON: History" elif action == 'checker_history': smon = sql.alerts_history('Checker', user_group) - title = "Checker History" + if lang == 'ru': + title = "Checker: История" + else: + title = "Checker: History" else: smon = sql.smon_list(user_group) - title = "SMON Dashboard" + if lang == 'ru': + title = "SMON: Дашборд" + else: + title = "SMON: Dashboard" autorefresh = 1 try: @@ -59,7 +72,7 @@ except Exception as e: rendered_template = template.render( h2=1, title=title, autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], group=user_group, - telegrams=sql.get_user_telegram_by_group(user_group), slacks=sql.get_user_slack_by_group(user_group), + telegrams=sql.get_user_telegram_by_group(user_group), slacks=sql.get_user_slack_by_group(user_group), lang=lang, smon=smon, smon_status=smon_status, smon_error=stderr, action=action, sort=sort, user_services=user_params['user_services'], user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], token=user_params['token'] ) diff --git a/app/statsview.py b/app/statsview.py index 5babd11d..2e995e5e 100644 --- a/app/statsview.py +++ b/app/statsview.py @@ -27,14 +27,13 @@ except Exception: if service in ('haproxy', 'nginx', 'apache'): service_desc = sql.select_service(service) if roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id): - title = f'{service_desc.service} stats page' roxywi_common.get_dick_permit(service=service_desc.slug) else: print('') rendered_template = template.render( - h2=1, autorefresh=1, title=title, role=user_params['role'], user=user_params['user'], onclick="showStats()", + h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], onclick="showStats()", selects=user_params['servers'], serv=serv, service=service, user_services=user_params['user_services'], - token=user_params['token'], select_id="serv" + token=user_params['token'], select_id="serv", lang=user_params['lang'], service_desc=service_desc ) print(rendered_template) diff --git a/app/templates/add.html b/app/templates/add.html index c0aab003..49da1712 100644 --- a/app/templates/add.html +++ b/app/templates/add.html @@ -21,16 +21,16 @@
    @@ -38,9 +38,9 @@
    - + - + - + - + - + - + - + - + @@ -163,54 +157,35 @@ - + - + - +

    Add listen

    {{lang.words.add|title()}} {{lang.words.listener}}

    Select a server: {{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: -
    Note: If you re-configure the master server, the slave server will be re-configured automatically
    +
    {{lang.words.note|title()}}: {{lang.phrases.master_slave}}
    - A "listen" section defines a complete proxy with its frontend and backend parts combined in one section. It is generally useful for TCP-only traffic. + {{lang.add_page.desc.listener_desc1}}

    - All proxy names must be formed from upper and lower case letters, digits, '-' (dash), '_' (underscore) , '.' (dot) and ':' (colon). ACL names are - case-sensitive, which means that "www" and "WWW" are two different proxies. + {{lang.add_page.desc.listener_desc2}}

    - Historically, all proxy names could overlap, it just caused troubles in the logs. Since the introduction of content switching, it is mandatory that two - proxies with overlapping capabilities (frontend/backend) have different names. However, it is still permitted that a frontend and a backend share the same - name, as this configuration seems to be commonly encountered. + {{lang.add_page.desc.listener_desc3}}
    Name:{{lang.words.name|title()}}: - {{ input('name', name='listener', title="Name Listener", placeholder="web_80", required='required') }} + {{ input('name', name='listener', title=lang.words.name|title() + ' ' +lang.words.listener, placeholder="web_80", required='required') }}
    IP and Port:IP and {{lang.words.port|title()}}: {{ input('ip', placeholder="Any", size='15') }}: - {{ input('listen-port', name='port', title="Port for bind listen", placeholder="8080", size='5', required='required') }} + {{ input('listen-port', name='port', title=lang.add_page.desc.port_for_bind + ' ' + lang.words.listener, placeholder="8080", size='5', required='required') }} - +
    - If the IP-address for the listener is empty, it will listen on all IP addresses. - Start typing IP or press down button. Click on + to add multiple IP-port pairs. If you are using VRRP, - leave the IP field blank. If you assign a VRRP IP, the slave server will not start. + {{lang.add_page.desc.ip_port}}
    Mode: {{lang.words.mode|title()}}: {% set values = dict() %} {% set values = {'http':'http','tcp':'tcp'} %} {{ select('listen-mode-select', name='mode', values=values, selected='http', required='required', class='force_close') }} - +
    Maxconn: - {{ input('maxconn', value='2000', type="number", title="Fix the maximum number of concurrent connections on a frontend", size='5', required='required') }} -
    This value should not exceed the global maxconn. Default global maxconn value: 2000
    + {{ input('maxconn', value='2000', type="number", title=lang.add_page.desc.maxconn_fix, size='5', required='required') }} +
    {{lang.add_page.desc.maxconn_desc}}: 2000
    Balance: {{lang.words.balance|title()}}: {{ select('balance', values=balance_params, selected='roundrobin', required='required', class='force_close') }}
    Health check: {{lang.words.health|title()}} {{lang.words.check}}: {{ select('listener_checks', name='health_check', values=checks, selected='', class='force_close') }} @@ -144,18 +139,17 @@

    - +
    Web acceleration:Web {{lang.words.acceleration}}: - {{ checkbox('compression', title='HTTP compression allows you to shrink the body of a response before it is relayed to a client, which results in using less network bandwidth per request. From a client\'s perspective, this reduces latency.', - value='1', desc='Compression') }} - {{ checkbox('cache', title='Enable cache', value='2', desc='Cache') }} - {{ checkbox('ssl_offloading', title='Enable redirection from HTTP scheme to HTTPS scheme', desc='HTTP->HTTPS') }} + {{ checkbox('compression', title=lang.add_page.desc.http_compression, value='1', desc=lang.words.compression|title()) }} + {{ checkbox('cache', title=lang.words.enable|title()+' '+lang.words.cache, value='2', desc=lang.words.cache|title()) }} + {{ checkbox('ssl_offloading', title=lang.add_page.desc.http_https, desc='HTTP->HTTPS') }}
    WAF: - {{ checkbox('slow_atack', title='In a Slow POST attack, an attacker begins by sending a legitimate HTTP POST header to a Web server, exactly as they would under normal circumstances. The header specifies the exact size of the message body that will then follow. However, that message body is then sent at an alarmingly low rate – sometimes as slow as 1 byte per approximately two minutes.', + {{ checkbox('slow_atack', title=lang.add_page.desc.slow_attack, desc='Slow attack') }} {{ checkbox('ddos', title='DDOS attack protect', desc='DDOS') }} - {{ checkbox('whitelist_checkbox', title='Add whitelist', desc='Whitelist') }} - {{ checkbox('blacklist_checkbox', title='Add blacklist', desc='Blacklist') }} + {{ checkbox('whitelist_checkbox', title=lang.words.enable|title()+' '+ lang.words.whitelist, desc=lang.words.whitelist|title()) }} + {{ checkbox('blacklist_checkbox', title=lang.words.enable|title()+' '+ lang.words.blacklist, desc=lang.words.blacklist|title()) }} {{ checkbox('waf', title='Web application firewall', desc='WAF', value='1') }} - {{ checkbox('antibot', title='Unfortunately, a large portion of bots are used for malicious reasons. Their intentions include web scraping, spamming, request flooding, brute forcing, and vulnerability scanning. For example, bots may scrape your price lists so that competitors can consistently undercut you or build a competitive solution using your data. Or they may try to locate forums and comment sections where they can post spam. At other times, they’re scanning your site looking for security weaknesses.', - desc='Antibot', value='1') }} + {{ checkbox('antibot', title=lang.add_page.desc.antibot, desc='Antibot', value='1') }}
    Options:{{lang.words.options|title()}}: - {{ checkbox('forward_for', title='When HAProxy Enterprise proxies a TCP connection, it overwrites the client\'s source IP address with its own when communicating with the backend server. However, when relaying HTTP messages, it can store the client\'s address in the HTTP header X-Forwarded-For. The backend server can then be configured to read the value from that header to retrieve the client\'s IP address.', - desc='Forward for') }} - {{ checkbox('redispatch', title='In HTTP mode, if a server designated by a cookie is down, clients may - definitely stick to it because they cannot flush the cookie, so they will not - be able to access the service anymore. - Specifying "option redispatch" will allow the proxy to break their - persistence and redistribute them to a working server. - It also allows to retry connections to another server in case of multiple - connection failures. Of course, it requires having "retries" set to a nonzero - value.', desc='Redispatch') }} + {{ checkbox('forward_for', title=lang.add_page.desc.forward_for, desc='Forward for') }} + {{ checkbox('redispatch', title=lang.add_page.desc.redispatch, desc='Redispatch') }} {% set values = dict() %} {% set values = {'Off':'Off','Server only':'Server only','Force close':'Force close','Pretend keep alive':'Pretend keep alive'} %} - {{ select('force_close', values=values, first='Force HTTP close', title='Since HAProxy works in reverse-proxy mode, the servers see its IP address as -their client address. This is sometimes annoying when the client\'s IP address -is expected in server logs. To solve this problem, the well-known HTTP header -"X-Forwarded-For" may be added by HAProxy to all requests sent to the server. -This header contains a value representing the client\'s IP address. Since this -header is always appended at the end of the existing header list, the server -must be configured to always use the last occurrence of this header only. See -the server\'s manual to find how to enable use of this standard header. Note -that only the last occurrence of the header must be used, since it is really -possible that the client has already brought one.', class='force_close') }} - {{ checkbox('cookie', title='To send a client to the same server where they were sent previously in order to reuse a session on that server, you can enable cookie-based session persistence. Add a cookie directive to the backend section and set the cookie parameter to a unique value on each server line.', - desc='Set cookie', value='1') }} - {{ checkbox('options-listen-show', title='Set options manually', desc='Set options') }} + {{ select('force_close', values=values, first='Force HTTP close', title=lang.add_page.desc.force_close, class='force_close') }} + {{ checkbox('cookie', title=lang.add_page.desc.cookie, desc=lang.words.set|title()+' cookie', value='1') }} + {{ checkbox('options-listen-show', title=lang.add_page.buttons.set_options_m, desc=lang.add_page.buttons.set_options) }}
    Servers:{{lang.words.servers|title()}}: {% include 'include/add_servers.html' %}

    - {{ checkbox('template-listen', name='template', title='Сreate the list of servers from the template', value='template', desc='Server-template') }} + {{ checkbox('template-listen', name='template', title=lang.add_page.desc.server_template, value='template', desc=lang.add_page.desc.server_template) }}
    Check:{{lang.words.check|title()}}:
    - + - Default params: inter 2000 rise 2 fall 5 + {{lang.add_page.desc.def_check}}: inter 2000 rise 2 fall 5
    - {{ checkbox('circuit_breaking_listen', name="circuit_breaking", desc='Circuit Breaking', title='Circuit breaker is a design pattern which is used to detect failures and encapsulates the logic of preventing a failure from constantly recurring. The circuit breaker design pattern works much like an electrical circuit breaker which is intended to “trip” or open the circuit when failure is detected.', - value='1') }} + {{ checkbox('circuit_breaking_listen', name="circuit_breaking", desc='Circuit Breaking', title=lang.add_page.desc.circuit_breaking, value='1') }}
    - - + +
    - Add Listen + {{lang.words.add|title()}} {{lang.words.linstener|title()}} - Generate config + {{lang.words.generate|title()}} {{lang.words.config}}
    @@ -312,9 +286,9 @@ possible that the client has already brought one.', class='force_close') }}
    - + - + - + - + - + @@ -374,8 +343,8 @@ possible that the client has already brought one.', class='force_close') }} @@ -403,13 +372,12 @@ possible that the client has already brought one.', class='force_close') }} - + @@ -417,74 +385,64 @@ possible that the client has already brought one.', class='force_close') }} - + - + @@ -492,7 +450,7 @@ possible that the client has already brought one.', class='force_close') }} Add Frontend

    Add frontend

    {{lang.words.add|title()}} {{lang.words.frontend}}

    Select a server: {{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: -
    Note: If you re-configure the master server, the slave server will be re-configured automatically
    +
    {{lang.words.note|title()}}: {{lang.phrases.master_slave}}
    - A "frontend" section describes a set of listening sockets accepting client connections. + {{lang.add_page.desc.front_desc1}}

    - All proxy names must be formed from upper and lower case letters, digits, '-' (dash), '_' (underscore) , '.' (dot) and ':' (colon). ACL names are - case-sensitive, which means that "www" and "WWW" are two different proxies. + {{lang.add_page.desc.listener_desc2}}

    - Historically, all proxy names could overlap, it just caused troubles in the logs. Since the introduction of content switching, it is mandatory that two - proxies with overlapping capabilities (frontend/backend) have different names. However, it is still permitted that a frontend and a backend share the same - name, as this configuration seems to be commonly encountered. + {{lang.add_page.desc.listener_desc1}}
    Name:{{lang.words.name|title()}}: - +
    IP and Port:IP and {{lang.words.port|title()}}: : - + - +
    - If the IP-address for the listener is empty, it will listen on all IP addresses. - Start typing IP or press down button. Click on + to add multiple IP-port pairs. If you are using VRRP, - leave the IP field blank. If you assign a VRRP IP, the slave server will not start. + {{lang.add_page.desc.ip_port}}
    Mode: {{lang.words.mode|title()}}: {% set values = dict() %} {% set values = {'http':'http','tcp':'tcp'} %} {{ select('frontend-mode-select', name='mode', values=values, selected='http', required='required', class='force_close') }} - {{ checkbox('https-frontend', title='The term SSL termination means that you are performing all encryption and decryption at the edge of your network, such as at the load balancer.', desc='SSL Offloading') }} + {{ checkbox('https-frontend', title=lang.add_page.desc.ssl_offloading, desc='SSL Offloading') }}
    Maxconn: - {{ input('maxconn', value='2000', type="number", title="Fix the maximum number of concurrent connections on a frontend", size='5', required='required') }} -
    This value should not exceed the global maxconn. Default global maxconn value: 2000
    + {{ input('maxconn', value='2000', type="number", title=lang.add_page.desc.maxconn_fix, size='5', required='required') }} +
    {{lang.add_page.desc.maxconn_desc}}: 2000
    Web acceleration:Web {{lang.words.acceleration}}: - {{ checkbox('compression2', name="compression", title='HTTP compression allows you to shrink the body of a response before it is relayed to a client, which results in using less network bandwidth per request. From a client\'s perspective, this reduces latency.', - value='1', desc='Compression') }} - {{ checkbox('cache2', name="cache", title='Enable cache', value='2', desc='Cache') }} - {{ checkbox('ssl_offloading1', title='Enable redirection from HTTP scheme to HTTPS scheme', desc='HTTP->HTTPS') }} + {{ checkbox('compression2', name="compression", title=lang.add_page.desc.http_compression, value='1', desc=lang.words.compression|title()) }} + {{ checkbox('cache2', name="cache", title=lang.words.enable|title()+' '+lang.words.cache, value='2', desc=lang.words.cache|title()) }} + {{ checkbox('ssl_offloading1', title=lang.add_page.desc.http_https, desc='HTTP->HTTPS') }}
    WAF: - {{ checkbox('slow_atack1', title='In a Slow POST attack, an attacker begins by sending a legitimate HTTP POST header to a Web server, exactly as they would under normal circumstances. The header specifies the exact size of the message body that will then follow. However, that message body is then sent at an alarmingly low rate – sometimes as slow as 1 byte per approximately two minutes.', + {{ checkbox('slow_atack1', title=lang.add_page.desc.slow_attack, desc='Slow attack') }} {{ checkbox('ddos1', title='DDOS attack protect', desc='DDOS') }} - {{ checkbox('whitelist_checkbox1', title='Add whitelist', desc='Whitelist') }} - {{ checkbox('blacklist_checkbox1', title='Add blacklist', desc='Blacklist') }} + {{ checkbox('whitelist_checkbox1', title=lang.words.enable|title()+' '+ lang.words.whitelist, desc=lang.words.whitelist|title()) }} + {{ checkbox('blacklist_checkbox1', title=lang.words.enable|title()+' '+ lang.words.blacklist, desc=lang.words.blacklist|title()) }} {{ checkbox('waf2', name='waf', title='Web application firewall', desc='WAF', value='1') }} - {{ checkbox('antibot1', title='Unfortunately, a large portion of bots are used for malicious reasons. Their intentions include web scraping, spamming, request flooding, brute forcing, and vulnerability scanning. For example, bots may scrape your price lists so that competitors can consistently undercut you or build a competitive solution using your data. Or they may try to locate forums and comment sections where they can post spam. At other times, they’re scanning your site looking for security weaknesses.', - desc='Antibot', value='1') }} + {{ checkbox('antibot1', title=lang.add_page.desc.antibot, desc='Antibot', value='1') }}
    Options:{{lang.words.options|title()}}: - {{ checkbox('forward_for1', title='When HAProxy Enterprise proxies a TCP connection, it overwrites the client\'s source IP address with its own when communicating with the backend server. However, when relaying HTTP messages, it can store the client\'s address in the HTTP header X-Forwarded-For. The backend server can then be configured to read the value from that header to retrieve the client\'s IP address.', + {{ checkbox('forward_for1', title=lang.add_page.desc.forward_for, desc='Forward for') }} {% set values = dict() %} {% set values = {'Off':'Off','Server only':'Server only','Force close':'Force close','Pretend keep alive':'Pretend keep alive'} %} - {{ select('force_close', values=values, first='Force HTTP close', title='Since HAProxy works in reverse-proxy mode, the servers see its IP address as -their client address. This is sometimes annoying when the client\'s IP address -is expected in server logs. To solve this problem, the well-known HTTP header -"X-Forwarded-For" may be added by HAProxy to all requests sent to the server. -This header contains a value representing the client\'s IP address. Since this -header is always appended at the end of the existing header list, the server -must be configured to always use the last occurrence of this header only. See -the server\'s manual to find how to enable use of this standard header. Note -that only the last occurrence of the header must be used, since it is really -possible that the client has already brought one.', class='force_close') }} - {{ checkbox('options-frontend-show', title='Set options manually', desc='Set options') }} + {{ select('force_close', values=values, first='Force HTTP close', title=lang.add_page.desc.force_close, class='force_close') }} + {{ checkbox('options-frontend-show', title=lang.add_page.buttons.set_options_m, desc=lang.add_page.buttons.set_options) }}
    Default backend{{lang.words.default_backend}} - {{ input('backends', name='backends', placeholder="some_backend", size='30', title='If no condition is valid, the backend defined with "default_backend" will be used. If no default backend is defined, either the servers in the same section are used (in case of a "listen" section) or, in case of a frontend, no server is used and a 503 service unavailable response is returned.') }} + {{ input('backends', name='backends', placeholder="some_backend", size='30', title=lang.add_page.desc.no_def_backend) }}
    - Note. If you want to use the default backend, backend must exist. + {{lang.words.note|title()}}: {{lang.add_page.desc.def_backend}}, {{lang.add_page.desc.def_backend_exit}}.
    - - + +
    - Generate config + {{lang.words.generate|title()}} {{lang.words.config}}
    @@ -504,9 +462,9 @@ possible that the client has already brought one.', class='force_close') }}
    - + - + - + - + - + - + - + - + - + - +

    Add backend

    {{lang.words.add|title()}} {{lang.words.backend}}

    Select a server: {{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: -
    Note: If you re-configure the master server, the slave server will be re-configured automatically
    +
    {{lang.words.note|title()}}: {{lang.phrases.master_slave}}
    - A "backend" section describes a set of servers to which the proxy will connect to forward incoming connections. + {{lang.add_page.desc.back_des1}}

    - All proxy names must be formed from upper and lower case letters, digits, '-' (dash), '_' (underscore) , '.' (dot) and ':' (colon). ACL names are - case-sensitive, which means that "www" and "WWW" are two different proxies. + {{lang.add_page.desc.listener_desc2}}

    - Historically, all proxy names could overlap, it just caused troubles in the logs. Since the introduction of content switching, it is mandatory that two - proxies with overlapping capabilities (frontend/backend) have different names. However, it is still permitted that a frontend and a backend share the same - name, as this configuration seems to be commonly encountered. + {{lang.add_page.desc.listener_desc3}}
    Name:{{lang.words.name|title()}}: - {{ input('new_backend', title="Name backend", placeholder="web_80", required='required') }} + {{ input('new_backend', title=lang.words.name|title() + ' ' +lang.words.backend, placeholder="web_80", required='required') }}
    Mode: {{lang.words.mode|title()}}: {% set values = dict() %} {% set values = {'http':'http','tcp':'tcp'} %} @@ -544,19 +499,19 @@ possible that the client has already brought one.', class='force_close') }}
    Balance: {{lang.words.balance|title()}}: {{ select('balance', values=balance_params, selected='roundrobin', required='required', class='force_close') }}
    Health check: {{lang.words.health|title()}} {{lang.words.check}}: {{ select('backend_checks', name='health_check', values=checks, selected='', class='force_close') }} @@ -583,7 +538,7 @@ possible that the client has already brought one.', class='force_close') }} {{ select('backend_acl_then', name='acl_then', values=values, first='Choose action', class='force_close', disabled=false) }} value {{ input('backend_acl_then_value', name='acl_then_value', title="Required if \'then\' is \'Use backend\', \'Redirect\', \'Return\', or \'Set-header\'") }} - +

    @@ -592,36 +547,26 @@ possible that the client has already brought one.', class='force_close') }}
    Web acceleration:Web {{lang.words.acceleration}}: - {{ checkbox('compression3', name="compression", title='HTTP compression allows you to shrink the body of a response before it is relayed to a client, which results in using less network bandwidth per request. From a client\'s perspective, this reduces latency.', - value='1', desc='Compression') }} - {{ checkbox('cache3', name="cache", title='Enable cache', value='2', desc='Cache') }} - {{ checkbox('ssl_offloading2', title='The term SSL termination means that you are performing all encryption and decryption at the edge of your network, such as at the load balancer.', desc='SSL Offloading') }} + {{ checkbox('compression3', name="compression", title=lang.add_page.desc.http_compression, value='1', desc=lang.words.compression|title()) }} + {{ checkbox('cache3', name="cache", title=lang.words.enable|title()+' '+lang.words.cache, value='2', desc=lang.words.cache|title()) }} + {{ checkbox('ssl_offloading2', title=lang.add_page.desc.http_https, desc='SSL Offloading') }}
    Options:{{lang.words.options|title()}}: - {{ checkbox('forward_for2', title='When HAProxy Enterprise proxies a TCP connection, it overwrites the client\'s source IP address with its own when communicating with the backend server. However, when relaying HTTP messages, it can store the client\'s address in the HTTP header X-Forwarded-For. The backend server can then be configured to read the value from that header to retrieve the client\'s IP address.', - desc='Forward for') }} - {{ checkbox('redispatch2', title='In HTTP mode, if a server designated by a cookie is down, clients may - definitely stick to it because they cannot flush the cookie, so they will not - be able to access the service anymore. - Specifying "option redispatch" will allow the proxy to break their - persistence and redistribute them to a working server. - It also allows to retry connections to another server in case of multiple - connection failures. Of course, it requires having "retries" set to a nonzero - value.', desc='Redispatch') }} + {{ checkbox('forward_for2', title=lang.add_page.desc.forward_for, desc='Forward for') }} + {{ checkbox('redispatch2', title=lang.add_page.desc.redispatch, desc='Redispatch') }} {% set values = dict() %} {% set values = {'Off':'Off','Server only':'Server only','Force close':'Force close','Pretend keep alive':'Pretend keep alive'} %} - {{ select('force_close', values=values, first='Force HTTP close', title='123', class='force_close') }} - {{ checkbox('cookie2', title='To send a client to the same server where they were sent previously in order to reuse a session on that server, you can enable cookie-based session persistence. Add a cookie directive to the backend section and set the cookie parameter to a unique value on each server line.', - desc='Set cookie', value='1') }} - {{ checkbox('options-backend-show', title='Set options manually', desc='Set options') }} + {{ select('force_close', values=values, first='Force HTTP close', title=lang.add_page.desc.force_close, class='force_close') }} + {{ checkbox('cookie2', title=lang.add_page.desc.cookie, desc=lang.words.set|title()+' cookie', value='1') }} + {{ checkbox('options-backend-show', title=lang.add_page.buttons.set_options_m, desc=lang.add_page.buttons.set_options) }}
    Servers:{{lang.words.servers|title()}}: {% include 'include/add_servers.html' %}

    - {{ checkbox('template-backend', name='template', title='Create the list of servers from the template', value='template', desc='Server-template') }} + {{ checkbox('template-backend', name='template', title=lang.add_page.desc.server_template, value='template', desc=lang.add_page.desc.server_template) }}
    Check:{{lang.words.check|title()}}:
    - + - Default params: inter 2000 rise 2 fall 5 + {{lang.add_page.desc.def_check}}: inter 2000 rise 2 fall 5
    - {{ checkbox('circuit_breaking_backend', name="circuit_breaking", desc='Circuit Breaking', title='Circuit breaker is a design pattern which is used to detect failures and encapsulates the logic of preventing a failure from constantly recurring. The circuit breaker design pattern works much like an electrical circuit breaker which is intended to “trip” or open the circuit when failure is detected.', - value='1') }} + {{ checkbox('circuit_breaking_backend', name="circuit_breaking", desc='Circuit Breaking', title=lang.add_page.desc.circuit_breaking, value='1') }}
    - - + +
    - Add Backend + {{lang.words.add|title()}} {{lang.words.backend|title()}} - Generate config + {{lang.words.generate|title()}} {{lang.words.config}}
    @@ -722,9 +666,9 @@ possible that the client has already brought one.', class='force_close') }} - + @@ -736,19 +680,19 @@ possible that the client has already brought one.', class='force_close') }} {% endfor %} - + - + @@ -765,16 +709,16 @@ possible that the client has already brought one.', class='force_close') }}

    SSL

    View certificates{{lang.words.view|title()}} {{lang.words.cert2}} - Uploaded certificates + {{lang.words.upload|title()}} {{lang.words.certs}}
    Upload SSL certificates{{lang.words.upload|title()}} SSL {{lang.words.certs}} - Certificate name + {{lang.words.cert_name|title()}} - Paste the contents of the certificate file + {{lang.add_page.desc.paste_cert}}


    - +
    - - - + + + @@ -793,7 +737,7 @@ possible that the client has already brought one.', class='force_close') }} {{ input('lets_email') }}

    Let's Encrypt

    ServerDomain nameE-mail{{lang.words.server|title()}}{{lang.words.domain|title()}}{{lang.words.email|title()}}
    - +
    @@ -803,7 +747,7 @@ possible that the client has already brought one.', class='force_close') }} - + {% for option in options %} @@ -816,49 +760,43 @@ possible that the client has already brought one.', class='force_close') }} {% endif %} {% endfor %}
    IdOptions{{lang.words.params|title()}}
    - +
    -
    + Add +
    + {{lang.words.add|title()}}

    - +
    - In this section you can create, edit and delete options with given parameters. And after use them as autocomplete in the "Add" sections -
    -
    - How to use predefined option you can see in - - this video - + {{lang.add_page.desc.options}}
    - - + + {% for s in saved_servers %} @@ -871,18 +809,18 @@ possible that the client has already brought one.', class='force_close') }} {% endif %} {% endfor %}
    ServerDescription{{lang.words.server|title()}}{{lang.words.desc|title()}}
    - +
    -
    + Add +
    + {{lang.words.add|title()}}

    - - + + @@ -893,27 +831,21 @@ possible that the client has already brought one.', class='force_close') }} {{ input('new-saved-servers-description', size='50') }}
    - In this section you can create, edit and delete servers. And after use them as autocomplete in the "Add" sections -
    -
    - How to use predefined servers you can see in - - this video - + {{lang.add_page.desc.servers}}
    - + - + - + - + - + - +

    Add Userlist

    {{lang.words.add|title()}} {{lang.words.userlists}}

    Select a server: {{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: -
    Note: If you reconfigure Master server, Slave will be re-configured automatically
    -
    - It is possible to control access to frontend/backend/listen sections or to - http stats by allowing only authenticated and authorized users. To do this, - it is required to create at least one userlist and to define users. +
    {{lang.words.note|title()}}: {{lang.phrases.master_slave}}
    {{lang.add_page.desc.userlist_desc}}
    Userlist name:{{lang.words.name|title()}}: - {{ input('new_userlist', required='required', title="Userlist name", placeholder="basic-auth-list") }} + {{ input('new_userlist', required='required', title=lang.add_page.desc.userlist_name, placeholder="basic-auth-list") }}
    Groups:{{lang.words.groups|title()}}: - {{ input('userlist-group', title="User`s group", placeholder="group_name") }} + {{ input('userlist-group', title=lang.add_page.desc.userlist_user_grp, placeholder="group_name") }} -
    It is also possible to attach users to this group by using a comma separated list of names preceded by "users" keyword.
    +
    {{lang.add_page.desc.userlist_group}}
    User:{{lang.words.user|title()}}: - {{ input('userlist-user', required='required', title="Username", placeholder="user_name") }} - {{ input('userlist-password', required='required', title="User password. By default, it insecure-password", placeholder="password") }} - {{ input('userlist-user-group', title="User`s group", placeholder="user`s group") }} + {{ input('userlist-user', required='required', title=lang.words.username|title(), placeholder="user_name") }} + {{ input('userlist-password', required='required', title=lang.add_page.desc.userlist_pass, placeholder="password") }} + {{ input('userlist-user-group', title=lang.add_page.desc.userlist_user_grp, placeholder="group") }} -
    It is also possible to attach groups to this user by using a comma separated list of groups.
    +
    {{lang.add_page.desc.userlist_user}}
    - Add Userlist + {{lang.words.add|title()}} {{lang.words.userlist|title()}} - Generate config + {{lang.words.generate|title()}} {{lang.words.config}}

    - + - + - +

    Existing UserList

    {{lang.words.existing|title()}} {{lang.words.userlists}}

    Select a server: {{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: -
    Note: If you reconfigure Master server, Slave will be re-configured automatically
    +
    {{lang.words.note|title()}}: {{lang.phrases.master_slave}}
    - Show Userlist + {{lang.words.show|title()}} {{lang.words.userlists}}
    - In this section you can create userlists. And after use them in the "Add" sections + {{lang.add_page.desc.userlist}}
    - Read - - here + {{lang.words.read|title()}} + + {{lang.words.here}} - How to use userlists + {{lang.phrases.howto_user}} {{lang.words.userlists}}
    - + - + - + - +

    Add Peer

    {{lang.words.add|title()}} Peer

    Select server: {{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: -
    Note: If you re-configure Master server, Slave will be re-configured automatically
    +
    {{lang.words.note|title()}}: {{lang.phrases.master_slave}}
    - The peers section enables the replication of stick table data between two or more HAProxy instances. + {{lang.add_page.desc.peers}}
    Peers name:Peers {{lang.words.name}}: - {{ input('peers-name', title="Peers name", placeholder="peers name") }} + {{ input('peers-name', title="Peers "+lang.words.name, placeholder="peers name") }}
    Peers servers:Peers {{lang.words.servers}}: - : + : : - +
    - : + : : - +
    - +
    - Add Peer + {{lang.words.add}} Peer - Generate config + {{lang.words.generate|title()}} {{lang.words.config}}
    - Note: If you would like to use HAProxy services as Master-Master cluster you must set local servers - hostnames as peers servers names. Otherwise, peers will not work + {{lang.add_page.desc.peers_master}}
    - Note: If you would like to use HAProxy services as Master-Slave cluster you must set local server - hostname for master server as peer server name. Otherwise, peers will not work + {{lang.add_page.desc.peers_slave}}
    - Read - - here + {{lang.words.read|title()}} + + {{lang.words.here}} - How to use peers + {{lang.phrases.howto_user}} peers
    - - - + + + @@ -1107,19 +1033,19 @@ possible that the client has already brought one.', class='force_close') }}
    New blacklistServer for uploadingExisting blacklists{{lang.words.new|title()}} {{lang.words.blacklist}}{{lang.words.server|title()}} {{lang.words.for}} {{lang.words.uploading}}{{lang.words.existing|title()}} {{lang.words.blacklists}}
    - Name: {{ input('new_blacklist_name') }} - + {{lang.words.name|title()}}: {{ input('new_blacklist_name') }} + {% for list in black_lists %} - {{ list }} + {{ list }} {% endfor %}
    - - - + + + @@ -1136,11 +1062,11 @@ possible that the client has already brought one.', class='force_close') }}
    New whitelistServer for uploadingExisting whitelists{{lang.words.new|title()}} {{lang.words.whitelist}}{{lang.words.server|title()}} {{lang.words.for}} {{lang.words.uploading}}{{lang.words.existing|title()}} {{lang.words.whitelists}}
    - Name: {{ input('new_whitelist_name') }} - + {{lang.words.name|title()}}: {{ input('new_whitelist_name') }} + {% for list in white_lists %} - {{ list }} + {{ list }} {% endfor %}
    - In this section you can create and edit black and white lists. And after use them in the HAProxy configs or in the "Add proxy" pages. Read how to use it in this - article + {{lang.add_page.desc.lists_howto}} + {{lang.words.article}}
    diff --git a/app/templates/add_nginx.html b/app/templates/add_nginx.html index fe6a8ec1..7f0be709 100644 --- a/app/templates/add_nginx.html +++ b/app/templates/add_nginx.html @@ -1,13 +1,15 @@ {% extends "base.html" %} +{% block title %}{{lang.menu_links.add_proxy.title}}{% endblock %} +{% block h2 %}{{lang.menu_links.add_proxy.title}}{% endblock %} {% block content %} {% from 'include/input_macros.html' import input, checkbox, select %} {% set balance_params = dict() %} -{% set balance_params = {'ip_hash':'ip_hash','least_conn':'least_conn','random':'random'} %} +{% set balance_params = {'ip_hash':'ip_hash','least_conn':'least_conn','random':'random', 'round-robin': 'round-robin'} %}
      @@ -15,9 +17,9 @@
      - + - + - + - + - + - +

      Add upstream

      {{lang.words.add|title()}} upstream

      Select a server: {{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.server}}: -
      Note: If you re-configure the master server, the slave server will be re-configured automatically
      +
      {{lang.words.note|title()}}: {{lang.phrases.master_slave}}
      - The upstream module is used to define groups of servers. + {{lang.add_nginx_page.desc.upstream_desc1}}

      - Defines a group of servers. Servers can listen on different ports. In addition, servers listening on TCP and UNIX-domain sockets can be mixed.. + {{lang.add_nginx_page.desc.upstream_desc2}}

      - By default, requests are distributed between the servers using a weighted round-robin balancing method. + {{lang.add_nginx_page.desc.upstream_desc3}}
      Name:{{lang.words.name|title()}}: {{ input('name', name='upstream', title="Name upstream", placeholder="backend_servers", required='required') }}
      Balance: {{lang.words.balance|title()}}: - {{ select('balance', values=balance_params, selected='least_conn', required='required', class='force_close') }} + {{ select('balance', values=balance_params, selected='round-robin', required='required', class='force_close') }}
      Keepalive:Keepalive: - {{ input('name', name='keepalive', title="The connections parameter sets the maximum number of idle keepalive connections to upstream servers that are preserved in the cache of each worker process. When this number is exceeded, the least recently used connections are closed.", placeholder="32") }} + {{ input('name', name='keepalive', title=lang.add_nginx_page.desc.keepalive, placeholder="32") }}
      Servers:{{lang.words.servers|title()}}: {% include 'include/add_nginx_servers.html' %}
      - - + +
      - Add Upstream + {{lang.words.add|title()}} - Generate config + {{lang.words.generate|title()}} {{lang.words.config}}
      diff --git a/app/templates/admin.html b/app/templates/admin.html index dfe86bb3..52bcc926 100644 --- a/app/templates/admin.html +++ b/app/templates/admin.html @@ -6,17 +6,17 @@ {% include 'include/del_confirm.html' %}
        @@ -29,8 +29,8 @@ - - + + @@ -54,7 +54,7 @@ {% endif %} {% endif %} @@ -64,8 +64,8 @@
        + Add

        - How to setup groups you can read in this article - and this article + {{lang.phrases.read_howto}} {{lang.words.article}} + {{lang.words.and}} {{lang.words.this2}} {{lang.words.article}}
        @@ -89,20 +89,20 @@
        - - - + + +
        NameDescription{{lang.words.name|title()}}{{lang.words.desc|title()}}
        - +
        - Service + {{lang.words.service|title()}} - Actions + {{lang.words.actions|title()}} VersionDescription{{lang.words.version|title()}}{{lang.words.desc|title()}}
        - You can read about services here + {{lang.words.read|title()}} {{lang.words.about}} {{lang.words.services}} {{lang.words.here}}
        @@ -110,25 +110,25 @@ - - - + + + - - + +
        ServiceCurrent versionLatest version{{lang.words.service|title()}}{{lang.words.current2|title()}} {{lang.words.version}}{{lang.words.latest|title()}} {{lang.words.version}} Description{{lang.words.desc|title()}}
        - Note: - For updating you have to use Roxy-WI RPM or DEB. Read here - how to start using repository + {{lang.words.note|title()}}: + {{lang.admin_page.desc.for_updating}}. {{lang.words.read|title()}} {{lang.words.here}} + {{lang.admin_page.desc.how_to_using_repo}}

        - If the Roxy-WI server uses a proxy to connect to the Internet, add the proxy settings to yum.conf + {{lang.admin_page.desc.proxy_settings}}

        - Read more about updating in docs - and changelog + {{lang.words.read|title()}} {{lang.words.about}} {{lang.words.updating}} docs + {{lang.words.and}} changelog
        @@ -157,7 +157,7 @@ width: 100 }); $("#slavefor-{{server.0}}" ).selectmenu({ - width: 130 + width: 115 }); $("#credentials-{{server.0}}" ).selectmenu({ width: 150 diff --git a/app/templates/ajax/alerts_history.html b/app/templates/ajax/alerts_history.html index af26fec6..5327dbb6 100644 --- a/app/templates/ajax/alerts_history.html +++ b/app/templates/ajax/alerts_history.html @@ -24,14 +24,14 @@ - - + + {% if action != "checker_history" %} - + {% endif %} - - - + + + @@ -47,7 +47,7 @@ {% endif %} {{t.1 |upper}} - + {% if action != "checker_history" %} {% endif %} @@ -58,7 +58,7 @@ {% endfor %} {% else %} - Table is empty + {{lang.words.table|title()}} {{lang.words.is}} {{lang.words.empty}} {% endif %} -
        LevelHost{{lang.words.level|title()}}{{lang.words.host|title()}}Port{{lang.words.port|title()}}AlertDateTime{{lang.words.alert|title()}}{{lang.words.date|title()}}{{lang.words.time|title()}}
        {{t.2}}{{t.2}}{{t.3}}
        \ No newline at end of file + diff --git a/app/templates/ajax/config_show.html b/app/templates/ajax/config_show.html index e832ff31..79a8524b 100644 --- a/app/templates/ajax/config_show.html +++ b/app/templates/ajax/config_show.html @@ -1,18 +1,19 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %}
        -

        Config {% if config_file_name != 'undefined' %}{{config_file_name.replace('92', '/')}}{%endif%} from {{serv}}

        +

        {{lang.words.config|title()}} {% if config_file_name != 'undefined' %}{{config_file_name.replace('92', '/')}}{%endif%} {{lang.words.from}} {{serv}} ({{hostname}})

        {% if role <= 3 %} {% if not is_serv_protected or role <= 2 %} - Edit + {{lang.words.edit|title()}} {% if service == 'haproxy' %} - Add + {{lang.words.add|title()}} {% elif service == 'keepalived' %} - Add + {{lang.words.add|title()}} {% endif %} {% endif %} {% endif %} - Expand all - + {{lang.words.expand_all|title()}} +

        @@ -208,7 +209,7 @@ {% if role %} {% if service != 'keepalived' %} - Edit + {{lang.words.edit|title()}} {% endif %} {% endif %} @@ -219,7 +220,7 @@
        {{ line }} {% if role %} - Edit + {{lang.words.edit|title()}} {% endif %}
        @@ -229,12 +230,12 @@
        {{- line -}} {% if role %} - Edit/Delete + {{lang.words.edit|title()}}/{{lang.words.delete|title()}} {% endif %} {%- set backend = line.split(' ') -%} - Stats + {{lang.words.stats|title()}} {%- set backend = backend|join('_') -%} {%- do section_name.update({i: backend}) -%} @@ -246,12 +247,12 @@
        {{ line }} {% if role %} - Edit/Delete + {{lang.words.edit|title()}}/{{lang.words.delete|title()}} {% endif %} {% set backend = line.split(' ') %} - Stats + {{lang.words.stats|title()}} {% set backend = backend|join('_') %} {% do section_name.update({i: backend}) %} @@ -263,12 +264,12 @@
        {{ line }} {% if role %} - Edit/Delete + {{lang.words.edit|title()}}/{{lang.words.delete|title()}} {% endif %} {% set backend = line.split(' ') %} - Stats + {{lang.words.stats|title()}}
        {% continue %} @@ -277,7 +278,7 @@
        {{ line }} {% if role %} - Edit/Delete + {{lang.words.edit|title()}}/{{lang.words.delete|title()}} {% endif %}
        @@ -287,7 +288,7 @@
        {{ line }} {% if role %} - Edit/Delete + {{lang.words.edit|title()}}/{{lang.words.delete|title()}} {% endif %}
        @@ -297,7 +298,7 @@
        {{ line }} {% if role %} - Edit/Delete + {{lang.words.edit|title()}}/{{lang.words.delete|title()}} {% endif %}
        @@ -307,7 +308,7 @@
        {{ line }} {% if role %} - Edit/Delete + {{lang.words.edit|title()}}/{{lang.words.delete|title()}} {% endif %}
        @@ -317,7 +318,7 @@
        {{ line }} {% if role %} - Edit/Delete + {{lang.words.edit|title()}}/{{lang.words.delete|title()}} {% endif %}
        @@ -354,7 +355,7 @@ {%- set bind = bind.split(' ') -%} {%- endif -%} {%- endif -%} @@ -370,17 +371,17 @@ - + {% if is_restart|int == 0 %} - + {% endif %} {% if service != 'keepalived' %} - + {% endif %} {% endif %} {% endif %} -
        Note: If you reconfigure Master server, Slave will be reconfigured automatically
        +
        {{lang.words.note|title()}}: {{lang.phrases.master_slave|title()}}
        {% endif %} \ No newline at end of file + diff --git a/app/templates/ajax/show_log_files.html b/app/templates/ajax/show_log_files.html index 96367ffe..54c6a80c 100644 --- a/app/templates/ajax/show_log_files.html +++ b/app/templates/ajax/show_log_files.html @@ -1,5 +1,6 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %} {% for g in groups %} diff --git a/app/templates/ajax/show_user_groups.html b/app/templates/ajax/show_user_groups.html index 117d2942..f2022309 100644 --- a/app/templates/ajax/show_user_groups.html +++ b/app/templates/ajax/show_user_groups.html @@ -1,3 +1,4 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %} - + -
        Select one or more groups{{lang.words.select|title()}} {{lang.words.one}} {{lang.words.or}} {{lang.words.more}} {{lang.words.groups2}}
        \ No newline at end of file + diff --git a/app/templates/ajax/show_user_services.html b/app/templates/ajax/show_user_services.html index dac23ab3..2951c857 100644 --- a/app/templates/ajax/show_user_services.html +++ b/app/templates/ajax/show_user_services.html @@ -1,3 +1,4 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %} - + -
        Select one or more services{{lang.words.select|title()}} {{lang.words.one2}} {{lang.words.or}} {{lang.words.more}} {{lang.words.services2}}
        \ No newline at end of file + diff --git a/app/templates/ajax/show_users_ovw.html b/app/templates/ajax/show_users_ovw.html index b3f15402..f196959e 100644 --- a/app/templates/ajax/show_users_ovw.html +++ b/app/templates/ajax/show_users_ovw.html @@ -1,3 +1,4 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %} {% set counter = 0 %} {% for USER in users %} {% set counter = counter + loop.index0 %} @@ -5,16 +6,16 @@ {% if USER.last_login %} - + {% else %} - + {% endif %} {% if USER.last_login_date == '0000-00-00 00:00:00' %} - {% set last_login_date = 'Never' %} + {% set last_login_date = lang.words.never %} {% else %} {% set last_login_date = USER.last_login_date %} {% endif %} - {{ USER.username }} + {{ USER.username }} {% for group in users_groups %} @@ -31,16 +32,16 @@ {% if USER.last_login %} - + {% else %} - + {% endif %} {% if USER.last_login_date == '0000-00-00 00:00:00' %} - {% set last_login_date = 'Never' %} + {% set last_login_date = lang.words.never %} {% else %} {% set last_login_date = USER.last_login_date %} {% endif %} - {{ USER.username }} + {{ USER.username }} {% for group in users_groups %} diff --git a/app/templates/ajax/smon_dashboard.html b/app/templates/ajax/smon_dashboard.html index 72a089df..71828f7e 100644 --- a/app/templates/ajax/smon_dashboard.html +++ b/app/templates/ajax/smon_dashboard.html @@ -1,7 +1,10 @@ +{% if update %} +{% import 'languages/'+lang|default('en')+'.html' as lang %} +{% endif %}
        - Do not sort | - Sort by status | - Refresh + {{lang.smon_page.desc.do_not_sort}} | + {{lang.smon_page.desc.sort_status}} | + {{lang.words.refresh|title()}} {% set down = [] %} {% set up = [] %} @@ -17,7 +20,7 @@ {% if dis.append(s.group) %} {% endif %} {% endif %} {% endfor %} - Status summary: UP: {{up|length}}, DOWN: {{down|length}}, Disabled: {{dis|length}} + {{lang.smon_page.desc.status_summary}}: {{lang.smon_page.desc.UP}}: {{up|length}}, {{lang.smon_page.desc.DOWN}}: {{down|length}}, {{lang.words.disabled|title()}}: {{dis|length}}
        {% set group = [] %} @@ -48,10 +51,10 @@ {% else %}
        {% if s.ip|string|length > 23 %} @@ -63,7 +66,7 @@ HTTP status check: {{s.http.split(':')[0]}}://{{s.ip}}:{{s.port}}{{s.http.split( {% else %} {% endif %} - {{s.ip}}:{{s.port}} + {{s.ip}}:{{s.port}}
        @@ -71,28 +74,28 @@ HTTP status check: {{s.http.split(':')[0]}}://{{s.ip}}:{{s.port}}{{s.http.split( {% if s.desc is not none %} {{s.desc}} {% else %} - Desc: None + {{lang.words.desc|title()}}: None {% endif %}
        {% if s.en == 1 %} {% if s.status == 1 and s.http_status == 1 and s.body_status == 1 %} - Uptime: + {{lang.words.uptime}}: {% elif s.status == 0 or s.http_status == 0 or s.body_status == 0 %} - Downtime: + {{lang.words.downtime}}: {% else %} - Uptime: N/A + {{lang.words.uptime}}: N/A {% endif %} {% else %} - Uptime: N/A + {{lang.words.uptime}}: N/A {% endif %}
        {% if s.en == 1 %} {% if s.status == 1 %} - Resp time: + {{lang.smon_page.desc.resp_time}}: {% else %} - Last resp time: + {{lang.smon_page.desc.last_resp_time}}: {% endif %} {% if s.responce_time %} {{s.responce_time|truncate(9)}} ms @@ -107,38 +110,38 @@ HTTP status check: {{s.http.split(':')[0]}}://{{s.ip}}:{{s.port}}{{s.http.split( {% if s.status == 1 and s.http_status == 1 and s.body_status == 1 %}
        - UP + {{lang.smon_page.desc.UP}}
        {% elif s.http_status == 0 %}
        - HTTP FAILURE + {{lang.smon_page.desc.HTTP_FAILURE}}
        {% elif s.body_status == 0 %}
        - BODY FAILURE + {{lang.smon_page.desc.BODY_FAILURE}}
        {% elif s.status == 3 %}
        - UNKNOWN + {{lang.smon_page.desc.UNKNOWN}}
        {% else %}
        - PORT DOWN + {{lang.smon_page.desc.PORT_DOWN}}
        {% endif %} {% else %}
        - Disabled + {{lang.words.disabled|title()}}
        {% endif %} @@ -151,4 +154,4 @@ HTTP status check: {{s.http.split(':')[0]}}://{{s.ip}}:{{s.port}}{{s.http.split( {% if sort == 'by_status' %} sort_by_status(); {% endif %} - \ No newline at end of file + diff --git a/app/templates/ajax/stick_table.html b/app/templates/ajax/stick_table.html index 7064e5ed..d2861382 100644 --- a/app/templates/ajax/stick_table.html +++ b/app/templates/ajax/stick_table.html @@ -1,3 +1,4 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %} {% from 'include/input_macros.html' import copy_to_clipboard %} {% if table[0] != '' %} {% set headers = table[0].split(':')[1] %} @@ -22,19 +23,19 @@
        - Table name: {{tables_head.0}} + {{lang.words.table|title()}} {{lang.words.name}}: {{tables_head.0}} - Type: {{tables_head.1}} + {{lang.words.type|title()}}: {{tables_head.1}} - Size: {{tables_head.2|int() / 1024 / 1024}} Mb + {{lang.words.size|title()}}: {{tables_head.2|int() / 1024 / 1024}} Mb - Used: {{tables_head.3}} + {{lang.words.used|title()}}: {{tables_head.3}} - +
        @@ -136,13 +137,13 @@ {% endif %} - + {% endif %} {% endfor %} {% else %} - Table is empty + {{lang.words.table|title()}} {{lang.words.is}} {{lang.words.w_empty}} {% endif %} - \ No newline at end of file + diff --git a/app/templates/ajax/stick_tables.html b/app/templates/ajax/stick_tables.html index a0e61da5..125491e4 100644 --- a/app/templates/ajax/stick_tables.html +++ b/app/templates/ajax/stick_tables.html @@ -1,3 +1,4 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %} {% from 'include/input_macros.html' import copy_to_clipboard %} {%- for t in table %} {%- if t.1.0 != '' -%} @@ -23,19 +24,19 @@
        - Table name:{{t.0.0}} + {{lang.words.table|title()}} {{lang.words.name}}:{{t.0.0}} - Type: {{t.0.1}} + {{lang.words.type|title()}}: {{t.0.1}} - Size: {{t.0.2|int() / 1024 / 1024}} Mb + {{lang.words.size|title()}}: {{t.0.2|int() / 1024 / 1024}} Mb - Used: {{t.0.3}} + {{lang.words.used|title()}}: {{t.0.3}} - +
        @@ -135,7 +136,7 @@ {% endif %} - + {% endif %} @@ -143,7 +144,7 @@ {% else %} - Table is empty + {{lang.words.table|title()}} {{lang.words.is}} {{lang.words.w_empty}} {% endif %}

        diff --git a/app/templates/ajax/table_metrics.html b/app/templates/ajax/table_metrics.html index 9273dd87..9a0ba291 100644 --- a/app/templates/ajax/table_metrics.html +++ b/app/templates/ajax/table_metrics.html @@ -1,25 +1,25 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %} - {% if service == 'haproxy' %} - - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + {% for state in table_stat %} @@ -38,30 +38,4 @@ {% endfor %} - {% else %} - - - - - - - - - - - - - - {% for state in table_stat %} - - - - - - - - - - {% endfor %} - {% endif %}
        ServerAverage sessionsPeak sessionsAverage connectionsPeak connections{{lang.words.server|title}}{{lang.words.average}} {{lang.words.sessions}}{{lang.words.peak|title()}} {{lang.words.sessions}}{{lang.words.average}} {{lang.words.connections}}{{lang.words.peak|title()}} {{lang.words.connections2}}
        1 hour24 hours3 days1 hour24 hours3 days1 hour24 hours3 days1 hour24 hours3 days1 {{lang.words.hour}}24 {{lang.words.hours}}3 {{lang.words.days}}1 {{lang.words.hour}}24 {{lang.words.hours}}3 {{lang.words.days}}1 {{lang.words.hour}}24 {{lang.words.hours}}3 {{lang.words.days}}1 {{lang.words.hour}}24 {{lang.words.hours}}3 {{lang.words.days}}
        {{ state.13 }}
        ServerAverage connectionsPeak connections
        1 hour24 hours3 days1 hour24 hours3 days
        {{ state.1 }}{{ state.2 }}{{ state.3 }}{{ state.4 }}{{ state.5 }}{{ state.6 }}{{ state.7 }}
        \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index 5b578ddd..1659b773 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -1,10 +1,20 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %} - {{title}} + {% block title %}{% endblock %} + {% if title == 'Login page' %} {% endif %} @@ -65,22 +75,22 @@