From f3de2ec64d76d28a7cc8fb4e409688f507c6a496 Mon Sep 17 00:00:00 2001 From: Pavel Loginov Date: Mon, 15 Aug 2022 11:50:29 +0300 Subject: [PATCH] v6.1.4.0 Change log: https://roxy-wi.org/changelog.py#6_1_4 --- app/config.py | 49 +- app/create_db.py | 38 +- app/db_model.py | 1 + app/funct.py | 13 + app/hapservers.py | 62 +- app/history.py | 50 +- app/logs.py | 19 +- app/options.py | 120 +- app/sql.py | 162 ++ app/{viewsttats.py => statsview.py} | 18 +- app/templates/404.html | 10 +- app/templates/500.html | 10 +- app/templates/admin.html | 2 +- app/templates/ajax/alerts_history.html | 2 +- app/templates/ajax/config_show.html | 6 +- app/templates/ajax/overivewWaf.html | 2 +- app/templates/ajax/show_list_version.html | 2 +- app/templates/ajax/show_service_settings.html | 58 +- app/templates/base.html | 31 +- app/templates/config.html | 76 +- app/templates/configver.html | 2 +- app/templates/delver.html | 2 +- app/templates/ha.html | 2 +- app/templates/hapservers.html | 25 +- app/templates/history.html | 2 +- app/templates/include/port_scan_history.html | 2 +- app/templates/login.html | 4 +- app/templates/metrics.html | 2 +- app/templates/provisioning.html | 2 +- app/templates/runtimeapi.html | 16 +- app/templates/sections.html | 34 +- app/templates/servers.html | 2 +- .../{viewstats.html => statsview.html} | 4 +- app/templates/waf.html | 45 +- app/versions.py | 45 +- inc/codemirror/addon/comment/comment.js | 211 +++ inc/codemirror/{ => addon/comment}/dialog.css | 0 inc/codemirror/{ => addon/comment}/dialog.js | 0 inc/codemirror/addon/edit/closebrackets.js | 201 +++ inc/codemirror/addon/edit/matchbrackets.js | 160 ++ inc/codemirror/addon/fold/brace-fold.js | 119 ++ inc/codemirror/addon/fold/comment-fold.js | 59 + inc/codemirror/addon/fold/foldcode.js | 159 ++ inc/codemirror/addon/fold/foldgutter.css | 20 + inc/codemirror/addon/fold/foldgutter.js | 169 +++ inc/codemirror/addon/fold/hardwrap.js | 160 ++ .../{ => addon/fold}/jump-to-line.js | 0 inc/codemirror/{ => addon/fold}/search.js | 0 .../{ => addon/fold}/searchcursor.js | 0 .../addon/scroll/annotatescrollbar.js | 128 ++ .../addon/search/match-highlighter.js | 167 ++ .../addon/search/matchesonscrollbar.js | 97 ++ inc/codemirror/docs.css | 274 ---- inc/codemirror/keymap/sublime.js | 720 +++++++++ inc/codemirror/{ => lib}/codemirror.css | 32 +- inc/codemirror/{ => lib}/codemirror.js | 1342 ++++++++++++----- inc/codemirror/{ => mode}/haproxy.js | 7 +- inc/codemirror/{ => mode}/modsec.js | 3 +- inc/codemirror/{ => mode}/nginx.js | 36 +- inc/configshow.js | 5 +- inc/{ => css}/awesome.css | 0 inc/{ => css}/chart.min.css | 0 inc/{ => css}/jquery-ui.min.css | 2 +- inc/{ => css}/jquery-ui.structure.min.css | 0 inc/{ => css}/nprogress.css | 0 inc/{ => css}/provisioning.css | 0 inc/{ => css}/select2.css | 0 inc/{ => css}/servers.css | 0 inc/{ => css}/style.css | 47 +- inc/{ => css}/table.css | 10 +- inc/{ => css}/toastr.css | 0 inc/overview.js | 21 +- inc/script.js | 48 +- index.html | 20 +- 74 files changed, 4103 insertions(+), 1034 deletions(-) rename app/{viewsttats.py => statsview.py} (67%) rename app/templates/{viewstats.html => statsview.html} (97%) create mode 100644 inc/codemirror/addon/comment/comment.js rename inc/codemirror/{ => addon/comment}/dialog.css (100%) rename inc/codemirror/{ => addon/comment}/dialog.js (100%) create mode 100644 inc/codemirror/addon/edit/closebrackets.js create mode 100644 inc/codemirror/addon/edit/matchbrackets.js create mode 100644 inc/codemirror/addon/fold/brace-fold.js create mode 100644 inc/codemirror/addon/fold/comment-fold.js create mode 100644 inc/codemirror/addon/fold/foldcode.js create mode 100644 inc/codemirror/addon/fold/foldgutter.css create mode 100644 inc/codemirror/addon/fold/foldgutter.js create mode 100644 inc/codemirror/addon/fold/hardwrap.js rename inc/codemirror/{ => addon/fold}/jump-to-line.js (100%) rename inc/codemirror/{ => addon/fold}/search.js (100%) rename inc/codemirror/{ => addon/fold}/searchcursor.js (100%) create mode 100644 inc/codemirror/addon/scroll/annotatescrollbar.js create mode 100644 inc/codemirror/addon/search/match-highlighter.js create mode 100644 inc/codemirror/addon/search/matchesonscrollbar.js delete mode 100644 inc/codemirror/docs.css create mode 100644 inc/codemirror/keymap/sublime.js rename inc/codemirror/{ => lib}/codemirror.css (90%) rename inc/codemirror/{ => lib}/codemirror.js (90%) rename inc/codemirror/{ => mode}/haproxy.js (97%) rename inc/codemirror/{ => mode}/modsec.js (99%) rename inc/codemirror/{ => mode}/nginx.js (97%) rename inc/{ => css}/awesome.css (100%) rename inc/{ => css}/chart.min.css (100%) rename inc/{ => css}/jquery-ui.min.css (67%) rename inc/{ => css}/jquery-ui.structure.min.css (100%) rename inc/{ => css}/nprogress.css (100%) rename inc/{ => css}/provisioning.css (100%) rename inc/{ => css}/select2.css (100%) rename inc/{ => css}/servers.css (100%) rename inc/{ => css}/style.css (97%) rename inc/{ => css}/table.css (98%) rename inc/{ => css}/toastr.css (100%) diff --git a/app/config.py b/app/config.py index e87e63b2..dfd03ca7 100644 --- a/app/config.py +++ b/app/config.py @@ -10,8 +10,8 @@ print('Content-type: text/html\n') funct.check_login() form = funct.form -serv = form.getvalue('serv') -service = form.getvalue('service') +serv = funct.is_ip_or_dns(form.getvalue('serv')) +service = funct.checkAjaxInput(form.getvalue('service')) is_serv_protected = False try: config_file_name = form.getvalue('config_file_name').replace('92', '/') @@ -22,40 +22,31 @@ cfg = "" stderr = "" error = "" aftersave = "" +is_restart = '' try: user, user_id, role, token, servers, user_services = funct.get_users_params() except Exception as e: print(str(e)) -if service == 'keepalived': - if funct.check_login(service=3): - title = "Working with Keepalived configuration files" - action = "config.py?service=keepalived" +if service in ('haproxy', 'nginx', 'keepalived', 'apache'): + service_desc = sql.select_service(service) + if funct.check_login(service=service_desc.service_id): + title = f"Working with {service_desc.service} configuration files" + action = f"config.py?service={service_desc.slug}" configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir') file_format = 'conf' - servers = sql.get_dick_permit(keepalived=1) -elif service == 'nginx': - if funct.check_login(service=2): - title = "Working with NGINX configuration files" - action = "config.py?service=nginx" - configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir') - file_format = 'conf' - servers = sql.get_dick_permit(nginx=1) -elif service == 'apache': - if funct.check_login(service=4): - title = "Working with Apache configuration files" - action = "config.py?service=apache" - configs_dir = funct.get_config_var('configs', 'apache_save_configs_dir') - file_format = 'conf' - servers = sql.get_dick_permit(apache=1) + servers = sql.get_dick_permit(serivce=service_desc.service) + + if service in ('haproxy', 'nginx', 'apache'): + configs_dir = funct.get_config_var('configs', f'{service_desc.service}_save_configs_dir') + else: + configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir') + + if service == 'haproxy': + file_format = 'cfg' else: - if funct.check_login(service=1): - title = "Working with HAProxy configuration files" - action = "config.py" - configs_dir = funct.get_config_var('configs', 'haproxy_save_configs_dir') - file_format = 'cfg' - servers = sql.get_dick_permit(haproxy=1) + print('') if serv is not None: if service == 'nginx' or service == 'apache': @@ -67,6 +58,8 @@ if serv is not None: if serv is not None and form.getvalue('open') is not None and form.getvalue('new_config') is None: funct.check_is_server_in_group(serv) is_serv_protected = sql.is_serv_protected(serv) + server_id = sql.select_server_id_by_ip(serv) + is_restart = sql.select_service_setting(server_id, service, 'restart') if service == 'keepalived': error = funct.get_config(serv, cfg, keepalived=1) @@ -142,7 +135,7 @@ if serv is not None and form.getvalue('config') is not None: template = template.render( h2=1, title=title, role=role, action=action, user=user, select_id="serv", serv=serv, aftersave=aftersave, - config=config_read, cfg=cfg, selects=servers, stderr=stderr, error=error, service=service, + config=config_read, cfg=cfg, selects=servers, stderr=stderr, error=error, service=service, is_restart=is_restart, user_services=user_services, config_file_name=config_file_name, is_serv_protected=is_serv_protected, token=token ) print(template) diff --git a/app/create_db.py b/app/create_db.py index 2e28dcf9..e2376547 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -181,16 +181,21 @@ def default_values(): print(str(e)) data_source = [ - {'service_id': 1, 'service': 'HAProxy'}, - {'service_id': 2, 'service': 'NGINX'}, - {'service_id': 3, 'service': 'Keepalived'}, - {'service_id': 4, 'service': 'Apache'}, + {'service_id': 1, 'service': 'HAProxy', 'slug': 'haproxy'}, + {'service_id': 2, 'service': 'NGINX', 'slug': 'nginx'}, + {'service_id': 3, 'service': 'Keepalived', 'slug': 'keepalived'}, + {'service_id': 4, 'service': 'Apache', 'slug': 'apache'}, ] try: Services.insert_many(data_source).on_conflict_ignore().execute() - except Exception as e: - print(str(e)) + except Exception: + Services.drop_table() + Services.create_table() + try: + Services.insert_many(data_source).on_conflict_ignore().execute() + except Exception as e: + print(str(e)) data_source = [ {'param': 'aws', 'name': 'AWS', 'optgroup': 'aws', 'section': 'provider', 'provider': 'aws', 'image': '/inc/images/provisioning/providers/aws.svg'}, @@ -962,8 +967,25 @@ def update_db_v_6_1_3(**kwargs): pass +def update_db_v_6_1_4(): + servers = Server.select() + services = Services.select() + for server in servers: + for service in services: + service_name = service.service.lower() + setting = 'restart' + if service_name == 'keepalived': + continue + try: + ServiceSetting.insert( + server_id=server.server_id, service=service_name, setting=setting, value=1 + ).on_conflict_ignore().execute() + except Exception: + pass + + def update_ver(): - query = Version.update(version='6.1.3.0') + query = Version.update(version='6.1.4.0') try: query.execute() except Exception: @@ -991,6 +1013,7 @@ def update_all(): update_db_v_6_0_1() update_db_v_6_1_0() update_db_v_6_1_3() + update_db_v_6_1_4() update_ver() @@ -1014,6 +1037,7 @@ def update_all_silent(): update_db_v_6_0(silent=1) update_db_v_6_0_1(silent=1) update_db_v_6_1_3(silent=1) + update_db_v_6_1_4() update_ver() diff --git a/app/db_model.py b/app/db_model.py index f18354d8..a3dc6825 100644 --- a/app/db_model.py +++ b/app/db_model.py @@ -502,6 +502,7 @@ class SystemInfo(BaseModel): class Services(BaseModel): service_id = IntegerField(null=True) service = CharField(null=True) + slug = CharField(null=True) class Meta: table_name = 'services' diff --git a/app/funct.py b/app/funct.py index 308d7c6e..47bf8670 100644 --- a/app/funct.py +++ b/app/funct.py @@ -753,6 +753,7 @@ def install_haproxy(server_ip, **kwargs): if docker == '1': server_id = sql.select_server_id_by_ip(server_ip) sql.insert_or_update_service_setting(server_id, 'haproxy', 'dockerized', '1') + sql.insert_or_update_service_setting(server_id, 'haproxy', 'restart', '1') os.system("rm -f %s" % script) @@ -876,6 +877,7 @@ def install_nginx(server_ip, **kwargs): if docker == '1': server_id = sql.select_server_id_by_ip(server_ip) sql.insert_or_update_service_setting(server_id, 'nginx', 'dockerized', '1') + sql.insert_or_update_service_setting(server_id, 'nginx', 'restart', '1') os.system("rm -f %s" % script) @@ -986,6 +988,7 @@ def upload_and_restart(server_ip, cfg, **kwargs): tmp_file = sql.get_setting('tmp_config_path') + "/" + get_data('config') + ".cfg" is_docker = sql.select_service_setting(server_id, service, 'dockerized') + if is_docker == '1': service_cont_name = service + '_container_name' container_name = sql.get_setting(service_cont_name) @@ -1011,6 +1014,7 @@ def upload_and_restart(server_ip, cfg, **kwargs): action = 'reload' reload_or_restart_command = reload_command else: + is_not_allowed_to_restart(server_id, service) action = 'restart' reload_or_restart_command = restart_command @@ -2090,6 +2094,15 @@ def is_restarted(server_ip, action): sys.exit() +def is_not_allowed_to_restart(server_id: int, service: str) -> bool: + import sql + is_restart = sql.select_service_setting(server_id, service, 'restart') + + if int(is_restart) == 1: + print('warning: this service is not allowed to be restarted') + sys.exit() + + def return_user_status(): import sql diff --git a/app/hapservers.py b/app/hapservers.py index 730a05dc..271151cb 100644 --- a/app/hapservers.py +++ b/app/hapservers.py @@ -17,62 +17,32 @@ user, user_id, role, token, servers, user_services = funct.get_users_params() form = funct.form serv = funct.is_ip_or_dns(form.getvalue('serv')) -service = form.getvalue('service') +service = funct.checkAjaxInput(form.getvalue('service')) autorefresh = 0 servers_waf = () title = "HAProxy servers overview" cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l" keep_alive, stderr = funct.subprocess_execute(cmd) +is_restart = '' +restart_settings = '' -if service == 'nginx': - if funct.check_login(service=2): - title = 'NGINX servers overview' +if service in ('haproxy', 'nginx', 'keepalived', 'apache'): + service_desc = sql.select_service(service) + if funct.check_login(service=service_desc.service_id): + title = f'{service_desc.service} servers overview' if serv: if funct.check_is_server_in_group(serv): servers = sql.select_servers(server=serv) autorefresh = 1 server_id = sql.select_server_id_by_ip(serv) - service_settings = sql.select_docker_service_settings(server_id, service) + docker_settings = sql.select_docker_service_settings(server_id, service_desc.service) + restart_settings = sql.select_restart_service_settings(server_id, service_desc.service) else: - servers = sql.get_dick_permit(virt=1, nginx=1) - service_settings = sql.select_docker_services_settings(service) -elif service == 'keepalived': - if funct.check_login(service=3): - title = 'Keepalived servers overview' - if serv: - if funct.check_is_server_in_group(serv): - servers = sql.select_servers(server=serv) - autorefresh = 1 - server_id = sql.select_server_id_by_ip(serv) - service_settings = sql.select_docker_service_settings(server_id, service) - else: - servers = sql.get_dick_permit(virt=1, keepalived=1) - service_settings = sql.select_docker_services_settings(service) -elif service == 'apache': - if funct.check_login(service=4): - title = 'Apache servers overview' - if serv: - if funct.check_is_server_in_group(serv): - servers = sql.select_servers(server=serv) - autorefresh = 1 - server_id = sql.select_server_id_by_ip(serv) - service_settings = sql.select_docker_service_settings(server_id, service) - else: - servers = sql.get_dick_permit(virt=1, apache=1) - service_settings = sql.select_docker_services_settings(service) + servers = sql.get_dick_permit(virt=1, service=service_desc.slug) + docker_settings = sql.select_docker_services_settings(service_desc.service) + restart_settings = sql.select_restart_services_settings(service_desc.service) else: - if funct.check_login(service=1): - service = 'haproxy' - if serv: - if funct.check_is_server_in_group(serv): - servers = sql.select_servers(server=serv) - autorefresh = 1 - server_id = sql.select_server_id_by_ip(serv) - servers_waf = sql.select_waf_servers_metrics(user_id.value) - service_settings = sql.select_docker_service_settings(server_id, service) - else: - servers = sql.get_dick_permit(virt=1, haproxy=1) - service_settings = sql.select_docker_services_settings(service) + print('') services_name = {'roxy-wi-checker': 'Master backends checker service', 'roxy-wi-keep_alive': 'Auto start service', @@ -106,7 +76,7 @@ for s in servers: cmd = [ "/usr/sbin/nginx -v 2>&1|awk '{print $3}' && systemctl status nginx |grep -e 'Active' |awk " "'{print $2, $9$10$11$12$13}' && ps ax |grep nginx:|grep -v grep |wc -l"] - for service_set in service_settings: + for service_set in docker_settings: if service_set.server_id == s[0] and service_set.setting == 'dockerized' and service_set.value == '1': container_name = sql.get_setting('nginx_container_name') cmd = [ @@ -206,7 +176,7 @@ except Exception as e: template = template.render( h2=1, autorefresh=autorefresh, title=title, role=role, user=user, servers=servers_with_status1, keep_alive=''.join(keep_alive), serv=serv, service=service, services=services, user_services=user_services, - service_settings=service_settings, user_status=user_status, user_plan=user_plan, servers_waf=servers_waf, - token=token + docker_settings=docker_settings, user_status=user_status, user_plan=user_plan, servers_waf=servers_waf, + restart_settings=restart_settings, token=token ) print(template) diff --git a/app/history.py b/app/history.py index faa62c6f..1639dba1 100644 --- a/app/history.py +++ b/app/history.py @@ -21,47 +21,15 @@ serv = funct.is_ip_or_dns(form.getvalue('serv')) service = form.getvalue('service') user_id = form.getvalue('user_id') - -if service == 'nginx': - if funct.check_login(service=2): - title = 'Nginx service history' - if serv: - if funct.check_is_server_in_group(serv): - server_id = sql.select_server_id_by_ip(serv) - history = sql.select_action_history_by_server_id_and_service( - server_id, - service - ) -elif service == 'keepalived': - if funct.check_login(service=3): - title = 'Keepalived service history' - if serv: - if funct.check_is_server_in_group(serv): - server_id = sql.select_server_id_by_ip(serv) - history = sql.select_action_history_by_server_id_and_service( - server_id, - service - ) -elif service == 'apache': - if funct.check_login(service=4): - title = 'Apache service history' - if serv: - if funct.check_is_server_in_group(serv): - server_id = sql.select_server_id_by_ip(serv) - history = sql.select_action_history_by_server_id_and_service( - server_id, - service - ) -elif service == 'haproxy': - if funct.check_login(service=1): - title = "HAProxy service history" - if serv: - if funct.check_is_server_in_group(serv): - server_id = sql.select_server_id_by_ip(serv) - history = sql.select_action_history_by_server_id_and_service( - server_id, - service - ) +if service in ('haproxy', 'nginx', 'keepalived', 'apache'): + service_desc = sql.select_service(service) + if funct.check_login(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 + ) elif service == 'server': if serv: title = serv + ' history' diff --git a/app/logs.py b/app/logs.py index 285efbf6..ae734ef3 100644 --- a/app/logs.py +++ b/app/logs.py @@ -26,7 +26,7 @@ hour1 = form.getvalue('hour1') minut = form.getvalue('minut') minut1 = form.getvalue('minut1') waf = form.getvalue('waf') -service = form.getvalue('service') +service = funct.checkAjaxInput(form.getvalue('service')) remote_file = form.getvalue('file') print('Content-type: text/html\n') @@ -37,22 +37,17 @@ try: except Exception: pass -if service == 'nginx': - if funct.check_login(service=2): - title = "NGINX`s logs" - servers = sql.get_dick_permit(nginx=1) -elif service == 'apache': - if funct.check_login(service=4): - title = "Apache's logs" - servers = sql.get_dick_permit(apache=1) +if service in ('haproxy', 'nginx', 'keepalived', 'apache'): + service_desc = sql.select_service(service) + if funct.check_login(service=service_desc.service_id): + title = f"{service_desc.service}`s logs" + servers = sql.get_dick_permit(service=service_desc.slug) elif waf == '1': if funct.check_login(service=1): title = "WAF logs" servers = sql.get_dick_permit(haproxy=1) else: - if funct.check_login(service=1): - title = "HAProxy`s logs" - servers = sql.get_dick_permit(haproxy=1) + print('') template = template.render( h2=1, autorefresh=1, title=title, role=role, user=user, select_id="serv", selects=servers, diff --git a/app/options.py b/app/options.py index 55f88dca..0048d767 100644 --- a/app/options.py +++ b/app/options.py @@ -443,6 +443,10 @@ if form.getvalue('action_hap') is not None and serv is not None: if funct.check_haproxy_config(serv): server_id = sql.select_server_id_by_ip(server_ip=serv) + + if action == 'restart': + funct.is_not_allowed_to_restart(server_id, 'haproxy') + is_docker = sql.select_service_setting(server_id, 'haproxy', 'dockerized') if is_docker == '1': @@ -471,7 +475,11 @@ if form.getvalue('action_nginx') is not None and serv is not None: if funct.check_nginx_config(serv): server_id = sql.select_server_id_by_ip(server_ip=serv) + + if action == 'restart': + funct.is_not_allowed_to_restart(server_id, 'nginx') is_docker = sql.select_service_setting(server_id, 'nginx', 'dockerized') + if is_docker == '1': container_name = sql.get_setting('nginx_container_name') commands = ["sudo docker %s %s" % (action, container_name)] @@ -540,6 +548,10 @@ if form.getvalue('action_apache') is not None and serv is not None: funct.is_restarted(serv, action) server_id = sql.select_server_id_by_ip(serv) + + if action == 'restart': + funct.is_not_allowed_to_restart(server_id, 'apache') + is_docker = sql.select_service_setting(server_id, 'apache', 'dockerized') if is_docker == '1': container_name = sql.get_setting('apache_container_name') @@ -1207,7 +1219,7 @@ if form.getvalue('servaction') is not None: if enable != "show": funct.logging(serv, 'Has been ' + enable + 'ed ' + backend, login=1, keep_history=1, service='haproxy') print( - '

You %s %s on HAProxy %s. Look it or Edit something else


' % (enable, backend, serv, serv)) + '

You %s %s on HAProxy %s. Look it or Edit something else


' % (enable, backend, serv, serv)) print(funct.ssh_command(serv, command, show_log="1")) action = 'runtimeapi.py ' + enable + ' ' + backend @@ -1894,33 +1906,45 @@ if form.getvalue('metrics_waf'): sql.update_waf_metrics_enable(form.getvalue('metrics_waf'), form.getvalue('enable')) if form.getvalue('table_metrics'): + service = form.getvalue('service') + if service in ('nginx', 'apache'): + metrics = sql.select_service_table_metrics(service) + else: + metrics = sql.select_table_metrics() from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) template = env.get_template('table_metrics.html') - template = template.render(table_stat=sql.select_table_metrics()) + template = template.render(table_stat=metrics, service=service) print(template) if form.getvalue('metrics_hapwi_ram'): + import json + ip = form.getvalue('ip') metrics = {'chartData': {}} rams = '' if ip == '1': - cmd = "free -m |grep Mem |awk '{print $2,$3,$4,$5,$6,$7}'" - metric, error = funct.subprocess_execute(cmd) + import psutil + + rams_list = psutil.virtual_memory() + rams += str(round(rams_list.total/1048576, 2)) + ' ' + rams += str(round(rams_list.used/1048576, 2)) + ' ' + rams += str(round(rams_list.free/1048576, 2)) + ' ' + rams += str(round(rams_list.shared/1048576, 2)) + ' ' + rams += str(round(rams_list.cached/1048576, 2)) + ' ' + rams += str(round(rams_list.available/1048576, 2)) + ' ' else: commands = ["free -m |grep Mem |awk '{print $2,$3,$4,$5,$6,$7}'"] metric, error = funct.subprocess_execute(commands[0]) - for i in metric: - rams = i + for i in metric: + rams = i metrics['chartData']['rams'] = rams - import json - print(json.dumps(metrics)) if form.getvalue('metrics_hapwi_cpu'): @@ -1929,15 +1953,26 @@ if form.getvalue('metrics_hapwi_cpu'): cpus = '' if ip == '1': - cmd = "top -b -n 1 |grep Cpu |awk -F':' '{print $2}'|awk -F' ' 'BEGIN{ORS=\" \";} { for (i=1;i<=NF;i+=2) print $i}'" - metric, error = funct.subprocess_execute(cmd) + # cmd = "top -b -n 1 |grep Cpu |awk -F':' '{print $2}'|awk -F' ' 'BEGIN{ORS=\" \";} { for (i=1;i<=NF;i+=2) print $i}'" + # metric, error = funct.subprocess_execute(cmd) + import psutil + + cpus_list = psutil.cpu_times_percent(interval=1, percpu=False) + cpus += str(cpus_list.user) + ' ' + cpus += str(cpus_list.system) + ' ' + cpus += str(cpus_list.nice) + ' ' + cpus += str(cpus_list.idle) + ' ' + cpus += str(cpus_list.iowait) + ' ' + cpus += str(cpus_list.irq) + ' ' + cpus += str(cpus_list.softirq) + ' ' + cpus += str(cpus_list.steal) + ' ' else: commands = [ "top -b -n 1 |grep Cpu |awk -F':' '{print $2}'|awk -F' ' 'BEGIN{ORS=\" \";} { for (i=1;i<=NF;i+=2) print $i}'"] metric, error = funct.subprocess_execute(commands[0]) - for i in metric: - cpus = i + for i in metric: + cpus = i metrics['chartData']['cpus'] = cpus @@ -4334,6 +4369,9 @@ if form.getvalue('serverSettingsSave') is not None: haproxy_dockerized = form.getvalue('serverSettingshaproxy_dockerized') nginx_dockerized = form.getvalue('serverSettingsnginx_dockerized') apache_dockerized = form.getvalue('serverSettingsapache_dockerized') + haproxy_restart = form.getvalue('serverSettingsHaproxyrestart') + nginx_restart = form.getvalue('serverSettingsNginxrestart') + apache_restart = form.getvalue('serverSettingsApache_restart') server_ip = sql.select_server_ip_by_id(server_id) if service == 'haproxy': @@ -4353,6 +4391,14 @@ if form.getvalue('serverSettingsSave') is not None: else: funct.logging(server_ip, 'Service has been flagged as a system service', haproxywi=1, login=1, keep_history=1, service=service) + if sql.insert_or_update_service_setting(server_id, service, 'restart', haproxy_restart): + print('Ok') + if haproxy_restart == '1': + funct.logging(server_ip, 'Restart option is disabled for this service', haproxywi=1, login=1, + keep_history=1, service=service) + else: + funct.logging(server_ip, 'Restart option is disabled for this service', haproxywi=1, login=1, + keep_history=1, service=service) if service == 'nginx': if sql.insert_or_update_service_setting(server_id, service, 'dockerized', nginx_dockerized): @@ -4363,6 +4409,14 @@ if form.getvalue('serverSettingsSave') is not None: else: funct.logging(server_ip, 'Service has been flagged as a system service', haproxywi=1, login=1, keep_history=1, service=service) + if sql.insert_or_update_service_setting(server_id, service, 'restart', nginx_dockerized): + print('Ok') + if nginx_restart == '1': + funct.logging(server_ip, 'Restart option is disabled for this service', haproxywi=1, login=1, + keep_history=1, service=service) + else: + funct.logging(server_ip, 'Restart option is disabled for this service', haproxywi=1, login=1, + keep_history=1, service=service) if service == 'apache': if sql.insert_or_update_service_setting(server_id, service, 'dockerized', apache_dockerized): @@ -4373,6 +4427,14 @@ if form.getvalue('serverSettingsSave') is not None: else: funct.logging(server_ip, 'Service has been flagged as a system service', haproxywi=1, login=1, keep_history=1, service=service) + if sql.insert_or_update_service_setting(server_id, service, 'restart', nginx_dockerized): + print('Ok') + if apache_restart == '1': + funct.logging(server_ip, 'Restart option is disabled for this service', haproxywi=1, login=1, + keep_history=1, service=service) + else: + funct.logging(server_ip, 'Restart option is disabled for this service', haproxywi=1, login=1, + keep_history=1, service=service) if act == 'showListOfVersion': service = form.getvalue('service') @@ -4380,27 +4442,21 @@ if act == 'showListOfVersion': for_delver = form.getvalue('for_delver') style = form.getvalue('style') users = sql.select_users() + service_desc = sql.select_service(service) - if service == 'keepalived': - configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir') - files = funct.get_files(dir=configs_dir, format='conf') - configs = sql.select_config_version(serv, service) - action = 'versions.py?service=keepalived' - elif service == 'nginx': - configs_dir = funct.get_config_var('configs', 'nginx_save_configs_dir') - files = funct.get_files(dir=configs_dir, format='conf') - configs = sql.select_config_version(serv, service) - action = 'versions.py?service=nginx' - elif service == 'apache': - configs_dir = funct.get_config_var('configs', 'apache_save_configs_dir') - files = funct.get_files(dir=configs_dir, format='conf') - configs = sql.select_config_version(serv, service) - action = 'versions.py?service=apache' - else: - service = 'haproxy' - files = funct.get_files() - configs = sql.select_config_version(serv, service) - action = "versions.py" + if service in ('haproxy', 'nginx', 'keepalived', 'apache'): + configs = sql.select_config_version(serv, service_desc.service) + action = f'versions.py?service={service_desc.slug}' + + if service in ('haproxy', 'nginx', 'apache'): + configs_dir = funct.get_config_var('configs', f'{service_desc.service}_save_configs_dir') + else: + configs_dir = funct.get_config_var('configs', 'kp_save_configs_dir') + + if service == 'haproxy': + files = funct.get_files() + else: + files = funct.get_files(dir=configs_dir, format='conf') from jinja2 import Environment, FileSystemLoader diff --git a/app/sql.py b/app/sql.py index 61cfe3f6..343217c5 100755 --- a/app/sql.py +++ b/app/sql.py @@ -1947,6 +1947,131 @@ def select_table_metrics(): return cursor.fetchall() +def select_service_table_metrics(service): + cursor = conn.cursor() + group_id = funct.get_user_group(id=1) + + if service in ('nginx', 'apache'): + metrics_table = '{}_metrics'.format(service) + + if funct.check_user_group(): + if group_id == 1: + groups = "" + else: + groups = "and servers.groups = '{group}' ".format(group=group_id) + if mysql_enable == '1': + sql = """ + select ip.ip, hostname, avg_cur_1h, avg_cur_24h, avg_cur_3d, max_con_1h, max_con_24h, max_con_3d from + (select servers.ip from servers where {metrics} = 1 ) as ip, + + (select servers.ip, servers.hostname as hostname from servers left join {metrics} as metr on servers.ip = metr.serv where servers.{metrics} = 1 {groups}) as hostname, + + (select servers.ip,round(avg(metr.conn), 1) as avg_cur_1h from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= now() and metr.date >= DATE_ADD(NOW(),INTERVAL -1 HOUR) + group by servers.ip) as avg_cur_1h, + + (select servers.ip,round(avg(metr.conn), 1) as avg_cur_24h from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= now() and metr.date >= DATE_ADD(NOW(),INTERVAL -24 HOUR) + group by servers.ip) as avg_cur_24h, + + (select servers.ip,round(avg(metr.conn), 1) as avg_cur_3d from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= now() and metr.date >= DATE_ADD(NOW(),INTERVAL -3 DAY) + group by servers.ip ) as avg_cur_3d, + + (select servers.ip,max(metr.conn) as max_con_1h from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= now() and metr.date >= DATE_ADD(NOW(),INTERVAL -1 HOUR) + group by servers.ip) as max_con_1h, + + (select servers.ip,max(metr.conn) as max_con_24h from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= now() and metr.date >= DATE_ADD(NOW(),INTERVAL -24 HOUR) + group by servers.ip) as max_con_24h, + + (select servers.ip,max(metr.conn) as max_con_3d from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= now() and metr.date >= DATE_ADD(NOW(),INTERVAL -3 DAY) + group by servers.ip ) as max_con_3d + + where ip.ip=hostname.ip + and ip.ip=avg_cur_1h.ip + and ip.ip=avg_cur_24h.ip + and ip.ip=avg_cur_3d.ip + and ip.ip=max_con_1h.ip + and ip.ip=max_con_24h.ip + and ip.ip=max_con_3d.ip + + group by hostname.ip """.format(metrics=metrics_table, groups=groups) + else: + sql = """ + select ip.ip, hostname, avg_cur_1h, avg_cur_24h, avg_cur_3d, max_con_1h, max_con_24h, max_con_3d from + (select servers.ip from servers where {metrics} = 1 ) as ip, + + (select servers.ip, servers.hostname as hostname from servers left join {metrics} as metr on servers.ip = metr.serv where servers.{metrics} = 1 {groups}) as hostname, + + (select servers.ip,round(avg(metr.conn), 1) as avg_cur_1h from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= datetime('now', 'localtime') and metr.date >= datetime('now', '-1 hours', 'localtime') + group by servers.ip) as avg_cur_1h, + + (select servers.ip,round(avg(metr.conn), 1) as avg_cur_24h from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= datetime('now', 'localtime') and metr.date >= datetime('now', '-24 hours', 'localtime') + group by servers.ip) as avg_cur_24h, + + (select servers.ip,round(avg(metr.conn), 1) as avg_cur_3d from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= datetime('now', 'localtime') and metr.date >= datetime('now', '-3 days', 'localtime') + group by servers.ip ) as avg_cur_3d, + + (select servers.ip,max(metr.conn) as max_con_1h from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= datetime('now', 'localtime') and metr.date >= datetime('now', '-1 hours', 'localtime') + group by servers.ip) as max_con_1h, + + (select servers.ip,max(metr.conn) as max_con_24h from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= datetime('now', 'localtime') and metr.date >= datetime('now', '-24 hours', 'localtime') + group by servers.ip) as max_con_24h, + + (select servers.ip,max(metr.conn) as max_con_3d from servers + left join {metrics} as metr on metr.serv = servers.ip + where servers.{metrics} = 1 and + metr.date <= datetime('now', 'localtime') and metr.date >= datetime('now', '-3 days', 'localtime') + group by servers.ip ) as max_con_3d + + where ip.ip=hostname.ip + and ip.ip=avg_cur_1h.ip + and ip.ip=avg_cur_24h.ip + and ip.ip=avg_cur_3d.ip + and ip.ip=max_con_1h.ip + and ip.ip=max_con_24h.ip + and ip.ip=max_con_3d.ip + + group by hostname.ip """.format(metrics=metrics_table, groups=groups) + + try: + cursor.execute(sql) + except Exception as e: + out_error(e) + else: + return cursor.fetchall() + + def get_setting(param, **kwargs): try: user_group = funct.get_user_group(id=1) @@ -3159,6 +3284,33 @@ def select_docker_services_settings(service: str) -> str: return query_res +def select_restart_service_settings(server_id: int, service: str) -> str: + query = ServiceSetting.select().where( + (ServiceSetting.server_id == server_id) + & (ServiceSetting.service == service) + & (ServiceSetting.setting == 'restart') + ) + try: + query_res = query.execute() + except Exception as e: + out_error(e) + else: + return query_res + + +def select_restart_services_settings(service: str) -> str: + query = ServiceSetting.select().where( + (ServiceSetting.service == service) + & (ServiceSetting.setting == 'restart') + ) + try: + query_res = query.execute() + except Exception as e: + out_error(e) + else: + return query_res + + def select_service_setting(server_id: int, service: str, setting: str) -> str: try: result = ServiceSetting.get( @@ -3603,3 +3755,13 @@ def select_provisioning_params(): return else: return query_res + + +def select_service(slug: str) -> str: + try: + query_res = Services.get(Services.slug == slug) + except Exception as e: + out_error(e) + return 'there is no service' + else: + return query_res diff --git a/app/viewsttats.py b/app/statsview.py similarity index 67% rename from app/viewsttats.py rename to app/statsview.py index 1085ab0e..8d1105fb 100644 --- a/app/viewsttats.py +++ b/app/statsview.py @@ -3,7 +3,7 @@ import funct import sql from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('viewstats.html') +template = env.get_template('statsview.html') form = funct.form serv = form.getvalue('serv') service = form.getvalue('service') @@ -22,17 +22,13 @@ try: except Exception: pass -if service == 'nginx': - if funct.check_login(service=2): - title = 'NGINX stats page' - servers = sql.get_dick_permit(nginx=1) -elif service == 'apache': - if funct.check_login(service=4): - title = 'Apache stats page' - servers = sql.get_dick_permit(apache=1) +if service in ('haproxy', 'nginx', 'apache'): + service_desc = sql.select_service(service) + if funct.check_login(service=service_desc.service_id): + title = f'{service_desc.service} stats page' + sql.get_dick_permit(service=service_desc.slug) else: - if funct.check_login(service=1): - title = 'HAProxy stats page' + print('') rendered_template = template.render( h2=1, autorefresh=1, title=title, role=role, user=user, onclick="showStats()", select_id="serv", diff --git a/app/templates/404.html b/app/templates/404.html index 5251dab3..95fa95b8 100644 --- a/app/templates/404.html +++ b/app/templates/404.html @@ -29,16 +29,16 @@ - - - - + + + + - + diff --git a/app/templates/500.html b/app/templates/500.html index f9067de8..f3a66315 100644 --- a/app/templates/500.html +++ b/app/templates/500.html @@ -29,16 +29,16 @@ - - - - + + + + - + diff --git a/app/templates/admin.html b/app/templates/admin.html index 5987278c..578e75b8 100644 --- a/app/templates/admin.html +++ b/app/templates/admin.html @@ -183,5 +183,5 @@ {% endfor %} }); - + {% endblock %} diff --git a/app/templates/ajax/alerts_history.html b/app/templates/ajax/alerts_history.html index 0718f0be..931ccec1 100644 --- a/app/templates/ajax/alerts_history.html +++ b/app/templates/ajax/alerts_history.html @@ -1,4 +1,4 @@ - + {% if action == "history" %} {% set column_for_sort = 4 %} diff --git a/app/templates/ajax/config_show.html b/app/templates/ajax/config_show.html index 851b3f40..0ada30c3 100644 --- a/app/templates/ajax/config_show.html +++ b/app/templates/ajax/config_show.html @@ -234,7 +234,7 @@ {% endif %} {%- set backend = line.split(' ') -%} - Stats + Stats {%- set backend = backend|join('_') -%} {%- do section_name.update({i: backend}) -%} @@ -251,7 +251,7 @@ {% endif %} {% set backend = line.split(' ') %} - Stats + Stats {% set backend = backend|join('_') %} {% do section_name.update({i: backend}) %} @@ -268,7 +268,7 @@ {% endif %} {% set backend = line.split(' ') %} - Stats + Stats
{% continue %} diff --git a/app/templates/ajax/overivewWaf.html b/app/templates/ajax/overivewWaf.html index 8a8c2b80..cb0f18a1 100644 --- a/app/templates/ajax/overivewWaf.html +++ b/app/templates/ajax/overivewWaf.html @@ -74,7 +74,7 @@ {% if waf_service == 'haproxy' %} - View + View {% elif waf_service == 'nginx' %} View {% endif %} diff --git a/app/templates/ajax/show_list_version.html b/app/templates/ajax/show_list_version.html index 17ef30ed..aa3a3bc1 100644 --- a/app/templates/ajax/show_list_version.html +++ b/app/templates/ajax/show_list_version.html @@ -6,7 +6,7 @@ $('#table_version').on('page.dt') .DataTable( { "pageLength": 25, - "order": [ 6, "desc" ], + "order": [ 5, "desc" ], stateSave: true, "columnDefs": [ { diff --git a/app/templates/ajax/show_service_settings.html b/app/templates/ajax/show_service_settings.html index 276a88ec..b6232051 100644 --- a/app/templates/ajax/show_service_settings.html +++ b/app/templates/ajax/show_service_settings.html @@ -3,7 +3,6 @@ {% if service == 'haproxy' %} {% if settings %} {% for s in settings %} - {{s.dockerized}} {% if s.haproxy_enterprise != '' and s.setting == 'haproxy_enterprise' %} {% endif %} + {% if s.restart != '' and s.setting == 'restart' %} + + Disable restart + + {% if s.value == '1' and s.setting == 'restart' %} + {{ checkbox('haproxy_restart', checked='checked', title='Restart option is disabled for this server') }} + {% elif s.setting == 'restart' %} + {{ checkbox('haproxy_restart', title='Only the reload button will be active') }} + {% endif %} + + + {% endif %} {% endfor %} {% else %} @@ -46,6 +57,13 @@ {{ checkbox('haproxy_dockerized', title='This server will be used as Docker container') }} + + Disable restart + + {{ checkbox('haproxy_restart', title='Only the reload button will be active') }} + + {% endif %} {% endif %} {% if service == 'nginx' %} @@ -64,6 +82,18 @@ {% endif %} + {% if s.restart != '' and s.setting == 'restart' %} + + Disable restart + + {% if s.value == '1' and s.setting == 'restart' %} + {{ checkbox('nginx_restart', checked='checked', title='Restart option is disabled for this server') }} + {% elif s.setting == 'restart' %} + {{ checkbox('nginx_restart', title='Only the reload button will be active') }} + {% endif %} + + + {% endif %} {% endfor %} {% else %} @@ -73,6 +103,12 @@ {{ checkbox('nginx_dockerized', title='This server will be used as Docker container') }} + + Disable restart + + {{ checkbox('nginx_restart', title='Only the reload button will be active') }} + + {% endif %} {% endif %} {% if service == 'apache' %} @@ -91,6 +127,18 @@ {% endif %} + {% if s.restart != '' and s.setting == 'restart' %} + + Disable restart + + {% if s.value == '1' and s.setting == 'restart' %} + {{ checkbox('apache_restart', checked='checked', title='Restart option is disabled for this server') }} + {% elif s.setting == 'restart' %} + {{ checkbox('apache_restart', title='Only the reload button will be active') }} + {% endif %} + + + {% endif %} {% endfor %} {% else %} @@ -100,6 +148,12 @@ {{ checkbox('apache_dockerized', title='This server will be used as Docker container') }} + + Disable restart + + {{ checkbox('apache_restart', title='Only the reload button will be active') }} + + {% endif %} {% endif %} - \ No newline at end of file + diff --git a/app/templates/base.html b/app/templates/base.html index 686f06bb..fa02219f 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -30,20 +30,21 @@ - - - - - + + + + + - + + - + @@ -65,15 +66,15 @@
  • Haproxy
      -
    • Overview
    • -
    • Configs
    • -
    • Stats
    • -
    • Logs
    • +
    • Overview
    • +
    • Configs
    • +
    • Stats
    • +
    • Logs
    • Runtime API
    • -
    • Metrics
    • +
    • Metrics
    • {% if role <= 3 %}
    • Add proxy
    • -
    • Versions
    • +
    • Versions
    • SSL
    • Lists
    • WAF
    • @@ -87,7 +88,7 @@
      • Overview
      • Configs
      • -
      • Stats
      • +
      • Stats
      • Logs
      • Metrics
      • {% if role <= 3 %} @@ -104,7 +105,7 @@
        • Overview
        • Configs
        • -
        • Stats
        • +
        • Stats
        • Logs
        • Metrics
        • {% if role <= 3 %} diff --git a/app/templates/config.html b/app/templates/config.html index 60f26010..f2ef3967 100644 --- a/app/templates/config.html +++ b/app/templates/config.html @@ -1,14 +1,27 @@ {% extends "base.html" %} {% block content %} - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + {% if is_serv_protected and role > 2 %} @@ -65,7 +78,9 @@ {% endif %} + {% if is_restart|int == 0 %} + {% endif %} {% if service != 'keepalived' %}
          Note: When reconfiguring the master server, the slave will be reconfigured automatically
          @@ -102,10 +117,49 @@ } if (cur_url[1].split('&')[0] == 'service=haproxy' || cur_url[1].split('&')[0] == 'service=None') { var myCodeMirror = CodeMirror.fromTextArea(document.getElementById("config_text_area"), - {mode: "haproxy", lineNumbers: true, autocapitalize: true, autocorrect: true, spellcheck: true, autoCloseBrackets: true}); + { + mode: "haproxy", + lineNumbers: true, + lineWrapping: true, + autocapitalize: true, + autocorrect: true, + spellcheck: true, + autoCloseBrackets: true, + keyMap: "sublime", + matchBrackets: true, + foldGutter: true, + showCursorWhenSelecting: true, + gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "breakpoints"], + highlightSelectionMatches: {showToken: /\w/, annotateScrollbar: true} + }); } else { var myCodeMirror = CodeMirror.fromTextArea(document.getElementById("config_text_area"), - {mode: "nginx", lineNumbers: true, autocapitalize: true, autocorrect: true, spellcheck: true, autoCloseBrackets: true}); + { + mode: "nginx", + lineNumbers: true, + lineWrapping: true, + autocapitalize: true, + autocorrect: true, + spellcheck: true, + autoCloseBrackets: true, + keyMap: "sublime", + matchBrackets: true, + foldGutter: true, + showCursorWhenSelecting: true, + gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "breakpoints"], + highlightSelectionMatches: {showToken: /\w/, annotateScrollbar: true} + }); + } + myCodeMirror.on("gutterClick", function(cm, n) { + var info = cm.lineInfo(n); + cm.setGutterMarker(n, "breakpoints", info.gutterMarkers ? null : makeMarker()); + }); + + function makeMarker() { + var marker = document.createElement("div"); + marker.style.color = "#822"; + marker.innerHTML = "●"; + return marker; } diff --git a/app/templates/hapservers.html b/app/templates/hapservers.html index 0192a24d..5a318d0a 100644 --- a/app/templates/hapservers.html +++ b/app/templates/hapservers.html @@ -2,7 +2,7 @@ {% block content %} {% from 'include/input_macros.html' import input, checkbox, select, copy_to_clipboard %} - + {% if servers|length == 0 %} {% include 'include/getstarted.html' %} {% endif %} @@ -171,7 +171,7 @@ {% if s.8.0.20 == 1 %} {% endif %} - {% for set in service_settings %} + {% for set in docker_settings %} {% if set.server_id == s.0 and set.setting == 'dockerized' and set.value == '1' %} {% endif %} @@ -181,12 +181,23 @@ + {% if service != 'keepalived' %} - - - + {% endif %} + {% for set in restart_settings %} + {% if set.server_id == s.0 and set.setting == 'restart' and set.value|int == 0 %} + + + + {% endif %} + {% endfor %} + {% if restart_settings|length == 0 %} + + + + {% endif %} @@ -285,8 +296,8 @@ {% if service != 'nginx' and service != 'keepalived' and service != 'apache' %} Map {% endif %} - {% if service != 'keepalived' and service != 'apache' %} - Stat + {% if service != 'keepalived' %} + Stats {% endif %} Logs {% if role <= 2 %} diff --git a/app/templates/history.html b/app/templates/history.html index 5465818f..2467f23f 100644 --- a/app/templates/history.html +++ b/app/templates/history.html @@ -4,7 +4,7 @@ {% if user_status == 0 or user_plan == 'user' %} {% include 'include/no_sub.html' %} {% else %} - + {% if user_status == 0 %} diff --git a/app/templates/provisioning.html b/app/templates/provisioning.html index 43a2b07c..8de21ff8 100644 --- a/app/templates/provisioning.html +++ b/app/templates/provisioning.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %} {% from 'include/input_macros.html' import input, select, checkbox %} - + {% include 'include/del_confirm.html' %} diff --git a/app/templates/runtimeapi.html b/app/templates/runtimeapi.html index 5a987322..acc25072 100644 --- a/app/templates/runtimeapi.html +++ b/app/templates/runtimeapi.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %} {% from 'include/input_macros.html' import input, checkbox %} - +
          @@ -74,7 +74,7 @@
          - You can read the description of all Run Time API here + You can read the description of all Run Time API here
          {% if role <= 3 %} @@ -111,7 +111,7 @@
          - You can read how it works here + You can read how it works here
  • @@ -157,7 +157,7 @@
    - You can read how it works here + You can read how it works here
    @@ -189,7 +189,7 @@
    - You can read how it works here + You can read how it works here
    @@ -221,7 +221,7 @@
    - You can read how it works here + You can read how it works here
    @@ -248,7 +248,7 @@
    - You can read how it works here + You can read how it works here
    {% endif %} @@ -271,4 +271,4 @@ $( function() { } }); -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/app/templates/sections.html b/app/templates/sections.html index 04535715..9060c184 100644 --- a/app/templates/sections.html +++ b/app/templates/sections.html @@ -3,10 +3,28 @@ {% if is_serv_protected and role > 2 %} {% else %} - - - - + + + + + + + + + + + + + + + + + + + + + +

    @@ -20,7 +38,7 @@ {% endif %} {% endfor %} - + {% if role <= 3 %} {% endif %} @@ -31,8 +49,8 @@

    You are editing "{{section}}" section from server {{ serv }}

    - - + +
    @@ -74,7 +92,7 @@
    {{warning}}
    {% endif %} Config | - Go to stats + Go to stats {% endif %} {% endif %} diff --git a/app/templates/servers.html b/app/templates/servers.html index 89bf1853..a719b4ab 100644 --- a/app/templates/servers.html +++ b/app/templates/servers.html @@ -210,5 +210,5 @@ {% endfor %} }); - + {% endblock %} diff --git a/app/templates/viewstats.html b/app/templates/statsview.html similarity index 97% rename from app/templates/viewstats.html rename to app/templates/statsview.html index 88d723c3..36b60277 100644 --- a/app/templates/viewstats.html +++ b/app/templates/statsview.html @@ -8,7 +8,7 @@ - +