From 4b168e8fa8bb4885d5f3da38f55e6b78eae773af Mon Sep 17 00:00:00 2001 From: Aidaho <aidaho@roxy-wi.org> Date: Sun, 17 Sep 2023 12:42:39 +0300 Subject: [PATCH] v7.0.0.0 Changelog: https://roxy-wi.org/changelog#7.0.0 --- README.md | 1 - app/__init__.py | 56 + app/add.py | 436 ---- app/add_nginx.py | 118 - app/ajax_views.py | 192 ++ app/app.wsgi | 4 + app/config.py | 158 -- app/create_db.py | 203 +- app/ha.py | 39 - app/hapservers.py | 188 -- app/history.py | 53 - app/login.py | 238 -- app/logs.py | 57 - app/metrics.py | 63 - app/modules/alerting/__init__.py | 1 - app/modules/common/common.py | 1 + app/modules/config/add.py | 306 ++- app/modules/config/config.py | 378 ++- app/modules/config/runtime.py | 298 ++- app/modules/db/db_model.py | 72 +- app/modules/db/sql.py | 382 +-- app/modules/provisioning/__init__.py | 1 - app/modules/provisioning/aws.py | 133 -- app/modules/provisioning/common.py | 31 - app/modules/provisioning/do.py | 124 - app/modules/provisioning/gcore.py | 141 -- app/modules/provisioning/provider.py | 106 - app/modules/provisioning/server.py | 133 -- app/modules/roxywi/auth.py | 85 +- app/modules/roxywi/common.py | 131 +- app/modules/roxywi/group.py | 12 +- app/modules/roxywi/logs.py | 24 +- app/modules/roxywi/metrics.py | 22 +- app/modules/roxywi/nettools.py | 76 +- app/modules/roxywi/overview.py | 204 +- app/modules/roxywi/roxy.py | 21 +- app/modules/roxywi/user.py | 193 +- app/modules/roxywi/waf.py | 62 +- app/modules/server/__init__.py | 2 +- app/modules/server/server.py | 121 +- app/modules/server/ssh.py | 78 +- app/modules/service/action.py | 87 +- app/modules/service/backup.py | 102 +- app/modules/service/common.py | 138 +- app/modules/service/exporter_installation.py | 91 +- app/modules/service/haproxy.py | 49 +- app/modules/service/installation.py | 272 ++- app/modules/{alerting => tools}/alerting.py | 100 +- app/modules/tools/checker.py | 79 +- app/modules/tools/smon.py | 121 +- app/nettools.py | 32 - app/options.py | 1567 ------------- app/overview.py | 36 - app/portscanner.py | 75 - app/provisioning.py | 49 - app/routes/add/__init__.py | 5 + app/routes/add/routes.py | 689 ++++++ app/routes/admin/__init__.py | 5 + app/routes/admin/routes.py | 220 ++ app/routes/checker/__init__.py | 5 + app/routes/checker/routes.py | 130 ++ app/routes/config/__init__.py | 5 + app/routes/config/routes.py | 461 ++++ app/routes/install/__init__.py | 5 + app/routes/install/routes.py | 268 +++ app/routes/metric/__init__.py | 5 + app/routes/metric/routes.py | 128 + app/routes/runtime/__init__.py | 5 + app/routes/runtime/routes.py | 203 ++ app/routes/server/__init__.py | 5 + app/routes/server/routes.py | 462 ++++ app/routes/service/__init__.py | 5 + app/routes/service/routes.py | 386 ++++ app/routes/smon/__init__.py | 5 + app/routes/smon/routes.py | 276 +++ app/routes/user/__init__.py | 5 + app/routes/user/routes.py | 149 ++ app/routes/waf/__init__.py | 5 + app/routes/waf/routes.py | 219 ++ app/runtimeapi.py | 33 - app/scripts/backup.sh | 7 +- app/scripts/git_backup.sh | 4 +- app/scripts/install_apache.sh | 3 +- app/scripts/install_apache_exporter.sh | 3 +- app/scripts/install_grafana.sh | 3 +- app/scripts/install_haproxy_exporter.sh | 3 +- app/scripts/install_haproxy_geoip.sh | 3 +- app/scripts/install_keepalived_exporter.sh | 3 +- app/scripts/install_nginx_exporter.sh | 3 +- app/scripts/install_nginx_geoip.sh | 3 +- app/scripts/install_node_exporter.sh | 3 +- app/scripts/letsencrypt.sh | 3 +- app/scripts/s3_backup.sh | 3 +- app/scripts/waf.sh | 3 +- app/scripts/waf_nginx.sh | 3 +- app/sections.py | 115 - app/servers.py | 60 - app/smon.py | 143 -- .../images/favicon/android-icon-144x144.png | Bin .../images/favicon/android-icon-192x192.png | Bin .../images/favicon/android-icon-36x36.png | Bin .../images/favicon/android-icon-48x48.png | Bin .../images/favicon/android-icon-72x72.png | Bin .../images/favicon/android-icon-96x96.png | Bin .../images/favicon/apple-icon-114x114.png | Bin .../images/favicon/apple-icon-120x120.png | Bin .../images/favicon/apple-icon-144x144.png | Bin .../images/favicon/apple-icon-152x152.png | Bin .../images/favicon/apple-icon-180x180.png | Bin .../images/favicon/apple-icon-57x57.png | Bin .../images/favicon/apple-icon-60x60.png | Bin .../images/favicon/apple-icon-72x72.png | Bin .../images/favicon/apple-icon-76x76.png | Bin .../images/favicon/apple-icon-precomposed.png | Bin .../static}/images/favicon/apple-icon.png | Bin .../static}/images/favicon/browserconfig.xml | 0 .../static}/images/favicon/favicon-16x16.png | Bin .../static}/images/favicon/favicon-32x32.png | Bin .../static}/images/favicon/favicon-96x96.png | Bin .../static}/images/favicon/favicon.ico | Bin .../static}/images/favicon/manifest.json | 0 .../images/favicon/ms-icon-144x144.png | Bin .../images/favicon/ms-icon-150x150.png | Bin .../images/favicon/ms-icon-310x310.png | Bin .../static}/images/favicon/ms-icon-70x70.png | Bin {inc => app/static}/images/loading.gif | Bin {inc => app/static}/images/logo_footer.png | Bin {inc => app/static}/images/logo_index.png | Bin {inc => app/static}/images/logo_login.png | Bin {inc => app/static}/images/logo_menu.png | Bin {inc => app/static}/images/no_servers.png | Bin {inc => app/static}/images/oops.png | Bin app/statsview.py | 41 - app/templates/404.html | 99 +- app/templates/500.html | 100 +- app/templates/add.html | 6 +- app/templates/add_nginx.html | 2 +- app/templates/admin.html | 11 +- app/templates/ajax/check_version.html | 4 +- app/templates/ajax/config_show.html | 37 +- app/templates/ajax/firewall_rules.html | 6 +- .../ajax/haproxyservers_backends.html | 8 +- app/templates/ajax/load_telegram.html | 37 +- app/templates/ajax/new_option.html | 2 +- app/templates/ajax/new_saved_servers.html | 2 +- app/templates/ajax/overivewWaf.html | 8 +- app/templates/ajax/overview.html | 2 +- app/templates/ajax/overviewServers.html | 2 +- .../ajax/provisioning/aws_edit_dialog.html | 167 -- .../ajax/provisioning/do_edit_dialog.html | 190 -- .../ajax/provisioning/gcore_edit_dialog.html | 192 -- .../ajax/provisioning/providers.html | 44 - .../provisioning/provisioned_servers.html | 84 - ...ce_settings.html => service_settings.html} | 0 app/templates/ajax/show_compare_configs.html | 7 +- app/templates/ajax/show_configs_files.html | 10 +- app/templates/ajax/show_list_version.html | 12 +- app/templates/ajax/show_system_info.html | 10 +- app/templates/ajax/smon/smon_dashboard.html | 4 +- ...ent_group.html => user_current_group.html} | 0 ..._roles.html => user_groups_and_roles.html} | 0 ..._user_services.html => user_services.html} | 0 app/templates/base.html | 174 +- app/templates/checker.html | 12 + app/templates/config.html | 38 +- app/templates/configver.html | 4 +- app/templates/delver.html | 4 +- app/templates/ha.html | 6 +- app/templates/hapservers.html | 26 +- app/templates/include/admin_backup.html | 2 +- app/templates/include/admin_servers.html | 2 +- app/templates/include/admin_users.html | 2 +- app/templates/include/getstarted.html | 6 +- app/templates/include/login.html | 4 +- app/templates/include/mon_installation.html | 203 -- app/templates/include/port_scan_history.html | 22 +- .../provisioning/creating_dialogs.html | 494 ---- .../provisioning/providers_dialogs.html | 212 -- .../include/provisioning/variables.html | 98 - app/templates/include/smon/smon_history.html | 4 +- .../include/smon/smon_http_server.html | 2 +- app/templates/include/tr_validate_tips.html | 2 +- app/templates/install.html | 413 ++++ app/templates/languages/en.html | 3 + app/templates/languages/fr.html | 3 + app/templates/languages/pt-br.html | 3 + app/templates/languages/ru.html | 3 + app/templates/login.html | 11 +- app/templates/logs.html | 70 +- app/templates/logs_internal.html | 76 + app/templates/metrics.html | 5 +- app/templates/nettools.html | 16 +- app/templates/ovw.html | 28 +- app/templates/portscanner.html | 66 +- app/templates/provisioning.html | 76 - app/templates/runtimeapi.html | 2 +- app/templates/sections.html | 30 +- app/templates/servers.html | 197 +- app/templates/{smon.html => smon/add.html} | 57 +- app/templates/smon/checker_history.html | 33 + app/templates/smon/dashboard.html | 39 + app/templates/smon/history.html | 33 + app/templates/statsview.html | 5 +- app/templates/waf.html | 12 +- app/users.py | 61 - app/versions.py | 111 - app/viewlogs.py | 87 - app/views.py | 463 ++++ app/waf.py | 112 - config_other/httpd/roxy-wi.conf | 14 +- config_other/httpd/roxy-wi_deb.conf | 14 +- config_other/requirements_el7.txt | 1 + config_other/requirements_el8.txt | 1 + config_other/requirements_el9.txt | 1 + inc/add.js | 1560 ++++++------- inc/add_nginx.js | 51 +- inc/configshow.js | 1 - inc/css/{provisioning.css => ha.css} | 0 inc/ha.js | 262 +-- inc/images/logo_logo.png | Bin 18044 -> 0 bytes inc/images/provisioning/flags/ae.svg | 1 - inc/images/provisioning/flags/au.svg | 8 - inc/images/provisioning/flags/bh.svg | 4 - inc/images/provisioning/flags/br.svg | 45 - inc/images/provisioning/flags/ca.svg | 4 - inc/images/provisioning/flags/de.svg | 5 - inc/images/provisioning/flags/fr.svg | 7 - inc/images/provisioning/flags/gb.svg | 7 - inc/images/provisioning/flags/hk.svg | 30 - inc/images/provisioning/flags/ie.svg | 7 - inc/images/provisioning/flags/in.svg | 25 - inc/images/provisioning/flags/jp.svg | 11 - inc/images/provisioning/flags/kh.svg | 61 - inc/images/provisioning/flags/kr.svg | 24 - inc/images/provisioning/flags/kz.svg | 23 - inc/images/provisioning/flags/lu.svg | 5 - inc/images/provisioning/flags/nl.svg | 5 - inc/images/provisioning/flags/pl.svg | 6 - inc/images/provisioning/flags/ru.svg | 7 - inc/images/provisioning/flags/se.svg | 4 - inc/images/provisioning/flags/sg.svg | 13 - inc/images/provisioning/flags/tr.svg | 8 - inc/images/provisioning/flags/ua.svg | 6 - inc/images/provisioning/flags/us.svg | 10 - inc/images/provisioning/flags/za.svg | 17 - inc/images/provisioning/oss/.DS_Store | Bin 6148 -> 0 bytes inc/images/provisioning/oss/centos.svg | 1 - inc/images/provisioning/oss/debian.svg | 1 - inc/images/provisioning/oss/fedora.svg | 1 - inc/images/provisioning/oss/rocky-linux.svg | 1 - inc/images/provisioning/oss/suse.svg | 1 - inc/images/provisioning/oss/ubuntu.svg | 1 - inc/images/provisioning/oss/windows.svg | 1 - inc/images/provisioning/providers/aws.svg | 1 - inc/images/provisioning/providers/do.svg | 72 - inc/images/provisioning/providers/gcore.svg | 1 - inc/{metrics-6.3.16.0.js => metrics.js} | 63 +- inc/{overview-6.3.9.js => overview.js} | 384 +-- inc/provisioning.js | 2050 ----------------- inc/runtimeapi.js | 289 +-- inc/{script-6.3.9.js => script.js} | 819 +++---- inc/{smon-6.3.16.js => smon.js} | 59 +- inc/users.js | 1663 ++++++------- inc/{waf-6.3.8.js => waf.js} | 133 +- index.html | 42 +- requirements.txt | 1 + 266 files changed, 9243 insertions(+), 14802 deletions(-) create mode 100644 app/__init__.py delete mode 100644 app/add.py delete mode 100755 app/add_nginx.py create mode 100644 app/ajax_views.py create mode 100644 app/app.wsgi delete mode 100644 app/config.py delete mode 100644 app/ha.py delete mode 100644 app/hapservers.py delete mode 100644 app/history.py delete mode 100644 app/login.py delete mode 100644 app/logs.py delete mode 100644 app/metrics.py delete mode 100644 app/modules/alerting/__init__.py delete mode 100644 app/modules/provisioning/__init__.py delete mode 100644 app/modules/provisioning/aws.py delete mode 100644 app/modules/provisioning/common.py delete mode 100644 app/modules/provisioning/do.py delete mode 100644 app/modules/provisioning/gcore.py delete mode 100644 app/modules/provisioning/provider.py delete mode 100644 app/modules/provisioning/server.py rename app/modules/{alerting => tools}/alerting.py (86%) delete mode 100644 app/nettools.py delete mode 100644 app/options.py delete mode 100644 app/overview.py delete mode 100644 app/portscanner.py delete mode 100644 app/provisioning.py create mode 100644 app/routes/add/__init__.py create mode 100644 app/routes/add/routes.py create mode 100644 app/routes/admin/__init__.py create mode 100644 app/routes/admin/routes.py create mode 100644 app/routes/checker/__init__.py create mode 100644 app/routes/checker/routes.py create mode 100644 app/routes/config/__init__.py create mode 100644 app/routes/config/routes.py create mode 100644 app/routes/install/__init__.py create mode 100644 app/routes/install/routes.py create mode 100644 app/routes/metric/__init__.py create mode 100644 app/routes/metric/routes.py create mode 100644 app/routes/runtime/__init__.py create mode 100644 app/routes/runtime/routes.py create mode 100644 app/routes/server/__init__.py create mode 100644 app/routes/server/routes.py create mode 100644 app/routes/service/__init__.py create mode 100644 app/routes/service/routes.py create mode 100644 app/routes/smon/__init__.py create mode 100644 app/routes/smon/routes.py create mode 100644 app/routes/user/__init__.py create mode 100644 app/routes/user/routes.py create mode 100644 app/routes/waf/__init__.py create mode 100644 app/routes/waf/routes.py delete mode 100644 app/runtimeapi.py delete mode 100644 app/sections.py delete mode 100644 app/servers.py delete mode 100644 app/smon.py rename {inc => app/static}/images/favicon/android-icon-144x144.png (100%) rename {inc => app/static}/images/favicon/android-icon-192x192.png (100%) rename {inc => app/static}/images/favicon/android-icon-36x36.png (100%) rename {inc => app/static}/images/favicon/android-icon-48x48.png (100%) rename {inc => app/static}/images/favicon/android-icon-72x72.png (100%) rename {inc => app/static}/images/favicon/android-icon-96x96.png (100%) rename {inc => app/static}/images/favicon/apple-icon-114x114.png (100%) rename {inc => app/static}/images/favicon/apple-icon-120x120.png (100%) rename {inc => app/static}/images/favicon/apple-icon-144x144.png (100%) rename {inc => app/static}/images/favicon/apple-icon-152x152.png (100%) rename {inc => app/static}/images/favicon/apple-icon-180x180.png (100%) rename {inc => app/static}/images/favicon/apple-icon-57x57.png (100%) rename {inc => app/static}/images/favicon/apple-icon-60x60.png (100%) rename {inc => app/static}/images/favicon/apple-icon-72x72.png (100%) rename {inc => app/static}/images/favicon/apple-icon-76x76.png (100%) rename {inc => app/static}/images/favicon/apple-icon-precomposed.png (100%) rename {inc => app/static}/images/favicon/apple-icon.png (100%) rename {inc => app/static}/images/favicon/browserconfig.xml (100%) rename {inc => app/static}/images/favicon/favicon-16x16.png (100%) rename {inc => app/static}/images/favicon/favicon-32x32.png (100%) rename {inc => app/static}/images/favicon/favicon-96x96.png (100%) rename {inc => app/static}/images/favicon/favicon.ico (100%) rename {inc => app/static}/images/favicon/manifest.json (100%) rename {inc => app/static}/images/favicon/ms-icon-144x144.png (100%) rename {inc => app/static}/images/favicon/ms-icon-150x150.png (100%) rename {inc => app/static}/images/favicon/ms-icon-310x310.png (100%) rename {inc => app/static}/images/favicon/ms-icon-70x70.png (100%) rename {inc => app/static}/images/loading.gif (100%) rename {inc => app/static}/images/logo_footer.png (100%) rename {inc => app/static}/images/logo_index.png (100%) rename {inc => app/static}/images/logo_login.png (100%) rename {inc => app/static}/images/logo_menu.png (100%) rename {inc => app/static}/images/no_servers.png (100%) rename {inc => app/static}/images/oops.png (100%) delete mode 100644 app/statsview.py delete mode 100644 app/templates/ajax/provisioning/aws_edit_dialog.html delete mode 100644 app/templates/ajax/provisioning/do_edit_dialog.html delete mode 100644 app/templates/ajax/provisioning/gcore_edit_dialog.html delete mode 100644 app/templates/ajax/provisioning/providers.html delete mode 100644 app/templates/ajax/provisioning/provisioned_servers.html rename app/templates/ajax/{show_service_settings.html => service_settings.html} (100%) rename app/templates/ajax/{show_user_current_group.html => user_current_group.html} (100%) rename app/templates/ajax/{show_user_groups_and_roles.html => user_groups_and_roles.html} (100%) rename app/templates/ajax/{show_user_services.html => user_services.html} (100%) create mode 100644 app/templates/checker.html delete mode 100644 app/templates/include/mon_installation.html delete mode 100644 app/templates/include/provisioning/creating_dialogs.html delete mode 100644 app/templates/include/provisioning/providers_dialogs.html delete mode 100644 app/templates/include/provisioning/variables.html create mode 100644 app/templates/install.html create mode 100644 app/templates/logs_internal.html delete mode 100644 app/templates/provisioning.html rename app/templates/{smon.html => smon/add.html} (79%) create mode 100644 app/templates/smon/checker_history.html create mode 100644 app/templates/smon/dashboard.html create mode 100644 app/templates/smon/history.html delete mode 100644 app/users.py delete mode 100644 app/versions.py delete mode 100644 app/viewlogs.py create mode 100644 app/views.py delete mode 100644 app/waf.py rename inc/css/{provisioning.css => ha.css} (100%) delete mode 100644 inc/images/logo_logo.png delete mode 100644 inc/images/provisioning/flags/ae.svg delete mode 100644 inc/images/provisioning/flags/au.svg delete mode 100644 inc/images/provisioning/flags/bh.svg delete mode 100644 inc/images/provisioning/flags/br.svg delete mode 100644 inc/images/provisioning/flags/ca.svg delete mode 100644 inc/images/provisioning/flags/de.svg delete mode 100644 inc/images/provisioning/flags/fr.svg delete mode 100644 inc/images/provisioning/flags/gb.svg delete mode 100644 inc/images/provisioning/flags/hk.svg delete mode 100644 inc/images/provisioning/flags/ie.svg delete mode 100644 inc/images/provisioning/flags/in.svg delete mode 100644 inc/images/provisioning/flags/jp.svg delete mode 100644 inc/images/provisioning/flags/kh.svg delete mode 100644 inc/images/provisioning/flags/kr.svg delete mode 100644 inc/images/provisioning/flags/kz.svg delete mode 100644 inc/images/provisioning/flags/lu.svg delete mode 100644 inc/images/provisioning/flags/nl.svg delete mode 100644 inc/images/provisioning/flags/pl.svg delete mode 100644 inc/images/provisioning/flags/ru.svg delete mode 100644 inc/images/provisioning/flags/se.svg delete mode 100644 inc/images/provisioning/flags/sg.svg delete mode 100644 inc/images/provisioning/flags/tr.svg delete mode 100644 inc/images/provisioning/flags/ua.svg delete mode 100644 inc/images/provisioning/flags/us.svg delete mode 100644 inc/images/provisioning/flags/za.svg delete mode 100644 inc/images/provisioning/oss/.DS_Store delete mode 100644 inc/images/provisioning/oss/centos.svg delete mode 100644 inc/images/provisioning/oss/debian.svg delete mode 100644 inc/images/provisioning/oss/fedora.svg delete mode 100644 inc/images/provisioning/oss/rocky-linux.svg delete mode 100644 inc/images/provisioning/oss/suse.svg delete mode 100644 inc/images/provisioning/oss/ubuntu.svg delete mode 100644 inc/images/provisioning/oss/windows.svg delete mode 100644 inc/images/provisioning/providers/aws.svg delete mode 100644 inc/images/provisioning/providers/do.svg delete mode 100644 inc/images/provisioning/providers/gcore.svg rename inc/{metrics-6.3.16.0.js => metrics.js} (94%) rename inc/{overview-6.3.9.js => overview.js} (63%) delete mode 100644 inc/provisioning.js rename inc/{script-6.3.9.js => script.js} (68%) rename inc/{smon-6.3.16.js => smon.js} (93%) rename inc/{waf-6.3.8.js => waf.js} (65%) diff --git a/README.md b/README.md index 5835a05b..8e09a1bb 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,6 @@ Web interface(user-friendly web GUI, alerting, monitoring and secure) for managi 2. Installing and updating HAProxy and Nginx with Roxy-WI as a Docker service 3. Installing and updating Grafana, Prometheus servers with Roxy-WI 4. Installing and updating HAProxy, Nginx, Apache, Keepalived and Node exporters with Roxy-WI -5. Server provisioning on AWS, DigitalOcean and G-Core Labs 6. Downloading, updating and formatting GeoIP to the acceptable format for HAProxy with Roxy-WI 7. Dynamic change of Maxconn, Black/white lists and backend's IP address and port with saving changes to the config file 8. Configuring HAProxy, Nginx, Apache and Keepalived in a jiffy with Roxy-WI diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 00000000..ba70c2e0 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,56 @@ +from datetime import timedelta + +from flask import Flask +from flask_caching import Cache +from flask_login import LoginManager + +app = Flask(__name__) +app.secret_key = 'some secret salt' +app.jinja_env.add_extension('jinja2.ext.do') +app.jinja_env.add_extension('jinja2.ext.loopcontrols') + +cache = Cache(config={'CACHE_TYPE': 'SimpleCache', "CACHE_DEFAULT_TIMEOUT": 3000}) +cache.init_app(app) +login_manager = LoginManager(app) + +app.config['SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS'] = True +app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=3) + +from app.routes.add import bp as add_bp +app.register_blueprint(add_bp, url_prefix='/add') + +from app.routes.service import bp as service_bp +app.register_blueprint(service_bp, url_prefix='/service') + +from app.routes.config import bp as config_bp +app.register_blueprint(config_bp, url_prefix='/config') + +from app.routes.metric import bp as metric_bp +app.register_blueprint(metric_bp, url_prefix='/metrics') + +from app.routes.waf import bp as waf_bp +app.register_blueprint(waf_bp, url_prefix='/waf') + +from app.routes.runtime import bp as runtime_bp +app.register_blueprint(runtime_bp, url_prefix='/runtimeapi') + +from app.routes.smon import bp as smon_bp +app.register_blueprint(smon_bp, url_prefix='/smon') + +from app.routes.checker import bp as checker_bp +app.register_blueprint(checker_bp, url_prefix='/checker') + +from app.routes.install import bp as install_bp +app.register_blueprint(install_bp, url_prefix='/install') + +from app.routes.user import bp as user_bp +app.register_blueprint(user_bp, url_prefix='/user') + +from app.routes.server import bp as server_bp +app.register_blueprint(server_bp, url_prefix='/server') + +from app.routes.admin import bp as admin_bp +app.register_blueprint(admin_bp, url_prefix='/admin') + +from app import views +from app import ajax_views diff --git a/app/add.py b/app/add.py deleted file mode 100644 index f45b4b57..00000000 --- a/app/add.py +++ /dev/null @@ -1,436 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import os -import sys -import http.cookies - -from jinja2 import Environment, FileSystemLoader - -import modules.db.sql as sql -import modules.common.common as common -import modules.config.config as config_mod -import modules.roxy_wi_tools as roxy_wi_tools -import modules.roxywi.common as roxywi_common -import modules.roxywi.auth as roxywi_auth - -time_zone = sql.get_setting('time_zone') -get_date = roxy_wi_tools.GetDate(time_zone) -get_config_var = roxy_wi_tools.GetConfigVar() -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('add.html') -form = common.form -serv = common.is_ip_or_dns(form.getvalue('serv')) - -print('Content-type: text/html\n') - -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: - print('error: your session is expired') - sys.exit() - -roxywi_auth.page_for_admin(level=3) - -if all(v is None for v in [ - form.getvalue('mode'), form.getvalue('new_userlist'), - form.getvalue('peers-name'), form.getvalue('generateconfig') -]): - try: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - group = cookie.get('group') - user_group = group.value - except Exception as e: - print(str(e)) - - lib_path = get_config_var.get_config_var('main', 'lib_path') - dir = lib_path + "/lists" - white_dir = lib_path + "/lists/" + user_group + "/white" - black_dir = lib_path + "/lists/" + user_group + "/black" - - if not os.path.exists(dir): - os.makedirs(dir) - if not os.path.exists(dir + "/" + user_group): - os.makedirs(dir + "/" + user_group) - if not os.path.exists(white_dir): - os.makedirs(white_dir) - if not os.path.exists(black_dir): - os.makedirs(black_dir) - - white_lists = roxywi_common.get_files(folder=white_dir, file_format="lst") - black_lists = roxywi_common.get_files(folder=black_dir, file_format="lst") - maps = roxywi_common.get_files(folder=f'{lib_path}/maps/{user_group}', file_format="map") - - template = template.render( - h2=1, 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'], - lang=user_params['lang'], maps=maps - ) - print(template) - -elif form.getvalue('mode') is not None: - haproxy_dir = sql.get_setting('haproxy_dir') - port = form.getlist('port') - bind = "" - ip = "" - force_close = form.getvalue('force_close') - balance = "" - mode = f" mode {form.getvalue('mode')}\n" - maxconn = "" - options_split = "" - ssl = "" - ssl_check = "" - backend = "" - headers = '' - acl = "" - servers_split = "" - new_listener = form.getvalue('listener') - new_frontend = form.getvalue('frontend') - new_backend = form.getvalue('new_backend') - - if form.getvalue('balance') is not None: - balance = " balance " + form.getvalue('balance') + "\n" - - if form.getvalue('health_check') is not None: - health_check = form.getvalue('health_check') - if health_check == 'option httpchk' and form.getvalue('checks_http_domain') is not None: - health_check = health_check + ' GET ' + form.getvalue('checks_http_path') + ' "HTTP/1.0\\r\\nHost: ' + form.getvalue('checks_http_domain') + '"' - balance += f" {health_check}\n" - - if form.getvalue('ip') is not None: - ip = form.getlist('ip') - - if new_listener is not None: - name = f"listen {new_listener}" - end_name = new_listener - elif new_frontend is not None: - name = f"frontend {new_frontend}" - end_name = new_frontend - elif new_backend is not None: - name = f"backend {new_backend}" - end_name = new_backend - else: - print('error: The name cannot be empty') - sys.exit() - - if form.getvalue('backends') is not None: - backend = f" default_backend { form.getvalue('backends')}\n" - - if form.getvalue('maxconn'): - maxconn = f" maxconn {form.getvalue('maxconn')}\n" - - if form.getvalue('ssl') == "https" and form.getvalue('mode') != "tcp": - cert_path = sql.get_setting('cert_path') - if form.getvalue('cert') is not None: - ssl = f"ssl crt {cert_path}{form.getvalue('cert')}" - if form.getvalue('ssl-dis-check') is None: - if form.getvalue('ssl-check') == "ssl-check": - ssl_check = " ssl verify none" - else: - ssl_check = " ssl verify" - - if ip or port: - if type(port) is list: - i = 0 - for p in port: - if ip[i] == 'IsEmptY': - if ip[i] == 'IsEmptY' and port[i] == 'IsEmptY': - i += 1 - continue - else: - port_value = port[i] - bind += f" bind *:{port_value} {ssl}\n" - else: - if port[i] == 'IsEmptY': - print('error: IP cannot be bind without a port') - sys.exit() - else: - port_value = port[i] - bind += f" bind {ip[i]}:{port_value} {ssl}\n" - i += 1 - - if form.getvalue('default-check') == "1": - if form.getvalue('check-servers') == "1": - check = f" check inter {form.getvalue('inter')} rise {form.getvalue('rise')} fall {form.getvalue('fall')}{ssl_check}" - else: - check = "" - else: - if form.getvalue('check-servers') != "1": - check = "" - else: - check = f" check{ssl_check}" - - if form.getvalue('option') is not None: - options = form.getvalue('option') - i = options.split("\n") - for j in i: - options_split += f" {j}\n" - - if force_close == "1": - options_split += " option http-server-close\n" - elif force_close == "2": - options_split += " option forceclose\n" - elif force_close == "3": - options_split += " option http-pretend-keepalive\n" - - if form.getvalue('whitelist') is not None: - options_split += " tcp-request connection accept if { src -f " + haproxy_dir + "/white/" + form.getvalue( - 'whitelist') + " }\n" - - if form.getvalue('blacklist') is not None: - options_split += " tcp-request connection reject if { src -f " + haproxy_dir + "/black/" + form.getvalue( - 'blacklist') + " }\n" - - if form.getvalue('cookie'): - cookie = f" cookie {form.getvalue('cookie_name')}" - if form.getvalue('cookie_domain'): - cookie += f" domain {form.getvalue('cookie_domain')}" - if form.getvalue('rewrite'): - rewrite = form.getvalue('rewrite') - else: - rewrite = "" - if form.getvalue('prefix'): - prefix = form.getvalue('prefix') - else: - prefix = "" - if form.getvalue('nocache'): - nocache = form.getvalue('nocache') - else: - nocache = "" - if form.getvalue('postonly'): - postonly = form.getvalue('postonly') - else: - postonly = "" - if form.getvalue('dynamic'): - dynamic = form.getvalue('dynamic') - else: - dynamic = "" - cookie += f" {rewrite} {prefix} {nocache} {postonly} {dynamic}\n" - options_split += cookie - if form.getvalue('dynamic'): - options_split += f" dynamic-cookie-key {form.getvalue('dynamic-cookie-key')}\n" - - if form.getvalue('headers_res'): - headers_res = form.getlist('headers_res') - headers_method = form.getlist('headers_method') - header_name = form.getlist('header_name') - header_value = form.getlist('header_value') - i = 0 - - for h in headers_method: - if headers_method[i] != 'del-header': - headers += f' {headers_res[i]} {headers_method[i]} {header_name[i]} {header_value[i]}\n' - else: - headers += f' {headers_res[i]} {headers_method[i]} {header_name[i]}\n' - i += 1 - - if form.getvalue('acl_if'): - acl_if = form.getlist('acl_if') - acl_value = form.getlist('acl_value') - acl_then = form.getlist('acl_then') - acl_then_values = form.getlist('acl_then_value') - i = 0 - - for a in acl_if: - - acl_then_value = '' if acl_then_values[i] == 'IsEmptY' else acl_then_values[i] - - try: - if a == '1': - acl_if_word = 'hdr_beg(host) -i ' - if form.getvalue('ssl') == "https" and form.getvalue('mode') != "tcp": - acl_if_word = 'ssl_fc_sni -i ' - if form.getvalue('mode') == "tcp": - acl_if_word = 'req.ssl_sni -i ' - elif a == '2': - acl_if_word = 'hdr_end(host) -i ' - if form.getvalue('ssl') == "https" and form.getvalue('mode') != "tcp": - acl_if_word = 'ssl_fc_sni -i ' - if form.getvalue('mode') == "tcp": - acl_if_word = 'req.ssl_sni -i ' - elif a == '3': - acl_if_word = 'path_beg -i ' - elif a == '4': - acl_if_word = 'path_end -i ' - elif a == '6': - acl_if_word = 'src ip ' - else: - acl_if_word = '' - - if acl_then[i] == '5': - acl += ' use_backend ' - elif acl_then[i] == '2': - acl += ' http-request redirect location ' - elif acl_then[i] == '3': - acl += ' http-request allow' - acl_then_value = '' - elif acl_then[i] == '4': - acl += ' http-request deny' - acl_then_value = '' - elif acl_then[i] == '6': - acl += f' acl return_{acl_value[i]} {acl_if_word} {acl_value[i]}\n' - acl += f' http-request return if return_{acl_value[i]}\n' - elif acl_then[i] == '7': - acl += f' acl set_header_{acl_value[i]} {acl_if_word} {acl_value[i]}\n' - acl += f' http-request set-header if set_header_{acl_value[i]}\n' - - if acl_then[i] in ('2', '3', '4', '5'): - acl += acl_then_value + ' if { ' + acl_if_word + acl_value[i] + ' } \n' - except Exception: - acl = '' - - i += 1 - - if form.getvalue('circuit_breaking') == "1": - observe = 'observe ' + form.getvalue('circuit_breaking_observe') - error_limit = ' error-limit ' + form.getvalue('circuit_breaking_error_limit') - circuit_breaking_on_error = ' on-error ' + form.getvalue('circuit_breaking_on_error') - default_server = ' default-server ' + observe + error_limit + circuit_breaking_on_error + '\n' - servers_split += default_server - - if form.getvalue('servers') is not None: - servers = form.getlist('servers') - server_port = form.getlist('server_port') - send_proxy = form.getlist('send_proxy') - backup = form.getlist('backup') - server_maxconn = form.getlist('server_maxconn') - port_check = form.getvalue('port_check') - i = 0 - for server in servers: - if form.getvalue('template') is None: - try: - if send_proxy[i] == '1': - send_proxy_param = 'send-proxy' - else: - send_proxy_param = '' - except Exception: - send_proxy_param = '' - - try: - if backup[i] == '1': - backup_param = 'backup' - else: - backup_param = '' - except Exception: - backup_param = '' - - try: - maxconn_val = server_maxconn[i] - except Exception: - maxconn_val = '200' - - try: - port_check_val = port_check[i] - except Exception: - port_check_val = server_port[i] - - servers_split += " server {0} {0}:{1}{2} port {6} maxconn {5} {3} {4} \n".format( - server, server_port[i], check, send_proxy_param, backup_param, maxconn_val, port_check_val - ) - else: - servers_split += " server-template {0} {1} {2}:{3} {4} \n".format( - form.getvalue('prefix'), form.getvalue('template-number'), server, server_port[i], check - ) - i += 1 - - compression = form.getvalue("compression") - cache = form.getvalue("cache") - compression_s = "" - cache_s = "" - cache_set = "" - filter_com = "" - if compression == "1" or cache == "2": - filter_com = " filter compression\n" - if cache == "2": - cache_s = f" http-request cache-use {end_name}\n http-response cache-store {end_name}\n" - cache_set = f"cache {end_name}\n total-max-size 4\n max-age 240\n" - if compression == "1": - compression_s = " compression algo gzip\n compression type text/html text/plain text/css\n" - - waf = "" - if form.getvalue('waf') is not None: - waf = f" filter spoe engine modsecurity config {haproxy_dir}/waf.conf\n" - waf += " http-request deny if { var(txn.modsec.code) -m int gt 0 }\n" - - config_add = f"\n{name}\n{bind}{mode}{maxconn}{balance}{options_split}{cache_s}{filter_com}{compression_s}" \ - f"{waf}{headers}{acl}{backend}{servers_split}\n{cache_set}\n" - -if form.getvalue('new_userlist') is not None: - name = f"userlist {form.getvalue('new_userlist')}\n" - - new_userlist_groups = "" - if form.getvalue('userlist-group') is not None: - groups = form.getlist('userlist-group') - for group in groups: - new_userlist_groups += f" group {group}\n" - - new_users_list = "" - if form.getvalue('userlist-user') is not None: - users = form.getlist('userlist-user') - passwords = form.getlist('userlist-password') - userlist_user_group = form.getlist('userlist-user-group') - i = 0 - - for user in users: - try: - group = f' groups {userlist_user_group[i]}' - except Exception: - group = '' - new_users_list += f" user {user} insecure-password { passwords[i]} {group}\n" - i += 1 - - config_add = "\n" + name + new_userlist_groups + new_users_list - -if form.getvalue('peers-name') is not None: - name = "peers " + form.getvalue('peers-name') + "\n" - servers_split = '' - - if form.getvalue('servers') is not None: - servers = form.getlist('servers') - server_port = form.getlist('server_port') - servers_name = form.getlist('servers_name') - i = 0 - for server in servers: - servers_split += " peer {0} {1}:{2} \n".format(servers_name[i], server, server_port[i]) - - i += 1 - - config_add = "\n" + name + servers_split - -if form.getvalue('generateconfig') is None and serv is not None: - slave_output = '' - try: - server_name = sql.get_hostname_by_server_ip(serv) - except Exception: - server_name = serv - - try: - roxywi_common.check_is_server_in_group(serv) - if config_add: - hap_configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') - cfg = hap_configs_dir + serv + "-" + get_date.return_date('config') + ".cfg" - - config_mod.get_config(serv, cfg) - try: - with open(cfg, "a") as conf: - conf.write(config_add) - except IOError as e: - print(f"error: Can't read import config file {e}") - - output = config_mod.master_slave_upload_and_restart(serv, cfg, just_save="save") - - if output: - print(output) - else: - print(name) - - try: - roxywi_common.logging(serv, f"add.py add new {name}") - except Exception: - pass - except Exception: - pass -else: - print(config_add) diff --git a/app/add_nginx.py b/app/add_nginx.py deleted file mode 100755 index d4b40b55..00000000 --- a/app/add_nginx.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import sys - -from jinja2 import Environment, FileSystemLoader - -import modules.db.sql as sql -import modules.common.common as common -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 - -get_config_var = roxy_wi_tools.GetConfigVar() -form = common.form -serv = form.getvalue('serv') - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params(service='nginx') - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2) -except Exception as e: - print(f'error {e}') - sys.exit() - -roxywi_auth.page_for_admin(level=3) - -if all(v is None for v in [form.getvalue('upstream'), form.getvalue('generateconfig')]): - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('add_nginx.html') - template = template.render( - h2=1, 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: - nginx_dir = sql.get_setting('nginx_dir') - name = form.getlist('name') - new_upstream = form.getvalue('upstream') - balance = form.getvalue("balance") - ip = '' - port = '' - config_add = '' - servers_split = '' - - if balance == 'round_robin': - balance = '' - else: - balance = f' {balance};\n' - - if new_upstream is not None: - config_add = f'upstream {new_upstream} {{\n' - config_add += balance - config_name = f'upstream_{new_upstream}' - - if form.getvalue('keepalive') is not None: - config_add += f' keepalive {form.getvalue("keepalive")};\n' - - if form.getvalue('servers') is not None: - servers = form.getlist('servers') - server_port = form.getlist('server_port') - max_fails = form.getlist('max_fails') - fail_timeout = form.getlist('fail_timeout') - i = 0 - for server in servers: - try: - max_fails_val = f'max_fails={max_fails[i]}' - except Exception: - max_fails_val = 'max_fails=1' - - try: - fail_timeout_val = f'fail_timeout={fail_timeout[i]}' - except Exception: - fail_timeout_val = 'fail_timeout=1' - - servers_split += f" server {server}:{server_port[i]} {max_fails_val} {fail_timeout_val}s; \n" - i += 1 - config_add += f'{servers_split} }}\n' - -if form.getvalue('generateconfig') is None and serv is not None: - slave_output = '' - try: - server_name = sql.get_hostname_by_server_ip(serv) - except Exception: - server_name = serv - - try: - roxywi_common.check_is_server_in_group(serv) - if config_add: - sub_folder = 'conf.d' if 'upstream' in config_name else 'sites-enabled' - - service_configs_dir = get_config_var.get_config_var('configs', 'nginx_save_configs_dir') - cfg = f'{service_configs_dir}{serv}-{config_name}.conf' - nginx_dir = common.return_nice_path(sql.get_setting('nginx_dir')) - - config_file_name = f'{nginx_dir}{sub_folder}/{config_name}.conf' - - try: - with open(cfg, "w") as conf: - conf.write(config_add) - except IOError: - print("error: Cannot save a new config") - - roxywi_common.logging(serv, "add_nginx.py add new %s" % config_name) - - output = config_mod.master_slave_upload_and_restart(serv, cfg, just_save="save", nginx=1, config_file_name=config_file_name) - - if output: - print(output) - else: - print(config_name) - - except Exception: - pass -else: - print(config_add) diff --git a/app/ajax_views.py b/app/ajax_views.py new file mode 100644 index 00000000..8fbea176 --- /dev/null +++ b/app/ajax_views.py @@ -0,0 +1,192 @@ +import os +import sys + +from flask import render_template, request +from flask_login import login_required + +from app import app, login_manager, cache + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.server.server as server_mod +import modules.service.action as service_action +import modules.service.common as service_common +import modules.service.haproxy as service_haproxy +import modules.roxywi.roxy as roxy +import modules.roxywi.logs as roxy_logs +import modules.roxywi.nettools as nettools +import modules.roxywi.common as roxywi_common +import modules.roxywi.overview as roxy_overview + + + +@app.route('/overview/services') +@login_required +def show_services_overview(): + return roxy_overview.show_services_overview() + + +@app.route('/overview/server/<server_ip>') +@login_required +def overview_server(server_ip): + return roxy_overview.show_overview(server_ip) + + +@app.route('/overview/users') +@login_required +def overview_users(): + return roxy_overview.user_owv() + + +@app.route('/overview/sub') +@login_required +@cache.cached() +def overview_sub(): + return roxy_overview.show_sub_ovw() + + +@app.route('/logs/<service>/<serv>', methods=['GET', 'POST']) +@login_required +def show_remote_log_files(service, serv): + service = common.checkAjaxInput(service) + serv = common.checkAjaxInput(serv) + log_path = sql.get_setting(f'{service}_path_logs') + return_files = server_mod.get_remote_files(serv, log_path, 'log') + + if 'error: ' in return_files: + return return_files + + lang = roxywi_common.get_user_lang_for_flask() + + return render_template( + 'ajax/show_log_files.html', serv=serv, return_files=return_files, path_dir=log_path, lang=lang + ) + + +@app.route('/logs/<service>/<serv>/<rows>', defaults={'waf': '0'}, methods=['GET', 'POST']) +@app.route('/logs/<service>/waf/<serv>/<rows>', defaults={'waf': '1'}, methods=['GET', 'POST']) +@login_required +def show_logs(service, serv, rows, waf): + if request.method == 'GET': + grep = request.args.get('grep') + exgrep = request.args.get('exgrep') + hour = request.args.get('hour') + minute = request.args.get('minute') + hour1 = request.args.get('hour1') + minute1 = request.args.get('minute1') + log_file = request.args.get('file') + else: + grep = request.form.get('grep') + exgrep = request.form.get('exgrep') + hour = request.form.get('hour') + minute = request.form.get('minute') + hour1 = request.form.get('hour1') + minute1 = request.form.get('minute1') + log_file = request.form.get('file') + + if roxywi_common.check_user_group_for_flask(): + try: + out = roxy_logs.show_roxy_log(serv=serv, rows=rows, waf=waf, grep=grep, exgrep=exgrep, hour=hour, minute=minute, + hour1=hour1, minute1=minute1, service=service, log_file=log_file) + except Exception as e: + return str(e) + else: + return out + + +@app.route('/internal/show_version') +@cache.cached() +def show_roxywi_version(): + return render_template('ajax/check_version.html', versions=roxy.versions()) + + +@app.route('/stats/view/<service>/<server_ip>') +def show_stats(service, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + if service in ('nginx', 'apache'): + return service_common.get_stat_page(server_ip, service) + else: + return service_haproxy.stat_page_action(server_ip) + + +@app.route('/portscanner/history/<server_ip>') +@login_required +def portscanner_history(server_ip): + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + history = sql.select_port_scanner_history(server_ip) + user_subscription = roxywi_common.return_user_subscription() + + return render_template( + 'include/port_scan_history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, servers=user_params['servers'], + history=history, user_services=user_params['user_services'], token=user_params['token'], + user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], lang=user_params['lang'] + ) + + +@app.post('/portscanner/settings') +def change_settings_portscanner(): + server_id = common.checkAjaxInput(request.form.get('server_id')) + enabled = common.checkAjaxInput(request.form.get('enabled')) + notify = common.checkAjaxInput(request.form.get('notify')) + history = common.checkAjaxInput(request.form.get('history')) + user_group_id = [server[3] for server in sql.select_servers(id=server_id)] + + try: + if sql.insert_port_scanner_settings(server_id, user_group_id[0], enabled, notify, history): + return 'ok' + else: + if sql.update_port_scanner_settings(server_id, user_group_id[0], enabled, notify, history): + return 'ok' + except Exception as e: + return f'error: Cannot save settings: {e}' + else: + return 'ok' + + +@app.route('/portscanner/scan/<int:server_id>') +def scan_port(server_id): + server = sql.select_servers(id=server_id) + ip = '' + + for s in server: + ip = s[2] + + cmd = f"sudo nmap -sS {ip} |grep -E '^[[:digit:]]'|sed 's/ */ /g'" + cmd1 = f"sudo nmap -sS {ip} |head -5|tail -2" + + stdout, stderr = server_mod.subprocess_execute(cmd) + stdout1, stderr1 = server_mod.subprocess_execute(cmd1) + + if stderr != '': + return f'error: {stderr}' + else: + lang = roxywi_common.get_user_lang_for_flask() + return render_template('ajax/scan_ports.html', ports=stdout, info=stdout1, lang=lang) + + +@app.post('/nettols/<check>') +def nettols_check(check): + server_from = common.checkAjaxInput(request.form.get('server_from')) + server_to = common.is_ip_or_dns(request.form.get('server_to')) + action = common.checkAjaxInput(request.form.get('nettools_action')) + port_to = common.checkAjaxInput(request.form.get('nettools_telnet_port_to')) + dns_name = common.checkAjaxInput(request.form.get('nettools_nslookup_name')) + dns_name = common.is_ip_or_dns(dns_name) + record_type = common.checkAjaxInput(request.form.get('nettools_nslookup_record_type')) + + if check == 'icmp': + return nettools.ping_from_server(server_from, server_to, action) + elif check == 'tcp': + return nettools.telnet_from_server(server_from, server_to, port_to) + elif check == 'dns': + return nettools.nslookup_from_server(server_from, dns_name, record_type) + else: + return 'error: Wrong check' diff --git a/app/app.wsgi b/app/app.wsgi new file mode 100644 index 00000000..c7c3bca5 --- /dev/null +++ b/app/app.wsgi @@ -0,0 +1,4 @@ +import sys +sys.path.insert(0,"/var/www/haproxy-wi/") + +from app import app as application diff --git a/app/config.py b/app/config.py deleted file mode 100644 index 5e862ed8..00000000 --- a/app/config.py +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/env python3 -import os -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.common as roxywi_common - -time_zone = sql.get_setting('time_zone') -get_date = roxy_wi_tools.GetDate(time_zone) -get_config_var = roxy_wi_tools.GetConfigVar() -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('config.html') - -print('Content-type: text/html\n') - -form = common.form -serv = common.is_ip_or_dns(form.getvalue('serv')) -try: - service = common.checkAjaxInput(form.getvalue('service')) -except Exception: - print('<meta http-equiv="refresh" content="0; url=/app/">') - -is_serv_protected = False - -try: - config_file_name = form.getvalue('config_file_name').replace('92', '/') -except Exception: - config_file_name = '' - -config_read = "" -cfg = "" -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): - 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' - servers = roxywi_common.get_dick_permit(service=service_desc.slug) - - if service in ('haproxy', 'nginx', 'apache'): - configs_dir = get_config_var.get_config_var('configs', f'{service_desc.service}_save_configs_dir') - else: - configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir') - - if service == 'haproxy': - file_format = 'cfg' -else: - print('<meta http-equiv="refresh" content="0; url=/app/overview.py">') - -if serv is not None: - if service == 'nginx' or service == 'apache': - conf_file_name_short = config_file_name.split('/')[-1] - cfg = f"{configs_dir}{serv}-{conf_file_name_short}-{get_date.return_date('config')}.{file_format}" - else: - cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.{file_format}" - -if serv is not None and form.getvalue('open') is not None and form.getvalue('new_config') is None: - roxywi_common.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 = config_mod.get_config(serv, cfg, keepalived=1) - try: - roxywi_common.logging(serv, " Keepalived config has been opened for ") - except Exception: - pass - elif service == 'nginx': - error = config_mod.get_config(serv, cfg, nginx=1, config_file_name=config_file_name) - try: - roxywi_common.logging(serv, " NGINX config has been opened ") - except Exception: - pass - elif service == 'apache': - error = config_mod.get_config(serv, cfg, apache=1, config_file_name=config_file_name) - try: - roxywi_common.logging(serv, " Apache config has been opened ") - except Exception: - pass - else: - error = config_mod.get_config(serv, cfg) - try: - roxywi_common.logging(serv, " HAProxy config has been opened ") - except Exception: - pass - - try: - conf = open(cfg, "r") - config_read = conf.read() - conf.close() - except IOError: - error += '<br />Cannot read imported config file' - - os.system("/bin/mv %s %s.old" % (cfg, cfg)) - -if form.getvalue('new_config') is not None: - config_read = ' ' - -if serv is not None and form.getvalue('config') is not None: - roxywi_common.check_is_server_in_group(serv) - - config = form.getvalue('config') - oldcfg = form.getvalue('oldconfig') - save = form.getvalue('save') - - try: - with open(cfg, "a") as conf: - conf.write(config) - except IOError: - print("error: Cannot read imported config file") - - if service == 'keepalived': - stderr = config_mod.upload_and_restart(serv, cfg, just_save=save, keepalived=1, oldcfg=oldcfg) - elif service == 'nginx': - stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, nginx=1, oldcfg=oldcfg, config_file_name=config_file_name) - elif service == 'apache': - stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, apache=1, oldcfg=oldcfg, config_file_name=config_file_name) - else: - stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, oldcfg=oldcfg) - - config_mod.diff_config(oldcfg, cfg) - - try: - os.system("/bin/rm -f " + configs_dir + "*.old") - except Exception as e: - print('error: ' + str(e)) - - if stderr: - print(stderr) - - sys.exit() - -template = template.render( - 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'], lang=user_params['lang'], service_desc=service_desc -) -print(template) diff --git a/app/create_db.py b/app/create_db.py index 603cc4ce..cbe10832 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -159,194 +159,6 @@ def default_values(): 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'}, - {'param': 'do', 'name': 'DigitalOcearn', 'optgroup': 'do', 'section': 'provider', 'provider': 'do', 'image': '/inc/images/provisioning/providers/do.svg'}, - {'param': 'gcore', 'name': 'G-Core Labs', 'optgroup': 'gcore', 'section': 'provider', 'provider': 'gcore', 'image': '/inc/images/provisioning/providers/gcore.svg'}, - {'param': 'us-east-1', 'name': 'N. Virginia', 'optgroup': 'US East', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'us-east-2', 'name': 'Ohio', 'optgroup': 'US East', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'us-west-1', 'name': 'N. California', 'optgroup': 'US West', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'us-west-2', 'name': 'Oregon', 'optgroup': 'US West', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'af-south-1', 'name': 'Cape Town', 'optgroup': 'Africa', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/za.svg'}, - {'param': 'ap-east-1', 'name': 'Hong Kong', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/hk.svg'}, - {'param': 'ap-south-1', 'name': 'Mumbai', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/in.svg'}, - {'param': 'ap-northeast-2', 'name': 'Seoul', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/kr.svg'}, - {'param': 'ap-southeast-1', 'name': 'Singapore', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/sg.svg'}, - {'param': 'ap-southeast-2', 'name': 'Sydney', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/au.svg'}, - {'param': 'ap-northeast-1', 'name': 'Tokyo', 'optgroup': 'Asia Pacific', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/jp.svg'}, - {'param': 'ca-central-1', 'name': 'Central', 'optgroup': 'Canada', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/ca.svg'}, - {'param': 'eu-central-1', 'name': 'Frankfurt', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', - 'image': '/inc/images/provisioning/flags/de.svg'}, - {'param': 'eu-west-1', 'name': 'Ireland', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/ie.svg'}, - {'param': 'eu-west-2', 'name': 'London', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/gb.svg'}, - {'param': 'eu-south-1', 'name': 'Milan', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/fr.svg'}, - {'param': 'eu-west-3', 'name': 'Paris', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/fr.svg'}, - {'param': 'eu-north-1', 'name': 'Stockholm', 'optgroup': 'Europe', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/se.svg'}, - {'param': 'me-south-1', 'name': 'Bahrain', 'optgroup': 'Middle East', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/bh.svg'}, - {'param': 'sa-east-1', 'name': 'São Paulo', 'optgroup': 'South America', 'section': 'region', 'provider': 'aws', 'image': '/inc/images/provisioning/flags/br.svg'}, - {'param': 'nyc1', 'name': 'New York 1', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'nyc2', 'name': 'New York 2', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'nyc3', 'name': 'New York 3', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'sfo1', 'name': 'San Francisco 1', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'sfo2', 'name': 'San Francisco 2', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'sfo3', 'name': 'San Francisco 3', 'optgroup': 'USA', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': 'tor1', 'name': 'Toronto 1', 'optgroup': 'Canada', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/ca.svg'}, - {'param': 'ams2', 'name': 'Amsterdam 2', 'optgroup': 'Europe', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/nl.svg'}, - {'param': 'ams3', 'name': 'Amsterdam 3', 'optgroup': 'Europe', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/nl.svg'}, - {'param': 'fra1', 'name': 'Frankfurt 1', 'optgroup': 'Europe', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/de.svg'}, - {'param': 'lon1', 'name': 'London 1', 'optgroup': 'Europe', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/gb.svg'}, - {'param': 'sgp1', 'name': 'Singapore 1', 'optgroup': 'Asia', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/sg.svg'}, - {'param': 'blr1', 'name': 'Bangalore 1', 'optgroup': 'Asia', 'section': 'region', 'provider': 'do', 'image': '/inc/images/provisioning/flags/bh.svg'}, - {'param': '68', 'name': 'Chicago', 'optgroup': 'Americas', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': '14', 'name': 'Manassas', 'optgroup': 'Americas', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': '35', 'name': 'Santa-Clara', 'optgroup': 'Americas', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/us.svg'}, - {'param': '91', 'name': 'Sao Paulo', 'optgroup': 'Americas', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/br.svg'}, - {'param': '64', 'name': 'Hong-Kong', 'optgroup': 'Asia-Pacific', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/hk.svg'}, - {'param': '18', 'name': 'Singapore', 'optgroup': 'Asia-Pacific', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/sg.svg'}, - {'param': '88', 'name': 'Sydney', 'optgroup': 'Asia-Pacific', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/au.svg'}, - {'param': '29', 'name': 'Tokyo', 'optgroup': 'Asia-Pacific', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/jp.svg'}, - {'param': '46', 'name': 'Almaty', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/kz.svg'}, - {'param': '26', 'name': 'Amsterdam', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/nl.svg'}, - {'param': '51', 'name': 'Amsterdam-2', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/nl.svg'}, - {'param': '38', 'name': 'Frankfurt', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/de.svg'}, - {'param': '120', 'name': 'Darmstadt', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/de.svg'}, - {'param': '50', 'name': 'Istanbul', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/tr.svg'}, - {'param': '84', 'name': 'Johannesburg', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/za.svg'}, - {'param': '6', 'name': 'Luxembourg', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/lu.svg'}, - {'param': '76', 'name': 'Luxembourg-2', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/lu.svg'}, - {'param': '56', 'name': 'Paris', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/fr.svg'}, - {'param': '100', 'name': 'Paris-2', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/fr.svg'}, - {'param': '80', 'name': 'Warsaw', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/pl.svg'}, - {'param': '116', 'name': 'Dubai', 'optgroup': 'EMEA', 'section': 'region', 'provider': 'gcore', 'image': '/inc/images/provisioning/flags/ae.svg'}, - {'param': '22', 'name': 'Khabarovsk', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'}, - {'param': '10', 'name': 'Moscow', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'}, - {'param': '42', 'name': 'Saint Petersburg', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'}, - {'param': '60', 'name': 'Yekaterinburg', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'}, - {'param': '72', 'name': 'Novosibirsk', 'optgroup': 'Russia and CIS', 'section': 'region', 'provider': 'edge', 'image': '/inc/images/provisioning/flags/ru.svg'}, - {'param': 'ubuntu-18-04', 'name': 'Ubuntu 18.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-20-04', 'name': 'Ubuntu 20.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-20-14', 'name': 'Ubuntu 20.14', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-22-04', 'name': 'Ubuntu 22.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-23-04', 'name': 'Ubuntu 23.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'centos-7', 'name': 'CentOS 7', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'centos-8', 'name': 'CentOS 8', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'centos-9', 'name': 'CentOS 9', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'debian-9', 'name': 'Debian 9', 'optgroup': 'Debian', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'debian-10', 'name': 'Debian 10', 'optgroup': 'Debian', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'debian-11', 'name': 'Debian 11', 'optgroup': 'Debian', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'amazon-2_lts', 'name': 'Amazon Linux 2', 'optgroup': 'Amazon Linux', 'section': 'image', 'provider': 'aws', 'image': '/inc/images/provisioning/providers/aws.svg'}, - {'param': 'ubuntu-18-04-x64', 'name': 'Ubuntu 18.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-20-04-x64', 'name': 'Ubuntu 20.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-20-14-x64', 'name': 'Ubuntu 20.14', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-22-04-x64', 'name': 'Ubuntu 22.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-23-04-x64', 'name': 'Ubuntu 23.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'centos-7-x64', 'name': 'CentOS 7', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'centos-stream-8-x64', 'name': 'CentOS 8 Stream', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'centos-stream-9-x64', 'name': 'CentOS 9 Stream', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'rockylinux-8-4-x64', 'name': 'RockyLinux 8.4', 'optgroup': 'RockyLinux', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/rocky-linux.svg'}, - {'param': 'rockylinux-8-x64', 'name': 'RockyLinux 8.5', 'optgroup': 'RockyLinux', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/rocky-linux.svg'}, - {'param': 'debian-9-x64', 'name': 'Debian 9', 'optgroup': 'Debian', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'debian-10-x64', 'name': 'Debian 10', 'optgroup': 'Debian', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'debian-11-x64', 'name': 'Debian 11', 'optgroup': 'Debian', 'section': 'image', 'provider': 'do', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'ubuntu-18.04-x64', 'name': 'Ubuntu 18.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-20.04-x64', 'name': 'Ubuntu 20.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-20.10-x64', 'name': 'Ubuntu 20.10', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-22.04-x64', 'name': 'Ubuntu 22.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-22.10-x64', 'name': 'Ubuntu 22.10', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'ubuntu-23.04-x64', 'name': 'Ubuntu 23.04', 'optgroup': 'Ubuntu', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/ubuntu.svg'}, - {'param': 'centos-7-1811-x64-qcow2', 'name': 'CentOS 7.6', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'centos-7-2003-x64-qcow2', 'name': 'CentOS 7.8', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'centos8-stream-0210-x64', 'name': 'CentOS 8.4', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'centos9-stream-0330-x64', 'name': 'CentOS 9', 'optgroup': 'CentOS', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/centos.svg'}, - {'param': 'fedora-33-x64-qcow2', 'name': 'Fedora 33', 'optgroup': 'Fedora', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/fedora.svg'}, - {'param': 'fedora-34-x64-qcow2', 'name': 'Fedora 34', 'optgroup': 'Fedora', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/fedora.svg'}, - {'param': 'fedora-35-x64-qcow2', 'name': 'Fedora 35', 'optgroup': 'Fedora', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/fedora.svg'}, - {'param': 'debian-9.7-x64-qcow2', 'name': 'Debian 9.7', 'optgroup': 'Debian', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'debian-10.1-x64-qcow2', 'name': 'Debian 10.1', 'optgroup': 'Debian', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'debian-10.3-x64-qcow2', 'name': 'Debian 10.3', 'optgroup': 'Debian', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'debian-11.generic-x64-qcow2', 'name': 'Debian 11', 'optgroup': 'Debian', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/debian.svg'}, - {'param': 'windows-server-2019', 'name': 'Windows 2019', 'optgroup': 'Windows', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/windows.svg'}, - {'param': 'windows-server-2022', 'name': 'Windows 2022', 'optgroup': 'Windows', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/windows.svg'}, - {'param': 'sles15-SP2', 'name': 'SLES 15-SP2', 'optgroup': 'SUSE', 'section': 'image', 'provider': 'gcore', 'image': '/inc/images/provisioning/oss/suse.svg'}, - {'param': 's-1vcpu-1gb', 'name': 's-1vcpu-1gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'}, - {'param': 's-2vcpu-2gb', 'name': 's-2vcpu-2gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'}, - {'param': 's-2vcpu-4gb', 'name': 's-2vcpu-4gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'}, - {'param': 's-4vcpu-8gb', 'name': 's-4vcpu-8gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'}, - {'param': 's-8vcpu-16gb', 'name': 's-8vcpu-16gb', 'optgroup': 'Base', 'section': 'size', 'provider': 'do'}, - {'param': 's-1vcpu-1gb-intel', 'name': 's-1vcpu-1gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'}, - {'param': 's-2vcpu-2gb-intel', 'name': 's-2vcpu-2gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'}, - {'param': 's-2vcpu-4gb-intel', 'name': 's-2vcpu-4gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'}, - {'param': 's-4vcpu-8gb-intel', 'name': 's-4vcpu-8gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'}, - {'param': 's-8vcpu-16gb-intel', 'name': 's-8vcpu-16gb-intel', 'optgroup': 'Premium Intel', 'section': 'size', 'provider': 'do'}, - {'param': 's-1vcpu-1gb-amd', 'name': 's-1vcpu-1gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'}, - {'param': 's-2vcpu-2gb-amd', 'name': 's-2vcpu-2gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'}, - {'param': 's-2vcpu-4gb-amd', 'name': 's-2vcpu-4gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'}, - {'param': 's-4vcpu-8gb-amd', 'name': 's-4vcpu-8gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'}, - {'param': 's-8vcpu-16gb-amd', 'name': 's-8vcpu-16gb-amd', 'optgroup': 'Premium AMD', 'section': 'size', 'provider': 'do'}, - {'param': 'g-2vcpu-8gb', 'name': 'g-2vcpu-8gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'}, - {'param': 'g-4vcpu-16gb', 'name': 'g-4vcpu-16gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'}, - {'param': 'g-8vcpu-32gb', 'name': 'g-8vcpu-32gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'}, - {'param': 'g-32vcpu-128gb', 'name': 'g-32vcpu-128gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'}, - {'param': 'g-40vcpu-160gb', 'name': 'g-40vcpu-160gb', 'optgroup': 'General Purpose', 'section': 'size', 'provider': 'do'}, - {'param': 'c-4-8gib', 'name': 'c-4-8gib', 'optgroup': 'CPU-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'c-8-16gib', 'name': 'c-8-16gib', 'optgroup': 'CPU-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'c-16-32gib', 'name': 'c-16-32gib', 'optgroup': 'CPU-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'c-32-64gib', 'name': 'c-32-64gib', 'optgroup': 'CPU-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'm-2vcpu-16gb', 'name': 'm-2vcpu-16gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'm-4vcpu-32gb', 'name': 'm-4vcpu-32gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'm-8vcpu-64gb', 'name': 'm-8vcpu-64gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'm-16vcpu-128gb', 'name': 'm-16vcpu-128gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'm-24vcpu-192gb', 'name': 'm-24vcpu-192gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'm-32vcpu-256gb', 'name': 'm-32vcpu-256gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'm-32vcpu-256gb', 'name': 'm-32vcpu-256gb', 'optgroup': 'Memory-Optimized', 'section': 'size', 'provider': 'do'}, - {'param': 'g1-standard-1-2', 'name': 'g1-standard-1-2', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-2-4', 'name': 'g1-standard-2-4', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-2-8', 'name': 'g1-standard-2-8', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-4-8', 'name': 'g1-standard-4-8', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-4-16', 'name': 'g1-standard-4-16', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-8-16', 'name': 'g1-standard-8-16', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-8-32', 'name': 'g1-standard-8-32', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-16-32', 'name': 'g1-standard-16-32', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-16-64', 'name': 'g1-standard-16-64', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-32-64', 'name': 'g1-standard-32-64', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-standard-32-128', 'name': 'g1-standard-32-128', 'optgroup': 'Standard', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-cpu-2-2', 'name': 'g1-cpu-2-2', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-cpu-4-4', 'name': 'g1-cpu-4-4', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-cpu-8-8', 'name': 'g1-cpu-8-8', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-cpu-16-16', 'name': 'g1-cpu-16-16', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-cpu-32-32', 'name': 'g1-cpu-32-32', 'optgroup': 'vCPU', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-memory-4-32', 'name': 'g1-memory-4-32', 'optgroup': 'Memory', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-memory-8-64', 'name': 'g1-memory-8-64', 'optgroup': 'Memory', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-memory-16-128', 'name': 'g1-memory-16-128', 'optgroup': 'Memory', 'section': 'size', 'provider': 'gcore'}, - {'param': 'g1-memory-32-256', 'name': 'g1-memory-32-256', 'optgroup': 'Memory', 'section': 'size', 'provider': 'gcore'}, - {'param': 'gp2', 'name': 'gp2', 'optgroup': 'General Purpose SSD', 'section': 'volume_type', 'provider': 'aws'}, - {'param': 'gp3', 'name': 'gp3', 'optgroup': 'General Purpose SSD', 'section': 'volume_type', 'provider': 'aws'}, - {'param': 'standard', 'name': 'standard', 'optgroup': 'Magnetic', 'section': 'volume_type', 'provider': 'aws'}, - {'param': 'io1', 'name': 'io1', 'optgroup': 'Provisioned IOPS SSD', 'section': 'volume_type', 'provider': 'aws'}, - {'param': 'io2', 'name': 'io2', 'optgroup': 'Provisioned IOPS SSD', 'section': 'volume_type', 'provider': 'aws'}, - {'param': 'sc1', 'name': 'sc1', 'optgroup': 'Cold HDD', 'section': 'volume_type', 'provider': 'aws'}, - {'param': 'st1', 'name': 'st1', 'optgroup': 'Throughput Optimized HDD', 'section': 'volume_type', 'provider': 'aws'}, - {'param': 'standard', 'name': 'standard', 'optgroup': 'Standard network SSD', 'section': 'volume_type', 'provider': 'gcore'}, - {'param': 'ssd_hiiops', 'name': 'ssd_hiiops', 'optgroup': 'High IOPS SSD', 'section': 'volume_type', 'provider': 'gcore'}, - {'param': 'cold', 'name': 'cold', 'optgroup': 'HDD disk', 'section': 'volume_type', 'provider': 'gcore'}, - ] - - try: - ProvisionParam.insert_many(data_source).on_conflict_ignore().execute() - except Exception as e: - print(str(e)) - data_source = [ {'code': 'RW', 'name': 'Rwanda'}, {'code': 'SO', 'name': 'Somalia'}, @@ -731,18 +543,6 @@ def update_db_v_6_3_11(): print("Updating... DB has been updated to version 6.3.11") -def update_db_v_6_3_12(): - try: - ProvisionParam.delete().where( - (ProvisionParam.provider == 'gcore') & - (ProvisionParam.optgroup == 'Russia and CIS') - ).execute() - except Exception as e: - print("An error occurred:", e) - else: - print("Updating... DB has been updated to version 6.3.12") - - def update_db_v_6_3_13(): cursor = conn.cursor() sql = """ @@ -849,7 +649,7 @@ def update_db_v_6_3_18(): def update_ver(): try: - Version.update(version='6.3.18.0').execute() + Version.update(version='7.0.0.0').execute() except Exception: print('Cannot update version') @@ -874,7 +674,6 @@ def update_all(): update_db_v_6_3_8() update_db_v_6_3_9() update_db_v_6_3_11() - update_db_v_6_3_12() update_db_v_6_3_13() update_db_v_6_3_13_1() update_db_v_6_3_13_2() diff --git a/app/ha.py b/app/ha.py deleted file mode 100644 index 7871d59c..00000000 --- a/app/ha.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 -import sys - -import modules.common.common as common -import modules.roxywi.auth as roxywi_auth -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') - -print('Content-type: text/html\n') - -form = common.form -serv = form.getvalue('serv') - -user_params = roxywi_common.get_users_params() - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=3) -except Exception as e: - print(f'error {e}') - sys.exit() - -roxywi_auth.page_for_admin(level=2) -is_needed_tool = common.is_tool('ansible') - -try: - user_subscription = roxywi_common.return_user_status() -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) - -parsed_template = template.render( - 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 deleted file mode 100644 index c2945ba6..00000000 --- a/app/hapservers.py +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/env python3 -import sys - -import distro -from jinja2 import Environment, FileSystemLoader - -import modules.db.sql as sql -import modules.common.common as common -import modules.server.server as server_mod -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('hapservers.html') - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params() - -services = [] -servers: object -form = common.form -serv = common.is_ip_or_dns(form.getvalue('serv')) -service = common.checkAjaxInput(form.getvalue('service')) -autorefresh = 0 -servers_waf = () -title = '' -cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l" -keep_alive, stderr = server_mod.subprocess_execute(cmd) -is_restart = '' -service_desc = '' -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): - if serv: - if roxywi_common.check_is_server_in_group(serv): - servers = sql.select_servers(server=serv) - autorefresh = 1 - server_id = sql.select_server_id_by_ip(serv) - docker_settings = sql.select_docker_service_settings(server_id, service_desc.slug) - restart_settings = sql.select_restart_service_settings(server_id, service_desc.slug) - else: - servers = roxywi_common.get_dick_permit(virt=1, service=service_desc.slug) - docker_settings = sql.select_docker_services_settings(service_desc.slug) - restart_settings = sql.select_restart_services_settings(service_desc.slug) -else: - print('<meta http-equiv="refresh" content="0; url=/app/overview.py">') - sys.exit() - -services_name = {'roxy-wi-checker': 'Master backends checker service', - 'roxy-wi-keep_alive': 'Auto start service', - 'roxy-wi-metrics': 'Master metrics service'} -for s, v in services_name.items(): - if distro.id() == 'ubuntu': - if s == 'roxy-wi-keep_alive': - s = 'roxy-wi-keep-alive' - cmd = "apt list --installed 2>&1 |grep " + s - else: - cmd = "rpm --query " + s + "-* |awk -F\"" + s + "\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'" - service_ver, stderr = server_mod.subprocess_execute(cmd) - try: - services.append([s, service_ver[0]]) - except Exception: - services.append([s, '']) - -haproxy_sock_port = sql.get_setting('haproxy_sock_port') -servers_with_status1 = [] -out1 = '' -if len(servers) == 1: - serv = servers[0][2] -for s in servers: - servers_with_status = list() - servers_with_status.append(s[0]) - servers_with_status.append(s[1]) - servers_with_status.append(s[2]) - servers_with_status.append(s[11]) - if service == 'nginx': - h = (['', ''],) - 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 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 = [ - "docker exec -it " + container_name + " /usr/sbin/nginx -v 2>&1|awk '{print $3}' && " - "docker ps -a -f name=" + container_name + " --format '{{.Status}}'|tail -1 && ps ax |grep nginx:" - "|grep -v grep |wc -l" - ] - try: - out = server_mod.ssh_command(s[2], cmd) - h = () - out1 = [] - for k in out.split(): - out1.append(k) - h = (out1,) - servers_with_status.append(h) - servers_with_status.append(h) - servers_with_status.append(s[17]) - except Exception: - servers_with_status.append(h) - servers_with_status.append(h) - servers_with_status.append(s[17]) - elif service == 'keepalived': - h = (['', ''],) - cmd = [ - "/usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}' && systemctl status keepalived |" - "grep -e 'Active' |awk '{print $2, $9$10$11$12$13}' && ps ax |grep keepalived|grep -v grep |wc -l" - ] - try: - out = server_mod.ssh_command(s[2], cmd) - out1 = [] - for k in out.split(): - out1.append(k) - h = (out1,) - servers_with_status.append(h) - servers_with_status.append(h) - servers_with_status.append(s[22]) - except Exception: - servers_with_status.append(h) - servers_with_status.append(h) - servers_with_status.append(s[22]) - elif service == 'apache': - h = (['', ''],) - apache_stats_user = sql.get_setting('apache_stats_user') - apache_stats_password = sql.get_setting('apache_stats_password') - apache_stats_port = sql.get_setting('apache_stats_port') - apache_stats_page = sql.get_setting('apache_stats_page') - cmd = "curl -s -u %s:%s http://%s:%s/%s?auto |grep 'ServerVersion\|Processes\|ServerUptime:'" % ( - apache_stats_user, apache_stats_password, s[2], apache_stats_port, apache_stats_page - ) - try: - out = server_mod.subprocess_execute(cmd) - if out != '': - for k in out: - servers_with_status.append(k) - servers_with_status.append(s[22]) - except Exception: - servers_with_status.append(h) - servers_with_status.append(h) - servers_with_status.append(s[22]) - else: - cmd = 'echo "show info" |nc %s %s -w 1 -v|grep -e "Ver\|Uptime:\|Process_num"' % (s[2], haproxy_sock_port) - out = server_mod.subprocess_execute(cmd) - for k in out: - if "Connection refused" not in k: - out1 = out - else: - out1 = False - servers_with_status.append(out1) - - servers_with_status.append(s[12]) - - servers_with_status.append(sql.is_master(s[2])) - servers_with_status.append(sql.select_servers(server=s[2])) - - is_keepalived = sql.select_keepalived(s[2]) - - if is_keepalived: - try: - cmd = ['sudo kill -USR1 `cat /var/run/keepalived.pid` && sudo grep State /tmp/keepalived.data -m 1 |' - 'awk -F"=" \'{print $2}\'|tr -d \'[:space:]\' && sudo rm -f /tmp/keepalived.data'] - out = server_mod.ssh_command(s[2], cmd) - out1 = ('1', out) - servers_with_status.append(out1) - except Exception as e: - servers_with_status.append(str(e)) - else: - servers_with_status.append('') - - servers_with_status1.append(servers_with_status) - -try: - user_subscription = roxywi_common.return_user_status() -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) - -template = template.render( - 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'], - lang=user_params['lang'] -) -print(template) diff --git a/app/history.py b/app/history.py deleted file mode 100644 index 4edbdade..00000000 --- a/app/history.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python3 -import modules.db.sql as sql -import modules.common.common as common -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -from jinja2 import Environment, FileSystemLoader - -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('history.html') - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params(service='keepalived') - -form = common.form -serv = common.is_ip_or_dns(form.getvalue('serv')) -service = form.getvalue('service') -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): - 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: - 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: - history = sql.select_action_history_by_user_id(user_id_history) - -users = sql.select_users() - -try: - user_subscription = roxywi_common.return_user_status() -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) - -try: - sql.delete_action_history_for_period() -except Exception as e: - print(e) - -rendered_template = template.render( - 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'], lang=user_params['lang'] -) -print(rendered_template) diff --git a/app/login.py b/app/login.py deleted file mode 100644 index ee85c303..00000000 --- a/app/login.py +++ /dev/null @@ -1,238 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import os -import sys -import http.cookies - -import datetime -import uuid -import distro - -import modules.db.sql as sql -import modules.common.common as common -import modules.server.server as server_mod -import modules.roxy_wi_tools as roxy_wi_tools -import modules.roxywi.common as roxywi_common - -from jinja2 import Environment, FileSystemLoader -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('login.html') -form = common.form - -cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) -user_id = cookie.get('uuid') -try: - ref = form.getvalue('ref') - login = form.getvalue('login') - password = form.getvalue('pass') -except Exception: - ref = '' - login = '' - password = '' -error_log = "" -error = "" - - -def send_cookie(login): - session_ttl = int(sql.get_setting('session_ttl')) - expires = datetime.datetime.utcnow() + datetime.timedelta(days=session_ttl) - user_group = '' - user_uuid = str(uuid.uuid4()) - user_token = str(uuid.uuid4()) - sql.write_user_uuid(login, user_uuid) - sql.write_user_token(login, user_token) - - user_id = sql.get_user_id_by_uuid(user_uuid) - try: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_group_id = cookie.get('group') - user_group_id = user_group_id.value - if sql.check_user_group(user_id, user_group_id): - user_groups = user_group_id - else: - user_groups = sql.select_user_groups(user_id, limit=1) - except Exception: - user_groups = sql.select_user_groups(user_id, limit=1) - - c = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - c["uuid"] = user_uuid - c["uuid"]["path"] = "/app" - # c["uuid"]["samesite"] = "Strict" - c["uuid"]["Secure"] = "True" - c["uuid"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT") - c["group"] = user_groups - c["group"]["path"] = "/app" - # c["group"]["samesite"] = "Strict" - c["group"]["Secure"] = "True" - c["group"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT") - print(c.output()) - - try: - groups = sql.select_groups(id=user_groups) - for g in groups: - if g[0] == int(user_groups): - user_group = g[1] - except Exception: - user_group = '' - - try: - user_name = sql.get_user_name_by_uuid(user_uuid) - roxywi_common.logging('Roxy-WI server', f' user: {user_name}, group: {user_group} login', roxywi=1) - except Exception: - pass - print("Content-type: text/html\n") - print('ok') - - try: - if distro.id() == 'ubuntu': - if os.path.exists('/etc/apt/auth.conf.d/roxy-wi.conf'): - cmd = "grep login /etc/apt/auth.conf.d/roxy-wi.conf |awk '{print $2}'" - get_user_name, stderr = server_mod.subprocess_execute(cmd) - user_name = get_user_name[0] - else: - user_name = 'git' - else: - if os.path.exists('/etc/yum.repos.d/roxy-wi.repo'): - cmd = "grep base /etc/yum.repos.d/roxy-wi.repo |awk -F\":\" '{print $2}'|awk -F\"/\" '{print $3}'" - get_user_name, stderr = server_mod.subprocess_execute(cmd) - user_name = get_user_name[0] - else: - user_name = 'git' - if sql.select_user_name(): - sql.update_user_name(user_name) - else: - sql.insert_user_name(user_name) - except Exception as e: - roxywi_common.logging('Cannot update subscription: ', str(e), roxywi=1) - - sys.exit() - - -def ban(): - c = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - expires = datetime.datetime.utcnow() + datetime.timedelta(seconds=10) - c["ban"] = "1" - c["ban"]["path"] = "/" - # c["ban"]["samesite"] = "Strict" - c["ban"]["Secure"] = "True" - c["ban"]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT") - try: - roxywi_common.logging('Roxy-WI server', f'{login} failed log in', roxywi=1, login=1) - except Exception: - roxywi_common.logging('Roxy-WI server', ' Failed log in. Wrong username', roxywi=1) - print(c.output()) - print("Content-type: text/html\n") - print('ban') - sys.exit() - - -def check_in_ldap(user, password): - import ldap - - server = sql.get_setting('ldap_server') - port = sql.get_setting('ldap_port') - ldap_class_search = sql.get_setting('ldap_class_search') - root_user = sql.get_setting('ldap_user') - root_password = sql.get_setting('ldap_password') - ldap_base = sql.get_setting('ldap_base') - ldap_search_field = sql.get_setting('ldap_search_field') - ldap_user_attribute = sql.get_setting('ldap_user_attribute') - ldap_type = sql.get_setting('ldap_type') - - ldap_proto = 'ldap' if ldap_type == "0" else 'ldaps' - - ldap_bind = ldap.initialize('{}://{}:{}/'.format(ldap_proto, server, port)) - try: - ldap_bind.protocol_version = ldap.VERSION3 - ldap_bind.set_option(ldap.OPT_REFERRALS, 0) - - bind = ldap_bind.simple_bind_s(root_user, root_password) - - criteria = "(&(objectClass=" + ldap_class_search + ")(" + ldap_user_attribute + "=" + user + "))" - attributes = [ldap_search_field] - result = ldap_bind.search_s(ldap_base, ldap.SCOPE_SUBTREE, criteria, attributes) - - bind = ldap_bind.simple_bind_s(result[0][0], password) - except ldap.INVALID_CREDENTIALS: - ban() - except ldap.SERVER_DOWN: - print("Content-type: text/html\n") - 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(f'error: {e.message["desc"]}') - sys.exit() - else: - print("Content-type: text/html\n") - print(f'error: {e}') - sys.exit() - else: - send_cookie(user) - - -if ref is None: - ref = "/index.html" - -if form.getvalue('error'): - error_log = 'Something wrong. Try again' - -try: - if sql.get_setting('session_ttl'): - session_ttl = sql.get_setting('session_ttl') -except Exception as e: - error = f'error: {e}' - -try: - role = sql.get_user_role_by_uuid(user_id.value, user_group_id) - user = sql.get_user_name_by_uuid(user_id.value) -except Exception: - role = "" - user = "" - - -if form.getvalue('logout'): - try: - sql.delete_uuid(user_id.value) - except Exception: - pass - print("Set-cookie: uuid=; expires=Wed, May 18 03:33:20 2003; path=/app; httponly") - print("Content-type: text/html\n") - print('<meta http-equiv="refresh" content="0; url=/app/login.py">') - sys.exit() - -if login is not None and password is not None: - USERS = sql.select_users(user=login) - - for users in USERS: - if users.activeuser == 0: - print("Content-type: text/html\n") - print('Your login is disabled') - sys.exit() - if users.ldap_user == 1: - if login in users.username: - check_in_ldap(login, password) - else: - passwordHashed = roxy_wi_tools.Tools.get_hash(password) - if login in users.username and passwordHashed == users.password: - send_cookie(login) - break - else: - ban() - else: - ban() - print("Content-type: text/html\n") - -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, lang=lang -) -print(parsed_template) diff --git a/app/logs.py b/app/logs.py deleted file mode 100644 index fee5ea16..00000000 --- a/app/logs.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 -import modules.db.sql as sql -import modules.common.common as common -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -from jinja2 import Environment, FileSystemLoader -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('logs.html') -form = common.form -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params() - -if form.getvalue('grep') is None: - grep = "" -else: - grep = form.getvalue('grep') - -exgrep = form.getvalue('exgrep') if form.getvalue('exgrep') else '' - -if form.getvalue('rows') is None: - rows = 10 -else: - if form.getvalue('rows1') is not None: - rows = form.getvalue('rows1') - else: - rows = form.getvalue('rows') - -hour = form.getvalue('hour') -hour1 = form.getvalue('hour1') -minut = form.getvalue('minut') -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') 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): - 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): - servers = roxywi_common.get_dick_permit(haproxy=1) -else: - print('<meta http-equiv="refresh" content="0; url=/app/overview.py">') - -template = template.render( - 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, lang=user_params['lang'], service_name=service_name -) -print(template) diff --git a/app/metrics.py b/app/metrics.py deleted file mode 100644 index 63231cbe..00000000 --- a/app/metrics.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python3 -import distro - -import modules.db.sql as sql -import modules.common.common as common -import modules.server.server as server_mod -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -from jinja2 import Environment, FileSystemLoader -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('metrics.html') -form = common.form -service = form.getvalue('service') -service_desc = '' - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params() - -roxywi_common.check_user_group() - -try: - if distro.id() == 'ubuntu': - cmd = "apt list --installed 2>&1 |grep roxy-wi-metrics" - else: - cmd = "rpm -q roxy-wi-metrics-* |awk -F\"metrics\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'" - service_ver, stderr = server_mod.subprocess_execute(cmd) - services = '0' - - if not stderr: - 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): - 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): - 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): - group_id = roxywi_common.get_user_group(id=1) - user_params['servers'] = sql.select_servers_metrics(group_id) - service = 'haproxy' - services = '1' -except Exception: - pass - -try: - user_subscription = roxywi_common.return_user_status() -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) - -template = template.render( - 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'], lang=user_params['lang'], service_desc=service_desc -) -print(template) diff --git a/app/modules/alerting/__init__.py b/app/modules/alerting/__init__.py deleted file mode 100644 index ec8976af..00000000 --- a/app/modules/alerting/__init__.py +++ /dev/null @@ -1 +0,0 @@ -NAME = 'roxy-wi-alerting-module' diff --git a/app/modules/common/common.py b/app/modules/common/common.py index 3337ce9a..5e2de6eb 100644 --- a/app/modules/common/common.py +++ b/app/modules/common/common.py @@ -1,5 +1,6 @@ import re import cgi +import cgitb form = cgi.FieldStorage() error_mess = 'error: All fields must be completed' diff --git a/app/modules/config/add.py b/app/modules/config/add.py index 3324c493..508c4a4b 100644 --- a/app/modules/config/add.py +++ b/app/modules/config/add.py @@ -1,5 +1,6 @@ import os -import json + +from flask import render_template, request import modules.db.sql as sql import modules.server.ssh as ssh_mod @@ -14,6 +15,69 @@ get_date = roxy_wi_tools.GetDate(time_zone) get_config = roxy_wi_tools.GetConfigVar() +def save_to_haproxy_config(config: str, server_ip) -> str: + roxywi_common.check_is_server_in_group(server_ip) + hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir') + cfg = hap_configs_dir + server_ip + "-" + get_date.return_date('config') + ".cfg" + + config_mod.get_config(server_ip, cfg) + + try: + with open(cfg, "a") as conf: + conf.write(config) + except IOError as e: + raise Exception(f"error: Cannot read import config file {e}") + + try: + output = config_mod.master_slave_upload_and_restart(server_ip, cfg, "save", 'haproxy') + except Exception as e: + raise Exception(e) + + try: + roxywi_common.logging(server_ip, f"Add has been added a new {name}") + except Exception: + pass + + if output: + return output + else: + return name + + +def save_nginx_config(config_add: str, server_ip: str, config_name: str) -> str: + try: + server_name = sql.get_hostname_by_server_ip(server_ip) + except Exception: + server_name = server_ip + + roxywi_common.check_is_server_in_group(server_ip) + sub_folder = 'conf.d' if 'upstream' in config_name else 'sites-enabled' + + service_configs_dir = get_config.get_config_var('configs', 'nginx_save_configs_dir') + cfg = f'{service_configs_dir}{server_ip}-{config_name}.conf' + nginx_dir = common.return_nice_path(sql.get_setting('nginx_dir')) + + config_file_name = f'{nginx_dir}{sub_folder}/{config_name}.conf' + + try: + with open(cfg, "w") as conf: + conf.write(config_add) + except IOError: + return "error: Cannot save a new config" + + try: + roxywi_common.logging(server_ip, "add/nginx add new %s" % config_name) + except Exception: + pass + + output = config_mod.master_slave_upload_and_restart(server_ip, cfg, "save", 'nginx', config_file_name=config_file_name) + + if output: + return output + else: + return config_name + + def get_userlists(config): return_config = '' with open(config, 'r') as f: @@ -25,7 +89,7 @@ def get_userlists(config): return return_config -def show_userlist(server_ip: str) -> None: +def show_userlist(server_ip: str) -> str: configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir') format_file = 'cfg' @@ -47,55 +111,100 @@ def show_userlist(server_ip: str) -> None: roxywi_common.logging('Roxy-WI server', f' Cannot get Userlists from the config file {e}', roxywi=1) sections = 'error: Cannot get Userlists' - print(sections) + return sections -def get_bwlist(color: str, group: str, list_name: str) -> None: +def add_userlist() -> str: + generate = request.form.get('generateconfig') + server_ip = request.form.get('serv') + name = f"userlist {request.form.get('new_userlist')}\n" + + new_userlist_groups = "" + if request.form.get('userlist-group') is not None: + groups = request.form.getlist('userlist-group') + for group in groups: + if group == '': + continue + new_userlist_groups += f" group {group}\n" + + new_users_list = "" + if request.form.get('userlist-user') is not None: + users = request.form.getlist('userlist-user') + passwords = request.form.getlist('userlist-password') + userlist_user_group = request.form.getlist('userlist-user-group') + i = 0 + + for user in users: + if user == '': + continue + try: + group = f' groups {userlist_user_group[i]}' + except Exception: + group = '' + new_users_list += f" user {user} insecure-password {passwords[i]} {group}\n" + i += 1 + + config_add = "\n" + name + new_userlist_groups + new_users_list + + if generate: + return config_add + else: + try: + return save_to_haproxy_config(config_add, server_ip) + except Exception as e: + return str(e) + + +def get_bwlist(color: str, group: str, list_name: str) -> str: lib_path = get_config.get_config_var('main', 'lib_path') list_path = f"{lib_path}/lists/{group}/{color}/{list_name}" try: with open(list_path, 'r') as f: - print(f.read()) + return f.read() except IOError as e: - print(f"error: Cannot read {color} list: {e}") + return f"error: Cannot read {color} list: {e}" -def get_bwlists_for_autocomplete(color: str, group: str) -> None: +def get_bwlists_for_autocomplete(color: str, group: str) -> str: lib_path = get_config.get_config_var('main', 'lib_path') list_path = f"{lib_path}/lists/{group}/{color}" lists = roxywi_common.get_files(list_path, "lst") + lines = '' for line in lists: - print(line) + lines += line + ' ' + + return lines -def create_bwlist(server_ip: str, list_name: str, color: str, group: str) -> None: +def create_bwlist(server_ip: str, list_name: str, color: str, group: str) -> str: lib_path = get_config.get_config_var('main', 'lib_path') list_name = f"{list_name.split('.')[0]}.lst" list_path = f"{lib_path}/lists/{group}/{color}/{list_name}" try: open(list_path, 'a').close() - print('success: ') try: roxywi_common.logging(server_ip, f'A new list {color} {list_name} has been created', roxywi=1, login=1) except Exception: pass + return 'success: ' except IOError as e: - print(f'error: Cannot create a new {color} list. {e}, ') + return f'error: Cannot create a new {color} list. {e}, ' -def save_bwlist(list_name: str, list_con: str, color: str, group: str, server_ip: str, action: str) -> None: +def save_bwlist(list_name: str, list_con: str, color: str, group: str, server_ip: str, action: str) -> str: lib_path = get_config.get_config_var('main', 'lib_path') list_path = f"{lib_path}/lists/{group}/{color}/{list_name}" + path = sql.get_setting('haproxy_dir') + "/" + color + servers = [] + output = '' + try: with open(list_path, "w") as file: file.write(list_con) except IOError as e: - print(f'error: Cannot save {color} list. {e}') - - path = sql.get_setting('haproxy_dir') + "/" + color - servers = [] + return f'error: Cannot save {color} list. {e}' if server_ip != 'all': servers.append(server_ip) @@ -112,12 +221,12 @@ def save_bwlist(list_name: str, list_con: str, color: str, group: str, server_ip for serv in servers: server_mod.ssh_command(serv, [f"sudo mkdir {path}"]) server_mod.ssh_command(serv, [f"sudo chown $(whoami) {path}"]) - error = config_mod.upload(serv, f'{path}/{list_name}', list_path, dir='fullpath') + error = config_mod.upload(serv, f'{path}/{list_name}', list_path) if error: - print(f'error: Upload fail: {error} , ') + output += f'error: Upload fail: {error} , ' else: - print(f'success: Edited {color} list was uploaded to {serv} , ') + output += f'success: Edited {color} list was uploaded to {serv} , ' try: roxywi_common.logging(serv, f'Has been edited the {color} list {list_name}', roxywi=1, login=1) except Exception: @@ -135,17 +244,20 @@ def save_bwlist(list_name: str, list_con: str, color: str, group: str, server_ip elif action == 'reload': server_mod.ssh_command(serv, [f"sudo systemctl reload {haproxy_service_name}"]) + return output -def delete_bwlist(list_name: str, color: str, group: str, server_ip: str) -> None: + +def delete_bwlist(list_name: str, color: str, group: str, server_ip: str) -> str: servers = [] lib_path = get_config.get_config_var('main', 'lib_path') list_path = f"{lib_path}/lists/{group}/{color}/{list_name}" path = f"{sql.get_setting('haproxy_dir')}/{color}" + output = '' try: os.remove(list_path) except IOError as e: - print(f'error: Cannot delete {color} list from Roxy-WI server. {e} , ') + return f'error: Cannot delete {color} list from Roxy-WI server. {e} , ' if server_ip != 'all': servers.append(server_ip) @@ -163,27 +275,30 @@ def delete_bwlist(list_name: str, color: str, group: str, server_ip: str) -> Non error = server_mod.ssh_command(serv, [f"sudo rm {path}/{list_name}"], return_err=1) if error: - print(f'error: Deleting fail: {error} , ') + return f'error: Deleting fail: {error} , ' else: - print(f'success: the {color} list has been deleted on {serv} , ') + output += f'success: the {color} list has been deleted on {serv} , ' try: roxywi_common.logging(serv, f'has been deleted the {color} list {list_name}', roxywi=1, login=1) except Exception: pass + return output -def edit_map(map_name: str, group: str) -> None: +def edit_map(map_name: str, group: str) -> str: lib_path = get_config.get_config_var('main', 'lib_path') list_path = f"{lib_path}/maps/{group}/{map_name}" try: with open(list_path, 'r') as f: - print(f.read()) + read_map = f.read() except IOError as e: - print(f"error: Cannot read {map_name} list: {e}") + return f"error: Cannot read {map_name} list: {e}" + else: + return read_map -def create_map(server_ip: str, map_name: str, group: str) -> None: +def create_map(server_ip: str, map_name: str, group: str) -> str: lib_path = get_config.get_config_var('main', 'lib_path') map_name = f"{map_name.split('.')[0]}.map" map_path = f'{lib_path}/maps/{group}/' @@ -195,23 +310,26 @@ def create_map(server_ip: str, map_name: str, group: str) -> None: assert Exception(f'error: cannot create a local folder for maps: {e}') try: open(full_path, 'a').close() - print('success: ') try: roxywi_common.logging(server_ip, f'A new map {map_name} has been created', roxywi=1, login=1) except Exception: pass except IOError as e: assert Exception(f'error: Cannot create a new {map_name} map. {e}, ') + else: + return 'success: ' -def save_map(map_name: str, list_con: str, group: str, server_ip: str, action: str) -> None: +def save_map(map_name: str, list_con: str, group: str, server_ip: str, action: str) -> str: lib_path = get_config.get_config_var('main', 'lib_path') map_path = f"{lib_path}/maps/{group}/{map_name}" + output = '' + try: with open(map_path, "w") as file: file.write(list_con) except IOError as e: - print(f'error: Cannot save {map_name} list. {e}') + return f'error: Cannot save {map_name} list. {e}' path = sql.get_setting('haproxy_dir') + "/maps" servers = [] @@ -231,12 +349,11 @@ def save_map(map_name: str, list_con: str, group: str, server_ip: str, action: s for serv in servers: server_mod.ssh_command(serv, [f"sudo mkdir {path}"]) server_mod.ssh_command(serv, [f"sudo chown $(whoami) {path}"]) - error = config_mod.upload(serv, f'{path}/{map_name}', map_path, dir='fullpath') + error = config_mod.upload(serv, f'{path}/{map_name}', map_path) if error: - print(f'error: Upload fail: {error} , ') + return f'error: Upload fail: {error} , ' else: - print(f'success: Edited {map_name} map was uploaded to {serv} , ') try: roxywi_common.logging(serv, f'Has been edited the map {map_name}', roxywi=1, login=1) except Exception: @@ -254,17 +371,22 @@ def save_map(map_name: str, list_con: str, group: str, server_ip: str, action: s elif action == 'reload': server_mod.ssh_command(serv, [f"sudo systemctl reload {haproxy_service_name}"]) + output += f'success: Edited {map_name} map was uploaded to {serv} , ' -def delete_map(map_name: str, group: str, server_ip: str) -> None: + return output + + +def delete_map(map_name: str, group: str, server_ip: str) -> str: servers = [] lib_path = get_config.get_config_var('main', 'lib_path') list_path = f"{lib_path}/maps/{group}/{map_name}" path = f"{sql.get_setting('haproxy_dir')}/maps" + output = '' try: os.remove(list_path) except IOError as e: - print(f'error: Cannot delete {map_name} map from Roxy-WI server. {e} , ') + return f'error: Cannot delete {map_name} map from Roxy-WI server. {e} , ' if server_ip != 'all': servers.append(server_ip) @@ -282,47 +404,49 @@ def delete_map(map_name: str, group: str, server_ip: str) -> None: error = server_mod.ssh_command(serv, [f"sudo rm {path}/{map_name}"], return_err=1) if error: - print(f'error: Deleting fail: {error} , ') + return f'error: Deleting fail: {error} , ' else: - print(f'success: the {map_name} map has been deleted on {serv} , ') try: roxywi_common.logging(serv, f'has been deleted the {map_name} map', roxywi=1, login=1) except Exception: pass + output += f'success: the {map_name} map has been deleted on {serv} , ' + + return output -def create_saved_option(option: str, group: int) -> None: +def create_saved_option(option: str, group: int) -> str: if sql.insert_new_option(option, group): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) - template = env.get_template('/new_option.html') - template = template.render(options=sql.select_options(option=option)) - print(template) + return render_template('ajax/new_option.html', options=sql.select_options(option=option)) -def get_saved_option(group: str, term: str) -> None: +def get_saved_option(group: str, term: str) -> dict: options = sql.select_options(group=group, term=term) - a = {} v = 0 + for i in options: a[v] = i.options v = v + 1 - print(json.dumps(a)) + return a -def create_saved_server(server: str, group: str, desc: str) -> None: +def update_saved_option(option, option_id) -> bool: + try: + sql.update_options(option, option_id) + except Exception as e: + raise Exception(e) + else: + return True + + +def create_saved_server(server: str, group: str, desc: str) -> str: if sql.insert_new_savedserver(server, desc, group): - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) - template = env.get_template('/new_saved_servers.html') - - template = template.render(server=sql.select_saved_servers(server=server)) - print(template) + return render_template('ajax/new_saved_servers.html', server=sql.select_saved_servers(server=server)) -def get_saved_servers(group: str, term: str) -> None: +def get_saved_servers(group: str, term: str) -> str: servers = sql.select_saved_servers(group=group, term=term) a = {} @@ -335,10 +459,10 @@ def get_saved_servers(group: str, term: str) -> None: a[v]['desc'] = i.description v = v + 1 - print(json.dumps(a)) + return a -def get_le_cert(server_ip: str, lets_domain: str, lets_email: str) -> None: +def get_le_cert(server_ip: str, lets_domain: str, lets_email: str) -> str: proxy = sql.get_setting('proxy') ssl_path = common.return_nice_path(sql.get_setting('cert_path'), is_service=0) haproxy_dir = sql.get_setting('haproxy_dir') @@ -361,94 +485,90 @@ def get_le_cert(server_ip: str, lets_domain: str, lets_email: str) -> None: if error: roxywi_common.logging('Roxy-WI server', error, roxywi=1) - print(error) + return error else: for line in output: if any(s in line for s in ("msg", "FAILED")): try: line = line.split(':')[1] line = line.split('"')[1] - print(line + "<br>") - break + return line + "<br>" except Exception: - print(output) - break + return output else: - print('success: Certificate has been created') - - os.remove(script) + os.remove(script) + return 'success: Certificate has been created' -def get_ssl_cert(server_ip: str, cert_id: int) -> None: +def get_ssl_cert(server_ip: str, cert_id: int) -> str: cert_path = sql.get_setting('cert_path') commands = [f"openssl x509 -in {cert_path}/{cert_id} -text"] try: - server_mod.ssh_command(server_ip, commands, ip="1") + return server_mod.ssh_command(server_ip, commands) except Exception as e: - print(f'error: Cannot connect to the server {e.args[0]}') + return f'error: Cannot connect to the server {e.args[0]}' -def get_ssl_raw_cert(server_ip: str, cert_id: int) -> None: +def get_ssl_raw_cert(server_ip: str, cert_id: int) -> str: cert_path = sql.get_setting('cert_path') commands = [f"cat {cert_path}/{cert_id}"] try: - server_mod.ssh_command(server_ip, commands, ip="1") + return server_mod.ssh_command(server_ip, commands) except Exception as e: - print(f'error: Cannot connect to the server {e.args[0]}') + return f'error: Cannot connect to the server {e.args[0]}' -def get_ssl_certs(server_ip: str) -> None: +def get_ssl_certs(server_ip: str) -> str: cert_path = sql.get_setting('cert_path') commands = [f"sudo ls -1t {cert_path} |grep -E 'pem|crt|key'"] try: - server_mod.ssh_command(server_ip, commands, ip="1") + return server_mod.ssh_command(server_ip, commands) except Exception as e: - print(f'error: Cannot connect to the server: {e.args[0]}') + return f'error: Cannot connect to the server: {e.args[0]}' -def del_ssl_cert(server_ip: str, cert_id: str) -> None: +def del_ssl_cert(server_ip: str, cert_id: str) -> str: cert_path = sql.get_setting('cert_path') commands = [f"sudo rm -f {cert_path}/{cert_id}"] try: - server_mod.ssh_command(server_ip, commands, ip="1") + return server_mod.ssh_command(server_ip, commands) except Exception as e: - print(f'error: Cannot delete the certificate {e.args[0]}') + return f'error: Cannot delete the certificate {e.args[0]}' -def upload_ssl_cert(server_ip: str, ssl_name: str, ssl_cont: str) -> None: +def upload_ssl_cert(server_ip: str, ssl_name: str, ssl_cont: str) -> str: cert_path = sql.get_setting('cert_path') - name = '' + tmp_path = sql.get_setting('tmp_config_path') + slave_output = '' if ssl_name is None: - print('error: Please enter a desired name') + return 'error: Please enter a desired name' else: name = f"{ssl_name}.pem" + path_to_file = f"{tmp_path}/{ssl_name}.pem" try: - with open(name, "w") as ssl_cert: + with open(path_to_file, "w") as ssl_cert: ssl_cert.write(ssl_cont) except IOError as e: - print(f'error: Cannot save the SSL key file: {e.args[0]}') - return + return f'error: Cannot save the SSL key file: {e}' masters = sql.is_master(server_ip) for master in masters: if master[0] is not None: - error = config_mod.upload(master[0], cert_path, name) + error = config_mod.upload(master[0], f'{cert_path}/{name}', path_to_file) if not error: - print(f'success: the SSL file has been uploaded to {master[0]} into: {cert_path}/{name} <br/>') + slave_output += f'success: the SSL file has been uploaded to {master[0]} into: {cert_path}/{name} \n' try: - error = config_mod.upload(server_ip, cert_path, name) - if not error: - print(f'success: the SSL file has been uploaded to {server_ip} into: {cert_path}/{name}') + error = config_mod.upload(server_ip, f'{cert_path}/{name}', path_to_file) except Exception as e: - roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) - # try: - # os.rename(name, cert_local_dir) - # except OSError as e: - # roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) + roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) + return f'error: cannot upload SSL cert: {e}' - roxywi_common.logging(server_ip, f"add.py#ssl uploaded a new SSL cert {name}", roxywi=1, login=1) + roxywi_common.logging(server_ip, f"add#ssl uploaded a new SSL cert {name}", roxywi=1, login=1) + + if not error: + return f'success: the SSL file has been uploaded to {server_ip} into: {cert_path}/{name} \n {slave_output}' diff --git a/app/modules/config/config.py b/app/modules/config/config.py index fbc9e9fb..99ffb0bf 100644 --- a/app/modules/config/config.py +++ b/app/modules/config/config.py @@ -1,8 +1,7 @@ import os import re -import http.cookies -from jinja2 import Environment, FileSystemLoader +from flask import render_template, request import modules.db.sql as sql import modules.server.ssh as mod_ssh @@ -12,7 +11,6 @@ import modules.roxywi.common as roxywi_common import modules.roxy_wi_tools as roxy_wi_tools import modules.service.common as service_common -form = common.form time_zone = sql.get_setting('time_zone') get_date = roxy_wi_tools.GetDate(time_zone) get_config_var = roxy_wi_tools.GetConfigVar() @@ -28,6 +26,7 @@ def get_config(server_ip, cfg, **kwargs): or kwargs.get("apache") or kwargs.get("service") == 'apache' ): config_path = common.checkAjaxInput(kwargs.get('config_file_name')) + config_path = config_path.replace('92', '/') elif kwargs.get("waf") or kwargs.get("service") == 'waf': if kwargs.get("waf") == 'haproxy': config_path = f'{sql.get_setting("haproxy_dir")}/waf/rules/{kwargs.get("waf_rule_file")}' @@ -44,51 +43,42 @@ def get_config(server_ip, cfg, **kwargs): ssh.get_sftp(config_path, cfg) except Exception as e: roxywi_common.logging('Roxy-WI server', f'error: cannot get config: {e}', roxywi=1) + raise Exception(f'error: cannot get config: {e}') -def upload(server_ip, path, file, **kwargs): - full_path = path + file - if kwargs.get('dir') == "fullpath": - full_path = path - +def upload(server_ip, path, file): try: with mod_ssh.ssh_connect(server_ip) as ssh: - ssh.put_sftp(file, full_path) + ssh.put_sftp(file, path) except Exception as e: error = str(e.args) - roxywi_common.logging('Roxy-WI server', error, roxywi=1) - print(f' Cannot upload {file} to {full_path} to server: {server_ip} error: {error}') - return error + roxywi_common.logging('Roxy-WI server', f'error: Cannot upload {file} to {path} to server: {server_ip}: {error}', roxywi=1) + print(f'error: Cannot upload {file} to {path} to server: {server_ip}: {error}') + raise Exception(error) -def upload_and_restart(server_ip: str, cfg: str, **kwargs): - error = '' +def upload_and_restart(server_ip: str, cfg: str, just_save: str, service: str, **kwargs): + file_format = 'conf' + config_path = kwargs.get('config_file_name') service_name = '' container_name = '' reload_or_restart_command = '' - file_format = 'conf' - config_path = kwargs.get('config_file_name') config_date = get_date.return_date('config') server_id = sql.select_server_id_by_ip(server_ip=server_ip) - if kwargs.get("nginx"): - service = 'nginx' - elif kwargs.get("apache"): - service = 'apache' - elif kwargs.get("keepalived"): - service = 'keepalived' - config_path = sql.get_setting('keepalived_config_path') - file_format = 'cfg' - elif kwargs.get('waf'): - service = 'waf' - else: - service = 'haproxy' + if config_path and config_path != 'undefined': + config_path = kwargs.get('config_file_name').replace('92', '/') + + if service == 'haproxy': config_path = sql.get_setting('haproxy_config_path') file_format = 'cfg' + if service == 'keepalived': + config_path = sql.get_setting('keepalived_config_path') + file_format = 'cfg' + if '..' in config_path: - print('error: nice try') - return None + raise Exception('error: nice try') tmp_file = f"{sql.get_setting('tmp_config_path')}/{config_date}.{file_format}" is_dockerized = sql.select_service_setting(server_id, service, 'dockerized') @@ -105,20 +95,22 @@ def upload_and_restart(server_ip: str, cfg: str, **kwargs): if haproxy_enterprise == '1': service_name = "hapee-2.0-lb" if service == 'apache': - service_name = service_common.get_correct_apache_service_name(server_ip, 0) + service_name = service_common.get_correct_apache_service_name(0, server_id) reload_command = f" && sudo systemctl reload {service_name}" restart_command = f" && sudo systemctl restart {service_name}" - if kwargs.get("just_save") == 'save': - action = 'save' - elif kwargs.get("just_save") == 'test': - action = 'test' - elif kwargs.get("just_save") == 'reload': + if just_save in ('save', 'test'): + action = just_save + elif just_save == 'reload': action = 'reload' reload_or_restart_command = reload_command else: - service_common.is_not_allowed_to_restart(server_id, service) + try: + service_common.is_not_allowed_to_restart(server_id, service) + except Exception as e: + return str(e) + action = 'restart' reload_or_restart_command = restart_command @@ -130,7 +122,7 @@ def upload_and_restart(server_ip: str, cfg: str, **kwargs): try: os.system(f"dos2unix -q {cfg}") except OSError: - return 'error: there is no dos2unix' + raise Exception('error: there is no dos2unix') if service == "keepalived": move_config = f"sudo mv -f {tmp_file} {config_path}" @@ -189,62 +181,68 @@ def upload_and_restart(server_ip: str, cfg: str, **kwargs): commands[0] += open_port_firewalld(cfg, server_ip=server_ip) try: - upload(server_ip, tmp_file, cfg, dir='fullpath') + upload(server_ip, tmp_file, cfg) + except Exception as e: + roxywi_common.logging('Roxy-WI server', f'error: Cannot upload config: {e}', roxywi=1) + raise Exception(f'error: Cannot upload config: {e}') + + try: + if action != 'test': + roxywi_common.logging(server_ip, 'A new config file has been uploaded', login=login, keep_history=1, service=service) + except Exception as e: + roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) + + # If master then save version of config in a new way + if not kwargs.get('slave') and service != 'waf': + from pathlib import Path + + diff = '' try: - if action != 'test': - roxywi_common.logging(server_ip, 'A new config file has been uploaded', login=login, keep_history=1, service=service) + old_cfg = kwargs.get('oldcfg') + path = Path(old_cfg) + except Exception: + old_cfg = '' + path = Path(old_cfg) + + if not path.is_file(): + old_cfg = f'{tmp_file}.old' + try: + get_config(server_ip, old_cfg, service=service, config_file_name=config_path) + except Exception: + roxywi_common.logging('Roxy-WI server', 'Cannot download config for diff', roxywi=1) + try: + diff = diff_config(old_cfg, cfg, return_diff=1) except Exception as e: roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) - # If master then save version of config in a new way - if not kwargs.get('slave') and service != 'waf': - from pathlib import Path - - diff = '' - try: - old_cfg = kwargs.get('oldcfg') - path = Path(old_cfg) - except Exception: - old_cfg = '' - path = Path(old_cfg) - - if not path.is_file(): - old_cfg = f'{tmp_file}.old' - try: - get_config(server_ip, old_cfg, service=service, config_file_name=config_path) - except Exception: - roxywi_common.logging('Roxy-WI server', 'Cannot download config for diff', roxywi=1) - try: - diff = diff_config(old_cfg, cfg, return_diff=1) - except Exception as e: - roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) - - try: - user_id = roxywi_common.get_user_id(login=kwargs.get('login')) - sql.insert_config_version(server_id, user_id, service, cfg, config_path, diff) - except Exception as e: - roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) - except Exception as e: - roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) - return error + try: + user_id = roxywi_common.get_user_id(login=kwargs.get('login')) + sql.insert_config_version(server_id, user_id, service, cfg, config_path, diff) + except Exception as e: + roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) try: error = server_mod.ssh_command(server_ip, commands) - try: - if action == 'reload' or action == 'restart': - roxywi_common.logging(server_ip, f'Service has been {action}ed', login=login, keep_history=1, service=service) - except Exception as e: - roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) except Exception as e: roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) - return e + raise Exception(f'{e}') + + try: + if action == 'reload' or action == 'restart': + roxywi_common.logging(server_ip, f'Service has been {action}ed', login=login, keep_history=1, service=service) + except Exception as e: + roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) if error.strip() != 'haproxy' and error.strip() != 'nginx': return error.strip() -def master_slave_upload_and_restart(server_ip, cfg, just_save, **kwargs): +def master_slave_upload_and_restart(server_ip, cfg, just_save, service, **kwargs): slave_output = '' + masters = sql.is_master(server_ip) + config_file_name = kwargs.get('config_file_name') + oldcfg = kwargs.get('oldcfg') + waf = kwargs.get('waf') try: server_name = sql.get_hostname_by_server_ip(server_ip) @@ -256,25 +254,25 @@ def master_slave_upload_and_restart(server_ip, cfg, just_save, **kwargs): else: login = '' - masters = sql.is_master(server_ip) - for master in masters: if master[0] is not None: - slv_output = upload_and_restart( - master[0], cfg, just_save=just_save, nginx=kwargs.get('nginx'), - apache=kwargs.get('apache'), config_file_name=kwargs.get('config_file_name'), slave=1 - ) - slave_output += f'<br>slave_server:\n{slv_output}' - - output = upload_and_restart( - server_ip, cfg, just_save=just_save, nginx=kwargs.get('nginx'), waf=kwargs.get('waf'), - apache=kwargs.get('apache'), config_file_name=kwargs.get('config_file_name'), - oldcfg=kwargs.get('oldcfg'), login=login - ) + try: + slv_output = upload_and_restart( + master[0], cfg, just_save, service, waf=waf, config_file_name=config_file_name, slave=1 + ) + slave_output += f'<br>slave_server:\n{slv_output}' + except Exception as e: + return f'{e}' + try: + output = upload_and_restart( + server_ip, cfg, just_save, service, waf=waf, config_file_name=config_file_name, oldcfg=oldcfg, login=login + ) + except Exception as e: + return f'{e}' output = server_name + ':\n' + output - output = output + slave_output + return output @@ -325,7 +323,6 @@ def open_port_firewalld(cfg, server_ip, **kwargs): def diff_config(oldcfg, cfg, **kwargs): - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) log_path = get_config_var.get_config_var('main', 'log_path') user_group = roxywi_common.get_user_group() diff = "" @@ -334,8 +331,8 @@ def diff_config(oldcfg, cfg, **kwargs): cmd = "/bin/diff -ub %s %s" % (oldcfg, cfg) try: - user_uuid = cookie.get('uuid') - login = sql.get_user_name_by_uuid(user_uuid.value) + user_uuid = request.cookies.get('uuid') + login = sql.get_user_name_by_uuid(user_uuid) except Exception: login = '' @@ -377,164 +374,149 @@ def show_finding_in_config(stdout: str, **kwargs) -> str: return out -def show_compare_config(server_ip: str) -> None: - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/show_compare_configs.html') - left = form.getvalue('left') - right = form.getvalue('right') - service = form.getvalue('service') - lang = roxywi_common.get_user_lang() +def show_compare_config(server_ip: str, service: str) -> str: + lang = roxywi_common.get_user_lang_for_flask() + config_dir = get_config_var.get_config_var('configs', f'{service}_save_configs_dir') - if service == 'nginx': - return_files = roxywi_common.get_files(get_config_var.get_config_var('configs', 'nginx_save_configs_dir'), 'conf') - elif service == 'apache': - return_files = roxywi_common.get_files(get_config_var.get_config_var('configs', 'apache_save_configs_dir'), 'conf') - elif service == 'keepalived': - return_files = roxywi_common.get_files(get_config_var.get_config_var('configs', 'kp_save_configs_dir'), 'conf') + if service in ('nginx', 'apache', 'keepalived'): + return_files = roxywi_common.get_files(config_dir, 'conf', server_ip=server_ip) + elif service == 'haproxy': + return_files = roxywi_common.get_files(config_dir, 'cfg', server_ip=server_ip) else: - return_files = roxywi_common.get_files() + return 'error: Wrong service' - template = template.render(serv=server_ip, right=right, left=left, return_files=return_files, lang=lang) - print(template) + return render_template('ajax/show_compare_configs.html', serv=server_ip, return_files=return_files, lang=lang) -def compare_config() -> None: - left = common.checkAjaxInput(form.getvalue('left')) - right = common.checkAjaxInput(form.getvalue('right')) - lang = roxywi_common.get_user_lang() +def compare_config(service: str, left: str, right: str) -> str: + lang = roxywi_common.get_user_lang_for_flask() - if form.getvalue('service') == 'nginx': - configs_dir = get_config_var.get_config_var('configs', 'nginx_save_configs_dir') - elif form.getvalue('service') == 'apache': - configs_dir = get_config_var.get_config_var('configs', 'apache_save_configs_dir') - elif form.getvalue('service') == 'keepalived': - configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir') + if service in ('haproxy', 'nginx', 'apache', 'keepalived'): + configs_dir = get_config_var.get_config_var('configs', f'{service}_save_configs_dir') else: - configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') + return 'error: Wrong service' cmd = f'diff -pub {configs_dir}{left} {configs_dir}{right}' - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, - extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"]) - template = env.get_template('ajax/compare.html') - output, stderr = server_mod.subprocess_execute(cmd) - template = template.render(stdout=output, lang=lang) - print(template) - print(stderr) + return render_template('ajax/compare.html', stdout=output, lang=lang) -def show_config(server_ip: str) -> None: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_uuid = cookie.get('uuid') - group_id = cookie.get('group') - group_id = int(group_id.value) - role_id = sql.get_user_role_by_uuid(user_uuid.value, group_id) - service = form.getvalue('service') +def show_config(server_ip: str, service: str, config_file_name: str, configver: str) -> str: + user_uuid = request.cookies.get('uuid') + group_id = int(request.cookies.get('group')) + role_id = sql.get_user_role_by_uuid(user_uuid, group_id) + try: - config_file_name = form.getvalue('config_file_name').replace('/', '92') + config_file_name = config_file_name.replace('/', '92') except Exception: config_file_name = '' - if service == 'keepalived': - configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir') - cfg = '.conf' - elif service == 'nginx': - configs_dir = get_config_var.get_config_var('configs', 'nginx_save_configs_dir') - cfg = '.conf' - elif service == 'apache': - configs_dir = get_config_var.get_config_var('configs', 'apache_save_configs_dir') + if service in ('nginx', 'apache', 'keepalived'): + configs_dir = get_config_var.get_config_var('configs', f'{service}_save_configs_dir') cfg = '.conf' else: configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') cfg = '.cfg' if '..' in configs_dir: - print('error: nice try') - return None + raise Exception('error: nice try') - if form.getvalue('configver') is None: + if configver is None: cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}{cfg}" try: - get_config(server_ip, cfg, service=service, config_file_name=form.getvalue('config_file_name')) + get_config(server_ip, cfg, service=service, config_file_name=config_file_name) except Exception as e: - print(e) - return + raise Exception(e) else: - cfg = configs_dir + form.getvalue('configver') + cfg = configs_dir + configver + try: - conf = open(cfg, "r") - except IOError: - print('<div class="alert alert-danger">Cannot read config file</div>') + with open(cfg, 'r') as file: + conf = file.readlines() + except Exception as e: + raise Exception(f'error: Cannot read config file: {e}') + + if configver is None: + os.remove(cfg) is_serv_protected = sql.is_serv_protected(server_ip) server_id = sql.select_server_id_by_ip(server_ip) hostname = sql.get_hostname_by_server_ip(server_ip) is_restart = sql.select_service_setting(server_id, service, 'restart') - lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, trim_blocks=True, lstrip_blocks=True, - extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"]) - template = env.get_template('ajax/config_show.html') + lang = roxywi_common.get_user_lang_for_flask() - template = template.render(conf=conf, serv=server_ip, configver=form.getvalue('configver'), role=role_id, - service=service, config_file_name=config_file_name, is_serv_protected=is_serv_protected, - is_restart=is_restart, lang=lang, hostname=hostname) - print(template) - conf.close() - - if form.getvalue('configver') is None: - os.remove(cfg) + return render_template( + 'ajax/config_show.html', conf=conf, serv=server_ip, configver=configver, role=role_id, service=service, + config_file_name=config_file_name, is_serv_protected=is_serv_protected, is_restart=is_restart, lang=lang, + hostname=hostname + ) -def show_config_files(server_ip: str) -> None: - service = form.getvalue('service') +def show_config_files(server_ip: str, service: str, config_file_name: str) -> str: service_config_dir = sql.get_setting(f'{service}_dir') return_files = server_mod.get_remote_files(server_ip, service_config_dir, 'conf') if 'error: ' in return_files: - print(return_files) - return + raise Exception(return_files) try: - config_file_name = form.getvalue('config_file_name').replace('92', '/') + config_file_name = config_file_name.replace('92', '/') except Exception: config_file_name = '' return_files += ' ' + sql.get_setting(f'{service}_config_path') - lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/show_configs_files.html') - template = template.render(serv=server_ip, service=service, return_files=return_files, lang=lang, - config_file_name=config_file_name, path_dir=service_config_dir) - print(template) + lang = roxywi_common.get_user_lang_for_flask() + + return render_template( + 'ajax/show_configs_files.html', serv=server_ip, service=service, return_files=return_files, lang=lang, + config_file_name=config_file_name, path_dir=service_config_dir + ) -def list_of_versions(server_ip: str, service: str) -> None: +def list_of_versions(server_ip: str, service: str, configver: str, for_delver: int) -> str: if service not in ('haproxy', 'nginx', 'keepalived', 'apache'): - print('error: wrong service') - return None + raise Exception('error: wrong service') - configver = common.checkAjaxInput(form.getvalue('configver')) - for_delver = common.checkAjaxInput(form.getvalue('for_delver')) users = sql.select_users() service_desc = sql.select_service(service) configs = sql.select_config_version(server_ip, service_desc.slug) - lang = roxywi_common.get_user_lang() - action = f'versions.py?service={service_desc.slug}' - - if service in ('haproxy', 'nginx', 'apache'): - configs_dir = get_config_var.get_config_var('configs', f'{service_desc.service}_save_configs_dir') - else: - configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir') + lang = roxywi_common.get_user_lang_for_flask() + action = f'/app/config/versions/{service_desc.slug}/{server_ip}' + configs_dir = get_config_var.get_config_var('configs', f'{service_desc.service}_save_configs_dir') if service == 'haproxy': - files = roxywi_common.get_files() + files = roxywi_common.get_files(configs_dir, 'cfg', server_ip) else: - files = roxywi_common.get_files(configs_dir, 'conf') + files = roxywi_common.get_files(configs_dir, 'conf', server_ip) - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"]) - template = env.get_template('ajax/show_list_version.html') + return render_template( + 'ajax/show_list_version.html', server_ip=server_ip, service=service, action=action, return_files=files, + configver=configver, for_delver=for_delver, configs=configs, users=users, lang=lang + ) - template = template.render(serv=server_ip, service=service, action=action, return_files=files, configver=configver, - for_delver=for_delver, configs=configs, users=users, lang=lang) - print(template) + +def return_cfg(service: str, server_ip: str, config_file_name: str) -> str: + if service == 'haproxy': + file_format = 'cfg' + else: + file_format = 'conf' + + if service in ('haproxy', 'nginx', 'apache', 'keepalived'): + configs_dir = get_config_var.get_config_var('configs', f'{service}_save_configs_dir') + else: + raise Exception('error: Wrong service') + + if service in ('nginx', 'apache'): + config_file_name = config_file_name.replace('92', '/') + conf_file_name_short = config_file_name.split('/')[-1] + cfg = f"{configs_dir}{server_ip}-{conf_file_name_short}-{get_date.return_date('config')}.{file_format}" + else: + cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}.{file_format}" + + try: + os.system(f"/bin/rm -f {configs_dir}*.old") + except Exception: + pass + + return cfg diff --git a/app/modules/config/runtime.py b/app/modules/config/runtime.py index 99365887..2b7df89a 100644 --- a/app/modules/config/runtime.py +++ b/app/modules/config/runtime.py @@ -1,49 +1,47 @@ import json +from flask import render_template + import modules.db.sql as sql -import modules.common.common as common import modules.config.config as config_mod import modules.server.server as server_mod import modules.roxywi.common as roxywi_common import modules.roxy_wi_tools as roxy_wi_tools -form = common.form -serv = common.is_ip_or_dns(form.getvalue('serv')) time_zone = sql.get_setting('time_zone') get_date = roxy_wi_tools.GetDate(time_zone) get_config_var = roxy_wi_tools.GetConfigVar() -def show_frontend_backend() -> None: +def show_frontend_backend(serv: str, backend: str) -> str: haproxy_sock_port = int(sql.get_setting('haproxy_sock_port')) - backend = common.checkAjaxInput(form.getvalue('ipbackend')) cmd = 'echo "show servers state"|nc %s %s |grep "%s" |awk \'{print $4}\'' % (serv, haproxy_sock_port, backend) output, stderr = server_mod.subprocess_execute(cmd) + lines = '' for i in output: if i == ' ': continue i = i.strip() - print(i + '<br>') + lines += i + '<br>' + return lines -def show_server() -> None: +def show_server(serv: str, backend: str, backend_server: str) -> str: haproxy_sock_port = int(sql.get_setting('haproxy_sock_port')) - backend = common.checkAjaxInput(form.getvalue('ipbackend')) - backend_server = common.checkAjaxInput(form.getvalue('backend_server')) cmd = 'echo "show servers state"|nc %s %s |grep "%s" |grep "%s" |awk \'{print $5":"$19}\' |head -1' % ( serv, haproxy_sock_port, backend, backend_server) output, stderr = server_mod.subprocess_execute(cmd) - print(output[0]) + return output[0] -def get_all_stick_table(): +def get_all_stick_table(serv: str): hap_sock_p = sql.get_setting('haproxy_sock_port') cmd = 'echo "show table"|nc %s %s |awk \'{print $3}\' | tr -d \'\n\' | tr -d \'[:space:]\'' % (serv, hap_sock_p) output, stderr = server_mod.subprocess_execute(cmd) return output[0] -def get_stick_table(table): +def get_stick_table(serv: str, table: str): hap_sock_p = sql.get_setting('haproxy_sock_port') cmd = 'echo "show table %s"|nc %s %s |awk -F"#" \'{print $2}\' |head -1 | tr -d \'\n\'' % (table, serv, hap_sock_p) output, stderr = server_mod.subprocess_execute(cmd) @@ -62,6 +60,7 @@ def show_backends(server_ip, **kwargs): hap_sock_p = sql.get_setting('haproxy_sock_port') cmd = f'echo "show backend" |nc {server_ip} {hap_sock_p}' output, stderr = server_mod.subprocess_execute(cmd) + lines = '' if stderr: roxywi_common.logging('Roxy-WI server', ' ' + stderr, roxywi=1) if kwargs.get('ret'): @@ -76,16 +75,19 @@ def show_backends(server_ip, **kwargs): if kwargs.get('ret'): ret.append(back[1]) else: - print(back[1], end="<br>") + lines += back[1] + "<br>" if kwargs.get('ret'): return ret + return lines -def get_backends_from_config(server_ip: str, backends='') -> None: + +def get_backends_from_config(server_ip: str, backends='') -> str: config_date = get_date.return_date('config') configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') format_cfg = 'cfg' + lines = '' try: cfg = configs_dir + roxywi_common.get_files(configs_dir, format_cfg)[0] @@ -93,39 +95,34 @@ def get_backends_from_config(server_ip: str, backends='') -> None: roxywi_common.logging('Roxy-WI server', str(e), roxywi=1) try: cfg = f'{configs_dir}{server_ip}-{config_date}.{format_cfg}' - except Exception: - roxywi_common.logging('Roxy-WI server', ' Cannot generate cfg path', roxywi=1) - return + except Exception as e: + roxywi_common.logging('Roxy-WI server', f'error: Cannot generate cfg path: {e}', roxywi=1) + return f'error: Cannot generate cfg path: {e}' try: config_mod.get_config(server_ip, cfg) - except Exception: - roxywi_common.logging('Roxy-WI server', ' Cannot download config', roxywi=1) - print('error: Cannot get backends') - return + except Exception as e: + roxywi_common.logging('Roxy-WI server', f'error: Cannot download config: {e}', roxywi=1) + return f'error: Cannot download config: {e}' with open(cfg, 'r') as f: for line in f: if backends == 'frontend': if (line.startswith('listen') or line.startswith('frontend')) and 'stats' not in line: line = line.strip() - print(line.split(' ')[1], end="<br>") + lines += line.split(' ')[1] + '<br>' + + return lines -def change_ip_and_port() -> None: - backend_backend = common.checkAjaxInput(form.getvalue('backend_backend')) - backend_server = common.checkAjaxInput(form.getvalue('backend_server')) - backend_ip = common.checkAjaxInput(form.getvalue('backend_ip')) - backend_port = common.checkAjaxInput(form.getvalue('backend_port')) +def change_ip_and_port(serv, backend_backend, backend_server, backend_ip, backend_port) -> str: + if backend_ip is None: + return 'error: Backend IP must be IP and not 0' - if form.getvalue('backend_ip') is None: - print('error: Backend IP must be IP and not 0') - return - - if form.getvalue('backend_port') is None: - print('error: The backend port must be integer and not 0') - return + if backend_port is None: + return 'error: The backend port must be integer and not 0' haproxy_sock_port = sql.get_setting('haproxy_sock_port') + lines = '' masters = sql.is_master(serv) for master in masters: @@ -133,7 +130,7 @@ def change_ip_and_port() -> None: cmd = 'echo "set server %s/%s addr %s port %s check-port %s" |nc %s %s' % ( backend_backend, backend_server, backend_ip, backend_port, backend_port, master[0], haproxy_sock_port) output, stderr = server_mod.subprocess_execute(cmd) - print(output[0]) + lines += output[0] roxywi_common.logging( master[0], 'IP address and port have been changed. On: {}/{} to {}:{}'.format( backend_backend, backend_server, backend_ip, backend_port @@ -151,9 +148,9 @@ def change_ip_and_port() -> None: output, stderr = server_mod.subprocess_execute(cmd) if stderr != '': - print('error: ' + stderr[0]) + lines += 'error: ' + stderr[0] else: - print(output[0]) + lines += output[0] configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg" @@ -162,15 +159,16 @@ def change_ip_and_port() -> None: '&& sed -Ei "$( echo $string)s/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5]):[0-9]+/%s:%s/g" %s' % \ (backend_backend, cfg, backend_server, backend_ip, backend_port, cfg) server_mod.subprocess_execute(cmd) - config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save') + config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy') + + return lines -def change_maxconn_global() -> None: - if form.getvalue('maxconn_global') is None: - print('error: Maxconn must be integer and not 0') - return +def change_maxconn_global(serv: str, maxconn: int) -> str: + if maxconn is None: + return 'error: Maxconn must be integer and not 0' + - maxconn = common.checkAjaxInput(form.getvalue('maxconn_global')) haproxy_sock_port = sql.get_setting('haproxy_sock_port') masters = sql.is_master(serv) @@ -181,12 +179,11 @@ def change_maxconn_global() -> None: roxywi_common.logging(master[0], f'Maxconn has been changed. Globally to {maxconn}', login=1, keep_history=1, service='haproxy') cmd = f'echo "set maxconn global {maxconn}" |nc {serv} {haproxy_sock_port}' - print(cmd) roxywi_common.logging(serv, f'Maxconn has been changed. Globally to {maxconn}', login=1, keep_history=1, service='haproxy') output, stderr = server_mod.subprocess_execute(cmd) if stderr != '': - print(stderr[0]) + return stderr[0] elif output[0] == '': configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg" @@ -195,19 +192,16 @@ def change_maxconn_global() -> None: cmd = 'string=`grep global %s -n -A5 |grep maxcon -n |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` ' \ '&& sed -Ei "$( echo $string)s/[0-9]+/%s/g" %s' % (cfg, maxconn, cfg) server_mod.subprocess_execute(cmd) - config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save') - print(f'success: Maxconn globally has been set to {maxconn} ') + config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy') + return f'success: Maxconn globally has been set to {maxconn} ' else: - print(f'error: {output[0]}') + return f'error: {output[0]}' -def change_maxconn_frontend() -> None: - if form.getvalue('maxconn_int') is None: - print('error: Maxconn must be integer and not 0') - return +def change_maxconn_frontend(serv, maxconn, frontend) -> str: + if maxconn is None: + return 'error: Maxconn must be integer and not 0' - frontend = common.checkAjaxInput(form.getvalue('maxconn_frontend')) - maxconn = common.checkAjaxInput(form.getvalue('maxconn_int')) haproxy_sock_port = sql.get_setting('haproxy_sock_port') masters = sql.is_master(serv) @@ -222,7 +216,7 @@ def change_maxconn_frontend() -> None: output, stderr = server_mod.subprocess_execute(cmd) if stderr != '': - print(stderr[0]) + return stderr[0] elif output[0] == '': configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg" @@ -231,20 +225,16 @@ def change_maxconn_frontend() -> None: cmd = 'string=`grep %s %s -n -A5 |grep maxcon -n |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` ' \ '&& sed -Ei "$( echo $string)s/[0-9]+/%s/g" %s' % (frontend, cfg, maxconn, cfg) server_mod.subprocess_execute(cmd) - config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save') - print(f'success: Maxconn for {frontend} has been set to {maxconn} ') + config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy') + return f'success: Maxconn for {frontend} has been set to {maxconn} ' else: - print(f'error: {output[0]}') + return f'error: {output[0]}' -def change_maxconn_backend() -> None: - if form.getvalue('maxconn_int') is None: - print('error: Maxconn must be integer and not 0') - return +def change_maxconn_backend(serv, backend, backend_server, maxconn) -> str: + if maxconn is None: + return 'error: Maxconn must be integer and not 0' - backend = common.checkAjaxInput(form.getvalue('maxconn_backend')) - backend_server = common.checkAjaxInput(form.getvalue('maxconn_backend_server')) - maxconn = common.checkAjaxInput(form.getvalue('maxconn_int')) haproxy_sock_port = sql.get_setting('haproxy_sock_port') masters = sql.is_master(serv) @@ -255,12 +245,11 @@ def change_maxconn_backend() -> None: roxywi_common.logging(master[0], f'Maxconn has been changed. On: {backend}/{backend_server} to {maxconn}', login=1, keep_history=1, service='haproxy') cmd = f'echo "set maxconn server {backend}/{backend_server} {maxconn}" |nc {serv} {haproxy_sock_port}' - print(cmd) roxywi_common.logging(serv, f'Maxconn has been changed. On: {backend} to {maxconn}', login=1, keep_history=1, service='haproxy') output, stderr = server_mod.subprocess_execute(cmd) if stderr != '': - print(stderr[0]) + return stderr[0] elif output[0] == '': configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') cfg = f"{configs_dir}{serv}-{get_date.return_date('config')}.cfg" @@ -269,180 +258,169 @@ def change_maxconn_backend() -> None: cmd = 'string=`grep %s %s -n -A10 |grep maxcon -n|grep %s |awk -F":" \'{print $2}\'|awk -F"-" \'{print $1}\'` ' \ '&& sed -Ei "$( echo $string)s/maxconn [0-9]+/maxconn %s/g" %s' % (backend, cfg, backend_server, maxconn, cfg) server_mod.subprocess_execute(cmd) - config_mod.master_slave_upload_and_restart(serv, cfg, just_save='save') - print(f'success: Maxconn for {backend}/{backend_server} has been set to {maxconn} ') + config_mod.master_slave_upload_and_restart(serv, cfg, 'save', 'haproxy') + return f'success: Maxconn for {backend}/{backend_server} has been set to {maxconn} ' else: - print(f'error: {output[0]}') + return f'error: {output[0]}' -def table_select(): - from jinja2 import Environment, FileSystemLoader - 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() +def table_select(serv: str, table: str): + lang = roxywi_common.get_user_lang_for_flask() if table == 'All': - template = env.get_template('ajax/stick_tables.html') - tables = get_all_stick_table() + tables = get_all_stick_table(serv) table = [] for t in tables.split(','): if t != '': table_id = [] - tables_head1, table1 = get_stick_table(t) + tables_head1, table1 = get_stick_table(serv, t) table_id.append(tables_head1) table_id.append(table1) table.append(table_id) - template = template.render(table=table, lang=lang) + return render_template('ajax/stick_tables.html', 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, lang=lang) - - print(template) + tables_head, table = get_stick_table(serv, table) + return render_template('ajax/stick_table.html', tables_head=tables_head, table=table, lang=lang) -def delete_ip_from_stick_table() -> None: +def delete_ip_from_stick_table(serv, ip, table) -> str: haproxy_sock_port = sql.get_setting('haproxy_sock_port') - ip = common.checkAjaxInput(form.getvalue('ip_for_delete')) - table = common.checkAjaxInput(form.getvalue('table_for_delete')) cmd = f'echo "clear table {table} key {ip}" |nc {serv} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) - if stderr[0] != '': - print(f'error: {stderr[0]}') + try: + if stderr[0] != '': + return f'error: {stderr[0]}' + except Exception: + return 'ok' -def clear_stick_table() -> None: +def clear_stick_table(serv, table) -> str: haproxy_sock_port = sql.get_setting('haproxy_sock_port') - table = common.checkAjaxInput(form.getvalue('table_for_clear')) cmd = f'echo "clear table {table} " |nc {serv} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) - if stderr[0] != '': - print(f'error: {stderr[0]}') + try: + if stderr[0] != '': + return f'error: {stderr[0]}' + except Exception: + return 'ok' -def list_of_lists() -> None: +def list_of_lists(serv) -> str: haproxy_sock_port = sql.get_setting('haproxy_sock_port') cmd = f'echo "show acl"|nc {serv} {haproxy_sock_port} |grep "loaded from" |awk \'{{print $1,$2}}\'' output, stderr = server_mod.subprocess_execute(cmd) - print(output) + try: + return output[0] + except Exception: + return '------' -def show_lists() -> None: - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, - extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True) - template = env.get_template('ajax/list.html') - list_id = common.checkAjaxInput(form.getvalue('list_select_id')) - list_name = common.checkAjaxInput(form.getvalue('list_select_name')) - +def show_lists(serv, list_id, list_name) -> None: haproxy_sock_port = sql.get_setting('haproxy_sock_port') cmd = f'echo "show acl #{list_id}"|nc {serv} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) - template = template.render(list=output, list_id=list_id, list_name=list_name) - print(template) + return render_template('ajax/list.html', list=output, list_id=list_id, list_name=list_name) -def delete_ip_from_list() -> None: +def delete_ip_from_list(serv, ip_id, ip, list_id, list_name) -> str: haproxy_sock_port = sql.get_setting('haproxy_sock_port') lib_path = get_config_var.get_config_var('main', 'lib_path') - ip_id = common.checkAjaxInput(form.getvalue('list_ip_id_for_delete')) - ip = common.is_ip_or_dns(form.getvalue('list_ip_for_delete')) - list_id = common.checkAjaxInput(form.getvalue('list_id_for_delete')) - list_name = common.checkAjaxInput(form.getvalue('list_name')) user_group = roxywi_common.get_user_group(id=1) cmd = f"sed -i 's!{ip}$!!' {lib_path}/lists/{user_group}/{list_name}" cmd1 = f"sed -i '/^$/d' {lib_path}/lists/{user_group}/{list_name}" output, stderr = server_mod.subprocess_execute(cmd) output1, stderr1 = server_mod.subprocess_execute(cmd1) if output: - print(f'error: {output}') + return f'error: {output}' if stderr: - print(f'error: {stderr}') + return f'error: {stderr}' if output1: - print(f'error: {output1}') + return f'error: {output1}' if stderr1: - print(f'error: {stderr}') + return f'error: {stderr}' cmd = f'echo "del acl #{list_id} #{ip_id}" |nc {serv} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) - if output[0] != '': - print(f'error: {output[0]}') - if stderr != '': - print(f'error: {stderr[0]}') roxywi_common.logging(serv, f'{ip_id} has been delete from list {list_id}', login=1, keep_history=1, service='haproxy') + try: + if output[0] != '': + return f'error: {output[0]}' + except Exception: + pass + try: + if stderr != '': + return f'error: {stderr[0]}' + except Exception: + pass -def add_ip_to_list() -> None: +def add_ip_to_list(serv, ip, list_id, list_name) -> str: haproxy_sock_port = sql.get_setting('haproxy_sock_port') - lib_path = get_config_var.get_config_var('main', 'lib_path') - ip = form.getvalue('list_ip_for_add') - ip = ip.strip() - ip = common.is_ip_or_dns(ip) - list_id = common.checkAjaxInput(form.getvalue('list_id_for_add')) - list_name = common.checkAjaxInput(form.getvalue('list_name')) user_group = roxywi_common.get_user_group(id=1) cmd = f'echo "add acl #{list_id} {ip}" |nc {serv} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) - if output[0]: - print(f'error: {output[0]}') - if stderr: - print(f'error: {stderr[0]}') + try: + if output[0]: + return f'error: {output[0]}' + except Exception: + pass + try: + if stderr: + print(f'error: {stderr[0]}') + except Exception: + pass if 'is not a valid IPv4 or IPv6 address' not in output[0]: cmd = f'echo "{ip}" >> {lib_path}/lists/{user_group}/{list_name}' output, stderr = server_mod.subprocess_execute(cmd) + roxywi_common.logging(serv, f'{ip} has been added to list {list_id}', login=1, keep_history=1, service='haproxy') if output: - print(f'error: {output}') + return f'error: {output}' if stderr: - print(f'error: {stderr}') - - roxywi_common.logging(serv, f'{ip} has been added to list {list_id}', login=1, keep_history=1, service='haproxy') + return f'error: {stderr}' -def select_session() -> None: - from jinja2 import Environment, FileSystemLoader - env = Environment(loader=FileSystemLoader('templates'), autoescape=True, - extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'], trim_blocks=True, lstrip_blocks=True) - session = common.checkAjaxInput(form.getvalue('sessions_select')) - lang = roxywi_common.get_user_lang() +def select_session(server_ip: str) -> str: + lang = roxywi_common.get_user_lang_for_flask() haproxy_sock_port = sql.get_setting('haproxy_sock_port') - - cmd = f'echo "show sess" |nc {session} {haproxy_sock_port}' + cmd = f'echo "show sess" |nc {server_ip} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) - template = env.get_template('ajax/sessions_table.html') - template = template.render(sessions=output, lang=lang) - - print(template) + return render_template('ajax/sessions_table.html', sessions=output, lang=lang) -def show_session() -> None: - session = common.checkAjaxInput(form.getvalue('sessions_select_show')) - sess_id = common.checkAjaxInput(form.getvalue('sessions_select_id')) +def show_session(server_ip, sess_id) -> str: haproxy_sock_port = sql.get_setting('haproxy_sock_port') - cmd = f'echo "show sess {sess_id}" |nc {session} {haproxy_sock_port}' - + cmd = f'echo "show sess {sess_id}" |nc {server_ip} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) + lines = '' if stderr: - print('error: ' + stderr[0]) + return 'error: ' + stderr[0] else: for o in output: - print(f'{o}<br />') + lines += f'{o}<br />' + return lines -def delete_session() -> None: +def delete_session(server_ip, sess_id) -> str: haproxy_sock_port = sql.get_setting('haproxy_sock_port') - sess_id = common.checkAjaxInput(form.getvalue('session_delete_id')) - cmd = 'echo "shutdown session %s" |nc %s %s' % (sess_id, serv, haproxy_sock_port) + cmd = f'echo "shutdown session {sess_id}" |nc {server_ip} {haproxy_sock_port}' output, stderr = server_mod.subprocess_execute(cmd) - if output[0] != '': - print('error: ' + output[0]) - if stderr[0] != '': - print('error: ' + stderr[0]) + try: + if output[0] != '': + return 'error: ' + output[0] + except Exception: + pass + try: + if stderr[0] != '': + return 'error: ' + stderr[0] + except Exception: + pass + + return 'ok' diff --git a/app/modules/db/db_model.py b/app/modules/db/db_model.py index 01324df6..ee028beb 100644 --- a/app/modules/db/db_model.py +++ b/app/modules/db/db_model.py @@ -1,6 +1,7 @@ from peewee import * from playhouse.migrate import * from datetime import datetime +from flask_login import UserMixin import modules.roxy_wi_tools as roxy_wi_tools @@ -26,7 +27,7 @@ class BaseModel(Model): database = conn -class User(BaseModel): +class User(BaseModel, UserMixin): user_id = AutoField(column_name='id') username = CharField(constraints=[SQL('UNIQUE')]) email = CharField(constraints=[SQL('UNIQUE')]) @@ -354,66 +355,6 @@ class PortScannerHistory(BaseModel): primary_key = False -class ProvidersCreds(BaseModel): - id = AutoField() - name = CharField() - type = CharField() - group = CharField() - key = CharField() - secret = CharField(null=True) - create_date = DateTimeField(default=datetime.now) - edit_date = DateTimeField(default=datetime.now) - - class Meta: - table_name = 'providers_creds' - - -class ProvisionParam(BaseModel): - id = AutoField() - param = CharField() - name = CharField() - optgroup = CharField() - section = CharField() - provider = CharField() - image = CharField(null=True) - - class Meta: - table_name = 'provision_param' - constraints = [SQL('UNIQUE (param, section, provider)')] - - -class ProvisionedServers(BaseModel): - id = AutoField() - region = CharField() - instance_type = CharField() - public_ip = IntegerField(null=True) - floating_ip = IntegerField(null=True) - volume_size = IntegerField(null=True) - backup = IntegerField(null=True) - monitoring = IntegerField(null=True) - private_networking = IntegerField(null=True) - ssh_key_name = CharField(null=True) - ssh_ids = CharField(null=True) - name = CharField() - os = CharField() - firewall = IntegerField() - provider_id = IntegerField() - type = CharField() - status = CharField() - group_id = IntegerField() - date = DateTimeField(default=datetime.now) - IP = CharField(null=True) - last_error = CharField(null=True) - delete_on_termination = IntegerField(null=True) - project = CharField(null=True) - network_name = CharField(null=True) - volume_type = CharField(null=True) - name_template = CharField(null=True) - - class Meta: - table_name = 'provisioned_servers' - - class MetricsHttpStatus(BaseModel): serv = CharField() ok_ans = IntegerField(column_name='2xx') @@ -679,8 +620,7 @@ def create_tables(): with conn: conn.create_tables([User, Server, Role, Telegram, Slack, UUID, Token, ApiToken, Groups, UserGroups, ConfigVersion, Setting, Cred, Backup, Metrics, WafMetrics, Version, Option, SavedServer, Waf, ActionHistory, - PortScannerSettings, PortScannerPorts, PortScannerHistory, ProvidersCreds, ServiceSetting, - ProvisionedServers, MetricsHttpStatus, SMON, WafRules, Alerts, GeoipCodes, NginxMetrics, - SystemInfo, Services, UserName, GitSetting, CheckerSetting, ApacheMetrics, ProvisionParam, - WafNginx, ServiceStatus, KeepaliveRestart, PD, SmonHistory, SmonTcpCheck, SmonHttpCheck, - SmonPingCheck, SmonDnsCheck, S3Backup]) + PortScannerSettings, PortScannerPorts, PortScannerHistory, ServiceSetting, MetricsHttpStatus, + SMON, WafRules, Alerts, GeoipCodes, NginxMetrics, SystemInfo, Services, UserName, GitSetting, + CheckerSetting, ApacheMetrics, WafNginx, ServiceStatus, KeepaliveRestart, PD, SmonHistory, + SmonTcpCheck, SmonHttpCheck, SmonPingCheck, SmonDnsCheck, S3Backup]) diff --git a/app/modules/db/sql.py b/app/modules/db/sql.py index 5df0052e..07b30473 100755 --- a/app/modules/db/sql.py +++ b/app/modules/db/sql.py @@ -1,13 +1,23 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import traceback -import sys import os +import sys +import traceback from modules.db.db_model import * import modules.roxy_wi_tools as roxy_wi_tools +def out_error(error): + error = str(error) + exc_type, exc_obj, exc_tb = sys.exc_info() + file_name = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] + stk = traceback.extract_tb(exc_tb, 1) + function_name = stk[0][2] + error = f'{error} in function: {function_name} in file: {file_name}' + raise Exception(f'error: {error}') + + def get_setting(param, **kwargs): import http.cookies @@ -59,16 +69,6 @@ time_zone = get_setting('time_zone') get_date = roxy_wi_tools.GetDate(time_zone) -def out_error(error): - error = str(error) - exc_type, exc_obj, exc_tb = sys.exc_info() - file_name = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] - stk = traceback.extract_tb(exc_tb, 1) - function_name = stk[0][2] - error = f'{error} in function: {function_name} in file: {file_name}' - raise Exception(f'error: {error}') - - def add_user(user, email, password, role, activeuser, group): if password != 'aduser': try: @@ -702,21 +702,13 @@ def delete_old_uuid(): out_error(e) -def update_last_act_user(uuid, token): +def update_last_act_user(uuid: str, token: str, ip: str) -> None: session_ttl = int(get_setting('session_ttl')) token_ttl = int(get_setting('token_ttl')) cur_date_session = get_date.return_date('regular', timedelta=session_ttl) cur_date_token = get_date.return_date('regular', timedelta=token_ttl) cur_date = get_date.return_date('regular') user_id = get_user_id_by_uuid(uuid) - - try: - import cgi - import os - ip = cgi.escape(os.environ["REMOTE_ADDR"]) - except Exception: - ip = '' - query = UUID.update(exp=cur_date_session).where(UUID.uuid == uuid) query1 = Token.update(exp=cur_date_token).where(Token.token == token) query2 = User.update(last_login_date=cur_date, last_login_ip=ip).where(User.user_id == user_id) @@ -767,6 +759,7 @@ def get_user_role_by_uuid(uuid, group_id): (UserGroups.user_group_id == group_id) ) ) + try: query_res = query.execute() except Exception as e: @@ -866,19 +859,7 @@ def get_pd_by_id(pd_id): return query_res -def get_dick_permit(**kwargs): - if kwargs.get('username'): - grp = kwargs.get('group_id') - else: - try: - import http.cookies - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - group = cookie.get('group') - grp = group.value - except Exception: - print('<meta http-equiv="refresh" content="0; url=/app/login.py">') - return - +def get_dick_permit(group_id, **kwargs): only_group = kwargs.get('only_group') disable = 'enable = 1' haproxy = '' @@ -907,21 +888,15 @@ def get_dick_permit(**kwargs): cursor = conn.cursor() try: if mysql_enable == '1': - if grp == '1' and not only_group: - sql = """ select * from `servers` where {} {} {} {} {} {} {} order by `pos` asc""".format( - disable, type_ip, nginx, haproxy, keepalived, apache, ip - ) + if group_id == '1' and not only_group: + sql = f" select * from `servers` where {disable} {type_ip} {nginx} {haproxy} {keepalived} {apache} {ip} order by `pos` asc" else: - sql = """ select * from `servers` where `groups` = {group} and ({disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} {apache} order by `pos` asc - """.format( - group=grp, disable=disable, type_ip=type_ip, ip=ip, haproxy=haproxy, nginx=nginx, keepalived=keepalived, apache=apache - ) + sql = f" select * from `servers` where `groups` = {group_id} and ({disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} {apache} order by `pos` asc" else: - if grp == '1' and not only_group: - sql = """ select * from servers where {} {} {} {} {} {} {} order by pos""".format(disable, type_ip, nginx, haproxy, keepalived, apache, ip) + if group_id == '1' and not only_group: + sql = f" select * from servers where {disable} {type_ip} {nginx} {haproxy} {keepalived} {apache} {ip} order by pos" else: - sql = """ select * from servers where groups = '{group}' and ({disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} {apache} order by pos - """.format(group=grp, disable=disable, type_ip=type_ip, ip=ip, haproxy=haproxy, nginx=nginx, keepalived=keepalived, apache=apache) + sql = f" select * from servers where groups = '{group_id}' and ({disable}) {type_ip} {ip} {haproxy} {nginx} {keepalived} {apache} order by pos" except Exception as e: raise Exception(f'error: {e}') @@ -1737,6 +1712,8 @@ def update_waf_metrics_enable(name, enable): Waf.update(metrics=enable).where(Waf.server_id == server_id).execute() except Exception as e: out_error(e) + else: + return 'ok' def delete_metrics(): @@ -2492,14 +2469,14 @@ def update_firewall(serv): return False -def update_server_pos(pos, server_id): +def update_server_pos(pos, server_id) -> str: query = Server.update(pos=pos).where(Server.server_id == server_id) try: query.execute() - return True + return 'ok' except Exception as e: out_error(e) - return False + return 'not_ok' def check_token_exists(token): @@ -2915,6 +2892,7 @@ def select_one_smon(smon_id: int, check_id: int) -> object: query = SmonDnsCheck.select(SmonDnsCheck, SMON).join_from(SmonDnsCheck, SMON).where(SMON.id == smon_id) else: query = SmonPingCheck.select(SmonPingCheck, SMON).join_from(SmonPingCheck, SMON).where(SMON.id == smon_id) + try: query_res = query.execute() except Exception as e: @@ -3345,300 +3323,6 @@ def delete_provider(provider_id): return False -def add_server_aws( - region, instance_type, public_ip, floating_ip, volume_size, ssh_key_name, name, os, firewall, - provider_id, group_id, status, delete_on_termination, volume_type -): - cur_date = get_date.return_date('regular') - try: - ProvisionedServers.insert( - region=region, instance_type=instance_type, public_ip=public_ip, floating_ip=floating_ip, - volume_size=volume_size, volume_type=volume_type, ssh_key_name=ssh_key_name, name=name, os=os, - firewall=firewall, provider_id=provider_id, group_id=group_id, delete_on_termination=delete_on_termination, - type='aws', status=status, date=cur_date - ).execute() - return True - except Exception as e: - out_error(e) - return False - - -def add_server_gcore( - project, region, instance_type, network_type, network_name, volume_size, ssh_key_name, name, os, - firewall, provider_id, group_id, status, delete_on_termination, volume_type -): - cur_date = get_date.return_date('regular') - try: - ProvisionedServers.insert( - region=region, instance_type=instance_type, public_ip=network_type, network_name=network_name, - volume_size=volume_size, volume_type=volume_type, ssh_key_name=ssh_key_name, name=name, - os=os, firewall=firewall, provider_id=provider_id, group_id=group_id, type='gcore', - delete_on_termination=delete_on_termination, project=project, status=status, date=cur_date - ).execute() - return True - except Exception as e: - out_error(e) - return False - - -def add_server_do( - region, size, privet_net, floating_ip, ssh_ids, ssh_key_name, name, oss, firewall, monitoring, backup, - provider_id, group_id, status -): - cur_date = get_date.return_date('regular') - try: - ProvisionedServers.insert( - region=region, instance_type=size, private_networking=privet_net, floating_ip=floating_ip, - ssh_ids=ssh_ids, ssh_key_name=ssh_key_name, name=name, os=oss, firewall=firewall, - monitoring=monitoring, backup=backup, provider_id=provider_id, group_id=group_id, - type='do', status=status, date=cur_date - ).execute() - return True - except Exception as e: - out_error(e) - return False - - -def select_aws_server(server_id): - prov_serv = ProvisionedServers.alias() - query = ( - prov_serv.select( - prov_serv.region, prov_serv.instance_type, prov_serv.public_ip, prov_serv.floating_ip, prov_serv.volume_size, - prov_serv.ssh_key_name, prov_serv.name, prov_serv.os, prov_serv.firewall, prov_serv.provider_id, - prov_serv.group_id, prov_serv.id, prov_serv.delete_on_termination, prov_serv.volume_type - ).where(prov_serv.id == server_id)) - try: - query_res = query.execute() - except Exception as e: - out_error(e) - else: - return query_res - - -def select_gcore_server(server_id): - prov_serv = ProvisionedServers.alias() - query = ( - prov_serv.select( - prov_serv.region, prov_serv.instance_type, prov_serv.public_ip, prov_serv.floating_ip, prov_serv.volume_size, - prov_serv.ssh_key_name, prov_serv.name, prov_serv.os, prov_serv.firewall, prov_serv.provider_id, - prov_serv.group_id, prov_serv.id, prov_serv.delete_on_termination, prov_serv.project, prov_serv.network_name, - prov_serv.volume_type, prov_serv.name_template - ).where(prov_serv.id == server_id)) - try: - query_res = query.execute() - except Exception as e: - out_error(e) - else: - return query_res - - -def select_do_server(server_id): - prov_serv = ProvisionedServers.alias() - query = ( - prov_serv.select( - prov_serv.region, prov_serv.instance_type, prov_serv.private_networking, prov_serv.floating_ip, - prov_serv.ssh_ids, prov_serv.ssh_key_name, prov_serv.name, prov_serv.os, prov_serv.firewall, prov_serv.backup, - prov_serv.monitoring, prov_serv.provider_id, prov_serv.group_id, prov_serv.id - ).where(prov_serv.id == server_id)) - try: - query_res = query.execute() - except Exception as e: - out_error(e) - else: - return query_res - - -def update_provisioning_server_status(status, user_group_id, name, provider_id, **kwargs): - if kwargs.get('update_ip'): - query = ProvisionedServers.update(status=status, IP=kwargs.get('update_ip')).where( - (ProvisionedServers.name == name) & (ProvisionedServers.group_id == user_group_id) & (ProvisionedServers.provider_id == provider_id) - ) - else: - query = ProvisionedServers.update(status=status).where( - (ProvisionedServers.name == name) - & (ProvisionedServers.group_id == user_group_id) - & (ProvisionedServers.provider_id == provider_id) - ) - try: - query.execute() - except Exception as e: - out_error(e) - - -def update_provisioning_server_gcore_name(name, template_name, user_group_id, provider_id): - query = ProvisionedServers.update(name_template=template_name).where( - (ProvisionedServers.name == name) - & (ProvisionedServers.group_id == user_group_id) - & (ProvisionedServers.provider_id == provider_id) - ) - try: - query.execute() - except Exception as e: - out_error(e) - - -def update_provisioning_server_error(status, user_group_id, name, provider_id): - query = ProvisionedServers.update(last_error=status).where( - (ProvisionedServers.name == name) - & (ProvisionedServers.group_id == user_group_id) - & (ProvisionedServers.provider_id == provider_id) - ) - try: - query.execute() - except Exception as e: - out_error(e) - - -def update_server_aws( - region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall, provider, - group, status, server_id, delete_on_termination, volume_type -): - query = ProvisionedServers.update( - region=region, instance_type=size, public_ip=public_ip, floating_ip=floating_ip, volume_size=volume_size, - ssh_key_name=ssh_name, name=workspace, os=oss, firewall=firewall, provider_id=provider, group_id=group, - status=status, delete_on_termination=delete_on_termination, volume_type=volume_type - ).where(ProvisionedServers.id == server_id) - try: - query.execute() - return True - except Exception as e: - out_error(e) - return False - - -def update_server_gcore( - region, size, network_type, network_name, volume_size, ssh_name, workspace, oss, firewall, - provider, group, status, server_id, delete_on_termination, volume_type, project -): - query = ProvisionedServers.update( - region=region, instance_type=size, public_ip=network_type, network_name=network_name, volume_size=volume_size, - ssh_key_name=ssh_name, name=workspace, os=oss, firewall=firewall, provider_id=provider, group_id=group, - status=status, delete_on_termination=delete_on_termination, volume_type=volume_type, project=project - ).where(ProvisionedServers.id == server_id) - try: - query.execute() - return True - except Exception as e: - out_error(e) - return False - - -def update_server_do( - size, privet_net, floating_ip, ssh_ids, ssh_name, oss, firewall, monitoring, backup, provider, group, - status, server_id -): - query = ProvisionedServers.update( - instance_type=size, private_networking=privet_net, floating_ip=floating_ip, ssh_ids=ssh_ids, - ssh_key_name=ssh_name, os=oss, firewall=firewall, monitoring=monitoring, backup=backup, provider_id=provider, - group_id=group, status=status - ).where(ProvisionedServers.id == server_id) - try: - query.execute() - return True - except Exception as e: - out_error(e) - return False - - -def delete_provisioned_servers(server_id): - query = ProvisionedServers.delete().where(ProvisionedServers.id == server_id) - try: - query.execute() - except Exception as e: - out_error(e) - - -def select_provisioned_servers(**kwargs): - prov_serv = ProvisionedServers.alias() - if kwargs.get('new'): - query = ( - prov_serv.select( - prov_serv.id, prov_serv.name, prov_serv.provider_id, prov_serv.type, prov_serv.group_id, - prov_serv.instance_type, prov_serv.status, prov_serv.date, prov_serv.region, prov_serv.os, - prov_serv.IP, prov_serv.last_error, prov_serv.name_template - ).where( - (prov_serv.name == kwargs.get('new')) - & (prov_serv.group_id == kwargs.get('group')) - & (prov_serv.type == kwargs.get('type')) - ) - ) - else: - query = prov_serv.select( - prov_serv.id, prov_serv.name, prov_serv.provider_id, prov_serv.type, prov_serv.group_id, - prov_serv.instance_type, prov_serv.status, prov_serv.date, prov_serv.region, prov_serv.os, - prov_serv.IP, prov_serv.last_error, prov_serv.name_template - ) - try: - query_res = query.execute() - except Exception as e: - out_error(e) - else: - return query_res - - -def select_aws_provider(provider_id): - try: - query_res = ProvidersCreds.get(ProvidersCreds.id == provider_id) - except Exception: - return "" - else: - return query_res.key, query_res.secret - - -def select_gcore_provider(provider_id): - try: - query_res = ProvidersCreds.get(ProvidersCreds.id == provider_id) - except Exception: - return "" - else: - return query_res.key, query_res.secret - - -def select_do_provider(provider_id): - try: - query_res = ProvidersCreds.get(ProvidersCreds.id == provider_id) - except Exception: - return "" - else: - return query_res.key - - -def update_do_provider(new_name, new_token, provider_id): - cur_date = get_date.return_date('regular') - try: - ProvidersCreds.update( - name=new_name, key=new_token, edit_date=cur_date - ).where(ProvidersCreds.id == provider_id).execute() - return True - except Exception as e: - out_error(e) - return False - - -def update_gcore_provider(new_name, new_user, new_pass, provider_id): - cur_date = get_date.return_date('regular') - try: - ProvidersCreds.update( - name=new_name, key=new_user, secret=new_pass, edit_date=cur_date - ).where(ProvidersCreds.id == provider_id).execute() - return True - except Exception as e: - out_error(e) - return False - - -def update_aws_provider(new_name, new_key, new_secret, provider_id): - cur_date = get_date.return_date('regular') - try: - ProvidersCreds.update( - name=new_name, key=new_key, secret=new_secret, edit_date=cur_date - ).where(ProvidersCreds.id == provider_id).execute() - return True - except Exception as e: - out_error(e) - return False - - def is_serv_protected(serv): try: query_res = Server.get(Server.ip == serv) @@ -4219,18 +3903,6 @@ def update_service_checker_settings( return True -def select_provisioning_params(): - query = ProvisionParam.select() - - try: - query_res = query.execute() - except Exception as e: - out_error(e) - return - else: - return query_res - - def select_service(slug: str) -> str: try: query_res = Services.get(Services.slug == slug) diff --git a/app/modules/provisioning/__init__.py b/app/modules/provisioning/__init__.py deleted file mode 100644 index c44b825b..00000000 --- a/app/modules/provisioning/__init__.py +++ /dev/null @@ -1 +0,0 @@ -NAME = 'roxy-wi-provisioning-modules' diff --git a/app/modules/provisioning/aws.py b/app/modules/provisioning/aws.py deleted file mode 100644 index e9f51004..00000000 --- a/app/modules/provisioning/aws.py +++ /dev/null @@ -1,133 +0,0 @@ -import modules.db.sql as sql -import modules.common.common as common -import modules.server.server as server_mod -import modules.provisioning.common as prov_common - -form = common.form - - -def validate() -> None: - if form.getvalue('awsvalidate'): - workspace = form.getvalue('awsvalidate') - group = form.getvalue('aws_create_group') - else: - workspace = form.getvalue('awseditvalidate') - group = form.getvalue('aws_edit_group') - - cmd = f'cd scripts/terraform/ && sudo terraform plan -no-color -input=false -target=module.aws_module -var-file vars/{workspace}_{group}_aws.tfvars' - output, stderr = server_mod.subprocess_execute(cmd) - if stderr != '': - print('error: ' + stderr) - else: - print('ok') - - -def new_workspace() -> None: - workspace = form.getvalue('awsworkspace') - group = form.getvalue('aws_create_group') - provider = form.getvalue('aws_create_provider') - region = form.getvalue('aws_create_regions') - size = form.getvalue('aws_create_size') - oss = form.getvalue('aws_create_oss') - ssh_name = form.getvalue('aws_create_ssh_name') - volume_size = form.getvalue('aws_create_volume_size') - volume_type = form.getvalue('aws_create_volume_type') - delete_on_termination = form.getvalue('aws_create_delete_on_termination') - floating_ip = form.getvalue('aws_create_floating_net') - firewall = form.getvalue('aws_create_firewall') - public_ip = form.getvalue('aws_create_public_ip') - - cmd = f'cd scripts/terraform/ && sudo terraform workspace new {workspace}_{group}_aws' - output, stderr = server_mod.subprocess_execute(cmd) - - if stderr != '': - prov_common.show_error(stderr, group, workspace, provider) - else: - try: - if sql.add_server_aws( - region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall, - provider, group, 'Creating', delete_on_termination, volume_type - ): - prov_common.show_new_server(workspace, group, 'aws') - except Exception as e: - print(e) - - -def edit_workspace() -> None: - workspace = form.getvalue('awseditworkspace') - group = form.getvalue('aws_editing_group') - provider = form.getvalue('aws_editing_provider') - region = form.getvalue('aws_editing_regions') - size = form.getvalue('aws_editing_size') - oss = form.getvalue('aws_editing_oss') - ssh_name = form.getvalue('aws_editing_ssh_name') - volume_size = form.getvalue('aws_editing_volume_size') - volume_type = form.getvalue('aws_editing_volume_type') - delete_on_termination = form.getvalue('aws_editing_delete_on_termination') - floating_ip = form.getvalue('aws_editing_floating_net') - firewall = form.getvalue('aws_editing_firewall') - public_ip = form.getvalue('aws_editing_public_ip') - server_id = form.getvalue('server_id') - - try: - if sql.update_server_aws( - region, size, public_ip, floating_ip, volume_size, ssh_name, workspace, oss, firewall, - provider, group, 'Editing', server_id, delete_on_termination, volume_type - ): - - try: - cmd = f'cd scripts/terraform/ && sudo terraform workspace select {workspace}_{group}_aws' - output, stderr = server_mod.subprocess_execute(cmd) - except Exception as e: - print(f'error: {e}') - - if stderr != '': - prov_common.show_error(stderr, group, workspace, provider) - else: - print('ok') - except Exception as e: - print(e) - - -def create_vars() -> None: - if form.getvalue('awsvars'): - awsvars = common.checkAjaxInput(form.getvalue('awsvars')) - group = common.checkAjaxInput(form.getvalue('aws_create_group')) - provider = common.checkAjaxInput(form.getvalue('aws_create_provider')) - region = common.checkAjaxInput(form.getvalue('aws_create_regions')) - size = common.checkAjaxInput(form.getvalue('aws_create_size')) - oss = common.checkAjaxInput(form.getvalue('aws_create_oss')) - ssh_name = common.checkAjaxInput(form.getvalue('aws_create_ssh_name')) - volume_size = common.checkAjaxInput(form.getvalue('aws_create_volume_size')) - volume_type = common.checkAjaxInput(form.getvalue('aws_create_volume_type')) - delete_on_termination = common.checkAjaxInput(form.getvalue('aws_create_delete_on_termination')) - floating_ip = common.checkAjaxInput(form.getvalue('aws_create_floating_net')) - firewall = common.checkAjaxInput(form.getvalue('aws_create_firewall')) - public_ip = common.checkAjaxInput(form.getvalue('aws_create_public_ip')) - else: - awsvars = common.checkAjaxInput(form.getvalue('awseditvars')) - group = common.checkAjaxInput(form.getvalue('aws_editing_group')) - provider = common.checkAjaxInput(form.getvalue('aws_editing_provider')) - region = common.checkAjaxInput(form.getvalue('aws_editing_regions')) - size = common.checkAjaxInput(form.getvalue('aws_editing_size')) - oss = common.checkAjaxInput(form.getvalue('aws_editing_oss')) - ssh_name = common.checkAjaxInput(form.getvalue('aws_editing_ssh_name')) - volume_size = common.checkAjaxInput(form.getvalue('aws_editing_volume_size')) - volume_type = common.checkAjaxInput(form.getvalue('aws_editing_volume_type')) - delete_on_termination = common.checkAjaxInput(form.getvalue('aws_editing_delete_on_termination')) - floating_ip = common.checkAjaxInput(form.getvalue('aws_editing_floating_net')) - firewall = common.checkAjaxInput(form.getvalue('aws_editing_firewall')) - public_ip = common.checkAjaxInput(form.getvalue('aws_editing_public_ip')) - - aws_key, aws_secret = sql.select_aws_provider(provider) - - cmd = f'cd scripts/terraform/ && sudo ansible-playbook var_generator.yml -i inventory -e "region={region} ' \ - f'group={group} size={size} os={oss} floating_ip={floating_ip} volume_size={volume_size} server_name={awsvars} ' \ - f'AWS_ACCESS_KEY={aws_key} AWS_SECRET_KEY={aws_secret} firewall={firewall} public_ip={public_ip} ' \ - f'ssh_name={ssh_name} delete_on_termination={delete_on_termination} volume_type={volume_type} cloud=aws"' - - output, stderr = server_mod.subprocess_execute(cmd) - if stderr != '': - print(f'error: {stderr}') - else: - print('ok') diff --git a/app/modules/provisioning/common.py b/app/modules/provisioning/common.py deleted file mode 100644 index 6b727040..00000000 --- a/app/modules/provisioning/common.py +++ /dev/null @@ -1,31 +0,0 @@ -from jinja2 import Environment, FileSystemLoader - -import modules.db.sql as sql -import modules.common.common as common -import modules.roxywi.common as roxywi_common - -form = common.form - - -def show_error(stderr: str, group: str, workspace: str, provider: str) -> None: - stderr = stderr.strip() - stderr = repr(stderr) - stderr = stderr.replace("'", "") - stderr = stderr.replace("\'", "") - sql.update_provisioning_server_status('Error', group, workspace, provider) - sql.update_provisioning_server_error(stderr, group, workspace, provider) - print('error: ' + stderr) - - -def show_new_server(workspace: str, group: str, cloud: str) -> None: - user_params = roxywi_common.get_users_params() - new_server = sql.select_provisioned_servers(new=workspace, group=group, type=cloud) - params = sql.select_provisioning_params() - lang = roxywi_common.get_user_lang() - providers = sql.select_providers(group) - - 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, providers=providers, - role=user_params['role'], adding=1, params=params, lang=lang) - print(template) diff --git a/app/modules/provisioning/do.py b/app/modules/provisioning/do.py deleted file mode 100644 index 66673d73..00000000 --- a/app/modules/provisioning/do.py +++ /dev/null @@ -1,124 +0,0 @@ -import modules.db.sql as sql -import modules.common.common as common -import modules.server.server as server_mod -import modules.provisioning.common as prov_common - -form = common.form - - -def validate() -> None: - if form.getvalue('dovalidate'): - workspace = form.getvalue('dovalidate') - group = form.getvalue('do_create_group') - else: - workspace = form.getvalue('doeditvalidate') - group = form.getvalue('do_edit_group') - - cmd = f'cd scripts/terraform/ && sudo terraform plan -no-color -input=false -target=module.do_module -var-file vars/{workspace}_{group}_do.tfvars' - output, stderr = server_mod.subprocess_execute(cmd) - if stderr != '': - print(f'error: {stderr}') - else: - print('ok') - - -def new_workspace() -> None: - workspace = form.getvalue('doworkspace') - group = form.getvalue('do_create_group') - provider = form.getvalue('do_create_provider') - region = form.getvalue('do_create_regions') - size = form.getvalue('do_create_size') - oss = form.getvalue('do_create_oss') - ssh_name = form.getvalue('do_create_ssh_name') - ssh_ids = form.getvalue('do_create_ssh_ids') - backup = form.getvalue('do_create_backup') - privet_net = form.getvalue('do_create_private_net') - floating_ip = form.getvalue('do_create_floating_net') - monitoring = form.getvalue('do_create_monitoring') - firewall = form.getvalue('do_create_firewall') - - cmd = f'cd scripts/terraform/ && sudo terraform workspace new {workspace}_{group}_do' - output, stderr = server_mod.subprocess_execute(cmd) - - if stderr != '': - prov_common.show_error(stderr, group, workspace, provider) - else: - if sql.add_server_do( - region, size, privet_net, floating_ip, ssh_ids, ssh_name, workspace, oss, firewall, monitoring, - backup, provider, group, 'Creating' - ): - prov_common.show_new_server(workspace, group, 'do') - - -def edit_workspace() -> None: - workspace = form.getvalue('doeditworkspace') - group = form.getvalue('do_edit_group') - provider = form.getvalue('do_edit_provider') - size = form.getvalue('do_edit_size') - oss = form.getvalue('do_edit_oss') - ssh_name = form.getvalue('do_edit_ssh_name') - ssh_ids = form.getvalue('do_edit_ssh_ids') - backup = form.getvalue('do_edit_backup') - privet_net = form.getvalue('do_edit_private_net') - floating_ip = form.getvalue('do_edit_floating_net') - monitoring = form.getvalue('do_edit_monitoring') - firewall = form.getvalue('do_edit_firewall') - server_id = form.getvalue('server_id') - try: - if sql.update_server_do( - size, privet_net, floating_ip, ssh_ids, ssh_name, oss, firewall, monitoring, backup, provider, - group, 'Creating', server_id - ): - - cmd = f'cd scripts/terraform/ && sudo terraform workspace select {workspace}_{group}_do' - output, stderr = server_mod.subprocess_execute(cmd) - - if stderr != '': - prov_common.show_error(stderr, group, workspace, provider) - else: - print('ok') - except Exception as e: - print(e) - - -def create_vars() -> None: - if form.getvalue('dovars'): - dovars = form.getvalue('dovars') - group = form.getvalue('do_create_group') - provider = form.getvalue('do_create_provider') - region = form.getvalue('do_create_regions') - size = form.getvalue('do_create_size') - oss = form.getvalue('do_create_oss') - ssh_name = form.getvalue('do_create_ssh_name') - ssh_ids = form.getvalue('do_create_ssh_ids') - backup = form.getvalue('do_create_backup') - privet_net = form.getvalue('do_create_private_net') - floating_ip = form.getvalue('do_create_floating_net') - monitoring = form.getvalue('do_create_monitoring') - firewall = form.getvalue('do_create_firewall') - else: - dovars = form.getvalue('doeditvars') - group = form.getvalue('do_edit_group') - provider = form.getvalue('do_edit_provider') - region = form.getvalue('do_edit_regions') - size = form.getvalue('do_edit_size') - oss = form.getvalue('do_edit_oss') - ssh_name = form.getvalue('do_edit_ssh_name') - ssh_ids = form.getvalue('do_edit_ssh_ids') - backup = form.getvalue('do_edit_backup') - privet_net = form.getvalue('do_edit_private_net') - floating_ip = form.getvalue('do_edit_floating_net') - monitoring = form.getvalue('do_edit_monitoring') - firewall = form.getvalue('do_edit_firewall') - - token = sql.select_do_provider(provider) - - cmd = f'cd scripts/terraform/ && sudo ansible-playbook var_generator.yml -i inventory -e "region={region} ' \ - f'group={group} size={size} os={oss} floating_ip={floating_ip} ssh_ids={ssh_ids} server_name={dovars} ' \ - f'token={token} backup={backup} monitoring={monitoring} privet_net={privet_net} firewall={firewall} ' \ - f'floating_ip={floating_ip} ssh_name={ssh_name} cloud=do"' - output, stderr = server_mod.subprocess_execute(cmd) - if stderr != '': - print(f'error: {stderr}') - else: - print('ok') diff --git a/app/modules/provisioning/gcore.py b/app/modules/provisioning/gcore.py deleted file mode 100644 index 0e407d97..00000000 --- a/app/modules/provisioning/gcore.py +++ /dev/null @@ -1,141 +0,0 @@ -import modules.db.sql as sql -import modules.common.common as common -import modules.server.server as server_mod -import modules.provisioning.common as prov_common - -form = common.form - - -def create_vars() -> None: - if form.getvalue('gcorevars'): - gcorevars = form.getvalue('gcorevars') - group = form.getvalue('gcore_create_group') - provider = form.getvalue('gcore_create_provider') - region = form.getvalue('gcore_create_regions') - project = form.getvalue('gcore_create_project') - size = form.getvalue('gcore_create_size') - oss = form.getvalue('gcore_create_oss') - ssh_name = form.getvalue('gcore_create_ssh_name') - volume_size = form.getvalue('gcore_create_volume_size') - volume_type = form.getvalue('gcore_create_volume_type') - delete_on_termination = form.getvalue('gcore_create_delete_on_termination') - network_name = form.getvalue('gcore_create_network_name') - firewall = form.getvalue('gcore_create_firewall') - network_type = form.getvalue('gcore_create_network_type') - elif form.getvalue('gcoreeditvars'): - gcorevars = form.getvalue('gcoreeditvars') - group = form.getvalue('gcore_edit_group') - provider = form.getvalue('gcore_edit_provider') - region = form.getvalue('gcore_edit_regions') - project = form.getvalue('gcore_edit_project') - size = form.getvalue('gcore_edit_size') - oss = form.getvalue('gcore_edit_oss') - ssh_name = form.getvalue('gcore_edit_ssh_name') - volume_size = form.getvalue('gcore_edit_volume_size') - volume_type = form.getvalue('gcore_edit_volume_type') - delete_on_termination = form.getvalue('gcore_edit_delete_on_termination') - network_name = form.getvalue('gcore_edit_network_name') - firewall = form.getvalue('gcore_edit_firewall') - network_type = form.getvalue('gcore_edit_network_type') - - try: - gcore_user, gcore_pass = sql.select_gcore_provider(provider) - except Exception as e: - print(e) - - cmd = 'cd scripts/terraform/ && sudo ansible-playbook var_generator.yml -i inventory -e "region={} ' \ - 'group={} size={} os={} network_name={} volume_size={} server_name={} username={} ' \ - 'pass={} firewall={} network_type={} ssh_name={} delete_on_termination={} project={} volume_type={} ' \ - 'cloud=gcore"'.format(region, group, size, oss, network_name, volume_size, gcorevars, gcore_user, gcore_pass, - firewall, network_type, ssh_name, delete_on_termination, project, volume_type) - - output, stderr = server_mod.subprocess_execute(cmd) - if stderr != '': - print(f'error: {stderr}') - else: - print('ok') - - -def validate() -> None: - if form.getvalue('gcorevalidate'): - workspace = form.getvalue('gcorevalidate') - group = form.getvalue('gcore_create_group') - else: - workspace = form.getvalue('gcoreeditvalidate') - group = form.getvalue('gcore_edit_group') - - cmd = f'cd scripts/terraform/ && sudo terraform plan -no-color -input=false -target=module.gcore_module -var-file vars/{workspace}_{group}_gcore.tfvars' - output, stderr = server_mod.subprocess_execute(cmd) - if stderr != '': - print(f'error: {stderr}') - else: - print('ok') - - -def new_workspace() -> None: - workspace = form.getvalue('gcoreworkspace') - group = form.getvalue('gcore_create_group') - provider = form.getvalue('gcore_create_provider') - region = form.getvalue('gcore_create_regions') - project = form.getvalue('gcore_create_project') - size = form.getvalue('gcore_create_size') - oss = form.getvalue('gcore_create_oss') - ssh_name = form.getvalue('gcore_create_ssh_name') - volume_size = form.getvalue('gcore_create_volume_size') - volume_type = form.getvalue('gcore_create_volume_type') - delete_on_termination = form.getvalue('gcore_create_delete_on_termination') - network_type = form.getvalue('gcore_create_network_type') - firewall = form.getvalue('gcore_create_firewall') - network_name = form.getvalue('gcore_create_network_name') - - cmd = f'cd scripts/terraform/ && sudo terraform workspace new {workspace}_{group}_gcore' - output, stderr = server_mod.subprocess_execute(cmd) - - if stderr != '': - prov_common.show_error(stderr, group, workspace, provider) - else: - try: - if sql.add_server_gcore( - project, region, size, network_type, network_name, volume_size, ssh_name, workspace, oss, firewall, - provider, group, 'Creating', delete_on_termination, volume_type - ): - prov_common.show_new_server(workspace, group, 'gcore') - except Exception as e: - print(e) - - -def edit_workspace() -> None: - workspace = form.getvalue('gcoreeditworkspace') - group = form.getvalue('gcore_edit_group') - provider = form.getvalue('gcore_edit_provider') - region = form.getvalue('gcore_edit_regions') - project = form.getvalue('gcore_edit_project') - size = form.getvalue('gcore_edit_size') - oss = form.getvalue('gcore_edit_oss') - ssh_name = form.getvalue('gcore_edit_ssh_name') - volume_size = form.getvalue('gcore_edit_volume_size') - volume_type = form.getvalue('gcore_edit_volume_type') - delete_on_termination = form.getvalue('gcore_edit_delete_on_termination') - network_type = form.getvalue('gcore_edit_network_type') - firewall = form.getvalue('gcore_edit_firewall') - network_name = form.getvalue('gcore_edit_network_name') - server_id = form.getvalue('server_id') - - try: - if sql.update_server_gcore( - region, size, network_type, network_name, volume_size, ssh_name, workspace, oss, firewall, - provider, group, 'Editing', server_id, delete_on_termination, volume_type, project - ): - - try: - cmd = f'cd scripts/terraform/ && sudo terraform workspace select {workspace}_{group}_gcore' - output, stderr = server_mod.subprocess_execute(cmd) - except Exception as e: - print('error: ' + str(e)) - - if stderr != '': - prov_common.show_error(stderr, group, workspace, provider) - else: - print('ok') - except Exception as e: - print(e) diff --git a/app/modules/provisioning/provider.py b/app/modules/provisioning/provider.py deleted file mode 100644 index 4d62badf..00000000 --- a/app/modules/provisioning/provider.py +++ /dev/null @@ -1,106 +0,0 @@ -import os -import http.cookies - -from jinja2 import Environment, FileSystemLoader - -import modules.db.sql as sql -import modules.common.common as common -import modules.roxywi.common as roxywi_common - -form = common.form - - -def create_provider() -> None: - roxywi_common.check_user_group() - is_add = False - provider_name = common.checkAjaxInput(form.getvalue('new_provider_name')) - provider_group = common.checkAjaxInput(form.getvalue('new_provider_group')) - provider_token = common.checkAjaxInput(form.getvalue('new_provider_token')) - cloud = common.checkAjaxInput(form.getvalue('new_provider_cloud')) - - if cloud == 'do': - if sql.add_provider_do(provider_name, provider_group, provider_token): - is_add = True - - elif cloud == 'aws': - provider_secret = common.checkAjaxInput(form.getvalue('aws_new_secret')) - - if sql.add_provider_aws(provider_name, provider_group, provider_token, provider_secret): - is_add = True - - elif cloud == 'gcore': - provider_pass = common.checkAjaxInput(form.getvalue('gcore_new_pass')) - - if sql.add_provider_gcore(provider_name, provider_group, provider_token, provider_pass): - is_add = True - - if is_add: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_uuid = cookie.get('uuid') - group_id = roxywi_common.get_user_group(id=1) - role_id = sql.get_user_role_by_uuid(user_uuid.value, group_id) - params = sql.select_provisioning_params() - providers = sql.select_providers(provider_group, key=provider_token) - - if role_id == 1: - groups = sql.select_groups() - 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, lang=lang) - print(template) - - -def delete_provider() -> None: - roxywi_common.check_user_group() - try: - if sql.delete_provider(common.checkAjaxInput(form.getvalue('providerdel'))): - print('Ok') - roxywi_common.logging('Roxy-WI server', 'Provider has been deleted', provisioning=1) - except Exception as e: - print(e) - - -def edit_DO_provider(provider_id: int) -> None: - roxywi_common.check_user_group() - new_name = form.getvalue('edit_do_provider_name') - new_token = form.getvalue('edit_do_provider_token') - - try: - if sql.update_do_provider(new_name, new_token, provider_id): - print('ok') - roxywi_common.logging('Roxy-WI server', f'Provider has been edited. New name is {new_name}', provisioning=1) - except Exception as e: - print(e) - - -def edit_gcore_provider(provider_id: int) -> None: - roxywi_common.check_user_group() - new_name = form.getvalue('edit_gcore_provider_name') - new_user = form.getvalue('edit_gcore_provider_user') - new_pass = form.getvalue('edit_gcore_provider_pass') - - try: - if sql.update_gcore_provider(new_name, new_user, new_pass, provider_id): - print('ok') - roxywi_common.logging('Roxy-WI server', f'Provider has been edited. New name is {new_name}', provisioning=1) - except Exception as e: - print(e) - - -def edit_aws_provider(provider_id: int) -> None: - roxywi_common.check_user_group() - new_name = form.getvalue('edit_aws_provider_name') - new_key = form.getvalue('edit_aws_provider_key') - new_secret = form.getvalue('edit_aws_provider_secret') - - try: - if sql.update_aws_provider(new_name, new_key, new_secret, provider_id): - print('ok') - roxywi_common.logging('Roxy-WI server', f'Provider has been edited. New name is {new_name}', provisioning=1) - except Exception as e: - print(e) diff --git a/app/modules/provisioning/server.py b/app/modules/provisioning/server.py deleted file mode 100644 index 85627881..00000000 --- a/app/modules/provisioning/server.py +++ /dev/null @@ -1,133 +0,0 @@ -from jinja2 import Environment, FileSystemLoader - -import modules.db.sql as sql -import modules.common.common as common -import modules.roxywi.common as roxywi_common -import modules.server.server as server_mod -import modules.provisioning.common as prov_common - -form = common.form - - -def init_server() -> None: - roxywi_common.check_user_group() - cmd = 'cd scripts/terraform/ && sudo terraform init -upgrade -no-color' - output, stderr = server_mod.subprocess_execute(cmd) - if stderr != '': - print(f'error: {stderr}') - else: - if "Terraform initialized in an empty directory" in output[0]: - print('error: There is not need module') - elif "mkdir .terraform: permission denied" in output[0]: - print('error: Cannot init. Check permission to folder') - - print(output[0]) - - -def edit_server() -> None: - roxywi_common.check_user_group() - server_id = form.getvalue('editServerId') - user_group = form.getvalue('editGroup') - provider_name = form.getvalue('editProviderName') - params = sql.select_provisioning_params() - providers = sql.select_providers(int(user_group)) - lang = roxywi_common.get_user_lang() - show_editing_server = { - 'aws': sql.select_aws_server, - 'do': sql.select_do_server, - 'gcore': sql.select_gcore_server, - } - server = show_editing_server[provider_name](server_id=server_id) - env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates')) - template = env.get_template(f'ajax/provisioning/{provider_name}_edit_dialog.html') - template = template.render(server=server, providers=providers, params=params, lang=lang) - print(template) - - -def create_server() -> None: - roxywi_common.check_user_group() - workspace = form.getvalue('provisioning_workspace') - group = form.getvalue('provisioning_group') - provider_id = form.getvalue('provisioning_provider_id') - action = form.getvalue('provisioning_action') - cloud = form.getvalue('provisioning_cloud') - state_name = '' - - if cloud == 'aws': - state_name = 'aws_instance' - elif cloud == 'do': - state_name = 'digitalocean_droplet' - elif cloud == 'gcore': - state_name = 'gcore_instance' - - tfvars = f'{workspace}_{group}_{cloud}.tfvars' - cmd = f'cd scripts/terraform/ && sudo terraform apply -auto-approve -no-color -input=false -target=module.{cloud}_module -var-file vars/{tfvars}' - output, stderr = server_mod.subprocess_execute(cmd) - - if stderr != '': - prov_common.show_error(stderr, group, workspace, provider_id) - else: - if cloud == 'aws': - cmd = 'cd scripts/terraform/ && sudo terraform state show module.aws_module.aws_eip.floating_ip[0]|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"' - output, stderr = server_mod.subprocess_execute(cmd) - if stderr != '': - cmd = 'cd scripts/terraform/ && sudo terraform state show module.' + cloud + '_module.' + state_name + '.hapwi|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"' - else: - cmd = 'cd scripts/terraform/ && sudo terraform state show module.' + cloud + '_module.' + state_name + '.hapwi|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"' - - output, stderr = server_mod.subprocess_execute(cmd) - ips = '' - for ip in output: - ips += ip - ips += ' ' - - if cloud == 'gcore': - ips = ips.split(' ')[0] - - print(ips) - try: - sql.update_provisioning_server_status('Created', group, workspace, provider_id, update_ip=ips) - except Exception as e: - print(e) - - if cloud == 'gcore': - cmd = 'cd scripts/terraform/ && sudo terraform state show module.gcore_module.gcore_instance.hapwi|grep "name"|grep -v -e "_name\|name_" |head -1 |awk -F"\\\"" \'{print $2}\'' - output, stderr = server_mod.subprocess_execute(cmd) - print(':' + output[0]) - try: - sql.update_provisioning_server_gcore_name(workspace, output[0], group, provider_id) - except Exception as e: - print(e) - - roxywi_common.logging('Roxy-WI server', f'Server {workspace} has been {action}', provisioning=1) - - -def destroy_server() -> None: - roxywi_common.check_user_group() - server_id = form.getvalue('provisiningdestroyserver') - workspace = form.getvalue('servername') - group = form.getvalue('group') - cloud_type = form.getvalue('type') - provider_id = form.getvalue('provider_id') - tf_workspace = f'{workspace}_{group}_{cloud_type}' - cmd = f'cd scripts/terraform/ && sudo terraform init -upgrade -no-color && sudo terraform workspace select {tf_workspace}' - output, stderr = server_mod.subprocess_execute(cmd) - - if stderr != '': - prov_common.show_error(stderr, group, workspace, provider_id) - else: - cmd = f'cd scripts/terraform/ && sudo terraform destroy -auto-approve -no-color -target=module.{cloud_type}_module -var-file vars/{tf_workspace}.tfvars' - output, stderr = server_mod.subprocess_execute(cmd) - - if stderr != '': - print(f'error: {stderr}') - else: - cmd = f'cd scripts/terraform/ && sudo terraform workspace select default && sudo terraform workspace delete -force {tf_workspace}' - output, stderr = server_mod.subprocess_execute(cmd) - - print('ok') - roxywi_common.logging('Roxy-WI server', 'Server has been destroyed', provisioning=1) - try: - sql.delete_provisioned_servers(server_id) - except Exception as e: - print(e) diff --git a/app/modules/roxywi/auth.py b/app/modules/roxywi/auth.py index 5012ddff..e04a410d 100644 --- a/app/modules/roxywi/auth.py +++ b/app/modules/roxywi/auth.py @@ -1,14 +1,14 @@ import os import http.cookies +from flask import request, redirect, make_response, url_for + import modules.db.sql as sql -def check_login(user_uuid, token, **kwargs): +def check_login(user_uuid, token, **kwargs) -> str: if user_uuid is None: - print('<meta http-equiv="refresh" content="0; url=/app/login.py">') - - ref = os.environ.get("REQUEST_URI") + return 'login_page' try: sql.delete_old_uuid() @@ -16,48 +16,85 @@ def check_login(user_uuid, token, **kwargs): raise Exception(f'error: cannot connect to DB {e}') if user_uuid is not None: - if sql.get_user_name_by_uuid(user_uuid.value) is None: - print(f'<meta http-equiv="refresh" content="0; url=login.py?ref={ref}">') - return False + if sql.get_user_name_by_uuid(user_uuid) is None: + return 'login_page' if kwargs.get('service'): required_service = str(kwargs.get('service')) - user_id = sql.get_user_id_by_uuid(user_uuid.value) + user_id = sql.get_user_id_by_uuid(user_uuid) user_services = sql.select_user_services(user_id) if required_service in user_services: - return True + return 'ok' else: - print('<meta http-equiv="refresh" content="0; url=overview.py">') - return False + return 'index' - sql.update_last_act_user(user_uuid.value, token) - else: - print(f'<meta http-equiv="refresh" content="0; url=login.py?ref={ref}">') - return False + try: + ip = request.remote_addr + except Exception: + ip = '' + + sql.update_last_act_user(user_uuid, token, ip) + + return 'login_page' def is_admin(level=1, **kwargs): if kwargs.get('role_id'): role = kwargs.get('role_id') else: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_id = cookie.get('uuid') - user_id = user_id.value - group_id = cookie.get('group') - group_id = int(group_id.value) + user_id = request.cookies.get('uuid') + group_id = request.cookies.get('group') try: role = sql.get_user_role_by_uuid(user_id, group_id) except Exception: role = 4 pass - try: - return True if role <= level else False + return True if int(role) <= int(level) else False except Exception: return False def page_for_admin(level=1) -> None: if not is_admin(level=level): - print('<meta http-equiv="refresh" content="0; url=/">') - return + return redirect(url_for('index')) + + +def check_in_ldap(user, password): + import ldap + + server = sql.get_setting('ldap_server') + port = sql.get_setting('ldap_port') + ldap_class_search = sql.get_setting('ldap_class_search') + root_user = sql.get_setting('ldap_user') + root_password = sql.get_setting('ldap_password') + ldap_base = sql.get_setting('ldap_base') + ldap_search_field = sql.get_setting('ldap_search_field') + ldap_user_attribute = sql.get_setting('ldap_user_attribute') + ldap_type = sql.get_setting('ldap_type') + + ldap_proto = 'ldap' if ldap_type == "0" else 'ldaps' + + ldap_bind = ldap.initialize('{}://{}:{}/'.format(ldap_proto, server, port)) + try: + ldap_bind.protocol_version = ldap.VERSION3 + ldap_bind.set_option(ldap.OPT_REFERRALS, 0) + + bind = ldap_bind.simple_bind_s(root_user, root_password) + + criteria = "(&(objectClass=" + ldap_class_search + ")(" + ldap_user_attribute + "=" + user + "))" + attributes = [ldap_search_field] + result = ldap_bind.search_s(ldap_base, ldap.SCOPE_SUBTREE, criteria, attributes) + + bind = ldap_bind.simple_bind_s(result[0][0], password) + except ldap.INVALID_CREDENTIALS: + return False + except ldap.SERVER_DOWN: + raise Exception('error: LDAP server is down') + except ldap.LDAPError as e: + if type(e.message) == dict and 'desc' in e.message: + raise Exception(f'error: {e.message["desc"]}') + else: + raise Exception (f'error: {e}') + else: + return True diff --git a/app/modules/roxywi/common.py b/app/modules/roxywi/common.py index 07827130..a71f41e4 100644 --- a/app/modules/roxywi/common.py +++ b/app/modules/roxywi/common.py @@ -4,6 +4,7 @@ import glob import http.cookies import distro +from flask import request, redirect, make_response, url_for import modules.db.sql as sql import modules.common.common as common @@ -24,18 +25,16 @@ def get_user_group(**kwargs) -> str: user_group = '' try: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_group_id = cookie.get('group') - user_group_id1 = user_group_id.value - groups = sql.select_groups(id=user_group_id1) + user_group_id = request.cookies.get('group') + groups = sql.select_groups(id=user_group_id) for g in groups: - if g.group_id == int(user_group_id1): + if g.group_id == int(user_group_id): if kwargs.get('id'): user_group = g.group_id else: user_group = g.name - except Exception: - check_user_group() + except Exception as e: + raise Exception(f'error: {e}') return user_group @@ -44,27 +43,41 @@ def check_user_group(**kwargs): if kwargs.get('token') is not None: return True + cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) + if kwargs.get('user_uuid'): group_id = kwargs.get('user_group_id') user_uuid = kwargs.get('user_uuid') user_id = sql.get_user_id_by_uuid(user_uuid) else: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_uuid = cookie.get('uuid') - group = cookie.get('group') - group_id = group.value - user_id = sql.get_user_id_by_uuid(user_uuid.value) + group_id = cookie.get('group') + user_id = sql.get_user_id_by_uuid(user_uuid) + + if sql.check_user_group(user_id, group_id): + return True + else: + logging('Roxy-WI server', ' has tried to actions in not his group ', roxywi=1, login=1) + return False + + +def check_user_group_for_flask(**kwargs): + if kwargs.get('token') is not None: + return True + + if kwargs.get('user_uuid'): + group_id = kwargs.get('user_group_id') + user_uuid = kwargs.get('user_uuid') + user_id = sql.get_user_id_by_uuid(user_uuid) + else: + user_uuid = request.cookies.get('uuid') + group_id = request.cookies.get('group') + user_id = sql.get_user_id_by_uuid(user_uuid) if sql.check_user_group(user_id, group_id): return True else: logging('Roxy-WI server', ' has tried to actions in not his group ', roxywi=1, login=1) - try: - ref = os.environ.get("REQUEST_URI").split('&')[0] - except Exception: - ref = os.environ.get("REQUEST_URI") - ref = common.checkAjaxInput(ref) - print(f'<meta http-equiv="refresh" content="0; url={ref}">') return False @@ -72,11 +85,10 @@ def get_user_id(**kwargs): if kwargs.get('login'): return sql.get_user_id_by_username(kwargs.get('login')) - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_uuid = cookie.get('uuid') + user_uuid = request.cookies.get('uuid') if user_uuid is not None: - user_id = sql.get_user_id_by_uuid(user_uuid.value) + user_id = sql.get_user_id_by_uuid(user_uuid) return user_id @@ -89,18 +101,10 @@ def check_is_server_in_group(server_ip: str) -> bool: return True else: logging('Roxy-WI server', ' has tried to actions in not his group server ', roxywi=1, login=1) - try: - ref = os.environ.get("REQUEST_URI").split('&')[0] - except Exception: - ref = os.environ.get("REQUEST_URI") - ref = common.checkAjaxInput(ref) - print(f'<meta http-equiv="refresh" content="0; url={ref}">') return False -def get_files(folder=None, file_format='cfg') -> list: - if folder is None: - folder = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') +def get_files(folder, file_format, server_ip=None) -> list: if file_format == 'log': file = [] else: @@ -120,7 +124,7 @@ def get_files(folder=None, file_format='cfg') -> list: if file_format == 'cfg' or file_format == 'conf': for file in files: ip = file.split("-") - if serv == ip[0]: + if server_ip == ip[0]: return_files.add(file) return sorted(return_files, reverse=True) else: @@ -147,9 +151,8 @@ def logging(server_ip: str, action: str, **kwargs) -> None: ip = '' try: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_uuid = cookie.get('uuid') - login = sql.get_user_name_by_uuid(user_uuid.value) + user_uuid = request.cookies.get('uuid') + login = sql.get_user_name_by_uuid(user_uuid) except Exception: login_name = kwargs.get('login') try: @@ -219,9 +222,17 @@ def get_dick_permit(**kwargs): else: token = '' - if check_user_group(token=token): + if not kwargs.get('group_id'): try: - servers = sql.get_dick_permit(**kwargs) + group_id = get_user_group(id=1) + except Exception as e: + return str(e) + else: + group_id = kwargs.get('group_id') + + if check_user_group_for_flask(token=token): + try: + servers = sql.get_dick_permit(group_id, **kwargs) except Exception as e: raise Exception(e) else: @@ -231,33 +242,30 @@ def get_dick_permit(**kwargs): def get_users_params(**kwargs): - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - try: - user_uuid = cookie.get('uuid') - user = sql.get_user_name_by_uuid(user_uuid.value) + user_uuid = request.cookies.get('uuid') + user = sql.get_user_name_by_uuid(user_uuid) except Exception: - print('<meta http-equiv="refresh" content="0; url=/app/login.py">') + make_response(redirect(url_for('login_page'))) return try: - group_id = cookie.get('group') - group_id = int(group_id.value) + group_id = int(request.cookies.get('group')) except Exception: - print('<meta http-equiv="refresh" content="0; url=/app/login.py">') + make_response(redirect(url_for('login_page'))) return try: - role = sql.get_user_role_by_uuid(user_uuid.value, group_id) + role = sql.get_user_role_by_uuid(user_uuid, group_id) except Exception: - print('<meta http-equiv="refresh" content="0; url=/app/login.py">') + make_response(redirect(url_for('login_page'))) return try: - user_id = sql.get_user_id_by_uuid(user_uuid.value) + user_id = sql.get_user_id_by_uuid(user_uuid) user_services = sql.select_user_services(user_id) - token = sql.get_token(user_uuid.value) + token = sql.get_token(user_uuid) except Exception: - print('<meta http-equiv="refresh" content="0; url=/app/login.py">') + make_response(redirect(url_for('login_page'))) return if kwargs.get('virt') and kwargs.get('haproxy'): @@ -273,7 +281,7 @@ def get_users_params(**kwargs): else: servers = get_dick_permit() - user_lang = get_user_lang() + user_lang = get_user_lang_for_flask() user_params = { 'user': user, @@ -297,6 +305,21 @@ def get_user_lang() -> str: except Exception: return 'en' + if user_lang is None: + user_lang = 'en' + + return user_lang + + +def get_user_lang_for_flask() -> str: + try: + user_lang = request.cookies.get('lang') + except Exception: + return 'en' + + if user_lang is None: + user_lang = 'en' + return user_lang @@ -312,3 +335,13 @@ def return_unsubscribed_user_status() -> dict: user_subscription = {'user_status': 0, 'user_plan': 0} return user_subscription + + +def return_user_subscription(): + try: + user_subscription = return_user_status() + except Exception as e: + user_subscription = return_unsubscribed_user_status() + roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1) + + return user_subscription diff --git a/app/modules/roxywi/group.py b/app/modules/roxywi/group.py index 460b186e..33aa7a0f 100644 --- a/app/modules/roxywi/group.py +++ b/app/modules/roxywi/group.py @@ -2,19 +2,19 @@ import modules.db.sql as sql import modules.roxywi.common as roxywi_common -def update_group(group_id: int, group_name: str, desc: str) -> None: - print(group_name) +def update_group(group_id: int, group_name: str, desc: str) -> str: if group_name == '': - print(roxywi_common.return_error_message()) + return roxywi_common.return_error_message() else: try: sql.update_group(group_name, desc, group_id) roxywi_common.logging('Roxy-WI server', f'The {group_name} has been updated', roxywi=1, login=1) + return 'ok' except Exception as e: - print(f'error: {e}') + return f'error: {e}' -def delete_group(group_id: int) -> None: +def delete_group(group_id: int) -> str: group = sql.select_groups(id=group_id) group_name = '' @@ -22,5 +22,5 @@ def delete_group(group_id: int) -> None: group_name = g.name if sql.delete_group(group_id): - print("Ok") roxywi_common.logging('Roxy-WI server', f'The {group_name} has been deleted', roxywi=1, login=1) + return 'ok' diff --git a/app/modules/roxywi/logs.py b/app/modules/roxywi/logs.py index 3490484b..d2e6aae9 100644 --- a/app/modules/roxywi/logs.py +++ b/app/modules/roxywi/logs.py @@ -54,33 +54,29 @@ def show_log(stdout, **kwargs): def show_roxy_log( - serv, rows='10', waf='0', grep=None, hour='00', - minute='00', hour1='24', minute1='00', service='haproxy', **kwargs + serv, rows='10', waf='0', grep=None, exgrep=None, hour='00', + minute='00', hour1='24', minute1='00', service='haproxy', log_file='123', **kwargs ) -> str: - exgrep = form.getvalue('exgrep') - log_file = form.getvalue('file') date = checkAjaxInput(hour) + ':' + checkAjaxInput(minute) date1 = checkAjaxInput(hour1) + ':' + checkAjaxInput(minute1) rows = checkAjaxInput(rows) waf = checkAjaxInput(waf) cmd = '' awk_column = 3 + grep_act = '' + exgrep_act = '' - if grep is not None: + if grep: grep_act = '|egrep "%s"' % checkAjaxInput(grep) - else: - grep_act = '' - if exgrep is not None: + if exgrep: exgrep_act = '|egrep -v "%s"' % checkAjaxInput(exgrep) - else: - exgrep_act = '' if log_file is not None: log_file = checkAjaxInput(log_file) - if '..' in log_file: return 'error: nice try' + if '..' in log_file: raise Exception('error: nice try') else: - if '..' in serv: return 'error: nice try' + if '..' in serv: raise Exception('error: nice try') if service in ('nginx', 'haproxy', 'apache', 'keepalived'): syslog_server_enable = sql.get_setting('syslog_server_enable') @@ -102,9 +98,10 @@ def show_roxy_log( else: local_path_logs = sql.get_setting('haproxy_path_logs') commands = ["sudo cat %s/%s| awk '$3>\"%s:00\" && $3<\"%s:00\"' |tail -%s %s %s" % (local_path_logs, log_file, date, date1, rows, grep_act, exgrep_act)] + syslog_server = serv else: - if '..' in serv: return 'error: nice try' + if '..' in serv: raise Exception('error: nice try') commands = ["sudo cat /var/log/%s/syslog.log | sed '/ %s:00/,/ %s:00/! d' |tail -%s %s %s %s" % (serv, date, date1, rows, grep_act, grep, exgrep_act)] syslog_server = sql.get_setting('syslog_server') @@ -112,6 +109,7 @@ def show_roxy_log( if waf == "1": local_path_logs = '/var/log/waf.log' commands = ["sudo cat %s |tail -%s %s %s" % (local_path_logs, rows, grep_act, exgrep_act)] + if kwargs.get('html') == 0: a = server_mod.ssh_command(syslog_server, commands) return show_log(a, html=0, grep=grep) diff --git a/app/modules/roxywi/metrics.py b/app/modules/roxywi/metrics.py index af15fa1d..dcaeeac5 100644 --- a/app/modules/roxywi/metrics.py +++ b/app/modules/roxywi/metrics.py @@ -1,12 +1,10 @@ -import json - import psutil import modules.db.sql as sql import modules.server.server as server_mod -def show_ram_metrics(metrics_type: str) -> None: +def show_ram_metrics(metrics_type: str) -> dict: metrics = {'chartData': {}} rams = '' @@ -27,10 +25,10 @@ def show_ram_metrics(metrics_type: str) -> None: metrics['chartData']['rams'] = rams - print(json.dumps(metrics)) + return metrics -def show_cpu_metrics(metrics_type: str) -> None: +def show_cpu_metrics(metrics_type: str) -> dict: metrics = {'chartData': {}} cpus = '' @@ -54,10 +52,10 @@ def show_cpu_metrics(metrics_type: str) -> None: metrics['chartData']['cpus'] = cpus - print(json.dumps(metrics)) + return metrics -def haproxy_metrics(server_ip: str, hostname: str, time_range: str) -> None: +def haproxy_metrics(server_ip: str, hostname: str, time_range: str) -> dict: metric = sql.select_metrics(server_ip, 'haproxy', time_range=time_range) metrics = {'chartData': {}} metrics['chartData']['labels'] = {} @@ -82,10 +80,10 @@ def haproxy_metrics(server_ip: str, hostname: str, time_range: str) -> None: metrics['chartData']['sess_rate'] = sess_rate metrics['chartData']['server'] = hostname + ' (' + server + ')' - print(json.dumps(metrics)) + return metrics -def haproxy_http_metrics(server_ip: str, hostname: str, time_range: str) -> None: +def haproxy_http_metrics(server_ip: str, hostname: str, time_range: str) -> dict: metric = sql.select_metrics(server_ip, 'http_metrics', time_range=time_range) metrics = {'chartData': {}} metrics['chartData']['labels'] = {} @@ -113,10 +111,10 @@ def haproxy_http_metrics(server_ip: str, hostname: str, time_range: str) -> None metrics['chartData']['http_5xx'] = http_5xx metrics['chartData']['server'] = f'{hostname} ({server})' - print(json.dumps(metrics)) + return metrics -def service_metrics(server_ip: str, hostname: str, service: str, time_range: str) -> None: +def service_metrics(server_ip: str, hostname: str, service: str, time_range: str) -> dict: metric = sql.select_metrics(server_ip, service, time_range=time_range) metrics = {'chartData': {}} @@ -134,4 +132,4 @@ def service_metrics(server_ip: str, hostname: str, service: str, time_range: str metrics['chartData']['curr_con'] = curr_con metrics['chartData']['server'] = f'{hostname} ({server_ip})' - print(json.dumps(metrics)) + return metrics diff --git a/app/modules/roxywi/nettools.py b/app/modules/roxywi/nettools.py index 740fd90d..1889c751 100644 --- a/app/modules/roxywi/nettools.py +++ b/app/modules/roxywi/nettools.py @@ -1,20 +1,13 @@ -import modules.common.common as common import modules.server.server as server_mod -form = common.form - -def ping_from_server() -> None: - server_from = common.checkAjaxInput(form.getvalue('nettools_icmp_server_from')) - server_to = common.checkAjaxInput(form.getvalue('nettools_icmp_server_to')) - server_to = common.is_ip_or_dns(server_to) - action = common.checkAjaxInput(form.getvalue('nettools_action')) +def ping_from_server(server_from: str, server_to: str, action: str) -> str: stderr = '' action_for_sending = '' + output1 = '' if server_to == '': - print('warning: enter a correct IP or DNS name') - return + return 'warning: enter a correct IP or DNS name' if action == 'nettools_ping': action_for_sending = 'ping -c 4 -W 1 -s 56 -O ' @@ -30,35 +23,32 @@ def ping_from_server() -> None: output = server_mod.ssh_command(server_from, action_for_sending, raw=1, timeout=15) if stderr != '': - print(f'error: {stderr}') - return + return f'error: {stderr}' for i in output: if i == ' ' or i == '': continue i = i.strip() if 'PING' in i: - print('<span style="color: var(--link-dark-blue); display: block; margin-top: -20px;">') + output1 += '<span style="color: var(--link-dark-blue); display: block; margin-top: -5px;">' elif 'no reply' in i or 'no answer yet' in i or 'Too many hops' in i or '100% packet loss' in i: - print('<span style="color: var(--red-color);">') + output1 += '<span style="color: var(--red-color);">' elif 'ms' in i and '100% packet loss' not in i: - print('<span style="color: var(--green-color);">') + output1 += '<span style="color: var(--green-color);">' else: - print('<span>') + output1 += '<span>' - print(i + '</span><br />') + output1 += i + '</span><br />' + + return output1 -def telnet_from_server() -> None: - server_from = common.checkAjaxInput(form.getvalue('nettools_telnet_server_from')) - server_to = common.checkAjaxInput(form.getvalue('nettools_telnet_server_to')) - server_to = common.is_ip_or_dns(server_to) - port_to = common.checkAjaxInput(form.getvalue('nettools_telnet_port_to')) +def telnet_from_server(server_from: str, server_to: str, port_to: str) -> str: count_string = 0 stderr = '' + output1 = '' if server_to == '': - print('warning: enter a correct IP or DNS name') - return + return 'warning: enter a correct IP or DNS name' if server_from == 'localhost': action_for_sending = f'echo "exit"|nc {server_to} {port_to} -t -w 1s' @@ -68,33 +58,27 @@ def telnet_from_server() -> None: output = server_mod.ssh_command(server_from, action_for_sending, raw=1) if stderr != '': - print(f'error: <b>{stderr[5:]}</b>') - return + return f'error: <b>{stderr[5:]}</b>' for i in output: if i == ' ': continue i = i.strip() if i == 'Ncat: Connection timed out.': - print(f'error: <b>{i[5:]}</b>') - break - print(i + '<br>') + return f'error: <b>{i[5:]}</b>' + output1 += i + '<br>' count_string += 1 if count_string > 1: break + return output1 - -def nslookup_from_server() -> None: - server_from = common.checkAjaxInput(form.getvalue('nettools_nslookup_server_from')) - dns_name = common.checkAjaxInput(form.getvalue('nettools_nslookup_name')) - dns_name = common.is_ip_or_dns(dns_name) - record_type = common.checkAjaxInput(form.getvalue('nettools_nslookup_record_type')) +def nslookup_from_server(server_from: str, dns_name: str, record_type: str) -> str: count_string = 0 stderr = '' + output1 = '' if dns_name == '': - print('warning: enter a correct DNS name') - return + return 'warning: enter a correct DNS name' action_for_sending = f'dig {dns_name} {record_type} |grep -e "SERVER\|{dns_name}"' @@ -105,23 +89,21 @@ def nslookup_from_server() -> None: output = server_mod.ssh_command(server_from, action_for_sending, raw=1) if stderr != '': - print('error: ' + stderr[5:-1]) - return + return 'error: ' + stderr[5:-1] - print( - f'<b style="display: block; margin-top:10px;">The <i style="color: var(--blue-color)">{dns_name}</i> domain has the following records:</b>') + output1 += f'<b style="display: block; margin-top:10px;">The <i style="color: var(--blue-color)">{dns_name}</i> domain has the following records:</b>' for i in output: if 'dig: command not found.' in i: - print('error: Install bind-utils before using NSLookup') - break + return 'error: Install bind-utils before using NSLookup' if ';' in i and ';; SERVER:' not in i: continue if 'SOA' in i and record_type != 'SOA': - print('<b style="color: red">There are not any records for this type') - break + return '<b style="color: red">There are not any records for this type' if ';; SERVER:' in i: i = i[10:] - print('<br><b>From NS server:</b><br>') + output1 += '<br><b>From NS server:</b><br>' i = i.strip() - print('<i>' + i + '</i><br>') + output1 += '<i>' + i + '</i><br>' count_string += 1 + + return output1 diff --git a/app/modules/roxywi/overview.py b/app/modules/roxywi/overview.py index 55c3f143..ac25b718 100644 --- a/app/modules/roxywi/overview.py +++ b/app/modules/roxywi/overview.py @@ -1,7 +1,8 @@ import os -import http.cookies +import psutil import requests +from flask import render_template, request from jinja2 import Environment, FileSystemLoader import modules.db.sql as sql @@ -12,11 +13,8 @@ import modules.server.server as server_mod import modules.service.common as service_common -def user_ovw() -> None: - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/show_users_ovw.html') - - lang = roxywi_common.get_user_lang() +def user_owv(): + lang = roxywi_common.get_user_lang_for_flask() roles = sql.select_roles() user_params = roxywi_common.get_users_params() users_groups = sql.select_user_groups_with_names(1, all=1) @@ -27,109 +25,77 @@ def user_ovw() -> None: else: users = sql.select_users() - template = template.render(users=users, users_groups=users_groups, lang=lang, roles=roles) - print(template) + return render_template('ajax/show_users_ovw.html', users=users, users_groups=users_groups, lang=lang, roles=roles) 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(), lang=lang) - print(template) + lang = roxywi_common.get_user_lang_for_flask() + + return render_template('ajax/show_sub_ovw.html', sub=sql.select_user_all(), lang=lang) def show_overview(serv) -> None: - import asyncio + servers = [] + user_uuid = request.cookies.get('uuid') + group_id = request.cookies.get('group') + lang = roxywi_common.get_user_lang_for_flask() + role = sql.get_user_role_by_uuid(user_uuid, group_id) + server = [server for server in sql.select_servers(server=serv)] + user_id = sql.get_user_id_by_uuid(user_uuid) + user_services = sql.select_user_services(user_id) - async def async_get_overview(serv1, serv2, user_uuid, server_id): - user_id = sql.get_user_id_by_uuid(user_uuid) - user_services = sql.select_user_services(user_id) + haproxy = sql.select_haproxy(serv) if '1' in user_services else 0 + nginx = sql.select_nginx(serv) if '2' in user_services else 0 + keepalived = sql.select_keepalived(serv) if '3' in user_services else 0 + apache = sql.select_apache(serv) if '4' in user_services else 0 - haproxy = sql.select_haproxy(serv) if '1' in user_services else 0 - nginx = sql.select_nginx(serv) if '2' in user_services else 0 - keepalived = sql.select_keepalived(serv) if '3' in user_services else 0 - apache = sql.select_apache(serv) if '4' in user_services else 0 + waf = sql.select_waf_servers(server[0][2]) + haproxy_process = '' + keepalived_process = '' + nginx_process = '' + apache_process = '' + waf_process = '' - waf = sql.select_waf_servers(serv2) - haproxy_process = '' - keepalived_process = '' - nginx_process = '' - apache_process = '' - waf_process = '' + try: + waf_len = len(waf) + except Exception: + waf_len = 0 + if haproxy: + cmd = f'echo "show info" |nc {server[0][2]} {sql.get_setting("haproxy_sock_port")} -w 1|grep -e "Process_num"' + haproxy_process = service_common.server_status(server_mod.subprocess_execute(cmd)) + + if nginx: + nginx_cmd = f'echo "something" |nc {server[0][2]} {sql.get_setting("nginx_stats_port")} -w 1' + nginx_process = service_common.server_status(server_mod.subprocess_execute(nginx_cmd)) + + if apache: + apache_cmd = f'echo "something" |nc {server[0][2]} {sql.get_setting("apache_stats_port")} -w 1' + apache_process = service_common.server_status(server_mod.subprocess_execute(apache_cmd)) + + if keepalived: + command = ["ps ax |grep keepalived|grep -v grep|wc -l|tr -d '\n'"] try: - waf_len = len(waf) - except Exception: - waf_len = 0 + keepalived_process = server_mod.ssh_command(server[0][2], command) + except Exception as e: + raise Exception(f'error: {e} for server {server[0][2]}') - if haproxy: - cmd = f'echo "show info" |nc {serv2} {sql.get_setting("haproxy_sock_port")} -w 1|grep -e "Process_num"' - haproxy_process = service_common.server_status(server_mod.subprocess_execute(cmd)) + if waf_len >= 1: + command = ["ps ax |grep waf/bin/modsecurity |grep -v grep |wc -l"] + try: + waf_process = server_mod.ssh_command(server[0][2], command) + except Exception as e: + raise Exception(f'error: {e} for server {server[0][2]}') - if nginx: - nginx_cmd = f'echo "something" |nc {serv2} {sql.get_setting("nginx_stats_port")} -w 1' - nginx_process = service_common.server_status(server_mod.subprocess_execute(nginx_cmd)) + server_status = ( + server[0][1], server[0][2], haproxy, haproxy_process, waf_process, waf, keepalived, keepalived_process, nginx, + nginx_process, server[0][0], apache, apache_process + ) - if apache: - apache_cmd = f'echo "something" |nc {serv2} {sql.get_setting("apache_stats_port")} -w 1' - apache_process = service_common.server_status(server_mod.subprocess_execute(apache_cmd)) + servers.append(server_status) + servers_sorted = sorted(servers, key=common.get_key) - if keepalived: - command = ["ps ax |grep keepalived|grep -v grep|wc -l|tr -d '\n'"] - try: - keepalived_process = server_mod.ssh_command(serv2, command) - except Exception as e: - print(f'error: {e} for server {serv2}') - return - - if waf_len >= 1: - command = ["ps ax |grep waf/bin/modsecurity |grep -v grep |wc -l"] - try: - waf_process = server_mod.ssh_command(serv2, command) - except Exception as e: - print(f'error: {e} for server {serv2}') - return - - server_status = (serv1, - serv2, - haproxy, - haproxy_process, - waf_process, - waf, - keepalived, - keepalived_process, - nginx, - nginx_process, - server_id, - apache, - apache_process) - return server_status - - async def get_runner_overview(): - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, - extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do']) - - servers = [] - template = env.get_template('ajax/overview.html') - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_uuid = cookie.get('uuid') - group_id = cookie.get('group') - group_id = int(group_id.value) - lang = roxywi_common.get_user_lang() - role = sql.get_user_role_by_uuid(user_uuid.value, group_id) - futures = [async_get_overview(server[1], server[2], user_uuid.value, server[0]) for server in - sql.select_servers(server=serv)] - for i, future in enumerate(asyncio.as_completed(futures)): - result = await future - servers.append(result) - servers_sorted = sorted(servers, key=common.get_key) - template = template.render(service_status=servers_sorted, role=role, lang=lang) - print(template) - - ioloop = asyncio.get_event_loop() - ioloop.run_until_complete(get_runner_overview()) - ioloop.close() + return render_template('ajax/overview.html', service_status=servers_sorted, role=role, lang=lang) def show_haproxy_binout(server_ip: str) -> None: @@ -151,14 +117,12 @@ def show_haproxy_binout(server_ip: str) -> None: server_ip, port) cout, stderr3 = server_mod.subprocess_execute(cmd) bin_bout.append(cout[0]) - lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates'), autoescape=True) - template = env.get_template('ajax/bin_bout.html') - template = template.render(bin_bout=bin_bout, serv=server_ip, service='haproxy', lang=lang) - print(template) + lang = roxywi_common.get_user_lang_for_flask() + + return render_template('ajax/bin_bout.html', bin_bout=bin_bout, serv=server_ip, service='haproxy', lang=lang) -def show_nginx_connections(server_ip: str) -> None: +def show_nginx_connections(server_ip: str) -> str: port = sql.get_setting('nginx_stats_port') user = sql.get_setting('nginx_stats_user') password = sql.get_setting('nginx_stats_password') @@ -175,13 +139,10 @@ def show_nginx_connections(server_ip: str) -> None: if num == 2: bin_bout.append(line.split(' ')[3]) - lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates')) - template = env.get_template('ajax/bin_bout.html') - template = template.render(bin_bout=bin_bout, serv=server_ip, service='nginx', lang=lang) - print(template) + lang = roxywi_common.get_user_lang_for_flask() + return render_template('ajax/bin_bout.html', bin_bout=bin_bout, serv=server_ip, service='nginx', lang=lang) else: - print('error: cannot connect to NGINX stat page') + return 'error: cannot connect to NGINX stat page' def show_apache_bytes(server_ip: str) -> None: @@ -199,21 +160,13 @@ def show_apache_bytes(server_ip: str) -> None: if 'ReqPerSec' in line or 'BytesPerSec' in line: bin_bout.append(line.split(' ')[1]) - lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates')) - template = env.get_template('ajax/bin_bout.html') - template = template.render(bin_bout=bin_bout, serv=server_ip, service='apache', lang=lang) - print(template) + lang = roxywi_common.get_user_lang_for_flask() + return render_template('ajax/bin_bout.html', bin_bout=bin_bout, serv=server_ip, service='apache', lang=lang) else: - print('error: cannot connect to Apache stat page') + return 'error: cannot connect to Apache stat page' -def show_services_overview() -> None: - import psutil - from jinja2 import Environment, FileSystemLoader - - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/show_services_ovw.html') +def show_services_overview(): user_params = roxywi_common.get_users_params() grafana = 0 metrics_worker = 0 @@ -221,7 +174,7 @@ def show_services_overview() -> None: servers_group = [] host = os.environ.get('HTTP_HOST', '') user_group = roxywi_common.get_user_group(id=1) - lang = roxywi_common.get_user_lang() + lang = roxywi_common.get_user_lang_for_flask() if (user_params['role'] == 2 or user_params['role'] == 3) and int(user_group) != 1: for s in user_params['servers']: @@ -268,7 +221,8 @@ def show_services_overview() -> None: cmd = "systemctl is-active roxy-wi-socket" socket, stderr = server_mod.subprocess_execute(cmd) - rendered_template = template.render( + return render_template( + 'ajax/show_services_ovw.html', role=user_params['role'], metrics_master=''.join(metrics_master), metrics_worker=metrics_worker, checker_master=''.join(checker_master), checker_worker=checker_worker, keep_alive=''.join(keep_alive), smon=''.join(smon), port_scanner=''.join(port_scanner), grafana=grafana, socket=''.join(socket), @@ -279,14 +233,10 @@ def show_services_overview() -> None: keep_alive_log_id=roxy_logs.roxy_wi_log(log_id=1, file="keep_alive"), socket_log_id=roxy_logs.roxy_wi_log(log_id=1, file="socket"), error=stderr, lang=lang ) - print(rendered_template) - def keepalived_became_master(server_ip) -> None: commands = ["sudo kill -USR2 $(cat /var/run/keepalived.pid) && sudo grep 'Became master' /tmp/keepalived.stats |awk '{print $3}'"] became_master = server_mod.ssh_command(server_ip, commands) - lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates')) - template = env.get_template('ajax/bin_bout.html') - template = template.render(bin_bout=became_master, serv=server_ip, service='keepalived', lang=lang) - print(template) + lang = roxywi_common.get_user_lang_for_flask() + + return render_template('ajax/bin_bout.html', bin_bout=became_master, serv=server_ip, service='keepalived', lang=lang) diff --git a/app/modules/roxywi/roxy.py b/app/modules/roxywi/roxy.py index e40ef724..bdad1de2 100644 --- a/app/modules/roxywi/roxy.py +++ b/app/modules/roxywi/roxy.py @@ -50,8 +50,8 @@ def update_roxy_wi(service): cmd = f'sudo -S yum -y install {service} {restart_service}' output, stderr = server_mod.subprocess_execute(cmd) - print(output) - print(stderr) + return output + # print(stderr) def check_ver(): @@ -68,6 +68,8 @@ def versions(): current_ver_without_dots += '00' if len(current_ver_without_dots) == 3: current_ver_without_dots += '0' + if len(current_ver_without_dots) == 7: + current_ver_without_dots += '0' current_ver_without_dots = int(current_ver_without_dots) except Exception: current_ver = "Sorry cannot get current version" @@ -82,6 +84,8 @@ def versions(): new_ver_without_dots += '00' if len(new_ver_without_dots) == 3: new_ver_without_dots += '0' + if len(new_ver_without_dots) == 7: + new_ver_without_dots += '0' new_ver_without_dots = int(new_ver_without_dots) except Exception as e: new_ver = "Cannot get a new version" @@ -192,21 +196,16 @@ def check_new_version(service): return res -def action_service(action: str, service: str) -> None: - if action not in ('start', 'stop', 'restart'): - print('error: wrong action') - return - +def action_service(action: str, service: str) -> str: is_in_docker = is_docker() cmd = f"sudo systemctl disable {service} --now" if action in ("start", "restart"): cmd = f"sudo systemctl {action} {service} --now" if not sql.select_user_status(): - print( - 'warning: The service is disabled because you are not subscribed. Read <a href="https://roxy-wi.org/pricing" ' - 'title="Roxy-WI pricing" target="_blank">here</a> about subscriptions') - return + return 'warning: The service is disabled because you are not subscribed. Read <a href="https://roxy-wi.org/pricing" ' \ + 'title="Roxy-WI pricing" target="_blank">here</a> about subscriptions' if is_in_docker: cmd = f"sudo supervisorctl {action} {service}" os.system(cmd) roxywi_common.logging('Roxy-WI server', f' The service {service} has been {action}ed', roxywi=1, login=1) + return 'ok' diff --git a/app/modules/roxywi/user.py b/app/modules/roxywi/user.py index 7a81d526..af4fc29a 100644 --- a/app/modules/roxywi/user.py +++ b/app/modules/roxywi/user.py @@ -1,128 +1,89 @@ import os -from jinja2 import Environment, FileSystemLoader +from flask import render_template, request import modules.db.sql as sql -import modules.common.common as common -import modules.roxywi.auth as roxywi_auth import modules.roxywi.common as roxywi_common -import modules.alerting.alerting as alerting - -form = common.form +import modules.tools.alerting as alerting -def create_user(new_user: str, email: str, password: str, role: str, activeuser: int, group: int, **kwargs) -> bool: - if roxywi_common.check_user_group(token=kwargs.get('token')): - - if roxywi_auth.is_admin(level=2, role_id=kwargs.get('role_id')): - try: - user_id = sql.add_user(new_user, email, password, role, activeuser, group) - sql.update_user_role(user_id, group, role) - roxywi_common.logging(f'a new user {new_user}', ' has been created ', roxywi=1, login=1) - try: - sql.update_user_role(user_id, group, role) - except Exception as e: - print(f'error: cannot update user role {e}') - 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" \ - f"Login: {new_user}\n" \ - f"Password: {password}" - alerting.send_email(email, 'A user has been created for you', message) - except Exception as e: - roxywi_common.logging('error: Cannot send email for a new user', e, roxywi=1, login=1) - except Exception as e: - print(f'error: Cannot create a new user: {e}') - roxywi_common.logging('error: Cannot create a new user', e, roxywi=1, login=1) - return False - else: - print('error: dalsdm') - roxywi_common.logging(new_user, ' tried to privilege escalation', roxywi=1, login=1) - return False - - return True +def create_user(new_user: str, email: str, password: str, role: str, activeuser: int, group: int) -> bool: + try: + user_id = sql.add_user(new_user, email, password, role, activeuser, group) + sql.update_user_role(user_id, group, role) + roxywi_common.logging(f'a new user {new_user}', ' has been created ', roxywi=1, login=1) + try: + sql.update_user_role(user_id, group, role) + except Exception as e: + raise Exception(f'error: cannot update user role {e}') + 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" \ + f"Login: {new_user}\n" \ + f"Password: {password}" + alerting.send_email(email, 'A user has been created for you', message) + except Exception as e: + roxywi_common.logging('error: Cannot send email for a new user', e, roxywi=1, login=1) + except Exception as e: + roxywi_common.logging('error: Cannot create a new user', e, roxywi=1, login=1) + raise Exception(f'error: Cannot create a new user: {e}') + else: + return True -def delete_user(): - userdel = int(form.getvalue('userdel')) - if sql.is_user_super_admin(userdel): +def delete_user(user_id: int) -> str: + if sql.is_user_super_admin(user_id): count_super_admin_users = sql.get_super_admin_count() if count_super_admin_users < 2: raise Exception('error: you cannot delete a last user with superAdmin role') - user = sql.select_users(id=userdel) + user = sql.select_users(id=user_id) username = '' for u in user: username = u.username - if sql.delete_user(userdel): - sql.delete_user_groups(userdel) + if sql.delete_user(user_id): + sql.delete_user_groups(user_id) roxywi_common.logging(username, ' has been deleted user ', roxywi=1, login=1) - print("Ok") + return "ok" -def update_user(): - email = form.getvalue('email') - new_user = form.getvalue('updateuser') - user_id = form.getvalue('id') - activeuser = form.getvalue('activeuser') - group_id = int(form.getvalue('usergroup')) - - if roxywi_common.check_user_group(): - if form.getvalue('role'): - role_id = int(form.getvalue('role')) - if roxywi_auth.is_admin(level=role_id): - try: - sql.update_user(new_user, email, role_id, user_id, activeuser) - except Exception as e: - print(e) - sql.update_user_role(user_id, group_id, role_id) - roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1) - else: - roxywi_common.logging(new_user, ' tried to privilege escalation', roxywi=1, login=1) - else: - try: - sql.update_user_from_admin_area(new_user, email, user_id, activeuser) - except Exception as e: - print(e) - roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1) +def update_user(email, new_user, user_id, enabled, group_id, role_id): + try: + sql.update_user(new_user, email, role_id, user_id, enabled) + except Exception as e: + print(e) + sql.update_user_role(user_id, group_id, role_id) + roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1) -def update_user_password(): - password = form.getvalue('updatepassowrd') +def update_user_password(password, uuid, user_id_from_get): username = '' - if form.getvalue('uuid'): - user_id = sql.get_user_id_by_uuid(form.getvalue('uuid')) + if uuid: + user_id = sql.get_user_id_by_uuid(uuid) else: - user_id = form.getvalue('id') + user_id = user_id_from_get user = sql.select_users(id=user_id) for u in user: username = u.username sql.update_user_password(password, user_id) - roxywi_common.logging('user ' + username, ' has changed password ', roxywi=1, login=1) - print("Ok") + roxywi_common.logging(f'user {username}', ' has changed password ', roxywi=1, login=1) + return 'ok' -def get_user_services() -> None: - user_id = common.checkAjaxInput(form.getvalue('getuserservices')) - lang = roxywi_common.get_user_lang() +def get_user_services(user_id: int) -> None: + lang = roxywi_common.get_user_lang_for_flask() services = sql.select_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) + return render_template( + 'ajax/user_services.html', user_services=sql.select_user_services(user_id), id=user_id, services=services, lang=lang + ) -def change_user_services() -> None: - import json - - user_id = common.checkAjaxInput(form.getvalue('changeUserServicesId')) - user = common.checkAjaxInput(form.getvalue('changeUserServicesUser')) +def change_user_services(user: str, user_id: int, user_services: str) -> str: services = '' - user_services = json.loads(form.getvalue('jsonDatas')) for k, v in user_services.items(): for k2, v2 in v.items(): @@ -131,55 +92,42 @@ def change_user_services() -> None: try: if sql.update_user_services(services=services, user_id=user_id): roxywi_common.logging('Roxy-WI server', f'Access to the services has been updated for user: {user}', roxywi=1, login=1) + return 'ok' except Exception as e: - print(e) + return f'error: Cannot save: {e}' -def change_user_active_group() -> None: - group_id = common.checkAjaxInput(form.getvalue('changeUserCurrentGroupId')) - user_uuid = common.checkAjaxInput(form.getvalue('changeUserGroupsUser')) - +def change_user_active_group(group_id: int, user_uuid: str) -> str: try: if sql.update_user_current_groups(group_id, user_uuid): - print('Ok') + return 'Ok' else: - print('error: Cannot change group') + return 'error: Cannot change group' except Exception as e: - print(e) + return f'error: Cannot change the group: {e}' -def get_user_active_group(user_id: str, group: str) -> None: - group_id = sql.get_user_id_by_uuid(user_id.value) +def get_user_active_group(uuid: str, group: str) -> str: + group_id = sql.get_user_id_by_uuid(uuid) groups = sql.select_user_groups_with_names(group_id) - lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/show_user_current_group.html') - template = template.render(groups=groups, group=group.value, id=group_id, lang=lang) - print(template) + lang = roxywi_common.get_user_lang_for_flask() + return render_template('ajax/user_current_group.html', groups=groups, group=group, id=group_id, lang=lang) -def show_user_groups_and_roles() -> None: - user_id = common.checkAjaxInput(form.getvalue('user_id')) +def show_user_groups_and_roles(user_id: int, lang: str) -> None: groups = sql.select_user_groups_with_names(user_id, user_not_in_group=1) roles = sql.select_roles() - lang = roxywi_common.get_user_lang() user_groups = sql.select_user_groups_with_names(user_id) - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/show_user_groups_and_roles.html') - template = template.render(groups=groups, user_groups=user_groups, roles=roles, lang=lang) - print(template) + return render_template('ajax/user_groups_and_roles.html', groups=groups, user_groups=user_groups, roles=roles, lang=lang) -def save_user_group_and_role() -> None: +def save_user_group_and_role(user: str, groups_and_roles: str) -> str: import json - user = common.checkAjaxInput(form.getvalue('changeUserGroupsUser')) - groups_and_roles = json.loads(form.getvalue('jsonDatas')) - for k, v in groups_and_roles.items(): user_id = int(k) if not sql.delete_user_groups(user_id): - print('error: cannot delete old groups') + return 'error: Cannot delete old groups' for k2, v2 in v.items(): group_id = int(k2) role_id = int(v2['role_id']) @@ -190,13 +138,12 @@ def save_user_group_and_role() -> None: break else: roxywi_common.logging('Roxy-WI server', f'Groups and roles have been updated for user: {user}', roxywi=1, login=1) - print('ok') + return 'ok' -def get_ldap_email() -> None: +def get_ldap_email(username) -> str: import ldap - username = common.checkAjaxInput(form.getvalue('get_ldap_email')) server = sql.get_setting('ldap_server') port = sql.get_setting('ldap_port') user = sql.get_setting('ldap_user') @@ -224,8 +171,8 @@ def get_ldap_email() -> None: results = [entry for dn, entry in result if isinstance(entry, dict)] try: - print('["' + results[0][ldap_search_field][0].decode("utf-8") + '","' + domain + '"]') + return '["' + results[0][ldap_search_field][0].decode("utf-8") + '","' + domain + '"]' except Exception: - print('error: user not found') + return 'error: user not found' finally: ldap_bind.unbind() diff --git a/app/modules/roxywi/waf.py b/app/modules/roxywi/waf.py index 323680af..a0225da0 100644 --- a/app/modules/roxywi/waf.py +++ b/app/modules/roxywi/waf.py @@ -1,7 +1,4 @@ -import os -import http.cookies - -from jinja2 import Environment, FileSystemLoader +from flask import render_template, request import modules.db.sql as sql import modules.common.common as common @@ -12,19 +9,10 @@ form = common.form def waf_overview(serv, waf_service) -> None: - env = Environment( - loader=FileSystemLoader('templates/'), autoescape=True, - extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do'] - ) - template = env.get_template('ajax/overivewWaf.html') - servers = sql.select_servers(server=serv) - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_id = cookie.get('uuid') - group_id = cookie.get('group') - group_id = int(group_id.value) - - config_path = '' + user_id = request.cookies.get('uuid') + group_id = int(request.cookies.get('group')) + role = sql.get_user_role_by_uuid(user_id, group_id) returned_servers = [] waf = '' metrics_en = 0 @@ -77,17 +65,13 @@ def waf_overview(serv, waf_service) -> None: returned_servers.append(server_status) - lang = roxywi_common.get_user_lang() + lang = roxywi_common.get_user_lang_for_flask() servers_sorted = sorted(returned_servers, key=common.get_key) - template = template.render(service_status=servers_sorted, role=sql.get_user_role_by_uuid(user_id.value, group_id), - waf_service=waf_service, lang=lang) - print(template) + + return render_template('ajax/overivewWaf.html', service_status=servers_sorted, role=role, waf_service=waf_service, lang=lang) -def change_waf_mode() -> None: - waf_mode = common.checkAjaxInput(form.getvalue('change_waf_mode')) - server_hostname = form.getvalue('server_hostname') - service = common.checkAjaxInput(form.getvalue('service')) +def change_waf_mode(waf_mode: str, server_hostname: str, service: str) -> str: serv = sql.select_server_by_name(server_hostname) if service == 'haproxy': @@ -96,19 +80,22 @@ def change_waf_mode() -> None: config_dir = sql.get_setting('nginx_dir') commands = [f"sudo sed -i 's/^SecRuleEngine.*/SecRuleEngine {waf_mode}/' {config_dir}/waf/modsecurity.conf"] - server_mod.ssh_command(serv, commands) + + try: + server_mod.ssh_command(serv, commands) + except Exception as e: + return str(e) + roxywi_common.logging(serv, f'Has been changed WAF mod to {waf_mode}', roxywi=1, login=1) + return 'ok' -def switch_waf_rule(serv) -> None: - enable = common.checkAjaxInput(form.getvalue('waf_en')) - rule_id = common.checkAjaxInput(form.getvalue('waf_rule_id')) +def switch_waf_rule(serv: str, enable: int, rule_id: int) -> str: haproxy_path = sql.get_setting('haproxy_dir') rule_file = sql.select_waf_rule_by_id(rule_id) conf_file_path = haproxy_path + '/waf/modsecurity.conf' rule_file_path = f'Include {haproxy_path}/waf/rules/{rule_file}' - print(rule_file_path) if enable == '0': cmd = ["sudo sed -i 's!" + rule_file_path + "!#" + rule_file_path + "!' " + conf_file_path] @@ -123,15 +110,14 @@ def switch_waf_rule(serv) -> None: except Exception: pass - print(server_mod.ssh_command(serv, cmd)) sql.update_enable_waf_rules(rule_id, serv, enable) + return server_mod.ssh_command(serv, cmd) -def create_waf_rule(serv) -> None: - service = common.checkAjaxInput(form.getvalue('service')) - new_waf_rule = common.checkAjaxInput(form.getvalue('new_waf_rule')) - new_rule_desc = common.checkAjaxInput(form.getvalue('new_rule_description')) - rule_file = common.checkAjaxInput(form.getvalue('new_rule_file')) +def create_waf_rule(serv, service) -> str: + new_waf_rule = common.checkAjaxInput(request.form.get('new_waf_rule')) + new_rule_desc = common.checkAjaxInput(request.form.get('new_rule_description')) + rule_file = common.checkAjaxInput(request.form.get('new_rule_file')) rule_file = f'{rule_file}.conf' waf_path = '' @@ -144,11 +130,13 @@ def create_waf_rule(serv) -> None: rule_file_path = f'{waf_path}waf/rules/{rule_file}' cmd = [f"sudo echo Include {rule_file_path} >> {conf_file_path} && sudo touch {rule_file_path}"] - print(server_mod.ssh_command(serv, cmd)) - print(sql.insert_new_waf_rule(new_waf_rule, rule_file, new_rule_desc, service, serv)) + server_mod.ssh_command(serv, cmd) + sql.insert_new_waf_rule(new_waf_rule, rule_file, new_rule_desc, service, serv) try: roxywi_common.logging('WAF', f' A new rule has been created {rule_file} on the server {serv}', roxywi=1, login=1) except Exception: pass + + return 'ok' diff --git a/app/modules/server/__init__.py b/app/modules/server/__init__.py index 37e2fc10..dedaf7a8 100644 --- a/app/modules/server/__init__.py +++ b/app/modules/server/__init__.py @@ -1 +1 @@ -NAME = 'roxy-wi-server-modules' +NAME = 'roxy-wi-server-module' diff --git a/app/modules/server/server.py b/app/modules/server/server.py index b23bd326..8df3b459 100644 --- a/app/modules/server/server.py +++ b/app/modules/server/server.py @@ -1,6 +1,6 @@ import json -from jinja2 import Environment, FileSystemLoader +from flask import render_template, request import modules.db.sql as sql import modules.server.ssh as mod_ssh @@ -38,8 +38,6 @@ def ssh_command(server_ip: str, commands: list, **kwargs): try: if kwargs.get('raw'): return stdout.readlines() - if kwargs.get("ip") == "1": - show_ip(stdout) elif kwargs.get("show_log") == "1": import modules.roxywi.logs as roxywi_logs @@ -103,14 +101,6 @@ def get_remote_files(server_ip: str, config_dir: str, file_format: str): return config_files -def show_ip(stdout): - for line in stdout: - if "Permission denied" in line: - print(f'error: {line}') - else: - print(line) - - def get_system_info(server_ip: str) -> str: server_ip = common.is_ip_or_dns(server_ip) if server_ip == '': @@ -123,7 +113,7 @@ def get_system_info(server_ip: str) -> str: try: sys_info_returned = ssh_command(server_ip, command, timeout=5) except Exception as e: - raise e + raise Exception(e) if 'not found' in sys_info_returned: raise Exception(f'You should install lshw on the server {server_ip}. Update System info after installation.') @@ -131,7 +121,7 @@ def get_system_info(server_ip: str) -> str: try: os_info = ssh_command(server_ip, command1) except Exception as e: - raise e + raise Exception(e) os_info = os_info.strip() system_info = json.loads(sys_info_returned) @@ -346,85 +336,54 @@ def get_system_info(server_ip: str) -> str: raise e -def show_system_info() -> None: - server_ip = form.getvalue('server_ip') - server_ip = common.is_ip_or_dns(server_ip) - server_id = form.getvalue('server_id') - - if server_ip == '': - print('error: IP or DNS name is not valid') - return - - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, - extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"]) - env.globals['string_to_dict'] = common.string_to_dict - template = env.get_template('ajax/show_system_info.html') +def show_system_info(server_ip: str, server_id: int) -> str: if sql.is_system_info(server_id): try: get_system_info(server_ip) + except Exception as e: + return f'123 {e}' + try: system_info = sql.select_one_system_info(server_id) - template = template.render(system_info=system_info, server_ip=server_ip, server_id=server_id) - print(template) + return render_template('ajax/show_system_info.html', system_info=system_info, server_ip=server_ip, server_id=server_id) except Exception as e: - print(f'Cannot update server info: {e}') + return f'Cannot update server info: {e}' else: system_info = sql.select_one_system_info(server_id) - template = template.render(system_info=system_info, server_ip=server_ip, server_id=server_id) - print(template) + return render_template('ajax/show_system_info.html', system_info=system_info, server_ip=server_ip, server_id=server_id) -def update_system_info() -> None: - server_ip = form.getvalue('server_ip') - server_ip = common.is_ip_or_dns(server_ip) - server_id = form.getvalue('server_id') - - if server_ip == '': - print('error: IP or DNS name is not valid') - return - +def update_system_info(server_ip: str, server_id: int) -> str: sql.delete_system_info(server_id) - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, - extensions=["jinja2.ext.loopcontrols", "jinja2.ext.do"]) - env.globals['string_to_dict'] = common.string_to_dict - template = env.get_template('ajax/show_system_info.html') - try: get_system_info(server_ip) system_info = sql.select_one_system_info(server_id) - template = template.render(system_info=system_info, server_ip=server_ip, server_id=server_id) - print(template) + return render_template('ajax/show_system_info.html', system_info=system_info, server_ip=server_ip, server_id=server_id) except Exception as e: - print(f'error: Cannot update server info: {e}') + return f'error: Cannot update server info: {e}' -def show_firewalld_rules() -> None: - serv = common.checkAjaxInput(form.getvalue('viewFirewallRules')) - +def show_firewalld_rules(server_ip) -> str: + input_chain2 = [] cmd = ["sudo iptables -L INPUT -n --line-numbers|sed 's/ */ /g'|grep -v -E 'Chain|target'"] cmd1 = ["sudo iptables -L IN_public_allow -n --line-numbers|sed 's/ */ /g'|grep -v -E 'Chain|target'"] cmd2 = ["sudo iptables -L OUTPUT -n --line-numbers|sed 's/ */ /g'|grep -v -E 'Chain|target'"] - input_chain = ssh_command(serv, cmd, raw=1) + input_chain = ssh_command(server_ip, cmd, raw=1) - input_chain2 = [] for each_line in input_chain: input_chain2.append(each_line.strip('\n')) if 'error:' in input_chain: - print(input_chain) - return + return input_chain - 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_chain=input_chain2, IN_public_allow=in_public_allow, output_chain=output_chain, lang=lang) - print(template) + in_public_allow = ssh_command(server_ip, cmd1, raw=1) + output_chain = ssh_command(server_ip, cmd2, raw=1) + lang = roxywi_common.get_user_lang_for_flask() + return render_template('ajax/firewall_rules.html', input_chain=input_chain2, IN_public_allow=in_public_allow, output_chain=output_chain, lang=lang) def create_server(hostname, ip, group, typeip, enable, master, cred, port, desc, haproxy, nginx, apache, firewall, **kwargs) -> bool: @@ -437,7 +396,7 @@ def create_server(hostname, ip, group, typeip, enable, master, cred, port, desc, return False -def update_server_after_creating(hostname: str, ip: str, scan_server: int) -> None: +def update_server_after_creating(hostname: str, ip: str, scan_server: int) -> str: try: try: sql.insert_new_checker_setting_for_server(ip) @@ -481,8 +440,10 @@ def update_server_after_creating(hostname: str, ip: str, scan_server: int) -> No roxywi_common.logging(f'Cannot get information from {hostname}', str(e), roxywi=1, login=1) raise Exception(f'error: Cannot get information from {hostname} {e}') + return 'ok' -def delete_server(server_id: int) -> None: + +def delete_server(server_id: int) -> str: server = sql.select_servers(id=server_id) server_ip = '' hostname = '' @@ -492,11 +453,9 @@ def delete_server(server_id: int) -> None: server_ip = s[2] if sql.check_exists_backup(server_ip): - print('warning: Delete the backup first') - return + return 'warning: Delete the backup first' if sql.check_exists_s3_backup(server_ip): - print('warning: Delete the S3 backup first') - return + return 'warning: Delete the S3 backup first' if sql.delete_server(server_id): sql.delete_waf_server(server_id) sql.delete_port_scanner_settings(server_id) @@ -504,34 +463,25 @@ def delete_server(server_id: int) -> None: sql.delete_action_history(server_id) sql.delete_system_info(server_id) sql.delete_service_settings(server_id) - print("Ok") roxywi_common.logging(server_ip, f'The server {hostname} has been deleted', roxywi=1, login=1) + return 'Ok' -def server_is_up(server_ip: str) -> None: +def server_is_up(server_ip: str) -> str: 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) + return server_status[0] -def show_server_services() -> None: - server_id = common.checkAjaxInput(form.getvalue('server_id')) +def show_server_services(server_id: int) -> None: server = sql.select_servers(id=server_id) - env = Environment(loader=FileSystemLoader('templates')) - template = env.get_template('ajax/show_server_services.html') - lang = roxywi_common.get_user_lang() - template = template.render(server=server, lang=lang) - print(template) + lang = roxywi_common.get_user_lang_for_flask() + return render_template('ajax/show_server_services.html', server=server, lang=lang) -def change_server_services() -> None: - import json - - server_id = common.checkAjaxInput(form.getvalue('changeServerServicesId')) - server_name = common.checkAjaxInput(form.getvalue('changeServerServicesServer')) +def change_server_services(server_id: int, server_name: str, server_services: str) -> str: services = sql.select_services() services_status = {} - server_services = json.loads(form.getvalue('jsonDatas')) for k, v in server_services.items(): for service in services: @@ -541,5 +491,6 @@ def change_server_services() -> None: try: if sql.update_server_services(server_id, services_status[1], services_status[2], services_status[4], services_status[3]): roxywi_common.logging('Roxy-WI server', f'Active services have been updated for {server_name}', roxywi=1, login=1) + return 'ok' except Exception as e: - print(e) + return f'error: {e}' diff --git a/app/modules/server/ssh.py b/app/modules/server/ssh.py index a4a74d8a..fa2469be 100644 --- a/app/modules/server/ssh.py +++ b/app/modules/server/ssh.py @@ -1,6 +1,7 @@ import os import paramiko +from flask import render_template, request import modules.db.sql as sql import modules.common.common as common @@ -16,7 +17,6 @@ get_config = roxy_wi_tools.GetConfigVar() def return_ssh_keys_path(server_ip: str, **kwargs) -> dict: lib_path = get_config.get_config_var('main', 'lib_path') ssh_settings = {} - if kwargs.get('id'): sshs = sql.select_ssh(id=kwargs.get('id')) else: @@ -29,8 +29,11 @@ def return_ssh_keys_path(server_ip: str, **kwargs) -> dict: ssh_key = f'{lib_path}/keys/{ssh.name}.pem' if ssh.enable == 1 else '' ssh_settings.setdefault('key', ssh_key) - ssh_port = [str(server[10]) for server in sql.select_servers(server=server_ip)] - ssh_settings.setdefault('port', ssh_port[0]) + try: + ssh_port = [str(server[10]) for server in sql.select_servers(server=server_ip)] + ssh_settings.setdefault('port', ssh_port[0]) + except Exception as e: + raise Exception(f'error: Cannot get SSH settings: {e}') return ssh_settings @@ -48,29 +51,24 @@ def ssh_connect(server_ip): return ssh -def create_ssh_cred() -> None: - from jinja2 import Environment, FileSystemLoader - - name = common.checkAjaxInput(form.getvalue('new_ssh')) - enable = common.checkAjaxInput(form.getvalue('ssh_enable')) - group = common.checkAjaxInput(form.getvalue('new_group')) +def create_ssh_cred() -> str: + name = common.checkAjaxInput(request.form.get('new_ssh')) + enable = common.checkAjaxInput(request.form.get('ssh_enable')) + group = common.checkAjaxInput(request.form.get('new_group')) group_name = sql.get_group_name_by_id(group) - username = common.checkAjaxInput(form.getvalue('ssh_user')) - password = common.checkAjaxInput(form.getvalue('ssh_pass')) - page = common.checkAjaxInput(form.getvalue('page')) + username = common.checkAjaxInput(request.form.get('ssh_user')) + password = common.checkAjaxInput(request.form.get('ssh_pass')) + page = common.checkAjaxInput(request.form.get('page')) page = page.split("#")[0] - lang = roxywi_common.get_user_lang() + lang = roxywi_common.get_user_lang_for_flask() name = f'{name}_{group_name}' if username is None or name is None: - print(error_mess) + return error_mess else: if sql.insert_new_ssh(name, enable, group, username, password): - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/new_ssh.html') - output_from_parsed_template = template.render(groups=sql.select_groups(), sshs=sql.select_ssh(name=name), page=page, lang=lang) - print(output_from_parsed_template) roxywi_common.logging('Roxy-WI server', f'New SSH credentials {name} has been created', roxywi=1, login=1) + return render_template('ajax/new_ssh.html', groups=sql.select_groups(), sshs=sql.select_ssh(name=name), page=page, lang=lang) def create_ssh_cread_api(name: str, enable: str, group: str, username: str, password: str) -> bool: @@ -90,7 +88,7 @@ def create_ssh_cread_api(name: str, enable: str, group: str, username: str, pass return True -def upload_ssh_key(name: str, user_group: str, key: str) -> bool: +def upload_ssh_key(name: str, user_group: str, key: str) -> str: if '..' in name: raise Exception('error: nice try') @@ -125,28 +123,27 @@ def upload_ssh_key(name: str, user_group: str, key: str) -> bool: except Exception as e: raise Exception(f'error: Cannot save SSH key file: {e}') else: - print(f'success: SSH key has been saved into: {ssh_keys}') + try: + os.chmod(ssh_keys, 0o600) + except IOError as e: + roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) + raise Exception(f'error: something went wrong: {e}') - try: - os.chmod(ssh_keys, 0o600) - except IOError as e: - roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) - raise Exception(f'error: something went wrong: {e}') - - roxywi_common.logging("Roxy-WI server", f"A new SSH cert has been uploaded {ssh_keys}", roxywi=1, login=1) + roxywi_common.logging("Roxy-WI server", f"A new SSH cert has been uploaded {ssh_keys}", roxywi=1, login=1) + return f'success: SSH key has been saved into: {ssh_keys}' -def update_ssh_key() -> None: - ssh_id = common.checkAjaxInput(form.getvalue('id')) - name = common.checkAjaxInput(form.getvalue('name')) - enable = common.checkAjaxInput(form.getvalue('ssh_enable')) - group = common.checkAjaxInput(form.getvalue('group')) - username = common.checkAjaxInput(form.getvalue('ssh_user')) - password = common.checkAjaxInput(form.getvalue('ssh_pass')) +def update_ssh_key() -> str: + ssh_id = common.checkAjaxInput(request.form.get('id')) + name = common.checkAjaxInput(request.form.get('name')) + enable = common.checkAjaxInput(request.form.get('ssh_enable')) + group = common.checkAjaxInput(request.form.get('group')) + username = common.checkAjaxInput(request.form.get('ssh_user')) + password = common.checkAjaxInput(request.form.get('ssh_pass')) new_ssh_key_name = '' if username is None: - print(error_mess) + return error_mess else: lib_path = get_config.get_config_var('main', 'lib_path') @@ -162,15 +159,16 @@ def update_ssh_key() -> None: sql.update_ssh(ssh_id, name, enable, group, username, password) roxywi_common.logging('Roxy-WI server', f'The SSH credentials {name} has been updated ', roxywi=1, login=1) + return 'ok' -def delete_ssh_key() -> None: + +def delete_ssh_key(ssh_id) -> str: lib_path = get_config.get_config_var('main', 'lib_path') - sshdel = common.checkAjaxInput(form.getvalue('sshdel')) name = '' ssh_enable = 0 ssh_key_name = '' - for sshs in sql.select_ssh(id=sshdel): + for sshs in sql.select_ssh(id=ssh_id): ssh_enable = sshs.enable name = sshs.name ssh_key_name = f'{lib_path}/keys/{sshs.name}.pem' @@ -180,6 +178,6 @@ def delete_ssh_key() -> None: os.remove(ssh_key_name) except Exception: pass - if sql.delete_ssh(sshdel): - print("Ok") + if sql.delete_ssh(ssh_id): roxywi_common.logging('Roxy-WI server', f'The SSH credentials {name} has deleted', roxywi=1, login=1) + return 'ok' diff --git a/app/modules/service/action.py b/app/modules/service/action.py index ec36f909..2aab9cca 100644 --- a/app/modules/service/action.py +++ b/app/modules/service/action.py @@ -5,12 +5,21 @@ import modules.roxywi.common as roxywi_common import modules.service.common as service_common -def action_haproxy(server_ip: str, action: str) -> None: - haproxy_service_name = "haproxy" +def common_action(server_ip: str, action: str, service: str) -> str: + action_functions = { + 'haproxy': action_haproxy, + 'nginx': action_nginx, + 'keepalived': action_keepalived, + 'apache': action_apache, + 'waf_haproxy': action_haproxy_waf, + 'waf_nginx': action_nginx_waf + } - if action not in ('start', 'stop', 'reload', 'restart'): - print('error: wrong action') - return + return action_functions[service](server_ip, action) + + +def action_haproxy(server_ip: str, action: str) -> str: + haproxy_service_name = "haproxy" service_common.is_restarted(server_ip, action) @@ -31,16 +40,12 @@ def action_haproxy(server_ip: str, action: str) -> None: commands = [f"sudo systemctl {action} {haproxy_service_name}"] server_mod.ssh_command(server_ip, commands, timeout=5) roxywi_common.logging(server_ip, f'Service has been {action}ed', roxywi=1, login=1, keep_history=1, service='haproxy') - print(f"success: HAProxy has been {action}") + return f"success: HAProxy has been {action}" else: - print("error: Bad config, check please") + return "error: Bad config, check please" -def action_nginx(server_ip: str, action: str) -> None: - if action not in ('start', 'stop', 'reload', 'restart'): - print('error: wrong action') - return - +def action_nginx(server_ip: str, action: str) -> str: service_common.is_restarted(server_ip, action) if service_common.check_nginx_config(server_ip): @@ -57,29 +62,21 @@ def action_nginx(server_ip: str, action: str) -> None: commands = [f"sudo systemctl {action} nginx"] server_mod.ssh_command(server_ip, commands, timeout=5) roxywi_common.logging(server_ip, f'Service has been {action}ed', roxywi=1, login=1, keep_history=1, service='nginx') - print(f"success: NGINX has been {action}") + return f"success: NGINX has been {action}" else: - print("error: Bad config, check please") + return "error: Bad config, check please" -def action_keepalived(server_ip: str, action: str) -> None: - if action not in ('start', 'stop', 'reload', 'restart'): - print('error: wrong action') - return - +def action_keepalived(server_ip: str, action: str) -> str: service_common.is_restarted(server_ip, action) commands = [f"sudo systemctl {action} keepalived"] server_mod.ssh_command(server_ip, commands) roxywi_common.logging(server_ip, f'Service has been {action}ed', roxywi=1, login=1, keep_history=1, service='keepalived') - print(f"success: Keepalived has been {action}") + return f"success: Keepalived has been {action}" -def action_apache(server_ip: str, action: str) -> None: - if action not in ('start', 'stop', 'reload', 'restart'): - print('error: wrong action') - return - +def action_apache(server_ip: str, action: str) -> str: service_common.is_restarted(server_ip, action) server_id = sql.select_server_id_by_ip(server_ip) @@ -97,29 +94,22 @@ def action_apache(server_ip: str, action: str) -> None: commands = [f"sudo systemctl {action} {service_apache_name}"] server_mod.ssh_command(server_ip, commands, timeout=5) roxywi_common.logging(server_ip, f'Service has been {action}ed', roxywi=1, login=1, keep_history=1, service='apache') - print(f"success: Apache has been {action}") + return f"success: Apache has been {action}" -def action_haproxy_waf(server_ip: str, action: str) -> None: - if action not in ('start', 'stop', 'reload', 'restart'): - print('error: wrong action') - return - +def action_haproxy_waf(server_ip: str, action: str) -> str: service_common.is_restarted(server_ip, action) roxywi_common.logging(server_ip, f'HAProxy WAF service has been {action}ed', roxywi=1, login=1, keep_history=1, service='haproxy') commands = [f"sudo systemctl {action} waf"] server_mod.ssh_command(server_ip, commands) + return f"success: WAF has been {action}" -def action_nginx_waf(server_ip: str, action: str) -> None: +def action_nginx_waf(server_ip: str, action: str) -> str: config_dir = common.return_nice_path(sql.get_setting('nginx_dir')) - if action not in ('start', 'stop'): - print('error: wrong action') - return - service_common.is_restarted(server_ip, action) waf_new_state = 'on' if action == 'start' else 'off' @@ -131,12 +121,14 @@ def action_nginx_waf(server_ip: str, action: str) -> None: f" && sudo systemctl reload nginx"] server_mod.ssh_command(server_ip, commands) + return f"success: Apache has been {action}" -def check_service(server_ip: str, user_uuid: str, service: str) -> None: + +def check_service(server_ip: str, user_uuid: str, service: str) -> str: import socket from contextlib import closing - user_id = sql.get_user_id_by_uuid(user_uuid.value) + user_id = sql.get_user_id_by_uuid(user_uuid) user_services = sql.select_user_services(user_id) if '1' in user_services: @@ -146,10 +138,9 @@ def check_service(server_ip: str, user_uuid: str, service: str) -> None: out = server_mod.subprocess_execute(cmd) for k in out[0]: if "Name" in k: - print('up') - break + return 'up' else: - print('down') + return 'down' if '2' in user_services: if service == 'nginx': nginx_stats_port = sql.get_setting('nginx_stats_port') @@ -159,11 +150,11 @@ def check_service(server_ip: str, user_uuid: str, service: str) -> None: try: if sock.connect_ex((server_ip, nginx_stats_port)) == 0: - print('up') + return 'up' else: - print('down') - except Exception: - print('down') + return 'down' + except Exception as e: + return 'down' + str(e) if '4' in user_services: if service == 'apache': apache_stats_port = sql.get_setting('apache_stats_port') @@ -173,8 +164,8 @@ def check_service(server_ip: str, user_uuid: str, service: str) -> None: try: if sock.connect_ex((server_ip, apache_stats_port)) == 0: - print('up') + return 'up' else: - print('down') + return 'down' except Exception as e: - print('down' + str(e)) + return 'down' + str(e) diff --git a/app/modules/service/backup.py b/app/modules/service/backup.py index 0bca4f43..6b9328c1 100644 --- a/app/modules/service/backup.py +++ b/app/modules/service/backup.py @@ -1,6 +1,6 @@ import os -from jinja2 import Environment, FileSystemLoader +from flask import render_template import modules.db.sql as sql import modules.server.ssh as ssh_mod @@ -9,9 +9,10 @@ import modules.roxywi.common as roxywi_common import modules.service.installation as installation_mod -def backup(serv, rpath, time, backup_type, rserver, cred, deljob, update, description) -> None: +def backup(serv, rpath, time, backup_type, rserver, cred, deljob, update, description) -> str: script = 'backup.sh' - ssh_settings = ssh_mod.return_ssh_keys_path('localhost', id=cred) + ssh_settings = ssh_mod.return_ssh_keys_path(rserver, id=cred) + full_path = '/var/www/haproxy-wi/app' if deljob: time = '' @@ -22,54 +23,53 @@ def backup(serv, rpath, time, backup_type, rserver, cred, deljob, update, descri else: deljob = '' if sql.check_exists_backup(serv): - print(f'warning: Backup job for {serv} already exists') - return None + return f'warning: Backup job for {serv} already exists' - os.system(f"cp scripts/{script} .") + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") commands = [ - f"chmod +x {script} && ./{script} HOST={rserver} SERVER={serv} TYPE={backup_type} SSH_PORT={ssh_settings['port']} " + f"chmod +x {full_path}/{script} && {full_path}/{script} HOST={rserver} SERVER={serv} TYPE={backup_type} SSH_PORT={ssh_settings['port']} " f"TIME={time} RPATH={rpath} DELJOB={deljob} USER={ssh_settings['user']} KEY={ssh_settings['key']}" ] output, error = server_mod.subprocess_execute(commands[0]) + try: + os.remove(f'{full_path}/{script}') + except Exception: + pass + for line in output: if any(s in line for s in ("Traceback", "FAILED")): try: - print(f'error: {line}') - break + return f'error: {line}' except Exception: - print(f'error: {output}') - break + return f'error: {output}' else: if not deljob and not update: if sql.insert_backup_job(serv, rserver, rpath, backup_type, time, cred, description): - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) - template = env.get_template('new_backup.html') - template = template.render( - backups=sql.select_backups(server=serv, rserver=rserver), sshs=sql.select_ssh() + roxywi_common.logging('backup ', f' a new backup job for server {serv} has been created', roxywi=1, + login=1) + return render_template( + 'ajax/new_backup.html',backups=sql.select_backups(server=serv, rserver=rserver), sshs=sql.select_ssh() ) - print(template) - print('success: Backup job has been created') - roxywi_common.logging('backup ', f' a new backup job for server {serv} has been created', roxywi=1, login=1) + else: - print('error: Cannot add the job into DB') + raise Exception('error: Cannot add the job into DB') elif deljob: sql.delete_backups(deljob) - print('Ok') roxywi_common.logging('backup ', f' a backup job for server {serv} has been deleted', roxywi=1, login=1) + return 'ok' elif update: sql.update_backup(serv, rserver, rpath, backup_type, time, cred, description, update) - print('Ok') roxywi_common.logging('backup ', f' a backup job for server {serv} has been updated', roxywi=1, login=1) - - os.remove(script) + return 'ok' -def s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, description) -> None: +def s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, description) -> str: script = 's3_backup.sh' tag = 'add' + full_path = '/var/www/haproxy-wi/app' if deljob: time = '' @@ -80,36 +80,38 @@ def s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, d if sql.check_exists_s3_backup(server): raise Exception(f'error: Backup job for {server} already exists') - os.system(f"cp scripts/{script} .") + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") commands = [ - f"chmod +x {script} && ./{script} SERVER={server} S3_SERVER={s3_server} BUCKET={bucket} SECRET_KEY={secret_key} ACCESS_KEY={access_key} TIME={time} TAG={tag}" + f"chmod +x {full_path}/{script} && {full_path}/{script} SERVER={server} S3_SERVER={s3_server} BUCKET={bucket} " + f"SECRET_KEY={secret_key} ACCESS_KEY={access_key} TIME={time} TAG={tag}" ] return_out = server_mod.subprocess_execute_with_rc(commands[0]) - if not deljob and not update: + try: + os.remove(f'{full_path}/{script}') + except Exception: + pass + + if not deljob: try: - if installation_mod.show_installation_output(return_out['error'], return_out['output'], 'S3 backup', rc=return_out['rc'], api=1): + if installation_mod.show_installation_output(return_out['error'], return_out['output'], 'S3 backup', rc=return_out['rc']): try: sql.insert_s3_backup_job(server, s3_server, bucket, secret_key, access_key, time, description) except Exception as e: raise Exception(f'error: {e}') except Exception as e: raise Exception(e) - env = Environment(loader=FileSystemLoader('templates/ajax'), autoescape=True) - template = env.get_template('new_s3_backup.html') - template = template.render(backups=sql.select_s3_backups(server=server, s3_server=s3_server, bucket=bucket)) - print(template) - print('success: Backup job has been created') roxywi_common.logging('backup ', f' a new S3 backup job for server {server} has been created', roxywi=1, login=1) + return render_template('ajax/new_s3_backup.html', backups=sql.select_s3_backups(server=server, s3_server=s3_server, bucket=bucket)) elif deljob: sql.delete_s3_backups(deljob) - print('Ok') roxywi_common.logging('backup ', f' a S3 backup job for server {server} has been deleted', roxywi=1, login=1) + return 'ok' -def git_backup(server_id, service_id, git_init, repo, branch, period, cred, deljob, description) -> None: +def git_backup(server_id, service_id, git_init, repo, branch, period, cred, deljob, description) -> str: servers = roxywi_common.get_dick_permit() proxy = sql.get_setting('proxy') services = sql.select_services() @@ -119,8 +121,9 @@ def git_backup(server_id, service_id, git_init, repo, branch, period, cred, delj script = 'git_backup.sh' proxy_serv = '' ssh_settings = ssh_mod.return_ssh_keys_path('localhost', id=int(cred)) + full_path = '/var/www/haproxy-wi/app' - os.system(f"cp scripts/{script} .") + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy @@ -131,21 +134,24 @@ def git_backup(server_id, service_id, git_init, repo, branch, period, cred, delj branch = 'main' commands = [ - f"chmod +x {script} && ./{script} HOST={server_ip} DELJOB={deljob} SERVICE={service_name} INIT={git_init} " + f"chmod +x {full_path}/{script} && {full_path}/{script} HOST={server_ip} DELJOB={deljob} SERVICE={service_name} INIT={git_init} " f"SSH_PORT={ssh_settings['port']} PERIOD={period} REPO={repo} BRANCH={branch} CONFIG_DIR={service_config_dir} " f"PROXY={proxy_serv} USER={ssh_settings['user']} KEY={ssh_settings['key']}" ] output, error = server_mod.subprocess_execute(commands[0]) + try: + os.remove(f'{full_path}/{script}') + except Exception: + pass + for line in output: if any(s in line for s in ("Traceback", "FAILED")): try: - print('error: ' + line) - break + return 'error: ' + line except Exception: - print('error: ' + output) - break + return 'error: ' + output else: if deljob == '0': if sql.insert_new_git( @@ -155,16 +161,12 @@ def git_backup(server_id, service_id, git_init, repo, branch, period, cred, delj 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, lang=lang) - print(template) - print('success: Git job has been created') + lang = roxywi_common.get_user_lang_for_flask() roxywi_common.logging( - server_ip, ' A new git job has been created', roxywi=1, login=1, keep_history=1, service=service_name + server_ip, ' A new git job has been created', roxywi=1, login=1, keep_history=1, + service=service_name ) + return render_template('ajax/new_git.html', gits=gits, sshs=sshs, servers=servers, services=services, new_add=1, lang=lang) else: if sql.delete_git(form.getvalue('git_backup')): - print('Ok') - os.remove(script) + return 'ok' diff --git a/app/modules/service/common.py b/app/modules/service/common.py index a9d7c732..f574e31a 100644 --- a/app/modules/service/common.py +++ b/app/modules/service/common.py @@ -1,5 +1,7 @@ import os -import http.cookies + +import requests +from flask import render_template, request import modules.db.sql as sql import modules.server.ssh as mod_ssh @@ -7,6 +9,7 @@ import modules.common.common as common import modules.server.server as server_mod import modules.roxywi.common as roxywi_common import modules.roxy_wi_tools as roxy_wi_tools +import modules.config.section as section_mod time_zone = sql.get_setting('time_zone') get_date = roxy_wi_tools.GetDate(time_zone) @@ -25,11 +28,10 @@ def check_haproxy_version(server_ip): def is_restarted(server_ip: str, action: str) -> None: - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_uuid = cookie.get('uuid') - group_id = cookie.get('group') - group_id = int(group_id.value) - user_role = sql.get_user_role_by_uuid(user_uuid.value, group_id) + user_uuid = request.cookies.get('uuid') + group_id = request.cookies.get('group') + group_id = int(group_id) + user_role = sql.get_user_role_by_uuid(user_uuid, group_id) if sql.is_serv_protected(server_ip) and int(user_role) > 2: print(f'error: This server is protected. You cannot {action} it') @@ -42,26 +44,22 @@ def is_not_allowed_to_restart(server_id: int, service: str) -> None: else: is_restart = 0 - try: - if int(is_restart) == 1: - print('warning: this service is not allowed to be restarted') - return - except Exception: - pass + if int(is_restart) == 1: + raise Exception('warning: This service is not allowed to be restarted') def get_exp_version(server_ip: str, service_name: str) -> str: server_ip = common.is_ip_or_dns(server_ip) - if service_name == 'haproxy_exporter': + if service_name == 'haproxy': commands = ["/opt/prometheus/exporters/haproxy_exporter --version 2>&1 |head -1|awk '{print $3}'"] - elif service_name == 'nginx_exporter': + elif service_name == 'nginx': commands = ["/opt/prometheus/exporters/nginx_exporter 2>&1 |head -1 |awk -F\"=\" '{print $2}'|awk '{print $1}'"] - elif service_name == 'node_exporter': + elif service_name == 'node': commands = ["node_exporter --version 2>&1 |head -1|awk '{print $3}'"] - elif service_name == 'apache_exporter': + elif service_name == 'apache': commands = ["/opt/prometheus/exporters/apache_exporter --version 2>&1 |head -1|awk '{print $3}'"] - elif service_name == 'keepalived_exporter': - commands = ["systemctl list-units --full -all |grep keepalived_exporter"] + elif service_name == 'keepalived': + commands = ["keepalived_exporter --version 2>&1 |head -1|awk '{print $2}'"] ver = server_mod.ssh_command(server_ip, commands) @@ -137,21 +135,16 @@ def check_nginx_config(server_ip): def overview_backends(server_ip: str, service: str) -> None: - from jinja2 import Environment, FileSystemLoader - import modules.config.config as config_mod - import modules.config.section as section_mod - import modules.roxywi.common as roxywi_common - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/haproxyservers_backends.html') + lang = roxywi_common.get_user_lang_for_flask() format_file = 'cfg' if service == 'haproxy': configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir') format_file = 'cfg' elif service == 'keepalived': - configs_dir = get_config.get_config_var('configs', 'kp_save_configs_dir') + configs_dir = get_config.get_config_var('configs', 'keepalived_save_configs_dir') format_file = 'conf' if service != 'nginx' and service != 'apache': @@ -180,11 +173,10 @@ def overview_backends(server_ip: str, service: str) -> None: else: sections = section_mod.get_remote_sections(server_ip, service) - template = template.render(backends=sections, serv=server_ip, service=service) - print(template) + return render_template('ajax/haproxyservers_backends.html', backends=sections, serv=server_ip, service=service, lang=lang) -def get_overview_last_edit(server_ip: str, service: str) -> None: +def get_overview_last_edit(server_ip: str, service: str) -> str: if service == 'nginx': config_path = sql.get_setting('nginx_config_path') elif service == 'keepalived': @@ -193,65 +185,12 @@ def get_overview_last_edit(server_ip: str, service: str) -> None: config_path = sql.get_setting('haproxy_config_path') commands = ["ls -l %s |awk '{ print $6\" \"$7\" \"$8}'" % config_path] try: - print(server_mod.ssh_command(server_ip, commands)) + return server_mod.ssh_command(server_ip, commands) except Exception as e: - print(f'error: Cannot get last date {e} for server {server_ip}') + return f'error: Cannot get last date {e} for server {server_ip}' -def overview_service(server_ip: str, server_id: int, name: str, service: str) -> None: - import asyncio - from jinja2 import Environment, FileSystemLoader - - user_params = roxywi_common.get_users_params() - - async def async_get_overviewServers(serv1, serv2, service): - if service == 'haproxy': - cmd = 'echo "show info" |nc %s %s -w 1|grep -e "node\|Nbproc\|Maxco\|MB\|Nbthread"' % ( - serv2, sql.get_setting('haproxy_sock_port')) - out = server_mod.subprocess_execute(cmd) - return_out = "" - - for k in out: - if "Ncat:" not in k: - for r in k: - return_out += r - return_out += "<br />" - else: - return_out = "Cannot connect to HAProxy" - else: - return_out = '' - - server_status = (serv1, serv2, return_out) - return server_status - - async def get_runner_overviewServers(**kwargs): - env = Environment(loader=FileSystemLoader('templates/'), extensions=['jinja2.ext.loopcontrols', 'jinja2.ext.do']) - template = env.get_template('ajax/overviewServers.html') - - servers = [] - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_id = cookie.get('uuid') - group_id = cookie.get('group') - group_id = int(group_id.value) - role = sql.get_user_role_by_uuid(user_id.value, group_id) - futures = [async_get_overviewServers(kwargs.get('server1'), kwargs.get('server2'), kwargs.get('service'))] - - for i, future in enumerate(asyncio.as_completed(futures)): - result = await future - servers.append(result) - servers_sorted = sorted(servers, key=common.get_key) - template = template.render(service_status=servers_sorted, role=role, id=kwargs.get('id'), service_page=service, lang=user_params['lang']) - print(template) - - ioloop = asyncio.get_event_loop() - ioloop.run_until_complete(get_runner_overviewServers(server1=name, server2=server_ip, id=server_id, service=service)) - ioloop.close() - - -def get_stat_page(server_ip: str, service: str) -> None: - import requests - from jinja2 import Environment, FileSystemLoader - +def get_stat_page(server_ip: str, service: str) -> str: if service in ('nginx', 'apache'): stats_user = sql.get_setting(f'{service}_stats_user') stats_pass = sql.get_setting(f'{service}_stats_password') @@ -265,24 +204,21 @@ def get_stat_page(server_ip: str, service: str) -> None: try: response = requests.get(f'http://{server_ip}:{stats_port}/{stats_page}', auth=(stats_user, stats_pass)) except requests.exceptions.ConnectTimeout: - print('error: Oops. Connection timeout occurred!') + return 'error: Oops. Connection timeout occurred!' except requests.exceptions.ReadTimeout: - print('error: Oops. Read timeout occurred') + return 'error: Oops. Read timeout occurred' except requests.exceptions.HTTPError as errh: - print("error: Http Error:", errh) + return f'error: Http Error: {errh}' except requests.exceptions.ConnectionError as errc: - print('error: Error Connecting: %s' % errc) + return f'error: Error Connecting: {errc}' except requests.exceptions.Timeout as errt: - print("error: Timeout Error:", errt) + return f'error: Timeout Error: {errt}' except requests.exceptions.RequestException as err: - print("error: OOps: Something Else", err) + return f'error: OOps: Something Else {err}' data = response.content if service == 'nginx': - lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/nginx_stats.html') - + lang = roxywi_common.get_user_lang_for_flask() servers_with_status = list() h = () out1 = [] @@ -291,20 +227,14 @@ def get_stat_page(server_ip: str, service: str) -> None: h = (out1,) servers_with_status.append(h) - template = template.render(out=servers_with_status, lang=lang) - print(template) + return render_template('ajax/nginx_stats.html', out=servers_with_status, lang=lang) else: - print(data.decode('utf-8')) + return data.decode('utf-8') def show_service_version(server_ip: str, service: str) -> None: - if service not in ('nginx', 'apache', 'haproxy'): - print('warning: wrong service') - return None - if service == 'haproxy': - print(check_haproxy_version(server_ip)) - return None + return check_haproxy_version(server_ip) server_id = sql.select_server_id_by_ip(server_ip) service_name = service @@ -321,4 +251,4 @@ def show_service_version(server_ip: str, service: str) -> None: cmd = [f'docker exec -it {container_name} /usr/sbin/{service_name} -v 2>&1|head -1|awk -F":" \'{{print $2}}\''] else: cmd = [f'sudo /usr/sbin/{service_name} -v|head -1|awk -F":" \'{{print $2}}\''] - print(server_mod.ssh_command(server_ip, cmd)) + return server_mod.ssh_command(server_ip, cmd) diff --git a/app/modules/service/exporter_installation.py b/app/modules/service/exporter_installation.py index 690fe3d1..76fb1278 100644 --- a/app/modules/service/exporter_installation.py +++ b/app/modules/service/exporter_installation.py @@ -1,18 +1,12 @@ import os import modules.db.sql as sql -import modules.common.common as common import modules.server.server as server_mod -from modules.service.installation import show_installation_output +from modules.service.installation import show_installation_output, show_success_installation from modules.server.ssh import return_ssh_keys_path -form = common.form - -def haproxy_exp_installation(): - serv = form.getvalue('haproxy_exp_install') - ver = form.getvalue('exporter_v') - ext_prom = form.getvalue('ext_prom') +def haproxy_exp_installation(serv, ver, ext_prom): script = "install_haproxy_exporter.sh" stats_port = sql.get_setting('stats_port') server_state_file = sql.get_setting('server_state_file') @@ -21,8 +15,13 @@ def haproxy_exp_installation(): stat_page = sql.get_setting('stats_page') proxy = sql.get_setting('proxy') ssh_settings = return_ssh_keys_path(serv) + full_path = '/var/www/haproxy-wi/app' + service = 'HAProxy exporter' - os.system(f"cp scripts/{script} .") + try: + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") + except Exception as e: + raise Exception(f'error: {e}') if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy @@ -30,26 +29,27 @@ def haproxy_exp_installation(): proxy_serv = '' commands = [ - f"chmod +x {script} && ./{script} PROXY={proxy_serv} STAT_PORT={stats_port} STAT_FILE={server_state_file}" + f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} STAT_PORT={stats_port} STAT_FILE={server_state_file}" f" SSH_PORT={ssh_settings['port']} STAT_PAGE={stat_page} VER={ver} EXP_PROM={ext_prom} STATS_USER={stats_user}" f" STATS_PASS='{stats_password}' HOST={serv} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}" ] return_out = server_mod.subprocess_execute_with_rc(commands[0]) - show_installation_output(return_out['error'], return_out['output'], 'HAProxy exporter', rc=return_out['rc']) - os.remove(script) + try: + show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) + except Exception as e: + raise Exception(f'error: read output: {e}') + + try: + os.remove(f'{full_path}/{script}') + except Exception: + pass + + return show_success_installation(service) -def nginx_apache_exp_installation(): - if form.getvalue('nginx_exp_install'): - service = 'nginx' - elif form.getvalue('apache_exp_install'): - service = 'apache' - - serv = common.is_ip_or_dns(form.getvalue('serv')) - ver = common.checkAjaxInput(form.getvalue('exporter_v')) - ext_prom = common.checkAjaxInput(form.getvalue('ext_prom')) +def nginx_apache_exp_installation(serv, service, ver, ext_prom): script = f"install_{service}_exporter.sh" stats_user = sql.get_setting(f'{service}_stats_user') stats_password = sql.get_setting(f'{service}_stats_password') @@ -58,44 +58,69 @@ def nginx_apache_exp_installation(): proxy = sql.get_setting('proxy') proxy_serv = '' ssh_settings = return_ssh_keys_path(serv) + full_path = '/var/www/haproxy-wi/app' + service = f'{service.title()} exporter' - os.system(f"cp scripts/{script} .") + try: + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") + except Exception as e: + raise Exception(f'error: {e}') if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy commands = [ - f"chmod +x {script} && ./{script} PROXY={proxy_serv} STAT_PORT={stats_port} SSH_PORT={ssh_settings['port']} STAT_PAGE={stats_page}" + f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} STAT_PORT={stats_port} SSH_PORT={ssh_settings['port']} STAT_PAGE={stats_page}" f" STATS_USER={stats_user} STATS_PASS='{stats_password}' HOST={serv} VER={ver} EXP_PROM={ext_prom} USER={ssh_settings['user']} " f" PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}" ] return_out = server_mod.subprocess_execute_with_rc(commands[0]) - show_installation_output(return_out['error'], return_out['output'], f'{service.title()} exporter', rc=return_out['rc']) - os.remove(script) + try: + show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) + except Exception as e: + raise Exception(f'error: read output: {e}') + + try: + os.remove(f'{full_path}/{script}') + except Exception: + pass + + return show_success_installation(service) -def node_keepalived_exp_installation(service: str) -> None: - serv = common.is_ip_or_dns(form.getvalue(f'{service}_exp_install')) - ver = common.checkAjaxInput(form.getvalue('exporter_v')) - ext_prom = common.checkAjaxInput(form.getvalue('ext_prom')) +def node_keepalived_exp_installation(service: str, serv: str, ver: str, ext_prom: int) -> None: script = f"install_{service}_exporter.sh" proxy = sql.get_setting('proxy') proxy_serv = '' ssh_settings = return_ssh_keys_path(serv) + full_path = '/var/www/haproxy-wi/app' + service = 'Node exporter' - os.system(f"cp scripts/{script} .") + try: + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") + except Exception as e: + raise Exception(f'error: {e}') if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy commands = [ - f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} VER={ver} EXP_PROM={ext_prom} " + f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} VER={ver} EXP_PROM={ext_prom} " f"HOST={serv} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}" ] return_out = server_mod.subprocess_execute_with_rc(commands[0]) - show_installation_output(return_out['error'], return_out['output'], 'Node exporter', rc=return_out['rc']) - os.remove(script) + try: + show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) + except Exception as e: + raise Exception(f'error: read output: {e}') + + try: + os.remove(f'{full_path}/{script}') + except Exception: + pass + + return show_success_installation(service) diff --git a/app/modules/service/haproxy.py b/app/modules/service/haproxy.py index 24180e9a..97988819 100644 --- a/app/modules/service/haproxy.py +++ b/app/modules/service/haproxy.py @@ -1,6 +1,8 @@ import os import requests +from flask import request + import modules.db.sql as sql import modules.common.common as common import modules.server.server as server_mod @@ -11,7 +13,6 @@ import modules.roxy_wi_tools as roxy_wi_tools time_zone = sql.get_setting('time_zone') get_date = roxy_wi_tools.GetDate(time_zone) get_config = roxy_wi_tools.GetConfigVar() -form = common.form def stat_page_action(serv: str) -> None: @@ -21,9 +22,9 @@ def stat_page_action(serv: str) -> None: stats_page = sql.get_setting('stats_page') postdata = { - 'action': form.getvalue('action'), - 's': form.getvalue('s'), - 'b': form.getvalue('b') + 'action': request.form.get('action'), + 's': request.form.get('s'), + 'b': request.form.get('b') } headers = { @@ -33,10 +34,11 @@ def stat_page_action(serv: str) -> None: 'Accept-Encoding': 'gzip, deflate' } - requests.post(f'http://{serv}:{stats_port}/{stats_page}', headers=headers, data=postdata, auth=(haproxy_user, haproxy_pass)) + data = requests.post(f'http://{serv}:{stats_port}/{stats_page}', headers=headers, data=postdata, auth=(haproxy_user, haproxy_pass)) + return data.content -def show_map(serv: str) -> None: +def show_map(serv: str) -> str: import networkx as nx import matplotlib @@ -47,17 +49,16 @@ def show_map(serv: str) -> None: hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir') date = get_date.return_date('config') cfg = f'{hap_configs_dir}{serv}-{date}.cfg' - - print(f'<center><h4 style="margin-bottom: 0;">Map from {serv}</h4>') + output = f'<center><h4 style="margin-bottom: 0;">Map from {serv}</h4>' error = config_mod.get_config(serv, cfg) if error: - print(error) + return f'error: Cannot read import config file {error}' + try: conf = open(cfg, "r") - except IOError: - print('error: Cannot read import config file') - return + except IOError as e: + return f'error: Cannot read import config file {e}' G = nx.DiGraph() node = "" @@ -239,25 +240,22 @@ def show_map(serv: str) -> None: nx.draw_networkx_edge_labels(G, pos, alpha=0.4, label_pos=0.5, font_color="#5d9ceb", edge_labels=edge_labels, font_size=8) - plt.savefig("map.png") + plt.savefig(f"/var/www/haproxy-wi/app/map.png") plt.show() except Exception as e: - print(str(e)) + return f'error: Cannot create a map: {e}' - os.system( - f"rm -f {os.path.dirname(os.getcwd())}/map*.png && mv map.png {os.path.dirname(os.getcwd())}/map{date}.png") - print(f'<img src="/map{date}.png" alt="map"></center>') + output += f'<img src="/map.png" alt="map"></center>' + return output -def runtime_command(serv: str) -> None: +def runtime_command(serv: str, enable: str, backend: str, save: str) -> str: server_state_file = sql.get_setting('server_state_file') haproxy_sock = sql.get_setting('haproxy_sock') - enable = common.checkAjaxInput(form.getvalue('servaction')) - backend = common.checkAjaxInput(form.getvalue('servbackend')) cmd = f'echo "{enable} {backend}" |sudo socat stdio {haproxy_sock}' - if form.getvalue('save') == "on": + if save == "on": save_command = f'echo "show servers state" | sudo socat {haproxy_sock} stdio > {server_state_file}' command = [cmd + ';' + save_command] else: @@ -266,10 +264,11 @@ def runtime_command(serv: str) -> None: if enable != "show": roxywi_common.logging(serv, f'Has been {enable}ed {backend}', login=1, keep_history=1, service='haproxy') print( - f'<center><h3>You {enable} {backend} on HAProxy {serv}. <a href="statsview.py?serv={serv}" ' - f'title="View stat" target="_blank">Look it</a> or <a href="runtimeapi.py" ' + f'<center><h3>You {enable} {backend} on HAProxy {serv}. <a href="/app/stats/haproxy/{serv}" ' + f'title="View stat" target="_blank">Look it</a> or <a href="/app/runtimeapi" ' f'title="Runtime API">Edit something else</a></h3><br />') - print(server_mod.ssh_command(serv, command, show_log="1")) - action = f'runtimeapi.py {enable} {backend}' + action = f'runtimeapi {enable} {backend}' roxywi_common.logging(serv, action) + + return server_mod.ssh_command(serv, command, show_log="1") diff --git a/app/modules/service/installation.py b/app/modules/service/installation.py index 6d31ff0f..8f5a93b3 100644 --- a/app/modules/service/installation.py +++ b/app/modules/service/installation.py @@ -1,6 +1,8 @@ import os import json +from flask import render_template + import modules.db.sql as sql import modules.service.common as service_common import modules.common.common as common @@ -8,10 +10,8 @@ import modules.server.server as server_mod import modules.roxywi.common as roxywi_common from modules.server.ssh import return_ssh_keys_path -form = common.form - -def show_installation_output(error: str, output: str, service: str, rc=0, api=0): +def show_installation_output(error: str, output: str, service: str, rc=0): if error and "WARNING" not in error: roxywi_common.logging('Roxy-WI server', error, roxywi=1) raise Exception('error: ' + error) @@ -22,18 +22,16 @@ def show_installation_output(error: str, output: str, service: str, rc=0, api=0) try: correct_out = line.split('=>') correct_out = json.loads(correct_out[1]) - raise Exception(f'error: {correct_out["msg"]} for {service}') except Exception: raise Exception(f'error: {output} for {service}') - else: - if not api: - 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) - return True + else: + raise Exception(f'error: {correct_out["msg"]} for {service}') + return True + + +def show_success_installation(service): + lang = roxywi_common.get_user_lang_for_flask() + return render_template('include/show_success_installation.html', service=service, lang=lang) def install_haproxy(server_ip: str, api=0, **kwargs): @@ -81,11 +79,15 @@ def install_haproxy(server_ip: str, api=0, **kwargs): return_out = server_mod.subprocess_execute_with_rc(commands[0]) - if show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc'], api=api): - try: - sql.update_haproxy(server_ip) - except Exception as e: - print(e) + try: + show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) + except Exception as e: + raise Exception(e) + + try: + sql.update_haproxy(server_ip) + except Exception as e: + return str(e) if docker == '1': server_id = sql.select_server_id_by_ip(server_ip) @@ -97,6 +99,9 @@ def install_haproxy(server_ip: str, api=0, **kwargs): except Exception: pass + if not api: + return show_success_installation(service) + def waf_install(server_ip: str): script = "waf.sh" @@ -106,28 +111,35 @@ def waf_install(server_ip: str): service = ' WAF' proxy_serv = '' ssh_settings = return_ssh_keys_path(server_ip) + full_path = '/var/www/haproxy-wi/app' - os.system(f"cp scripts/{script} .") + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy commands = [ - f"chmod +x {script} && ./{script} PROXY={proxy_serv} HAPROXY_PATH={haproxy_dir} VERSION='{ver}' " + f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} HAPROXY_PATH={haproxy_dir} VERSION='{ver}' " f"SSH_PORT={ssh_settings['port']} HOST={server_ip} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' " f"KEY={ssh_settings['key']}" ] return_out = server_mod.subprocess_execute_with_rc(commands[0]) - if show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']): - try: - sql.insert_waf_metrics_enable(server_ip, "0") - sql.insert_waf_rules(server_ip) - except Exception as e: - print(e) + try: + show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) + except Exception as e: + raise Exception(e) - os.remove(script) + try: + sql.insert_waf_metrics_enable(server_ip, "0") + sql.insert_waf_rules(server_ip) + except Exception as e: + return str(e) + + os.remove(f'{full_path}/{script}') + + return show_success_installation(service) def waf_nginx_install(server_ip: str): @@ -137,30 +149,37 @@ def waf_nginx_install(server_ip: str): service = ' WAF' proxy_serv = '' ssh_settings = return_ssh_keys_path(server_ip) + full_path = '/var/www/haproxy-wi/app' - os.system(f"cp scripts/{script} .") + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy commands = [ - f"chmod +x {script} && ./{script} PROXY={proxy_serv} NGINX_PATH={nginx_dir} SSH_PORT={ssh_settings['port']} " + f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} NGINX_PATH={nginx_dir} SSH_PORT={ssh_settings['port']} " f"HOST={server_ip} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}" ] return_out = server_mod.subprocess_execute_with_rc(commands[0]) - if show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']): - try: - sql.insert_nginx_waf_rules(server_ip) - sql.insert_waf_nginx_server(server_ip) - except Exception as e: - print(e) + try: + show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) + except Exception as e: + raise Exception(e) - os.remove(script) + try: + sql.insert_nginx_waf_rules(server_ip) + sql.insert_waf_nginx_server(server_ip) + except Exception as e: + return str(e) + + os.remove(f'{full_path}/{script}') + + return show_success_installation(service) -def install_service(server_ip: str, service: str, docker: str, api=0, **kwargs) -> None: +def install_service(server_ip: str, service: str, docker: str, syn_flood_protect: int, api=0, **kwargs) -> str: script = f"install_{service}.sh" stats_user = sql.get_setting(f'{service}_stats_user') stats_password = sql.get_setting(f'{service}_stats_password') @@ -183,8 +202,6 @@ def install_service(server_ip: str, service: str, docker: str, api=0, **kwargs) if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy - syn_flood_protect = '1' if form.getvalue('syn_flood') == "1" else '' - if service == 'apache': correct_service_name = service_common.get_correct_apache_service_name(server_ip=server_ip, server_id=None) if service_dir == '/etc/httpd' and correct_service_name == 'apache2': @@ -206,17 +223,21 @@ def install_service(server_ip: str, service: str, docker: str, api=0, **kwargs) return_out = server_mod.subprocess_execute_with_rc(commands[0]) - if show_installation_output(return_out['error'], return_out['output'], service_name, rc=return_out['rc'], api=api): - if service == 'nginx': - try: - sql.update_nginx(server_ip) - except Exception as e: - print(e) - elif service == 'apache': - try: - sql.update_apache(server_ip) - except Exception as e: - print(e) + try: + show_installation_output(return_out['error'], return_out['output'], service_name, rc=return_out['rc']) + except Exception as e: + raise Exception(e) + + if service == 'nginx': + try: + sql.update_nginx(server_ip) + except Exception as e: + return str(e) + elif service == 'apache': + try: + sql.update_apache(server_ip) + except Exception as e: + return str(e) if docker == '1': server_id = sql.select_server_id_by_ip(server_ip) @@ -225,38 +246,47 @@ def install_service(server_ip: str, service: str, docker: str, api=0, **kwargs) os.remove(f'{full_path}/{script}') + if not api: + return show_success_installation(service) -def geoip_installation(): - serv = common.is_ip_or_dns(form.getvalue('geoip_install')) - geoip_update = common.checkAjaxInput(form.getvalue('geoip_update')) - service = form.getvalue('geoip_service') + +def geoip_installation(serv, geoip_update, service): proxy = sql.get_setting('proxy') maxmind_key = sql.get_setting('maxmind_key') proxy_serv = '' ssh_settings = return_ssh_keys_path(serv) + full_path = '/var/www/haproxy-wi/app' if service in ('haproxy', 'nginx'): service_dir = common.return_nice_path(sql.get_setting(f'{service}_dir')) script = f'install_{service}_geoip.sh' else: - print('warning: select a server and service first') - return + raise Exception('warning: select a server and service first') if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy - os.system(f"cp scripts/{script} .") + try: + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") + except Exception as e: + raise Exception(f'error: {e}') commands = [ - f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} UPDATE={geoip_update} " + f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} UPDATE={geoip_update} " f"maxmind_key={maxmind_key} service_dir={service_dir} HOST={serv} USER={ssh_settings['user']} " f"PASS={ssh_settings['password']} KEY={ssh_settings['key']}" ] return_out = server_mod.subprocess_execute_with_rc(commands[0]) - show_installation_output(return_out['error'], return_out['output'], 'GeoLite2 Database', rc=return_out['rc']) - os.remove(script) + try: + show_installation_output(return_out['error'], return_out['output'], 'GeoLite2 Database', rc=return_out['rc']) + except Exception as e: + raise Exception(e) + + os.remove(f'{full_path}/{script}') + + return show_success_installation('GeoLite2 Database') def grafana_install(): @@ -264,44 +294,43 @@ def grafana_install(): proxy = sql.get_setting('proxy') proxy_serv = '' host = os.environ.get('HTTP_HOST', '') + full_path = '/var/www/haproxy-wi/app' - os.system(f"cp scripts/{script} .") + try: + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") + except Exception as e: + raise Exception(f'error: {e}') if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy - cmd = f"chmod +x {script} && ./{script} PROXY={proxy_serv}" + cmd = f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv}" output, error = server_mod.subprocess_execute(cmd) if error: roxywi_common.logging('Roxy-WI server', error, roxywi=1) - print( - f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000<br>') else: for line in output: if any(s in line for s in ("Traceback", "FAILED")): try: - print(line) - break + return line except Exception: - print(output) - break - else: - print( - f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000<br>') + return output - os.remove(script) + os.remove(f'{full_path}/{script}') + + return f'success: Grafana and Prometheus servers were installed. You can find Grafana on http://{host}:3000<br>' def keepalived_master_install(master: str, eth: str, eth_slave: str, vrrp_ip: str, virt_server: int, syn_flood: int, - return_to_master: int, haproxy: int, nginx: int, router_id: int, api=0) -> None: + return_to_master: int, haproxy: int, nginx: int, router_id: int, api=0) -> str: script = "install_keepalived.sh" proxy = sql.get_setting('proxy') keepalived_path_logs = sql.get_setting('keepalived_path_logs') proxy_serv = '' ssh_settings = return_ssh_keys_path(master) full_path = '/var/www/haproxy-wi/app' - + service = 'master Keepalived' if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy @@ -320,36 +349,44 @@ def keepalived_master_install(master: str, eth: str, eth_slave: str, vrrp_ip: st return_out = server_mod.subprocess_execute_with_rc(commands[0]) - if show_installation_output(return_out['error'], return_out['output'], 'master Keepalived', rc=return_out['rc'], api=api): - try: - sql.update_keepalived(master) - except Exception as e: - raise Exception(e) + try: + show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) + except Exception as e: + raise Exception(f'error: read output: {e}') - if virt_server: - group_id = sql.get_group_id_by_server_ip(master) - cred_id = sql.get_cred_id_by_server_ip(master) - hostname = sql.get_hostname_by_server_ip(master) - firewall = 1 if server_mod.is_service_active(master, 'firewalld') else 0 - sql.add_server( - hostname + '-VIP', vrrp_ip, group_id, '1', '1', '0', cred_id, ssh_settings['port'], f'VRRP IP for {master}', - haproxy, nginx, '0', firewall - ) + try: + sql.update_keepalived(master) + except Exception as e: + raise Exception(e) + + if virt_server: + group_id = sql.get_group_id_by_server_ip(master) + cred_id = sql.get_cred_id_by_server_ip(master) + hostname = sql.get_hostname_by_server_ip(master) + firewall = 1 if server_mod.is_service_active(master, 'firewalld') else 0 + sql.add_server( + hostname + '-VIP', vrrp_ip, group_id, '1', '1', '0', cred_id, ssh_settings['port'], f'VRRP IP for {master}', + haproxy, nginx, '0', firewall + ) try: os.remove(f'{full_path}/{script}') except Exception: pass + if not api: + return show_success_installation(service) + def keepalived_slave_install(master: str, slave: str, eth: str, eth_slave: str, vrrp_ip: str, syn_flood: int, - haproxy: int, nginx: int, router_id: int, api=0) -> None: + haproxy: int, nginx: int, router_id: int, api=0) -> str: script = "install_keepalived.sh" proxy = sql.get_setting('proxy') keepalived_path_logs = sql.get_setting('keepalived_path_logs') proxy_serv = '' ssh_settings = return_ssh_keys_path(slave) full_path = '/var/www/haproxy-wi/app' + service = 'slave Keepalived' if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy @@ -371,43 +408,40 @@ def keepalived_slave_install(master: str, slave: str, eth: str, eth_slave: str, raise Exception(f'error: {e}') try: - show_installation_output(return_out['error'], return_out['output'], 'slave Keepalived', rc=return_out['rc'], api=api) + show_installation_output(return_out['error'], return_out['output'], service, rc=return_out['rc']) except Exception as e: - raise Exception(f'{e}') + raise Exception(f'error: read output: {e}') try: sql.update_server_master(master, slave) sql.update_keepalived(slave) except Exception as e: - print(e) + raise Exception(f'{e}') try: os.remove(f'{full_path}/{script}') except Exception: pass + if not api: + return show_success_installation(service) -def keepalived_masteradd(): - master = form.getvalue('masteradd') - eth = form.getvalue('interfaceadd') - slave_eth = form.getvalue('slave_interfaceadd') - vrrp_ip = form.getvalue('vrrpipadd') - router_id = form.getvalue('router_id') - kp = form.getvalue('kp') - return_to_master = form.getvalue('return_to_master') + +def keepalived_masteradd(master, eth, slave_eth, vrrp_ip, router_id, return_to_master, kp): script = "install_keepalived.sh" proxy = sql.get_setting('proxy') keepalived_path_logs = sql.get_setting('keepalived_path_logs') proxy_serv = '' ssh_settings = return_ssh_keys_path(master) + full_path = '/var/www/haproxy-wi/app' if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy - os.system(f"cp scripts/{script} .") + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") commands = [ - f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={eth} ETH_SLAVE={slave_eth} " + f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={eth} ETH_SLAVE={slave_eth} " f"keepalived_path_logs={keepalived_path_logs} RETURN_TO_MASTER={return_to_master} IP={vrrp_ip} MASTER=MASTER " f"RESTART={kp} ADD_VRRP=1 HOST={master} router_id={router_id} USER={ssh_settings['user']} " f"PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}" @@ -415,34 +449,42 @@ def keepalived_masteradd(): return_out = server_mod.subprocess_execute_with_rc(commands[0]) - show_installation_output(return_out['error'], return_out['output'], 'master VRRP address', rc=return_out['rc']) - os.remove(script) + try: + show_installation_output(return_out['error'], return_out['output'], 'master VRRP address', rc=return_out['rc']) + except Exception as e: + raise Exception(e) + + os.remove(f'{full_path}/{script}') + + return show_success_installation('slave VRRP address') -def keepalived_slaveadd(): - slave = form.getvalue('slaveadd') - eth = form.getvalue('interfaceadd') - slave_eth = form.getvalue('slave_interfaceadd') - vrrp_ip = form.getvalue('vrrpipadd') - router_id = form.getvalue('router_id') - kp = form.getvalue('kp') +def keepalived_slaveadd(slave, eth, slave_eth, vrrp_ip, router_id, kp): script = "install_keepalived.sh" proxy = sql.get_setting('proxy') keepalived_path_logs = sql.get_setting('keepalived_path_logs') proxy_serv = '' ssh_settings = return_ssh_keys_path(slave) + full_path = '/var/www/haproxy-wi/app' if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy - os.system(f"cp scripts/{script} .") + os.system(f"cp {full_path}/scripts/{script} {full_path}/{script}") commands = [ - f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={eth} ETH_SLAVE={slave_eth} " + f"chmod +x {full_path}/{script} && {full_path}/{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} ETH={eth} ETH_SLAVE={slave_eth} " f"keepalived_path_logs={keepalived_path_logs} IP={vrrp_ip} MASTER=BACKUP RESTART={kp} ADD_VRRP=1 HOST={slave} " f"router_id={router_id} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}" ] return_out = server_mod.subprocess_execute_with_rc(commands[0]) - show_installation_output(return_out['error'], return_out['output'], 'slave VRRP address', rc=return_out['rc']) - os.remove(script) + + try: + show_installation_output(return_out['error'], return_out['output'], 'slave VRRP address', rc=return_out['rc']) + except Exception as e: + raise Exception(e) + + os.remove(f'{full_path}/{script}') + + return show_success_installation('slave VRRP address') diff --git a/app/modules/alerting/alerting.py b/app/modules/tools/alerting.py similarity index 86% rename from app/modules/alerting/alerting.py rename to app/modules/tools/alerting.py index ce4da670..2b0fac13 100644 --- a/app/modules/alerting/alerting.py +++ b/app/modules/tools/alerting.py @@ -3,7 +3,7 @@ import json import http.cookies import pika -from jinja2 import Environment, FileSystemLoader +from flask import render_template import modules.db.sql as sql import modules.common.common as common @@ -257,23 +257,25 @@ def pd_send_mess(mess, level, server_ip=None, service_id=None, alert_type=None, raise Exception(f'error: {e}') -def check_rabbit_alert() -> None: +def check_rabbit_alert() -> str: try: cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) user_group_id = cookie.get('group') user_group_id1 = user_group_id.value except Exception as e: - print(f'error: Cannot send a message {e}') - return + return f'error: Cannot send a message {e}' + try: json_for_sending = {"user_group": user_group_id1, "message": 'info: Test message'} send_message_to_rabbit(json.dumps(json_for_sending)) except Exception as e: - print(f'error: Cannot send a message {e}') + return f'error: Cannot send a message {e}' + else: + return 'ok' -def check_email_alert() -> None: +def check_email_alert() -> str: subject = 'test message' message = 'Test message from Roxy-WI' @@ -282,108 +284,104 @@ def check_email_alert() -> None: user_uuid = cookie.get('uuid') user_uuid_value = user_uuid.value except Exception as e: - print(f'error: Cannot send a message {e}') - return + return f'error: Cannot send a message {e}' try: user_email = sql.select_user_email_by_uuid(user_uuid_value) except Exception as e: - print(f'error: Cannot get a user email: {e}') - return + return f'error: Cannot get a user email: {e}' try: send_email(user_email, subject, message) except Exception as e: - print(f'error: Cannot send a message {e}') - return + return f'error: Cannot send a message {e}' + + return 'ok' -def add_telegram_channel(token: str, channel: str, group: str, page: str) -> None: +def add_telegram_channel(token: str, channel: str, group: str, page: str) -> str: if token is None or channel is None or group is None: - print(error_mess) + return error_mess else: if sql.insert_new_telegram(token, channel, group): - lang = roxywi_common.get_user_lang() + lang = roxywi_common.get_user_lang_for_flask() channels = sql.select_telegram(token=token) groups = sql.select_groups() - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/new_receiver.html') - parsed_template = template.render(groups=groups, lang=lang, channels=channels, page=page, receiver='telegram') - print(parsed_template) roxywi_common.logging('Roxy-WI server', f'A new Telegram channel {channel} has been created ', roxywi=1, login=1) + return render_template('ajax/new_receiver.html', groups=groups, lang=lang, channels=channels, page=page, receiver='telegram') -def add_slack_channel(token: str, channel: str, group: str, page: str) -> None: + +def add_slack_channel(token: str, channel: str, group: str, page: str) -> str: if token is None or channel is None or group is None: - print(error_mess) + return error_mess else: if sql.insert_new_slack(token, channel, group): - lang = roxywi_common.get_user_lang() + lang = roxywi_common.get_user_lang_for_flask() channels = sql.select_slack(token=token) groups = sql.select_groups() - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/new_receiver.html') - parsed_template = template.render(groups=groups, lang=lang, channels=channels, page=page, receiver='slack') - print(parsed_template) roxywi_common.logging('Roxy-WI server', f'A new Slack channel {channel} has been created ', roxywi=1, login=1) + return render_template('ajax/new_receiver.html', groups=groups, lang=lang, channels=channels, page=page, receiver='slack') -def add_pd_channel(token: str, channel: str, group: str, page: str) -> None: +def add_pd_channel(token: str, channel: str, group: str, page: str) -> str: if token is None or channel is None or group is None: - print(error_mess) + return error_mess else: if sql.insert_new_pd(token, channel, group): - lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/new_receiver.html') - parsed_template = template.render(groups=sql.select_groups(), lang=lang, channels=sql.select_pd(token=token), page=page, receiver='pd') - print(parsed_template) + lang = roxywi_common.get_user_lang_for_flask() + channels = sql.select_slack(token=token) + groups = sql.select_groups() roxywi_common.logging('Roxy-WI server', f'A new PagerDuty channel {channel} has been created ', roxywi=1, login=1) + return render_template('ajax/new_receiver.html', groups=groups, lang=lang, channels=channels, page=page, receiver='pd') -def delete_telegram_channel(channel_id) -> None: +def delete_telegram_channel(channel_id) -> str: telegram = sql.select_telegram(id=channel_id) channel_name = '' for t in telegram: channel_name = t.token if sql.delete_telegram(channel_id): - print("Ok") roxywi_common.logging('Roxy-WI server', f'The Telegram channel {channel_name} has been deleted ', roxywi=1, login=1) + return 'ok' -def delete_slack_channel(channel_id) -> None: +def delete_slack_channel(channel_id) -> str: slack = sql.select_slack(id=channel_id) channel_name = '' for t in slack: channel_name = t.chanel_name if sql.delete_slack(channel_id): - print("Ok") roxywi_common.logging('Roxy-WI server', f'The Slack channel {channel_name} has been deleted ', roxywi=1, login=1) + return 'ok' -def delete_pd_channel(channel_id) -> None: +def delete_pd_channel(channel_id) -> str: pd = sql.select_pd(id=channel_id) channel_name = '' for t in pd: channel_name = t.chanel_name if sql.delete_pd(channel_id): - print("Ok") roxywi_common.logging('Roxy-WI server', f'The PageDuty channel {channel_name} has been deleted ', roxywi=1, login=1) + return 'ok' -def update_telegram(token: str, channel: str, group: str, user_id: int) -> None: +def update_telegram(token: str, channel: str, group: str, user_id: int) -> str: sql.update_telegram(token, channel, group, user_id) roxywi_common.logging('group ' + group, f'The Telegram token has been updated for channel: {channel}', roxywi=1, login=1) + return 'ok' -def update_slack(token: str, channel: str, group: str, user_id: int) -> None: +def update_slack(token: str, channel: str, group: str, user_id: int) -> str: sql.update_slack(token, channel, group, user_id) roxywi_common.logging(f'group {group}', f'The Slack token has been updated for channel: {channel}', roxywi=1, login=1) + return 'ok' -def update_pd(token: str, channel: str, group: str, user_id: int) -> None: +def update_pd(token: str, channel: str, group: str, user_id: int) -> str: sql.update_pd(token, channel, group, user_id) roxywi_common.logging(f'group {group}', f'The PagerDuty token has been updated for channel: {channel}', roxywi=1, login=1) + return 'ok' def delete_receiver_channel(channel_id: int, receiver_name: str) -> None: @@ -392,16 +390,20 @@ def delete_receiver_channel(channel_id: int, receiver_name: str) -> None: "slack": delete_slack_channel, "pd": delete_pd_channel, } - delete_functions[receiver_name](channel_id) + return delete_functions[receiver_name](channel_id) -def add_receiver_channel(receiver_name: str, token: str, channel: str, group: id, page: str) -> None: +def add_receiver_channel(receiver_name: str, token: str, channel: str, group: id, page: str) -> str: add_functions = { "telegram": add_telegram_channel, "slack": add_slack_channel, "pd": add_pd_channel, } - add_functions[receiver_name](token, channel, group, page) + + try: + return add_functions[receiver_name](token, channel, group, page) + except Exception as e: + return f'error: Cannot add new receiver: {e}' def update_receiver_channel(receiver_name: str, token: str, channel: str, group: id, user_id: int) -> None: @@ -410,10 +412,10 @@ def update_receiver_channel(receiver_name: str, token: str, channel: str, group: "slack": update_slack, "pd": update_pd, } - update_functions[receiver_name](token, channel, group, user_id) + return update_functions[receiver_name](token, channel, group, user_id) -def check_receiver(channel_id: int, receiver_name: str) -> None: +def check_receiver(channel_id: int, receiver_name: str) -> str: functions = { "telegram": telegram_send_mess, "slack": slack_send_mess, @@ -427,6 +429,6 @@ def check_receiver(channel_id: int, receiver_name: str) -> None: level = 'info' try: - functions[receiver_name](mess, level, channel_id=channel_id) + return functions[receiver_name](mess, level, channel_id=channel_id) except Exception as e: - print(e) + return f'error: Cannot send message: {e}' diff --git a/app/modules/tools/checker.py b/app/modules/tools/checker.py index 211a2989..e5573cba 100644 --- a/app/modules/tools/checker.py +++ b/app/modules/tools/checker.py @@ -1,4 +1,4 @@ -from jinja2 import Environment, FileSystemLoader +from flask import render_template import modules.db.sql as sql import modules.common.common as common @@ -9,12 +9,9 @@ form = common.form def load_checker() -> None: - page = form.getvalue('page') groups = sql.select_groups() services = roxywi_mod.get_services_status() lang = roxywi_common.get_user_lang() - env = Environment(loader=FileSystemLoader('templates'), autoescape=True) - template = env.get_template('ajax/load_telegram.html') keepalived_settings = '' haproxy_settings = '' apache_settings = '' @@ -33,47 +30,36 @@ def load_checker() -> None: user_subscription = roxywi_common.return_unsubscribed_user_status() roxywi_common.logging('Roxy-WI server', f'Cannot get a user plan: {e}', roxywi=1) + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + if user_subscription['user_status']: haproxy_settings = sql.select_checker_settings(1) nginx_settings = sql.select_checker_settings(2) keepalived_settings = sql.select_checker_settings(3) apache_settings = sql.select_checker_settings(4) - if page == 'servers.py': - user_group = roxywi_common.get_user_group(id=1) - telegrams = sql.get_user_telegram_by_group(user_group) - slacks = sql.get_user_slack_by_group(user_group) - pds = sql.get_user_pd_by_group(user_group) - haproxy_servers = roxywi_common.get_dick_permit(haproxy=1, only_group=1) - nginx_servers = roxywi_common.get_dick_permit(nginx=1, only_group=1) - apache_servers = roxywi_common.get_dick_permit(apache=1, only_group=1) - keepalived_servers = roxywi_common.get_dick_permit(keepalived=1, only_group=1) - else: - telegrams = sql.select_telegram() - slacks = sql.select_slack() - pds = sql.select_pd() - haproxy_servers = roxywi_common.get_dick_permit(haproxy=1) - nginx_servers = roxywi_common.get_dick_permit(nginx=1) - apache_servers = roxywi_common.get_dick_permit(apache=1) - keepalived_servers = roxywi_common.get_dick_permit(keepalived=1) + user_group = roxywi_common.get_user_group(id=1) + telegrams = sql.get_user_telegram_by_group(user_group) + slacks = sql.get_user_slack_by_group(user_group) + pds = sql.get_user_pd_by_group(user_group) + haproxy_servers = roxywi_common.get_dick_permit(haproxy=1, only_group=1) + nginx_servers = roxywi_common.get_dick_permit(nginx=1, only_group=1) + apache_servers = roxywi_common.get_dick_permit(apache=1, only_group=1) + keepalived_servers = roxywi_common.get_dick_permit(keepalived=1, only_group=1) - template = template.render(services=services, telegrams=telegrams, pds=pds, groups=groups, slacks=slacks, - user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], - haproxy_servers=haproxy_servers, nginx_servers=nginx_servers, apache_servers=apache_servers, - keepalived_servers=keepalived_servers, haproxy_settings=haproxy_settings, nginx_settings=nginx_settings, - keepalived_settings=keepalived_settings, apache_settings=apache_settings, page=page, lang=lang) - print(template) + return render_template( + 'ajax/load_telegram.html', services=services, telegrams=telegrams, pds=pds, groups=groups, slacks=slacks, + user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], haproxy_servers=haproxy_servers, + nginx_servers=nginx_servers, apache_servers=apache_servers, keepalived_servers=keepalived_servers, haproxy_settings=haproxy_settings, + nginx_settings=nginx_settings, keepalived_settings=keepalived_settings, apache_settings=apache_settings, + role=user_params['role'], lang=user_params['lang'] + ) -def update_haproxy_settings() -> None: - setting_id = int(form.getvalue('updateHaproxyCheckerSettings')) - email = int(form.getvalue('email')) - service_alert = int(form.getvalue('server')) - backend_alert = int(form.getvalue('backend')) - maxconn_alert = int(form.getvalue('maxconn')) - telegram_id = int(form.getvalue('telegram_id')) - slack_id = int(form.getvalue('slack_id')) - pd_id = int(form.getvalue('pd_id')) - +def update_haproxy_settings(setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id) -> None: if sql.update_haproxy_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, backend_alert, maxconn_alert, setting_id): print('ok') @@ -81,15 +67,7 @@ def update_haproxy_settings() -> None: print('error: Cannot update Checker settings') -def update_keepalived_settings() -> None: - setting_id = int(form.getvalue('updateKeepalivedCheckerSettings')) - email = int(form.getvalue('email')) - service_alert = int(form.getvalue('server')) - backend_alert = int(form.getvalue('backend')) - telegram_id = int(form.getvalue('telegram_id')) - slack_id = int(form.getvalue('slack_id')) - pd_id = int(form.getvalue('pd_id')) - +def update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id) -> None: if sql.update_keepalived_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, backend_alert, setting_id): print('ok') @@ -97,14 +75,7 @@ def update_keepalived_settings() -> None: print('error: Cannot update Checker settings') -def update_service_settings() -> None: - setting_id = int(form.getvalue('updateServiceCheckerSettings')) - email = int(form.getvalue('email')) - service_alert = int(form.getvalue('server')) - telegram_id = int(form.getvalue('telegram_id')) - slack_id = int(form.getvalue('slack_id')) - pd_id = int(form.getvalue('pd_id')) - +def update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id) -> None: if sql.update_service_checker_settings(email, telegram_id, slack_id, pd_id, service_alert, setting_id): print('ok') else: diff --git a/app/modules/tools/smon.py b/app/modules/tools/smon.py index e815a117..70664324 100644 --- a/app/modules/tools/smon.py +++ b/app/modules/tools/smon.py @@ -1,31 +1,24 @@ -import json - -from jinja2 import Environment, FileSystemLoader +from flask import render_template import modules.db.sql as sql -import modules.common.common as common import modules.roxywi.common as roxywi_common - -form = common.form +import modules.server.server as server_mod def create_smon(name: str, hostname: str, port: int, enable: int, url: str, body: str, group: int, desc: str, telegram: int, slack: int, pd: int, packet_size: int, check_type: int, resolver: str, record_type: str, user_group: int, - http_method: str, show_new=1) -> None: + http_method: str, show_new=1) -> bool: if check_type == 'tcp': try: port = int(port) except Exception: - print('SMON error: port must be a number') - return None + raise Exception('SMON error: port must be a number') if port > 65535 or port < 0: - print('SMON error: port must be 0-65535') - return None + raise Exception('SMON error: port must be 0-65535') if check_type == 'ping': if int(packet_size) < 16: - print('SMON error: a packet size cannot be less than 16') - return None + raise Exception('SMON error: a packet size cannot be less than 16') last_id = sql.insert_smon(name, enable, group, desc, telegram, slack, pd, user_group, check_type) @@ -38,59 +31,31 @@ def create_smon(name: str, hostname: str, port: int, enable: int, url: str, body elif check_type == 'dns': sql.insert_smon_dns(last_id, hostname, port, resolver, record_type) - if last_id and show_new: - lang = roxywi_common.get_user_lang() - smon = sql.select_smon_by_id(last_id) - pds = sql.get_user_pd_by_group(user_group) - slacks = sql.get_user_slack_by_group(user_group) - telegrams = sql.get_user_telegram_by_group(user_group) - smon_service = sql.select_smon_check_by_id(last_id, check_type) - env = Environment(loader=FileSystemLoader('templates'), autoescape=True) - template = env.get_template('ajax/smon/show_new_smon.html') - template = template.render(smon=smon, telegrams=telegrams, slacks=slacks, pds=pds, lang=lang, check_type=check_type, - smon_service=smon_service) - print(template) - if last_id: roxywi_common.logging('SMON', f' A new server {name} to SMON has been add ', roxywi=1, login=1) + if last_id and show_new: + return last_id + else: + return False -def update_smon() -> None: - smon_id = common.checkAjaxInput(form.getvalue('id')) - name = common.checkAjaxInput(form.getvalue('updateSmonName')) - ip = common.checkAjaxInput(form.getvalue('updateSmonIp')) - port = common.checkAjaxInput(form.getvalue('updateSmonPort')) - en = common.checkAjaxInput(form.getvalue('updateSmonEn')) - url = common.checkAjaxInput(form.getvalue('updateSmonUrl')) - body = common.checkAjaxInput(form.getvalue('updateSmonBody')) - telegram = common.checkAjaxInput(form.getvalue('updateSmonTelegram')) - slack = common.checkAjaxInput(form.getvalue('updateSmonSlack')) - pd = common.checkAjaxInput(form.getvalue('updateSmonPD')) - group = common.checkAjaxInput(form.getvalue('updateSmonGroup')) - desc = common.checkAjaxInput(form.getvalue('updateSmonDesc')) - check_type = common.checkAjaxInput(form.getvalue('check_type')) - resolver = common.checkAjaxInput(form.getvalue('updateSmonResServer')) - record_type = common.checkAjaxInput(form.getvalue('updateSmonRecordType')) - packet_size = common.checkAjaxInput(form.getvalue('updateSmonPacket_size')) - http_method = common.checkAjaxInput(form.getvalue('updateSmon_http_method')) + +def update_smon(smon_id, name, ip, port, en, url, body, telegram, slack, pd, group, desc, check_type, + resolver, record_type, packet_size, http_method) -> str: is_edited = False if check_type == 'tcp': try: port = int(port) except Exception: - print('SMON error: port must number') - return None + raise Exception('SMON error: port must number') if port > 65535 or port < 0: - print('SMON error: port must be 0-65535') - return None + raise Exception('SMON error: port must be 0-65535') if check_type == 'ping': if int(packet_size) < 16: - print('SMON error: a packet size cannot be less than 16') - return None + raise Exception('SMON error: a packet size cannot be less than 16') - roxywi_common.check_user_group() try: if sql.update_smon(smon_id, name, telegram, slack, pd, group, desc, en): if check_type == 'http': @@ -103,36 +68,29 @@ def update_smon() -> None: is_edited = sql.update_smonDns(smon_id, ip, port, resolver, record_type) if is_edited: - print("Ok") roxywi_common.logging('SMON', f' The SMON server {name} has been update ', roxywi=1, login=1) + return "Ok" except Exception as e: - print(e) + raise Exception(f'error: Cannot update the server: {e}') -def show_smon() -> None: +def show_smon(sort: str) -> str: 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/smon_dashboard.html') - template = template.render(smon=sql.smon_list(user_group), sort=sort, lang=lang, update=1) - print(template) + lang = roxywi_common.get_user_lang_for_flask() + + return render_template('ajax/smon/smon_dashboard.html', smon=sql.smon_list(user_group), sort=sort, lang=lang, update=1) -def delete_smon() -> None: - user_group = roxywi_common.get_user_group(id=1) - smon_id = common.checkAjaxInput(form.getvalue('smondel')) - - if roxywi_common.check_user_group(): - try: - if sql.delete_smon(smon_id, user_group): - print('Ok') - roxywi_common.logging('SMON', ' The server from SMON has been delete ', roxywi=1, login=1) - except Exception as e: - print(e) +def delete_smon(smon_id, user_group) -> str: + try: + if sql.delete_smon(smon_id, user_group): + roxywi_common.logging('SMON', ' The server from SMON has been delete ', roxywi=1, login=1) + return 'Ok' + except Exception as e: + raise Exception(f'error: Cannot delete the server {e}') -def history_metrics(server_id: int, check_id: int) -> None: +def history_metrics(server_id: int, check_id: int) -> dict: metric = sql.select_smon_history(server_id, check_id) metrics = {'chartData': {}} @@ -147,23 +105,24 @@ def history_metrics(server_id: int, check_id: int) -> None: metrics['chartData']['labels'] = labels metrics['chartData']['curr_con'] = curr_con - print(json.dumps(metrics)) + return metrics def history_statuses(dashboard_id: int, check_id: int) -> None: - env = Environment(loader=FileSystemLoader('templates'), autoescape=True) - template = env.get_template('ajax/smon/history_status.html') smon_statuses = sql.select_smon_history(dashboard_id, check_id) - rendered_template = template.render(smon_statuses=smon_statuses) - print(rendered_template) + return render_template('ajax/smon/history_status.html', smon_statuses=smon_statuses) def history_cur_status(dashboard_id: int, check_id: int) -> None: - env = Environment(loader=FileSystemLoader('templates'), autoescape=True) - template = env.get_template('ajax/smon/cur_status.html') cur_status = sql.get_last_smon_status_by_check(dashboard_id, check_id) smon = sql.select_one_smon(dashboard_id, check_id) - rendered_template = template.render(cur_status=cur_status, smon=smon) - print(rendered_template) + return render_template('ajax/smon/cur_status.html', cur_status=cur_status, smon=smon) + + +def return_smon_status(): + cmd = "systemctl is-active roxy-wi-smon" + smon_status, stderr = server_mod.subprocess_execute(cmd) + + return smon_status, stderr \ No newline at end of file diff --git a/app/nettools.py b/app/nettools.py deleted file mode 100644 index f927634c..00000000 --- a/app/nettools.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 -import sys - -import modules.common.common as common -import modules.roxywi.roxy as roxywi_mod -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -from jinja2 import Environment, FileSystemLoader -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('nettools.html') -form = common.form - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params(virt=1) - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) -except Exception as e: - print(f'error {e}') - sys.exit() - -output_from_parsed_template = template.render(h2=1, autorefresh=0, - 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'], - lang=user_params['lang']) -print(output_from_parsed_template) diff --git a/app/options.py b/app/options.py deleted file mode 100644 index 9320da6a..00000000 --- a/app/options.py +++ /dev/null @@ -1,1567 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import os -import sys -import http.cookies -from uuid import UUID - -from jinja2 import Environment, FileSystemLoader - -import modules.db.sql as sql -import modules.server.ssh as ssh_mod -import modules.common.common as common -import modules.config.add as add_mod -import modules.config.config as config_mod -import modules.roxywi.common as roxywi_common -import modules.roxy_wi_tools as roxy_wi_tools -import modules.server.server as server_mod -import modules.service.common as service_common -import modules.service.installation as service_mod - -get_config = roxy_wi_tools.GetConfigVar() -time_zone = sql.get_setting('time_zone') -get_date = roxy_wi_tools.GetDate(time_zone) - -form = common.form -serv = common.is_ip_or_dns(form.getvalue('serv')) -service = common.checkAjaxInput(form.getvalue('service')) -act = form.getvalue("act") -token = form.getvalue("token") - -if any(( - form.getvalue('new_metrics'), form.getvalue('new_http_metrics'), form.getvalue('new_waf_metrics'), form.getvalue('new_nginx_metrics'), - form.getvalue('new_apache_metrics'), form.getvalue('metrics_hapwi_ram'), form.getvalue('metrics_hapwi_cpu'), form.getvalue('getoption'), - form.getvalue('getsavedserver'), form.getvalue('smon_history_check')) -): - print('Content-type: application/json\n') -else: - print('Content-type: text/html\n') - -if act == "checkrestart": - servers = roxywi_common.get_dick_permit(ip=serv) - for server in servers: - if server != "": - print("ok") - sys.exit() - sys.exit() - -try: - uuid_obj = UUID(token, version=4) -except ValueError: - print('error: Your token is not valid') - sys.exit() -except Exception: - print('error: There is no token') - sys.exit() - -if not sql.check_token_exists(token): - print('error: Your token has been expired') - sys.exit() - -if form.getvalue('checkSshConnect') is not None and serv is not None: - try: - print(server_mod.ssh_command(serv, ["ls -1t"])) - except Exception as e: - print(e) - -if form.getvalue('getcerts') is not None and serv is not None: - add_mod.get_ssl_certs(serv) - -if form.getvalue('getcert') is not None and serv is not None: - cert_id = common.checkAjaxInput(form.getvalue('getcert')) - add_mod.get_ssl_cert(serv, cert_id) - -if form.getvalue('getcert_raw') is not None and serv is not None: - cert_id = common.checkAjaxInput(form.getvalue('getcert_raw')) - add_mod.get_ssl_raw_cert(serv, cert_id) - -if form.getvalue('delcert') is not None and serv is not None: - cert_id = common.checkAjaxInput(form.getvalue('delcert')) - add_mod.del_ssl_cert(serv, cert_id) - -if serv and form.getvalue('ssl_cert'): - ssl_name = common.checkAjaxInput(form.getvalue('ssl_name')) - ssl_cont = form.getvalue('ssl_cert') - add_mod.upload_ssl_cert(serv, ssl_name, ssl_cont) - -if form.getvalue('backend') is not None: - import modules.config.runtime as runtime - runtime.show_backends(serv) - -if form.getvalue('ip_select') is not None: - import modules.config.runtime as runtime - runtime.show_backends(serv) - -if form.getvalue('ipbackend') is not None and form.getvalue('backend_server') is None: - import modules.config.runtime as runtime - - runtime.show_frontend_backend() - -if form.getvalue('ipbackend') is not None and form.getvalue('backend_server') is not None: - import modules.config.runtime as runtime - - runtime.show_server() - -if form.getvalue('backend_ip') is not None: - import modules.config.runtime as runtime - - runtime.change_ip_and_port() - -if form.getvalue('maxconn_select') is not None: - import modules.config.runtime as runtime - serv = common.checkAjaxInput(form.getvalue('maxconn_select')) - runtime.get_backends_from_config(serv, backends='frontend') - -if form.getvalue('maxconn_global') is not None: - import modules.config.runtime as runtime - - runtime.change_maxconn_global() - -if form.getvalue('maxconn_frontend') is not None: - import modules.config.runtime as runtime - - runtime.change_maxconn_frontend() - -if form.getvalue('maxconn_backend') is not None: - import modules.config.runtime as runtime - - runtime.change_maxconn_backend() - -if form.getvalue('table_serv_select') is not None: - import modules.config.runtime as runtime - print(runtime.get_all_stick_table()) - -if form.getvalue('table_select') is not None: - import modules.config.runtime as runtime - - runtime.table_select() - -if form.getvalue('ip_for_delete') is not None: - import modules.config.runtime as runtime - - runtime.delete_ip_from_stick_table() - -if form.getvalue('table_for_clear') is not None: - import modules.config.runtime as runtime - - runtime.clear_stick_table() - -if form.getvalue('list_serv_select') is not None: - import modules.config.runtime as runtime - - runtime.list_of_lists() - -if form.getvalue('list_select_id') is not None: - import modules.config.runtime as runtime - - runtime.show_lists() - -if form.getvalue('list_id_for_delete') is not None: - import modules.config.runtime as runtime - - runtime.delete_ip_from_list() - -if form.getvalue('list_ip_for_add') is not None: - import modules.config.runtime as runtime - - runtime.add_ip_to_list() - -if form.getvalue('sessions_select') is not None: - import modules.config.runtime as runtime - - runtime.select_session() - -if form.getvalue('sessions_select_show') is not None: - import modules.config.runtime as runtime - - runtime.show_session() - -if form.getvalue('session_delete_id') is not None: - import modules.config.runtime as runtime - - runtime.delete_session() - -if form.getvalue("change_pos") is not None: - pos = common.checkAjaxInput(form.getvalue('change_pos')) - server_id = common.checkAjaxInput(form.getvalue('pos_server_id')) - sql.update_server_pos(pos, server_id) - -if form.getvalue('show_ip') is not None and serv is not None: - commands = ['sudo hostname -i | tr " " "\n"|grep -v "%"'] - server_mod.ssh_command(serv, commands, ip="1") - -if form.getvalue('showif'): - commands = ["sudo ip link|grep 'UP' |grep -v 'lo'| awk '{print $2}' |awk -F':' '{print $1}'"] - server_mod.ssh_command(serv, commands, ip="1") - -if form.getvalue('action_hap') is not None and serv is not None: - import modules.service.action as service_action - - action = form.getvalue('action_hap') - service_action.action_haproxy(serv, action) - -if form.getvalue('action_nginx') is not None and serv is not None: - import modules.service.action as service_action - - action = form.getvalue('action_nginx') - service_action.action_nginx(serv, action) - -if form.getvalue('action_keepalived') is not None and serv is not None: - import modules.service.action as service_action - - action = form.getvalue('action_keepalived') - service_action.action_keepalived(serv, action) - -if form.getvalue('action_waf') is not None and serv is not None: - import modules.service.action as service_action - - action = form.getvalue('action_waf') - service_action.action_haproxy_waf(serv, action) - -if form.getvalue('action_waf_nginx') is not None and serv is not None: - import modules.service.action as service_action - - action = form.getvalue('action_waf_nginx') - service_action.action_nginx_waf(serv, action) - -if form.getvalue('action_apache') is not None and serv is not None: - import modules.service.action as service_action - - action = form.getvalue('action_apache') - service_action.action_apache(serv, action) - -if form.getvalue('action_service') is not None: - import modules.roxywi.roxy as roxy - - action = common.checkAjaxInput(form.getvalue('action_service')) - roxy.action_service(action, serv) - -if act == "overviewHapserverBackends": - service_common.overview_backends(serv, service) - -if form.getvalue('show_userlists'): - add_mod.show_userlist(serv) - -if act == "overviewHapservers": - service_common.get_overview_last_edit(serv, service) - -if act == "overview": - import modules.roxywi.overview as roxy_overview - - roxy_overview.show_overview(serv) - -if act == "overviewwaf": - import modules.roxywi.waf as roxy_waf - - waf_service = service - serv = common.checkAjaxInput(serv) - roxy_waf.waf_overview(serv, waf_service) - -if act == "overviewServers": - server_id = common.checkAjaxInput(form.getvalue('id')) - name = common.checkAjaxInput(form.getvalue('name')) - - service_common.overview_service(serv, server_id, name, service) - -if act == "overviewServices": - import modules.roxywi.overview as roxy_overview - - roxy_overview.show_services_overview() - -if form.getvalue('action'): - import modules.service.haproxy as service_haproxy - - service_haproxy.stat_page_action(serv) - -if serv is not None and act == "stats": - service_common.get_stat_page(serv, service) - -if serv is not None and any((form.getvalue('show_log'), form.getvalue('rows1'), form.getvalue('viewlogs'))): - import modules.roxywi.logs as roxywi_logs - - waf = 0 - rows = form.getvalue('show_log') - service = service - - if form.getvalue('rows1'): - rows = form.getvalue('rows1') - service = 'apache_internal' - elif form.getvalue('show_log'): - waf = form.getvalue('waf') - elif form.getvalue('viewlogs'): - serv = form.getvalue('viewlogs') - rows = form.getvalue('rows') - service = 'internal' - - grep = form.getvalue('grep') - hour = form.getvalue('hour') - minute = form.getvalue('minut') - hour1 = form.getvalue('hour1') - minute1 = form.getvalue('minut1') - - if roxywi_common.check_user_group(): - out = roxywi_logs.show_roxy_log(serv=serv, rows=rows, waf=waf, grep=grep, hour=hour, minute=minute, hour1=hour1, - minute1=minute1, service=service) - print(out) - -if serv is not None and act == "showMap": - import modules.service.haproxy as service_haproxy - - service_haproxy.show_map(serv) - -if form.getvalue('servaction') is not None: - import modules.service.haproxy as service_haproxy - - service_haproxy.runtime_command(serv) - -if act == "showCompareConfigs": - config_mod.show_compare_config(serv) - -if serv is not None and form.getvalue('right') is not None: - config_mod.compare_config() - -if serv is not None and act == "configShow": - config_mod.show_config(serv) - -if act == 'configShowFiles': - config_mod.show_config_files(serv) - -if act == 'showRemoteLogFiles': - log_path = sql.get_setting(f'{service}_path_logs') - return_files = server_mod.get_remote_files(serv, log_path, 'log') - if 'error: ' in return_files: - 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, lang=lang) - print(template) - -if form.getvalue('master'): - master = form.getvalue('master') - eth = form.getvalue('interface') - eth_slave = form.getvalue('slave_interface') - vrrp_ip = form.getvalue('vrrpip') - syn_flood = form.getvalue('syn_flood') - virt_server = int(form.getvalue('virt_server')) - return_to_master = form.getvalue('return_to_master') - haproxy = form.getvalue('hap') - nginx = form.getvalue('nginx') - router_id = form.getvalue('router_id') - - try: - service_mod.keepalived_master_install(master, eth, eth_slave, vrrp_ip, virt_server, syn_flood, return_to_master, - haproxy, nginx, router_id) - except Exception as e: - print(f'{e}') - -if form.getvalue('master_slave'): - master = form.getvalue('master_slave') - slave = form.getvalue('slave') - eth = form.getvalue('interface') - eth_slave = form.getvalue('slave_interface') - vrrp_ip = form.getvalue('vrrpip') - syn_flood = form.getvalue('syn_flood') - haproxy = form.getvalue('hap') - nginx = form.getvalue('nginx') - router_id = form.getvalue('router_id') - - try: - service_mod.keepalived_slave_install(master, slave, eth, eth_slave, vrrp_ip, syn_flood, haproxy, nginx, router_id) - except Exception as e: - print(f'{e}') - -if form.getvalue('masteradd'): - try: - service_mod.keepalived_masteradd() - except Exception as e: - print(f'{e}') - -if form.getvalue('masteradd_slave'): - try: - service_mod.keepalived_slaveadd() - except Exception as e: - print(f'{e}') - -if form.getvalue('master_slave_hap'): - master = form.getvalue('master_slave_hap') - slave = form.getvalue('slave') - server = form.getvalue('server') - docker = form.getvalue('docker') - - if server == 'master': - try: - service_mod.install_haproxy(master, server=server, docker=docker, m_or_s='master', master=master, slave=slave) - except Exception as e: - print(f'{e}') - elif server == 'slave': - try: - service_mod.install_haproxy(slave, server=server, docker=docker, m_or_s='slave', master=master, slave=slave) - except Exception as e: - print(f'{e}') - -if form.getvalue('master_slave_nginx'): - master = form.getvalue('master_slave_nginx') - slave = form.getvalue('slave') - server = form.getvalue('server') - docker = form.getvalue('docker') - - if server == 'master': - try: - service_mod.install_service(master, 'nginx', docker, server=server) - except Exception as e: - print(f'{e}') - elif server == 'slave': - try: - service_mod.install_service(slave, 'nginx', docker, server=server) - except Exception as e: - print(f'{e}') - -if form.getvalue('install_grafana'): - try: - service_mod.grafana_install() - except Exception as e: - print(f'{e}') - -if form.getvalue('haproxy_exp_install'): - import modules.service.exporter_installation as exp_installation - - exp_installation.haproxy_exp_installation() - -if form.getvalue('nginx_exp_install') or form.getvalue('apache_exp_install'): - import modules.service.exporter_installation as exp_installation - - exp_installation.nginx_apache_exp_installation() - -if form.getvalue('node_exp_install'): - import modules.service.exporter_installation as exp_installation - - service = 'node' - exp_installation.node_keepalived_exp_installation(service) - -if form.getvalue('keepalived_exp_install'): - import modules.service.exporter_installation as exp_installation - - service = 'keepalived' - exp_installation.node_keepalived_exp_installation(service) - -if form.getvalue('backup') or form.getvalue('deljob') or form.getvalue('backupupdate'): - import modules.service.backup as backup_mod - - server = common.is_ip_or_dns(form.getvalue('server')) - rpath = common.checkAjaxInput(form.getvalue('rpath')) - time = common.checkAjaxInput(form.getvalue('time')) - backup_type = common.checkAjaxInput(form.getvalue('type')) - rserver = common.checkAjaxInput(form.getvalue('rserver')) - cred = int(form.getvalue('cred')) - deljob = common.checkAjaxInput(form.getvalue('deljob')) - update = common.checkAjaxInput(form.getvalue('backupupdate')) - description = common.checkAjaxInput(form.getvalue('description')) - - try: - backup_mod.backup(server, rpath, time, backup_type, rserver, cred, deljob, update, description) - except Exception as e: - print(e) - -if any((form.getvalue('s3_backup_server'), form.getvalue('dels3job'))): - import modules.service.backup as backup_mod - - server = common.is_ip_or_dns(form.getvalue('s3_backup_server')) - s3_server = common.checkAjaxInput(form.getvalue('s3_server')) - bucket = common.checkAjaxInput(form.getvalue('s3_bucket')) - secret_key = common.checkAjaxInput(form.getvalue('s3_secret_key')) - access_key = common.checkAjaxInput(form.getvalue('s3_access_key')) - time = common.checkAjaxInput(form.getvalue('time')) - deljob = common.checkAjaxInput(form.getvalue('dels3job')) - description = common.checkAjaxInput(form.getvalue('description')) - - backup_mod.s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, description) - -if form.getvalue('git_backup'): - import modules.service.backup as backup_mod - - server_id = form.getvalue('server') - service_id = form.getvalue('git_service') - git_init = form.getvalue('git_init') - repo = form.getvalue('git_repo') - branch = form.getvalue('git_branch') - period = form.getvalue('time') - cred = form.getvalue('cred') - deljob = form.getvalue('git_deljob') - description = form.getvalue('description') - - backup_mod.git_backup(server_id, service_id, git_init, repo, branch, period, cred, deljob, description) - -if form.getvalue('install_service'): - server_ip = common.is_ip_or_dns(form.getvalue('install_service')) - docker = common.checkAjaxInput(form.getvalue('docker')) - - if service in ('nginx', 'apache'): - try: - service_mod.install_service(server_ip, service, docker) - except Exception as e: - print(e) - else: - print('warning: wrong service') - -if form.getvalue('haproxyaddserv'): - try: - service_mod.install_haproxy(form.getvalue('haproxyaddserv'), syn_flood=form.getvalue('syn_flood'), - hapver=form.getvalue('hapver'), docker=form.getvalue('docker')) - except Exception as e: - print(e) - -if form.getvalue('installwaf'): - if service == 'haproxy': - try: - service_mod.waf_install(common.checkAjaxInput(form.getvalue('installwaf'))) - except Exception as e: - print(e) - else: - try: - service_mod.waf_nginx_install(common.checkAjaxInput(form.getvalue('installwaf'))) - except Exception as e: - print(e) - -if form.getvalue('geoip_install'): - try: - service_mod.geoip_installation() - except Exception as e: - print(e) - -if form.getvalue('update_roxy_wi'): - import modules.roxywi.roxy as roxy - - service = form.getvalue('service') - - try: - roxy.update_roxy_wi(service) - except Exception as e: - print(e) - -if form.getvalue('metrics_waf'): - metrics_waf = common.checkAjaxInput(form.getvalue('metrics_waf')) - sql.update_waf_metrics_enable(metrics_waf, form.getvalue('enable')) - -if form.getvalue('table_metrics'): - 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/'), autoescape=True) - template = env.get_template('ajax/table_metrics.html') - - template = template.render(table_stat=metrics, service=service, lang=lang) - print(template) - -if form.getvalue('metrics_hapwi_ram'): - import modules.roxywi.metrics as metric - metrics_type = common.checkAjaxInput(form.getvalue('ip')) - - metric.show_ram_metrics(metrics_type) - -if form.getvalue('metrics_hapwi_cpu'): - import modules.roxywi.metrics as metric - - metrics_type = common.checkAjaxInput(form.getvalue('ip')) - - metric.show_cpu_metrics(metrics_type) - -if form.getvalue('new_metrics'): - import modules.roxywi.metrics as metric - - server_ip = common.is_ip_or_dns(form.getvalue('server')) - hostname = sql.get_hostname_by_server_ip(server_ip) - time_range = common.checkAjaxInput(form.getvalue('time_range')) - - metric.haproxy_metrics(server_ip, hostname, time_range) - -if form.getvalue('new_http_metrics'): - import modules.roxywi.metrics as metric - - server_ip = common.is_ip_or_dns(form.getvalue('server')) - hostname = sql.get_hostname_by_server_ip(server_ip) - time_range = common.checkAjaxInput(form.getvalue('time_range')) - - metric.haproxy_http_metrics(server_ip, hostname, time_range) - -if any((form.getvalue('new_nginx_metrics'), form.getvalue('new_apache_metrics'), form.getvalue('new_waf_metrics'))): - import modules.roxywi.metrics as metric - - server_ip = common.is_ip_or_dns(form.getvalue('server')) - hostname = sql.get_hostname_by_server_ip(server_ip) - time_range = common.checkAjaxInput(form.getvalue('time_range')) - service = '' - - if form.getvalue('new_nginx_metrics'): - service = 'nginx' - elif form.getvalue('new_apache_metrics'): - service = 'apache' - elif form.getvalue('new_waf_metrics'): - service = 'waf' - - metric.service_metrics(server_ip, hostname, service, time_range) - -if form.getvalue('get_hap_v'): - print(service_common.check_haproxy_version(serv)) - -if form.getvalue('get_service_v'): - service = common.checkAjaxInput(form.getvalue('get_service_v')) - server_ip = common.is_ip_or_dns(serv) - - service_common.show_service_version(server_ip, service) - -if form.getvalue('get_keepalived_v'): - cmd = ["sudo /usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}'"] - print(server_mod.ssh_command(serv, cmd)) - -if form.getvalue('get_exporter_v'): - print(service_common.get_exp_version(serv, form.getvalue('get_exporter_v'))) - -if form.getvalue('bwlists'): - color = common.checkAjaxInput(form.getvalue('color')) - group = common.checkAjaxInput(form.getvalue('group')) - bwlists = common.checkAjaxInput(form.getvalue('bwlists')) - - add_mod.get_bwlist(color, group, bwlists) - -if form.getvalue('bwlists_create'): - list_name = common.checkAjaxInput(form.getvalue('bwlists_create')) - color = common.checkAjaxInput(form.getvalue('color')) - group = common.checkAjaxInput(form.getvalue('group')) - - add_mod.create_bwlist(serv, list_name, color, group) - -if form.getvalue('bwlists_save'): - color = common.checkAjaxInput(form.getvalue('color')) - group = common.checkAjaxInput(form.getvalue('group')) - bwlists_save = common.checkAjaxInput(form.getvalue('bwlists_save')) - list_con = form.getvalue('bwlists_content') - action = common.checkAjaxInput(form.getvalue('bwlists_restart')) - - add_mod.save_bwlist(bwlists_save, list_con, color, group, serv, action) - -if form.getvalue('bwlists_delete'): - color = common.checkAjaxInput(form.getvalue('color')) - list_name = common.checkAjaxInput(form.getvalue('bwlists_delete')) - group = common.checkAjaxInput( form.getvalue('group')) - - add_mod.delete_bwlist(list_name, color, group, serv) - -if form.getvalue('get_lists'): - group = common.checkAjaxInput(form.getvalue('group')) - color = common.checkAjaxInput(form.getvalue('color')) - add_mod.get_bwlists_for_autocomplete(color, group) - -if form.getvalue('edit_map'): - group = common.checkAjaxInput(form.getvalue('group')) - map_name = common.checkAjaxInput(form.getvalue('edit_map')) - - add_mod.edit_map(map_name, group) - -if form.getvalue('map_create'): - map_name = common.checkAjaxInput(form.getvalue('map_create')) - group = common.checkAjaxInput(form.getvalue('group')) - - try: - add_mod.create_map(serv, map_name, group) - except Exception as e: - print(e) - -if form.getvalue('map_save'): - group = common.checkAjaxInput(form.getvalue('group')) - map_save = common.checkAjaxInput(form.getvalue('map_save')) - content = form.getvalue('content') - action = common.checkAjaxInput(form.getvalue('map_restart')) - - add_mod.save_map(map_save, content, group, serv, action) - -if form.getvalue('map_delete'): - map_name = common.checkAjaxInput(form.getvalue('map_delete')) - group = common.checkAjaxInput( form.getvalue('group')) - server_id = common.checkAjaxInput( form.getvalue('serv')) - - add_mod.delete_map(map_name, group, server_id) - -if form.getvalue('get_ldap_email'): - import modules.roxywi.user as roxywi_user - - roxywi_user.get_ldap_email() - -if form.getvalue('change_waf_mode'): - import modules.roxywi.waf as roxy_waf - - roxy_waf.change_waf_mode() - -error_mess = roxywi_common.return_error_message() - -if form.getvalue('newuser') is not None: - import modules.roxywi.user as roxywi_user - - email = common.checkAjaxInput(form.getvalue('newemail')) - password = common.checkAjaxInput(form.getvalue('newpassword')) - role = common.checkAjaxInput(form.getvalue('newrole')) - new_user = common.checkAjaxInput(form.getvalue('newusername')) - page = common.checkAjaxInput(form.getvalue('page')) - activeuser = common.checkAjaxInput(form.getvalue('activeuser')) - group = common.checkAjaxInput(form.getvalue('newgroupuser')) - lang = roxywi_common.get_user_lang() - - if roxywi_user.create_user(new_user, email, password, role, activeuser, group): - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/new_user.html') - - template = template.render(users=sql.select_users(user=new_user), - groups=sql.select_groups(), - page=page, - roles=sql.select_roles(), - adding=1, - lang=lang) - print(template) - -if form.getvalue('userdel') is not None: - import modules.roxywi.user as roxywi_user - - try: - roxywi_user.delete_user() - except Exception as e: - print(e) - -if form.getvalue('updateuser') is not None: - import modules.roxywi.user as roxywi_user - - roxywi_user.update_user() - -if form.getvalue('updatepassowrd') is not None: - import modules.roxywi.user as roxywi_user - - roxywi_user.update_user_password() - -if form.getvalue('newserver') is not None: - hostname = common.checkAjaxInput(form.getvalue('servername')) - ip = common.is_ip_or_dns(form.getvalue('newip')) - group = common.checkAjaxInput(form.getvalue('newservergroup')) - typeip = common.checkAjaxInput(form.getvalue('typeip')) - haproxy = common.checkAjaxInput(form.getvalue('haproxy')) - nginx = common.checkAjaxInput(form.getvalue('nginx')) - apache = common.checkAjaxInput(form.getvalue('apache')) - firewall = common.checkAjaxInput(form.getvalue('firewall')) - enable = common.checkAjaxInput(form.getvalue('enable')) - master = common.checkAjaxInput(form.getvalue('slave')) - cred = common.checkAjaxInput(form.getvalue('cred')) - page = common.checkAjaxInput(form.getvalue('page')) - page = page.split("#")[0] - port = common.checkAjaxInput(form.getvalue('newport')) - desc = common.checkAjaxInput(form.getvalue('desc')) - add_to_smon = common.checkAjaxInput(form.getvalue('add_to_smon')) - lang = roxywi_common.get_user_lang() - - if ip == '': - print('error: IP or DNS name is not valid') - sys.exit() - try: - if server_mod.create_server(hostname, ip, group, typeip, enable, master, cred, port, desc, haproxy, nginx, apache, firewall): - try: - user_subscription = roxywi_common.return_user_status() - 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) - - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/new_server.html') - template = template.render(groups=sql.select_groups(), servers=sql.select_servers(server=ip), - masters=sql.select_servers(get_master_servers=1), sshs=sql.select_ssh(group=group), - page=page, user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], - adding=1,lang=lang) - print(template) - roxywi_common.logging(ip, f'A new server {hostname} has been created', roxywi=1, login=1, keep_history=1, service='server') - - if add_to_smon: - import modules.tools.smon as smon_mod - - user_group = roxywi_common.get_user_group(id=1) - smon_mod.create_smon(hostname, ip, 0, 1, 0, 0, hostname, desc, 0, 0, 0, 56, 'ping', 0, 0, user_group, 0) - - except Exception as e: - print(f'error: {e}') - -if act == 'after_adding': - hostname = common.checkAjaxInput(form.getvalue('servername')) - ip = common.is_ip_or_dns(form.getvalue('newip')) - group = common.checkAjaxInput(form.getvalue('newservergroup')) - scan_server = common.checkAjaxInput(form.getvalue('scan_server')) - - try: - server_mod.update_server_after_creating(hostname, ip, scan_server) - except Exception as e: - print(e) - -if form.getvalue('updatehapwiserver') is not None: - hapwi_id = form.getvalue('updatehapwiserver') - active = form.getvalue('active') - name = form.getvalue('name') - alert = form.getvalue('alert_en') - metrics = form.getvalue('metrics') - service = form.getvalue('service_name') - sql.update_hapwi_server(hapwi_id, alert, metrics, active, service) - server_ip = sql.select_server_ip_by_id(hapwi_id) - roxywi_common.logging(server_ip, f'The server {name} has been updated ', roxywi=1, login=1, keep_history=1, service=service) - -if form.getvalue('updateserver') is not None: - name = form.getvalue('updateserver') - group = form.getvalue('servergroup') - typeip = form.getvalue('typeip') - firewall = form.getvalue('firewall') - enable = form.getvalue('enable') - master = form.getvalue('slave') - serv_id = form.getvalue('id') - cred = form.getvalue('cred') - port = form.getvalue('port') - protected = form.getvalue('protected') - desc = form.getvalue('desc') - - if name is None or port is None: - print(error_mess) - else: - sql.update_server(name, group, typeip, enable, master, serv_id, cred, port, desc, firewall, protected) - roxywi_common.logging(f'the server {name}', ' has been updated ', roxywi=1, login=1) - server_ip = sql.select_server_ip_by_id(serv_id) - roxywi_common.logging(server_ip, f'The server {name} has been update', roxywi=1, login=1, keep_history=1, service='server') - -if form.getvalue('serverdel') is not None: - server_id = common.checkAjaxInput(form.getvalue('serverdel')) - - server_mod.delete_server(server_id) - -if form.getvalue('newgroup') is not None: - newgroup = common.checkAjaxInput(form.getvalue('groupname')) - desc = common.checkAjaxInput(form.getvalue('newdesc')) - if newgroup is None: - print(error_mess) - else: - try: - if sql.add_group(newgroup, desc): - env = Environment(loader=FileSystemLoader('templates/ajax/'), autoescape=True) - template = env.get_template('/new_group.html') - - output_from_parsed_template = template.render(groups=sql.select_groups(group=newgroup)) - print(output_from_parsed_template) - roxywi_common.logging('Roxy-WI server', f'A new group {newgroup} has been created', roxywi=1, login=1) - except Exception as e: - print(e) - -if form.getvalue('groupdel') is not None: - import modules.roxywi.group as group_mod - - group_id = common.checkAjaxInput(form.getvalue('groupdel')) - group_mod.delete_group(group_id) - - -if form.getvalue('updategroup') is not None: - import modules.roxywi.group as group_mod - - name = common.checkAjaxInput(form.getvalue('updategroup')) - desc = common.checkAjaxInput(form.getvalue('descript')) - group_id = common.checkAjaxInput(form.getvalue('id')) - group_mod.update_group(group_id, name, desc) - -if form.getvalue('new_ssh'): - ssh_mod.create_ssh_cred() - -if form.getvalue('sshdel') is not None: - ssh_mod.delete_ssh_key() - -if form.getvalue('updatessh'): - ssh_mod.update_ssh_key() - -if form.getvalue('ssh_cert'): - user_group = roxywi_common.get_user_group() - name = common.checkAjaxInput(form.getvalue('name')) - key = form.getvalue('ssh_cert') - - try: - ssh_mod.upload_ssh_key(name, user_group, key) - except Exception as e: - print(e) - -if form.getvalue('new_receiver'): - import modules.alerting.alerting as alerting - - token = common.checkAjaxInput(form.getvalue('new_receiver')) - receiver_name = common.checkAjaxInput(form.getvalue('receiver_name')) - channel = common.checkAjaxInput(form.getvalue('chanel')) - group = common.checkAjaxInput(form.getvalue('group_receiver')) - page = common.checkAjaxInput(form.getvalue('page')) - page = page.split("#")[0] - - alerting.add_receiver_channel(receiver_name, token, channel, group, page) - -if form.getvalue('receiver_del') is not None: - import modules.alerting.alerting as alerting - - channel_id = common.checkAjaxInput(form.getvalue('receiver_del')) - receiver_name = common.checkAjaxInput(form.getvalue('receiver_name')) - - alerting.delete_receiver_channel(channel_id, receiver_name) - -if form.getvalue('update_receiver_token') is not None: - import modules.alerting.alerting as alerting - - receiver_name = common.checkAjaxInput(form.getvalue('receiver_name')) - token = common.checkAjaxInput(form.getvalue('update_receiver_token')) - channel = common.checkAjaxInput(form.getvalue('update_receiver_channel')) - group = common.checkAjaxInput(form.getvalue('update_receiver_group')) - user_id = common.checkAjaxInput(form.getvalue('id')) - - alerting.update_receiver_channel(receiver_name, token, channel, group, user_id) - -if form.getvalue('updatesettings') is not None: - settings = common.checkAjaxInput(form.getvalue('updatesettings')) - val = common.checkAjaxInput(form.getvalue('val')) - user_group = roxywi_common.get_user_group(id=1) - if sql.update_setting(settings, val, user_group): - roxywi_common.logging('Roxy-WI server', f'The {settings} setting has been changed to: {val}', roxywi=1, login=1) - print("Ok") - -if form.getvalue('getuserservices'): - import modules.roxywi.user as roxy_user - - roxy_user.get_user_services() - -if act == 'show_user_group_and_role': - import modules.roxywi.user as roxy_user - - roxy_user.show_user_groups_and_roles() - -if act == 'save_user_group_and_role': - import modules.roxywi.user as roxy_user - - roxy_user.save_user_group_and_role() - -if form.getvalue('changeUserServicesId') is not None: - import modules.roxywi.user as roxy_user - - roxy_user.change_user_services() - -if form.getvalue('changeUserCurrentGroupId') is not None: - import modules.roxywi.user as roxy_user - - roxy_user.change_user_active_group() - -if form.getvalue('getcurrentusergroup') is not None: - import modules.roxywi.user as roxy_user - - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_id = cookie.get('uuid') - group = cookie.get('group') - - roxy_user.get_user_active_group(user_id, group) - -if form.getvalue('newsmonname') is not None: - import modules.tools.smon as smon_mod - - user_group = roxywi_common.get_user_group(id=1) - name = common.checkAjaxInput(form.getvalue('newsmonname')) - hostname = common.checkAjaxInput(form.getvalue('newsmon')) - port = common.checkAjaxInput(form.getvalue('newsmonport')) - enable = common.checkAjaxInput(form.getvalue('newsmonenable')) - url = common.checkAjaxInput(form.getvalue('newsmonurl')) - body = common.checkAjaxInput(form.getvalue('newsmonbody')) - group = common.checkAjaxInput(form.getvalue('newsmongroup')) - desc = common.checkAjaxInput(form.getvalue('newsmondescription')) - telegram = common.checkAjaxInput(form.getvalue('newsmontelegram')) - slack = common.checkAjaxInput(form.getvalue('newsmonslack')) - pd = common.checkAjaxInput(form.getvalue('newsmonpd')) - check_type = common.checkAjaxInput(form.getvalue('newsmonchecktype')) - resolver = common.checkAjaxInput(form.getvalue('newsmonresserver')) - record_type = common.checkAjaxInput(form.getvalue('newsmondns_record_type')) - packet_size = common.checkAjaxInput(form.getvalue('newsmonpacket_size')) - http_method = common.checkAjaxInput(form.getvalue('newsmon_http_method')) - - smon_mod.create_smon(name, hostname, port, enable, url, body, group, desc, telegram, slack, pd, packet_size, - check_type, resolver, record_type, user_group, http_method) - -if form.getvalue('smondel') is not None: - import modules.tools.smon as smon_mod - - smon_mod.delete_smon() - -if form.getvalue('showsmon') is not None: - import modules.tools.smon as smon_mod - - smon_mod.show_smon() - -if form.getvalue('updateSmonName') is not None: - import modules.tools.smon as smon_mod - - smon_mod.update_smon() - -if form.getvalue('smon_history_check') is not None: - import modules.tools.smon as smon_mod - - server_id = int(form.getvalue('server_id')) - check_id = int(form.getvalue('check_id')) - smon_mod.history_metrics(server_id, check_id) - -if form.getvalue('smon_history_statuses') is not None: - import modules.tools.smon as smon_mod - - dashboard_id = int(form.getvalue('dashboard_id')) - check_id = int(form.getvalue('check_id')) - smon_mod.history_statuses(dashboard_id, check_id) - -if form.getvalue('smon_cur_status') is not None: - import modules.tools.smon as smon_mod - - dashboard_id = int(form.getvalue('dashboard_id')) - check_id = int(form.getvalue('check_id')) - smon_mod.history_cur_status(dashboard_id, check_id) - -if form.getvalue('showBytes') is not None: - import modules.roxywi.overview as roxywi_overview - - server_ip = common.is_ip_or_dns(form.getvalue('showBytes')) - roxywi_overview.show_haproxy_binout(server_ip) - -if form.getvalue('nginxConnections'): - import modules.roxywi.overview as roxywi_overview - - server_ip = common.is_ip_or_dns(form.getvalue('nginxConnections')) - roxywi_overview.show_nginx_connections(server_ip) - -if form.getvalue('apachekBytes'): - import modules.roxywi.overview as roxywi_overview - - server_ip = common.is_ip_or_dns(form.getvalue('apachekBytes')) - roxywi_overview.show_apache_bytes(server_ip) - -if form.getvalue('keepalivedBecameMaster'): - import modules.roxywi.overview as roxywi_overview - - server_ip = common.is_ip_or_dns(form.getvalue('keepalivedBecameMaster')) - roxywi_overview.keepalived_became_master(server_ip) - -if form.getvalue('waf_rule_id'): - import modules.roxywi.waf as roxy_waf - - roxy_waf.switch_waf_rule(serv) - -if form.getvalue('new_waf_rule'): - import modules.roxywi.waf as roxy_waf - - roxy_waf.create_waf_rule(serv) - -if form.getvalue('lets_domain'): - lets_domain = common.checkAjaxInput(form.getvalue('lets_domain')) - lets_email = common.checkAjaxInput(form.getvalue('lets_email')) - - add_mod.get_le_cert(serv, lets_domain, lets_email) - -if form.getvalue('uploadovpn'): - name = common.checkAjaxInput(form.getvalue('ovpnname')) - - ovpn_file = f"{os.path.dirname('/tmp/')}/{name}.ovpn" - - try: - with open(ovpn_file, "w") as conf: - conf.write(form.getvalue('uploadovpn')) - except IOError as e: - print(str(e)) - print('error: Cannot save ovpn file') - else: - print('success: ovpn file has been saved </div>') - - try: - cmd = 'sudo openvpn3 config-import --config %s --persistent' % ovpn_file - server_mod.subprocess_execute(cmd) - except IOError as e: - roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) - - try: - cmd = 'sudo cp %s /etc/openvpn3/%s.conf' % (ovpn_file, name) - server_mod.subprocess_execute(cmd) - except IOError as e: - roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) - - roxywi_common.logging("Roxy-WI server", f" has been uploaded a new ovpn file {ovpn_file}", roxywi=1, login=1) - -if form.getvalue('openvpndel') is not None: - openvpndel = common.checkAjaxInput(form.getvalue('openvpndel')) - - cmd = f'sudo openvpn3 config-remove --config /tmp/{openvpndel}.ovpn --force' - try: - server_mod.subprocess_execute(cmd) - print("Ok") - roxywi_common.logging(openvpndel, ' has deleted the ovpn file ', roxywi=1, login=1) - except IOError as e: - print(e.args[0]) - roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) - -if form.getvalue('actionvpn') is not None: - openvpn = common.checkAjaxInput(form.getvalue('openvpnprofile')) - action = common.checkAjaxInput(form.getvalue('actionvpn')) - - if action == 'start': - cmd = f'sudo openvpn3 session-start --config /tmp/{openvpn}.ovpn' - elif action == 'restart': - cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --restart' - elif action == 'disconnect': - cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --disconnect' - else: - print('error: wrong action') - sys.exit() - try: - server_mod.subprocess_execute(cmd) - print(f"success: The {openvpn} has been {action}ed") - roxywi_common.logging(openvpn, f' The ovpn session has been {action}ed ', roxywi=1, login=1) - except IOError as e: - print(e.args[0]) - roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) - -if form.getvalue('scan_ports') is not None: - serv_id = common.checkAjaxInput(form.getvalue('scan_ports')) - server = sql.select_servers(id=serv_id) - ip = '' - - for s in server: - ip = s[2] - - cmd = f"sudo nmap -sS {ip} |grep -E '^[[:digit:]]'|sed 's/ */ /g'" - cmd1 = f"sudo nmap -sS {ip} |head -5|tail -2" - - stdout, stderr = server_mod.subprocess_execute(cmd) - stdout1, stderr1 = server_mod.subprocess_execute(cmd1) - - 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, lang=lang) - print(template) - -if form.getvalue('viewFirewallRules') is not None: - server_mod.show_firewalld_rules() - -if form.getvalue('geoipserv') is not None: - serv = common.checkAjaxInput(form.getvalue('geoipserv')) - service = common.checkAjaxInput(form.getvalue('geoip_service')) - if service in ('haproxy', 'nginx'): - service_dir = common.return_nice_path(sql.get_setting(f'{service}_dir')) - cmd = [f"ls {service_dir}geoip/"] - print(server_mod.ssh_command(serv, cmd)) - else: - print('warning: select a server and service first') - -if form.getvalue('nettools_icmp_server_from'): - import modules.roxywi.nettools as nettools - - nettools.ping_from_server() - -if form.getvalue('nettools_telnet_server_from'): - import modules.roxywi.nettools as nettools - - nettools.telnet_from_server() - -if form.getvalue('nettools_nslookup_server_from'): - import modules.roxywi.nettools as nettools - - nettools.nslookup_from_server() - -if form.getvalue('portscanner_history_server_id'): - server_id = common.checkAjaxInput(form.getvalue('portscanner_history_server_id')) - enabled = common.checkAjaxInput(form.getvalue('portscanner_enabled')) - notify = common.checkAjaxInput(form.getvalue('portscanner_notify')) - history = common.checkAjaxInput(form.getvalue('portscanner_history')) - user_group_id = [server[3] for server in sql.select_servers(id=server_id)] - - try: - if sql.insert_port_scanner_settings(server_id, user_group_id[0], enabled, notify, history): - print('ok') - else: - if sql.update_port_scanner_settings(server_id, user_group_id[0], enabled, notify, history): - print('ok') - except Exception as e: - print(e) - -if form.getvalue('show_versions'): - import modules.roxywi.roxy as roxy - env = Environment(loader=FileSystemLoader('templates')) - template = env.get_template('ajax/check_version.html') - template = template.render(versions=roxy.versions()) - print(template) - -if form.getvalue('get_group_name_by_id'): - print(sql.get_group_name_by_id(form.getvalue('get_group_name_by_id'))) - -if form.getvalue('new_provider_name'): - import modules.provisioning.provider as provider - - provider.create_provider() - -if form.getvalue('providerdel'): - import modules.provisioning.provider as provider - - provider.delete_provider() - -if form.getvalue('awsinit') or form.getvalue('doinit') or form.getvalue('gcoreinitserver'): - import modules.provisioning.server as prov_server - - prov_server.init_server() - -if form.getvalue('awsvars') or form.getvalue('awseditvars'): - import modules.provisioning.aws as aws - - aws.create_vars() - -if form.getvalue('dovars') or form.getvalue('doeditvars'): - import modules.provisioning.do as do - - do.create_vars() - -if form.getvalue('dovalidate') or form.getvalue('doeditvalidate'): - import modules.provisioning.do as do - - do.validate() - -if form.getvalue('doworkspace'): - import modules.provisioning.do as do - - do.new_workspace() - -if form.getvalue('doeditworkspace'): - import modules.provisioning.do as do - - do.edit_workspace() - -if form.getvalue('awsvalidate') or form.getvalue('awseditvalidate'): - import modules.provisioning.aws as aws - - aws.validate() - -if form.getvalue('awsworkspace'): - import modules.provisioning.aws as aws - - aws.new_workspace() - -if form.getvalue('awseditworkspace'): - import modules.provisioning.aws as aws - - aws.edit_workspace() - -if any((form.getvalue('awsprovisining'), form.getvalue('awseditingprovisining'), form.getvalue('doprovisining'), - form.getvalue('doeditprovisining'), form.getvalue('gcoreprovisining'), form.getvalue('gcoreeditgprovisining'))): - import modules.provisioning.server as prov_server - - prov_server.create_server() - -if form.getvalue('provisiningdestroyserver'): - import modules.provisioning.server as prov_server - - prov_server.destroy_server() - -if form.getvalue('gcorevars') or form.getvalue('gcoreeditvars'): - import modules.provisioning.gcore as gcore - - gcore.gcore_create_vars() - -if form.getvalue('gcorevalidate') or form.getvalue('gcoreeditvalidate'): - import modules.provisioning.gcore as gcore - - gcore.validate() - -if form.getvalue('gcoreworkspace'): - import modules.provisioning.gcore as gcore - - gcore.new_workspace() - -if form.getvalue('gcoreeditworkspace'): - import modules.provisioning.gcore as gcore - - gcore.edit_workspace() - -if form.getvalue('editServerId'): - import modules.provisioning.server as prov_server_mod - - prov_server_mod.edit_server() - -if form.getvalue('edit_provider_id'): - import modules.provisioning.provider as provider_mod - - provider = form.getvalue('provider_name') - provider_id = form.getvalue('edit_provider_id') - - edit_functions = { - 'aws': provider_mod.edit_aws_provider, - 'do': provider_mod.edit_DO_provider, - 'gcore': provider_mod.edit_gcore_provider, - } - - edit_functions[provider](provider_id) - -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: - services = get_services_status() - except Exception as e: - print(e) - - template = template.render(services=services, lang=lang) - print(template) - -if form.getvalue('loadchecker'): - import modules.tools.checker as checker_mod - - checker_mod.load_checker() - -if form.getvalue('load_update_hapwi'): - import modules.roxywi.roxy as roxy - - env = Environment(loader=FileSystemLoader('templates')) - template = env.get_template('ajax/load_updateroxywi.html') - - versions = roxy.versions() - checker_ver = roxy.check_new_version('checker') - smon_ver = roxy.check_new_version('smon') - metrics_ver = roxy.check_new_version('metrics') - keep_ver = roxy.check_new_version('keep_alive') - portscanner_ver = roxy.check_new_version('portscanner') - 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, - checker_ver=checker_ver, - smon_ver=smon_ver, - metrics_ver=metrics_ver, - portscanner_ver=portscanner_ver, - socket_ver=socket_ver, - prometheus_exp_ver=prometheus_exp_ver, - keep_ver=keep_ver, - lang=lang) - print(template) - -if form.getvalue('loadopenvpn'): - import distro - - env = Environment(loader=FileSystemLoader('templates')) - template = env.get_template('ajax/load_openvpn.html') - openvpn_configs = '' - openvpn_sess = '' - openvpn = '' - - if distro.id() == 'ubuntu': - stdout, stderr = server_mod.subprocess_execute("apt show openvpn3 2>&1|grep E:") - elif distro.id() == 'centos' or distro.id() == 'rhel': - stdout, stderr = server_mod.subprocess_execute("rpm --query openvpn3-client") - - if ( - (stdout[0] != 'package openvpn3-client is not installed' and stderr != '/bin/sh: rpm: command not found') - and stdout[0] != 'E: No packages found' - ): - cmd = "sudo openvpn3 configs-list |grep -E 'ovpn|(^|[^0-9])[0-9]{4}($|[^0-9])' |grep -v net|awk -F\" \" '{print $1}'|awk 'ORS=NR%2?\" \":\"\\n\"'" - openvpn_configs, stderr = server_mod.subprocess_execute(cmd) - cmd = "sudo openvpn3 sessions-list|grep -E 'Config|Status'|awk -F\":\" '{print $2}'|awk 'ORS=NR%2?\" \":\"\\n\"'| sed 's/^ //g'" - openvpn_sess, stderr = server_mod.subprocess_execute(cmd) - openvpn = stdout[0] - - template = template.render(openvpn=openvpn, openvpn_sess=openvpn_sess, openvpn_configs=openvpn_configs) - print(template) - -if form.getvalue('check_receiver'): - import modules.alerting.alerting as alerting - - channel_id = form.getvalue('receiver_channel_id') - receiver_name = form.getvalue('receiver_name') - alerting.check_receiver(channel_id, receiver_name) - -if form.getvalue('check_rabbitmq_alert'): - import modules.alerting.alerting as alerting - - alerting.check_rabbit_alert() - -if form.getvalue('check_email_alert'): - import modules.alerting.alerting as alerting - - alerting.check_email_alert() - -if form.getvalue('getoption'): - group = form.getvalue('getoption') - term = form.getvalue('term') - - add_mod.get_saved_option(group, term) - -if form.getvalue('newtoption'): - option = common.checkAjaxInput(form.getvalue('newtoption')) - group = common.checkAjaxInput(form.getvalue('newoptiongroup')) - if option is None or group is None: - print(error_mess) - else: - add_mod.create_saved_option(option, group) - -if form.getvalue('updateoption') is not None: - option = common.checkAjaxInput(form.getvalue('updateoption')) - option_id = common.checkAjaxInput(form.getvalue('id')) - if option is None or option_id is None: - print(error_mess) - else: - sql.update_options(option, option_id) - -if form.getvalue('optiondel') is not None: - if sql.delete_option(common.checkAjaxInput(form.getvalue('optiondel'))): - print("Ok") - -if form.getvalue('getsavedserver'): - group = common.checkAjaxInput(form.getvalue('getsavedserver')) - term = common.checkAjaxInput(form.getvalue('term')) - - add_mod.get_saved_servers(group, term) - -if form.getvalue('newsavedserver'): - server = common.checkAjaxInput(form.getvalue('newsavedserver')) - desc = common.checkAjaxInput(form.getvalue('newsavedserverdesc')) - group = common.checkAjaxInput(form.getvalue('newsavedservergroup')) - if server is None or group is None: - print(error_mess) - else: - add_mod.create_saved_server(server, group, desc) - -if form.getvalue('updatesavedserver') is not None: - savedserver = form.getvalue('updatesavedserver') - description = form.getvalue('description') - savedserver_id = form.getvalue('id') - if savedserver is None or savedserver_id is None: - print(error_mess) - else: - sql.update_savedserver(savedserver, description, savedserver_id) - -if form.getvalue('savedserverdel') is not None: - if sql.delete_savedserver(common.checkAjaxInput(form.getvalue('savedserverdel'))): - print("Ok") - -if form.getvalue('show_users_ovw') is not None: - import modules.roxywi.overview as roxywi_overview - - roxywi_overview.user_ovw() - -if form.getvalue('serverSettings') is not None: - server_id = common.checkAjaxInput(form.getvalue('serverSettings')) - service = common.checkAjaxInput(form.getvalue('serverSettingsService')) - env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) - template = env.get_template('ajax/show_service_settings.html') - - template = template.render(settings=sql.select_service_settings(server_id, service), service=service) - print(template) - -if form.getvalue('serverSettingsSave') is not None: - server_id = common.checkAjaxInput(form.getvalue('serverSettingsSave')) - service = common.checkAjaxInput(form.getvalue('serverSettingsService')) - haproxy_enterprise = common.checkAjaxInput(form.getvalue('serverSettingsEnterprise')) - service_dockerized = common.checkAjaxInput(form.getvalue('serverSettingsDockerized')) - service_restart = common.checkAjaxInput(form.getvalue('serverSettingsRestart')) - server_ip = sql.select_server_ip_by_id(server_id) - service_docker = f'Service {service.title()} has been flagged as a dockerized' - service_systemd = f'Service {service.title()} has been flagged as a system service' - disable_restart = f'Restart option is disabled for {service.title()} service' - enable_restart = f'Restart option is disabled for {service.title()} service' - - if service == 'haproxy': - if sql.insert_or_update_service_setting(server_id, service, 'haproxy_enterprise', haproxy_enterprise): - print('Ok') - if haproxy_enterprise == '1': - roxywi_common.logging(server_ip, 'Service has been flagged as an Enterprise version', roxywi=1, login=1, - keep_history=1, service=service) - else: - roxywi_common.logging(server_ip, 'Service has been flagged as a community version', roxywi=1, login=1, - keep_history=1, service=service) - - if sql.insert_or_update_service_setting(server_id, service, 'dockerized', service_dockerized): - print('Ok') - if service_dockerized == '1': - roxywi_common.logging(server_ip, service_docker, roxywi=1, login=1, keep_history=1, service=service) - else: - roxywi_common.logging(server_ip, service_systemd, roxywi=1, login=1, keep_history=1, service=service) - - if sql.insert_or_update_service_setting(server_id, service, 'restart', service_restart): - print('Ok') - if service_restart == '1': - roxywi_common.logging(server_ip, disable_restart, roxywi=1, login=1, keep_history=1, service=service) - else: - roxywi_common.logging(server_ip, enable_restart, roxywi=1, login=1, keep_history=1, service=service) - -if act == 'showListOfVersion': - config_mod.list_of_versions(serv, service) - -if act == 'getSystemInfo': - server_mod.show_system_info() - -if act == 'updateSystemInfo': - server_mod.update_system_info() - -if act == 'server_is_up': - server_ip = common.is_ip_or_dns(form.getvalue('server_is_up')) - - server_mod.server_is_up(server_ip) - -if act == 'findInConfigs': - server_ip = serv - server_ip = common.is_ip_or_dns(server_ip) - finding_words = form.getvalue('words') - log_path = sql.get_setting(service + '_dir') - log_path = common.return_nice_path(log_path) - commands = [f'sudo grep "{finding_words}" {log_path}*/*.conf -C 2 -Rn'] - return_find = server_mod.ssh_command(server_ip, commands, raw=1) - return_find = config_mod.show_finding_in_config(return_find, grep=finding_words) - - if 'error: ' in return_find: - print(return_find) - sys.exit() - print(return_find) - -if act == 'check_service': - import modules.service.action as service_action - - cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE")) - user_uuid = cookie.get('uuid') - server_id = common.checkAjaxInput(form.getvalue('server_id')) - - service_action.check_service(serv, user_uuid, service) - -if form.getvalue('show_sub_ovw'): - import modules.roxywi.overview as roxywi_overview - - roxywi_overview.show_sub_ovw() - -if form.getvalue('updateHaproxyCheckerSettings'): - import modules.tools.checker as checker_mod - - checker_mod.update_haproxy_settings() - -if form.getvalue('updateKeepalivedCheckerSettings'): - import modules.tools.checker as checker_mod - - checker_mod.update_keepalived_settings() - -if form.getvalue('updateServiceCheckerSettings'): - import modules.tools.checker as checker_mod - - checker_mod.update_service_settings() - -if act == 'show_server_services': - server_mod.show_server_services() - -if form.getvalue('changeServerServicesId') is not None: - server_mod.change_server_services() diff --git a/app/overview.py b/app/overview.py deleted file mode 100644 index 0a213c05..00000000 --- a/app/overview.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import sys - -from jinja2 import Environment, FileSystemLoader - -import modules.db.sql as sql -import modules.roxywi.logs as roxy_logs -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('ovw.html') - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params() - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) -except Exception: - print('error: your session is expired') - sys.exit() - -try: - groups = sql.select_groups() -except Exception as e: - groups = '' - print(e) - -rendered_template = template.render( - 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, lang=user_params['lang'] -) -print(rendered_template) diff --git a/app/portscanner.py b/app/portscanner.py deleted file mode 100644 index fa7c4fbd..00000000 --- a/app/portscanner.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python3 -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.roxywi.common as roxywi_common -import modules.server.server as server_mod - -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('portscanner.html') -form = common.form -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']) -except Exception as e: - print(f'error {e}') - sys.exit() - -if serv: - if lang == 'ru': - title = f'История Port scanner для {serv}' - elif lang == 'fr': - title = f'Historique du scanner de ports pour {serv}' - else: - title = f'Port scanner history for {serv}' - port_scanner_settings = sql.select_port_scanner_history(serv) - history = '1' - port_scanner = '' - port_scanner_stderr = '' - count_ports = '' -else: - history = '' - if lang == 'ru': - title = 'Дашборд Port scanner' - elif lang == 'fr': - title = 'Tableau de bord du scanner de ports' - 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: - port_scanner_settings = '' - count_ports = '' - else: - count_ports = list() - for s in user_params['servers']: - count_ports_from_sql = sql.select_count_opened_ports(s[2]) - i = (s[2], count_ports_from_sql) - count_ports.append(i) - - cmd = "systemctl is-active roxy-wi-portscanner" - port_scanner, port_scanner_stderr = server_mod.subprocess_execute(cmd) - -try: - user_subscription = roxywi_common.return_user_status() -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) - -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'], lang=lang -) -print(rendered_template) diff --git a/app/provisioning.py b/app/provisioning.py deleted file mode 100644 index 25f49c28..00000000 --- a/app/provisioning.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 -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.roxywi.common as roxywi_common - -env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('provisioning.html') -form = common.form - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params() - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) -except Exception as e: - print(f'error {e}') - sys.exit() - -roxywi_auth.page_for_admin(level=2) -try: - if user_params['role'] == 1: - groups = sql.select_groups() - else: - groups = roxywi_common.get_user_group(id=1) - user_group = roxywi_common.get_user_group(id=1) - - is_needed_tool = common.is_tool('terraform') - - params = sql.select_provisioning_params() -except Exception as e: - print(str(e)) - -if user_params['lang'] == 'ru': - title = 'Предоставление серверов' -else: - title = 'Servers provisioning' - -rendered_template = template.render( - 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 -) -print(rendered_template) diff --git a/app/routes/add/__init__.py b/app/routes/add/__init__.py new file mode 100644 index 00000000..6f94b4c8 --- /dev/null +++ b/app/routes/add/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('add', __name__) + +from app.routes.add import routes diff --git a/app/routes/add/routes.py b/app/routes/add/routes.py new file mode 100644 index 00000000..08ce9bd8 --- /dev/null +++ b/app/routes/add/routes.py @@ -0,0 +1,689 @@ +import os +import sys + +from functools import wraps +from flask import render_template, request, jsonify, redirect, url_for +from flask_login import login_required + +from app import app, login_manager +from app.routes.add import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.config.add as add_mod +import modules.common.common as common +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common +import modules.roxy_wi_tools as roxy_wi_tools +import app.modules.server.server as server_mod + +get_config = roxy_wi_tools.GetConfigVar() +time_zone = sql.get_setting('time_zone') +get_date = roxy_wi_tools.GetDate(time_zone) + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/<service>') +def add(service): + roxywi_auth.page_for_admin(level=3) + + if service not in ('haproxy', 'nginx'): + raise Exception('error: wrong service') + + try: + user_params = roxywi_common.get_users_params(service=service) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + add = request.form.get('add') + conf_add = request.form.get('conf') + + if service == 'haproxy': + user_group = request.cookies.get('group') + lib_path = get_config.get_config_var('main', 'lib_path') + list_dir = lib_path + "/lists" + white_dir = lib_path + "/lists/" + user_group + "/white" + black_dir = lib_path + "/lists/" + user_group + "/black" + + if not os.path.exists(list_dir): + os.makedirs(list_dir) + if not os.path.exists(list_dir + "/" + user_group): + os.makedirs(list_dir + "/" + user_group) + if not os.path.exists(white_dir): + os.makedirs(white_dir) + if not os.path.exists(black_dir): + os.makedirs(black_dir) + + white_lists = roxywi_common.get_files(folder=white_dir, file_format="lst") + black_lists = roxywi_common.get_files(folder=black_dir, file_format="lst") + maps = roxywi_common.get_files(folder=f'{lib_path}/maps/{user_group}', file_format="map") + + return render_template( + 'add.html', h2=1, role=user_params['role'], user=user, selects=user_params['servers'], add=add, + conf_add=conf_add, group=user_group, options=sql.select_options(), saved_servers=sql.select_saved_servers(), + white_lists=white_lists, black_lists=black_lists, user_services=user_params['user_services'], + token=user_params['token'], lang=user_params['lang'], maps=maps + ) + elif service == 'nginx': + return render_template( + 'add_nginx.html', h2=1, role=user_params['role'], user=user, selects=user_params['servers'], add=add, + conf_add=conf_add, user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'] + ) + else: + return redirect(url_for('index')) + + +@bp.route('/haproxy/add', methods=['POST']) +def add_haproxy(): + roxywi_auth.page_for_admin(level=3) + + haproxy_dir = sql.get_setting('haproxy_dir') + generate = request.form.get('generateconfig') + server_ip = request.form.get('serv') + port = request.form.getlist('port') + bind = "" + ip = "" + force_close = request.form.get('force_close') + balance = "" + mode = f" mode {request.form.get('mode')}\n" + maxconn = "" + options_split = "" + ssl = "" + ssl_check = "" + backend = "" + headers = '' + acl = "" + servers_split = "" + new_listener = request.form.get('listener') + new_frontend = request.form.get('frontend') + new_backend = request.form.get('new_backend') + + if request.form.get('balance') is not None: + balance = " balance " + request.form.get('balance') + "\n" + + if request.form.get('health_check') is not None: + health_check = request.form.get('health_check') + if health_check == 'option httpchk' and request.form.get('checks_http_domain') is not None: + health_check = health_check + ' GET ' + request.form.get( + 'checks_http_path') + ' "HTTP/1.0\\r\\nHost: ' + request.form.get('checks_http_domain') + '"' + balance += f" {health_check}\n" + + if request.form.get('ip') is not None: + ip = request.form.getlist('ip') + + if new_listener is not None: + name = f"listen {new_listener}" + end_name = new_listener + elif new_frontend is not None: + name = f"frontend {new_frontend}" + end_name = new_frontend + elif new_backend is not None: + name = f"backend {new_backend}" + end_name = new_backend + else: + return 'error: The name cannot be empty' + + if request.form.get('backends') is not None: + backend = f" default_backend {request.form.get('backends')}\n" + + if request.form.get('maxconn'): + maxconn = f" maxconn {request.form.get('maxconn')}\n" + + if request.form.get('ssl') == "https" and request.form.get('mode') != "tcp": + cert_path = sql.get_setting('cert_path') + if request.form.get('cert') is not None: + ssl = f"ssl crt {cert_path}{request.form.get('cert')}" + if request.form.get('ssl-dis-check') is None: + if request.form.get('ssl-check') == "ssl-check": + ssl_check = " ssl verify none" + else: + ssl_check = " ssl verify" + + if ip or port: + if type(port) is list: + i = 0 + for _p in port: + if ip[i] == 'IsEmptY': + if ip[i] == 'IsEmptY' and port[i] == 'IsEmptY': + i += 1 + continue + else: + port_value = port[i] + bind += f" bind *:{port_value} {ssl}\n" + else: + if port[i] == 'IsEmptY': + return 'error: IP cannot be bind without a port' + else: + port_value = port[i] + bind += f" bind {ip[i]}:{port_value} {ssl}\n" + i += 1 + + if request.form.get('default-check') == "1": + if request.form.get('check-servers') == "1": + check = f" check inter {request.form.get('inter')} rise {request.form.get('rise')} fall {request.form.get('fall')}{ssl_check}" + else: + check = "" + else: + if request.form.get('check-servers') != "1": + check = "" + else: + check = f" check{ssl_check}" + + if request.form.get('option') is not None: + options = request.form.get('option') + i = options.split("\n") + for j in i: + options_split += f" {j}\n" + + if force_close == "1": + options_split += " option http-server-close\n" + elif force_close == "2": + options_split += " option forceclose\n" + elif force_close == "3": + options_split += " option http-pretend-keepalive\n" + + if request.form.get('whitelist'): + options_split += " tcp-request connection accept if { src -f " + haproxy_dir + "/white/" + request.form.get( + 'whitelist') + " }\n" + + if request.form.get('blacklist'): + options_split += " tcp-request connection reject if { src -f " + haproxy_dir + "/black/" + request.form.get( + 'blacklist') + " }\n" + + if request.form.get('cookie'): + cookie = f" cookie {request.form.get('cookie_name')}" + if request.form.get('cookie_domain'): + cookie += f" domain {request.form.get('cookie_domain')}" + if request.form.get('rewrite'): + rewrite = request.form.get('rewrite') + else: + rewrite = "" + if request.form.get('prefix'): + prefix = request.form.get('prefix') + else: + prefix = "" + if request.form.get('nocache'): + nocache = request.form.get('nocache') + else: + nocache = "" + if request.form.get('postonly'): + postonly = request.form.get('postonly') + else: + postonly = "" + if request.form.get('dynamic'): + dynamic = request.form.get('dynamic') + else: + dynamic = "" + cookie += f" {rewrite} {prefix} {nocache} {postonly} {dynamic}\n" + options_split += cookie + if request.form.get('dynamic'): + options_split += f" dynamic-cookie-key {request.form.get('dynamic-cookie-key')}\n" + + if request.form.get('headers_res'): + headers_res = request.form.getlist('headers_res') + headers_method = request.form.getlist('headers_method') + header_name = request.form.getlist('header_name') + header_value = request.form.getlist('header_value') + i = 0 + + for _h in headers_method: + if headers_method[i] != 'del-header': + headers += f' {headers_res[i]} {headers_method[i]} {header_name[i]} {header_value[i]}\n' + else: + headers += f' {headers_res[i]} {headers_method[i]} {header_name[i]}\n' + i += 1 + + if request.form.get('acl_if'): + acl_if = request.form.getlist('acl_if') + acl_value = request.form.getlist('acl_value') + acl_then = request.form.getlist('acl_then') + acl_then_values = request.form.getlist('acl_then_value') + i = 0 + + for a in acl_if: + acl_then_value = '' if acl_then_values[i] == 'IsEmptY' else acl_then_values[i] + + try: + if a == '1': + acl_if_word = 'hdr_beg(host) -i ' + if request.form.get('ssl') == "https" and request.form.get('mode') != "tcp": + acl_if_word = 'ssl_fc_sni -i ' + if request.form.get('mode') == "tcp": + acl_if_word = 'req.ssl_sni -i ' + elif a == '2': + acl_if_word = 'hdr_end(host) -i ' + if request.form.get('ssl') == "https" and request.form.get('mode') != "tcp": + acl_if_word = 'ssl_fc_sni -i ' + if request.form.get('mode') == "tcp": + acl_if_word = 'req.ssl_sni -i ' + elif a == '3': + acl_if_word = 'path_beg -i ' + elif a == '4': + acl_if_word = 'path_end -i ' + elif a == '6': + acl_if_word = 'src ip ' + else: + acl_if_word = '' + + if acl_then[i] == '5': + acl += ' use_backend ' + elif acl_then[i] == '2': + acl += ' http-request redirect location ' + elif acl_then[i] == '3': + acl += ' http-request allow' + acl_then_value = '' + elif acl_then[i] == '4': + acl += ' http-request deny' + acl_then_value = '' + elif acl_then[i] == '6': + acl += f' acl return_{acl_value[i]} {acl_if_word} {acl_value[i]}\n' + acl += f' http-request return if return_{acl_value[i]}\n' + elif acl_then[i] == '7': + acl += f' acl set_header_{acl_value[i]} {acl_if_word} {acl_value[i]}\n' + acl += f' http-request set-header if set_header_{acl_value[i]}\n' + + if acl_then[i] in ('2', '3', '4', '5'): + acl += acl_then_value + ' if { ' + acl_if_word + acl_value[i] + ' } \n' + except Exception: + acl = '' + + i += 1 + + if request.form.get('circuit_breaking') == "1": + observe = 'observe ' + request.form.get('circuit_breaking_observe') + error_limit = ' error-limit ' + request.form.get('circuit_breaking_error_limit') + circuit_breaking_on_error = ' on-error ' + request.form.get('circuit_breaking_on_error') + default_server = ' default-server ' + observe + error_limit + circuit_breaking_on_error + '\n' + servers_split += default_server + + if request.form.get('servers'): + servers = request.form.getlist('servers') + server_port = request.form.getlist('server_port') + send_proxy = request.form.getlist('send_proxy') + backup = request.form.getlist('backup') + server_maxconn = request.form.getlist('server_maxconn') + port_check = request.form.getlist('port_check') + i = 0 + for server in servers: + if server == '': + continue + if request.form.get('template') is None: + try: + if send_proxy[i] == '1': + send_proxy_param = 'send-proxy' + else: + send_proxy_param = '' + except Exception: + send_proxy_param = '' + + try: + if backup[i] == '1': + backup_param = 'backup' + else: + backup_param = '' + except Exception: + backup_param = '' + + try: + maxconn_val = server_maxconn[i] + except Exception: + maxconn_val = '200' + + try: + port_check_val = port_check[i] + except Exception: + port_check_val = server_port[i] + + servers_split += " server {0} {0}:{1}{2} port {6} maxconn {5} {3} {4} \n".format( + server, server_port[i], check, send_proxy_param, backup_param, maxconn_val, port_check_val + ) + else: + servers_split += " server-template {0} {1} {2}:{3} {4} \n".format( + request.form.get('prefix'), request.form.get('template-number'), server, server_port[i], check + ) + i += 1 + + compression = request.form.get("compression") + cache = request.form.get("cache") + compression_s = "" + cache_s = "" + cache_set = "" + filter_com = "" + if compression == "1" or cache == "2": + filter_com = " filter compression\n" + if cache == "2": + cache_s = f" http-request cache-use {end_name}\n http-response cache-store {end_name}\n" + cache_set = f"cache {end_name}\n total-max-size 4\n max-age 240\n" + if compression == "1": + compression_s = " compression algo gzip\n compression type text/html text/plain text/css\n" + + waf = "" + if request.form.get('waf'): + waf = f" filter spoe engine modsecurity config {haproxy_dir}/waf.conf\n" + waf += " http-request deny if { var(txn.modsec.code) -m int gt 0 }\n" + + config_add = f"\n{name}\n{bind}{mode}{maxconn}{balance}{options_split}{cache_s}{filter_com}{compression_s}" \ + f"{waf}{headers}{acl}{backend}{servers_split}\n{cache_set}\n" + + if generate: + return config_add + else: + try: + return add_mod.save_to_haproxy_config(config_add, server_ip) + except Exception as e: + return str(e) + + +@bp.post('/haproxy/userlist') +def add_userlist(): + roxywi_auth.page_for_admin(level=3) + return add_mod.add_userlist() + + +@bp.post('/haproxy/bwlist/create') +def create_bwlist(): + server_ip = common.is_ip_or_dns(request.form.get('serv')) + color = common.checkAjaxInput(request.form.get('color')) + group = common.checkAjaxInput(request.form.get('group')) + list_name = common.checkAjaxInput(request.form.get('bwlists_create')) + + return add_mod.create_bwlist(server_ip, list_name, color, group) + + +@bp.post('/haproxy/bwlist/save') +@login_required +def save_bwlist(): + server_ip = common.is_ip_or_dns(request.form.get('serv')) + color = common.checkAjaxInput(request.form.get('color')) + group = common.checkAjaxInput(request.form.get('group')) + bwlists_save = common.checkAjaxInput(request.form.get('bwlists_save')) + list_con = request.form.get('bwlists_content') + action = common.checkAjaxInput(request.form.get('bwlists_restart')) + + return add_mod.save_bwlist(bwlists_save, list_con, color, group, server_ip, action) + + +@bp.route('/haproxy/bwlist/delete/<server_ip>/<color>/<name>/<int:group>') +def delete_bwlist(server_ip, color, name, group): + server_ip = common.is_ip_or_dns(server_ip) + color = common.checkAjaxInput(color) + list_name = common.checkAjaxInput(name) + + return add_mod.delete_bwlist(list_name, color, group, server_ip) + + +@bp.route('/haproxy/bwlist/<bwlists>/<color>/<int:group>') +def get_bwlist(bwlists, color, group): + color = common.checkAjaxInput(color) + bwlists = common.checkAjaxInput(bwlists) + + return add_mod.get_bwlist(color, group, bwlists) + + +@bp.route('/haproxy/bwlists/<color>/<int:group>') +def get_bwlists(color, group): + color = common.checkAjaxInput(color) + + return add_mod.get_bwlists_for_autocomplete(color, group) + + +@bp.route('/haproxy/userlist/<server_ip>') +def show_userlist(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + return add_mod.show_userlist(server_ip) + + +@bp.post('/haproxy/peers') +def add_peers(): + roxywi_auth.page_for_admin(level=3) + + generate = request.form.get('generateconfig') + server_ip = request.form.get('serv') + servers_split = '' + name = "peers " + request.form.get('peers-name') + "\n" + servers = request.form.getlist('servers') + server_port = request.form.getlist('server_port') + servers_name = request.form.getlist('servers_name') + i = 0 + + for server in servers: + if server == '': + continue + servers_split += " peer {0} {1}:{2} \n".format(servers_name[i], server, server_port[i]) + i += 1 + + config_add = "\n" + name + servers_split + + if generate: + return config_add, 200 + else: + try: + return add_mod.save_to_haproxy_config(config_add, server_ip) + except Exception as e: + return (str(e)), 200 + + +@bp.route('/option/get/<group>') +def get_option(group): + term = request.args.get('term') + + return jsonify(add_mod.get_saved_option(group, term)) + + +@bp.post('/option/save') +def save_option(): + option = common.checkAjaxInput(request.form.get('option')) + group = int(request.form.get('option_group')) + + return add_mod.create_saved_option(option, group) + + +@bp.post('/option/update') +def update_option(): + option = common.checkAjaxInput(request.form.get('option')) + option_id = int(request.form.get('id')) + + try: + sql.update_options(option, option_id) + except Exception as e: + return str(e) + else: + return 'ok' + + +@bp.route('/option/delete/<int:option_id>') +def delete_option(option_id): + try: + sql.delete_option(option_id) + except Exception as e: + return str(e) + else: + return 'ok' + + +@bp.route('/server/get/<group>') +def get_saved_server(group): + term = request.args.get('term') + + return jsonify(add_mod.get_saved_servers(group, term)) + + +@bp.post('/server/save') +def save_saved_server(): + server = common.checkAjaxInput(request.form.get('server')) + group = int(request.form.get('group')) + desc = common.checkAjaxInput(request.form.get('desc')) + + return add_mod.create_saved_server(server, group, desc) + + +@bp.post('/server/update') +def update_saved_server(): + server = common.checkAjaxInput(request.form.get('server')) + server_id = int(request.form.get('id')) + desc = common.checkAjaxInput(request.form.get('desc')) + + try: + sql.update_savedserver(server, desc, server_id) + except Exception as e: + return str(e) + else: + return 'ok' + + +@bp.route('/server/delete/<int:server_id>') +def delete_saved_server(server_id): + try: + sql.delete_savedserver(server_id) + except Exception as e: + return str(e) + else: + return 'ok' + + +@bp.route('/certs/<server_ip>') +def get_certs(server_ip): + return add_mod.get_ssl_certs(server_ip) + + +@bp.route('/cert/<server_ip>/<cert_id>', methods=['DELETE', 'GET']) +def get_cert(server_ip, cert_id): + if request.method == 'DELETE': + return add_mod.del_ssl_cert(server_ip, cert_id) + elif request.method == 'GET': + return add_mod.get_ssl_cert(server_ip, cert_id) + + +@bp.post('/cert/add') +def upload_cert(): + server_ip = common.is_ip_or_dns(request.form.get('serv')) + ssl_name = request.form.get('ssl_name') + ssl_cont = request.form.get('ssl_cert') + + return add_mod.upload_ssl_cert(server_ip, ssl_name, ssl_cont) + + +@bp.route('/cert/get/raw/<server_ip>/<cert_id>') +def get_cert_raw(server_ip, cert_id): + return add_mod.get_ssl_raw_cert(server_ip, cert_id) + + +@bp.post('/map/create') +def create_map(): + server_ip = common.checkAjaxInput(request.form.get('serv')) + map_name = common.checkAjaxInput(request.form.get('map_create')) + group = common.checkAjaxInput(request.form.get('group')) + + try: + return add_mod.create_map(server_ip, map_name, group) + except Exception as e: + return str(e) + + +@bp.post('/map/save') +def save_map(): + server_ip = common.checkAjaxInput(request.form.get('serv')) + group = common.checkAjaxInput(request.form.get('group')) + map_save = common.checkAjaxInput(request.form.get('map_save')) + content = request.form.get('content') + action = common.checkAjaxInput(request.form.get('map_restart')) + + return add_mod.save_map(map_save, content, group, server_ip, action) + + +@bp.post('/map/edit') +def edit_map(): + group = common.checkAjaxInput(request.form.get('group')) + map_name = common.checkAjaxInput(request.form.get('edit_map')) + + return add_mod.edit_map(map_name, group) + + +@bp.post('/map/delete') +def delete_map(): + map_name = common.checkAjaxInput(request.form.get('map_delete')) + group = common.checkAjaxInput(request.form.get('group')) + server_id = common.checkAjaxInput(request.form.get('serv')) + + return add_mod.delete_map(map_name, group, server_id) + + +@bp.post('lets') +def lets(): + server_ip = common.checkAjaxInput(request.form.get('serv')) + lets_domain = common.checkAjaxInput(request.form.get('lets_domain')) + lets_email = common.checkAjaxInput(request.form.get('lets_email')) + + return add_mod.get_le_cert(server_ip, lets_domain, lets_email) + + +@bp.post('/nginx/upstream') +def add_nginx_upstream(): + roxywi_auth.page_for_admin(level=3) + + server_ip = common.is_ip_or_dns(request.form.get('serv')) + new_upstream = request.form.get('upstream') + balance = request.form.get("balance") + config_add = '' + servers_split = '' + generate = request.form.get('generateconfig') + + if balance == 'round_robin': + balance = '' + else: + balance = f' {balance};\n' + + if new_upstream != '': + config_add = f'upstream {new_upstream} {{\n' + config_add += balance + config_name = f'upstream_{new_upstream}' + + if request.form.get('keepalive') != '': + config_add += f' keepalive {request.form.get("keepalive")};\n' + + if request.form.get('servers') is not None: + servers = request.form.getlist('servers') + server_port = request.form.getlist('server_port') + max_fails = request.form.getlist('max_fails') + fail_timeout = request.form.getlist('fail_timeout') + i = 0 + for server in servers: + if server == '': + continue + try: + max_fails_val = f'max_fails={max_fails[i]}' + except Exception: + max_fails_val = 'max_fails=1' + + try: + fail_timeout_val = f'fail_timeout={fail_timeout[i]}' + except Exception: + fail_timeout_val = 'fail_timeout=1' + + servers_split += f" server {server}:{server_port[i]} {max_fails_val} {fail_timeout_val}s; \n" + i += 1 + config_add += f'{servers_split} }}\n' + + if generate: + return config_add + else: + try: + return add_mod.save_nginx_config(config_add, server_ip, config_name) + except Exception as e: + return str(e) + + +@bp.route('/show/ip/<server_ip>') +def show_ip(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + commands = ['sudo hostname -I | tr " " "\\n"|sed "/^$/d"'] + + return server_mod.ssh_command(server_ip, commands, ip="1") diff --git a/app/routes/admin/__init__.py b/app/routes/admin/__init__.py new file mode 100644 index 00000000..5f16778e --- /dev/null +++ b/app/routes/admin/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('admin', __name__) + +from app.routes.admin import routes diff --git a/app/routes/admin/routes.py b/app/routes/admin/routes.py new file mode 100644 index 00000000..83fa0bb9 --- /dev/null +++ b/app/routes/admin/routes.py @@ -0,0 +1,220 @@ +import os +import sys + +import pytz +import distro +from flask import render_template, request, redirect, url_for +from flask_login import login_required + +from app import app, login_manager +from app.routes.admin import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.roxywi.roxy as roxy +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common +import modules.server.server as server_mod + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('') +def admin(): + roxywi_auth.page_for_admin() + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + users = sql.select_users() + settings = sql.get_setting('', all=1) + ldap_enable = sql.get_setting('ldap_enable') + services = sql.select_services() + gits = sql.select_gits() + masters = sql.select_servers(get_master_servers=1) + is_needed_tool = common.is_tool('ansible') + grafana = 0 + backups = sql.select_backups() + s3_backups = sql.select_s3_backups() + user_subscription = roxywi_common.return_user_subscription() + + if not roxy.is_docker(): + grafana, stderr = server_mod.subprocess_execute("systemctl is-active grafana-server") + grafana = grafana[0] + + return render_template( + 'admin.html', h2=1, role=user_params['role'], user=user, users=users, groups=sql.select_groups(), + servers=sql.select_servers(full=1), masters=masters, sshs=sql.select_ssh(), roles=sql.select_roles(), + settings=settings, backups=backups, s3_backups=s3_backups, services=services, timezones=pytz.all_timezones, + page="users.py", user_services=user_params['user_services'], ldap_enable=ldap_enable, gits=gits, guide_me=1, + user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], + token=user_params['token'], is_needed_tool=is_needed_tool, lang=user_params['lang'], grafana=grafana + ) + + +@bp.route('/tools') +def show_tools(): + roxywi_auth.page_for_admin() + lang = roxywi_common.get_user_lang_for_flask() + try: + services = roxy.get_services_status() + except Exception as e: + return str(e) + + return render_template('ajax/load_services.html', services=services, lang=lang) + + +@bp.route('/tools/update/<service>') +def update_tools(service): + roxywi_auth.page_for_admin() + + try: + return roxy.update_roxy_wi(service) + except Exception as e: + return f'error: {e}' + + +@bp.route('/tools/action/<service>/<action>') +def action_tools(service, action): + roxywi_auth.page_for_admin() + if action not in ('start', 'stop', 'restart'): + return 'error: wrong action' + + return roxy.action_service(action, service) + + +@bp.route('/update') +def update_roxywi(): + roxywi_auth.page_for_admin() + versions = roxy.versions() + checker_ver = roxy.check_new_version('checker') + smon_ver = roxy.check_new_version('smon') + metrics_ver = roxy.check_new_version('metrics') + keep_ver = roxy.check_new_version('keep_alive') + portscanner_ver = roxy.check_new_version('portscanner') + 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_for_flask() + + return render_template( + 'ajax/load_updateroxywi.html', services=services, versions=versions, checker_ver=checker_ver, smon_ver=smon_ver, + metrics_ver=metrics_ver, portscanner_ver=portscanner_ver, socket_ver=socket_ver, prometheus_exp_ver=prometheus_exp_ver, + keep_ver=keep_ver, lang=lang + ) + + +@bp.route('/openvpn') +def load_openvpn(): + roxywi_auth.page_for_admin() + openvpn_configs = '' + openvpn_sess = '' + openvpn = '' + + if distro.id() == 'ubuntu': + stdout, stderr = server_mod.subprocess_execute("apt show openvpn3 2>&1|grep E:") + elif distro.id() == 'centos' or distro.id() == 'rhel': + stdout, stderr = server_mod.subprocess_execute("rpm --query openvpn3-client") + + if ( + (stdout[0] != 'package openvpn3-client is not installed' and stderr != '/bin/sh: rpm: command not found') + and stdout[0] != 'E: No packages found' + ): + cmd = "sudo openvpn3 configs-list |grep -E 'ovpn|(^|[^0-9])[0-9]{4}($|[^0-9])' |grep -v net|awk -F\" \" '{print $1}'|awk 'ORS=NR%2?\" \":\"\\n\"'" + openvpn_configs, stderr = server_mod.subprocess_execute(cmd) + cmd = "sudo openvpn3 sessions-list|grep -E 'Config|Status'|awk -F\":\" '{print $2}'|awk 'ORS=NR%2?\" \":\"\\n\"'| sed 's/^ //g'" + openvpn_sess, stderr = server_mod.subprocess_execute(cmd) + openvpn = stdout[0] + + return render_template('ajax/load_openvpn.html', openvpn=openvpn, openvpn_sess=openvpn_sess, openvpn_configs=openvpn_configs) + + +@bp.post('/openvpn/upload') +def upload_openvpn(): + name = common.checkAjaxInput(request.form.get('ovpnname')) + + ovpn_file = f"{os.path.dirname('/tmp/')}/{name}.ovpn" + + try: + with open(ovpn_file, "w") as conf: + conf.write(request.form.get('uploadovpn')) + except IOError as e: + error = f'error: Cannot save ovpn file {e}' + roxywi_common.logging('Roxy-WI server', error, roxywi=1) + return error + + try: + cmd = 'sudo openvpn3 config-import --config %s --persistent' % ovpn_file + server_mod.subprocess_execute(cmd) + except IOError as e: + error = f'error: Cannot import OpenVPN file: {e}' + roxywi_common.logging('Roxy-WI server', error, roxywi=1) + return error + + try: + cmd = 'sudo cp %s /etc/openvpn3/%s.conf' % (ovpn_file, name) + server_mod.subprocess_execute(cmd) + except IOError as e: + error = f'error: Cannot save OpenVPN file: {e}' + roxywi_common.logging('Roxy-WI server', error, roxywi=1) + return error + + roxywi_common.logging("Roxy-WI server", f" has been uploaded a new ovpn file {ovpn_file}", roxywi=1, login=1) + + return 'success: ovpn file has been saved </div>' + + +@bp.post('/openvpn/delete') +def delete_openvpn(): + openvpndel = common.checkAjaxInput(request.form.get('openvpndel')) + + cmd = f'sudo openvpn3 config-remove --config /tmp/{openvpndel}.ovpn --force' + try: + server_mod.subprocess_execute(cmd) + roxywi_common.logging(openvpndel, ' has deleted the ovpn file ', roxywi=1, login=1) + except IOError as e: + error = f'error: Cannot delete OpenVPN file: {e}' + roxywi_common.logging('Roxy-WI server', error, roxywi=1) + return error + else: + return 'ok' + + +@bp.route('/openvpn/action/<action>/<openvpn>') +def action_openvpn(action, openvpn): + openvpn = common.checkAjaxInput(openvpn) + + if action == 'start': + cmd = f'sudo openvpn3 session-start --config /tmp/{openvpn}.ovpn' + elif action == 'restart': + cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --restart' + elif action == 'disconnect': + cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --disconnect' + else: + return 'error: wrong action' + try: + server_mod.subprocess_execute(cmd) + roxywi_common.logging(openvpn, f' The ovpn session has been {action}ed ', roxywi=1, login=1) + return f"success: The {openvpn} has been {action}ed" + except IOError as e: + roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) + return f'error: Cannot {action} OpenVPN: {e}' + + +@app.route('/setting/<param>/<val>', methods=['POST']) +def update_settings(param, val): + user_group = roxywi_common.get_user_group(id=1) + if sql.update_setting(param, val, user_group): + roxywi_common.logging('Roxy-WI server', f'The {param} setting has been changed to: {val}', roxywi=1, login=1) + + return 'Ok' diff --git a/app/routes/checker/__init__.py b/app/routes/checker/__init__.py new file mode 100644 index 00000000..77c44c25 --- /dev/null +++ b/app/routes/checker/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('checker', __name__) + +from app.routes.checker import routes diff --git a/app/routes/checker/routes.py b/app/routes/checker/routes.py new file mode 100644 index 00000000..9f724e88 --- /dev/null +++ b/app/routes/checker/routes.py @@ -0,0 +1,130 @@ +import os +import sys + +from flask import render_template, request, redirect, url_for +from flask_login import login_required + +from app import app, login_manager +from app.routes.checker import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.roxywi.common as roxywi_common +import modules.tools.alerting as alerting +import modules.tools.checker as checker_mod + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/settings') +def checker_settings(): + roxywi_common.check_user_group_for_flask() + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + return render_template( + 'checker.html', h2=1, role=user_params['role'], user=user, lang=user_params['lang'], + token=user_params['token'], user_services=user_params['user_services'] + ) + + +@bp.post('/settings/update') +def update_settings(): + service = request.form.get('service') + setting_id = int(request.form.get('setting_id')) + email = int(request.form.get('email')) + service_alert = int(request.form.get('server')) + backend_alert = int(request.form.get('backend')) + maxconn_alert = int(request.form.get('maxconn')) + telegram_id = int(request.form.get('telegram_id')) + slack_id = int(request.form.get('slack_id')) + pd_id = int(request.form.get('pd_id')) + + if service == 'haproxy': + return checker_mod.update_haproxy_settings( + setting_id, email, service_alert, backend_alert, maxconn_alert, telegram_id, slack_id, pd_id + ) + elif service in ('nginx', 'apache'): + return checker_mod.update_service_settings(setting_id, email, service_alert, telegram_id, slack_id, pd_id) + else: + return checker_mod.update_keepalived_settings(setting_id, email, service_alert, backend_alert, telegram_id, slack_id, pd_id) + + +@bp.route('/settings/load') +def load_checker(): + return checker_mod.load_checker() + + +@bp.route('/history') +def checker_history(): + roxywi_common.check_user_group_for_flask() + + user_group = roxywi_common.get_user_group(id=1) + smon_status, stderr = smon_mod.return_smon_status() + smon = sql.alerts_history('Checker', user_group) + user_subscription = roxywi_common.return_user_subscription() + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + return render_template( + 'smon/checker_history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, smon=smon, + lang=user_params['lang'], user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], + token=user_params['token'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services'] + ) + + +@bp.route('/check/<channel_id>/<receiver_name>') +def check_receiver(channel_id, receiver_name): + channel_id = common.checkAjaxInput(channel_id) + receiver_name = common.checkAjaxInput(receiver_name) + + return alerting.check_receiver(channel_id, receiver_name) + + +@bp.route('/check/rabbit') +def check_rabbit(): + return alerting.check_rabbit_alert() + + +@bp.route('/check/email') +def check_email(): + return alerting.check_email_alert() + + +@bp.route('/receiver/<receiver_name>', methods=['PUT', 'POST', 'DELETE']) +def receiver(receiver_name): + if request.method == 'POST': + token = common.checkAjaxInput(request.form.get('receiver')) + channel = common.checkAjaxInput(request.form.get('channel')) + group = common.checkAjaxInput(request.form.get('group')) + page = common.checkAjaxInput(request.form.get('page')) + page = page.split("#")[0] + + return alerting.add_receiver_channel(receiver_name, token, channel, group, page) + elif request.method == 'PUT': + token = common.checkAjaxInput(request.form.get('receiver_token')) + channel = common.checkAjaxInput(request.form.get('channel')) + group = common.checkAjaxInput(request.form.get('group')) + user_id = common.checkAjaxInput(request.form.get('id')) + + return alerting.update_receiver_channel(receiver_name, token, channel, group, user_id) + elif request.method == 'DELETE': + channel_id = common.checkAjaxInput(request.form.get('channel_id')) + + return alerting.delete_receiver_channel(channel_id, receiver_name) + diff --git a/app/routes/config/__init__.py b/app/routes/config/__init__.py new file mode 100644 index 00000000..3c67338b --- /dev/null +++ b/app/routes/config/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('config', __name__) + +from app.routes.config import routes diff --git a/app/routes/config/routes.py b/app/routes/config/routes.py new file mode 100644 index 00000000..cca05ec2 --- /dev/null +++ b/app/routes/config/routes.py @@ -0,0 +1,461 @@ +import os +import sys + +from flask import render_template, request, redirect, url_for, abort +from flask_login import login_required + +from app import app, login_manager, cache +from app.routes.config import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +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.config.config as config_mod +import modules.config.section as section_mod +import modules.service.haproxy as service_haproxy +import modules.server.server as server_mod + +get_config = roxy_wi_tools.GetConfigVar() +time_zone = sql.get_setting('time_zone') +get_date = roxy_wi_tools.GetDate(time_zone) + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/<service>/show', methods=['POST']) +def show_config(service): + config_file_name = request.form.get('config_file_name') + configver = request.form.get('configver') + server_ip = request.form.get('serv') + + return config_mod.show_config(server_ip, service, config_file_name, configver) + + +@bp.route('/<service>/show-files', methods=['POST']) +def show_config_files(service): + server_ip = request.form.get('serv') + config_file_name = request.form.get('config_file_name') + + return config_mod.show_config_files(server_ip, service, config_file_name) + + +@bp.route('/<service>/find-in-config', methods=['POST']) +def find_in_config(service): + server_ip = common.is_ip_or_dns(request.form.get('serv')) + finding_words = request.form.get('words') + log_path = sql.get_setting(service + '_dir') + log_path = common.return_nice_path(log_path) + commands = [f'sudo grep "{finding_words}" {log_path}*/*.conf -C 2 -Rn'] + try: + return_find = server_mod.ssh_command(server_ip, commands, raw=1) + return_find = config_mod.show_finding_in_config(return_find, grep=finding_words) + except Exception as e: + return str(e) + + if 'error: ' in return_find: + return return_find + + return return_find + + +@bp.route('/<service>/', defaults={'serv': None, 'edit': None, 'config_file_name': None, 'new': None}, methods=['GET', 'POST']) +@bp.route('/<service>/<serv>/<edit>/', defaults={'config_file_name': None, 'new': None}, methods=['GET', 'POST']) +@bp.route('/<service>/<serv>/show', defaults={'edit': None, 'config_file_name': None, 'new': None}, methods=['GET', 'POST']) +@bp.route('/<service>/<serv>/show/<config_file_name>', defaults={'edit': None, 'new': None}, methods=['GET', 'POST']) +@bp.route('/<service>/<serv>/show-files', defaults={'edit': None, 'config_file_name': None, 'new': None}, methods=['GET', 'POST']) +@bp.route('/<service>/<serv>/<edit>/<config_file_name>', defaults={'new': None}, methods=['GET', 'POST']) +@bp.route('/<service>/<serv>/<edit>/<config_file_name>/<new>', methods=['GET', 'POST']) +def config(service, serv, edit, config_file_name, new): + config_read = "" + cfg = "" + stderr = "" + error = "" + aftersave = "" + is_restart = '' + is_serv_protected = '' + new_config = new + + try: + user_params = roxywi_common.get_users_params(service=service) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + if service in ('haproxy', 'nginx', 'keepalived', 'apache'): + service_desc = sql.select_service(service) + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + else: + return redirect(url_for('index')) + + if serv and config_file_name: + cfg = config_mod.return_cfg(service, serv, config_file_name) + + if serv and edit and new_config is None: + roxywi_common.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') + + try: + error = config_mod.get_config(serv, cfg, service=service, config_file_name=config_file_name) + except Exception as e: + return str(e), 200 + + try: + roxywi_common.logging(serv, f" {service.title()} config has been opened") + except Exception: + pass + + try: + conf = open(cfg, "r") + config_read = conf.read() + conf.close() + except IOError as e: + return f'Cannot read imported config file {e}', 200 + + os.system("/bin/mv %s %s.old" % (cfg, cfg)) + + if new_config is not None: + config_read = ' ' + + return render_template( + 'config.html', h2=1, role=user_params['role'], user=user, select_id="serv", serv=serv, aftersave=aftersave, + config=config_read, cfg=cfg, selects=user_params['servers'], stderr=stderr, error=error, service=service, + is_restart=is_restart, user_services=user_params['user_services'], config_file_name=config_file_name, + is_serv_protected=is_serv_protected, token=user_params['token'], lang=user_params['lang'], service_desc=service_desc + ) + + +@bp.route('/<service>/<server_ip>/save', methods=['POST']) +def save_config(service, server_ip): + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + roxywi_common.check_is_server_in_group(server_ip) + service_desc = sql.select_service(service) + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], + service=service_desc.service_id) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + config = request.form.get('config') + oldcfg = request.form.get('oldconfig') + save = request.form.get('save') + config_file_name = request.form.get('config_file_name') + + try: + cfg = config_mod.return_cfg(service, server_ip, config_file_name) + except Exception as e: + return f'error: {e}', 200 + + try: + with open(cfg, "a") as conf: + conf.write(config) + except IOError as e: + return f"error: Cannot read imported config file: {e}", 200 + + try: + if service == 'keepalived': + stderr = config_mod.upload_and_restart(server_ip, cfg, save, service, oldcfg=oldcfg) + else: + stderr = config_mod.master_slave_upload_and_restart(server_ip, cfg, save, service, oldcfg=oldcfg, + config_file_name=config_file_name) + except Exception as e: + return f'error: {e}', 200 + + if save != 'test': + config_mod.diff_config(oldcfg, cfg) + + if stderr: + return stderr, 200 + + return + + +@bp.route('/versions/<service>', defaults={'server_ip': None}, methods=['GET', 'POST']) +@bp.route('/versions/<service>/<server_ip>', methods=['GET', 'POST']) +def versions(service, server_ip): + roxywi_auth.page_for_admin(level=3) + aftersave = '' + file = set() + stderr = '' + + try: + user_params = roxywi_common.get_users_params(disable=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + if service not in ('haproxy', 'nginx', 'keepalived', 'apache'): + return redirect(url_for('index')) + + if service in ('haproxy', 'keepalived'): + conf_format = 'cfg' + else: + conf_format = 'conf' + + if request.form.get('del'): + aftersave = 1 + for get in request.form.getlist('do_delete'): + if conf_format in get and server_ip in get: + try: + if sql.delete_config_version(service, get): + try: + os.remove(get) + except OSError as e: + if 'No such file or directory' in str(e): + pass + else: + os.remove(os.path.join(configs_dir, get)) + try: + file.add(get + "\n") + roxywi_common.logging( + server_ip, f"Version of config has been deleted: {get}", login=1, keep_history=1, + service=service + ) + except Exception: + pass + except OSError as e: + stderr = "Error: %s - %s." % (e.filename, e.strerror) + + return render_template( + 'delver.html', h2=1, role=user_params['role'], user=user, select_id="serv", serv=server_ip, aftersave=aftersave, + selects=user_params['servers'], file=file, service=service, user_services=user_params['user_services'], + token=user_params['token'], lang=user_params['lang'], stderr=stderr + ) + + +@bp.route('/version/<service>/list', methods=['POST']) +def list_of_version(service): + server_ip = common.is_ip_or_dns(request.form.get('serv')) + configver = common.checkAjaxInput(request.form.get('configver')) + for_delver = common.checkAjaxInput(request.form.get('for_delver')) + + return config_mod.list_of_versions(server_ip, service, configver, for_delver) + + +@bp.route('/versions/<service>/<server_ip>/<configver>', defaults={'save': None}, methods=['GET', 'POST']) +@bp.route('/versions/<service>/<server_ip>/<configver>/save', defaults={'save': 1}, methods=['GET', 'POST']) +def show_version(service, server_ip, configver, save): + roxywi_auth.page_for_admin(level=3) + + try: + user_params = roxywi_common.get_users_params(disable=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + if service not in ('haproxy', 'nginx', 'keepalived', 'apache'): + return redirect(url_for('index')) + + service_desc = sql.select_service(service) + + if not roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id): + return redirect(url_for('index')) + + configs_dir = get_config.get_config_var('configs', f'{service_desc.service}_save_configs_dir') + configver = configs_dir + configver + servers = roxywi_common.get_dick_permit(service=service_desc.slug) + aftersave = 0 + stderr = '' + + if save: + aftersave = 1 + save_action = request.form.get('save') + try: + roxywi_common.logging( + server_ip, f"Version of config has been uploaded {configver}", login=1, keep_history=1, service=service + ) + except Exception: + pass + + if service == 'keepalived': + stderr = config_mod.upload_and_restart(serv, configver, save_action, service) + elif service in ('nginx', 'apache'): + config_file_name = sql.select_remote_path_from_version(server_ip=server_ip, service=service, + local_path=configver) + stderr = config_mod.master_slave_upload_and_restart(server_ip, configver, save_action, service_desc.slug, + config_file_name=config_file_name) + else: + stderr = config_mod.master_slave_upload_and_restart(server_ip, configver, save_action, service) + + return render_template( + 'configver.html', + h2=1, role=user_params['role'], user=user, select_id="serv", serv=server_ip, aftersave=aftersave, + selects=servers, stderr=stderr, save=save, configver=configver, service=service, + user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'] + ) + + +@bp.route('/section/haproxy/<server_ip>') +def haproxy_section(server_ip): + try: + user_params = roxywi_common.get_users_params(service=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + is_restart = 0 + hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir') + cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg" + error = config_mod.get_config(server_ip, cfg) + sections = section_mod.get_sections(cfg) + + return render_template( + 'sections.html', h2=1, role=user_params['role'], user=user, serv=server_ip, selects=user_params['servers'], + sections=sections, error=error, token=user_params['token'], lang=user_params['lang'], is_restart=is_restart, config='', + user_services=user_params['user_services'] + ) + + +@bp.route('/section/haproxy/<server_ip>/<section>') +def haproxy_section_show(server_ip, section): + try: + user_params = roxywi_common.get_users_params(service=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + try: + roxywi_common.logging(server_ip, f"A section {section} has been opened") + except Exception: + pass + + hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir') + cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg" + error = config_mod.get_config(server_ip, cfg) + sections = section_mod.get_sections(cfg) + start_line, end_line, config_read = section_mod.get_section_from_config(cfg, section) + server_id = sql.select_server_id_by_ip(server_ip) + is_restart = sql.select_service_setting(server_id, 'haproxy', 'restart') + + os.system(f"/bin/mv {cfg} {cfg}.old") + + return render_template( + 'sections.html', h2=1, role=user_params['role'], user=user, + serv=server_ip, selects=user_params['servers'], error=error, sections=sections, cfg=cfg, + token=user_params['token'], lang=user_params['lang'], is_restart=is_restart, config=config_read, + start_line=start_line, end_line=end_line, section=section, user_services=user_params['user_services'] + ) + + +@bp.route('/section/haproxy/<server_ip>/save', methods=['POST']) +def haproxy_section_save(server_ip): + try: + user_params = roxywi_common.get_users_params(service=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + hap_configs_dir = get_config.get_config_var('configs', 'haproxy_save_configs_dir') + cfg = f"{hap_configs_dir}{server_ip}-{get_date.return_date('config')}.cfg" + config = request.form.get('config') + oldcfg = request.form.get('oldconfig') + save = request.form.get('save') + start_line = request.form.get('start_line') + end_line = request.form.get('end_line') + + if save == 'delete': + config = '' + save = 'reload' + + config = section_mod.rewrite_section(start_line, end_line, oldcfg, config) + + try: + with open(cfg, "w") as conf: + conf.write(config) + except IOError as e: + return f"error: Cannot read import config file: {e}" + + stderr = config_mod.master_slave_upload_and_restart(server_ip, cfg, save, 'haproxy', oldcfg=oldcfg) + + config_mod.diff_config(oldcfg, cfg) + + os.system(f"/bin/rm -f {hap_configs_dir}*.old") + + return stderr + + +@bp.route('/compare/<service>/<serv>') +@bp.route('/map/<service>/<serv>') +def show_compare_config(service, serv): + config_read = "" + cfg = "" + stderr = "" + error = "" + aftersave = "" + is_restart = '' + is_serv_protected = '' + config_file_name = '' + + try: + user_params = roxywi_common.get_users_params(service=service) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + if service in ('haproxy', 'nginx', 'keepalived', 'apache'): + service_desc = sql.select_service(service) + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + else: + return redirect(url_for('index')) + + return render_template( + 'config.html', h2=1, role=user_params['role'], user=user, select_id="serv", serv=serv, aftersave=aftersave, + config=config_read, cfg=cfg, selects=user_params['servers'], stderr=stderr, error=error, service=service, + is_restart=is_restart, user_services=user_params['user_services'], config_file_name=config_file_name, + is_serv_protected=is_serv_protected, token=user_params['token'], lang=user_params['lang'], + service_desc=service_desc + ) + + +@bp.route('/compare/<service>/<server_ip>/files') +def show_configs_for_compare(service, server_ip): + return config_mod.show_compare_config(server_ip, service) + + +@bp.route('/compare/<service>/<server_ip>/show', methods=['POST']) +def show_compare(service, server_ip): + left = common.checkAjaxInput(request.form.get('left')) + right = common.checkAjaxInput(request.form.get('right')) + + return config_mod.compare_config(service, left, right) + + +@bp.route('/map/haproxy/<server_ip>/show') +def show_map(server_ip): + return service_haproxy.show_map(server_ip) diff --git a/app/routes/install/__init__.py b/app/routes/install/__init__.py new file mode 100644 index 00000000..cc5356b8 --- /dev/null +++ b/app/routes/install/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('install', __name__) + +from app.routes.install import routes diff --git a/app/routes/install/routes.py b/app/routes/install/routes.py new file mode 100644 index 00000000..f3e17881 --- /dev/null +++ b/app/routes/install/routes.py @@ -0,0 +1,268 @@ +import os +import sys + +from functools import wraps +from flask import render_template, request, redirect, url_for +from flask_login import login_required + +from app import app, login_manager +from app.routes.install import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common +import modules.roxy_wi_tools as roxy_wi_tools +import modules.server.server as server_mod +import modules.service.common as service_common +import modules.service.installation as service_mod +import modules.service.exporter_installation as exp_installation + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('') +def install_monitoring(): + roxywi_auth.page_for_admin(level=2) + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + is_needed_tool = common.is_tool('ansible') + geoip_country_codes = sql.select_geoip_country_codes() + + return render_template( + 'install.html', h2=1, role=user_params['role'], user=user, servers=user_params['servers'], + user_services=user_params['user_services'], lang=user_params['lang'], geoip_country_codes=geoip_country_codes, + is_needed_tool=is_needed_tool, token=user_params['token'] + ) + + +@bp.route('/ha') +def ha(): + roxywi_auth.page_for_admin(level=2) + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + is_needed_tool = common.is_tool('ansible') + user_subscription = roxywi_common.return_user_subscription() + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=3) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + return render_template( + 'ha.html', h2=1, role=user_params['role'], user=user, 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'] + ) + + +@bp.post('/keepalived', defaults={'slave_kp': None}) +@bp.post('/keepalived/<slave_kp>') +def install_keepalived(slave_kp): + master = request.form.get('master') + slave = request.form.get('slave') + eth = request.form.get('interface') + eth_slave = request.form.get('slave_interface') + vrrp_ip = request.form.get('vrrpip') + syn_flood = request.form.get('syn_flood') + return_to_master = request.form.get('return_to_master') + haproxy = request.form.get('hap') + nginx = request.form.get('nginx') + router_id = request.form.get('router_id') + virt_server = request.form.get('virt_server') + + try: + virt_server = int(virt_server) + except Exception: + pass + + if not slave_kp: + try: + return service_mod.keepalived_master_install( + master, eth, eth_slave, vrrp_ip, virt_server, syn_flood, return_to_master, haproxy, nginx, router_id + ) + except Exception as e: + return f'{e}' + else: + try: + return service_mod.keepalived_slave_install( + master, slave, eth, eth_slave, vrrp_ip, syn_flood, haproxy, nginx, router_id + ) + except Exception as e: + return f'{e}' + + +@bp.post('/keepalived/add', defaults={'slave_kp': None}) +@bp.post('/keepalived/add/<slave_kp>') +def add_extra_vrrp(slave_kp): + master = request.form.get('master') + slave = request.form.get('slave') + eth = request.form.get('interface') + slave_eth = request.form.get('slave_interface') + vrrp_ip = request.form.get('vrrpip') + router_id = request.form.get('router_id') + return_to_master = request.form.get('return_to_master') + kp = request.form.get('kp') + + if not slave_kp: + try: + return service_mod.keepalived_masteradd(master, eth, slave_eth, vrrp_ip, router_id, return_to_master, kp) + except Exception as e: + return f'{e}' + else: + try: + return service_mod.keepalived_slaveadd(slave, eth, slave_eth, vrrp_ip, router_id, kp) + except Exception as e: + return f'{e}' + + +@bp.post('/<service>/<server_ip>') +def install_service(service, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + docker = common.checkAjaxInput(request.form.get('docker')) + syn_flood = request.form.get('syn_flood') + hapver = request.form.get('hapver') + + if service in ('nginx', 'apache'): + try: + return service_mod.install_service(server_ip, service, docker, syn_flood) + except Exception as e: + return str(e) + elif service == 'haproxy': + try: + return service_mod.install_haproxy(server_ip, syn_flood=syn_flood, hapver=hapver, docker=docker) + except Exception as e: + return str(e) + else: + return 'warning: Wrong service' + + +@bp.post('/<service>/master-slave') +def master_slave(service): + master = request.form.get('master') + slave = request.form.get('slave') + server = request.form.get('server') + docker = request.form.get('docker') + + if service == 'haproxy': + if server == 'master': + try: + return service_mod.install_haproxy(master, server=server, docker=docker, m_or_s='master', master=master, slave=slave) + except Exception as e: + return f'{e}' + elif server == 'slave': + try: + return service_mod.install_haproxy(slave, server=server, docker=docker, m_or_s='slave', master=master, slave=slave) + except Exception as e: + return f'{e}' + elif service == 'nginx': + syn_flood_protect = '1' if request.form.get('syn_flood') == "1" else '' + if server == 'master': + try: + return service_mod.install_service(master, 'nginx', docker, syn_flood_protect, server=server) + except Exception as e: + return f'{e}' + elif server == 'slave': + try: + return service_mod.install_service(slave, 'nginx', docker, syn_flood_protect, server=server) + except Exception as e: + return f'{e}' + + +@bp.route('/<service>/version/<server_ip>') +def get_service_version(service, server_ip): + if service in ('haproxy', 'nginx', 'apache'): + return service_common.show_service_version(server_ip, service) + elif service == 'keepalived': + cmd = ["sudo /usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}'"] + return server_mod.ssh_command(server_ip, cmd) + else: + return 'error: Wrong service' + + +@bp.post('/exporter/<exporter>') +def install_exporter(exporter): + server_ip = common.is_ip_or_dns(request.form.get('server_ip')) + ver = common.checkAjaxInput(request.form.get('exporter_v')) + ext_prom = common.checkAjaxInput(request.form.get('ext_prom')) + + if exporter == 'haproxy': + return exp_installation.haproxy_exp_installation(server_ip, ver, ext_prom) + elif exporter in ('nginx', 'apache'): + return exp_installation.nginx_apache_exp_installation(server_ip, exporter, ver, ext_prom) + elif exporter in ('keepalived', 'node'): + return exp_installation.node_keepalived_exp_installation(exporter, server_ip, ver, ext_prom) + else: + return 'error: Wrong exporter' + + +@bp.route('/exporter/<exporter>/version/<server_ip>') +def get_exporter_version(exporter, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + return service_common.get_exp_version(server_ip, exporter) + + +@bp.route('/grafana') +def install_grafana(): + try: + return service_mod.grafana_install() + except Exception as e: + return f'{e}' + + +@bp.route('/waf/<service>/<server_ip>') +def install_waf(service, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + if service == 'haproxy': + try: + return service_mod.waf_install(server_ip) + except Exception as e: + return str(e) + elif service == 'nginx': + try: + return service_mod.waf_nginx_install(server_ip) + except Exception as e: + return str(e) + else: + return 'error: Wrong service' + + +@bp.post('/geoip') +def install_geoip(): + server_ip = common.is_ip_or_dns(server_ip) + geoip_update = common.checkAjaxInput(request.form.get('update')) + service = request.form.get('service') + + try: + return service_mod.geoip_installation(server_ip, geoip_update, service) + except Exception as e: + return str(e) + + +@bp.route('/geoip/<service>/<server_ip>') +def check_geoip(service, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + if service not in ('haproxy', 'nginx'): + return 'error: Wrong service' + + service_dir = common.return_nice_path(sql.get_setting(f'{service}_dir')) + cmd = [f"ls {service_dir}geoip/"] + return server_mod.ssh_command(server_ip, cmd) diff --git a/app/routes/metric/__init__.py b/app/routes/metric/__init__.py new file mode 100644 index 00000000..b98c89b0 --- /dev/null +++ b/app/routes/metric/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('metric', __name__) + +from app.routes.metric import routes diff --git a/app/routes/metric/routes.py b/app/routes/metric/routes.py new file mode 100644 index 00000000..a02c7c79 --- /dev/null +++ b/app/routes/metric/routes.py @@ -0,0 +1,128 @@ +import os +import sys + +import distro +from flask import render_template, request, jsonify, redirect, url_for +from flask_login import login_required + +from app import app, login_manager +from app.routes.metric import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.server.server as server_mod +import modules.roxywi.metrics as metric +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/<service>') +def metrics(service): + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + service_desc = sql.select_service(service) + roxywi_common.check_user_group_for_flask() + + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + try: + if distro.id() == 'ubuntu': + cmd = "apt list --installed 2>&1 |grep roxy-wi-metrics" + else: + cmd = "rpm -q roxy-wi-metrics-* |awk -F\"metrics\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'" + service_ver, stderr = server_mod.subprocess_execute(cmd) + services = '0' + + if not stderr: + if service_ver[0] == ' is not installed' or service_ver == '': + servers = '' + else: + services = '1' + if service == 'nginx': + user_params['servers'] = sql.select_nginx_servers_metrics_for_master() + elif service == 'apache': + user_params['servers'] = sql.select_apache_servers_metrics_for_master() + else: + group_id = roxywi_common.get_user_group(id=1) + user_params['servers'] = sql.select_servers_metrics(group_id) + except Exception as e: + return f'error: on Metrics page: {e}', 500 + + user_subscription = roxywi_common.return_user_subscription() + + return render_template( + 'metrics.html', h2=1, autorefresh=1, role=user_params['role'], user=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'], lang=user_params['lang'], service_desc=service_desc + ) + + +@bp.route('/cpu', methods=['POST']) +def metrics_cpu(): + metrics_type = common.checkAjaxInput(request.form.get('ip')) + + return jsonify(metric.show_cpu_metrics(metrics_type)) + + +@bp.route('/ram', methods=['POST']) +def metrics_ram(): + metrics_type = common.checkAjaxInput(request.form.get('ip')) + + return jsonify(metric.show_ram_metrics(metrics_type)) + + +@bp.route('/<service>/table-metrics') +def table_metrics(service): + roxywi_common.check_user_group_for_flask() + 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) + + return render_template('ajax/table_metrics.html', table_stat=metrics, service=service, lang=lang) + + +@bp.route('/<service>/<server_ip>', methods=['POST']) +def show_metric(service, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + hostname = sql.get_hostname_by_server_ip(server_ip) + time_range = common.checkAjaxInput(request.form.get('time_range')) + + if service in ('nginx', 'apache', 'waf'): + return jsonify(metric.service_metrics(server_ip, hostname, service, time_range)) + elif service == 'haproxy': + return jsonify(metric.haproxy_metrics(server_ip, hostname, time_range)) + + return 'error: Wrong service' + + +@bp.route('/<service>/<server_ip>/http', methods=['POST']) +def show_http_metric(service, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + hostname = sql.get_hostname_by_server_ip(server_ip) + time_range = common.checkAjaxInput(request.form.get('time_range')) + + if service == 'haproxy': + return jsonify(metric.haproxy_http_metrics(server_ip, hostname, time_range)) + + return 'error: Wrong service' diff --git a/app/routes/runtime/__init__.py b/app/routes/runtime/__init__.py new file mode 100644 index 00000000..979427c0 --- /dev/null +++ b/app/routes/runtime/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('runtime', __name__) + +from app.routes.runtime import routes diff --git a/app/routes/runtime/routes.py b/app/routes/runtime/routes.py new file mode 100644 index 00000000..9dae244e --- /dev/null +++ b/app/routes/runtime/routes.py @@ -0,0 +1,203 @@ +import os +import sys + +from flask import render_template, request, redirect, url_for +from flask_login import login_required + +from app import app, login_manager +from app.routes.runtime import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.roxywi.common as roxywi_common +import modules.config.runtime as runtime +import modules.service.haproxy as service_haproxy + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/') +def runtimeapi(): + try: + user_params = roxywi_common.get_users_params(haproxy=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + servbackend = "" + + return render_template( + 'runtimeapi.html', h2=1, title="RunTime API", role=user_params['role'], user=user, select_id="serv", + selects=user_params['servers'], token=user_params['token'], user_services=user_params['user_services'], + servbackend=servbackend, lang=user_params['lang'] + ) + + +@bp.route('/backends/<server_ip>') +def show_backends(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + return runtime.show_backends(server_ip) + + +@bp.route('/backend/servers/<server_ip>/<backend>') +def show_backend_servers(server_ip, backend): + server_ip = common.is_ip_or_dns(server_ip) + backend = common.checkAjaxInput(backend) + + return runtime.show_frontend_backend(server_ip, backend) + + +@bp.route('/backend/server/<server_ip>/<backend>/<backend_server>') +def show_backend_server(server_ip, backend, backend_server): + server_ip = common.is_ip_or_dns(server_ip) + backend = common.checkAjaxInput(backend) + backend_server = common.checkAjaxInput(backend_server) + + return runtime.show_server(server_ip, backend, backend_server) + + +@bp.route('/change/ip', methods=['POST']) +def change_ip_port(): + server_ip = common.is_ip_or_dns(request.form.get('serv')) + backend_backend = common.checkAjaxInput(request.form.get('backend_backend')) + backend_server = common.checkAjaxInput(request.form.get('backend_server')) + backend_ip = common.checkAjaxInput(request.form.get('backend_ip')) + backend_port = common.checkAjaxInput(request.form.get('backend_port')) + + return runtime.change_ip_and_port(server_ip, backend_backend, backend_server, backend_ip, backend_port) + + +@bp.route('/maxconn/<server_ip>') +def maxconn_select(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + return runtime.get_backends_from_config(server_ip, backends='frontend') + + +@bp.route('/maxconn/<type_maxconn>/<server_ip>', methods=['POST']) +def change_maxconn(type_maxconn, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + maxconn = common.checkAjaxInput(request.form.get('maxconn')) + + if type_maxconn == 'global': + + return runtime.change_maxconn_global(server_ip, maxconn) + elif type_maxconn == 'frontend': + frontend = common.checkAjaxInput(request.form.get('maxconn_frontend')) + + return runtime.change_maxconn_frontend(server_ip, maxconn, frontend) + elif type_maxconn == 'backend': + backend = common.checkAjaxInput(request.form.get('maxconn_backend')) + backend_server = common.checkAjaxInput(request.form.get('maxconn_backend_server')) + + return runtime.change_maxconn_backend(server_ip, backend, backend_server, maxconn) + else: + return 'error: Wrong backend' + + +@bp.route('/action/<server_ip>', methods=['POST']) +def action(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + enable = common.checkAjaxInput(request.form.get('servaction')) + backend = common.checkAjaxInput(request.form.get('servbackend')) + save = request.form.get('save') + + return service_haproxy.runtime_command(server_ip, enable, backend, save) + + +@bp.route('/tables/<server_ip>') +def get_all_tables(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + return runtime.get_all_stick_table(server_ip) + + +@bp.route('/table/<server_ip>/<table>') +def get_table(server_ip, table): + server_ip = common.is_ip_or_dns(server_ip) + table = common.checkAjaxInput(table) + + return runtime.table_select(server_ip, table) + + +@bp.route('/table/delete/<server_ip>/<table>/<ip_for_delete>') +def delete_ip(server_ip, table, ip_for_delete): + server_ip = common.is_ip_or_dns(server_ip) + table = common.checkAjaxInput(table) + ip_for_delete = common.is_ip_or_dns(ip_for_delete) + + return runtime.delete_ip_from_stick_table(server_ip, ip_for_delete, table) + + +@bp.route('/table/clear/<server_ip>/<table>') +def clear_table(server_ip, table): + server_ip = common.is_ip_or_dns(server_ip) + table = common.checkAjaxInput(table) + + return runtime.clear_stick_table(server_ip, table) + + +@bp.route('/session/<server_ip>') +def select_sessions(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + return runtime.select_session(server_ip) + + +@bp.route('/session/<server_ip>/<sess_id>') +def show_sessions(server_ip, sess_id): + server_ip = common.is_ip_or_dns(server_ip) + sess_id = common.checkAjaxInput(sess_id) + + return runtime.show_session(server_ip, sess_id) + + +@bp.route('/session/delete/<server_ip>/<sess_id>') +def delete_session(server_ip, sess_id): + server_ip = common.is_ip_or_dns(server_ip) + sess_id = common.checkAjaxInput(sess_id) + + return runtime.delete_session(server_ip, sess_id) + + +@bp.route('/list/<server_ip>') +def get_lists(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + return runtime.list_of_lists(server_ip) + + +@bp.route('/list/<server_ip>/<int:list_id>/<list_name>') +def get_list(server_ip, list_id, list_name): + server_ip = common.is_ip_or_dns(server_ip) + list_name = common.checkAjaxInput(list_name) + + return runtime.show_lists(server_ip, list_id, list_name) + + +@bp.route('/list/delete', methods=['POST']) +def delete_ip_from_list(): + ip_id = common.checkAjaxInput(request.form.get('list_ip_id_for_delete')) + ip = common.is_ip_or_dns(request.form.get('list_ip_for_delete')) + list_id = common.checkAjaxInput(request.form.get('list_id_for_delete')) + list_name = common.checkAjaxInput(request.form.get('list_name')) + + return runtime.delete_ip_from_list(serv, ip_id, ip, list_id, list_name) + + +@bp.route('/list/add', methods=['POST']) +def add_ip_to_list(): + ip = request.form.get('list_ip_for_add') + ip = ip.strip() + ip = common.is_ip_or_dns(ip) + list_id = common.checkAjaxInput(request.form.get('list_id_for_add')) + list_name = common.checkAjaxInput(request.form.get('list_name')) + + return runtime.add_ip_to_list(serv, ip, list_id, list_name) \ No newline at end of file diff --git a/app/routes/server/__init__.py b/app/routes/server/__init__.py new file mode 100644 index 00000000..ae27ba97 --- /dev/null +++ b/app/routes/server/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('server', __name__) + +from app.routes.server import routes diff --git a/app/routes/server/routes.py b/app/routes/server/routes.py new file mode 100644 index 00000000..2ba2785c --- /dev/null +++ b/app/routes/server/routes.py @@ -0,0 +1,462 @@ +import os +import sys +import json + +import distro +from flask import render_template, request +from flask_login import login_required + +from app import app, login_manager +from app.routes.server import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.roxywi.roxy as roxy +import modules.roxywi.group as group_mod +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common +import modules.roxy_wi_tools as roxy_wi_tools +import modules.server.ssh as ssh_mod +import modules.server.server as server_mod +import modules.tools.smon as smon_mod +import modules.service.backup as backup_mod + +get_config = roxy_wi_tools.GetConfigVar() +time_zone = sql.get_setting('time_zone') +get_date = roxy_wi_tools.GetDate(time_zone) +error_mess = roxywi_common.return_error_message() + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/check/ssh/<server_ip>') +def check_ssh(server_ip): + roxywi_auth.page_for_admin(level=2) + server_ip = common.is_ip_or_dns(server_ip) + + try: + return server_mod.ssh_command(server_ip, ["ls -1t"]) + except Exception as e: + return str(e) + + +@bp.route('/check/server/<server_ip>') +def check_server(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + return server_mod.server_is_up(server_ip) + + +@bp.route('/show/if/<server_ip>') +def show_if(server_ip): + roxywi_auth.page_for_admin(level=2) + server_ip = common.is_ip_or_dns(server_ip) + commands = ["sudo ip link|grep 'UP' |grep -v 'lo'| awk '{print $2}' |awk -F':' '{print $1}'"] + + return server_mod.ssh_command(server_ip, commands) + + +@bp.route('/create', methods=['POST']) +def create_server(): + roxywi_auth.page_for_admin(level=2) + hostname = common.checkAjaxInput(request.form.get('servername')) + ip = common.is_ip_or_dns(request.form.get('newip')) + group = common.checkAjaxInput(request.form.get('newservergroup')) + typeip = common.checkAjaxInput(request.form.get('typeip')) + haproxy = common.checkAjaxInput(request.form.get('haproxy')) + nginx = common.checkAjaxInput(request.form.get('nginx')) + apache = common.checkAjaxInput(request.form.get('apache')) + firewall = common.checkAjaxInput(request.form.get('firewall')) + enable = common.checkAjaxInput(request.form.get('enable')) + master = common.checkAjaxInput(request.form.get('slave')) + cred = common.checkAjaxInput(request.form.get('cred')) + page = common.checkAjaxInput(request.form.get('page')) + page = page.split("#")[0] + port = common.checkAjaxInput(request.form.get('newport')) + desc = common.checkAjaxInput(request.form.get('desc')) + add_to_smon = common.checkAjaxInput(request.form.get('add_to_smon')) + lang = roxywi_common.get_user_lang_for_flask() + + if ip == '': + return 'error: IP or DNS name is not valid' + try: + if server_mod.create_server(hostname, ip, group, typeip, enable, master, cred, port, desc, haproxy, nginx, + apache, firewall): + try: + user_subscription = roxywi_common.return_user_status() + 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 add_to_smon: + user_group = roxywi_common.get_user_group(id=1) + smon_mod.create_smon(hostname, ip, 0, 1, 0, 0, hostname, desc, 0, 0, 0, 56, 'ping', 0, 0, user_group, 0) + + roxywi_common.logging(ip, f'A new server {hostname} has been created', roxywi=1, login=1, keep_history=1, service='server') + + return render_template( + 'ajax/new_server.html', groups=sql.select_groups(), servers=sql.select_servers(server=ip), lang=lang, + masters=sql.select_servers(get_master_servers=1), sshs=sql.select_ssh(group=group), page=page, + user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], adding=1 + ) + except Exception as e: + return f'error: {e}' + + + +@bp.route('/create/after', methods=['POST']) +def after_add(): + hostname = common.checkAjaxInput(request.form.get('servername')) + ip = common.is_ip_or_dns(request.form.get('newip')) + scan_server = common.checkAjaxInput(request.form.get('scan_server')) + + try: + return server_mod.update_server_after_creating(hostname, ip, scan_server) + except Exception as e: + return str(e) + + +@bp.route('/update', methods=['POST']) +def update_server(): + roxywi_auth.page_for_admin(level=2) + name = request.form.get('updateserver') + group = request.form.get('servergroup') + typeip = request.form.get('typeip') + firewall = request.form.get('firewall') + enable = request.form.get('enable') + master = request.form.get('slave') + serv_id = request.form.get('id') + cred = request.form.get('cred') + port = request.form.get('port') + protected = request.form.get('protected') + desc = request.form.get('desc') + + if name is None or port is None: + return error_mess + else: + sql.update_server(name, group, typeip, enable, master, serv_id, cred, port, desc, firewall, protected) + roxywi_common.logging(f'The server {name}', ' has been updated ', roxywi=1, login=1) + server_ip = sql.select_server_ip_by_id(serv_id) + roxywi_common.logging(server_ip, f'The server {name} has been update', roxywi=1, login=1, keep_history=1, service='server') + + return 'ok' + + +@bp.route('/delete/<int:server_id>') +def delete_server(server_id): + roxywi_auth.page_for_admin(level=2) + return server_mod.delete_server(server_id) + + +@bp.route('/group/create', methods=['POST']) +def create_group(): + roxywi_auth.page_for_admin() + newgroup = common.checkAjaxInput(request.form.get('groupname')) + desc = common.checkAjaxInput(request.form.get('newdesc')) + if newgroup == '': + return error_mess + else: + try: + if sql.add_group(newgroup, desc): + roxywi_common.logging('Roxy-WI server', f'A new group {newgroup} has been created', roxywi=1, login=1) + return render_template('ajax/new_group.html', groups=sql.select_groups(group=newgroup)) + except Exception as e: + return str(e) + + +@bp.route('/group/update', methods=['POST']) +def update_group(): + roxywi_auth.page_for_admin() + name = common.checkAjaxInput(request.form.get('updategroup')) + desc = common.checkAjaxInput(request.form.get('descript')) + group_id = common.checkAjaxInput(request.form.get('id')) + + return group_mod.update_group(group_id, name, desc) + + +@bp.route('/group/delete/<int:group_id>') +def delete_group(group_id): + roxywi_auth.page_for_admin() + return group_mod.delete_group(group_id) + + +@bp.route('/ssh/create', methods=['POST']) +def create_ssh(): + roxywi_auth.page_for_admin(level=2) + return ssh_mod.create_ssh_cred() + + +@bp.route('/ssh/delete/<int:ssh_id>') +def delete_ssh(ssh_id): + roxywi_auth.page_for_admin(level=2) + return ssh_mod.delete_ssh_key(ssh_id) + + +@bp.route('/ssh/update', methods=['POST']) +def update_ssh(): + roxywi_auth.page_for_admin(level=2) + return ssh_mod.update_ssh_key() + + +@bp.route('/ssh/upload', methods=['POST']) +def upload_ssh_key(): + user_group = roxywi_common.get_user_group() + name = common.checkAjaxInput(request.form.get('name')) + key = request.form.get('ssh_cert') + + try: + return ssh_mod.upload_ssh_key(name, user_group, key) + except Exception as e: + return str(e) + + +@bp.app_template_filter('string_to_dict') +def string_to_dict(dict_string) -> dict: + from ast import literal_eval + return literal_eval(dict_string) + + +@bp.route('/system_info/get/<server_ip>/<int:server_id>') +def get_system_info(server_ip, server_id): + server_ip = common.is_ip_or_dns(server_ip) + + return server_mod.show_system_info(server_ip, server_id) + + +@bp.route('/system_info/update/<server_ip>/<int:server_id>') +def update_system_info(server_ip, server_id): + server_ip = common.is_ip_or_dns(server_ip) + + return server_mod.update_system_info(server_ip, server_id) + + +@bp.route('/tools') +def show_tools(): + roxywi_auth.page_for_admin() + lang = roxywi_common.get_user_lang_for_flask() + try: + services = roxy.get_services_status() + except Exception as e: + return str(e) + + return render_template('ajax/load_services.html', services=services, lang=lang) + + +@bp.route('/tools/update/<service>') +def update_tools(service): + roxywi_auth.page_for_admin() + + try: + return roxy.update_roxy_wi(service) + except Exception as e: + return f'error: {e}' + + +@bp.route('/tools/action/<service>/<action>') +def action_tools(service, action): + roxywi_auth.page_for_admin() + if action not in ('start', 'stop', 'restart'): + return 'error: wrong action' + + return roxy.action_service(action, service) + + +@bp.route('/update') +def update_roxywi(): + roxywi_auth.page_for_admin() + versions = roxy.versions() + checker_ver = roxy.check_new_version('checker') + smon_ver = roxy.check_new_version('smon') + metrics_ver = roxy.check_new_version('metrics') + keep_ver = roxy.check_new_version('keep_alive') + portscanner_ver = roxy.check_new_version('portscanner') + 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_for_flask() + + return render_template( + 'ajax/load_updateroxywi.html', services=services, versions=versions, checker_ver=checker_ver, smon_ver=smon_ver, + metrics_ver=metrics_ver, portscanner_ver=portscanner_ver, socket_ver=socket_ver, prometheus_exp_ver=prometheus_exp_ver, + keep_ver=keep_ver, lang=lang + ) + + +@bp.route('/openvpn') +def load_openvpn(): + roxywi_auth.page_for_admin() + openvpn_configs = '' + openvpn_sess = '' + openvpn = '' + + if distro.id() == 'ubuntu': + stdout, stderr = server_mod.subprocess_execute("apt show openvpn3 2>&1|grep E:") + elif distro.id() == 'centos' or distro.id() == 'rhel': + stdout, stderr = server_mod.subprocess_execute("rpm --query openvpn3-client") + + if ( + (stdout[0] != 'package openvpn3-client is not installed' and stderr != '/bin/sh: rpm: command not found') + and stdout[0] != 'E: No packages found' + ): + cmd = "sudo openvpn3 configs-list |grep -E 'ovpn|(^|[^0-9])[0-9]{4}($|[^0-9])' |grep -v net|awk -F\" \" '{print $1}'|awk 'ORS=NR%2?\" \":\"\\n\"'" + openvpn_configs, stderr = server_mod.subprocess_execute(cmd) + cmd = "sudo openvpn3 sessions-list|grep -E 'Config|Status'|awk -F\":\" '{print $2}'|awk 'ORS=NR%2?\" \":\"\\n\"'| sed 's/^ //g'" + openvpn_sess, stderr = server_mod.subprocess_execute(cmd) + openvpn = stdout[0] + + return render_template('ajax/load_openvpn.html', openvpn=openvpn, openvpn_sess=openvpn_sess, openvpn_configs=openvpn_configs) + + +@bp.post('/openvpn/upload') +def upload_openvpn(): + name = common.checkAjaxInput(request.form.get('ovpnname')) + + ovpn_file = f"{os.path.dirname('/tmp/')}/{name}.ovpn" + + try: + with open(ovpn_file, "w") as conf: + conf.write(request.form.get('uploadovpn')) + except IOError as e: + error = f'error: Cannot save ovpn file {e}' + roxywi_common.logging('Roxy-WI server', error, roxywi=1) + return error + + try: + cmd = 'sudo openvpn3 config-import --config %s --persistent' % ovpn_file + server_mod.subprocess_execute(cmd) + except IOError as e: + error = f'error: Cannot import OpenVPN file: {e}' + roxywi_common.logging('Roxy-WI server', error, roxywi=1) + return error + + try: + cmd = 'sudo cp %s /etc/openvpn3/%s.conf' % (ovpn_file, name) + server_mod.subprocess_execute(cmd) + except IOError as e: + error = f'error: Cannot save OpenVPN file: {e}' + roxywi_common.logging('Roxy-WI server', error, roxywi=1) + return error + + roxywi_common.logging("Roxy-WI server", f" has been uploaded a new ovpn file {ovpn_file}", roxywi=1, login=1) + + return 'success: ovpn file has been saved </div>' + + +@bp.post('/openvpn/delete') +def delete_openvpn(): + openvpndel = common.checkAjaxInput(request.form.get('openvpndel')) + + cmd = f'sudo openvpn3 config-remove --config /tmp/{openvpndel}.ovpn --force' + try: + server_mod.subprocess_execute(cmd) + roxywi_common.logging(openvpndel, ' has deleted the ovpn file ', roxywi=1, login=1) + except IOError as e: + error = f'error: Cannot delete OpenVPN file: {e}' + roxywi_common.logging('Roxy-WI server', error, roxywi=1) + return error + else: + return 'ok' + + +@bp.route('/openvpn/action/<action>/<openvpn>') +def action_openvpn(action, openvpn): + openvpn = common.checkAjaxInput(openvpn) + + if action == 'start': + cmd = f'sudo openvpn3 session-start --config /tmp/{openvpn}.ovpn' + elif action == 'restart': + cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --restart' + elif action == 'disconnect': + cmd = f'sudo openvpn3 session-manage --config /tmp/{openvpn}.ovpn --disconnect' + else: + return 'error: wrong action' + try: + server_mod.subprocess_execute(cmd) + roxywi_common.logging(openvpn, f' The ovpn session has been {action}ed ', roxywi=1, login=1) + return f"success: The {openvpn} has been {action}ed" + except IOError as e: + roxywi_common.logging('Roxy-WI server', e.args[0], roxywi=1) + return f'error: Cannot {action} OpenVPN: {e}' + + +@bp.route('/services/<int:server_id>', methods=['GET', 'POST']) +def show_server_services(server_id): + roxywi_auth.page_for_admin(level=2) + + if request.method == 'GET': + return server_mod.show_server_services(server_id) + else: + server_name = common.checkAjaxInput(request.form.get('changeServerServicesServer')) + server_services = json.loads(request.form.get('jsonDatas')) + + return server_mod.change_server_services(server_id, server_name, server_services) + + +@bp.route('/firewall/<server_ip>') +def show_firewall(server_ip): + roxywi_auth.page_for_admin(level=2) + + server_ip = common.is_ip_or_dns(server_ip) + + return server_mod.show_firewalld_rules(server_ip) + + +@bp.post('/backup/create') +@bp.post('/backup/delete') +@bp.post('/backup/update') +def create_backup(): + server = common.is_ip_or_dns(request.form.get('server')) + rpath = common.checkAjaxInput(request.form.get('rpath')) + time = common.checkAjaxInput(request.form.get('time')) + backup_type = common.checkAjaxInput(request.form.get('type')) + rserver = common.checkAjaxInput(request.form.get('rserver')) + cred = int(request.form.get('cred')) + deljob = common.checkAjaxInput(request.form.get('deljob')) + update = common.checkAjaxInput(request.form.get('backupupdate')) + description = common.checkAjaxInput(request.form.get('description')) + + try: + return backup_mod.backup(server, rpath, time, backup_type, rserver, cred, deljob, update, description) + except Exception as e: + return str(e) + + +@bp.post('/s3backup/create') +@bp.post('/s3backup/delete') +def create_s3_backup(): + server = common.is_ip_or_dns(request.form.get('s3_backup_server')) + s3_server = common.checkAjaxInput(request.form.get('s3_server')) + bucket = common.checkAjaxInput(request.form.get('s3_bucket')) + secret_key = common.checkAjaxInput(request.form.get('s3_secret_key')) + access_key = common.checkAjaxInput(request.form.get('s3_access_key')) + time = common.checkAjaxInput(request.form.get('time')) + deljob = common.checkAjaxInput(request.form.get('dels3job')) + description = common.checkAjaxInput(request.form.get('description')) + + try: + return backup_mod.s3_backup(server, s3_server, bucket, secret_key, access_key, time, deljob, description) + except Exception as e: + return str(e) + + +@bp.post('/git/create') +@bp.post('/git/delete') +def create_git_backup(): + server_id = request.form.get('server') + service_id = request.form.get('git_service') + git_init = request.form.get('git_init') + repo = request.form.get('git_repo') + branch = request.form.get('git_branch') + period = request.form.get('time') + cred = request.form.get('cred') + deljob = request.form.get('git_deljob') + description = request.form.get('description') + + return backup_mod.git_backup(server_id, service_id, git_init, repo, branch, period, cred, deljob, description) diff --git a/app/routes/service/__init__.py b/app/routes/service/__init__.py new file mode 100644 index 00000000..cb97bd9c --- /dev/null +++ b/app/routes/service/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('service', __name__) + +from app.routes.service import routes diff --git a/app/routes/service/routes.py b/app/routes/service/routes.py new file mode 100644 index 00000000..40296bff --- /dev/null +++ b/app/routes/service/routes.py @@ -0,0 +1,386 @@ +import os +import sys +from functools import wraps + +import distro +from flask import render_template, request, redirect, url_for, abort +from flask_login import login_required + +from app import app, login_manager, cache +from app.routes.service import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.server.server as server_mod +import modules.service.action as service_action +import modules.service.common as service_common +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common +import modules.roxywi.overview as roxy_overview + + +def check_services(fn): + @wraps(fn) + def decorated_view(*args, **kwargs): + service = kwargs['service'] + if service not in ('haproxy', 'nginx', 'apache', 'keepalived'): + abort(400, 'bad service') + return fn(*args, **kwargs) + return decorated_view + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/<service>', defaults={'serv': None}) +@bp.route('/<service>/<serv>') +@check_services +def services(service, serv): + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + services = [] + servers: object + autorefresh = 0 + waf_server = '' + cmd = "ps ax |grep -e 'keep_alive.py' |grep -v grep |wc -l" + keep_alive, stderr = server_mod.subprocess_execute(cmd) + + service_desc = sql.select_service(service) + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + if serv: + if roxywi_common.check_is_server_in_group(serv): + servers = sql.select_servers(server=serv) + autorefresh = 1 + waf_server = sql.select_waf_servers(serv) + server_id = sql.select_server_id_by_ip(serv) + docker_settings = sql.select_docker_service_settings(server_id, service_desc.slug) + restart_settings = sql.select_restart_service_settings(server_id, service_desc.slug) + else: + raise Exception('error: wrong group') + else: + servers = roxywi_common.get_dick_permit(virt=1, service=service_desc.slug) + docker_settings = sql.select_docker_services_settings(service_desc.slug) + restart_settings = sql.select_restart_services_settings(service_desc.slug) + + services_name = {'roxy-wi-checker': 'Master backends checker service', + 'roxy-wi-keep_alive': 'Auto start service', + 'roxy-wi-metrics': 'Master metrics service'} + for s, v in services_name.items(): + if distro.id() == 'ubuntu': + if s == 'roxy-wi-keep_alive': + s = 'roxy-wi-keep-alive' + cmd = "apt list --installed 2>&1 |grep " + s + else: + cmd = "rpm --query " + s + "-* |awk -F\"" + s + "\" '{print $2}' |awk -F\".noa\" '{print $1}' |sed 's/-//1' |sed 's/-/./'" + service_ver, stderr = server_mod.subprocess_execute(cmd) + try: + services.append([s, service_ver[0]]) + except Exception: + services.append([s, '']) + + haproxy_sock_port = sql.get_setting('haproxy_sock_port') + servers_with_status1 = [] + out1 = '' + if len(servers) == 1: + serv = servers[0][2] + for s in servers: + servers_with_status = list() + servers_with_status.append(s[0]) + servers_with_status.append(s[1]) + servers_with_status.append(s[2]) + servers_with_status.append(s[11]) + if service == 'nginx': + h = (['', ''],) + 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 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 = [ + "docker exec -it " + container_name + " /usr/sbin/nginx -v 2>&1|awk '{print $3}' && " + "docker ps -a -f name=" + container_name + " --format '{{.Status}}'|tail -1 && ps ax |grep nginx:" + "|grep -v grep |wc -l" + ] + try: + out = server_mod.ssh_command(s[2], cmd) + h = () + out1 = [] + for k in out.split(): + out1.append(k) + h = (out1,) + servers_with_status.append(h) + servers_with_status.append(h) + servers_with_status.append(s[17]) + except Exception: + servers_with_status.append(h) + servers_with_status.append(h) + servers_with_status.append(s[17]) + elif service == 'keepalived': + h = (['', ''],) + cmd = [ + "/usr/sbin/keepalived -v 2>&1|head -1|awk '{print $2}' && systemctl status keepalived |" + "grep -e 'Active' |awk '{print $2, $9$10$11$12$13}' && ps ax |grep keepalived|grep -v grep |wc -l" + ] + try: + out = server_mod.ssh_command(s[2], cmd) + out1 = [] + for k in out.split(): + out1.append(k) + h = (out1,) + servers_with_status.append(h) + servers_with_status.append(h) + servers_with_status.append(s[22]) + except Exception: + servers_with_status.append(h) + servers_with_status.append(h) + servers_with_status.append(s[22]) + elif service == 'apache': + h = (['', ''],) + apache_stats_user = sql.get_setting('apache_stats_user') + apache_stats_password = sql.get_setting('apache_stats_password') + apache_stats_port = sql.get_setting('apache_stats_port') + apache_stats_page = sql.get_setting('apache_stats_page') + cmd = "curl -s -u %s:%s http://%s:%s/%s?auto |grep 'ServerVersion\|Processes\|ServerUptime:'" % ( + apache_stats_user, apache_stats_password, s[2], apache_stats_port, apache_stats_page + ) + try: + out = server_mod.subprocess_execute(cmd) + if out != '': + for k in out: + servers_with_status.append(k) + servers_with_status.append(s[22]) + except Exception: + servers_with_status.append(h) + servers_with_status.append(h) + servers_with_status.append(s[22]) + else: + cmd = 'echo "show info" |nc %s %s -w 1 -v|grep -e "Ver\|Uptime:\|Process_num"' % (s[2], haproxy_sock_port) + out = server_mod.subprocess_execute(cmd) + + for k in out: + if "Connection refused" not in k: + out1 = out + else: + out1 = False + servers_with_status.append(out1) + + servers_with_status.append(s[12]) + + servers_with_status.append(sql.is_master(s[2])) + servers_with_status.append(sql.select_servers(server=s[2])) + + is_keepalived = sql.select_keepalived(s[2]) + + if is_keepalived: + try: + cmd = ['sudo kill -USR1 `cat /var/run/keepalived.pid` && sudo grep State /tmp/keepalived.data -m 1 |' + 'awk -F"=" \'{print $2}\'|tr -d \'[:space:]\' && sudo rm -f /tmp/keepalived.data'] + out = server_mod.ssh_command(s[2], cmd) + out1 = ('1', out) + servers_with_status.append(out1) + except Exception as e: + servers_with_status.append(str(e)) + else: + servers_with_status.append('') + + servers_with_status1.append(servers_with_status) + + user_subscription = roxywi_common.return_user_subscription() + + return render_template( + 'hapservers.html', h2=1, autorefresh=autorefresh, role=user_params['role'], user=user, servers=servers_with_status1, + keep_alive=''.join(keep_alive), serv=serv, service=service, services=services, user_services=user_params['user_services'], + docker_settings=docker_settings, user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], + waf_server=waf_server, restart_settings=restart_settings, service_desc=service_desc, token=user_params['token'], + lang=user_params['lang'] + ) + + +@bp.route('/action/check-service', methods=['POST']) +def check_service(): + user_uuid = request.cookies.get('uuid') + server_ip = common.checkAjaxInput(request.form.get('server_ip')) + service = common.checkAjaxInput(request.form.get('service')) + + return service_action.check_service(server_ip, user_uuid, service) + + +@bp.route('/action/<service>/<server_ip>/<action>', methods=['GET']) +@check_services +def action_service(service, server_ip, action): + server_ip = common.is_ip_or_dns(server_ip) + + return service_action.common_action(server_ip, action, service) + + +@bp.route('/<service>/<server_ip>/last-edit') +def last_edit(service, server_ip): + return service_common.get_overview_last_edit(server_ip, service) + + +@bp.route('/cpu-ram-metrics/<server_ip>/<server_id>/<name>/<service>') +def cpu_ram_metrics(server_ip, server_id, name, service): + user_params = roxywi_common.get_users_params() + + if service == 'haproxy': + cmd = 'echo "show info" |nc %s %s -w 1|grep -e "node\|Nbproc\|Maxco\|MB\|Nbthread"' % (server_ip, sql.get_setting('haproxy_sock_port')) + out = server_mod.subprocess_execute(cmd) + return_out = "" + + for k in out: + if "Ncat:" not in k: + for r in k: + return_out += r + return_out += "\n" + else: + return_out = "Cannot connect to HAProxy" + else: + return_out = '' + + server_status = (name, server_ip, return_out) + + servers = [] + user_id = request.cookies.get('uuid') + group_id = int(request.cookies.get('group')) + role = sql.get_user_role_by_uuid(user_id, group_id) + + servers.append(server_status) + servers_sorted = sorted(servers, key=common.get_key) + + return render_template('ajax/overviewServers.html', service_status=servers_sorted, role=role, id=server_id, service_page=service, + lang=user_params['lang']) + + +@bp.route('/haproxy/bytes', methods=['POST']) +def show_haproxy_bytes(): + server_ip = common.is_ip_or_dns(request.form.get('showBytes')) + + return roxy_overview.show_haproxy_binout(server_ip) + + +@bp.route('/nginx/connections', methods=['POST']) +def show_nginx_connections(): + server_ip = common.is_ip_or_dns(request.form.get('nginxConnections')) + + return roxy_overview.show_nginx_connections(server_ip) + + +@bp.route('/apache/bytes', methods=['POST']) +def show_apache_bytes(): + server_ip = common.is_ip_or_dns(request.form.get('apachekBytes')) + + return roxy_overview.show_apache_bytes(server_ip) + + +@bp.route('/keepalived/become-master', methods=['POST']) +@cache.cached() +def show_keepalived_become_master(): + server_ip = common.is_ip_or_dns(request.form.get('keepalivedBecameMaster')) + + return roxy_overview.keepalived_became_master(server_ip) + + +@bp.route('/<service>/backends/<server_ip>') +@cache.cached() +def show_service_backends(service, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + return service_common.overview_backends(server_ip, service) + + +@bp.route('/position/<int:server_id>/<int:pos>') +def change_pos(server_id, pos): + return sql.update_server_pos(pos, server_id) + + +@bp.route('/haproxy/version/<server_ip>') +def get_haproxy_v(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + return service_common.check_haproxy_version(server_ip) + + +@bp.route('/settings/<service>/<int:server_id>') +@check_services +def show_service_settings(service, server_id): + settings = sql.select_service_settings(server_id, service) + return render_template('ajax/service_settings.html', settings=settings, service=service) + + +@bp.post('/settings/<service>') +@check_services +def save_service_settings(service): + server_id = common.checkAjaxInput(request.form.get('serverSettingsSave')) + haproxy_enterprise = common.checkAjaxInput(request.form.get('serverSettingsEnterprise')) + service_dockerized = common.checkAjaxInput(request.form.get('serverSettingsDockerized')) + service_restart = common.checkAjaxInput(request.form.get('serverSettingsRestart')) + server_ip = sql.select_server_ip_by_id(server_id) + service_docker = f'Service {service.title()} has been flagged as a dockerized' + service_systemd = f'Service {service.title()} has been flagged as a system service' + disable_restart = f'Restart option is disabled for {service.title()} service' + enable_restart = f'Restart option is disabled for {service.title()} service' + + if service == 'haproxy': + if sql.insert_or_update_service_setting(server_id, service, 'haproxy_enterprise', haproxy_enterprise): + if haproxy_enterprise == '1': + roxywi_common.logging(server_ip, 'Service has been flagged as an Enterprise version', roxywi=1, login=1, + keep_history=1, service=service) + else: + roxywi_common.logging(server_ip, 'Service has been flagged as a community version', roxywi=1, login=1, + keep_history=1, service=service) + + if sql.insert_or_update_service_setting(server_id, service, 'dockerized', service_dockerized): + if service_dockerized == '1': + roxywi_common.logging(server_ip, service_docker, roxywi=1, login=1, keep_history=1, service=service) + else: + roxywi_common.logging(server_ip, service_systemd, roxywi=1, login=1, keep_history=1, service=service) + + if sql.insert_or_update_service_setting(server_id, service, 'restart', service_restart): + if service_restart == '1': + roxywi_common.logging(server_ip, disable_restart, roxywi=1, login=1, keep_history=1, service=service) + else: + roxywi_common.logging(server_ip, enable_restart, roxywi=1, login=1, keep_history=1, service=service) + + return 'ok' + + +@bp.post('/<service>/tools/update') +@check_services +def update_tools_enable(service): + server_id = request.form.get('server_id') + active = request.form.get('active') + name = request.form.get('name') + alert = request.form.get('alert_en') + metrics = request.form.get('metrics') + sql.update_hapwi_server(server_id, alert, metrics, active, service) + server_ip = sql.select_server_ip_by_id(server_id) + roxywi_common.logging(server_ip, f'The server {name} has been updated ', roxywi=1, login=1, keep_history=1, + service=service) + + return 'ok' + + +@bp.route('/check-restart/<server_ip>') +def check_restart(server_ip): + server_ip = common.is_ip_or_dns(server_ip) + servers = roxywi_common.get_dick_permit(ip=server_ip) + for server in servers: + if server != "": + return 'ok' + + return 'nothing' diff --git a/app/routes/smon/__init__.py b/app/routes/smon/__init__.py new file mode 100644 index 00000000..446c971a --- /dev/null +++ b/app/routes/smon/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('smon', __name__) + +from app.routes.smon import routes diff --git a/app/routes/smon/routes.py b/app/routes/smon/routes.py new file mode 100644 index 00000000..adc18d85 --- /dev/null +++ b/app/routes/smon/routes.py @@ -0,0 +1,276 @@ +import os +import sys + +from pytz import timezone +from flask import render_template, request, redirect, url_for, jsonify +from flask_login import login_required +from datetime import datetime, timedelta + +from app import app, login_manager +from app.routes.smon import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common +import modules.tools.smon as smon_mod + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/dashboard') +def smon(): + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + roxywi_common.check_user_group_for_flask() + + user_group = roxywi_common.get_user_group(id=1) + smon = sql.smon_list(user_group) + smon_status, stderr = smon_mod.return_smon_status() + user_subscription = roxywi_common.return_user_subscription() + + return render_template( + 'smon/dashboard.html', h2=1, autorefresh=1, role=user_params['role'], user=user, group=user_group, + lang=user_params['lang'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services'], + user_status=user_subscription['user_status'], smon=smon, user_plan=user_subscription['user_plan'], token=user_params['token'] + ) + + +@bp.route('/dashboard/<dashboard_id>/<check_id>') +def smon_dashboard(dashboard_id, check_id): + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + check_id = int(check_id) + roxywi_common.check_user_group_for_flask() + user_subscription = roxywi_common.return_user_subscription() + smon_name = sql.get_smon_service_name_by_id(dashboard_id) + check_interval = sql.get_setting('smon_check_interval') + smon = sql.select_one_smon(dashboard_id, check_id) + present = datetime.now(timezone('UTC')) + present = present.strftime('%b %d %H:%M:%S %Y %Z') + present = datetime.strptime(present, '%b %d %H:%M:%S %Y %Z') + cert_day_diff = 'N/A' + count_checks = sql.get_smon_history_count_checks(dashboard_id, check_id) + + try: + uptime = round(count_checks['up'] * 100 / count_checks['total'], 2) + except Exception: + uptime = 0 + try: + avg_res_time = round(sql.get_avg_resp_time(dashboard_id, check_id), 2) + except Exception: + avg_res_time = 0 + try: + last_resp_time = round(sql.get_last_smon_res_time_by_check(dashboard_id, check_id), 2) + except Exception: + last_resp_time = 0 + + for s in smon: + if s.smon_id.ssl_expire_date is not None: + ssl_expire_date = datetime.strptime(s.smon_id.ssl_expire_date, '%Y-%m-%d %H:%M:%S') + cert_day_diff = (ssl_expire_date - present).days + + return render_template( + 'include/smon/smon_history.html', h2=1, autorefresh=1, role=user_params['role'], user=user, smon=smon, + lang=user_params['lang'],user_status=user_subscription['user_status'], check_interval=check_interval, + user_plan=user_subscription['user_plan'], token=user_params['token'], uptime=uptime, avg_res_time=avg_res_time, + user_services=user_params['user_services'], smon_name=smon_name, cert_day_diff=cert_day_diff, check_id=check_id, + dashboard_id=dashboard_id, last_resp_time=last_resp_time + ) + + +@bp.route('/history') +def smon_history(): + roxywi_common.check_user_group_for_flask() + + user_group = roxywi_common.get_user_group(id=1) + smon_status, stderr = smon_mod.return_smon_status() + smon = sql.alerts_history('SMON', user_group) + user_subscription = roxywi_common.return_user_subscription() + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + return render_template( + 'smon/history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, smon=smon, + lang=user_params['lang'], user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], + token=user_params['token'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services'] + ) + + +@bp.route('/history/host/<server_ip>') +def smon_host_history(server_ip): + roxywi_common.check_user_group_for_flask() + + needed_host = common.is_ip_or_dns(server_ip) + user_group = roxywi_common.get_user_group(id=1) + smon_status, stderr = smon_mod.return_smon_status() + smon = sql.alerts_history('SMON', user_group, host=needed_host) + user_subscription = roxywi_common.return_user_subscription() + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + return render_template( + 'smon/history.html', h2=1, autorefresh=0, role=user_params['role'], user=user, smon=smon, + lang=user_params['lang'], user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], + token=user_params['token'], smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services'] + ) + + +@bp.route('/history/metric/<int:dashboard_id>/<int:check_id>') +def smon_history_metric(dashboard_id, check_id): + return jsonify(smon_mod.history_metrics(dashboard_id, check_id)) + + +@bp.route('/history/statuses/<int:dashboard_id>/<int:check_id>') +def smon_history_statuses(dashboard_id, check_id): + return smon_mod.history_statuses(dashboard_id, check_id) + + +@bp.route('/history/cur_status/<int:dashboard_id>/<int:check_id>') +def smon_history_cur_status(dashboard_id, check_id): + return smon_mod.history_cur_status(dashboard_id, check_id) + + +@bp.route('/admin') +def smon_admin(): + user_group = roxywi_common.get_user_group(id=1) + smon_status, stderr = smon_mod.return_smon_status() + telegrams = sql.get_user_telegram_by_group(user_group) + slacks = sql.get_user_slack_by_group(user_group) + pds = sql.get_user_pd_by_group(user_group) + smon = sql.select_smon(user_group) + smon_ping = sql.select_smon_ping(user_group) + smon_tcp = sql.select_smon_tcp(user_group) + smon_http = sql.select_smon_http(user_group) + smon_dns = sql.select_smon_dns(user_group) + roxywi_auth.page_for_admin(level=3) + user_subscription = roxywi_common.return_user_subscription() + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + return render_template( + 'smon/add.html', h2=1, autorefresh=0, role=user_params['role'], user=user, smon=smon, lang=user_params['lang'], + user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], token=user_params['token'], + smon_status=smon_status, smon_error=stderr, user_services=user_params['user_services'], telegrams=telegrams, + slacks=slacks, pds=pds, smon_ping=smon_ping, smon_tcp=smon_tcp, smon_http=smon_http, smon_dns=smon_dns + ) + + +@bp.post('/add') +def smon_add(): + user_group = roxywi_common.get_user_group(id=1) + name = common.checkAjaxInput(request.form.get('newsmonname')) + hostname = common.checkAjaxInput(request.form.get('newsmon')) + port = common.checkAjaxInput(request.form.get('newsmonport')) + enable = common.checkAjaxInput(request.form.get('newsmonenable')) + url = common.checkAjaxInput(request.form.get('newsmonurl')) + body = common.checkAjaxInput(request.form.get('newsmonbody')) + group = common.checkAjaxInput(request.form.get('newsmongroup')) + desc = common.checkAjaxInput(request.form.get('newsmondescription')) + telegram = common.checkAjaxInput(request.form.get('newsmontelegram')) + slack = common.checkAjaxInput(request.form.get('newsmonslack')) + pd = common.checkAjaxInput(request.form.get('newsmonpd')) + check_type = common.checkAjaxInput(request.form.get('newsmonchecktype')) + resolver = common.checkAjaxInput(request.form.get('newsmonresserver')) + record_type = common.checkAjaxInput(request.form.get('newsmondns_record_type')) + packet_size = common.checkAjaxInput(request.form.get('newsmonpacket_size')) + http_method = common.checkAjaxInput(request.form.get('newsmon_http_method')) + lang = roxywi_common.get_user_lang() + + try: + last_id = smon_mod.create_smon( + name, hostname, port, enable, url, body, group, desc, telegram, slack, pd, packet_size, check_type, + resolver, record_type, user_group, http_method + ) + except Exception as e: + return str(e), 200 + else: + if last_id: + smon = sql.select_smon_by_id(last_id) + pds = sql.get_user_pd_by_group(user_group) + slacks = sql.get_user_slack_by_group(user_group) + telegrams = sql.get_user_telegram_by_group(user_group) + smon_service = sql.select_smon_check_by_id(last_id, check_type) + + return render_template( + 'ajax/smon/show_new_smon.html', smon=smon, telegrams=telegrams, slacks=slacks, pds=pds, lang=lang, + check_type=check_type, smon_service=smon_service + ) + + +@bp.post('/update/<smon_id>') +def smon_update(smon_id): + roxywi_common.check_user_group_for_flask() + name = common.checkAjaxInput(request.form.get('updateSmonName')) + ip = common.checkAjaxInput(request.form.get('updateSmonIp')) + port = common.checkAjaxInput(request.form.get('updateSmonPort')) + en = common.checkAjaxInput(request.form.get('updateSmonEn')) + url = common.checkAjaxInput(request.form.get('updateSmonUrl')) + body = common.checkAjaxInput(request.form.get('updateSmonBody')) + telegram = common.checkAjaxInput(request.form.get('updateSmonTelegram')) + slack = common.checkAjaxInput(request.form.get('updateSmonSlack')) + pd = common.checkAjaxInput(request.form.get('updateSmonPD')) + group = common.checkAjaxInput(request.form.get('updateSmonGroup')) + desc = common.checkAjaxInput(request.form.get('updateSmonDesc')) + check_type = common.checkAjaxInput(request.form.get('check_type')) + resolver = common.checkAjaxInput(request.form.get('updateSmonResServer')) + record_type = common.checkAjaxInput(request.form.get('updateSmonRecordType')) + packet_size = common.checkAjaxInput(request.form.get('updateSmonPacket_size')) + http_method = common.checkAjaxInput(request.form.get('updateSmon_http_method')) + + if roxywi_common.check_user_group_for_flask(): + try: + status = smon_mod.update_smon( + smon_id, name, ip, port, en, url, body, telegram, slack, pd, group, desc, check_type, + resolver, record_type, packet_size, http_method + ) + except Exception as e: + return f'{e}', 200 + else: + return status + + +@bp.route('/delete/<smon_id>') +def smon_delete(smon_id): + user_group = roxywi_common.get_user_group(id=1) + + if roxywi_common.check_user_group_for_flask(): + try: + status = smon_mod.delete_smon(smon_id, user_group) + except Exception as e: + return f'{e}', 200 + else: + return status + + +@bp.post('/refresh') +def smon_show(): + sort = common.checkAjaxInput(request.form.get('sort')) + return smon_mod.show_smon(sort) diff --git a/app/routes/user/__init__.py b/app/routes/user/__init__.py new file mode 100644 index 00000000..3a4d49c5 --- /dev/null +++ b/app/routes/user/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('user', __name__) + +from app.routes.user import routes diff --git a/app/routes/user/routes.py b/app/routes/user/routes.py new file mode 100644 index 00000000..8ac43fb3 --- /dev/null +++ b/app/routes/user/routes.py @@ -0,0 +1,149 @@ +import os +import sys +import json + +from flask import render_template, request +from flask_login import login_required + +from app import app, login_manager +from app.routes.user import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +import modules.common.common as common +import modules.roxywi.user as roxywi_user +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.post('/create') +def create_user(): + roxywi_auth.page_for_admin(level=2) + email = common.checkAjaxInput(request.form.get('newemail')) + password = common.checkAjaxInput(request.form.get('newpassword')) + role = common.checkAjaxInput(request.form.get('newrole')) + new_user = common.checkAjaxInput(request.form.get('newusername')) + page = common.checkAjaxInput(request.form.get('page')) + activeuser = common.checkAjaxInput(request.form.get('activeuser')) + group = common.checkAjaxInput(request.form.get('newgroupuser')) + token = common.checkAjaxInput(request.form.get('token')) + lang = roxywi_common.get_user_lang_for_flask() + + if not roxywi_common.check_user_group_for_flask(token=token): + return 'error: Wrong group' + if page == 'servers': + if roxywi_auth.is_admin(level=2, role_id=role): + roxywi_common.logging(new_user, ' tried to privilege escalation: user creation', roxywi=1, login=1) + return 'error: Wrong role' + if roxywi_user.create_user(new_user, email, password, role, activeuser, group): + return render_template( + 'ajax/new_user.html', users=sql.select_users(user=new_user), groups=sql.select_groups(), page=page, + roles=sql.select_roles(), adding=1, lang=lang + ) + + +@bp.post('/update') +def update_user(): + roxywi_auth.page_for_admin(level=2) + email = request.form.get('email') + new_user = request.form.get('updateuser') + user_id = request.form.get('id') + enabled = request.form.get('activeuser') + group_id = int(request.form.get('usergroup')) + + if roxywi_common.check_user_group_for_flask(): + if request.form.get('role'): + role_id = int(request.form.get('role')) + if roxywi_auth.is_admin(level=role_id): + roxywi_user.update_user(email, new_user, user_id, enabled, group_id, role_id) + else: + roxywi_common.logging(new_user, ' tried to privilege escalation', roxywi=1, login=1) + return 'error: dalsd' + else: + try: + sql.update_user_from_admin_area(new_user, email, user_id, enabled) + except Exception as e: + return f'error: Cannot update user: {e}' + roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1) + + return 'ok' + + +@bp.route('/delete/<int:user_id>') +def delete_user(user_id): + roxywi_auth.page_for_admin(level=2) + try: + return roxywi_user.delete_user(user_id) + except Exception as e: + return f'error: {e}' + + +@bp.route('/ldap/<username>') +def get_ldap_email(username): + roxywi_auth.page_for_admin(level=2) + + return roxywi_user.get_ldap_email(username) + + +@bp.post('/password') +def update_password(): + password = request.form.get('updatepassowrd') + uuid = request.form.get('uuid') + user_id_from_get = request.form.get('id') + + return roxywi_user.update_user_password(password, uuid, user_id_from_get) + + +@bp.route('/services/<int:user_id>', methods=['GET', 'POST']) +def show_user_services(user_id): + if request.method == 'GET': + return roxywi_user.get_user_services(user_id) + else: + user = common.checkAjaxInput(request.form.get('changeUserServicesUser')) + user_services = json.loads(request.form.get('jsonDatas')) + + return roxywi_user.change_user_services(user, user_id, user_services) + + +@bp.route('/group/current') +def get_current_group(): + uuid = request.cookies.get('uuid') + group = request.cookies.get('group') + + return roxywi_user.get_user_active_group(uuid, group) + + +@bp.post('/group/change') +def change_current_group(): + group_id = common.checkAjaxInput(request.form.get('changeUserCurrentGroupId')) + user_uuid = common.checkAjaxInput(request.form.get('changeUserGroupsUser')) + + return roxywi_user.change_user_active_group(group_id, user_uuid) + + +@bp.route('/groups/<int:user_id>') +def show_user_groups_and_roles(user_id): + lang = roxywi_common.get_user_lang_for_flask() + + return roxywi_user.show_user_groups_and_roles(user_id, lang) + + +@bp.post('/groups/save') +def change_user_groups_and_roles(): + user = common.checkAjaxInput(request.form.get('changeUserGroupsUser')) + groups_and_roles = json.loads(request.form.get('jsonDatas')) + + return roxywi_user.save_user_group_and_role(user, groups_and_roles) + + +@bp.route('/group/name/<int:group_id>') +def get_group_name_by_id(group_id): + return sql.get_group_name_by_id(group_id) diff --git a/app/routes/waf/__init__.py b/app/routes/waf/__init__.py new file mode 100644 index 00000000..dbe6c950 --- /dev/null +++ b/app/routes/waf/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('waf', __name__) + +from app.routes.waf import routes diff --git a/app/routes/waf/routes.py b/app/routes/waf/routes.py new file mode 100644 index 00000000..43f186ee --- /dev/null +++ b/app/routes/waf/routes.py @@ -0,0 +1,219 @@ +import os +import sys + +from flask import render_template, request +from flask_login import login_required + +from app import app, login_manager +from app.routes.waf import bp + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +from modules.db.db_model import * +import modules.common.common as common +import modules.roxy_wi_tools as roxy_wi_tools +import modules.roxywi.waf as roxy_waf +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common +import modules.config.config as config_mod + +get_config = roxy_wi_tools.GetConfigVar() +time_zone = sql.get_setting('time_zone') +get_date = roxy_wi_tools.GetDate(time_zone) + + +@bp.route('/<service>') +@login_required +def waf(service): + roxywi_auth.page_for_admin(level=2) + + manage_rules = '' + waf_rule_id = '' + config_file_name = '' + waf_rule_file = '' + config_read = '' + rules = '' + serv = '' + cfg = '' + user_params = roxywi_common.get_users_params() + + if service == 'nginx': + roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2) + servers = roxywi_common.get_dick_permit(nginx=1) + else: + roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) + servers = user_params['servers'] + + title = "Web application firewall" + servers_waf = sql.select_waf_servers_metrics(user_params['user_uuid']) + autorefresh = 1 + + return render_template( + 'waf.html', + h2=1, title=title, autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], serv=serv, + servers=servers_waf, + servers_all=servers, manage_rules=manage_rules, rules=rules, user_services=user_params['user_services'], + waf_rule_file=waf_rule_file, waf_rule_id=waf_rule_id, config=config_read, cfg=cfg, token=user_params['token'], + config_file_name=config_file_name, service=service, lang=user_params['lang'] + ) + + +@bp.route('/<service>/<server_ip>/rules') +@login_required +def waf_rules(service, server_ip): + roxywi_auth.page_for_admin(level=2) + roxywi_common.check_is_server_in_group(server_ip) + + manage_rules = '1' + waf_rule_id = '' + config_file_name = '' + waf_rule_file = '' + servers_waf = '' + config_read = '' + servers = '' + cfg = '' + user_params = roxywi_common.get_users_params() + title = "Manage rules - Web application firewall" + rules = sql.select_waf_rules(server_ip, service) + + if service == 'nginx': + roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2) + else: + roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) + + return render_template( + 'waf.html', + h2=1, title=title, autorefresh=0, role=user_params['role'], user=user_params['user'], serv=server_ip, + servers=servers_waf, + servers_all=servers, manage_rules=manage_rules, rules=rules, user_services=user_params['user_services'], + waf_rule_file=waf_rule_file, waf_rule_id=waf_rule_id, config=config_read, cfg=cfg, token=user_params['token'], + config_file_name=config_file_name, service=service, lang=user_params['lang'] + ) + + +@bp.route('/<service>/<server_ip>/rule/<rule_id>') +@login_required +def waf_rule_edit(service, server_ip, rule_id): + roxywi_auth.page_for_admin(level=2) + roxywi_common.check_is_server_in_group(server_ip) + + manage_rules = '' + servers_waf = '' + config_read = '' + servers = '' + user_params = roxywi_common.get_users_params() + rules = sql.select_waf_rules(server_ip, service) + + if service == 'nginx': + roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2) + config_path = sql.get_setting('nginx_dir') + else: + roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) + config_path = sql.get_setting('haproxy_dir') + + title = 'Edit a WAF rule' + waf_rule_file = sql.select_waf_rule_by_id(rule_id) + configs_dir = sql.get_setting('tmp_config_path') + cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}-{waf_rule_file}" + error = config_mod.get_config(server_ip, cfg, waf=service, waf_rule_file=waf_rule_file) + config_file_name = common.return_nice_path(config_path) + 'waf/rules/' + waf_rule_file + + try: + conf = open(cfg, "r") + config_read = conf.read() + conf.close() + except IOError: + print('Cannot read imported config file') + + return render_template( + 'waf.html', + h2=1, title=title, autorefresh=0, role=user_params['role'], user=user_params['user'], serv=server_ip, + servers=servers_waf, + servers_all=servers, manage_rules=manage_rules, rules=rules, user_services=user_params['user_services'], + waf_rule_file=waf_rule_file, waf_rule_id=rule_id, config=config_read, cfg=cfg, token=user_params['token'], + config_file_name=config_file_name, service=service, lang=user_params['lang'] + ) + + +@bp.route('/<service>/<server_ip>/rule/<rule_id>/save', methods=['POST']) +@login_required +def waf_save_config(service, server_ip, rule_id): + roxywi_auth.page_for_admin(level=2) + roxywi_common.check_is_server_in_group(server_ip) + + configs_dir = sql.get_setting('tmp_config_path') + cfg = f"{configs_dir}{server_ip}-{get_date.return_date('config')}" + config_file_name = request.form.get('config_file_name') + config = request.form.get('config') + oldcfg = request.form.get('oldconfig') + save = request.form.get('save') + + try: + with open(cfg, "a") as conf: + conf.write(config) + except IOError: + print("error: Cannot read imported config file") + + stderr = config_mod.master_slave_upload_and_restart(server_ip, cfg, save, 'waf', oldcfg=oldcfg, config_file_name=config_file_name) + + config_mod.diff_config(oldcfg, cfg) + + try: + os.system(f"/bin/rm -f {configs_dir}*.old") + except Exception as e: + return f'error: {e}' + + if stderr: + return stderr + + return + + +@bp.route('/<server_ip>/rule/<int:rule_id>/<int:enable>') +@login_required +def enable_rule(server_ip, rule_id, enable): + server_ip = common.is_ip_or_dns(server_ip) + + return roxy_waf.switch_waf_rule(server_ip, enable, rule_id) + + +@bp.route('/<service>/<server_ip>/rule/create', methods=['POST']) +@login_required +def create_rule(service, server_ip): + if service not in ('haproxy', 'nginx'): + return 'error: Wrong service' + + server_ip = common.is_ip_or_dns(server_ip) + + return roxy_waf.create_waf_rule(server_ip, service) + + +@bp.route('/<service>/mode/<server_name>/<waf_mode>') +@login_required +def change_waf_mode(service, server_name, waf_mode): + if service not in ('haproxy', 'nginx'): + return 'error: Wrong service' + + server_name = common.checkAjaxInput(server_name) + waf_mode = common.checkAjaxInput(waf_mode) + + return roxy_waf.change_waf_mode(waf_mode, server_name, service) + + +@bp.route('/overview/<service>/<server_ip>') +@login_required +def overview_waf(service, server_ip): + server_ip = common.is_ip_or_dns(server_ip) + + if service not in ('haproxy', 'nginx'): + return 'error: Wrong service' + + return roxy_waf.waf_overview(server_ip, service) + + +@bp.route('/metric/enable/<int:enable>/<server_name>') +@login_required +def enable_metric(enable, server_name): + server_name = common.checkAjaxInput(server_name) + return sql.update_waf_metrics_enable(server_name, enable) diff --git a/app/runtimeapi.py b/app/runtimeapi.py deleted file mode 100644 index 1fc76e5d..00000000 --- a/app/runtimeapi.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python3 -import sys - -import modules.common.common as common -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -from jinja2 import Environment, FileSystemLoader -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('runtimeapi.html') - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params(virt=1, haproxy=1) - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) -except Exception as e: - print(f'error {e}') - sys.exit() - -form = common.form -servbackend = form.getvalue('servbackend') -serv = form.getvalue('serv') -if servbackend is None: - servbackend = "" - -rendered_template = template.render( - h2=1, title="RunTime API", role=user_params['role'], user=user_params['user'], select_id="serv", - selects=user_params['servers'], token=user_params['token'], user_services=user_params['user_services'], - servbackend=servbackend, lang=user_params['lang'] -) -print(rendered_template) diff --git a/app/scripts/backup.sh b/app/scripts/backup.sh index 4759b2c1..cc685016 100644 --- a/app/scripts/backup.sh +++ b/app/scripts/backup.sh @@ -12,8 +12,8 @@ do SERVER) SERVER=${VALUE} ;; USER) USER=${VALUE} ;; KEY) KEY=${VALUE} ;; - DELJOB) DELJOB=${VALUE} ;; - SSH_PORT) SSH_PORT=${VALUE} ;; + DELJOB) DELJOB=${VALUE} ;; + SSH_PORT) SSH_PORT=${VALUE} ;; *) esac done @@ -24,8 +24,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo '[backup]' > $PWD/$HOST echo "$HOST ansible_port=$SSH_PORT" >> $PWD/$HOST echo '[haproxy_wi]' >> $PWD/$HOST diff --git a/app/scripts/git_backup.sh b/app/scripts/git_backup.sh index fc744409..181a5cd6 100644 --- a/app/scripts/git_backup.sh +++ b/app/scripts/git_backup.sh @@ -27,11 +27,9 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" >> $PWD/$HOST - ansible-playbook $PWD/roles/git_backup.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST DELJOB=$DELJOB SERVICE=$SERVICE INIT=$INIT REPO=$REPO BRANCH=$BRANCH PERIOD=$PERIOD CONFIG_DIR=$CONFIG_DIR PROXY=$PROXY KEY=$KEY" -i $PWD/$HOST if [ $? -gt 0 ] diff --git a/app/scripts/install_apache.sh b/app/scripts/install_apache.sh index ce937918..32dbd21f 100644 --- a/app/scripts/install_apache.sh +++ b/app/scripts/install_apache.sh @@ -36,8 +36,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then diff --git a/app/scripts/install_apache_exporter.sh b/app/scripts/install_apache_exporter.sh index 4f3feaff..455b47cf 100644 --- a/app/scripts/install_apache_exporter.sh +++ b/app/scripts/install_apache_exporter.sh @@ -27,8 +27,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then diff --git a/app/scripts/install_grafana.sh b/app/scripts/install_grafana.sh index 0f1cba70..6083a1c9 100644 --- a/app/scripts/install_grafana.sh +++ b/app/scripts/install_grafana.sh @@ -32,8 +32,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ ansible-playbook $PWD/roles/grafana.yml -e "PROXY=$PROXY" diff --git a/app/scripts/install_haproxy_exporter.sh b/app/scripts/install_haproxy_exporter.sh index 92859ca4..689c78b0 100644 --- a/app/scripts/install_haproxy_exporter.sh +++ b/app/scripts/install_haproxy_exporter.sh @@ -38,8 +38,7 @@ export ANSIBLE_HOST_KEY_CHECKING=False export ANSIBLE_DISPLAY_SKIPPED_HOSTS=False export ACTION_WARNINGS=False export ANSIBLE_DEPRECATION_WARNINGS=False -PWD=$(pwd) -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > "$PWD"/"$HOST" if [[ $KEY == "" ]]; then diff --git a/app/scripts/install_haproxy_geoip.sh b/app/scripts/install_haproxy_geoip.sh index d85203a4..c9b066a0 100644 --- a/app/scripts/install_haproxy_geoip.sh +++ b/app/scripts/install_haproxy_geoip.sh @@ -24,8 +24,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=$(pwd) -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $maxmind_key == "" ]]; then diff --git a/app/scripts/install_keepalived_exporter.sh b/app/scripts/install_keepalived_exporter.sh index f6e20670..56be5da2 100644 --- a/app/scripts/install_keepalived_exporter.sh +++ b/app/scripts/install_keepalived_exporter.sh @@ -23,8 +23,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then diff --git a/app/scripts/install_nginx_exporter.sh b/app/scripts/install_nginx_exporter.sh index 2b46b975..4b522a8e 100644 --- a/app/scripts/install_nginx_exporter.sh +++ b/app/scripts/install_nginx_exporter.sh @@ -40,8 +40,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then diff --git a/app/scripts/install_nginx_geoip.sh b/app/scripts/install_nginx_geoip.sh index 4fb251bb..fbb0a05f 100644 --- a/app/scripts/install_nginx_geoip.sh +++ b/app/scripts/install_nginx_geoip.sh @@ -24,8 +24,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=$(pwd) -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $maxmind_key == "" ]]; then diff --git a/app/scripts/install_node_exporter.sh b/app/scripts/install_node_exporter.sh index 015bd1a9..201f7a8f 100644 --- a/app/scripts/install_node_exporter.sh +++ b/app/scripts/install_node_exporter.sh @@ -23,8 +23,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then diff --git a/app/scripts/letsencrypt.sh b/app/scripts/letsencrypt.sh index 139b7d8e..cc6c11d4 100644 --- a/app/scripts/letsencrypt.sh +++ b/app/scripts/letsencrypt.sh @@ -25,8 +25,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then diff --git a/app/scripts/s3_backup.sh b/app/scripts/s3_backup.sh index 3f80acd2..8827d2e3 100644 --- a/app/scripts/s3_backup.sh +++ b/app/scripts/s3_backup.sh @@ -22,8 +22,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=`pwd` -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ ansible-playbook $PWD/roles/s3_backup.yml -e "SERVER=$SERVER S3_SERVER=$S3_SERVER BUCKET=$BUCKET SECRET_KEY=$SECRET_KEY ACCESS_KEY=$ACCESS_KEY TIME=$TIME" -t $TAG -i $PWD/$HOST diff --git a/app/scripts/waf.sh b/app/scripts/waf.sh index a839365e..eb4bda01 100644 --- a/app/scripts/waf.sh +++ b/app/scripts/waf.sh @@ -31,8 +31,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=$(pwd) -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then diff --git a/app/scripts/waf_nginx.sh b/app/scripts/waf_nginx.sh index 5f3adb63..31b7a9ef 100644 --- a/app/scripts/waf_nginx.sh +++ b/app/scripts/waf_nginx.sh @@ -24,8 +24,7 @@ export ACTION_WARNINGS=False export LOCALHOST_WARNING=False export COMMAND_WARNINGS=False -PWD=$(pwd) -PWD=$PWD/scripts/ansible/ +PWD=/var/www/haproxy-wi/app/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then diff --git a/app/sections.py b/app/sections.py deleted file mode 100644 index 98ef83f5..00000000 --- a/app/sections.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python3 -import os -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.roxywi.common as roxywi_common -import modules.config.section as section_mod -import modules.config.config as config_mod -import modules.roxy_wi_tools as roxy_wi_tools - -time_zone = sql.get_setting('time_zone') -get_date = roxy_wi_tools.GetDate(time_zone) -get_config_var = roxy_wi_tools.GetConfigVar() -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True, extensions=['jinja2.ext.loopcontrols']) -template = env.get_template('sections.html') - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params() - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) -except Exception as e: - print(f'error {e}') - sys.exit() - -form = common.form -serv = form.getvalue('serv') -section = form.getvalue('section') -is_serv_protected = sql.is_serv_protected(serv) -sections = "" -config_read = "" -cfg = "" -stderr = "" -error = "" -aftersave = "" -start_line = "" -end_line = "" -warning = '' -is_restart = '' - -hap_configs_dir = get_config_var.get_config_var('configs', 'haproxy_save_configs_dir') - -if serv is not None and open is not None: - cfg = f"{hap_configs_dir}{serv}-{get_date.return_date('config')}.cfg" - error = config_mod.get_config(serv, cfg) - sections = section_mod.get_sections(cfg) - -if serv is not None and section is not None: - - try: - roxywi_common.logging(serv, "sections.py open config") - except Exception: - pass - - start_line, end_line, config_read = section_mod.get_section_from_config(cfg, section) - server_id = sql.select_server_id_by_ip(serv) - is_restart = sql.select_service_setting(server_id, 'haproxy', 'restart') - - os.system(f"/bin/mv {cfg} {cfg}.old") - -if serv is not None and form.getvalue('config') is not None: - try: - roxywi_common.logging(serv, "sections.py edited config") - except Exception: - pass - - config = form.getvalue('config') - oldcfg = form.getvalue('oldconfig') - save = form.getvalue('save') - start_line = form.getvalue('start_line') - end_line = form.getvalue('end_line') - aftersave = 1 - - if save == 'delete': - config = '' - save = 'reload' - - config = section_mod.rewrite_section(start_line, end_line, oldcfg, config) - - try: - with open(cfg, "w") as conf: - conf.write(config) - except IOError: - error = "Can't read import config file" - - stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, oldcfg=oldcfg) - - if "is valid" in stderr: - warning = stderr - stderr = '' - - config_mod.diff_config(oldcfg, cfg) - - os.system(f"/bin/rm -f {hap_configs_dir}*.old") - -if user_params['lang'] == 'ru': - title = 'Работа с секциями HAProxy' -elif user_params['lang'] == 'fr': - title = 'Utilisation des sections de configuration HAProxy' -else: - title = 'Working with HAProxy config sections' - -rendered_template = template.render( - 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, lang=user_params['lang'] -) -print(rendered_template) diff --git a/app/servers.py b/app/servers.py deleted file mode 100644 index 64e9bb79..00000000 --- a/app/servers.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -import sys - -import pytz - -import modules.db.sql as sql -import modules.common.common as common -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -from jinja2 import Environment, FileSystemLoader -env = Environment(extensions=["jinja2.ext.do"], loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('servers.html') -form = common.form - -print('Content-type: text/html\n') -user_params = roxywi_common.get_users_params() - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) -except Exception: - print('error: your session is expired') - sys.exit() - -roxywi_auth.page_for_admin(level=2) - -ldap_enable = sql.get_setting('ldap_enable') -user_group = roxywi_common.get_user_group(id=1) -settings = sql.get_setting('', all=1) -geoip_country_codes = sql.select_geoip_country_codes() -services = sql.select_services() -gits = sql.select_gits() -servers = roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1) -masters = sql.select_servers(get_master_servers=1, uuid=user_params['user_uuid'].value) -is_needed_tool = common.is_tool('ansible') -user_roles = sql.select_user_roles_by_group(user_group) -backups = sql.select_backups() -s3_backups = sql.select_s3_backups() - -try: - user_subscription = roxywi_common.return_user_status() -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( - h2=1, title=title, role=user_params['role'], user=user_params['user'], users=sql.select_users(group=user_group), - groups=sql.select_groups(), servers=servers, roles=sql.select_roles(), sshs=sql.select_ssh(group=user_group), - masters=masters, group=user_group, services=services, timezones=pytz.all_timezones, guide_me=1, - token=user_params['token'], settings=settings, backups=backups, s3_backups=s3_backups, page="servers.py", - 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, lang=user_params['lang'], user_roles=user_roles -) -print(rendered_template) diff --git a/app/smon.py b/app/smon.py deleted file mode 100644 index 247457d0..00000000 --- a/app/smon.py +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env python3 -import sys - -from datetime import datetime -from pytz import timezone -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.roxywi.common as roxywi_common -import modules.server.server as server_mod - -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('smon.html') - -print('Content-type: text/html\n') -user_params = roxywi_common.get_users_params() - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) -except Exception as e: - print(f'error {e}') - sys.exit() - -roxywi_common.check_user_group() -form = common.form -action = form.getvalue('action') -sort = form.getvalue('sort') -autorefresh = 0 -lang = user_params['lang'] -telegrams = '' -slacks = '' -pds = '' -user_group = roxywi_common.get_user_group(id=1) -cmd = "systemctl is-active roxy-wi-smon" -smon_status, stderr = server_mod.subprocess_execute(cmd) -smon_statuses = '' -smon_ping = '' -smon_tcp = '' -smon_http = '' -smon_dns = '' -smon = '' - -try: - user_subscription = roxywi_common.return_user_status() -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 action == 'add': - telegrams = sql.get_user_telegram_by_group(user_group) - slacks = sql.get_user_slack_by_group(user_group) - pds = sql.get_user_pd_by_group(user_group) - smon = sql.select_smon(user_group) - smon_ping = sql.select_smon_ping(user_group) - smon_tcp = sql.select_smon_tcp(user_group) - smon_http = sql.select_smon_http(user_group) - smon_dns = sql.select_smon_dns(user_group) - roxywi_auth.page_for_admin(level=3) - if lang == 'ru': - title = "SMON: Админка" - elif lang == 'fr': - title = "SMON: Administratrice" - 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) - if lang == 'ru': - title = "SMON: История" - elif lang == 'fr': - title = "SMON: Histoire" - else: - title = "SMON: History" -elif action == 'checker_history': - smon = sql.alerts_history('Checker', user_group) - if lang == 'ru': - title = "Checker: История" - elif lang == 'fr': - title = "Checker: Histoire" - else: - title = "Checker: History" -elif action == 'dashboard': - dashboard_id = int(form.getvalue('dashboard_id')) - check_id = int(form.getvalue('check_id')) - smon_name = sql.get_smon_service_name_by_id(dashboard_id) - check_interval = sql.get_setting('smon_check_interval') - smon = sql.select_one_smon(dashboard_id, check_id) - present = datetime.now(timezone('UTC')) - present = present.strftime('%b %d %H:%M:%S %Y %Z') - present = datetime.strptime(present, '%b %d %H:%M:%S %Y %Z') - cert_day_diff = 'N/A' - count_checks = sql.get_smon_history_count_checks(dashboard_id, check_id) - try: - uptime = round(count_checks['up'] * 100 / count_checks['total'], 2) - except Exception: - uptime = 0 - try: - avg_res_time = round(sql.get_avg_resp_time(dashboard_id, check_id), 2) - except Exception: - avg_res_time = 0 - try: - last_resp_time = round(sql.get_last_smon_res_time_by_check(dashboard_id, check_id), 2) - except Exception: - last_resp_time = 0 - template = env.get_template('include/smon/smon_history.html') - - for s in smon: - if s.smon_id.ssl_expire_date is not None: - ssl_expire_date = datetime.strptime(s.smon_id.ssl_expire_date, '%Y-%m-%d %H:%M:%S') - cert_day_diff = (ssl_expire_date - present).days - - rendered_template = template.render( - h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], smon=smon, group=user_group, lang=lang, - user_status=user_subscription['user_status'], check_interval=check_interval, user_plan=user_subscription['user_plan'], - token=user_params['token'], uptime=uptime, user_services=user_params['user_services'], avg_res_time=avg_res_time, - smon_name=smon_name, cert_day_diff=cert_day_diff, check_id=check_id, dashboard_id=dashboard_id, last_resp_time=last_resp_time - ) - print(rendered_template) - sys.exit() -else: - smon = sql.smon_list(user_group) - if lang == 'ru': - title = "SMON: Дашборд" - elif lang == 'fr': - title = "SMON: Tableau de bord" - else: - title = "SMON: Dashboard" - autorefresh = 1 - -rendered_template = template.render( - h2=1, title=title, autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], group=user_group, - telegrams=telegrams, slacks=slacks, pds=pds, 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'], smon_ping=smon_ping, smon_tcp=smon_tcp, - smon_http=smon_http, smon_dns=smon_dns - -) -print(rendered_template) diff --git a/inc/images/favicon/android-icon-144x144.png b/app/static/images/favicon/android-icon-144x144.png similarity index 100% rename from inc/images/favicon/android-icon-144x144.png rename to app/static/images/favicon/android-icon-144x144.png diff --git a/inc/images/favicon/android-icon-192x192.png b/app/static/images/favicon/android-icon-192x192.png similarity index 100% rename from inc/images/favicon/android-icon-192x192.png rename to app/static/images/favicon/android-icon-192x192.png diff --git a/inc/images/favicon/android-icon-36x36.png b/app/static/images/favicon/android-icon-36x36.png similarity index 100% rename from inc/images/favicon/android-icon-36x36.png rename to app/static/images/favicon/android-icon-36x36.png diff --git a/inc/images/favicon/android-icon-48x48.png b/app/static/images/favicon/android-icon-48x48.png similarity index 100% rename from inc/images/favicon/android-icon-48x48.png rename to app/static/images/favicon/android-icon-48x48.png diff --git a/inc/images/favicon/android-icon-72x72.png b/app/static/images/favicon/android-icon-72x72.png similarity index 100% rename from inc/images/favicon/android-icon-72x72.png rename to app/static/images/favicon/android-icon-72x72.png diff --git a/inc/images/favicon/android-icon-96x96.png b/app/static/images/favicon/android-icon-96x96.png similarity index 100% rename from inc/images/favicon/android-icon-96x96.png rename to app/static/images/favicon/android-icon-96x96.png diff --git a/inc/images/favicon/apple-icon-114x114.png b/app/static/images/favicon/apple-icon-114x114.png similarity index 100% rename from inc/images/favicon/apple-icon-114x114.png rename to app/static/images/favicon/apple-icon-114x114.png diff --git a/inc/images/favicon/apple-icon-120x120.png b/app/static/images/favicon/apple-icon-120x120.png similarity index 100% rename from inc/images/favicon/apple-icon-120x120.png rename to app/static/images/favicon/apple-icon-120x120.png diff --git a/inc/images/favicon/apple-icon-144x144.png b/app/static/images/favicon/apple-icon-144x144.png similarity index 100% rename from inc/images/favicon/apple-icon-144x144.png rename to app/static/images/favicon/apple-icon-144x144.png diff --git a/inc/images/favicon/apple-icon-152x152.png b/app/static/images/favicon/apple-icon-152x152.png similarity index 100% rename from inc/images/favicon/apple-icon-152x152.png rename to app/static/images/favicon/apple-icon-152x152.png diff --git a/inc/images/favicon/apple-icon-180x180.png b/app/static/images/favicon/apple-icon-180x180.png similarity index 100% rename from inc/images/favicon/apple-icon-180x180.png rename to app/static/images/favicon/apple-icon-180x180.png diff --git a/inc/images/favicon/apple-icon-57x57.png b/app/static/images/favicon/apple-icon-57x57.png similarity index 100% rename from inc/images/favicon/apple-icon-57x57.png rename to app/static/images/favicon/apple-icon-57x57.png diff --git a/inc/images/favicon/apple-icon-60x60.png b/app/static/images/favicon/apple-icon-60x60.png similarity index 100% rename from inc/images/favicon/apple-icon-60x60.png rename to app/static/images/favicon/apple-icon-60x60.png diff --git a/inc/images/favicon/apple-icon-72x72.png b/app/static/images/favicon/apple-icon-72x72.png similarity index 100% rename from inc/images/favicon/apple-icon-72x72.png rename to app/static/images/favicon/apple-icon-72x72.png diff --git a/inc/images/favicon/apple-icon-76x76.png b/app/static/images/favicon/apple-icon-76x76.png similarity index 100% rename from inc/images/favicon/apple-icon-76x76.png rename to app/static/images/favicon/apple-icon-76x76.png diff --git a/inc/images/favicon/apple-icon-precomposed.png b/app/static/images/favicon/apple-icon-precomposed.png similarity index 100% rename from inc/images/favicon/apple-icon-precomposed.png rename to app/static/images/favicon/apple-icon-precomposed.png diff --git a/inc/images/favicon/apple-icon.png b/app/static/images/favicon/apple-icon.png similarity index 100% rename from inc/images/favicon/apple-icon.png rename to app/static/images/favicon/apple-icon.png diff --git a/inc/images/favicon/browserconfig.xml b/app/static/images/favicon/browserconfig.xml similarity index 100% rename from inc/images/favicon/browserconfig.xml rename to app/static/images/favicon/browserconfig.xml diff --git a/inc/images/favicon/favicon-16x16.png b/app/static/images/favicon/favicon-16x16.png similarity index 100% rename from inc/images/favicon/favicon-16x16.png rename to app/static/images/favicon/favicon-16x16.png diff --git a/inc/images/favicon/favicon-32x32.png b/app/static/images/favicon/favicon-32x32.png similarity index 100% rename from inc/images/favicon/favicon-32x32.png rename to app/static/images/favicon/favicon-32x32.png diff --git a/inc/images/favicon/favicon-96x96.png b/app/static/images/favicon/favicon-96x96.png similarity index 100% rename from inc/images/favicon/favicon-96x96.png rename to app/static/images/favicon/favicon-96x96.png diff --git a/inc/images/favicon/favicon.ico b/app/static/images/favicon/favicon.ico similarity index 100% rename from inc/images/favicon/favicon.ico rename to app/static/images/favicon/favicon.ico diff --git a/inc/images/favicon/manifest.json b/app/static/images/favicon/manifest.json similarity index 100% rename from inc/images/favicon/manifest.json rename to app/static/images/favicon/manifest.json diff --git a/inc/images/favicon/ms-icon-144x144.png b/app/static/images/favicon/ms-icon-144x144.png similarity index 100% rename from inc/images/favicon/ms-icon-144x144.png rename to app/static/images/favicon/ms-icon-144x144.png diff --git a/inc/images/favicon/ms-icon-150x150.png b/app/static/images/favicon/ms-icon-150x150.png similarity index 100% rename from inc/images/favicon/ms-icon-150x150.png rename to app/static/images/favicon/ms-icon-150x150.png diff --git a/inc/images/favicon/ms-icon-310x310.png b/app/static/images/favicon/ms-icon-310x310.png similarity index 100% rename from inc/images/favicon/ms-icon-310x310.png rename to app/static/images/favicon/ms-icon-310x310.png diff --git a/inc/images/favicon/ms-icon-70x70.png b/app/static/images/favicon/ms-icon-70x70.png similarity index 100% rename from inc/images/favicon/ms-icon-70x70.png rename to app/static/images/favicon/ms-icon-70x70.png diff --git a/inc/images/loading.gif b/app/static/images/loading.gif similarity index 100% rename from inc/images/loading.gif rename to app/static/images/loading.gif diff --git a/inc/images/logo_footer.png b/app/static/images/logo_footer.png similarity index 100% rename from inc/images/logo_footer.png rename to app/static/images/logo_footer.png diff --git a/inc/images/logo_index.png b/app/static/images/logo_index.png similarity index 100% rename from inc/images/logo_index.png rename to app/static/images/logo_index.png diff --git a/inc/images/logo_login.png b/app/static/images/logo_login.png similarity index 100% rename from inc/images/logo_login.png rename to app/static/images/logo_login.png diff --git a/inc/images/logo_menu.png b/app/static/images/logo_menu.png similarity index 100% rename from inc/images/logo_menu.png rename to app/static/images/logo_menu.png diff --git a/inc/images/no_servers.png b/app/static/images/no_servers.png similarity index 100% rename from inc/images/no_servers.png rename to app/static/images/no_servers.png diff --git a/inc/images/oops.png b/app/static/images/oops.png similarity index 100% rename from inc/images/oops.png rename to app/static/images/oops.png diff --git a/app/statsview.py b/app/statsview.py deleted file mode 100644 index 674e1141..00000000 --- a/app/statsview.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 -import modules.db.sql as sql -import modules.common.common as common -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -from jinja2 import Environment, FileSystemLoader -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('statsview.html') -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params(virt=1, haproxy=1) - -form = common.form -serv = form.getvalue('serv') -service = form.getvalue('service') - -try: - if serv is None: - first_serv = user_params['servers'] - for i in first_serv: - serv = i[2] - break -except Exception: - pass - -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): - servers = roxywi_common.get_dick_permit(service=service_desc.slug) -else: - print('<meta http-equiv="refresh" content="0; url=/app/overview.py">') - - - -rendered_template = template.render( - h2=1, autorefresh=1, role=user_params['role'], user=user_params['user'], onclick="showStats()", - selects=servers, serv=serv, service=service, user_services=user_params['user_services'], - token=user_params['token'], select_id="serv", lang=user_params['lang'], service_desc=service_desc -) -print(rendered_template) diff --git a/app/templates/404.html b/app/templates/404.html index 25b38d4a..b1b19bec 100644 --- a/app/templates/404.html +++ b/app/templates/404.html @@ -1,65 +1,5 @@ -<html lang="en"> -<head> - <title>404 - Page not found - Roxy-WI</title> - <meta charset="UTF-8"> - <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> - <meta http-equiv="Pragma" content="no-cache" /> - <meta http-equiv="Expires" content="0" /> - <link href="/inc/images/favicon/favicon.ico" rel="icon" type="image/png" /> - <link rel="apple-touch-icon" sizes="57x57" href="/inc/images/favicon/inc/images/favicon/apple-icon-57x57.png"> - <link rel="apple-touch-icon" sizes="60x60" href="/inc/images/favicon/apple-icon-60x60.png"> - <link rel="apple-touch-icon" sizes="72x72" href="/inc/images/favicon/apple-icon-72x72.png"> - <link rel="apple-touch-icon" sizes="76x76" href="/inc/images/favicon/apple-icon-76x76.png"> - <link rel="apple-touch-icon" sizes="114x114" href="/inc/images/favicon/apple-icon-114x114.png"> - <link rel="apple-touch-icon" sizes="120x120" href="/inc/images/favicon/apple-icon-120x120.png"> - <link rel="apple-touch-icon" sizes="144x144" href="/inc/images/favicon/apple-icon-144x144.png"> - <link rel="apple-touch-icon" sizes="152x152" href="/inc/images/favicon/apple-icon-152x152.png"> - <link rel="apple-touch-icon" sizes="180x180" href="/inc/images/favicon/apple-icon-180x180.png"> - <link rel="icon" type="image/png" sizes="192x192" href="/inc/images/favicon/android-icon-192x192.png"> - <link rel="icon" type="image/png" sizes="32x32" href="/inc/images/favicon/favicon-32x32.png"> - <link rel="icon" type="image/png" sizes="96x96" href="/inc/images/favicon/favicon-96x96.png"> - <link rel="icon" type="image/png" sizes="16x16" href="/inc/images/favicon/favicon-16x16.png"> - <link rel="manifest" href="/inc/images/favicon/manifest.json"> - <meta name="msapplication-TileColor" content="#ffffff"> - <meta name="msapplication-TileImage" content="/inc/images/favicon/ms-icon-144x144.png"> - <meta name="theme-color" content="#ffffff"> - <script> - FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false }; - </script> - <script defer src="/inc/fa-solid.min.js"></script> - <script defer src="/inc/fontawesome.min.js"></script> - <script defer src="/inc/ion.sound.min.js"></script> - <link href="/inc/css/awesome-6.3.9.css" rel="stylesheet"> - <link href="/inc/css/style-6.3.9.css" rel="stylesheet"> - <link href="/inc/css/nprogress.css" rel="stylesheet"> - <link href="/inc/css/jquery-ui.css" rel="stylesheet"> - <script src="/inc/jquery-1.12.4.js"></script> - <script src="/inc/jquery-ui.js"></script> - <script src="/inc/js.cookie.min.js"></script> - <script src="/inc/script-6.3.9.js"></script> - <script src="/inc/nprogress.js"></script> - <link href="/inc/css/toastr.css" rel="stylesheet"/> - <script src="/inc/toastr.js"></script> -</head> -<body> - <div class="top-menu"> - <div class="LogoText"> - <span id="logo_text"> - <a href="https://roxy-wi.org" title="Roxy-WI site" target="_blank"> - <img src="/inc/images/logo_menu.png" alt="logo" width="110" /> - </a> - </span> - </div> - <div id="top-link" class="top-link"> - <nav id="menu"> - <ul class="menu"> - <li><a href="/app/overview.py" title="Server and service status" class="overview-link">Overview</a></li> - </ul> - </nav> - </div> - </div> - <div id="cover"></div> - <div class="container"> +{% extends "base.html" %} +{% block content %} <h2> 404 - Page not found </h2> @@ -75,37 +15,6 @@ <h4>Sorry, but page not found. Try another page</h4> </center> <div id="oops_div"> - <img src="/inc/images/oops.png" alt="Oops"> + <img src="{{ url_for('static', filename='images/oops.png')}}" alt="Oops"> </div> - </div> - <div class="footer"> - <a href="#" id="hide_menu" title="Hide menu" style="float: left;"> - <span class="ui-state-default ui-corner-all"> - <span class="ui-icon ui-icon-arrowthick-1-w" id="arrow"></span> - </span> - </a> - <div class="show_menu" style="display: none; float: left;"> - <a href="#" id="show_menu" title="Show menu"> - <span class="ui-state-default ui-corner-all"> - <span class="ui-icon ui-icon-arrowthick-1-e" id="arrow"></span> - </span> - </a> - </div> - <div id="logo_footer"> - <a href="https://roxy-wi.org" title="Roxy-WI official site" target="_blank"> - <img src="/inc/images/logo_footer.png" alt="logo" id="logo_footer_img" /> - </a> - </div> - <div class="footer-div"> - <a href="https://roxy-wi.org/cabinet.py" class="footer-link" target="_blank" title="Privet cabinet for donaters">Cabinet</a> - <a href="https://github.com/Aidaho12/haproxy-wi/issues" class="footer-link" target="_blank">Help</a> - <a href="https://roxy-wi.org/contacts.py" class="footer-link" target="_blank">Contact</a> - <a href="https://roxy-wi.org" class="footer-link" target="_blank" title="About Roxy-WI">About</a> - <a href="https://roxy-wi.org/cloud.py" class="footer-link" target="_blank" title="Roxy-WI Cloud">Cloud</a> - </div> - </div> - <div id="current-user-groups-dialog" style="display: none;"> - <div id="current-user-groups-form"></div> - </div> -</body> -</html> \ No newline at end of file +{% endblock %} diff --git a/app/templates/500.html b/app/templates/500.html index baae21ed..d67f014d 100644 --- a/app/templates/500.html +++ b/app/templates/500.html @@ -1,65 +1,5 @@ -<html lang="en"> -<head> - <title>500 - Internal error - Roxy-WI</title> - <meta charset="UTF-8"> - <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> - <meta http-equiv="Pragma" content="no-cache" /> - <meta http-equiv="Expires" content="0" /> - <link href="/inc/images/favicon/favicon.ico" rel="icon" type="image/png" /> - <link rel="apple-touch-icon" sizes="57x57" href="/inc/images/favicon/inc/images/favicon/apple-icon-57x57.png"> - <link rel="apple-touch-icon" sizes="60x60" href="/inc/images/favicon/apple-icon-60x60.png"> - <link rel="apple-touch-icon" sizes="72x72" href="/inc/images/favicon/apple-icon-72x72.png"> - <link rel="apple-touch-icon" sizes="76x76" href="/inc/images/favicon/apple-icon-76x76.png"> - <link rel="apple-touch-icon" sizes="114x114" href="/inc/images/favicon/apple-icon-114x114.png"> - <link rel="apple-touch-icon" sizes="120x120" href="/inc/images/favicon/apple-icon-120x120.png"> - <link rel="apple-touch-icon" sizes="144x144" href="/inc/images/favicon/apple-icon-144x144.png"> - <link rel="apple-touch-icon" sizes="152x152" href="/inc/images/favicon/apple-icon-152x152.png"> - <link rel="apple-touch-icon" sizes="180x180" href="/inc/images/favicon/apple-icon-180x180.png"> - <link rel="icon" type="image/png" sizes="192x192" href="/inc/images/favicon/android-icon-192x192.png"> - <link rel="icon" type="image/png" sizes="32x32" href="/inc/images/favicon/favicon-32x32.png"> - <link rel="icon" type="image/png" sizes="96x96" href="/inc/images/favicon/favicon-96x96.png"> - <link rel="icon" type="image/png" sizes="16x16" href="/inc/images/favicon/favicon-16x16.png"> - <link rel="manifest" href="/inc/images/favicon/manifest.json"> - <meta name="msapplication-TileColor" content="#ffffff"> - <meta name="msapplication-TileImage" content="/inc/images/favicon/ms-icon-144x144.png"> - <meta name="theme-color" content="#ffffff"> - <script> - FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false }; - </script> - <script defer src="/inc/fa-solid.min.js"></script> - <script defer src="/inc/fontawesome.min.js"></script> - <script defer src="/inc/ion.sound.min.js"></script> - <link href="/inc/css/awesome-6.3.9.css" rel="stylesheet"> - <link href="/inc/css/style-6.3.9.css" rel="stylesheet"> - <link href="/inc/css/nprogress.css" rel="stylesheet"> - <link href="/inc/css/jquery-ui.css" rel="stylesheet"> - <script src="/inc/jquery-1.12.4.js"></script> - <script src="/inc/jquery-ui.js"></script> - <script src="/inc/js.cookie.min.js"></script> - <script src="/inc/script-6.3.9.js"></script> - <script src="/inc/nprogress.js"></script> - <link href="/inc/css/toastr-6.3.9.css" rel="stylesheet"/> - <script src="/inc/toastr.js"></script> -</head> -<body> -<div class="top-menu"> - <div class="LogoText"> - <span id="logo_text"> - <a href="https://roxy-wi.org" title="Roxy-WI site" target="_blank"> - <img src="/inc/images/logo_menu.png" alt="logo" width="110" /> - </a> - </span> - </div> - <div id="top-link" class="top-link"> - <nav id="menu"> - <ul class="menu"> - <li><a href="/app/overview.py" title="Server and service status" class="overview-link">Overview</a></li> - </ul> - </nav> - </div> -</div> -<div id="cover"></div> -<div class="container"> +{% extends "base.html" %} +{% block content %} <h2> 500 - Internal error </h2> @@ -76,39 +16,9 @@ <a href="https://github.com/Aidaho12/haproxy-wi/issues" title="GitHub issues">create issue on GitHub</a> or write <a href="https://t.me/haproxy_wi" title="Roxy-WI chat">to the chat</a> </h4> + <div>Error: {{e}}</div> <div id="oops_div"> - <img src="/inc/images/oops.png" alt="Oops"> + <img src="{{ url_for('static', filename='images/oops.png')}}" alt="Oops"> </div> </center> -</div> -<div class="footer"> - <a href="#" id="hide_menu" title="Hide menu" style="float: left;"> - <span class="ui-state-default ui-corner-all"> - <span class="ui-icon ui-icon-arrowthick-1-w" id="arrow"></span> - </span> - </a> - <div class="show_menu" style="display: none; float: left;"> - <a href="#" id="show_menu" title="Show menu"> - <span class="ui-state-default ui-corner-all"> - <span class="ui-icon ui-icon-arrowthick-1-e" id="arrow"></span> - </span> - </a> - </div> - <div id="logo_footer"> - <a href="https://roxy-wi.org" title="Roxy-WI official site" target="_blank"> - <img src="/inc/images/logo_footer.png" alt="logo" id="logo_footer_img" /> - </a> - </div> - <div class="footer-div"> - <a href="https://roxy-wi.org/cabinet.py" class="footer-link" target="_blank" title="Privet cabinet for donaters">Cabinet</a> - <a href="https://github.com/Aidaho12/haproxy-wi/issues" class="footer-link" target="_blank">Help</a> - <a href="https://roxy-wi.org/contacts.py" class="footer-link" target="_blank">Contact</a> - <a href="https://roxy-wi.org" class="footer-link" target="_blank" title="About Roxy-WI">About</a> - <a href="https://roxy-wi.org/cloud.py" class="footer-link" target="_blank" title="Roxy-WI Cloud">Cloud</a> - </div> -</div> -<div id="current-user-groups-dialog" style="display: none;"> - <div id="current-user-groups-form"></div> -</div> -</body> -</html> \ No newline at end of file +{% endblock %} diff --git a/app/templates/add.html b/app/templates/add.html index 2c2d3a08..1f88c5d5 100644 --- a/app/templates/add.html +++ b/app/templates/add.html @@ -38,7 +38,7 @@ <ul id='browse_histroy'></ul> {% include 'include/add_proxy.html' %} <div id="listen"> - <form name="add-listener" id="add-listener" action="/app/add.py" method="post"> + <form name="add-listener" id="add-listener" action="/app/add/haproxy/add" method="post"> <table class="add-table"> <caption><h3>{{lang.words.add|title()}} {{lang.words.listener}}</h3></caption> <tr> @@ -903,7 +903,7 @@ </div> </div> <div id="userlist"> - <form name="add-userlist" id="add-userlist" action="/app/add.py" method="post"> + <form name="add-userlist" id="add-userlist" action="/app/add/haproxy/userlist" method="post"> <table> <caption><h3>{{lang.words.add|title()}} {{lang.words.userlists}}</h3></caption> <tr> @@ -996,7 +996,7 @@ </div> </div> <div id="peers"> - <form name="add-peers" id="add-peers" action="/app/add.py" method="post"> + <form name="add-peers" id="add-peers" action="/app/add/haproxy/peers" method="post"> <table> <caption><h3>{{lang.words.add|title()}} Peer</h3></caption> <tr> diff --git a/app/templates/add_nginx.html b/app/templates/add_nginx.html index 0bf933e2..ccf31416 100644 --- a/app/templates/add_nginx.html +++ b/app/templates/add_nginx.html @@ -14,7 +14,7 @@ <ul id='browse_histroy'></ul> {% include 'include/add_nginx_proxy.html' %} <div id="upstream"> - <form name="add-upstream" id="add-upstream" action="/app/add_nginx.py" method="post"> + <form name="add-upstream" id="add-upstream" action="/app/add/nginx/upstream" method="post"> <table class="add-table"> <caption><h3>{{lang.words.add|title()}} upstream</h3></caption> <tr> diff --git a/app/templates/admin.html b/app/templates/admin.html index 70deee32..c3d13dd9 100644 --- a/app/templates/admin.html +++ b/app/templates/admin.html @@ -12,12 +12,10 @@ <li><a href="#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups}} - Roxy-WI">{{lang.words.groups|title()}}</a></li> <li><a href="#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers}} - Roxy-WI">{{lang.words.servers|title()}}</a></li> <li><a href="#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds}} - Roxy-WI">SSH {{lang.words.creds}}</a></li> - <li><a href="#checker" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Checker - Roxy-WI">Checker</a></li> <li><a href="#openvpn" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} OpenVPN - Roxy-WI" id="admin-tabs-vpn">OpenVPN</a></li> <li><a href="#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings}} - Roxy-WI">{{lang.words.settings|title()}}</a></li> - <li><a href="#services" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.services}} - Roxy-WI">{{lang.words.services|title()}}</a></li> + <li><a href="#tools" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.tools}} - Roxy-WI">{{lang.words.tools|title()}}</a></li> <li><a href="#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI - Roxy-WI">{{lang.words.w_update|title()}}</a></li> - <li><a href="#installmon" title="{{lang.words.servers|title()}}: {{lang.words.monitoring|title()}} {{lang.words.service}} {{lang.words.installation}} - Roxy-WI" id="admin-tabs-mon">{{lang.words.monitoring|title()}} {{lang.words.installation}}</a></li> <li><a href="#backup" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.backup|title()}} {{lang.words.configs}} - Roxy-WI" id="admin-tabs-backup">{{lang.words.backup|title()}}</a></li> </ul> <div id="users"> @@ -76,8 +74,6 @@ <div id="ssh"> {% include 'include/admin_ssh.html' %} </div> - - <div id="checker"></div> <div id="openvpn"></div> @@ -85,7 +81,7 @@ {% include 'include/admin_settings.html' %} </div> - <div id="services"> + <div id="tools"> <table id="services_table" class="overview"> <thead> <tr class="overviewHead"> @@ -134,9 +130,6 @@ <div id="ajax-update"></div> </div> - <div id="installmon"> - {% include 'include/mon_installation.html' %} - </div> <div id="backup"> {% include 'include/admin_backup.html' %} </div> diff --git a/app/templates/ajax/check_version.html b/app/templates/ajax/check_version.html index f9e61871..08a574f4 100644 --- a/app/templates/ajax/check_version.html +++ b/app/templates/ajax/check_version.html @@ -10,9 +10,9 @@ <span id="show-updates-button" class="new-version-exists">v{{current_ver}}</span> <script defer src="/inc/fontawesome.min.js"></script> {%- else %} - <a href="/app/users.py#updatehapwi" title="Update center" style="color: black;">v{{current_ver}}</a> + <a href="/app/admin#updatehapwi" title="Update center" style="color: black;">v{{current_ver}}</a> {%- endif %} </a> {%- else %} - <a href="/app/users.py#updatehapwi" title="Update center" style="color: black;">v{{current_ver}}</a> + <a href="/app/admin#updatehapwi" title="Update center" style="color: black;">v{{current_ver}}</a> {% endif -%} diff --git a/app/templates/ajax/config_show.html b/app/templates/ajax/config_show.html index 1a16e4a2..807db6c3 100644 --- a/app/templates/ajax/config_show.html +++ b/app/templates/ajax/config_show.html @@ -4,11 +4,13 @@ <p class="accordion-expand-holder"> {% if role <= 3 %} {% if not is_serv_protected or role <= 2 %} - <a class="ui-button ui-widget ui-corner-all" title="Edit this run config" id="edit_link" href="config.py?service={{service}}&serv={{serv}}&open=open&config_file_name={{config_file_name}}">{{lang.words.edit|title()}}</a> + {% if not configver %} + <a class="ui-button ui-widget ui-corner-all" title="Edit this run config" id="edit_link" href="/app/config/{{service}}/{{serv}}/edit/{{config_file_name}}">{{lang.words.edit|title()}}</a> + {% endif %} {% if service == 'haproxy' %} - <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.add|title()}} {{lang.words.proxy}}" href="add.py#proxy">{{lang.words.add|title()}}</a> + <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.add|title()}} {{lang.words.proxy}}" href="/app/add/haproxy#proxy">{{lang.words.add|title()}}</a> {% elif service == 'keepalived' %} - <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.add|title()}} VRRP" href="ha.py">{{lang.words.add|title()}}</a> + <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.add|title()}} VRRP" href="/app/ha">{{lang.words.add|title()}}</a> {% endif %} {% endif %} {% endif %} @@ -209,7 +211,7 @@ {% if role %} {% if service != 'keepalived' %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}">{{lang.words.edit|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}</a> </span> {% endif %} {% endif %} @@ -220,7 +222,7 @@ </div><span class="param">{{ line }} {% if role %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}">{{lang.words.edit|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}</a> </span> {% endif %} </span><div> @@ -230,12 +232,12 @@ </div><span class="param">{{- line -}} {% if role %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}" target="_blank">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}" target="_blank">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> </span> {% endif %} {%- set backend = line.split(' ') -%} <span class="accordion-link"> - <a href="/app/statsview.py?service=haproxy&serv={{-serv-}}#{{- backend[1]-}}" target="_blank">{{lang.words.stats|title()}}</a> + <a href="/app/stats/haproxy/{{-serv-}}#{{- backend[1]-}}" target="_blank">{{lang.words.stats|title()}}</a> </span> {%- set backend = backend|join('_') -%} {%- do section_name.update({i: backend}) -%} @@ -247,12 +249,12 @@ </div><span class="param">{{ line }} {% if role %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> </span> {% endif %} {% set backend = line.split(' ') %} <span class="accordion-link"> - <a href="/app/statsview.py?serv={{serv}}#{{ backend[1]}}" target="_blank">{{lang.words.stats|title()}}</a> + <a href="/app/stats/haproxy/{{-serv-}}#{{- backend[1]-}}" target="_blank">{{lang.words.stats|title()}}</a> </span> {% set backend = backend|join('_') %} {% do section_name.update({i: backend}) %} @@ -264,12 +266,12 @@ </div><span class="param">{{ line }} {% if role %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> </span> {% endif %} {% set backend = line.split(' ') %} <span class="accordion-link"> - <a href="/app/statsview.py?serv={{serv}}#{{ backend[1]}}" target="_blank">{{lang.words.stats|title()}}</a> + <a href="/app/stats/haproxy/{{-serv-}}#{{- backend[1]-}}" target="_blank">{{lang.words.stats|title()}}</a> </span> </span><div> {% continue %} @@ -278,7 +280,7 @@ </div><span class="param">{{ line }} {% if role %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> </span> {% endif %} </span><div> @@ -288,7 +290,7 @@ </div><span class="param">{{ line }} {% if role %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> </span> {% endif %} </span><div> @@ -298,7 +300,7 @@ </div><span class="param">{{ line }} {% if role %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> </span> {% endif %} </span><div> @@ -308,7 +310,7 @@ </div><span class="param">{{ line }} {% if role %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> </span> {% endif %} </span><div> @@ -318,7 +320,7 @@ </div><span class="param">{{ line }} {% if role %} <span class="accordion-link"> - <a href="/app/sections.py?serv={{serv}}§ion={{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> + <a href="/app/config/section/haproxy/{{serv}}/{{ line }}">{{lang.words.edit|title()}}/{{lang.words.delete|title()}}</a> </span> {% endif %} </span><div> @@ -366,8 +368,9 @@ <br> {% if role <= 3 %} {% if not is_serv_protected or role <= 2 %} - <form action="versions.py?service={{service}}" method="post" class="left-space"> + <form action="/app/config/versions/{{service}}/{{serv}}/{{configver}}/save" method="post" class="left-space"> <input type="hidden" value="{{serv}}" name="serv"> + <input type="hidden" value="{{service}}" name="service"> <input type="hidden" value="{{configver}}" name="configver"> <input type="hidden" value="1" name="config"> <button type='submit' value='save' name='save' class='btn btn-default' title="{{lang.phrases.save_title}}">{{lang.words.save|title()}}</button> diff --git a/app/templates/ajax/firewall_rules.html b/app/templates/ajax/firewall_rules.html index 04f51c59..950c2601 100644 --- a/app/templates/ajax/firewall_rules.html +++ b/app/templates/ajax/firewall_rules.html @@ -18,7 +18,7 @@ </ul> <div id="input"> <table class="overview"> - {{thead}} + {{thead|safe}} <tbody> {% for p in input_chain %} <tr class="{{ loop.cycle('odd', 'even') }}"> @@ -47,7 +47,7 @@ </div> <div id="IN_public_allow"> <table class="overview"> - {{thead}} + {{thead|safe}} <tbody> {% for p in IN_public_allow %} <tr class="{{ loop.cycle('odd', 'even') }}"> @@ -76,7 +76,7 @@ </div> <div id="output"> <table class="overview"> - {{thead}} + {{thead|safe}} <tbody> {% for p in output_chain %} <tr class="{{ loop.cycle('odd', 'even') }}"> diff --git a/app/templates/ajax/haproxyservers_backends.html b/app/templates/ajax/haproxyservers_backends.html index 2252e8fa..8dfe51b2 100644 --- a/app/templates/ajax/haproxyservers_backends.html +++ b/app/templates/ajax/haproxyservers_backends.html @@ -1,3 +1,5 @@ +{% import 'languages/'+lang|default('en')+'.html' as lang %} +{% from 'languages/languages.html' import languages %} <style> .div-backends { height: auto !important; @@ -11,17 +13,17 @@ {% endif %} {% for b in backends %} {% if service == 'haproxy' %} - <a href="/app/sections.py?serv={{ serv}}§ion={{b}}" title="Edit backend {{b}}" target="_blank" style="padding-right: 10px;"> + <a href="/app/config/section/{{serv}}/{{b}}" title="{{lang.words.edit|title()}} {{lang.words.backend}} {{b}}" target="_blank" style="padding-right: 10px;"> {{b}} </a> {% elif service == 'nginx' or service == 'apache' %} {% set full_file = b.split(' ')[0] | replace ('/', '92') %} {% set full_file = full_file.replace(':', '') %} - <a href="/app/config.py?service={{ service }}&serv={{serv}}&open=open&config_file_name={{full_file}}" title="Edit config {{b.split(' ')[0]}}" target="_blank" style="padding-right: 10px;"> + <a href="/app/config/{{ service }}/{{serv}}/{{full_file}}" title="{{lang.words.edit|title()}} {{lang.words.config}} {{b.split(' ')[0]}}" target="_blank" style="padding-right: 10px;"> {{b.split(' ')[1] | replace(';', '')}} </a> {% else %} {{b}} {% endif %} {% endfor %} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/app/templates/ajax/load_telegram.html b/app/templates/ajax/load_telegram.html index fa73f1bc..67fcfd08 100644 --- a/app/templates/ajax/load_telegram.html +++ b/app/templates/ajax/load_telegram.html @@ -34,7 +34,7 @@ {{lang.words.token|title()}} </td> <td style="width: 20%;">{{lang.words.channel|title()}}</td> - {% if page != "servers.py" %} + {% if role|int() == 1 %} <td style="width: 25%;">{{lang.words.group|title()}}</td> {% endif %} <td style="width: 100%;"></td> @@ -51,7 +51,7 @@ {% set id = 'telegram-chanel-' + telegram.id|string() %} {{ input(id, value=telegram.chanel_name, size='30') }} </td> - {% if page != "servers.py" %} + {% if role|int() == 1 %} <td> <select id="telegramgroup-{{telegram.id}}" name="telegramgroup-{{telegram.id}}"> <option disabled selected>------</option> @@ -86,7 +86,7 @@ <span title="Token that has given with APP registration">{{lang.words.token|title()}}</span> </td> <td style="width: 20%;">{{lang.words.channel|title()}}</td> - {% if page != "servers.py" %} + {% if role|int() == 1 %} <td style="width: 25%;">{{lang.words.group|title()}}</td> {% endif %} <td style="width: 100%;"></td> @@ -103,7 +103,7 @@ {% set id = 'slack-chanel-' + slack.id|string() %} {{ input(id, value=slack.chanel_name, size='30') }} </td> - {% if page != "servers.py" %} + {% if role|int() == 1 %} <td> <select id="slackgroup-{{slack.id}}" name="slackgroup-{{slack.id}}"> <option disabled selected>------</option> @@ -138,7 +138,7 @@ {{lang.words.key|title()}} </td> <td style="width: 20%;">{{lang.words.name|title()}}</td> - {% if page != "servers.py" %} + {% if role|int() == 1 %} <td style="width: 25%;">{{lang.words.group|title()}}</td> {% endif %} <td style="width: 100%;"></td> @@ -155,7 +155,7 @@ {% set id = 'pd-chanel-' + pd.id|string() %} {{ input(id, value=pd.chanel_name, size='30') }} </td> - {% if page != "servers.py" %} + {% if role|int() == 1 %} <td> <select id="pdgroup-{{pd.id}}" name="pdgroup-{{pd.id}}"> <option disabled selected>------</option> @@ -212,9 +212,9 @@ <caption><i class="fas fa-network-wired caption-icon"></i><h3>HAProxy {{lang.words.servers}}</h3></caption> <tr class="overviewHead"> <td class="padding10 first-collumn">{{lang.words.server|title()}}</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram">Telegram</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack">Slack</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty">PagerDuty</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram" style="width: 15%;">Telegram</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack" style="width: 15%;">Slack</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty" style="width: 15%;">PagerDuty</td> <td class="checkbox-head" style="width: 10%;" title="{{lang.words.alert|title()}} {{lang.words.via}} {{lang.words.email}}">{{lang.words.email|title()}}</td> <td class="checkbox-head" style="width: 10%;" title="{{lang.phrases.alert_service_change_status}}">{{lang.words.service|title()}}</td> <td class="checkbox-head" style="width: 10%;" title="{{lang.phrases.alert_backend_change_status}}">{{lang.words.backend|title()}}</td> @@ -304,9 +304,9 @@ <caption><i class="fas fa-sitemap caption-icon"></i><h3>NGINX {{lang.words.servers}}</h3></caption> <tr class="overviewHead"> <td class="padding10 first-collumn">{{lang.words.server|title()}}</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram">Telegram</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack">Slack</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty">PagerDuty</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram" style="width: 15%;">Telegram</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack" style="width: 15%;">Slack</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty" style="width: 15%;">PagerDuty</td> <td class="checkbox-head" style="width: 10%;" title="{{lang.words.alert|title()}} {{lang.words.via}} {{lang.words.email}}">{{lang.words.email|title()}}</td> <td class="checkbox-head" style="width: 100%;" title={{lang.phrases.alert_service_change_status}}>{{lang.words.service|title()}}</td> <td><span onclick="loadchecker(1)" class="refresh" title="{{lang.words.refresh2|title()}}"></span></td> @@ -378,9 +378,9 @@ <caption><i class="fas fa-feather-alt caption-icon"></i><h3>Apache {{lang.words.servers}}</h3></caption> <tr class="overviewHead"> <td class="padding10 first-collumn">{{lang.words.server|title()}}</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram">Telegram</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack">Slack</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty">PagerDuty</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram" style="width: 15%;">Telegram</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack" style="width: 15%;">Slack</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty" style="width: 15%;">PagerDuty</td> <td class="checkbox-head" style="width: 10%;">{{lang.words.email|title()}}</td> <td class="checkbox-head" style="width: 100%;" title="{{lang.phrases.alert_service_change_status}}">{{lang.words.service|title()}}</td> <td><span onclick="loadchecker(1)" class="refresh" title="{{lang.words.refresh2|title()}}"></span></td> @@ -452,9 +452,9 @@ <caption><i class="fas fa-cloud caption-icon"></i><h3>Keepalived {{lang.words.servers}}</h3></caption> <tr class="overviewHead"> <td class="padding10 first-collumn">{{lang.words.server|title()}}</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram">Telegram</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack">Slack</td> - <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty">PagerDuty</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Telegram" style="width: 15%;">Telegram</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} Slack" style="width: 15%;">Slack</td> + <td class="first-collumn" title="{{lang.words.alert|title()}} {{lang.words.via}} PagerDuty" style="width: 15%;">PagerDuty</td> <td class="checkbox-head" style="width: 10%;">{{lang.words.email|title()}}</td> <td class="checkbox-head" style="width: 10%;" title="{{lang.phrases.alert_service_change_status}}">{{lang.words.service|title()}}</td> <td class="checkbox-head" style="width: 100%;" title="{{lang.phrases.alert_master_backup}}">{{lang.words.status|title()}}</td> @@ -537,3 +537,4 @@ {% endif %} {% endfor %} {% endif %} +{% include 'include/admins_dialogs.html' %} diff --git a/app/templates/ajax/new_option.html b/app/templates/ajax/new_option.html index 821f089e..2aa0ac3d 100644 --- a/app/templates/ajax/new_option.html +++ b/app/templates/ajax/new_option.html @@ -3,7 +3,7 @@ <td class="padding10 first-collumn"> {{ option.id }} </td> - <td class="first-collumn" style="width: 77%;"> + <td class="padding10 first-collumn" style="width: 77%;"> <input type="text" id="option-body-{{option.id}}" class="form-control" value="{{option.options}}" size="60"> </td> <td> diff --git a/app/templates/ajax/new_saved_servers.html b/app/templates/ajax/new_saved_servers.html index 33d0f4be..38883840 100644 --- a/app/templates/ajax/new_saved_servers.html +++ b/app/templates/ajax/new_saved_servers.html @@ -3,7 +3,7 @@ <td class="padding10 first-collumn"> <input type="text" id="servers-ip-{{s.id}}" class="form-control" value="{{s.server}}" size="15"> </td> - <td class="first-collumn" style="width: 77%;"> + <td class="padding10 first-collumn" style="width: 77%;"> <input type="text" id="servers-desc-{{s.id}}" class="form-control" value="{{s.description}}" size="50"> </td> <td> diff --git a/app/templates/ajax/overivewWaf.html b/app/templates/ajax/overivewWaf.html index 2eed0d45..8191b108 100644 --- a/app/templates/ajax/overivewWaf.html +++ b/app/templates/ajax/overivewWaf.html @@ -16,9 +16,7 @@ {% else %} <span class="serverDown server-status" title="WAF {{lang.words.is}} {{lang.words.stopped}} "></span> {% endif %} - <a href="/app/logs.py?serv={{ service.1 }}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00&waf=1" title="{{lang.words.view|title()}} {{service.0 }}'s WAF {{lang.words.logs}}" class="logs_link"> {{ service.0 }} - </a> {% else %} <span class="serverNone server-status" title="WAF {{lang.words.is}} {{lang.words.not}} {{lang.words.installed}}"></span> <span title="WAF {{lang.words.is}} {{lang.words.not}} {{lang.words.installed}}">{{ service.0 }}</span> {% endif %} @@ -70,14 +68,14 @@ {% endif %} <td> {% if role <= 2 %} - <a href="/app/waf.py?service={{waf_service}}&manage_rules=1&serv={{service.1}}" class="ui-button ui-widget ui-corner-all">{{lang.words.open|title()}}</a> + <a href="/app/waf/{{waf_service}}/{{service.1}}/rules" class="ui-button ui-widget ui-corner-all">{{lang.words.open|title()}}</a> {% endif %} </td> <td> {% if waf_service == 'haproxy' %} - <a href="/app/logs.py?service={{waf_service}}&serv={{ service.1 }}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00&waf=1" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.log}}">{{lang.words.view|title()}}</a> + <a href="/app/logs/{{waf_service}}/waf/{{ service.1 }}" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.log}}">{{lang.words.view|title()}}</a> {% elif waf_service == 'nginx' %} - <a href="/app/logs.py?service={{waf_service}}&serv={{ service.1 }}&rows=10&grep=ModSecurity&hour=00&minut=00&hour1=24&minut1=00&file=error.log&waf=0" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.log}}">{{lang.words.view|title()}}</a> + <a href="/app/logs/{{waf_service}}/?serv={{ service.1 }}&rows=100&grep=ModSecurity&hour=00&minute=00&hour1=24&minute1=00&file=error.log&waf=0" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.log}}">{{lang.words.view|title()}}</a> {% endif %} </td> <td></td> diff --git a/app/templates/ajax/overview.html b/app/templates/ajax/overview.html index 665e8746..0804ec07 100644 --- a/app/templates/ajax/overview.html +++ b/app/templates/ajax/overview.html @@ -1,7 +1,7 @@ {% import 'languages/'+lang|default('en')+'.html' as lang %} {% for service in service_status %} <td class="padding10 first-collumn"> - <a href="/app/history.py?service=server&serv={{ service.1 }}" title="{{service.0 }} history" class="logs_link"> + <a href="/app/history/server/{{ service.1 }}" title="{{service.0 }} history" class="logs_link"> {{ service.0 }} </a> </td> diff --git a/app/templates/ajax/overviewServers.html b/app/templates/ajax/overviewServers.html index aeeb32d4..24a0ecbf 100644 --- a/app/templates/ajax/overviewServers.html +++ b/app/templates/ajax/overviewServers.html @@ -31,4 +31,4 @@ </div> </div> </div> -{% endfor %} \ No newline at end of file +{% endfor %} diff --git a/app/templates/ajax/provisioning/aws_edit_dialog.html b/app/templates/ajax/provisioning/aws_edit_dialog.html deleted file mode 100644 index 7eb61ddf..00000000 --- a/app/templates/ajax/provisioning/aws_edit_dialog.html +++ /dev/null @@ -1,167 +0,0 @@ -{% import 'languages/'+lang|default('en')+'.html' as lang %} -{% from 'include/input_macros.html' import input, select, checkbox %} -{% from 'include/provisioning/variables.html' import generate_opt_options, get_nice_name %} -{% for s in server %} -<div id="aws_edit" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview provisioning_table"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td colspan="2" class="headers"> - <b>General information</b> - </td> - </tr> - <tr> - <td class="padding20"> - Server name - </td> - <td> - <span id="aws_edit_server_name">{{s.name}}</span> - </td> - </tr> - {{input('aws_edit_group', value=s.group_id, type='hidden')}} - {{input('aws_edit_id', value=s.id, type='hidden')}} - <tr> - <td class="padding20"> - Provider credentials - <span class="need-field">*</span> - </td> - <td> - <select id="aws_edit_id_provider"> - {% for p in providers %} - {% if p.2 == 'aws' %} - {% if s.provider_id|int() == p.id|int() %} - <option value="{{ p.id }}" selected>{{ p.name }}</option> - {% else %} - <option value="{{ p.id }}">{{ p.name }}</option> - {% endif %} - {% endif %} - {% endfor %} - </select> - </td> - </tr> - <tr> - <td class="padding20"> - Region - </td> - <td> - <span id="aws_edit_region" style="display: none;">{{s.region}}</span> - {% set id = 'aws_edit_region-'+s.id|string() %} - {{get_nice_name(id, s.region, 'aws', 'region', params)}} - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Instance</b> - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - Instance type - <span class="need-field">*</span> - </td> - <td> - {{input('aws_edit_size', size='26', value=s.instance_type)}} - <div class="tooltip tooltipTop tooltipTd"> - Instance types list is <a href="https://aws.amazon.com/ec2/instance-types/" title="Instance types list" target="_blank">here</a> - </div> - </td> - </tr> - <tr> - <td class="padding20"> - OS - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('aws_edit_oss', 'aws', 'image', params, first=s.os) }} - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - SSH key pair name - <span class="need-field">*</span> - </td> - <td> - {{input('aws_edit_ssh_name', size='26', value=s.ssh_key_name)}} - <div class="tooltip tooltipTop tooltipTd">The SSH key must exist in the region where the instance is being edited</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Volume</b> - </td> - </tr> - <tr> - <td class="padding20"> - Volume size - <span class="need-field">*</span> - </td> - <td> - {{input('aws_edit_volume_size', size='26', value=s.volume_size, type='number')}}Gb - </td> - </tr> - <tr> - <td class="padding20"> - Volume type - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('aws_edit_volume_type', 'aws', 'volume_type', params, first=s.volume_type) }} - </td> - </tr> - <tr> - <td class="padding20 padding-top20">Delete on termination</td> - <td> - {% set checked='checked' %} - {% if s.delete_on_termination == 'false' %} - {% set checked='' %} - {% endif %} - {{checkbox('aws_edit_delete_on_termination', checked=checked)}} - <div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Network</b> - </td> - </tr> - <tr> - <td class="padding20">Public IP</td> - <td> - <select id="aws_edit_public_ip"> - {% if s.public_ip == 'true' %} - <option value="public" selected>Public IP</option> - {% else %} - <option value="public">Public IP</option> - {% endif %} - {% if s.floating_ip == 'true' %} - <option value="elastic" selected>Elastic IP</option> - {% else %} - <option value="elastic">Elastic IP</option> - {% endif %} - {% if s.public_ip == 'false' and s.floating_ip == 'false' %} - <option value="none" selected>None</option> - {% else %} - <option value="none">None</option> - {% endif %} - </select> - </td> - </tr> - <tr> - {% set checked='checked' %} - {% if s.firewall == 'false' %} - {% set checked='' %} - {% endif %} - <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td> - <td> - {{checkbox('aws_edit_firewall', checked=checked)}} - <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise, all ports will be closed</div> - </td> - </tr> - <tr> - <td colspan="2"> - <p class="validateTips alert alert-warning">Be aware: some changes may cause server re-creation. And all your data will be lost</p> - </td> - </tr> - </table> -</div> -{% endfor %} diff --git a/app/templates/ajax/provisioning/do_edit_dialog.html b/app/templates/ajax/provisioning/do_edit_dialog.html deleted file mode 100644 index f0c04fbb..00000000 --- a/app/templates/ajax/provisioning/do_edit_dialog.html +++ /dev/null @@ -1,190 +0,0 @@ -{% import 'languages/'+lang|default('en')+'.html' as lang %} -{% from 'include/input_macros.html' import input, select, checkbox %} -{% from 'include/provisioning/variables.html' import get_nice_name, generate_opt_options %} -{% for s in server %} -{% set region_name = [] %} -<div id="do_edit" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview provisioning_table"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td colspan="2" class="headers"> - <b>General information</b> - </td> - </tr> - <tr> - <td class="padding20"> - Server name - </td> - <td> - <span id="do_edit_server_name">{{s.name}}</span> - </td> - </tr> - {{input('do_edit_group', value=s.group_id, type='hidden')}} - {{input('do_edit_id', value=s.id, type='hidden')}} - <tr> - <td class="padding20"> - Provider credentials - <span class="need-field">*</span> - </td> - <td> - <select id="do_edit_id_provider"> - {% for p in providers %} - {% if p.type == 'do' %} - {% if s.provider_id|int() == p.id|int() %} - <option value="{{ p.id }}" selected>{{ p.name }}</option> - {% else %} - <option value="{{ p.id }}">{{ p.name }}</option> - {% endif %} - {% endif %} - {% endfor %} - </select> - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - Region - </td> - <td> - {% set id = 'do_edit_regions-' + id|string() %} - {{ get_nice_name(id, 'do', 'region', params) }} - <span id="do_edit_regions" style="display: none;">{{s.region}}</span> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Instance</b> - </td> - </tr> - <tr> - <td class="padding20"> - Size - <span class="need-field">*</span> - </td> - <td>{{ generate_opt_options('do_edit_size', 'do', 'size', params, first=s.instance_type) }}</td> - </tr> - <tr> - <td class="padding20"> - OS - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('do_edit_oss', 'do', 'image', params, first=s.os) }} - </td> - </tr> - <tr> - <td class="padding20"> - SSH - <span class="need-field">*</span> - </td> - <td> - <select id="do_edit_ssh_choose"> - {% if s.ssh_key_name != none %} - <option value="ssh_name" selected>Set SSH key name</option> - {% else %} - <option value="ssh_name">Set SSH key name</option> - {% endif %} - {% if s.ssh_ids != none %} - <option value="ssh_ids" selected>Set SSH key ids</option> - {% else %} - <option value="ssh_ids">Set SSH key ids</option> - {% endif %} - </select> - </td> - </tr> - <tr id="do_edit_ssh_ids_tr" {% if s.ssh_ids == none %}style="display: none;"{% endif %}> - <td class="padding20 padding-top20"> - SSH key ids - <span class="need-field">*</span> - </td> - <td> - {{input('do_edit_ssh_ids', size='30', value=s.ssh_ids)}} - <div class="tooltip tooltipTop tooltipTd">List comma separated. Required if SSH key name is empty</div> - </td> - </tr> - <tr id="do_edit_ssh_name_tr" {% if s.ssh_key_name is none %}style="display: none;"{% endif %}> - <td class="padding20 padding-top20"> - SSH key name - <span class="need-field">*</span> - </td> - <td> - {{input('do_edit_ssh_name', size='30', value=s.ssh_key_name)}} - <div class="tooltip tooltipTop tooltipTd">Required if SSH key ids is empty</div> - </td> - </tr> - <tr> - {% set checked='checked' %} - {% if s.monitoring == 0 %} - {% set checked='' %} - {% endif %} - <td class="padding20">Monitoring</td> - <td> - {{checkbox('do_edit_monitoring', checked=checked)}} - </td> - </tr> - <tr> - {% set checked='checked' %} - {% if s.backup == 0 %} - {% set checked='' %} - {% endif %} - <td class="padding20">Backup</td> - <td> - {{checkbox('do_edit_backup', checked=checked)}} - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Network</b> - </td> - </tr> - <tr> - {% set checked='checked' %} - {% if s.private_networking == 0 %} - {% set checked='' %} - {% endif %} - <td class="padding20">Private IP</td> - <td> - {{checkbox('do_edit_private_networking', checked=checked)}} - </td> - </tr> - <tr> - {% set checked='checked' %} - {% if s.floating_ip == 0 %} - {% set checked='' %} - {% endif %} - <td class="padding20">Floating Ip</td> - <td> - {{checkbox('do_edit_floating_ip', checked=checked)}} - </td> - </tr> - <tr> - {% set checked='checked' %} - {% if s.firewall == 0 %} - {% set checked='' %} - {% endif %} - <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td> - <td> - {{checkbox('do_edit_firewall', checked=checked)}} - <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed</div> - </td> - </tr> - <tr> - <td colspan="2"> - <p class="validateTips alert alert-warning">Be aware: some changes may cause server re-creation. And all your data will be lost</p> - </td> - </tr> - </table> - <script> - $( function() { - $('#do_edit_ssh_choose').on('selectmenuchange', function (){ - if ($('#do_edit_ssh_choose option:selected').val() == 'ssh_name') { - $('#do_edit_ssh_name_tr').show(); - $('#do_edit_ssh_ids_tr').hide(); - } else if ($('#do_edit_ssh_choose option:selected').val() == 'ssh_ids') { - $('#do_edit_ssh_name_tr').hide(); - $('#do_edit_ssh_ids_tr').show(); - } - }); - }); - </script> -</div> -{% endfor %} diff --git a/app/templates/ajax/provisioning/gcore_edit_dialog.html b/app/templates/ajax/provisioning/gcore_edit_dialog.html deleted file mode 100644 index 839356db..00000000 --- a/app/templates/ajax/provisioning/gcore_edit_dialog.html +++ /dev/null @@ -1,192 +0,0 @@ -{% import 'languages/'+lang|default('en')+'.html' as lang %} -{% from 'include/input_macros.html' import input, select, checkbox %} -{% from 'include/provisioning/variables.html' import generate_opt_options, get_nice_name %} -{% for s in server %} -{% set region_name = [] %} -{% set os_nice_name = [] %} -<div id="gcore_edit" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview provisioning_table"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td colspan="2" class="headers"> - <b>General information</b> - </td> - </tr> - <tr> - <td class="padding20"> - Server name - </td> - <td> - <span id="gcore_edit_server_name">{{s.name}}</span>({{s.name_template}}) - </td> - </tr> - {{input('gcore_edit_group', value=s.group_id, type='hidden')}} - {{input('gcore_edit_id', value=s.id, type='hidden')}} - <tr> - <td class="padding20"> - Provider credentials - <span class="need-field">*</span> - </td> - <td> - <select id="gcore_edit_id_provider"> - {% for p in providers %} - {% if p.type == 'gcore' %} - {% if s.provider_id|int() == p.id|int() %} - <option value="{{ p.id }}" selected>{{ p.name }}</option> - {% else %} - <option value="{{ p.id }}">{{ p.name }}</option> - {% endif %} - {% endif %} - {% endfor %} - </select> - </td> - </tr> - <tr> - <td class="padding20"> - Region - </td> - <td> - <span id="gcore_edit_region" style="display: none;">{{s.region}}</span> - {% set id = 'gcore_edit_region-'+s.id|string() %} - {{get_nice_name(id, s.region, 'gcore', 'region', params)}} - </td> - </tr> - <tr> - <td class="padding20"> - Project name - </td> - <td> - <span id="gcore_edit_project_name">{{s.project}}</span> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Instance</b> - </td> - </tr> - <tr> - <td class="padding20"> - Flavor - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('gcore_edit_size', 'gcore', 'size', params, first=s.instance_type) }} - </td> - </tr> - <tr> - <td class="padding20"> - OS - <span class="need-field">*</span> - </td> - <td> - <span id="gcore_edit_oss" style="display: none;">{{s.os}}</span> - {% set id = 'gcore_edit_oss-'+s.id|string() %} - {{get_nice_name(id, s.os, 'gcore', 'image', params)}} - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - SSH key pair name - <span class="need-field">*</span> - </td> - <td> - {{input('gcore_edit_ssh_name', size='26', value=s.ssh_key_name)}} - <div class="tooltip tooltipTop tooltipTd">The SSH key must exist in the region where the instance is being edited</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Volume</b> - </td> - </tr> - <tr> - <td class="padding20"> - Volume size - <span class="need-field">*</span> - </td> - <td> - {{input('gcore_edit_volume_size', size='26', value=s.volume_size, type='number')}}Gb - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - Volume type - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('gcore_edit_volume_type', 'gcore', 'volume_type', params, first=s.volume_type) }} - </td> - </tr> - <tr> - <td class="padding20 padding-top20">Delete on termination</td> - <td> - {% set checked='checked' %} - {% if s.delete_on_termination == 'false' %} - {% set checked='' %} - {% endif %} - {{checkbox('gcore_edit_delete_on_termination', checked=checked)}} - <div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Network</b> - </td> - </tr> - <tr> - <td class="padding20">Network Type</td> - <td> - <select id="gcore_edit_network_type"> - {% if s.public_ip == 1 %} - <option value="external" selected>External IP</option> - {% else %} - <option value="external">External IP</option> - {% endif %} - {% if s.public_ip == 0 %} - <option value="any_subnet" selected>Custom network</option> - {% set style = 'display: table-row;' %} - {% else %} - <option value="any_subnet">Custom network</option> - {% set style = 'display: none;' %} - {% endif %} - </select> - </td> - </tr> - <tr id="gcore_edit_any_subnet" style="{{style}}"> - <td class="padding20"> - Network name - <span class="need-field">*</span> - </td> - <td>{{input('gcore_edit_network_name', size='26', value=s.network_name)}}</td> - </tr> - <tr> - {% set checked='checked' %} - {% if s.firewall == 'false' %} - {% set checked='' %} - {% endif %} - <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td> - <td> - {{checkbox('gcore_edit_firewall', checked=checked)}} - <div class="tooltip tooltipTop tooltipTd">Roxy-WI will edit Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be closed</div> - </td> - </tr> - <tr> - <td colspan="2"> - <p class="validateTips alert alert-warning">Be aware: some changes may cause server re-creation. And all your data will be lost</p> - </td> - </tr> - </table> -</div> -<script> -$( function() { - // $('select').selectmenu(); - $('#gcore_edit_network_type').on('selectmenuchange', function (){ - if ($('#gcore_edit_network_type option:selected').val() == 'any_subnet') { - $('#gcore_edit_any_subnet').show(); - } else if ($('#gcore_edit_network_type option:selected').val() == 'external') { - $('#gcore_edit_any_subnet').hide(); - } - }); -}); -</script> -{% endfor %} diff --git a/app/templates/ajax/provisioning/providers.html b/app/templates/ajax/provisioning/providers.html deleted file mode 100644 index 5b383908..00000000 --- a/app/templates/ajax/provisioning/providers.html +++ /dev/null @@ -1,44 +0,0 @@ -{% from 'include/provisioning/variables.html' import get_nice_name %} -{% for p in providers %} -<tr id="provider-{{p.id}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newprovider{% endif %}"> - <td class="padding10 first-collumn"><span id="provider-name-{{p.id}}">{{p.name}}</span></td> - <td style="width: 10%"> - <span id="provider-type-{{p.id}}"> - {% set id = "provider-type-nice-" + id|string() %} - {{ get_nice_name(id, p.type, p.type, 'provider', params) }} - {% if p.type == 'do' %} - {% set onclickEditAction = 'editDoProvider' %} - {% elif p.type == 'aws' %} - {% set onclickEditAction = 'editAwsProvider' %} - {% elif p.type == 'gcore' %} - {% set onclickEditAction = 'editGcoreProvider' %} - {% endif %} - </span> - </td> - {% if role == 1 %} - <td style="width: 10%"> - {% for g in groups %} - {% if adding %} - {% if user_group|int() == g.group_id|int() %} - <span id="provider-group-{{p.id}}">{{ g.name }}</span> - {% endif %} - {% else %} - {% if p.group|int() == g.group_id|int() %} - <span id="provider-group-{{p.id}}">{{ g.name }}</span> - {% endif %} - {% endif %} - {% endfor %} - </td> - {% else %} - <span id="provider-group-{{p.id}}" style="display: none;">user_group</span> - {% endif %} - <td id="provider-created-date-{{p.id}}" style="width: 15%">{{p.create_date}}</td> - <td id="provider-edited-date-{{p.id}}" style="width: 100%">{{p.edit_date}}</td> - <td> - <a class="edit" onclick="{{onclickEditAction}}({{p.id}})" title="Edit provider {{p.name}}" style="cursor: pointer;"></a> - </td> - <td> - <a class="delete" onclick="confirmDeleteProvider({{p.id}})" title="Delete provider {{p.name}}" style="cursor: pointer;"></a> - </td> -</tr> -{% endfor %} diff --git a/app/templates/ajax/provisioning/provisioned_servers.html b/app/templates/ajax/provisioning/provisioned_servers.html deleted file mode 100644 index 5f29b25f..00000000 --- a/app/templates/ajax/provisioning/provisioned_servers.html +++ /dev/null @@ -1,84 +0,0 @@ -{% from 'include/provisioning/variables.html' import get_nice_name %} -{% from 'include/input_macros.html' import copy_to_clipboard %} -{% for s in servers %} - {% if s.type == 'do' %} - {% set onclickEditAction = 'editDoServer' %} - {% elif s.type == 'aws' %} - {% set onclickEditAction = 'editAwsServer' %} - {% elif s.type == 'gcore' %} - {% set onclickEditAction = 'editGcoreServer' %} - {% endif %} -<tr id="server-{{s.id}}" class="{{ loop.cycle('odd', 'even') }} {% if adding %}newserver{% endif %}"> - <td class="padding10 first-collumn"> - <span id="server-name-{{s.id}}">{{s.name}}</span> - {% if s.type == 'gcore' and s.name_template is defined %} - ({{s.name_template}}) - {% endif %} - </td> - <td style="width: 10%"> - {% for p in providers %} - {% if p.id|int() == s.provider_id|int() %} - <span>{{ p.name }}</span> - <span id="server-provider-{{s.id}}" style="display: none;">{{p.id}}</span> - {% endif %} - {% endfor %} - </td> - {% if role == 1 %} - <td style="width: 5%"> - {% for g in groups %} - {% if adding %} - {% if user_group|int() == g.group_id|int() %} - {{ g.name }} - <span id="server-group-{{s.id}}" style="display: none;">{{ g.group_id }}</span> - {% endif %} - {% else %} - {% if s.group_id|int() == g.group_id|int() %} - {{ g.name }} - <span id="server-group-{{s.id}}" style="display: none;">{{ g.group_id }}</span> - {% endif %} - {% endif %} - {% endfor %} - </td> - {% endif %} - <td style="width: 10%"> - {% if role != 1 %} - <span id="server-group-{{s.id}}" style="display: none;">{{user_group}}</span> - {% endif %} - {{get_nice_name(id, s.type, s.type, 'provider', params)}} - <span id="server-cloud-{{s.id}}" style="display: none;">{{s.type}}</span> - </td> - <td style="width: 10%"> - {% set id = "server-region-" + s.id|string() %} - {{get_nice_name(id, s.region, s.type, 'region', params)}} - </td> - <td style="width: 10%"> - {% set id = "server-os-" + s.id|string() %} - {{get_nice_name(id, s.os, s.type, 'image', params)}} - </td> - <td style="width: 15%"> - {% set id = "server-ip-" + s.id|string() %} - {{ copy_to_clipboard(id=id, value=s.IP) }} - </td> - <td style="width: 10%"> - {% set id = "server-size-" + s.id|string() %} - {{ copy_to_clipboard(id=id, value=s.instance_type) }} - </td> - <td style="width: 5%"> - {% if s.status == 'Created' %} - {% set style='color: var(--green-color);' %} - {% elif s.status == 'Error ' %} - {% set style='color: red;cursor: help;' %} - {% endif %} - <span id="sever-status-{{s.id}}" title="Last error: {{s.last_error}}" style="font-weight: bold;{{style}}">{{s.status}}</span> - </td> - <td style="width: 100%"> - {{s.date}} - </td> - <td> - <a class="edit" onclick="{{onclickEditAction}}({{s.id}})" title="Edit server {{s.name}}" style="cursor: pointer;"></a> - </td> - <td> - <a class="delete" onclick="confirmDeleteProvisionedServer({{s.id}})" title="Delete server {{s.name}}" style="cursor: pointer;"></a> - </td> -</tr> -{% endfor %} diff --git a/app/templates/ajax/show_service_settings.html b/app/templates/ajax/service_settings.html similarity index 100% rename from app/templates/ajax/show_service_settings.html rename to app/templates/ajax/service_settings.html diff --git a/app/templates/ajax/show_compare_configs.html b/app/templates/ajax/show_compare_configs.html index 4d1778d2..ea3db79f 100644 --- a/app/templates/ajax/show_compare_configs.html +++ b/app/templates/ajax/show_compare_configs.html @@ -7,11 +7,7 @@ <select autofocus required name="left" id="left"> <option disabled selected>{{ lang.phrases.select_older_config }}</option> {% for file in return_files %} - {% if file == left %} - <option value="{{ file }}" selected>{{ file.split('-', maxsplit=1)[1] }}</option> - {% else %} - <option value="{{ file }}">{{ file.split('-', maxsplit=1)[1] }}</option> - {% endif %} + <option value="{{ file }}">{{ file.split('-', maxsplit=1)[1] }}</option> {% endfor %} </select> @@ -22,7 +18,6 @@ {% endfor %} </select> {{ input('serv', type='hidden', value=serv) }} - {{ input('open', type='hidden', value='open') }} <a class="ui-button ui-widget ui-corner-all" id="show" title="{{ lang.words.compare|title() }}" onclick="showCompare()">{{ lang.words.compare|title() }}</a> </p> </div> diff --git a/app/templates/ajax/show_configs_files.html b/app/templates/ajax/show_configs_files.html index 2cbea466..39b3c7d1 100644 --- a/app/templates/ajax/show_configs_files.html +++ b/app/templates/ajax/show_configs_files.html @@ -11,9 +11,9 @@ <option disabled selected>{{lang.words.select|title()}} {{lang.words.w_a}} {{lang.words.config}} {{lang.words.file}}</option> {% for file in return_files.split() %} {% if file == config_file_name %} - <option value="{{ file }}" selected>{{ file.split('/', maxsplit=3)[3] }}</option> + <option value="{{ file.replace('/', '92') }}" selected>{{ file.split('/', maxsplit=3)[3] }}</option> {% else %} - <option value="{{ file }}">{{ file.split('/', maxsplit=3)[3] }}</option> + <option value="{{ file.replace('/', '92') }}">{{ file.split('/', maxsplit=3)[3] }}</option> {% endif %} {% endfor %} </select> @@ -27,7 +27,7 @@ </form> <form action="" method="post" id="finding_words_from"> <p id="find_p" style="display: none;"> - {{ input('words', type='text', style='height: 32.5px;') }} + {{ input('words', type='text', style='height: 25.5px;width: 250px;') }} <button type="submit" name="find" id="find_in_configs" value="Find" title="Find in configs">{{lang.words.find|title()}}</button> </p> {% else %} @@ -57,7 +57,7 @@ return false; } findInConfig(words); - window.history.pushState("Find in config", "Find in config", cur_url[0] + '?service='+ $('#service').val()+'&serv='+$('#serv').val()+'&showConfigFiles&findInConfig='+ words); + // window.history.pushState("Find in config", "Find in config", cur_url[0] + '?service='+ $('#service').val()+'&serv='+$('#serv').val()+'&showConfigFiles&findInConfig='+ words); return false; }); $( "input[type=submit], button" ).button() @@ -96,7 +96,7 @@ serv = escapeHtml(serv); path_dir = escapeHtml(path_dir); config_file_name = escapeHtml(config_file_name); - window.location.replace('config.py?service=' + service + '&serv=' + serv + '&open=open&config_file_name=' + path_dir + '92' + config_file_name + '.conf&new_config=1'); + window.location.replace('/app/config/' + service + '/' + serv + '/edit/' + path_dir + '92' + config_file_name + '.conf/new'); $(this).dialog("close"); } }, { diff --git a/app/templates/ajax/show_list_version.html b/app/templates/ajax/show_list_version.html index 31630f61..c28c5b98 100644 --- a/app/templates/ajax/show_list_version.html +++ b/app/templates/ajax/show_list_version.html @@ -24,7 +24,7 @@ $("form input[type='checkbox']").attr("checked",false).change(); } }); - $.getScript('/inc/script-6.3.9.js'); + $.getScript('/inc/script.js'); function show_diff(id) { if ($('#show_diff_'+id).css('display') == 'none') { $('#show_diff_'+id).show(); @@ -76,7 +76,7 @@ <tr> <td style="padding-left: 15px"> <label for="{{c.id}}" id="select_{{c.id}}"></label> - <input type="checkbox" value="{{c.local_path}}" name="{{c.local_path}}" id="{{c.id}}"> + <input type="checkbox" value="{{c.local_path}}" name="do_delete" id="{{c.id}}"> </td> <td> {% for u in users %} @@ -103,7 +103,7 @@ </td> <td>{{c.date}}</td> <td style="padding-top: 10px;"> - <a href="/app/versions.py?service={{service}}&serv={{serv}}&open=open&configver={{c.local_path.split('/')[-1]}}" + <a href="/app/config/versions/{{service}}/{{server_ip}}/{{c.local_path.split('/')[-1]}}" class="ui-button ui-widget ui-corner-all" title="{{lang1.phrases.view_and_upload}}" style="margin-top: -6px;"> {{lang1.words.view|title()}}/{{lang1.words.upload|title()}} </a> @@ -112,10 +112,9 @@ {% endfor %} </tbody> </table> - <input type="hidden" value="{{serv}}" name="serv"> + <input type="hidden" value="{{server_ip}}" name="server_ip"> <input type="hidden" value="open" name="open"> <input type="hidden" value="del" name="del"> - <input type="hidden" value="{{style}}" name="style"> <p> <button type="submit" value="" name="" class="btn btn-default">{{lang1.words.delete|title()}}</button> </p> @@ -126,6 +125,7 @@ <select autofocus required name="configver" id="configver"> <option disabled selected>------</option> {% for file in return_files %} + {{file}} {% if file == configver %} <option value="{{file}}" selected>{{file.split('-', maxsplit=1)[1]}}</option> {% else %} @@ -133,7 +133,7 @@ {% endif %} {% endfor %} </select> - <input type="hidden" value="{{serv}}" name="serv"> + <input type="hidden" value="{{server_ip}}" name="server_ip"> <input type="hidden" value="open" name="open"> <input type="hidden" value="{{service}}" name="service" id="service"> <a class="ui-button ui-widget ui-corner-all" id="show" title="{{lang1.words.enter|title()}}" onclick="showUploadConfig()">{{lang1.words.select2|title()}}</a> diff --git a/app/templates/ajax/show_system_info.html b/app/templates/ajax/show_system_info.html index d75ccda2..daf5bdb8 100644 --- a/app/templates/ajax/show_system_info.html +++ b/app/templates/ajax/show_system_info.html @@ -18,7 +18,7 @@ <td class="padding10 first-collumn-wi">Linux</td> <td>{{s_i.os_info}}</td> </tr> - {% set base_info = string_to_dict(s_i.sys_info) %} + {% set base_info = s_i.sys_info|string_to_dict %} <tr class="even"> <td class="padding10 first-collumn-wi" style="width: 20%;"> Hostname @@ -44,7 +44,7 @@ </a> </td> </tr> - {% set ram_info = string_to_dict(s_i.ram) %} + {% set ram_info = s_i.ram|string_to_dict %} <tr class="odd"> <td class="padding10 first-collumn-wi" style="width: 20%;"> Slots @@ -65,7 +65,7 @@ CPU </td> </tr> - {% set cpu_info = string_to_dict(s_i.cpu) %} + {% set cpu_info = s_i.cpu|string_to_dict %} <tr class="odd"> <td class="padding10 first-collumn-wi">Model</td> <td>{{cpu_info.cpu_model}}</td> @@ -90,7 +90,7 @@ </tr> </table> - {% set disks_info = string_to_dict(s_i.disks) %} + {% set disks_info = s_i.disks|string_to_dict %} {% for v,d in disks_info.items() %} <table class="overview-wi"> <tr class="overviewHead" colspan=2> @@ -125,7 +125,7 @@ </tr> </table> {% endfor %} - {% set network_info = string_to_dict(s_i.network) %} + {% set network_info = s_i.network|string_to_dict %} {% for v,d in network_info.items() %} <table class="overview-wi"> <tr class="overviewHead" colspan=2> diff --git a/app/templates/ajax/smon/smon_dashboard.html b/app/templates/ajax/smon/smon_dashboard.html index bcf2095d..ed0e77f9 100644 --- a/app/templates/ajax/smon/smon_dashboard.html +++ b/app/templates/ajax/smon/smon_dashboard.html @@ -80,9 +80,9 @@ <div class="smon_services {{additional_classes}}" data-help="{{checks}}" title="{{checks}}"> <div class="ip"> <span style="{{additional_style}}"> - <a href="smon.py?action=dashboard&dashboard_id={{s.id}}&check_id={{check_id}}" title="{{lang.words.view|title()}} {{lang.words.history}} {{lang.words.for}} {{s.name}} {{lang.words.host}}" class="link">{{s.name.strip("'")}}</a> + <a href="/app/smon/dashboard/{{s.id}}/{{check_id}}" title="{{lang.words.view|title()}} {{lang.words.history}} {{lang.words.for}} {{s.name}} {{lang.words.host}}" class="link">{{s.name.strip("'")}}</a> </span> - <span class="server-action"><a href="smon.py?action=history&host={{s.name}}" title="{{lang.words.view|title()}} {{lang.words.alerts}} {{lang.words.history}} {{lang.words.for}} {{s.name}} {{lang.words.host}}" class="history"></a></span> + <span class="server-action"><a href="/app/smon/history/host/{{s.name}}" title="{{lang.words.view|title()}} {{lang.words.alerts}} {{lang.words.history}} {{lang.words.for}} {{s.name}} {{lang.words.host}}" class="history"></a></span> </div> <div class="desc"> {% if s.desc %} diff --git a/app/templates/ajax/show_user_current_group.html b/app/templates/ajax/user_current_group.html similarity index 100% rename from app/templates/ajax/show_user_current_group.html rename to app/templates/ajax/user_current_group.html diff --git a/app/templates/ajax/show_user_groups_and_roles.html b/app/templates/ajax/user_groups_and_roles.html similarity index 100% rename from app/templates/ajax/show_user_groups_and_roles.html rename to app/templates/ajax/user_groups_and_roles.html diff --git a/app/templates/ajax/show_user_services.html b/app/templates/ajax/user_services.html similarity index 100% rename from app/templates/ajax/show_user_services.html rename to app/templates/ajax/user_services.html diff --git a/app/templates/base.html b/app/templates/base.html index 1d5fbbfa..f15bd78c 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -24,23 +24,23 @@ {% if title == 'Login page' %} <meta name="viewport" content="width=device-width, user-scalable=1"> {% endif %} - <link href="/inc/images/favicon/favicon.ico" rel="icon" type="image/png" /> - <link rel="apple-touch-icon" sizes="57x57" href="/inc/images/favicon/inc/images/favicon/apple-icon-57x57.png"> - <link rel="apple-touch-icon" sizes="60x60" href="/inc/images/favicon/apple-icon-60x60.png"> - <link rel="apple-touch-icon" sizes="72x72" href="/inc/images/favicon/apple-icon-72x72.png"> - <link rel="apple-touch-icon" sizes="76x76" href="/inc/images/favicon/apple-icon-76x76.png"> - <link rel="apple-touch-icon" sizes="114x114" href="/inc/images/favicon/apple-icon-114x114.png"> - <link rel="apple-touch-icon" sizes="120x120" href="/inc/images/favicon/apple-icon-120x120.png"> - <link rel="apple-touch-icon" sizes="144x144" href="/inc/images/favicon/apple-icon-144x144.png"> - <link rel="apple-touch-icon" sizes="152x152" href="/inc/images/favicon/apple-icon-152x152.png"> - <link rel="apple-touch-icon" sizes="180x180" href="/inc/images/favicon/apple-icon-180x180.png"> - <link rel="icon" type="image/png" sizes="192x192" href="/inc/images/favicon/android-icon-192x192.png"> - <link rel="icon" type="image/png" sizes="32x32" href="/inc/images/favicon/favicon-32x32.png"> - <link rel="icon" type="image/png" sizes="96x96" href="/inc/images/favicon/favicon-96x96.png"> - <link rel="icon" type="image/png" sizes="16x16" href="/inc/images/favicon/favicon-16x16.png"> - <link rel="manifest" href="/inc/images/favicon/manifest.json"> + <link rel="icon" type="image/png" href="{{ url_for('static', filename='images/favicon/favicon.ico') }}" /> + <link rel="apple-touch-icon" sizes="57x57" href="{{ url_for('static', filename='images/favicon/apple-icon-57x57.png') }}"> + <link rel="apple-touch-icon" sizes="60x60" href="{{ url_for('static', filename='images/favicon/apple-icon-60x60.png') }}"> + <link rel="apple-touch-icon" sizes="72x72" href="{{ url_for('static', filename='images/favicon/apple-icon-72x72.png') }}"> + <link rel="apple-touch-icon" sizes="76x76" href="{{ url_for('static', filename='images/favicon/apple-icon-76x76.png') }}"> + <link rel="apple-touch-icon" sizes="114x114" href="{{ url_for('static', filename='images/favicon/apple-icon-114x114.png') }}"> + <link rel="apple-touch-icon" sizes="120x120" href="{{ url_for('static', filename='images/favicon/apple-icon-120x120.png') }}"> + <link rel="apple-touch-icon" sizes="144x144" href="{{ url_for('static', filename='images/favicon/apple-icon-144x144.png') }}"> + <link rel="apple-touch-icon" sizes="152x152" href="{{ url_for('static', filename='images/favicon/apple-icon-152x152.png') }}"> + <link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='images/favicon/apple-icon-180x180.png') }}"> + <link rel="icon" type="image/png" sizes="192x192" href="{{ url_for('static', filename='images/favicon/android-icon-192x192.png') }}"> + <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='images/favicon/favicon-32x32.png') }}"> + <link rel="icon" type="image/png" sizes="96x96" href="{{ url_for('static', filename='images/favicon/favicon-96x96.png') }}"> + <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='images/favicon/favicon-16x16.png') }}"> + <link rel="manifest" href="{{ url_for('static', filename='images/favicon/manifest.json') }}"> <meta name="msapplication-TileColor" content="#ffffff"> - <meta name="msapplication-TileImage" content="/inc/images/favicon/ms-icon-144x144.png"> + <meta name="msapplication-TileImage" content="{{ url_for('static', filename='images/favicon/ms-icon-144x144.png') }}"> <meta name="theme-color" content="#ffffff"> <script defer src="/inc/fa-solid.min.js"></script> <script defer src="/inc/fontawesome.min.js"></script> @@ -62,7 +62,7 @@ <script src="/inc/hotkeys.js"></script> <link href="/inc/css/select2.css" rel="stylesheet" /> <script src="/inc/select2.js"></script> - <script src="/inc/script-6.3.9.js"></script> + <script src="/inc/script.js"></script> <script src="/inc/nprogress.js"></script> <link href="/inc/css/toastr-6.3.9.css" rel="stylesheet"/> <script src="/inc/toastr.js"></script> @@ -74,7 +74,7 @@ <div class="LogoText"> <span id="logo_text"> <a href="https://roxy-wi.org" title="Roxy-WI site" target="_blank"> - <img src="/inc/images/logo_menu.png" alt="logo" width="110" /> + <img src="{{ url_for('static', filename='images/logo_menu.png') }}" alt="logo" width="110" /> </a> </span> </div> @@ -82,57 +82,57 @@ <nav id="menu"> <ul class="menu"> {% if user %} - <li><a href="/app/overview.py" title="{{lang.menu_links.overview.title}}" class="overview-link ">{{lang.menu_links.overview.link}}</a></li> + <li><a href="/app/" title="{{lang.menu_links.overview.title}}" class="overview-link ">{{lang.menu_links.overview.link}}</a></li> {% if '1' in user_services %} <li class="p_menu"> - <a href="/app/hapservers.py?service=haproxy" title="{{lang.menu_links.hapservers.haproxy.title}}" class="config-show">HAProxy</a> + <a href="/app/service/haproxy" title="{{lang.menu_links.hapservers.haproxy.title}}" class="config-show">HAProxy</a> <ul class="v_menu"> - <li><a href="/app/hapservers.py?service=haproxy" title="{{lang.menu_links.hapservers.haproxy.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a> </li> - <li><a href="/app/config.py?service=haproxy" title="{{lang.menu_links.config.haproxy.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li> - <li><a href="/app/statsview.py?service=haproxy" title="{{lang.menu_links.stats.haproxy.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li> - <li><a href="/app/logs.py?service=haproxy" title="HAProxy {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li> - <li><a href="/app/runtimeapi.py" title="Runtime API" class="runtime head-submenu">Runtime API</a></li> - <li><a href="/app/metrics.py?service=haproxy" title="HAProxy {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li> + <li><a href="/app/service/haproxy" title="{{lang.menu_links.hapservers.haproxy.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a> </li> + <li><a href="/app/config/haproxy" title="{{lang.menu_links.config.haproxy.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li> + <li><a href="/app/stats/haproxy" title="{{lang.menu_links.stats.haproxy.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li> + <li><a href="/app/logs/haproxy" title="HAProxy {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li> + <li><a href="/app/runtimeapi" title="Runtime API" class="runtime head-submenu">Runtime API</a></li> + <li><a href="/app/metrics/haproxy" title="HAProxy {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li> {% if role <= 3 %} - <li><a href="/app/add.py#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu" id="add1">{{lang.menu_links.add_proxy.link}}</a></li> - <li><a href="/app/versions.py?service=haproxy" title="{{lang.menu_links.versions.haproxy.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li> - <li><a href="/app/add.py#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li> - <li><a href="/app/add.py#lists" title="{{lang.menu_links.lists.title}}" class="lists head-submenu" id="add7">{{lang.menu_links.lists.link}}</a></li> - <li><a href="/app/waf.py?service=haproxy" title="Web application firewall" class="waf-menu head-submenu">WAF</a> </li> + <li><a href="/app/add/haproxy#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu" id="add1">{{lang.menu_links.add_proxy.link}}</a></li> + <li><a href="/app/config/versions/haproxy" title="{{lang.menu_links.versions.haproxy.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li> + <li><a href="/app/add/haproxy#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li> + <li><a href="/app/add/haproxy#lists" title="{{lang.menu_links.lists.title}}" class="lists head-submenu" id="add7">{{lang.menu_links.lists.link}}</a></li> + <li><a href="/app/waf/haproxy" title="Web application firewall" class="waf-menu head-submenu">WAF</a> </li> {% endif %} </ul> </li> {% endif %} {% if '2' in user_services %} <li class="p_menu"> - <a href="/app/hapservers.py?service=nginx" title="{{lang.menu_links.hapservers.nginx.title}}" class="nginx-menu">NGINX</a> + <a href="/app/service/nginx" title="{{lang.menu_links.hapservers.nginx.title}}" class="nginx-menu">NGINX</a> <ul class="v_menu"> - <li><a href="/app/hapservers.py?service=nginx" title="{{lang.menu_links.hapservers.nginx.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a></li> - <li><a href="/app/config.py?service=nginx" title="{{lang.menu_links.config.nginx.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li> - <li><a href="/app/statsview.py?service=nginx" title="{{lang.menu_links.stats.nginx.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li> - <li><a href="/app/logs.py?service=nginx" title="NGINX {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li> - <li><a href="/app/metrics.py?service=nginx" title="NGINX {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li> + <li><a href="/app/service/nginx" title="{{lang.menu_links.hapservers.nginx.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a></li> + <li><a href="/app/config/nginx" title="{{lang.menu_links.config.nginx.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li> + <li><a href="/app/stats/nginx" title="{{lang.menu_links.stats.nginx.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li> + <li><a href="/app/logs/nginx" title="NGINX {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li> + <li><a href="/app/metrics/nginx" title="NGINX {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li> {% if role <= 3 %} - <li><a href="/app/add_nginx.py#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu">{{lang.menu_links.add_proxy.link}}</a></li> - <li><a href="/app/versions.py?service=nginx" title="{{lang.menu_links.versions.nginx.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li> - <li><a href="/app/add.py?service=nginx#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu">{{lang.menu_links.ssl.link}}</a></li> - <li><a href="/app/waf.py?service=nginx" title="Web application firewall" class="waf-menu head-submenu">WAF</a> </li> + <li><a href="/app/add/nginx#proxy" title="{{lang.menu_links.add_proxy.title}}" class="add-proxy head-submenu">{{lang.menu_links.add_proxy.link}}</a></li> + <li><a href="/app/config/versions/nginx" title="{{lang.menu_links.versions.nginx.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li> + <li><a href="/app/add/haproxy?service=nginx#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu">{{lang.menu_links.ssl.link}}</a></li> + <li><a href="/app/waf/nginx" title="Web application firewall" class="waf-menu head-submenu">WAF</a> </li> {% endif %} </ul> </li> {% endif %} {% if '4' in user_services %} <li class="p_menu"> - <a href="/app/hapservers.py?service=apache" title="{{lang.menu_links.hapservers.apache.title}}" class="apache-menu">Apache</a> + <a href="/app/service/apache" title="{{lang.menu_links.hapservers.apache.title}}" class="apache-menu">Apache</a> <ul class="v_menu"> - <li><a href="/app/hapservers.py?service=apache" title="{{lang.menu_links.hapservers.apache.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a></li> - <li><a href="/app/config.py?service=apache" title="{{lang.menu_links.config.apache.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li> - <li><a href="/app/statsview.py?service=apache" title="{{lang.menu_links.stats.apache.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li> - <li><a href="/app/logs.py?service=apache" title="Apache {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li> - <li><a href="/app/metrics.py?service=apache" title="Apache {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li> + <li><a href="/app/service/apache" title="{{lang.menu_links.hapservers.apache.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a></li> + <li><a href="/app/config/apache" title="{{lang.menu_links.config.apache.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li> + <li><a href="/app/stats/apache" title="{{lang.menu_links.stats.apache.title}}" class="stats head-submenu">{{lang.menu_links.stats.link}}</a></li> + <li><a href="/app/logs/apache" title="Apache {{lang.menu_links.logs.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li> + <li><a href="/app/metrics/apache" title="Apache {{lang.menu_links.metrics.title}}" class="metrics head-submenu">{{lang.menu_links.metrics.link}}</a></li> {% if role <= 3 %} - <li><a href="/app/versions.py?service=apache" title="{{lang.menu_links.versions.apache.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li> - <li><a href="/app/add.py?service=apache#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li> + <li><a href="/app/config/versions/apache" title="{{lang.menu_links.versions.apache.title}}" class="version head-submenu">{{lang.menu_links.versions.link}}</a></li> + <li><a href="/app/add/haproxy?service=apache#ssl" title="{{lang.menu_links.ssl.title}}" class="cert head-submenu" id="add3">{{lang.menu_links.ssl.link}}</a></li> {% endif %} </ul> </li> @@ -140,60 +140,64 @@ {% if '3' in user_services %} {% if role <= 2 %} <li class="p_menu"> - <a href="/app/hapservers.py?service=keepalived" title="{{lang.menu_links.hapservers.keepalived.title}}" class="ha">Keepalived</a> + <a href="/app/service/keepalived" title="{{lang.menu_links.hapservers.keepalived.title}}" class="ha">Keepalived</a> <ul class="v_menu"> - <li><a href="/app/hapservers.py?service=keepalived" title="{{lang.menu_links.hapservers.keepalived.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a> </li> - <li><a href="/app/ha.py" title="{{lang.menu_links.ha.title}}" class="keepalived head-submenu">HA</a></li> - <li><a href="/app/config.py?service=keepalived" title="{{lang.menu_links.config.keepalived.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li> - <li><a href="/app/logs.py?service=keepalived" title="Keepalived {{lang.menu_links.stats.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li> - <li><a href="/app/versions.py?service=keepalived" title="{{lang.menu_links.versions.keepalived.title}}" class="version head-submenu keepalived_versions">{{lang.menu_links.versions.link}}</a></li> + <li><a href="/app/service/keepalived" title="{{lang.menu_links.hapservers.keepalived.title}}" class="overview-link head-submenu">{{lang.menu_links.hapservers.link}}</a> </li> + <li><a href="/app/config/keepalived" title="{{lang.menu_links.config.keepalived.title}}" class="edit head-submenu">{{lang.menu_links.config.link}}</a></li> + <li><a href="/app/logs/keepalived" title="Keepalived {{lang.menu_links.stats.title}}" class="logs head-submenu">{{lang.menu_links.logs.link}}</a></li> + <li><a href="/app/config/versions/keepalived" title="{{lang.menu_links.versions.keepalived.title}}" class="version head-submenu keepalived_versions">{{lang.menu_links.versions.link}}</a></li> </ul> </li> {% endif %} {% endif %} <li class="p_menu"> - <a href="/app/smon.py?action=view" title="{{lang.menu_links.monitoring.title}}" class="stats">{{lang.menu_links.monitoring.link}}</a> + <a href="/app/smon" title="{{lang.menu_links.monitoring.title}}" class="stats">{{lang.menu_links.monitoring.link}}</a> <ul class="v_menu"> - <li><a href="/app/smon.py?action=view" title="{{lang.menu_links.monitoring.smon.dashboard}}" class="overview-link head-submenu">{{lang.menu_links.monitoring.smon.dashboard}}</a></li> - <li><a href="/app/smon.py?action=history" title="{{lang.menu_links.monitoring.smon.history}}" class="lists head-submenu">{{lang.menu_links.monitoring.smon.history}}</a></li> + <li><a href="/app/smon/dashboard" title="{{lang.menu_links.monitoring.smon.dashboard}}" class="overview-link head-submenu">{{lang.menu_links.monitoring.smon.dashboard}}</a></li> + <li><a href="/app/smon/history" title="{{lang.menu_links.monitoring.smon.history}}" class="lists head-submenu">{{lang.menu_links.monitoring.smon.history}}</a></li> {% if role <= 3 %} - <li><a href="/app/smon.py?action=add" title="{{lang.menu_links.monitoring.smon.admin}}" class="edit head-submenu">{{lang.menu_links.monitoring.smon.admin}}</a></li> + <li><a href="/app/smon/admin" title="{{lang.menu_links.monitoring.smon.admin}}" class="edit head-submenu">{{lang.menu_links.monitoring.smon.admin}}</a></li> + <li><a href="/app/checker/settings" title="Checker: {{lang.words.settings}}" class="checker head-submenu">Checker: {{lang.words.settings|title()}}</a></li> {% endif %} - <li><a href="/app/smon.py?action=checker_history" title="{{lang.menu_links.monitoring.checker_history}}" class="lists head-submenu">{{lang.menu_links.monitoring.checker_history}}</a></li> - <li><a href="/app/portscanner.py" title="{{lang.menu_links.monitoring.port_scan}}" class="port-scanner head-submenu">{{lang.menu_links.monitoring.port_scan}}</a></li> - <li><a href="/app/nettools.py" title="{{lang.menu_links.monitoring.net_tools}}" class="net-tools head-submenu">{{lang.menu_links.monitoring.net_tools}}</a></li> + <li><a href="/app/checker/history" title="{{lang.menu_links.monitoring.checker_history}}" class="lists head-submenu">{{lang.menu_links.monitoring.checker_history}}</a></li> + <li><a href="/app/portscanner" title="{{lang.menu_links.monitoring.port_scan}}" class="port-scanner head-submenu">{{lang.menu_links.monitoring.port_scan}}</a></li> + <li><a href="/app/nettools" title="{{lang.menu_links.monitoring.net_tools}}" class="net-tools head-submenu">{{lang.menu_links.monitoring.net_tools}}</a></li> </ul> </li> {% if role <= 2 %} <li class="p_menu"> - <a href="/app/servers.py#users" title="{{lang.menu_links.servers.title}}" class="runtime">{{lang.menu_links.servers.link}}</a> + <a href="/app/install" title="{{lang.menu_links.servers.title}}" class="hap-menu">{{lang.words.installation|title()}}</a> <ul class="v_menu"> - <li><a href="/app/servers.py#users" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu">{{lang.words.users|title()}}</a></li> - <li><a href="/app/servers.py#servers" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu">{{lang.words.servers|title()}}</a></li> - <li><a href="/app/servers.py#ssh" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu">SSH {{lang.words.creds|title()}}</a></li> - <li><a href="/app/servers.py#checker" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Checker" class="checker head-submenu">Checker</a></li> - <li><a href="/app/servers.py#settings" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu">{{lang.words.settings|title()}}</a></li> - <li><a href="/app/servers.py#installproxy" title="{{lang.words.servers|title()}}: {{lang.words.proxy|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap-menu installproxy head-submenu">{{lang.words.proxy|title()}} {{lang.words.installation}}</a> </li> - <li><a href="/app/servers.py#installmon" title="{{lang.words.servers|title()}}: {{lang.words.monitoring|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap1 installmon head-submenu">{{lang.words.monitoring|title()}} {{lang.words.installation}}</a> </li> - <li><a href="/app/provisioning.py" title="{{lang.words.servers|title()}}: {{lang.words.provisioning|title()}}" class="hap1 head-submenu">{{lang.words.servers|title()}} {{lang.words.provisioning|title()}}</a> </li> - <li><a href="/app/servers.py#backup" title="{{lang.words.servers|title()}}: {{lang.words.backup|title()}} {{lang.words.configs2}}" class="backup head-submenu">{{lang.words.backup|title()}}</a> </li> - <li><a href="/app/viewlogs.py?type=2" title="{{lang.words.servers|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li> + <li><a href="/app/install/ha" title="{{lang.menu_links.ha.title}}" class="keepalived head-submenu">HA {{lang.words.cluster}}</a></li> + <li><a href="/app/install#service" title="{{lang.words.servers|title()}}: {{lang.words.proxy|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap-menu service installproxy head-submenu">{{lang.words.proxy|title()}} {{lang.words.services}}</a> </li> + <li><a href="/app/install#monitoring" title="{{lang.words.servers|title()}}: {{lang.words.monitoring|title()}} {{lang.words.services}} {{lang.words.installation}}" class="hap-menu monitoring installmon head-submenu">{{lang.words.monitoring|title()}}</a> </li> + <li><a href="/app/install#geolite2" title="{{lang.words.installation|title()}} GeoLite2" class="hap-menu geolite2 installgeo head-submenu">GeoLite2</a> </li> + </ul> + </li> + <li class="p_menu"> + <a href="/app/servers#users" title="{{lang.menu_links.servers.title}}" class="runtime">{{lang.menu_links.servers.link}}</a> + <ul class="v_menu"> + <li><a href="/app/servers#users" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu">{{lang.words.users|title()}}</a></li> + <li><a href="/app/servers#servers" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu">{{lang.words.servers|title()}}</a></li> + <li><a href="/app/servers#ssh" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu">SSH {{lang.words.creds|title()}}</a></li> + <li><a href="/app/servers#settings" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu">{{lang.words.settings|title()}}</a></li> + <li><a href="/app/servers#backup" title="{{lang.words.servers|title()}}: {{lang.words.backup|title()}} {{lang.words.configs2}}" class="backup head-submenu">{{lang.words.backup|title()}}</a> </li> + <li><a href="/app/logs/internal?type=2" title="{{lang.words.servers|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li> </ul> </li> {% endif %} {% if role <= 1 %} <li class="p_menu" id="admin-area"> - <a href="/app/users.py#users" title="{{lang.menu_links.admin_area.title}}" class="admin">{{lang.menu_links.admin_area.link}}</a> + <a href="/app/admin#users" title="{{lang.menu_links.admin_area.title}}" class="admin">{{lang.menu_links.admin_area.link}}</a> <ul class="v_menu"> - <li><a href="/app/users.py#users" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu" id="admin-area-users">{{lang.words.users|title()}}</a></li> - <li><a href="/app/users.py#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups3}}" class="group groups head-submenu" id="admin-area-groups">{{lang.words.groups|title()}}</a></li> - <li><a href="/app/users.py#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu" id="admin-area-servers">{{lang.words.servers|title()}}</a></li> - <li><a href="/app/users.py#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu" id="admin-area-ssh">SSH {{lang.words.creds|title()}}</a></li> - <li><a href="/app/users.py#checker" title="{{lang.words.admin_area|title()}}: Checker" class="checker head-submenu" id="admin-area-checker">Checker</a></li> - <li><a href="/app/users.py#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu" id="admin-area-settings">{{lang.words.settings|title()}}</a></li> - <li><a href="/app/users.py#services" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.services3}}" class="services head-submenu" id="admin-area-services">{{lang.words.services|title()}}</a></li> - <li><a href="/app/viewlogs.py" title="{{lang.words.admin_area|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu" id="admin-area-logs">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li> - <li><a href="/app/users.py#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI" class="upload updatehapwi head-submenu" id="admin-area-update">{{lang.words.w_update|title()}}</a></li> + <li><a href="/app/admin#users" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.users2}}" class="users head-submenu" id="admin-area-users">{{lang.words.users|title()}}</a></li> + <li><a href="/app/admin#groups" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.groups3}}" class="group groups head-submenu" id="admin-area-groups">{{lang.words.groups|title()}}</a></li> + <li><a href="/app/admin#servers" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} {{lang.words.servers2}}" class="runtime servers head-submenu" id="admin-area-servers">{{lang.words.servers|title()}}</a></li> + <li><a href="/app/admin#ssh" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds2}}" class="admin ssh head-submenu" id="admin-area-ssh">SSH {{lang.words.creds|title()}}</a></li> + <li><a href="/app/admin#settings" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings2}}" class="settings head-submenu" id="admin-area-settings">{{lang.words.settings|title()}}</a></li> + <li><a href="/app/admin#tools" title="{{lang.words.admin_area|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.tools}}" class="services head-submenu" id="admin-area-services">{{lang.words.tools|title()}}</a></li> + <li><a href="/app/logs/internal" title="{{lang.words.admin_area|title()}}: {{lang.words.view|title()}} {{lang.words.internal2}} {{lang.words.logs2}}" class="logs head-submenu" id="admin-area-logs">{{lang.words.internal|title()}} {{lang.words.logs}}</a></li> + <li><a href="/app/admin#updatehapwi" title="{{lang.words.admin_area|title()}}: {{lang.words.w_update|title()}} Roxy-WI" class="upload updatehapwi head-submenu" id="admin-area-update">{{lang.words.w_update|title()}}</a></li> </ul> </li> {% endif %} @@ -279,7 +283,7 @@ </div> <div id="show-updates" style="display: none;"> <div> - {{lang.phrases.new_version}} <a href="/app/users.py#updatehapwi" class="link">{{lang.words.w_update|title()}}</a> + {{lang.phrases.new_version}} <a href="/app/admin#updatehapwi" class="link">{{lang.words.w_update|title()}}</a> </div> </div> <div class="footer"> @@ -298,7 +302,7 @@ <div id="version"></div> <div id="logo_footer"> <a href="https://roxy-wi.org" title="Roxy-WI official site" target="_blank"> - <img src="/inc/images/logo_footer.png" alt="logo" id="logo_footer_img" /> + <img src="{{ url_for('static', filename='images/logo_footer.png')}}" alt="logo" id="logo_footer_img" /> </a> </div> <div class="footer-div"> diff --git a/app/templates/checker.html b/app/templates/checker.html new file mode 100644 index 00000000..cf6f66fe --- /dev/null +++ b/app/templates/checker.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% block title %} Checker {{ lang.words.settings }} {% endblock %} +{% block h2 %} Checker {{ lang.words.settings }} {% endblock %} +{% block content %} +{% from 'include/input_macros.html' import input, select, copy_to_clipboard, checkbox %} +<script src="/inc/users.js"></script> +<script src="/inc/fontawesome.min.js"></script> +<div id="checker"></div> +<script> + loadchecker(); +</script> +{% endblock %} diff --git a/app/templates/config.html b/app/templates/config.html index 60ea93fa..86c4ca71 100644 --- a/app/templates/config.html +++ b/app/templates/config.html @@ -26,7 +26,7 @@ <script src="/inc/codemirror/keymap/sublime.js"></script> <script src="/inc/configshow.js"></script> {% if is_serv_protected and role > 2 %} -<meta http-equiv="refresh" content="0; url=/app/hapservers.py?service={{service}}"> +<meta http-equiv="refresh" content="0; url=/app/service"> {% else %} {% if selects|length == 0 %} {% include 'include/getstarted.html' %} @@ -36,22 +36,22 @@ <input type="hidden" id="service" value="{{service|default('haproxy', true)}}" /> {% include 'include/select.html' %} {% if service == 'nginx' or service == 'apache' %} - <a class="ui-button ui-widget ui-corner-all" title="Show running config" onclick="showConfigFiles()">{{lang.words.open|title()}}</a> + <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.running}} {{lang.words.config}}" onclick="showConfigFiles()">{{lang.words.open|title()}}</a> {% else %} - <a class="ui-button ui-widget ui-corner-all" title="Show running config" onclick="showConfig()">{{lang.words.open|title()}}</a> + <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.running}} {{lang.words.config}}" onclick="showConfig()">{{lang.words.open|title()}}</a> {% endif %} {% if service != 'keepalived' and service != 'apache' %} - <a class="ui-button ui-widget ui-corner-all" title="View stat" onclick="openStats()">{{lang.menu_links.stats.link}}</a> + <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.stat}}" onclick="openStats()">{{lang.menu_links.stats.link}}</a> {% endif %} {% if service != 'keepalived' and service != 'nginx' and service != 'apache' %} - <a class="ui-button ui-widget ui-corner-all" title="Show map" onclick="showMap()">{{lang.words.map|title()}}</a> + <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.map}}" onclick="showMap()">{{lang.words.map|title()}}</a> {% endif %} - <a class="ui-button ui-widget ui-corner-all" title="Compare configs" onclick="showCompareConfigs()">{{lang.words.compare|title()}}</a> + <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.compare|title()}} {{lang.words.configs}}" onclick="showCompareConfigs()">{{lang.words.compare|title()}}</a> {% if role <= 3 %} - <a class="ui-button ui-widget ui-corner-all" title="Show versions" onclick="openVersions()">{{lang.menu_links.versions.link}}</a> + <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.show|title()}} {{lang.words.versions}}" onclick="openVersions()">{{lang.menu_links.versions.link}}</a> {% endif %} {% if role <= 2 %} - <a href="/app/servers.py#backup" class="ui-button ui-widget ui-corner-all" title="Git">Git</a> + <a href="/app/servers#backup" class="ui-button ui-widget ui-corner-all" title="Git">Git</a> {% endif %} </form> </p> @@ -64,8 +64,8 @@ {% if config %} {% if role <= 3 %} - <h4 class="left-space">{{lang.words.config|title()}} {% if config_file_name != 'undefined' %}{{config_file_name.replace('92', '/')}}{%endif%} {{lang.words.from}} {{ serv }}</h4> - <form action="config.py" name="saveconfig" id="saveconfig" method="post" class="left-space"> + <h4 class="left-space">{{lang.words.config|title()}} {% if config_file_name and config_file_name != 'undefined' %}{{config_file_name.replace('92', '/')}}{%endif%} {{lang.words.from}} {{ serv }}</h4> + <form action="/app/config/{{service}}/{{serv}}/save" name="saveconfig" id="saveconfig" method="post" class="left-space"> <input type="hidden" value="{{ serv }}" name="serv"> <input type="hidden" value="{{ cfg }}.old" name="oldconfig"> <input type="hidden" value="{{ token }}" name="token"> @@ -75,7 +75,7 @@ <textarea name="config" id="config_text_area" class="config" rows="35" cols="100">{{ config }}</textarea> </div> <p> - <a href="config.py?service={{service}}&serv={{serv}}&showConfig" class="ui-button ui-widget ui-corner-all" title="{{lang.phrases.return_to_config}}">{{lang.words.back|title()}}</a> + <a href="/app/config/{{service}}/{{serv}}/show" class="ui-button ui-widget ui-corner-all" title="{{lang.phrases.return_to_config}}">{{lang.words.back|title()}}</a> {% if service != 'keepalived' %} <button type="submit" value="test" name="save" class="btn btn-default" title="{{lang.words.check|title()}} {{lang.words.config}} {{lang.words.without}} {{lang.words.saving}}">{{lang.phrases.check_config}}</button> {% endif %} @@ -92,19 +92,21 @@ {% endif %} {% endif %} <script> - if (cur_url[1].split('&')[2] == 'showMap') { + var cur_url = window.location.href.split('/app/').pop(); + cur_url = cur_url.split('/'); + if (cur_url[1] == 'map') { showMap(); } - if (cur_url[1].split('&')[1] == 'showCompare' || cur_url[1].split('&')[2] == 'showCompare') { + if (cur_url[1] == 'compare') { showCompareConfigs(); } - if (cur_url[1].split('&')[2] == 'showConfig') { + if (cur_url[3] == 'show') { showConfig(); } - if (cur_url[1].split('&')[2] == 'showConfigFiles') { + if (cur_url[3] == 'show-files') { showConfigFiles(); } - if (cur_url[1].split('&')[3].split('=')[0] == 'findInConfig') { + if (cur_url[3] == 'findInConfig') { var words = findGetParameter('findInConfig'); waitForElm('#finding_words_from').then((elm) => { $('#find_p').show(); @@ -112,10 +114,10 @@ findInConfig(words); }); } - if (cur_url[1].split('&')[3].split('=')[0] == 'config_file_name') { + if (cur_url[1] == 'config_file_name') { showConfigFilesForEditing(); } - if (cur_url[1].split('&')[0] == 'service=haproxy' || cur_url[1].split('&')[0] == 'service=None') { + if (cur_url[1] == 'haproxy' && cur_url[3] == 'edit') { var myCodeMirror = CodeMirror.fromTextArea(document.getElementById("config_text_area"), { mode: "haproxy", diff --git a/app/templates/configver.html b/app/templates/configver.html index d4b8e023..6066ee34 100644 --- a/app/templates/configver.html +++ b/app/templates/configver.html @@ -3,7 +3,7 @@ {% block h2 %}{{ lang.menu_links.versions.h2 }} {{ lang.words[service] }}{% endblock %} {% block content %} <p> - <form action="{{ action }}" method="post" class="left-space"> + <form action="/app/config/versions/{{service}}/{{serv}}" method="post" class="left-space"> <input type="hidden" id="service" value="{{service}}"> {% include 'include/select.html' %} <button type="submit" value="open" name="open" class="btn btn-default">{{lang.words.open|title()}}</button> @@ -13,8 +13,6 @@ {% if stderr %} {% include 'include/errors.html' %} {% endif %} - {% endif %} - {% if open %} <div id="config_version_div"></div> <script>showListOfVersion(0)</script> {% endif %} diff --git a/app/templates/delver.html b/app/templates/delver.html index 9aa4c05b..5bf3018d 100644 --- a/app/templates/delver.html +++ b/app/templates/delver.html @@ -12,7 +12,7 @@ <input type="hidden" value="{{service}}" name="service" id="service"> {% include 'include/select.html' %} <a class="ui-button ui-widget ui-corner-all" title="Open versions" onclick="showListOfVersion(1)">{{lang.words.open|title()}}</a> - <a href="config.py?service={{service}}" class="ui-button ui-widget ui-corner-all" title="Configs page">{{lang.words.configs|title()}}</a> + <a href="/app/config/{{service}}" class="ui-button ui-widget ui-corner-all" title="Configs page">{{lang.words.configs|title()}}</a> {% if service != 'keepalived' %} <a class="ui-button ui-widget ui-corner-all" title="View stat" onclick="openStats()">{{lang.words.stats|title()}}</a> {% endif %} @@ -36,7 +36,7 @@ {{lang.phrases.work_with_prev}} {{ service[0]|upper}}{{service[1:] }}. {{lang.phrases.roll_back}} </div> {% endif %} - {% if open and not aftersave %} + {% if serv and not aftersave %} {% for select in selects %} {% if select.2 == serv %} <script>showListOfVersion(1)</script> diff --git a/app/templates/ha.html b/app/templates/ha.html index 5785493e..4364c095 100644 --- a/app/templates/ha.html +++ b/app/templates/ha.html @@ -5,16 +5,16 @@ {% from 'include/input_macros.html' import input, checkbox %} <script src="/inc/users.js"></script> <script src="/inc/ha.js"></script> -<link href="/inc/css/provisioning.css" rel="stylesheet"> +<link href="/inc/css/ha.css" rel="stylesheet"> <style> p {margin: 0;} </style> {% if user_status == 0 or user_plan == 'user' %} -{% include 'include/no_sub.html' %} + {% include 'include/no_sub.html' %} {% elif not is_needed_tool %} <div style="text-align: center;"> <h3>You have not installed Ansible</h3>. - <img src="/inc/images/no_servers.png" alt="There is no server"> + <img src="{{ url_for('static', filename='images/no_servers.png')" alt="There is no server"> <h4> Read <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.installing|title()}} Ansible" target="_blank">here</a> how to install Ansible. </h4> diff --git a/app/templates/hapservers.html b/app/templates/hapservers.html index 2b2ad959..0b2d8eef 100644 --- a/app/templates/hapservers.html +++ b/app/templates/hapservers.html @@ -3,9 +3,9 @@ {% block h2 %}{{ lang.menu_links.hapservers.h2 }} {{ service_desc.service }}{% endblock %} {% block content %} {% from 'include/input_macros.html' import input, checkbox, select, copy_to_clipboard %} -<script src="/inc/overview-6.3.9.js"></script> +<script src="/inc/overview.js"></script> <link href="/inc/css/chart.min.css" rel="stylesheet"> -<script src="/inc/metrics-6.3.16.0.js"></script> +<script src="/inc/metrics.js"></script> <script src="/inc/chart.min-4.3.0.js"></script> {% if servers|length == 0 %} {% include 'include/getstarted.html' %} {% endif %} <style> @@ -203,7 +203,7 @@ <input type="hidden" id="server-name-{{s.0}}" value="{{s.1}}" /> <input type="hidden" id="service" value="{{service}}" /> {% if not serv %} - <a href="/app/hapservers.py?service={{service}}&serv={{s.2}}" title="{{lang.words.more|title()}} {{lang.words.about}} {{s.1}}" style="color: #5d9ceb">{{s.1}}</a> + <a href="/app/service/{{service}}/{{s.2}}" title="{{lang.words.more|title()}} {{lang.words.about}} {{s.1}}" style="color: #5d9ceb">{{s.1}}</a> {% else %} {{s.1}} {% endif %} @@ -249,7 +249,7 @@ <a id="stop-{{ s.2 }}" class="stop" title="{{lang.words.stop|title()}} {{service}} {{lang.words.service}}"> <span class="service-stop" onclick="confirmAjaxAction('stop', '{{service}}', '{{s.2}}')"></span> </a> - <a href="history.py?service={{service}}&serv={{s.2}}" title="{{lang.words.view|title()}} {{lang.words.history3}} {{s.1}}" class="history" style="margin: 0 5px 0 10px;"></a> + <a href="/app/history/{{service}}/{{s.2}}" title="{{lang.words.view|title()}} {{lang.words.history3}} {{s.1}}" class="history" style="margin: 0 5px 0 10px;"></a> {% if service != 'keepalived' %} <span class="menu-bar" onclick="serverSettings('{{s.0}}', '{{s.1}}')" title="{{lang.words.edit|title()}} {{lang.words.settings}} {{s.1}}"></span> {% endif %} @@ -342,20 +342,20 @@ </div> <div class="server-act-links"> {% if service == 'nginx' or service == 'apache' %} - <a href="/app/config.py?service={{service}}&serv={{s.2}}&showConfigFiles" {{config_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.open|title()}} {{lang.words.running}} {{lang.words.configs}}">{{lang.menu_links.config.link}}</a> + <a href="/app/config/{{service}}/{{s.2}}/show-files" {{config_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.open|title()}} {{lang.words.running}} {{lang.words.configs}}">{{lang.menu_links.config.link}}</a> {% else %} - <a href="/app/config.py?service={{service}}&serv={{s.2}}&showConfig" {{config_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.open|title()}} {{lang.words.running}} {{lang.words.config}}">{{lang.menu_links.config.link}}</a> + <a href="/app/config/{{service}}/{{s.2}}/show/undefined" {{config_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.open|title()}} {{lang.words.running}} {{lang.words.config}}">{{lang.menu_links.config.link}}</a> {% endif %} - <a href="/app/config.py?service={{service}}&serv={{s.2}}&showCompare" {{compare_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.compare|title()}} {{lang.words.configs}}">{{lang.words.compare|title()}}</a> + <a href="/app/config/compare/{{service}}/{{s.2}}" {{compare_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.compare|title()}} {{lang.words.configs}}">{{lang.words.compare|title()}}</a> {% if service == 'haproxy' %} - <a href="/app/config.py?service={{service}}&serv={{s.2}}&showMap" class="ui-button ui-widget ui-corner-all" {{map_id}} title="{{lang.words.show|title()}} {{lang.words.map}}">{{lang.words.map|title()}}</a> + <a href="/app/config/map/{{service}}/{{s.2}}" class="ui-button ui-widget ui-corner-all" {{map_id}} title="{{lang.words.show|title()}} {{lang.words.map}}">{{lang.words.map|title()}}</a> {% endif %} {% if service != 'keepalived' %} - <a href="/app/statsview.py?service={{service}}&serv={{s.2}}" class="ui-button ui-widget ui-corner-all" {{stats_id}} title="{{lang.words.view|title()}} {{service}} {{lang.words.statistics}}">{{lang.menu_links.stats.link}}</a> + <a href="/app/stats/{{service}}/{{s.2}}" class="ui-button ui-widget ui-corner-all" {{stats_id}} title="{{lang.words.view|title()}} {{service}} {{lang.words.statistics}}">{{lang.menu_links.stats.link}}</a> {% endif %} - <a href="/app/logs.py?service={{service}}&serv={{s.2}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" {{logs_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{service}} {{lang.words.logs}}">{{lang.menu_links.logs.link}}</a> + <a href="/app/logs/{{service}}/" {{logs_id}} class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{service}} {{lang.words.logs}}">{{lang.menu_links.logs.link}}</a> {% if role <= 2 %} - <a href="/app/versions.py?service={{service}}&serv={{s.2}}&open=open" class="ui-button ui-widget ui-corner-all" {{versions_id}} title="{{lang.words.view|title()}}/{{lang.words.rollback|title()}} {{lang.words.to}} {{lang.words.previous}} {{lang.words.config}}">{{lang.menu_links.versions.link}}</a> + <a href="/app/config/versions/{{service}}/{{s.2}}" class="ui-button ui-widget ui-corner-all" {{versions_id}} title="{{lang.words.view|title()}}/{{lang.words.rollback|title()}} {{lang.words.to}} {{lang.words.previous}} {{lang.words.config}}">{{lang.menu_links.versions.link}}</a> {% endif %} </div> </div> @@ -406,13 +406,11 @@ <div class="chart-container_overview http_metrics_div"> <canvas id="http_{{s.2}}" role="img"></canvas> </div> - {% for waf_server in servers_waf %} - {% if waf_server.server.ip == s.2 %} + {% if waf_server == s.2 %} <div id="waf_metrics_div" class="chart-container_overview"> <canvas id="waf_{{s.2}}" role="img"></canvas> </div> {% endif %} - {% endfor %} {% elif service == 'nginx' and s.8.0.21 %} <div id="nginx_metrics_div" class="chart-container" style="display: block; width: 90%; height: 300px;"> <canvas id="nginx_{{s.2}}" role="img"></canvas> diff --git a/app/templates/include/admin_backup.html b/app/templates/include/admin_backup.html index 6bef25c1..0e9a01be 100644 --- a/app/templates/include/admin_backup.html +++ b/app/templates/include/admin_backup.html @@ -1,7 +1,7 @@ {% if not is_needed_tool %} <div style="text-align: center;"> <h3>{{lang.admin_page.desc.no_ansible}} Ansible</h3>. - <img src="/inc/images/no_servers.png" alt="There is no server"> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> <h4> {{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible. </h4> diff --git a/app/templates/include/admin_servers.html b/app/templates/include/admin_servers.html index 41de747e..5ff28dae 100644 --- a/app/templates/include/admin_servers.html +++ b/app/templates/include/admin_servers.html @@ -140,7 +140,7 @@ {% endif %} </td> <td> - <a href="history.py?service=server&serv={{server.2}}" title="{{lang.words.view|title}} {{lang.words.history}} {{lang.words.for}} {{lang.words.this}} {{lang.words.server}}" class="history"></a> + <a href="/app/history/server/{{server.2}}" title="{{lang.words.view|title}} {{lang.words.history}} {{lang.words.for}} {{lang.words.this}} {{lang.words.server}}" class="history"></a> </td> <td style="min-width: 17px;"> <a class="info" onclick="showServerInfo('{{server.0}}', '{{server.2}}')" id="server_info_link-{{server.0}}" title="{{lang.words.show|title()}} {{lang.words.server}} {{lang.words.info}}" style="cursor: pointer; color: var(--green-color)"></a> diff --git a/app/templates/include/admin_users.html b/app/templates/include/admin_users.html index 22dfba19..946f41ef 100644 --- a/app/templates/include/admin_users.html +++ b/app/templates/include/admin_users.html @@ -78,7 +78,7 @@ <span title="{{lang.words.change2|title()}} {{lang.words.user3}} {{lang.words.services}}" style="cursor: pointer; margin-left: 15px;" class="div-pic" onclick="openChangeUserServiceDialog('{{user.user_id}}')"></span> </td> <td> - <a href="history.py?service=user&user_id={{user.user_id}}" title="{{lang.words.view|title()}} {{lang.words.history}} {{lang.words.for}} {{lang.words.user2}}" class="history"></a> + <a href="/app/history/user/{{user.user_id}}" title="{{lang.words.view|title()}} {{lang.words.history}} {{lang.words.for}} {{lang.words.user2}}" class="history"></a> </td> <td> <a class="delete" onclick="confirmDeleteUser({{user.user_id}})" title="{{lang.words.delete|title()}} {{user.username}}" style="cursor: pointer;"></a> diff --git a/app/templates/include/getstarted.html b/app/templates/include/getstarted.html index 97acc2ac..87f83543 100644 --- a/app/templates/include/getstarted.html +++ b/app/templates/include/getstarted.html @@ -1,6 +1,6 @@ <center> <h4 style="font-size: 25px">Welcome and let's get started!</h4> - <img src="/inc/images/no_servers.png" alt="There is no server"> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> <br /> <br /> <h4> @@ -8,9 +8,9 @@ Read how to <a href="https://roxy-wi.org/howto/add-existing-server" title="How to add an existing server">add an existing server</a> or create <a href="https://roxy-wi.org/howto/add-new-server" title="How to add a new server">a new one</a> {% if role == 2 %} - and go to the "<a href="servers.py#servers" title="Servers">Servers</a>" + and go to the "<a href="/app/servers#servers" title="Servers">Servers</a>" {% elif role == 1 %} - and go to the "<a href="users.py#servers" title="Servers">Admin area</a>" + and go to the "<a href="/app/users#servers" title="Servers">Admin area</a>" {% endif %} to add your first server </h4> diff --git a/app/templates/include/login.html b/app/templates/include/login.html index 9e7e9e46..545154ea 100644 --- a/app/templates/include/login.html +++ b/app/templates/include/login.html @@ -1,7 +1,7 @@ {% if user %} <span id="show-user-settings-button" class="user-circle login" title="{{lang.words.user3|title()}} {{lang.words.settings}}" style="margin-top: 5px;">{{user}}</span> {% else %} - <a href=/app/login.py title="Login" class="login"> Login</a> + <a href=/app/login title="Login" class="login"> Login</a> {% endif %} {% if guide_me %} <style> @@ -18,7 +18,7 @@ </style> <span class="info guid_me" title="Guide me" onclick="startIntroAgain()"></span> {% endif %} -<a href="/app/login.py?logout" title="{{lang.words.logout|title()}}" style="float: right; +<a href="/app/logout" title="{{lang.words.logout|title()}}" style="float: right; right: 27px; position: absolute; top: 10px; diff --git a/app/templates/include/mon_installation.html b/app/templates/include/mon_installation.html deleted file mode 100644 index e5202d0d..00000000 --- a/app/templates/include/mon_installation.html +++ /dev/null @@ -1,203 +0,0 @@ -{% if not is_needed_tool %} - <div style="text-align: center;"> - <h3>{{lang.admin_page.desc.no_ansible}} Ansible</h3>. - <img src="/inc/images/no_servers.png" alt="There is no server"> - <h4> - {{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">here</a> {{lang.phrases.how_to_install}} Ansible. - </h4> - </div> -{% else %} -{% if page == 'users.py' %} - <table id="grafana-table"> - <caption><i class="fas fa-chart-bar caption-icon2"></i><h3>Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.installation}}</td> - <td class="padding10 first-collumn" style="width: 40%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.note|title()}}</td> - <td></td> - <td></td> - </tr> - <tr> - <td id="cur_grafana_ver" class="padding10 first-collumn"> - {% if grafana == "active" %} - Grafana {{lang.words.and}} Prometheus {{lang.admin_page.desc.been_installed}} - {% else %} - {{lang.admin_page.desc.there_are_no}} - {% endif %} - </td> - <td class="padding10 first-collumn" style="width: 20%;"> - {{lang.admin_page.desc.latest_repo}} Grafana {{lang.words.and}} Prometheus - </td> - <td class="padding10 first-collumn"> - {{lang.admin_page.desc.before_install}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}} - </td> - <td></td> - <td> - {% if grafana != "active" %} - <span class="ui-button ui-widget ui-corner-all" id="grafna_install" title="{{lang.words.install|title()}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}">{{lang.words.install|title()}}</span> - {% endif %} - </td> - </tr> - </table> -{% endif %} - <table id="haproxy-table"> - <caption><i class="fas fa-network-wired caption-icon2"></i><h3>HAProxy Exporter</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> - <td class="help_cursor" style="width: 20%;" data-intro="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td> - <td></td> - <td></td> - </tr> - <tr> - <td id="cur_haproxy_exp_ver" class="padding10 first-collumn"></td> - <td class="padding10 first-collumn" style="width: 20%;"> - {% set values = dict() %} - {% set values = {'0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0', '0.12.0':'0.12.0', '0.13.0':'0.13.0', '0.14.0':'0.14.0', '0.15.0':'0.15.0'} %} - {{ select('hapexpver', values=values, selected='0.15.0') }} - </td> - <td class="padding10 first-collumn"> - <select autofocus required name="haproxy_exp_addserv" id="haproxy_exp_addserv"> - <option disabled selected>------</option> - {% for select in servers %} - <option value="{{ select.2 }}">{{ select.1 }}</option> - {% endfor %} - </select> - </td> - <td style="padding-left: 50px;">{{ checkbox('haproxy_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> - <td> - <span class="ui-button ui-widget ui-corner-all" id="haproxy_exp_install" title="{{lang.words.install|title()}} HAProxy Exporter">{{lang.words.install|title()}}</span> - </td> - </tr> - </table> - <table id="nginx-table"> - <caption><i class="fas fa-sitemap caption-icon2"></i><h3>NGINX Exporter</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> - <td class="help_cursor" style="width: 20%;" data-help="lang.admin_page.desc.ext_prom">{{lang.words.external|title()}} Prometheus</td> - <td></td> - <td></td> - </tr> - <tr> - <td id="cur_nginx_exp_ver" class="padding10 first-collumn"></td> - <td class="padding10 first-collumn" style="width: 20%;"> - {% set values = dict() %} - {% set values = {'0.6.0':'0.6.0', '0.7.0':'0.7.0', '0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0'} %} - {{ select('nginxexpver', values=values, selected='0.11.0') }} - </td> - <td class="padding10 first-collumn"> - <select autofocus required name="nginx_exp_addserv" id="nginx_exp_addserv"> - <option disabled selected>------</option> - {% for select in servers %} - <option value="{{ select.2 }}">{{ select.1 }}</option> - {% endfor %} - </select> - </td> - <td style="padding-left: 50px;">{{ checkbox('nginx_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> - <td> - <span class="ui-button ui-widget ui-corner-all" id="nginx_exp_install" title="{{lang.words.install|title()}} NGINX Exporter">{{lang.words.install|title()}}</span> - </td> - </tr> - </table> - <table id="apache-table"> - <caption><i class="fas fa-feather-alt caption-icon2"></i><h3>Apache Exporter</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> - <td class="help_cursor" style="width: 20%;" data-help="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td> - <td></td> - <td></td> - </tr> - <tr> - <td id="cur_apache_exp_ver" class="padding10 first-collumn"></td> - <td class="padding10 first-collumn" style="width: 20%;"> - {% set values = dict() %} - {% set values = {'0.10.0':'0.10.0', '0.13.4':'0.13.4', '1.0.1':'1.0.1'} %} - {{ select('apacheexpver', values=values, selected='1.0.1') }} - </td> - <td class="padding10 first-collumn"> - <select autofocus required name="apache_exp_addserv" id="apache_exp_addserv"> - <option disabled selected>------</option> - {% for select in servers %} - <option value="{{ select.2 }}">{{ select.1 }}</option> - {% endfor %} - </select> - </td> - <td style="padding-left: 50px;">{{ checkbox('apache_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> - <td> - <span class="ui-button ui-widget ui-corner-all" id="apache_exp_install" title="{{lang.words.install|title()}} Apache Exporter">{{lang.words.install|title()}}</span> - </td> - </tr> - </table> - <table id="keepalived-table"> - <caption><i class="fas fa-cloud caption-icon2"></i><h3>Keepalived Exporter</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> - <td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td> - <td></td> - <td></td> - </tr> - <tr> - <td id="cur_keepalived_exp_ver" class="padding10 first-collumn"></td> - <td class="padding10 first-collumn" style="width: 20%;"> - {% set values = dict() %} - {% set values = {'0.1.0':'0.1.0', '0.2.0':'0.2.0', '0.3.0':'0.3.0', '0.4.0':'0.4.0', '0.5.0':'0.5.0'} %} - {{ select('keepalivedexpver', values=values, selected='0.5.0') }} - </td> - <td class="padding10 first-collumn"> - <select autofocus required name="keepalived_exp_addserv" id="keepalived_exp_addserv"> - <option disabled selected>------</option> - {% for select in servers %} - <option value="{{ select.2 }}">{{ select.1 }}</option> - {% endfor %} - </select> - </td> - <td style="padding-left: 50px;">{{ checkbox('keepalived_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> - <td> - <span class="ui-button ui-widget ui-corner-all" id="keepalived_exp_install" title="{{lang.words.install|title()}} Keepalived Exporter">{{lang.words.install|title()}}</span> - </td> - </tr> - </table> - <table style="margin-top: 20px" id="node-table"> - <caption><i class="fas fa-server caption-icon2"></i><h3>Node Exporter</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> - <td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td> - <td></td> - <td></td> - </tr> - <tr> - <td id="cur_node_exp_ver" class="padding10 first-collumn"></td> - <td class="padding10 first-collumn" style="width: 20%;"> - {% set values = dict() %} - {% set values = {'1.2.0':'1.2.0', '1.2.2':'1.2.2', '1.3.0':'1.3.0', '1.3.1':'1.3.1', '1.5.0':'1.5.0', '1.6.1':'1.6.1'} %} - {{ select('nodeexpver', values=values, selected='1.6.1') }} - </td> - <td class="padding10 first-collumn"> - <select autofocus required name="node_exp_addserv" id="node_exp_addserv"> - <option disabled selected>------</option> - {% for select in servers %} - <option value="{{ select.2 }}">{{ select.1 }}</option> - {% endfor %} - </select> - </td> - <td style="padding-left: 50px;">{{ checkbox('node_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> - <td> - <span class="ui-button ui-widget ui-corner-all" id="node_exp_install" title="{{lang.words.install|title()}} Node Exporter">{{lang.words.install|title()}}</span> - </td> - </tr> - </table> - <div id="ajaxmon"></div> - <div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;"> - {{lang.words.read|title()}} <a href="https://roxy-wi.org/services/grafana" title="About Grafana and Prometheus servers" target="_blank">{{lang.words.about|title()}} Grafana and Prometheus servers</a> - {{lang.words.and}} <a href="https://roxy-wi.org/howto/exporters" title="About Exporters" target="_blank">{{lang.words.about|title()}} Exporters</a> - </div> -{% endif %} diff --git a/app/templates/include/port_scan_history.html b/app/templates/include/port_scan_history.html index 0cd8e876..47d8ee36 100644 --- a/app/templates/include/port_scan_history.html +++ b/app/templates/include/port_scan_history.html @@ -1,5 +1,16 @@ +{% extends "base.html" %} +{% block title %}{{ lang.p_s_page.p_s_title_history }}{% endblock %} +{% block h2 %}{{ lang.p_s_page.p_s_title_history }}{% endblock %} +{% block content %} <link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css"> <script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script> +<style> +@media (max-width: 1280px) { + .div-pannel { + height: 430px !important; + } +} +</style> <script> $(document).ready(function() { $('#scan_history').on( 'page.dt' ) @@ -16,6 +27,9 @@ } ); } ); </script> +{% if user_status == 0 %} + {% include 'include/no_sub.html' %} +{% else %} <table class="overview hover order-column display compact" id="scan_history"> <thead> <tr class="overviewHead"> @@ -28,8 +42,8 @@ </tr> </thead> <tbody> - {% if port_scanner_settings != '' %} - {% for t in port_scanner_settings %} + {% if history != '' %} + {% for t in history %} {% set date_time = t.date|string %} <tr> <td class="padding10" style="width: 10%; padding: 7px 7px 7px 10px;"> @@ -52,4 +66,6 @@ <span class="alert alert-warning" style="margin-bottom: 0px;">Table is empty</span> {% endif %} </tbody> -</table> \ No newline at end of file +</table> +{% endif %} +{% endblock %} diff --git a/app/templates/include/provisioning/creating_dialogs.html b/app/templates/include/provisioning/creating_dialogs.html deleted file mode 100644 index 44fb4167..00000000 --- a/app/templates/include/provisioning/creating_dialogs.html +++ /dev/null @@ -1,494 +0,0 @@ -{% from 'include/provisioning/variables.html' import generate_opt_options %} -<div id="do_create" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview provisioning_table"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td colspan="2" class="headers"> - <b>General information</b> - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - Server name - <span class="need-field">*</span> - </td> - <td> - {{input('do_create_server_name', required='required', size='26')}} - <div class="tooltip tooltipTop tooltipTd">The name must contain only URL safe characters, and no path separators</div> - </td> - </tr> - {% if role == 1 %} - <tr> - <td class="padding20"> - Group - <span class="need-field">*</span> - </td> - <td> - <select id="do_create_group"> - {% for group in groups %} - <option value="{{ group.group_id }}">{{ group.name }}</option> - {% endfor %} - </select> - </td> - </tr> - {% else %} - {{input('do_create_group', value=groups, type='hidden')}} - {% endif %} - <tr> - <td class="padding20"> - Provider credentials - <span class="need-field">*</span> - </td> - <td> - <select id="do_create_provider"> - {% for p in providers %} - {% if p.type == 'do' %} - <option value="{{ p.id }}">{{ p.name }}</option> - {% endif %} - {% endfor %} - </select> - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - Region - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('do_create_regions', 'do', 'region', params) }} - <div class="tooltip tooltipTop tooltipTd">Not all regions may be active</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Instance</b> - </td> - </tr> - <tr> - <td class="padding20"> - Size - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('do_create_size', 'do', 'size', params) }} - {{input('do_create_size_text', size='26', style='display: none')}} - <a class="link" id="do-instance-enter">Enter manually</a> - <a class="link" id="do-instance-enter-select" style="display: none; margin-left: 27px;">Change to select</a> - </td> - </tr> - <tr> - <td class="padding20"> - OS - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('do_create_oss', 'do', 'image', params) }} - </td> - </tr> - <tr> - <td class="padding20"> - SSH - <span class="need-field">*</span> - </td> - <td> - <select id="do_create_ssh_choose"> - <option value="none" disabled selected>Choose SSH</option> - <option value="ssh_name">Set SSH key name</option> - <option value="ssh_ids">Set SSH key ids</option> - </select> - </td> - </tr> - <tr id="do_create_ssh_ids_tr" style="display: none;"> - <td class="padding20 padding-top20""> - SSH key ids - <span class="need-field">*</span> - </td> - <td> - {{input('do_create_ssh_ids', size='26')}} - <div class="tooltip tooltipTop tooltipTd">List comma separated. Required if SSH key name is empty</div> - </td> - </tr> - <tr id="do_create_ssh_name_tr" style="display: none;"> - <td class="padding20 padding-top20"> - SSH key name - <span class="need-field">*</span> - </td> - <td> - {{input('do_create_ssh_name', size='26')}} - <div class="tooltip tooltipTop tooltipTd">Required if SSH key ids is empty</div> - </td> - </tr> - <tr> - <td class="padding20">Monitoring</td> - <td>{{checkbox('do_create_monitoring', checked='checked')}}</td> - </tr> - <tr> - <td class="padding20">Backup</td> - <td>{{checkbox('do_create_backup')}}</td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Network</b> - </td> - </tr> - <tr> - <td class="padding20">Private IP</td> - <td>{{checkbox('do_create_private_net', checked='checked')}}</td> - </tr> - <tr> - <td class="padding20 padding-top20">Floating IP</td> - <td>{{checkbox('do_create_floating_net')}}<div class="tooltip tooltipTop tooltipTd">If unchecked then will be used public IP</div></td> - </tr> - <tr> - <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td> - <td> - {{checkbox('do_create_firewall', checked='checked')}} - <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create firewall and open 22, 443, 1999, 8085, 8086 ports. Otherwise all ports will be opened</div> - </td> - </tr> - </table> -</div> -<div id="aws_create" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview provisioning_table"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td colspan="2" class="headers"> - <b>General information</b> - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - Server name - <span class="need-field">*</span> - </td> - <td> - {{input('aws_create_server_name', required='required', size='26')}} - <div class="tooltip tooltipTop tooltipTd">The name must contain only URL safe characters, and no path separators</div> - </td> - </tr> - {% if role == 1 %} - <tr> - <td class="padding20"> - Group - <span class="need-field">*</span> - </td> - <td> - <select id="aws_create_group"> - {% for group in groups %} - <option value="{{ group.group_id }}">{{ group.name }}</option> - {% endfor %} - </select> - </td> - </tr> - {% else %} - {{input('aws_create_group', value=groups, type='hidden')}} - {% endif %} - <tr> - <td class="padding20"> - Provider credentials - <span class="need-field">*</span> - </td> - <td> - <select id="aws_create_provider"> - {% for p in providers %} - {% if p.type == 'aws' %} - <option value="{{ p.id }}">{{ p.name }}</option> - {% endif %} - {% endfor %} - </select> - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - Region - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('aws_create_regions', 'aws', 'region', params) }} - <div class="tooltip tooltipTop tooltipTd">Not all regions may be active</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Instance</b> - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - Instance type - <span class="need-field">*</span> - </td> - <td> - {{input('aws_create_size', required='required', size='26')}} - <div class="tooltip tooltipTop tooltipTd"> - Instance types list is <a href="https://aws.amazon.com/ec2/instance-types/" title="Instance types list" target="_blank">here</a> - </div> - </td> - </tr> - <tr> - <td class="padding20"> - OS - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('aws_create_oss', 'aws', 'image', params) }} - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - SSH key pair name - <span class="need-field">*</span> - </td> - <td> - {{input('aws_create_ssh_name', size='26')}} - <div class="tooltip tooltipTop tooltipTd">SSH key must exists in region where instance create</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Volume</b> - </td> - </tr> - <tr> - <td class="padding20"> - Volume size - <span class="need-field">*</span> - </td> - <td> - {{input('aws_create_volume_size', size='26', value='10', type='number')}}Gb - </td> - </tr> - <tr> - <td class="padding20"> - Volume type - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('aws_create_volume_type', 'aws', 'volume_type', params) }} - </td> - </tr> - <tr> - <td class="padding20 padding-top20">Delete on termination</td> - <td> - {{checkbox('aws_create_delete_on_termination', checked='checked')}} - <div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Network</b> - </td> - </tr> - <tr> - <td class="padding20">Public IP</td> - <td> - <select id="aws_create_public_ip"> - <option value="public">Public IP</option> - <option value="elastic">Elastic IP</option> - <option value="none">None</option> - </select> - </td> - </tr> - <tr> - <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td> - <td> - {{checkbox('aws_create_firewall', checked='checked')}} - <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise, all ports will be closed</div> - </td> - </tr> - </table> -</div> -<div id="gcore_create" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview provisioning_table"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td colspan="2" class="headers"> - <b>General information</b> - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - Server name - <span class="need-field">*</span> - </td> - <td> - {{input('gcore_create_server_name', required='required', size='26')}} - <div class="tooltip tooltipTop tooltipTd">The name must contain only URL safe characters, and no path separators</div> - </td> - </tr> - {% if role == 1 %} - <tr> - <td class="padding20"> - Group - <span class="need-field">*</span> - </td> - <td> - <select id="gcore_create_group"> - {% for group in groups %} - <option value="{{ group.group_id }}">{{ group.name }}</option> - {% endfor %} - </select> - </td> - </tr> - {% else %} - {{input('gcore_create_group', value=groups, type='hidden')}} - {% endif %} - <tr> - <td class="padding20"> - Provider credentials - <span class="need-field">*</span> - </td> - <td> - <select id="gcore_create_provider"> - {% for p in providers %} - {% if p.type == 'gcore' %} - <option value="{{ p.id }}">{{ p.name }}</option> - {% endif %} - {% endfor %} - </select> - </td> - </tr> - <tr> - <td class="padding20"> - Region - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('gcore_create_regions', 'gcore', 'region', params) }} - </td> - </tr> - <tr> - <td class="padding20"> - Project name - <span class="need-field">*</span> - </td> - <td> - {{input('gcore_create_project_name', size='26', value='default')}} - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Instance</b> - </td> - </tr> - <tr> - <td class="padding20"> - Flavor - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('gcore_create_size', 'gcore', 'size', params) }} - {{ input('gcore_create_size_text', size='26', style='display: none') }} - <a class="link" id="gcore-instance-enter">Enter manually</a> - <a class="link" id="gcore-instance-enter-select" style="display: none; margin-left: 27px;">Change to select</a> - </td> - </tr> - <tr> - <td class="padding20"> - OS - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('gcore_create_oss', 'gcore', 'image', params) }} - </td> - </tr> - <tr> - <td class="padding20 padding-top20"> - SSH key pair name - <span class="need-field">*</span> - </td> - <td> - {{input('gcore_create_ssh_name', size='26')}} - <div class="tooltip tooltipTop tooltipTd">SSH key must exists in region where instance create</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Volume</b> - </td> - </tr> - <tr> - <td class="padding20"> - Volume size - <span class="need-field">*</span> - </td> - <td> - {{input('gcore_create_volume_size', size='26', value='10', type='number')}}Gb - </td> - </tr> - <tr> - <td class="padding20"> - Volume type - <span class="need-field">*</span> - </td> - <td> - {{ generate_opt_options('gcore_create_volume_type', 'gcore', 'volume_type', params) }} - </td> - </tr> - <tr> - <td class="padding20 padding-top20">Delete on termination</td> - <td> - {{checkbox('gcore_create_delete_on_termination', checked='checked')}} - <div class="tooltip tooltipTop tooltipTd">Whether the volume should be destroyed on instance termination</div> - </td> - </tr> - <tr> - <td colspan="2" class="headers"> - <b>Network</b> - </td> - </tr> - <tr> - <td class="padding20">Network Type</td> - <td> - <select id="gcore_create_network_type"> - <option value="external">External IP</option> - <option value="any_subnet">Custom Network</option> - </select> - </td> - </tr> - <tr id="gcore_any_subnet" style="display: none"> - <td class="padding20"> - Network name - <span class="need-field">*</span> - </td> - <td>{{input('gcore_create_network_name', size='26')}}</td> - </tr> - <tr> - <td class="padding20" style="padding-bottom: 25px;padding-top: 25px;">Firewall</td> - <td> - {{checkbox('gcore_create_firewall', checked='checked')}} - <div class="tooltip tooltipTop tooltipTd">Roxy-WI will create Security group and open 22, 443, 1999, 8085, 8086 ports. Otherwise will be used the default SG</div> - </td> - </tr> - </table> -</div> -<div id="server_creating" style="display: none;"> - <ul style="padding: 20px 20px 0px 20px;font-size: 15px;"> - <li id="creating-init" class="server-creating">Creating environment...</li> - <li id="creating-vars" class="server-creating">Creating vars...</li> - <li id="creating-validate" class="server-creating">Validation...</li> - <li id="creating-workspace" class="server-creating">Creating workspace...</li> - <li id="creating-server" class="server-creating">Creating server...</li> - </ul> - <div id="wait-mess"></div> - <div id="created-mess" class="alert alert-success" style="display:none;"></div> - <div id="creating-error" class="alert alert-danger" style="display:none;"></div> - <div class="progress-bar-striped"> - <div id="creating-progress" style="width: 0%;"></div> - </div> -</div> -<div id="server_editing" style="display: none;"> - <ul style="padding: 20px 20px 0px 20px;font-size: 15px;"> - <li id="editing-init" class="server-creating">Updating environment...</li> - <li id="editing-vars" class="server-creating">Updating vars...</li> - <li id="editing-validate" class="server-creating">Validation...</li> - <li id="editing-workspace" class="server-creating">Updating workspace...</li> - <li id="editing-server" class="server-creating">Updating server...</li> - </ul> - <div id="editing-wait-mess"></div> - <div id="edited-mess" class="alert alert-success" style="display:none;"></div> - <div id="editing-error" class="alert alert-danger" style="display:none;"></div> - <div class="progress-bar-striped"> - <div id="editing-progress" style="width: 0%;"></div> - </div> -</div> diff --git a/app/templates/include/provisioning/providers_dialogs.html b/app/templates/include/provisioning/providers_dialogs.html deleted file mode 100644 index 41c02c25..00000000 --- a/app/templates/include/provisioning/providers_dialogs.html +++ /dev/null @@ -1,212 +0,0 @@ -{% from 'include/provisioning/variables.html' import generate_opt_options %} -<div id="add_providers_choosing" style="display: none;"> - {{ generate_opt_options('add_select_providers', 'all', 'provider', params, optgroup=false) }} -</div> -<div id="create_providers_choosing" style="display: none;"> - {{ generate_opt_options('create_select_providers', 'all', 'provider', params, optgroup=false) }} -</div> -<div id="aws_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td class="padding20"> - {{lang.words.provider|title()}} {{lang.words.name}} - <span class="need-field">*</span> - </td> - <td>{{input('aws_new_name', required='required', size='30')}}</td> - </tr> - {% if role == 1 %} - <tr> - <td class="padding20"> - {{lang.words.group|title()}} - <span class="need-field">*</span> - </td> - <td> - <select id="aws_new_group"> - {% for group in groups %} - <option value="{{ group.group_id }}">{{ group.name }}</option> - {% endfor %} - </select> - </td> - </tr> - {% else %} - {{input('aws_new_group', value=groups, type='hidden')}} - {% endif %} - <tr> - <td class="padding20"> - ACCESS_KEY - <span class="need-field">*</span> - </td> - <td>{{input('aws_new_key', required='required', size='30')}}</td> - </tr> - <tr> - <td class="padding20"> - SECRET_KEY - <span class="need-field">*</span> - </td> - <td>{{input('aws_new_secret', required='required', size='30')}}</td> - </tr> - </table> - <div class="alert alert-info"> - How to get the AWS access key read <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html" target="_blank"><b>here</b></a> - </div> -</div> -<div id="do_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td class="padding20"> - {{lang.words.provider|title()}} {{lang.words.name}} - <span class="need-field">*</span> - </td> - <td>{{input('do_new_name', required='required', size='30')}}</td> - </tr> - {% if role == 1 %} - <tr> - <td class="padding20"> - {{lang.words.group|title()}} - <span class="need-field">*</span> - </td> - <td> - <select id="do_new_group"> - {% for group in groups %} - <option value="{{ group.group_id }}">{{ group.name }}</option> - {% endfor %} - </select> - </td> - </tr> - {% else %} - {{input('do_new_group', value=groups, type='hidden')}} - {% endif %} - <tr> - <td class="padding20"> - TOKEN - <span class="need-field">*</span> - </td> - <td>{{input('do_new_token', required='required', size='30')}}</td> - </tr> - </table> - <div class="alert alert-info"> - How to get the DigitalOcean token read <a href="https://www.digitalocean.com/docs/apis-clis/api/create-personal-access-token" target="_blank"><b>here</b></a> - </div> -</div> -<div id="gcore_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td class="padding20"> - {{lang.words.provider|title()}} {{lang.words.name}} - <span class="need-field">*</span> - </td> - <td>{{input('gcore_new_name', required='required', size='30')}}</td> - </tr> - {% if role == 1 %} - <tr> - <td class="padding20"> - {{lang.words.group|title()}} - <span class="need-field">*</span> - </td> - <td> - <select id="gcore_new_group"> - {% for group in groups %} - <option value="{{ group.group_id }}">{{ group.name }}</option> - {% endfor %} - </select> - </td> - </tr> - {% else %} - {{input('gcore_new_group', value=groups, type='hidden')}} - {% endif %} - <tr> - <td class="padding20"> - {{lang.words.username|title()}} - <span class="need-field">*</span> - </td> - <td>{{input('gcore_new_user', required='required', size='30')}}</td> - </tr> - <tr> - <td class="padding20"> - {{lang.words.password|title()}} - <span class="need-field">*</span> - </td> - <td>{{input('gcore_new_pass', required='required', type='password', size='30')}}</td> - </tr> - </table> -</div> -<div id="aws_edit_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td class="padding20"> - {{lang.words.provider|title()}} {{lang.words.name}} - <span class="need-field">*</span> - </td> - <td>{{input('aws_edit_provider_name', required='required', size='30')}}</td> - </tr> - {{input('aws_edit_provider_group', value=groups, type='hidden')}} - {{input('aws_edit_provider_id', type='hidden')}} - <tr> - <td class="padding20"> - ACCESS_KEY - <span class="need-field">*</span> - </td> - <td>{{input('aws_edit_provider_key', required='required', size='30')}}</td> - </tr> - <tr> - <td class="padding20"> - SECRET_KEY - <span class="need-field">*</span> - </td> - <td>{{input('aws_edit_provider_secret', required='required', size='30')}}</td> - </tr> - </table> -</div> -<div id="do_edit_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td class="padding20"> - {{lang.words.provider|title()}} {{lang.words.name}} - <span class="need-field">*</span> - </td> - <td>{{input('do_edit_provider_name', required='required', size='30')}}</td> - </tr> - {{input('do_edit_provider_group', value=groups, type='hidden')}} - {{input('do_edit_provider_id', type='hidden')}} - <tr> - <td class="padding20"> - TOKEN - <span class="need-field">*</span> - </td> - <td>{{input('do_edit_provider_token', required='required', size='30')}}</td> - </tr> - </table> -</div> -<div id="gcore_edit_provider" style="display: none; padding: 0 2px 0 0; margin-left: 1px; margin-right: -4px;"> - <table class="overview"> - {% include 'include/tr_validate_tips.html' %} - <tr> - <td class="padding20"> - {{lang.words.provider|title()}} {{lang.words.name}} - <span class="need-field">*</span> - </td> - <td>{{input('gcore_edit_provider_name', required='required', size='30')}}</td> - </tr> - {{input('gcore_edit_provider_group', value=groups, type='hidden')}} - {{input('gcore_edit_provider_id', type='hidden')}} - <tr> - <td class="padding20"> - {{lang.words.username|title()}} - <span class="need-field">*</span> - </td> - <td>{{input('gcore_edit_provider_user', required='required', size='30')}}</td> - </tr> - <tr> - <td class="padding20"> - {{lang.words.password|title()}} - <span class="need-field">*</span> - </td> - <td>{{input('gcore_edit_provider_password', required='required', type='password', size='30')}}</td> - </tr> - </table> -</div> diff --git a/app/templates/include/provisioning/variables.html b/app/templates/include/provisioning/variables.html deleted file mode 100644 index 1eb13e06..00000000 --- a/app/templates/include/provisioning/variables.html +++ /dev/null @@ -1,98 +0,0 @@ -{% from 'include/input_macros.html' import copy_to_clipboard %} - -{%- macro generate_opt_options(id, provider, param_section, params, name='', required='', first='', class='', selected='', disabled='true', optgroup=true) -%} - {% if name == '' %} - {% set name = id %} - {% endif %} - {% if disabled == 'true' %} - {% set disabled = 'disabled' %} - {% else %} - {% set disabled = '' %} - {% endif %} - {% set section = namespace(section='') %} - <select id="{{id}}" name="{{name}}" {{required}}> - {% for p in params %} - {% if (p.provider == provider and p.section == param_section) or (provider == 'all' and p.section == param_section) %} - {% if optgroup %} - {% if section.section|string() != p.optgroup|string() %} - <optgroup label="{{p.optgroup}}"> - {% endif %} - {% endif %} - {% set section.section = p.optgroup %} - {% if first == value %} - <option value="{{p.param}}" selected data-class="avatar" data-style="background-image: url('{{p.image}}')">{{p.name}}</option> - {% else %} - <option value="{{p.param}}" data-class="avatar" data-style="background-image: url('{{p.image}}')">{{p.name}}</option> - {% endif %} - {% endif %} - {% endfor %} - </select> - <script> - $( function() { - $('#{{id}}').selectmenu('destroy'); - $.widget( "custom.iconselectmenu", $.ui.selectmenu, { - _renderItem: function( ul, item ) { - var li = $( "<li>" ), - wrapper = $( "<div>", { text: item.label } ); - - if ( item.disabled ) { - li.addClass( "ui-state-disabled" ); - } - $( "<span>", { - style: item.element.attr( "data-style" ), - "class": "ui-icon " + item.element.attr( "data-class" ) - }).appendTo( wrapper ); - - return li.append( wrapper ).appendTo( ul ); - } - }); - $( "#{{id}}" ) - .iconselectmenu() - .iconselectmenu( "menuWidget") - .addClass( "ui-menu-icons avatar" ); - } ); - </script> - <style> - /* select with custom icons */ - .ui-selectmenu-menu .ui-menu.customicons .ui-menu-item-wrapper { - padding: 0.5em 0 0.5em 3em; - } - /* select with CSS avatar icons */ - option.avatar { - background-repeat: no-repeat !important; - padding-left: 20px; - } - .avatar .ui-icon { - background-position: left top; - height: 15px; - width: 23px; - top: -0.1em; - } - </style> -{%- endmacro %} - -{%- macro get_nice_name(id, value, provider, section, params) -%} - {% for p in params %} - {% if p.section == section and p.provider == provider and p.param == value %} - <span style="background-image: url('{{p.image}}')" class="avatar ui-icon"></span> - {{ copy_to_clipboard(id=id, value=p.param, show=p.name) }} - {% endif %} - {% endfor %} - <style> - /* select with custom icons */ - .ui-selectmenu-menu .ui-menu.customicons .ui-menu-item-wrapper { - padding: 0.5em 0 0.5em 3em; - } - /* select with CSS avatar icons */ - option.avatar { - background-repeat: no-repeat !important; - padding-left: 20px; - } - .avatar .ui-icon { - background-position: left top; - height: 15px; - width: 23px; - top: -0.1em; - } - </style> -{%- endmacro %} diff --git a/app/templates/include/smon/smon_history.html b/app/templates/include/smon/smon_history.html index df7d7907..6e88d9e7 100644 --- a/app/templates/include/smon/smon_history.html +++ b/app/templates/include/smon/smon_history.html @@ -10,8 +10,8 @@ <link href="/inc/css/chart.min.css" rel="stylesheet"> <link href="/inc/css/smon.css" rel="stylesheet"> <script src="/inc/chart.min-4.3.0.js"></script> -<script src="/inc/metrics-6.3.16.0.js"></script> -<script src="/inc/smon-6.3.16.js"></script> +<script src="/inc/metrics.js"></script> +<script src="/inc/smon.js"></script> <div class="row wrap1"> {% for s in smon %} <div id="smon_name" class="col-md-8"> diff --git a/app/templates/include/smon/smon_http_server.html b/app/templates/include/smon/smon_http_server.html index df66acb0..cc3931c9 100644 --- a/app/templates/include/smon/smon_http_server.html +++ b/app/templates/include/smon/smon_http_server.html @@ -19,7 +19,7 @@ {{ input(id, value=s_service.body, size='20') }} </td> <td> - {% set id = 'smon-http-method-' + s.id|string() %} + {% set id = 'smon-http_method-' + s.id|string() %} {% set http_methods = {'get': 'GET', 'post': 'POST', 'put': 'PUT', 'patch': 'PATCH', 'delete': 'DELETE', 'head': 'HEAD', 'options': 'OPTIONS'} %} {{ select(id, values=http_methods, selected=s_service.method) }} diff --git a/app/templates/include/tr_validate_tips.html b/app/templates/include/tr_validate_tips.html index d15db958..635ac2a3 100644 --- a/app/templates/include/tr_validate_tips.html +++ b/app/templates/include/tr_validate_tips.html @@ -1,7 +1,7 @@ <tr> <td colspan="2"> <p class="validateTips alert alert-success"> - {{lang.phrases.fields_mark}} "<span class="need-field">*</span>" {{lang.phrases.are_required}}. + {{lang.phrases.fields_mark}} "<span class="need-field">*</span>" {{lang.phrases.are_required}}. </p> </td> </tr> diff --git a/app/templates/install.html b/app/templates/install.html new file mode 100644 index 00000000..28f63d77 --- /dev/null +++ b/app/templates/install.html @@ -0,0 +1,413 @@ +{% extends "base.html" %} +{% block title %}{{lang.words.admin_area|title()}}{% endblock %} +{% block h2 %}{{lang.words.admin_area|title()}}{% endblock %} +{% block content %} +{% from 'include/input_macros.html' import select, checkbox %} +<script src="/inc/users.js"></script> +<script src="/inc/fontawesome.min.js"></script> +<div id="tabs"> + <ul id="admin-tabs"> + <li><a href="#service" title="{{lang.words.proxy|title()}} {{lang.words.service}} - Roxy-WI">{{lang.words.proxy|title()}} {{lang.words.service}}</a></li> + <li><a href="#monitoring" title="{{lang.words.monitoring|title()}} - Roxy-WI">{{lang.words.monitoring|title()}}</a></li> + <li><a href="#geolite2" title="GeoLite2 - Roxy-WI">GeoLite2</a></li> + </ul> + + <div id="service"> + {% if not is_needed_tool %} + <div style="text-align: center;"> + <h3>{{lang.admin_page.desc.no_ansible}}</h3>. + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4> + {{lang.words.install|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible. + </h4> + </div> + {% else %} + <table class="overview"> + <caption><h3>{{lang.words.install|title()}} HAProxy</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td> + <td class="padding10 first-collumn help_cursor" style="width: 30%;" title="{{lang.words.for|title()}} Ubuntu {{lang.admin_page.desc.latest_repo}}"> + {{lang.words.available|title()}} {{lang.words.versions}} (?) + </td> + <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td> + <td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}">{{lang.words.use|title()}} Docker</td> + <td>SYN-flood {{lang.words.protection}}</td> + <td></td> + </tr> + <tr> + <td id="cur_haproxy_ver" class="padding10 first-collumn"> + </td> + <td class="padding10 first-collumn" style="width: 20%;"> + {% set values = dict() %} + {% set values = {'2.4.23-1':'2.4.23-1','2.5.14-1':'2.5.14-1', '2.6.14-1':'2.6.14-1','2.7.9-1':'2.7.9-1','2.8.1-1':'2.8.1-1'} %} + {{ select('hapver', values=values, selected='2.8.1-1', required='required') }} + </td> + <td class="padding10 first-collumn"> + <select autofocus required name="haproxyaddserv" id="haproxyaddserv"> + <option disabled selected>------</option> + {% for select in servers %} + <option value="{{ select.2 }}">{{ select.1 }}</option> + {% endfor %} + </select> + </td> + <td style="padding-left: 25px;"> + {{ checkbox('haproxy_docker', title=lang.admin_page.desc.install_as_docker) }} + </td> + <td class="syn-flood-protection-field"> + {{ checkbox('syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }} + </td> + <td> + <span class="ui-button ui-widget ui-corner-all" id="install" title="{{lang.words.install|title()}} HAProxy">{{lang.words.install|title()}}</span> + </td> + </tr> + </table> + <table> + <caption><h3>{{lang.words.install|title()}} NGINX</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> + <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td> + <td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}" >{{lang.words.use|title()}} Docker</td> + <td>SYN-flood {{lang.words.protection}}</td> + <td></td> + </tr> + <tr> + <td id="cur_nginx_ver" class="padding10 first-collumn"> + </td> + <td class="padding10 first-collumn" style="width: 20%;"> + {{lang.admin_page.desc.latest_repo}} + </td> + <td class="padding10 first-collumn"> + <select autofocus required name="nginxaddserv" id="nginxaddserv"> + <option disabled selected>------</option> + {% for select in servers %} + <option value="{{ select.2 }}">{{ select.1 }}</option> + {% endfor %} + </select> + </td> + <td style="padding-left: 25px;"> + {{ checkbox('nginx_docker', title=lang.admin_page.desc.install_as_docker) }} + </td> + <td class="syn-flood-protection-field"> + {{ checkbox('nginx_syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }} + </td> + <td> + <span class="ui-button ui-widget ui-corner-all" id="nginx_install" title="{{lang.words.install|title()}} NGINX">{{lang.words.install|title()}}</span> + </td> + </tr> + </table> + <table> + <caption><h3>{{lang.words.install|title()}} Apache</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> + <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td> + <td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}" >{{lang.words.use|title()}} Docker</td> + <td>SYN-flood {{lang.words.protection}}</td> + <td></td> + </tr> + <tr> + <td id="cur_apache_ver" class="padding10 first-collumn"> + </td> + <td class="padding10 first-collumn" style="width: 20%;"> + {{lang.admin_page.desc.latest_repo}} + </td> + <td class="padding10 first-collumn"> + <select autofocus required name="apacheaddserv" id="apacheaddserv"> + <option disabled selected>------</option> + {% for select in servers %} + <option value="{{ select.2 }}">{{ select.1 }}</option> + {% endfor %} + </select> + </td> + <td style="padding-left: 25px;"> + {{ checkbox('apache_docker', title=lang.admin_page.desc.install_as_docker) }} + </td> + <td class="syn-flood-protection-field"> + {{ checkbox('apache_syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }} + </td> + <td> + <span class="ui-button ui-widget ui-corner-all" id="apache_install" title="{{lang.words.install|title()}} Apache">{{lang.words.install|title()}}</span> + </td> + </tr> + </table> + <div id="ajax"></div> + {% endif %} + </div> + + <div id="monitoring"> + {% if not is_needed_tool %} + <div style="text-align: center;"> + <h3>{{lang.admin_page.desc.no_ansible}} Ansible</h3>. + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4> + {{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">here</a> {{lang.phrases.how_to_install}} Ansible. + </h4> + </div> + {% else %} + {% if role|int() == 1 %} + <table id="grafana-table"> + <caption><i class="fas fa-chart-bar caption-icon2"></i><h3>Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.installation}}</td> + <td class="padding10 first-collumn" style="width: 40%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.note|title()}}</td> + <td></td> + <td></td> + </tr> + <tr> + <td id="cur_grafana_ver" class="padding10 first-collumn"> + {% if grafana == "active" %} + Grafana {{lang.words.and}} Prometheus {{lang.admin_page.desc.been_installed}} + {% else %} + {{lang.admin_page.desc.there_are_no}} + {% endif %} + </td> + <td class="padding10 first-collumn" style="width: 20%;"> + {{lang.admin_page.desc.latest_repo}} Grafana {{lang.words.and}} Prometheus + </td> + <td class="padding10 first-collumn"> + {{lang.admin_page.desc.before_install}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}} + </td> + <td></td> + <td> + {% if grafana != "active" %} + <span class="ui-button ui-widget ui-corner-all" id="grafna_install" title="{{lang.words.install|title()}} Grafana {{lang.words.and}} Prometheus {{lang.words.servers}}">{{lang.words.install|title()}}</span> + {% endif %} + </td> + </tr> + </table> + {% endif %} + <table id="haproxy-table"> + <caption><i class="fas fa-network-wired caption-icon2"></i><h3>HAProxy Exporter</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> + <td class="help_cursor" style="width: 20%;" data-intro="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td> + <td></td> + <td></td> + </tr> + <tr> + <td id="cur_haproxy_exp_ver" class="padding10 first-collumn"></td> + <td class="padding10 first-collumn" style="width: 20%;"> + {% set values = dict() %} + {% set values = {'0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0', '0.12.0':'0.12.0', '0.13.0':'0.13.0', '0.14.0':'0.14.0', '0.15.0':'0.15.0'} %} + {{ select('hapexpver', values=values, selected='0.15.0') }} + </td> + <td class="padding10 first-collumn"> + <select autofocus required name="haproxy_exp_addserv" id="haproxy_exp_addserv"> + <option disabled selected>------</option> + {% for select in servers %} + <option value="{{ select.2 }}">{{ select.1 }}</option> + {% endfor %} + </select> + </td> + <td style="padding-left: 50px;">{{ checkbox('haproxy_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> + <td> + <span class="ui-button ui-widget ui-corner-all" id="haproxy_exp_install" title="{{lang.words.install|title()}} HAProxy Exporter">{{lang.words.install|title()}}</span> + </td> + </tr> + </table> + <table id="nginx-table"> + <caption><i class="fas fa-sitemap caption-icon2"></i><h3>NGINX Exporter</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> + <td class="help_cursor" style="width: 20%;" data-help="lang.admin_page.desc.ext_prom">{{lang.words.external|title()}} Prometheus</td> + <td></td> + <td></td> + </tr> + <tr> + <td id="cur_nginx_exp_ver" class="padding10 first-collumn"></td> + <td class="padding10 first-collumn" style="width: 20%;"> + {% set values = dict() %} + {% set values = {'0.6.0':'0.6.0', '0.7.0':'0.7.0', '0.9.0':'0.9.0', '0.10.0':'0.10.0', '0.11.0':'0.11.0'} %} + {{ select('nginxexpver', values=values, selected='0.11.0') }} + </td> + <td class="padding10 first-collumn"> + <select autofocus required name="nginx_exp_addserv" id="nginx_exp_addserv"> + <option disabled selected>------</option> + {% for select in servers %} + <option value="{{ select.2 }}">{{ select.1 }}</option> + {% endfor %} + </select> + </td> + <td style="padding-left: 50px;">{{ checkbox('nginx_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> + <td> + <span class="ui-button ui-widget ui-corner-all" id="nginx_exp_install" title="{{lang.words.install|title()}} NGINX Exporter">{{lang.words.install|title()}}</span> + </td> + </tr> + </table> + <table id="apache-table"> + <caption><i class="fas fa-feather-alt caption-icon2"></i><h3>Apache Exporter</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> + <td class="help_cursor" style="width: 20%;" data-help="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td> + <td></td> + <td></td> + </tr> + <tr> + <td id="cur_apache_exp_ver" class="padding10 first-collumn"></td> + <td class="padding10 first-collumn" style="width: 20%;"> + {% set values = dict() %} + {% set values = {'0.10.0':'0.10.0', '0.13.4':'0.13.4', '1.0.1':'1.0.1'} %} + {{ select('apacheexpver', values=values, selected='1.0.1') }} + </td> + <td class="padding10 first-collumn"> + <select autofocus required name="apache_exp_addserv" id="apache_exp_addserv"> + <option disabled selected>------</option> + {% for select in servers %} + <option value="{{ select.2 }}">{{ select.1 }}</option> + {% endfor %} + </select> + </td> + <td style="padding-left: 50px;">{{ checkbox('apache_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> + <td> + <span class="ui-button ui-widget ui-corner-all" id="apache_exp_install" title="{{lang.words.install|title()}} Apache Exporter">{{lang.words.install|title()}}</span> + </td> + </tr> + </table> + <table id="keepalived-table"> + <caption><i class="fas fa-cloud caption-icon2"></i><h3>Keepalived Exporter</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> + <td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td> + <td></td> + <td></td> + </tr> + <tr> + <td id="cur_keepalived_exp_ver" class="padding10 first-collumn"></td> + <td class="padding10 first-collumn" style="width: 20%;"> + {% set values = dict() %} + {% set values = {'0.1.0':'0.1.0', '0.2.0':'0.2.0', '0.3.0':'0.3.0', '0.4.0':'0.4.0', '0.5.0':'0.5.0'} %} + {{ select('keepalivedexpver', values=values, selected='0.5.0') }} + </td> + <td class="padding10 first-collumn"> + <select autofocus required name="keepalived_exp_addserv" id="keepalived_exp_addserv"> + <option disabled selected>------</option> + {% for select in servers %} + <option value="{{ select.2 }}">{{ select.1 }}</option> + {% endfor %} + </select> + </td> + <td style="padding-left: 50px;">{{ checkbox('keepalived_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> + <td> + <span class="ui-button ui-widget ui-corner-all" id="keepalived_exp_install" title="{{lang.words.install|title()}} Keepalived Exporter">{{lang.words.install|title()}}</span> + </td> + </tr> + </table> + <table style="margin-top: 20px" id="node-table"> + <caption><i class="fas fa-server caption-icon2"></i><h3>Node Exporter</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.server|title()}}</td> + <td class="help_cursor" style="width: 20%;" title="{{lang.admin_page.desc.ext_prom}}">{{lang.words.external|title()}} Prometheus</td> + <td></td> + <td></td> + </tr> + <tr> + <td id="cur_node_exp_ver" class="padding10 first-collumn"></td> + <td class="padding10 first-collumn" style="width: 20%;"> + {% set values = dict() %} + {% set values = {'1.2.0':'1.2.0', '1.2.2':'1.2.2', '1.3.0':'1.3.0', '1.3.1':'1.3.1', '1.5.0':'1.5.0', '1.6.1':'1.6.1'} %} + {{ select('nodeexpver', values=values, selected='1.6.1') }} + </td> + <td class="padding10 first-collumn"> + <select autofocus required name="node_exp_addserv" id="node_exp_addserv"> + <option disabled selected>------</option> + {% for select in servers %} + <option value="{{ select.2 }}">{{ select.1 }}</option> + {% endfor %} + </select> + </td> + <td style="padding-left: 50px;">{{ checkbox('node_ext_prom', title=lang.admin_page.desc.ext_prom) }}</td> + <td> + <span class="ui-button ui-widget ui-corner-all" id="node_exp_install" title="{{lang.words.install|title()}} Node Exporter">{{lang.words.install|title()}}</span> + </td> + </tr> + </table> + <div id="ajaxmon"></div> + <div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;"> + {{lang.words.read|title()}} <a href="https://roxy-wi.org/services/grafana" title="About Grafana and Prometheus servers" target="_blank">{{lang.words.about|title()}} Grafana and Prometheus servers</a> + {{lang.words.and}} <a href="https://roxy-wi.org/howto/exporters" title="About Exporters" target="_blank">{{lang.words.about|title()}} Exporters</a> + </div> + </div> + <div id="geolite2"> + <table> + {% if not is_needed_tool %} + <div style="text-align: center;"> + <h3>{{lang.admin_page.desc.no_ansible}}</h3>. + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4> + {{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible. + </h4> + </div> + {% else %} + <caption><h3>Install GeoLite2</h3></caption> + <tr class="overviewHead"> + <td class="padding10 first-collumn">{{lang.words.server|title()}}</td> + <td class="padding10 first-collumn">{{lang.words.service|title()}}</td> + <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> + <td class="" style="width: 30%;" title="GeoLite2 DB is released every Tuesday. Should Roxy-WI update it?">{{lang.words.updating|title()}}</td> + <td></td> + <td></td> + </tr> + <tr> + <td class="padding10 first-collumn"> + <select autofocus required name="geoipserv" id="geoipserv"> + <option disabled selected>------</option> + {% for select in servers %} + <option value="{{ select.2 }}">{{ select.1 }}</option> + {% endfor %} + </select> + </td> + <td class="padding10 first-collumn"> + <select autofocus required name="geoip_service" id="geoip_service"> + <option disabled selected>------</option> + <option value="haproxy">HAProxy</option> + <option value="nginx">NGINX</option> + </select> + </td> + <td id="cur_geoip" class="padding10"></td> + <td class="checkbox"> + {{ checkbox('updating_geoip', title="Update the database?", checked='checked') }} + </td> + <td> + <span class="ui-button ui-widget ui-corner-all" id="geoip_install" title="{{lang.words.install|title()}} GeoLite2" style="display: none;">{{lang.words.install|title()}}</span> + </td> + </tr> + {% endif %} + </table> + <div id="ajax-geoip"></div> + <div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px; margin-bottom: 15px;"> + {{lang.phrases.howto_user}} {{lang.words.read}} {{lang.words.in}} {{lang.words.this2}} <a href="https://roxy-wi.org/howto/geoip" title="GeoLite2 {{lang.words.descr|title()}}" target="_blank">{{lang.words.article}}</a> + </div> + <table style="min-width: 40%;"> + <tr class="overviewHead"> + <th colspan=13 style="background-color: #d1ecf1; padding: 10px;"> + <span id="table_metrics_head" style="margin-left: 5px;">{{lang.admin_page.desc.country_codes}}</span> + <select id="geoip_select"> + {% for code in geoip_country_codes %} + <option>{{code.name}} {{code.code}}</option> + {% endfor %} + </select> + </th> + </tr> + </table> + </div> +</div> +{% endif %} +<script> + $('#geoip_select').select2(); + $( function() { + $("#geoip_select").selectmenu("destroy"); + }); +</script> +{% endblock %} diff --git a/app/templates/languages/en.html b/app/templates/languages/en.html index 5d4dbc52..75dce292 100644 --- a/app/templates/languages/en.html +++ b/app/templates/languages/en.html @@ -472,6 +472,8 @@ "is_enabled_and_down": "Port scanner is enabled, but service is DOWN", "scanning_ports": "Scanning open/filtered ports for the server", "total_open_ports": "Total opened ports", + "p_s_title": "Port scanner dashboard", + "p_s_title_history": "Port scanner history for", } } %} @@ -877,5 +879,6 @@ "maps": "maps", "map": "map", "method": "method", + "tools": "tools", } %} diff --git a/app/templates/languages/fr.html b/app/templates/languages/fr.html index 74f9361c..09a02d13 100644 --- a/app/templates/languages/fr.html +++ b/app/templates/languages/fr.html @@ -472,6 +472,8 @@ "is_enabled_and_down": "Le scanner de port est activé, mais le service est DOWN", "scanning_ports": "Analyse des ports ouverts/filtrés pour le serveur", "total_open_ports": "Total des ports ouverts", + "p_s_title": "Tableau de bord du scanner de ports", + "p_s_title_history": "Historique du scanner de ports pour", } } %} @@ -877,5 +879,6 @@ "maps": "cartes", "map": "carte", "method": "méthode", + "tools": "outils", } %} diff --git a/app/templates/languages/pt-br.html b/app/templates/languages/pt-br.html index 0db8b357..5f5f4b01 100644 --- a/app/templates/languages/pt-br.html +++ b/app/templates/languages/pt-br.html @@ -472,6 +472,8 @@ "is_enabled_and_down": "O port scanner está ativado, mais o serviço está DOWN", "scanning_ports": "Verificando portas abertas/filtradas para o servidor", "total_open_ports": "Número total de portas abertas", + "p_s_title": "Painel do scanner de porta", + "p_s_title_history": "Histórico do scanner de porta para", } } %} @@ -877,5 +879,6 @@ "maps": "mapas", "map": "mapa", "method": "método", + "tools": "ferramentas", } %} diff --git a/app/templates/languages/ru.html b/app/templates/languages/ru.html index ab8487ce..c32ebc4e 100644 --- a/app/templates/languages/ru.html +++ b/app/templates/languages/ru.html @@ -472,6 +472,8 @@ "is_enabled_and_down": "Port scanner включен, но сервис отключен", "scanning_ports": "Сканирование открытых/фильтрованных портов для сервера", "total_open_ports": "Всего открыто портов", + "p_s_title": "Дашборд Port scanner", + "p_s_title_history": "История Port scanner для", } } %} @@ -877,5 +879,6 @@ "maps": "карты", "map": "карта", "method": "метод", + "tools": "инструменты", } %} diff --git a/app/templates/login.html b/app/templates/login.html index d31a73f7..8087b08d 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -59,9 +59,11 @@ body, .container { <div id="main_div"> <div id="login-form" style="padding-top: 40px; padding-bottom: 50px; height: 250px; color: #000;"> <span id="logo_span"> - <img src="/inc/images/logo_login.png"> + <img src="{{ url_for('static', filename='images/logo_login.png')}}"> </span> - <form name="auth" id="auth" action="login.py" class="form-horizontal" method="post" style="margin-top: 60px;left: 0;float: left;margin-left: 93px;"> + <form class="form-horizontal" id="auth" method="post" style="margin-top: 60px;left: 0;float: left;margin-left: 93px;"> + <span style="color: white;font-weight: bold;padding-left: 10px;">Login/Password admin/admin</span> + <br> <div class="fontuser"> {{ input('login', class='form-login', placeholder=lang.words.login|title(), required='required', autofocus='autofocus') }} <i class="fa fa-user fa-lg"></i> @@ -83,6 +85,11 @@ body, .container { {{error}} </div> {% endif %} + {% with messages = get_flashed_messages(with_categories=true) %} + {% for category, message in messages %} + <div class="{{ category }}" style="width: 15%;">{{ message }}</div> + {% endfor %} + {% endwith %} <div class="alert alert-danger wrong-login alert-one-row" id="wrong-login"> {{lang.phrases.login_or_pass_incorrect}} <br /> diff --git a/app/templates/logs.html b/app/templates/logs.html index 0dca6764..599d5dd4 100644 --- a/app/templates/logs.html +++ b/app/templates/logs.html @@ -8,16 +8,12 @@ <table class="overview"> <tr class="overviewHead"> <td class="padding10 first-collumn" style="width: 10%;"> - {% if select_id == 'viewlogs' %} - {{lang.words.log|title()}} - {% else %} - {{lang.words.server|title()}} - {% endif %} + {{lang.words.server|title()}} </td> - {% if waf != '1' and select_id != 'viewlogs' %} + {% if not waf %} <td style="width: 10%;">{{lang.words.log|title()}} {{lang.words.files|title()}}</td> {% endif %} - {% if select_id != 'viewlogs' and service != 'nginx' %} + {% if service != 'nginx' %} {% endif %} <td style="width: 10%;">{{lang.words.number|title()}} {{lang.words.rows}}</td> <td class="help_cursor" style="width: 10%;" title="" data-help="{{lang.phrases.find_in_log}}">{{lang.words.find|title()}}</td> @@ -32,32 +28,9 @@ <tr> <td class="padding10 first-collumn" style="width: 10%;"> <form action="" method="post" id="show_log_form"> - {% if select_id == 'viewlogs' %} - <select autofocus required name="serv" id="{{ select_id }}"> - <option disabled selected>------</option> - {% for select in selects %} - {% if page == 'for_editor' %} - {% if select.1.startswith('roxy-wi') or select.1.startswith('config_edit') or select.1.startswith('port_sca') %} - {% if select.0 == serv %} - <option value="{{ select.0 }}" selected>{{ select.1 }}</option> - {% else %} - <option value="{{ select.0 }}">{{ select.1 }}</option> - {% endif %} - {% endif %} - {% else %} - {% if select.0|int() == serv|int() %} - <option value="{{ select.0 }}" selected>{{ select.1 }}</option> - {% else %} - <option value="{{ select.0 }}">{{ select.1 }}</option> - {% endif %} - {% endif %} - {% endfor %} - </select> - {% else %} - {% include 'include/select.html' %} - {% endif %} + {% include 'include/select.html' %} </td> - {% if waf != '1' and select_id != 'viewlogs' %} + {% if not waf %} <td id="remote_log_files"></td> {% endif %} <td style="width: 10%;"> @@ -79,31 +52,11 @@ </tr> </table> <div id="ajax"></div> -{% if select_id == 'viewlogs' and serv != '' and viewlogs != '' and viewlogs != 'roxy-wi.error.log' and viewlogs != 'roxy-wi.access.log' %} - <script> - viewLogs() - if (window.matchMedia('(max-width: 786px)').matches || window.matchMedia('(max-width: 1024px)').matches || window.matchMedia('(max-width: 667px)').matches) { - $( "#viewlogs" ).selectmenu({ - width: 150 - }); - } - </script> - <div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;"> - {{lang.phrases.read_about_files}} <a href="https://roxy-wi.org/description/logs" title="{{lang.words.servers|title()}} {{lang.words.desc}}" target="_blank" class="link">{{lang.words.here}}</a> - </div> -{% elif serv == 'roxy-wi.error.log' or serv == 'roxy-wi.access.log' %} - <script> - showApacheLog('{{serv}}'); - </script> - <div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;"> - {{lang.phrases.read_about_files}} <a href="https://roxy-wi.org/description/logs" title="{{lang.words.servers|title()}} {{lang.words.desc}}" target="_blank" class="link">{{lang.words.here}}</a> - </div> -{% else %} - <script> - {% if waf == '1' %} +<script> + {% if waf %} $('#waf').prop('checked', true); {% endif %} - {% if waf != '1' %} + {% if not waf %} {% if remote_file %} showLog() {% else %} @@ -117,13 +70,12 @@ {% endif %} if (window.matchMedia('(max-width: 786px)').matches || window.matchMedia('(max-width: 1024px)').matches || window.matchMedia('(max-width: 667px)').matches) { - $( "#serv" ).selectmenu({ + $( "#serv" ).selectmenu({ width: 150 }); $( "#log_files" ).selectmenu({ width: 150 }); } - </script> -{% endif %} -{% endblock %} \ No newline at end of file +</script> +{% endblock %} diff --git a/app/templates/logs_internal.html b/app/templates/logs_internal.html new file mode 100644 index 00000000..f105e6c8 --- /dev/null +++ b/app/templates/logs_internal.html @@ -0,0 +1,76 @@ +{% extends "base.html" %} +{% block title %}{{lang.words.internal|title()}} {{lang.words.logs}}{% endblock %} +{% block h2 %}{{lang.words.internal|title()}} {{lang.words.logs}}{% endblock %} +{% block content %} +{% from 'include/input_macros.html' import input, checkbox %} +<script src="/inc/users.js"></script> +<input type="hidden" id="service" value="{{service}}" /> +<table class="overview"> + <tr class="overviewHead"> + <td class="padding10 first-collumn" style="width: 10%;"> + {{lang.words.log|title()}} + </td> + <td style="width: 10%;">{{lang.words.number|title()}} {{lang.words.rows}}</td> + <td class="help_cursor" style="width: 10%;" title="" data-help="{{lang.phrases.find_in_log}}">{{lang.words.find|title()}}</td> + <td class="help_cursor" style="width: 10%;" title="" data-help="{{lang.phrases.exclude_in_log}}">{{lang.words.exclude|title()}}</td> + <td style="width: 10%;"> + <label for="time_range_out_hour" style="padding: 0">{{lang.words.time_range|title()}}:</label> + {{ input('time_range_out_hour', value=hour, class='time-range', readonly='readonly') }}:{{ input('time_range_out_minut', value=minut, class='time-range', readonly='readonly') }} + {{ input('time_range_out_hour1', value=hour1, class='time-range', readonly='readonly') }}:{{ input('time_range_out_minut1', value=minut1, class='time-range', readonly='readonly') }} + </td> + <td></td> + </tr> + <tr> + <td class="padding10 first-collumn" style="width: 10%;"> + <form action="" method="post" id="show_internal_log_form"> + <select autofocus required name="serv" id="viewlogs"> + <option selected>------</option> + {% for select in selects %} + {% if select.0 == serv %} + <option value="{{ select.0 }}" selected>{{ select.1 }}</option> + {% else %} + <option value="{{ select.0 }}">{{ select.1 }}</option> + {% endif %} + {% endfor %} + </select> + </td> + <td style="width: 10%;"> + {{ input('rows', type='number', value='10', required='required', style='width: 110px;') }} + </td> + <td style="width: 10%;"> + {{ input('grep', value=grep, style='width: 110px;') }} + </td> + <td style="width: 10%;"> + {{ input('exgrep', value=exgrep, style='width: 110px;') }} + </td> + <td style="width: 10%;"> + <div id="time-range"></div> + </td> + <td class="padding10 first-collumn" style="width: 1%;"> + <button type="submit" name="Show log" value="Show" id="show_log_button">{{lang.words.show|title()}}</button> + </form> + </td> + </tr> +</table> +<div id="ajax"></div> +{% if serv == 'roxy-wi.error.log' or serv == 'roxy-wi.access.log' %} + <script> + showApacheLog('{{serv}}'); + </script> + <div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;"> + {{lang.phrases.read_about_files}} <a href="https://roxy-wi.org/description/logs" title="{{lang.words.servers|title()}} {{lang.words.desc}}" target="_blank" class="link">{{lang.words.here}}</a> + </div> +{% else %} + <script> + viewLogs() + if (window.matchMedia('(max-width: 786px)').matches || window.matchMedia('(max-width: 1024px)').matches || window.matchMedia('(max-width: 667px)').matches) { + $( "#viewlogs" ).selectmenu({ + width: 150 + }); + } + </script> + <div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;"> + {{lang.phrases.read_about_files}} <a href="https://roxy-wi.org/description/logs" title="{{lang.words.servers|title()}} {{lang.words.desc}}" target="_blank" class="link">{{lang.words.here}}</a> + </div> +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/templates/metrics.html b/app/templates/metrics.html index 146dc93f..c57daf98 100644 --- a/app/templates/metrics.html +++ b/app/templates/metrics.html @@ -16,15 +16,16 @@ } </style> <link href="/inc/css/chart.min.css" rel="stylesheet"> -<script src="/inc/metrics-6.3.16.0.js"></script> +<script src="/inc/metrics.js"></script> <script src="/inc/chart.min-4.3.0.js"></script> +<input type="hidden" id="service" value="{{service}}"> {% if user_status == 0 %} {% include 'include/no_sub.html' %} {% elif services == '0' %} <div style="text-align: center;"> <br /> <h3>{{lang.phrases.metrics_not_installed}}</h3> - <img src="/inc/images/no_servers.png" alt="There is no server"> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> <h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/metrics#installation" title="Metrics {{lang.words.installation}}" style="color: #5d9ceb;" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install_metrics}}</h4> </div> diff --git a/app/templates/nettools.html b/app/templates/nettools.html index 26ce11ea..049388ef 100644 --- a/app/templates/nettools.html +++ b/app/templates/nettools.html @@ -18,7 +18,7 @@ border: 1px solid #ccc; } </style> -<form name="nettools_icmp_form" id="nettools_icmp_form" method="post" action="options.py"> +<form name="nettools_icmp_form" id="nettools_icmp_form" method="post" action="/app/nettols/icmp"> <table class="overview"> <caption><h3>ICMP</h3></caption> <tr class="overviewHead"> @@ -29,7 +29,7 @@ </tr> <tr> <td class="padding10 first-collumn"> - <select autofocus required name="nettools_icmp_server_from" id="nettools_icmp_server_from"> + <select autofocus required name="server_from" id="nettools_icmp_server_from"> <option disabled selected>------</option> <option value="localhost">Roxy-WI</option> {% for server in servers %} @@ -38,7 +38,7 @@ </select> </td> <td class="padding10 first-collumn"> - {{ input('nettools_icmp_server_to', title='Enter IP or Name') }} + {{ input('nettools_icmp_server_to', name='server_to', title='Enter IP or Name') }} {{ input('token', value=token, type='hidden') }} </td> <td class="padding10 first-collumn"> @@ -50,7 +50,7 @@ </tr> </table> </form> -<form name="nettools_telnet_form" id="nettools_telnet_form" method="post" action="options.py"> +<form name="nettools_telnet_form" id="nettools_telnet_form" method="post" action="/app/nettols/tcp"> <table class="overview"> <caption><h3>Check port</h3></caption> <tr class="overviewHead"> @@ -61,7 +61,7 @@ </tr> <tr> <td class="padding10 first-collumn"> - <select autofocus required name="nettools_telnet_server_from" id="nettools_telnet_server_from"> + <select autofocus required name="server_from" id="nettools_telnet_server_from"> <option disabled selected>------</option> <option value="localhost">Roxy-WI</option> {% for server in servers %} @@ -70,7 +70,7 @@ </select> </td> <td class="padding10 first-collumn"> - {{ input('nettools_telnet_server_to', title='Enter IP or Name') }} + {{ input('nettools_nslookup_server_to', name='server_to', title='Enter IP or Name') }} {{ input('token', value=token, type='hidden') }} </td> <td class="padding10 first-collumn"> @@ -82,7 +82,7 @@ </tr> </table> </form> -<form name="nettools_nslookup_form" id="nettools_nslookup_form" method="post" action="options.py"> +<form name="nettools_nslookup_form" id="nettools_nslookup_form" method="post" action="/app/nettols/dns"> <table class="overview"> <caption><h3>NSLookup</h3></caption> <tr class="overviewHead"> @@ -93,7 +93,7 @@ </tr> <tr> <td class="padding10 first-collumn"> - <select autofocus required name="nettools_nslookup_server_from" id="nettools_nslookup_server_from"> + <select autofocus required name="server_from" id="nettools_nslookup_server_from"> <option disabled selected>------</option> <option value="localhost">Roxy-WI</option> {% for server in servers %} diff --git a/app/templates/ovw.html b/app/templates/ovw.html index eeb5971f..838e9e41 100644 --- a/app/templates/ovw.html +++ b/app/templates/ovw.html @@ -3,9 +3,9 @@ {% block h2 %}{{lang.menu_links.overview.h2}}{% endblock %} {% block content %} <link href="/inc/css/chart.min.css" rel="stylesheet"> -<script src="/inc/metrics-6.3.16.0.js"></script> +<script src="/inc/metrics.js"></script> <script src="/inc/chart.min-4.3.0.js"></script> -<script src="/inc/overview-6.3.9.js"></script> +<script src="/inc/overview.js"></script> <script> $("#secIntervals").css("display", "none"); var ip = [] @@ -25,33 +25,33 @@ <tr class="overviewHead"> <td class="padding10 first-collumn-wi"> {% if role <= 2 %} - <a href="servers.py#servers" title="{{lang.words.manage|title()}} {{lang.words.servers}}">{{lang.words.servers|title()}}</a> + <a href="servers#servers" title="{{lang.words.manage|title()}} {{lang.words.servers}}">{{lang.words.servers|title()}}</a> {% else %} {{lang.words.servers|title()}} {% endif %} </td> <td class="padding10 third-collumn-wi" style="width: 20%;"> - <a href="/app/hapservers.py?service=haproxy" title="HAProxy {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> + <a href="/app/service/haproxy" title="HAProxy {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> HAProxy </a> </td> <td class="padding10"> - <a href="/app/hapservers.py?service=nginx" title="NGINX {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> + <a href="/app/service/nginx" title="NGINX {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> NGINX </a> </td> <td class="padding10"> - <a href="/app/hapservers.py?service=apache" title="Apache {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> + <a href="/app/service/apache" title="Apache {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> Apache </a> </td> <td class="padding10"> - <a href="/app/hapservers.py?service=keepalived" title="Keepalived {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> + <a href="/app/service/keepalived" title="Keepalived {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> Keepalived </a> </td> <td class="padding10"> - <a href="/app/waf.py?service=haproxy" title="HAProxy WAF {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> + <a href="/app/waf/haproxy" title="HAProxy WAF {{lang.words.servers}} {{lang.words.overview}}" class="logs_link"> WAF </a> </td> @@ -69,7 +69,7 @@ <tr class="overviewHead" style="height: 30px;"> <td class="padding10 first-collumn-wi" colspan="2"> {% if role <= 1 %} - <a href="/app/viewlogs.py?viewlogs={{roxy_wi_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link"> + <a href="/app/internal/{{roxy_wi_log_id}}" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link"> Roxy-WI {{lang.words.server_status}} </a> {% else %} @@ -98,7 +98,7 @@ <tr class="overviewHead"> <td class="padding10 first-collumn-wi" colspan=2> {% if role <= 1 %} - <a href="/app/users.py#services" title="{{lang.words.view|title()}} {{lang.words.services}} {{lang.words.status}}" class="logs_link"> + <a href="admin#services" title="{{lang.words.view|title()}} {{lang.words.services}} {{lang.words.status}}" class="logs_link"> Roxy-WI {{lang.words.services_status}} </a> {% else %} @@ -116,7 +116,7 @@ </table> {% if role <= 2 %} {% if role == 2 %} - {% set admin_uri = 'servers.py' %} + {% set admin_uri = 'servers' %} {% elif role == 1 %} {% set admin_uri = 'users.py' %} {% endif %} @@ -152,7 +152,7 @@ <table class="overview-wi" id="overview-groups"> <tr class="overviewHead"> <td class="padding10 first-collumn-wi"> - <a href="users.py#groups" title="Manage groups" class="logs_link">{{lang.words.groups|title()}}</a> + <a href="/app/users#groups" title="Manage groups" class="logs_link">{{lang.words.groups|title()}}</a> </td> <td class="second-collumn" style="width: 40%">{{lang.words.desc|title()}}</td> <td> @@ -209,9 +209,9 @@ <tr class="overviewHead"> <td class="padding10 first-collumn-wi"> {% if role == 2 %} - <a href="/app/viewlogs.py?type=2&viewlogs={{roxy_wi_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link"> + <a href="/app/internal/{{roxy_wi_log_id}}?type=2" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link"> {% else %} - <a href="/app/viewlogs.py?viewlogs={{roxy_wi_log_id}}&rows=10&grep=&hour=00&minut=00&hour1=24&minut1=00" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link"> + <a href="/app/internal/{{roxy_wi_log_id}}" title="{{lang.words.view|title()}} Roxy-WI {{lang.words.logs}}" class="logs_link"> {% endif %} {{lang.words.recent|title()}} Roxy-WI {{lang.words.logs}} </a> diff --git a/app/templates/portscanner.html b/app/templates/portscanner.html index 7404c53b..48690400 100644 --- a/app/templates/portscanner.html +++ b/app/templates/portscanner.html @@ -1,18 +1,9 @@ {% extends "base.html" %} -{% block title %}{{ title }}{% endblock %} -{% block h2 %}{{ title }}{% endblock %} +{% block title %}{{ lang.p_s_page.p_s_title }}{% endblock %} +{% block h2 %}{{ lang.p_s_page.p_s_title }}{% endblock %} {% block content %} {% from 'include/input_macros.html' import input, checkbox, select %} -<script src="/inc/overview-6.3.9.js"></script> -{% if serv %} -<style> -@media (max-width: 1280px) { - .div-pannel { - height: 430px !important; - } -} -</style> -{% endif %} +<script src="/inc/overview.js"></script> <style> .alert-danger { width: 250px; @@ -30,12 +21,10 @@ {% if user_status == 0 %} {% include 'include/no_sub.html' %} {% else %} -{% if history %} - {% include 'include/port_scan_history.html' %} -{% elif port_scanner_stderr != '' %} +{% if port_scanner_stderr != '' %} <div style="text-align: center;"> <br /> - <h3>{{lang.admin_page.desc.no_ansible}} Port scanner {{lang.words.service}}. {{lang.words.read|title()}} <a href="https://roxy-wi.org/services.py/portscanner" + <h3>{{lang.admin_page.desc.no_ansible}} Port scanner {{lang.words.service}}. {{lang.words.read|title()}} <a href="https://roxy-wi.org/services/portscanner" title="Port scanner" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Port scanner {{lang.words.service}}</h3> </div> {% else %} @@ -71,7 +60,7 @@ <span id="portscanner_enable_status-{{s.0}}" class="serverNone server-status" title="Port scanner {{lang.words.is}} {{lang.words.disabled}}"></span> {% endif %} {% if not serv %} - <a href="/app/portscanner.py?history={{s.2}}" title="{{lang.words.view|title()}} Port scanner {{lang.words.history2}} {{lang.words.for}} {{s.1}}" style="color: #5d9ceb">{{s.1}}</a> + <a href="/app/portscanner/history/{{s.2}}" title="{{lang.words.view|title()}} Port scanner {{lang.words.history2}} {{lang.words.for}} {{s.1}}" style="color: #5d9ceb">{{s.1}}</a> {% else %} {{s.1}} {% endif %} @@ -159,12 +148,11 @@ <script> function scanPorts(id) { $.ajax({ - url: "options.py", - data: { - scan_ports: id, - token: $('#token').val() - }, - type: "POST", + url: "/app/portscanner/scan/" + id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { @@ -173,7 +161,7 @@ toastr.clear(); $("#show_scans_ports_body").html(data); var close_word = $('#translate').attr('data-close'); - $("#show_scans_ports" ).dialog({ + $("#show_scans_ports").dialog({ resizable: false, height: "auto", width: 360, @@ -181,15 +169,15 @@ title: "{{lang.words.opened|title()}} {{lang.words.ports}}", buttons: [{ text: close_word, - click: function() { - $( this ).dialog( "close" ); + click: function () { + $(this).dialog("close"); $("#show_scans_ports_body").html(''); } }] }); } } - } ); + }); } $( ".server-act-links" ).change(function() { var id = $(this).attr('id').split('-'); @@ -224,26 +212,26 @@ $('#portscanner_notify-'+id).checkboxradio('disable'); $('#portscanner_history-'+id).checkboxradio('disable'); } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/portscanner/settings", data: { - portscanner_history_server_id: id, - portscanner_enabled: portscanner_enabled, - portscanner_notify: portscanner_notify, - portscanner_history: portscanner_history, + server_id: id, + enabled: portscanner_enabled, + notify: portscanner_notify, + history: portscanner_history, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); } else { toastr.clear(); - $("#server-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#server-"+id).removeClass( "update" ); - }, 2500 ); + $("#server-" + id).addClass("update", 1000); + setTimeout(function () { + $("#server-" + id).removeClass("update"); + }, 2500); } } } ); diff --git a/app/templates/provisioning.html b/app/templates/provisioning.html deleted file mode 100644 index a8372894..00000000 --- a/app/templates/provisioning.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends "base.html" %} -{% block content %} -{% from 'include/input_macros.html' import input, select, checkbox %} -<link href="/inc/css/provisioning.css" rel="stylesheet"> -<script src="/inc/users.js"></script> -<script src="/inc/fontawesome.min.js"></script> -{% include 'include/del_confirm.html' %} -<div id="tabs"> - <ul> - <li><a href="#provisioning" title="Server provisioning - Roxy-WI">Provisioning</a></li> - <li><a href="#providers" title="Providers settings - Roxy-WI">Providers</a></li> - {% include 'include/login.html' %} - </ul> - <ul id='browse_histroy'></ul> - <div id="provisioning"> - {% if not is_needed_tool %} - <div style="text-align: center;"> - <br /> - <h3>You have not installed Terraform.</h3> - <img src="/inc/images/no_servers.png" alt="There is no server"> - <h4>Read <a href="https://www.terraform.io/downloads.html" - title="Download Terraform" target="_blank" class="link">here</a> how to install Terraform.</h4> - </div> - {% else %} - <table class="overview" id="ajax-provisioning"> - <thead> - <tr class="overviewHead"> - <th class="padding10 first-collumn">{{lang.words.name|title()}}</th> - <th>{{lang.words.provider|title()}}</th> - {% if role == 1 %} - <th>{{lang.words.group|title()}}</th> - {% endif %} - <th>{{lang.words.cloud|title()}}</th> - <th>{{lang.words.region|title()}}</th> - <th>{{lang.words.OS}}</th> - <th>IP</th> - <th>{{lang.words.instance_type}}</th> - <th>{{lang.words.status|title()}}</th> - <th>{{lang.words.created_at}}</th> - <th></th> - <th></th> - </tr> - </thead> - <tbody id="ajax-provisioning-body"> - {% include 'ajax/provisioning/provisioned_servers.html' %} - </tbody> - </table> - <br /><span class="add-button" title="{{lang.words.create|title()}} {{lang.words.w_a}} {{lang.words.new}} {{lang.words.server}}" id="create-provider-button">+ {{lang.words.add|title()}}</span> - {% endif %} - </div> - <div id="providers"> - <table class="overview" id="ajax-providers"> - <thead> - <tr class="overviewHead"> - <th class="padding10 first-collumn">{{lang.words.name|title()}}</th> - <th>{{lang.words.cloud|title()}}</th> - {% if role == 1 %} - <th>{{lang.words.group|title()}}</th> - {% endif %} - <th>{{lang.words.created_at}}</th> - <th>{{lang.words.edited_at}}</th> - <th></th> - <th></th> - </tr> - </thead> - <tbody> - {% include 'ajax/provisioning/providers.html' %} - </tbody> - </table> - <br /><span class="add-button" title="{{lang.words.add|title()}} {{lang.words.w_a}} {{lang.words.new}} {{lang.words.provider}}" id="add-provider-button">+ {{lang.words.add|title()}}</span> - </div> -</div> -{% include 'include/provisioning/creating_dialogs.html' %} -{% include 'include/provisioning/providers_dialogs.html' %} -<script src="/inc/provisioning.js"></script> -{% endblock %} diff --git a/app/templates/runtimeapi.html b/app/templates/runtimeapi.html index a523fe1a..b382c18b 100644 --- a/app/templates/runtimeapi.html +++ b/app/templates/runtimeapi.html @@ -288,7 +288,7 @@ </table> <div id="ajaxlist"></div> <div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;"> - {{lang.phrases.read_how_it_works}} <a href="https://roxy-wi.org/description.py/runtimeapi#lists" title="{{lang.words.manage|title()}} {{lang.words.lists}}" target="_blank">{{lang.words.here}}</a> + {{lang.phrases.read_how_it_works}} <a href="https://roxy-wi.org/description/runtimeapi#lists" title="{{lang.words.manage|title()}} {{lang.words.lists}}" target="_blank">{{lang.words.here}}</a> </div> </div> <div id="sessions"> diff --git a/app/templates/sections.html b/app/templates/sections.html index 1e80e25c..c06a6eeb 100644 --- a/app/templates/sections.html +++ b/app/templates/sections.html @@ -3,7 +3,7 @@ {% block h2 %}{{lang.words.edit|title()}} {{lang.words.section2}} {% endblock %} {% block content %} {% if is_serv_protected and role > 2 %} -<meta http-equiv="refresh" content="0; url=/app/hapservers.py?service={{service}}"> +<meta http-equiv="refresh" content="0; url=/app/service/{{service}}"> {% else %} <link rel="stylesheet" href="/inc/codemirror/lib/codemirror.css"> <link rel="stylesheet" href="/inc/codemirror/addon/dialog/dialog.css"> @@ -24,11 +24,11 @@ <script src="/inc/codemirror/addon/fold/brace-fold.js"></script> <script src="/inc/codemirror/addon/fold/comment-fold.js"></script> <script src="/inc/codemirror/addon/scroll/annotatescrollbar.js"></script> -<script src="/inc/codemirror/mode/nginx.js"></script> <script src="/inc/codemirror/mode/haproxy.js"></script> <script src="/inc/codemirror/keymap/sublime.js"></script> -<form action="{{ action }}" method="post" class="left-space" style="margin-top: var(--indent);"> - <select autofocus required name="section" id="{{ select_id }}"> +<script src="/inc/configshow.js"></script> +<div class="left-space" style="margin-top: var(--indent);"> + <select autofocus required name="section" id="section"> <option disabled>------</option> {% for s in sections %} {% if s == section %} @@ -38,20 +38,21 @@ {% endif %} {% endfor %} </select> - <input type="hidden" value="{{ serv }}" name="serv"> + <input type="hidden" value="{{ serv }}" name="serv" id="serv"> {% if role <= 3 %} - <button type="submit" value="open" name="open" class="btn btn-default" title="{{lang.words.edit|title()}} {{lang.words.running}} {{lang.words.config}}">{{lang.words.edit|title()}}</button> + <a class="ui-button ui-widget ui-corner-all" title="{{lang.words.edit|title()}} {{lang.words.running}} {{lang.words.config}}" onclick="openSection()">{{lang.words.edit|title()}}</a> {% endif %} -</form> +</div> {% if config %} {% if role <= 3 %} <div id="config" class="left-space"> <h4>{{lang.phrases.you_are_editing}} "{{section}}" {{lang.phrases.section_from_server}} {{ serv }}</h4> - <form action="{{ action }}" name="saveconfig" method="post"> + <form action="/app/config/section/haproxy/{{serv}}/save" name="saveconfig" id="saveconfig" method="post"> <input type="hidden" value="{{ serv }}" name="serv"> <input type="hidden" value="{{ start_line }}" name="start_line"> <input type="hidden" value="{{ end_line }}" name="end_line"> <input type="hidden" value="{{ cfg }}.old" name="oldconfig"> + <input type="hidden" value="haproxy" name="service"> <div style="width: 95%;"> <textarea name="config" class="config" id="config_text_area" rows="35" cols="100" style="height: 40%">{{ config }}</textarea> </div> @@ -98,19 +99,6 @@ </script> {% endif %} {% endif %} - {% if aftersave %} - <div class="alert alert-info">{{lang.phrases.new_config_has_been_saved}}: {{ cfg }} </div> - {% if stderr or error %} - {% include 'include/errors.html' %} - {% else %} - <div class="alert alert-success">{{lang.words.config|title()}} {{lang.words.is}} {{lang.words.valid}}</div> - {% if warning %} - <div class="alert alert-warning">{{warning}}</div> - {% endif %} - <a href="config.py?serv={{ serv }}" title="{{lang.words.working|title()}} {{lang.words.with}} HAProxy {{lang.words.config}}">{{lang.words.config|title()}}</a> - {% endif %} - <script>window.history.pushState("Config", "Config", cur_url[0])</script> - {% endif %} </div> </div> {% endif %} diff --git a/app/templates/servers.html b/app/templates/servers.html index 7ce355bf..0cbfc159 100644 --- a/app/templates/servers.html +++ b/app/templates/servers.html @@ -16,12 +16,8 @@ <li><a href="#users" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.users}} - Roxy-WI">{{lang.words.users|title()}}</a></li> <li><a href="#servers" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.servers}} - Roxy-WI">{{lang.words.servers|title()}}</a></li> <li><a href="#ssh" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} SSH {{lang.words.creds}} - Roxy-WI">SSH {{lang.words.creds}}</a></li> - <li><a href="#checker" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Checker - Roxy-WI">Checker</a></li> <li><a href="#settings" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} Roxy-WI {{lang.words.settings}} - Roxy-WI">{{lang.words.settings|title()}}</a></li> - <li><a href="#installproxy" title="{{lang.words.servers|title()}}: {{lang.words.proxy|title()}} {{lang.words.service}} {{lang.words.installation}} - Roxy-WI">{{lang.words.proxy|title()}} {{lang.words.installation}}</a></li> - <li><a href="#installmon" title="{{lang.words.servers|title()}}: {{lang.words.monitoring|title()}} service installation - Roxy-WI" id="admin-tabs-mon">{{lang.words.monitoring|title()}} {{lang.words.installation}}</a></li> <li><a href="#backup" title="{{lang.words.servers|title()}}: {{lang.words.manage|title()}} {{lang.words.backup|title()}} configs - Roxy-WI" id="admin-tabs-backup">{{lang.words.backup|title()}}</a></li> - <li><a href="#geolite2" title="{{lang.words.servers|title()}}: GeoLite2 - Roxy-WI">GeoLite2</a></li> </ul> <div id="users"> {% include 'include/admin_users.html' %} @@ -35,210 +31,19 @@ {% include 'include/admin_ssh.html' %} </div> - <div id="checker"></div> - <div id="settings"> {% include 'include/admin_settings.html' %} </div> - <div id="installproxy"> - {% if not is_needed_tool %} - <div style="text-align: center;"> - <h3>{{lang.admin_page.desc.no_ansible}}</h3>. - <img src="/inc/images/no_servers.png" alt="There is no server"> - <h4> - {{lang.words.install|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible. - </h4> - </div> - {% else %} - <table class="overview"> - <caption><h3>{{lang.words.install|title()}} HAProxy</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td> - <td class="padding10 first-collumn help_cursor" style="width: 30%;" title="{{lang.words.for|title()}} Ubuntu {{lang.admin_page.desc.latest_repo}}"> - {{lang.words.available|title()}} {{lang.words.versions}} (?) - </td> - <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td> - <td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}">{{lang.words.use|title()}} Docker</td> - <td>SYN-flood {{lang.words.protection}}</td> - <td></td> - </tr> - <tr> - <td id="cur_haproxy_ver" class="padding10 first-collumn"> - </td> - <td class="padding10 first-collumn" style="width: 20%;"> - {% set values = dict() %} - {% set values = {'2.4.23-1':'2.4.23-1','2.5.14-1':'2.5.14-1', '2.6.14-1':'2.6.14-1','2.7.9-1':'2.7.9-1','2.8.1-1':'2.8.1-1'} %} - {{ select('hapver', values=values, selected='2.8.1-1', required='required') }} - </td> - <td class="padding10 first-collumn"> - <select autofocus required name="haproxyaddserv" id="haproxyaddserv"> - <option disabled selected>------</option> - {% for select in servers %} - <option value="{{ select.2 }}">{{ select.1 }}</option> - {% endfor %} - </select> - </td> - <td style="padding-left: 25px;"> - {{ checkbox('haproxy_docker', title=lang.admin_page.desc.install_as_docker) }} - </td> - <td class="syn-flood-protection-field"> - {{ checkbox('syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }} - </td> - <td> - <span class="ui-button ui-widget ui-corner-all" id="install" title="{{lang.words.install|title()}} HAProxy">{{lang.words.install|title()}}</span> - </td> - </tr> - </table> - <table> - <caption><h3>{{lang.words.install|title()}} NGINX</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> - <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td> - <td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}" >{{lang.words.use|title()}} Docker</td> - <td>SYN-flood {{lang.words.protection}}</td> - <td></td> - </tr> - <tr> - <td id="cur_nginx_ver" class="padding10 first-collumn"> - </td> - <td class="padding10 first-collumn" style="width: 20%;"> - {{lang.admin_page.desc.latest_repo}} - </td> - <td class="padding10 first-collumn"> - <select autofocus required name="nginxaddserv" id="nginxaddserv"> - <option disabled selected>------</option> - {% for select in servers %} - <option value="{{ select.2 }}">{{ select.1 }}</option> - {% endfor %} - </select> - </td> - <td style="padding-left: 25px;"> - {{ checkbox('nginx_docker', title=lang.admin_page.desc.install_as_docker) }} - </td> - <td class="syn-flood-protection-field"> - {{ checkbox('nginx_syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }} - </td> - <td> - <span class="ui-button ui-widget ui-corner-all" id="nginx_install" title="{{lang.words.install|title()}} NGINX">{{lang.words.install|title()}}</span> - </td> - </tr> - </table> - <table> - <caption><h3>{{lang.words.install|title()}} Apache</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn">{{lang.words.current2|title()}} {{lang.words.version}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.available|title()}} {{lang.words.versions}}</td> - <td class="padding10 first-collumn" style="width: 20%;">{{lang.words.server|title()}}</td> - <td class="checkbox-head help_cursor" title="{{lang.admin_page.desc.install_as_docker}}" >{{lang.words.use|title()}} Docker</td> - <td>SYN-flood {{lang.words.protection}}</td> - <td></td> - </tr> - <tr> - <td id="cur_apache_ver" class="padding10 first-collumn"> - </td> - <td class="padding10 first-collumn" style="width: 20%;"> - {{lang.admin_page.desc.latest_repo}} - </td> - <td class="padding10 first-collumn"> - <select autofocus required name="apacheaddserv" id="apacheaddserv"> - <option disabled selected>------</option> - {% for select in servers %} - <option value="{{ select.2 }}">{{ select.1 }}</option> - {% endfor %} - </select> - </td> - <td style="padding-left: 25px;"> - {{ checkbox('apache_docker', title=lang.admin_page.desc.install_as_docker) }} - </td> - <td class="syn-flood-protection-field"> - {{ checkbox('apache_syn_flood', title=lang.words.enable|title() + ' SYN-flood '+ lang.words.protection, checked='checked') }} - </td> - <td> - <span class="ui-button ui-widget ui-corner-all" id="apache_install" title="{{lang.words.install|title()}} Apache">{{lang.words.install|title()}}</span> - </td> - </tr> - </table> - <div id="ajax"></div> - {% endif %} - </div> - <div id="installmon"> - {% include 'include/mon_installation.html' %} - </div> <div id="backup"> {% include 'include/admin_backup.html' %} </div> - <div id="geolite2"> - <table> - {% if not is_needed_tool %} - <div style="text-align: center;"> - <h3>{{lang.admin_page.desc.no_ansible}}</h3>. - <img src="/inc/images/no_servers.png" alt="There is no server"> - <h4> - {{lang.words.read|title()}} <a href="https://roxy-wi.org/installation#ansible" title="{{lang.words.install|title()}} Ansible" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} Ansible. - </h4> - </div> - {% else %} - <caption><h3>Install GeoLite2</h3></caption> - <tr class="overviewHead"> - <td class="padding10 first-collumn">{{lang.words.server|title()}}</td> - <td class="padding10 first-collumn">{{lang.words.service|title()}}</td> - <td class="padding10 first-collumn" style="width: 30%;">{{lang.words.current2|title()}} {{lang.words.installation}}</td> - <td class="" style="width: 30%;" title="GeoLite2 DB is released every Tuesday. Should Roxy-WI update it?">{{lang.words.updating|title()}}</td> - <td></td> - <td></td> - </tr> - <tr> - <td class="padding10 first-collumn"> - <select autofocus required name="geoipserv" id="geoipserv"> - <option disabled selected>------</option> - {% for select in servers %} - <option value="{{ select.2 }}">{{ select.1 }}</option> - {% endfor %} - </select> - </td> - <td class="padding10 first-collumn"> - <select autofocus required name="geoip_service" id="geoip_service"> - <option disabled selected>------</option> - <option value="haproxy">HAProxy</option> - <option value="nginx">NGINX</option> - </select> - </td> - <td id="cur_geoip" class="padding10"></td> - <td class="checkbox"> - {{ checkbox('updating_geoip', title="Update the database?", checked='checked') }} - </td> - <td> - <span class="ui-button ui-widget ui-corner-all" id="geoip_install" title="{{lang.words.install|title()}} GeoLite2" style="display: none;">{{lang.words.install|title()}}</span> - </td> - </tr> - {% endif %} - </table> - <div id="ajax-geoip"></div> - <div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px; margin-bottom: 15px;"> - {{lang.phrases.howto_user}} {{lang.words.read}} {{lang.words.in}} {{lang.words.this2}} <a href="https://roxy-wi.org/howto/geoip" title="GeoLite2 {{lang.words.descr|title()}}" target="_blank">{{lang.words.article}}</a> - </div> - <table style="min-width: 40%;"> - <tr class="overviewHead"> - <th colspan=13 style="background-color: #d1ecf1; padding: 10px;"> - <span id="table_metrics_head" style="margin-left: 5px;">{{lang.admin_page.desc.country_codes}}</span> - <select id="geoip_select"> - {% for code in geoip_country_codes %} - <option>{{code.name}} {{code.code}}</option> - {% endfor %} - </select> - </th> - </tr> - </table> - </div> + </div> {% include 'include/admins_dialogs.html' %} {% include 'include/change_pass_form.html' %} <script> - $('#geoip_select').select2(); $( function() { - $("#geoip_select").selectmenu("destroy"); {% for user in users %} $("#role-{{user.0}}" ).selectmenu({ width: 100 diff --git a/app/templates/smon.html b/app/templates/smon/add.html similarity index 79% rename from app/templates/smon.html rename to app/templates/smon/add.html index 8f67ccab..34195726 100644 --- a/app/templates/smon.html +++ b/app/templates/smon/add.html @@ -1,9 +1,9 @@ {% extends "base.html" %} -{% block title %}{{ title }}{% endblock %} -{% block h2 %}{{ title }}{% endblock %} +{% block title %}{{ lang.menu_links.monitoring.smon.admin }}{% endblock %} +{% block h2 %}{{ lang.menu_links.monitoring.smon.admin }}{% endblock %} {% block content %} {% from 'include/input_macros.html' import input, checkbox, select %} -<script src="/inc/smon-6.3.16.js"></script> +<script src="/inc/smon.js"></script> <script src="/inc/users.js"></script> <script src="/inc/fontawesome.min.js"></script> <script src="/inc/jquery.timeago.js" type="text/javascript"></script> @@ -13,7 +13,7 @@ <div style="text-align: center;"> <br /> <h3>{{lang.smon_page.desc.not_installed}}</h3>. - <img src="/inc/images/no_servers.png" alt="There is no server"> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> <h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/smon" title="Simple monitoring network ports with alerting via Telegram and WEB panel" target="_blank">{{lang.words.here}}</a> {{lang.phrases.how_to_install}} SMON {{lang.words.service}}.</h4> </div> @@ -21,38 +21,10 @@ <div style="text-align: center;"> <br /> <h3>{{lang.smon_page.desc.smon_is_not_run}}</h3> - <img src="/inc/images/no_servers.png" alt="There is no server"> - <h4>{{lang.smon_page.desc.run_smon}} <a href="users.py#services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4> -</div> -{% elif smon|length == 0 and action != 'add' and action != 'history' and action != 'checker_history' %} -<div style="text-align: center;"> - <br /> - <h3>{{lang.smon_page.desc.not_added}}</h3> - <img src="/inc/images/no_servers.png" alt="There is no server"> - <h4>{{lang.smon_page.desc.create_server}} <a href="smon.py?action=add" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4> - <br /> -</div> -{% elif smon|length == 0 and action != 'add' and action == 'history' %} -<div style="text-align: center;"> - <br /> - <h3>{{lang.phrases.no_events_added}}</h3> - <img src="/inc/images/no_servers.png" alt="There is no server"> - <h4>Click <a href="smon.py?action=add" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.see_check}}</h4> - <br /> -</div> -{% elif smon|length == 0 and action != 'add' and action == 'checker_history' %} -<div style="text-align: center;"> - <br /> - <h3> - {{lang.phrases.no_events_added}} Check if there are any Checker are enabled on the "<a href="hapservers.py?service=haproxy" title="HAProxy Overview">HAProxy {{lang.menu_links.hapservers.link}}</a>" - {{lang.words.or}} {{lang.words.on}} "<a href="hapservers.py?service=nginx" title="NGINX Overview">NGINX {{lang.menu_links.hapservers.link}}</a>" - {{lang.words.or}} {{lang.words.on}} "<a href="hapservers.py?service=apache" title="Apache Overview">Apache {{lang.menu_links.hapservers.link}}</a>" - {{lang.words.or}} {{lang.words.on}} "<a href="hapservers.py?service=keepalived" title="Keepalived Overview">Keepalived {{lang.menu_links.hapservers.link}}</a>" {{lang.words.pages}} - </h3> - <br /> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>{{lang.smon_page.desc.run_smon}} <a href="/app/users/services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4> </div> {% else %} -{% if action == 'add' %} <table class="overview overview-overflow" id="ajax-smon-http"> <thead> <caption><h3>HTTP {{lang.words.checking}}</h3></caption> @@ -92,7 +64,7 @@ <tr class="overviewHead"> <th class="padding10 first-collumn" style="width: 200px;">{{lang.words.name|title()}}</th> <th style="width: 15%;">{{lang.words.Hostname}}</th> - <th style="width: 2%;">{{lang.words.port|title()}}</th> + <th style="width: 5%;">{{lang.words.port|title()}}</th> <th style="width: 5%;">{{lang.words.enabled|title()}}</th> <th style="width: 11%;">Telegram</th> <th style="width: 11%;">Slack</th> @@ -122,7 +94,7 @@ <tr class="overviewHead"> <th class="padding10 first-collumn" style="width: 200px;">{{lang.words.name|title()}}</th> <th style="width: 15%;">{{lang.words.Hostname}}</th> - <th style="width: 2%;">{{lang.smon_page.desc.packet_size}}</th> + <th style="width: 5%; padding-right: 10px;">{{lang.smon_page.desc.packet_size}}</th> <th style="width: 5%;">{{lang.words.enabled|title()}}</th> <th style="width: 15%;">Telegram</th> <th style="width: 15%;">Slack</th> @@ -160,7 +132,7 @@ <th style="width: 5%;">{{lang.words.enabled|title()}}</th> <th style="width: 15%;">Telegram</th> <th style="width: 15%;">Slack</th> - <th style="width: 15%;">PagerDuty</th> + <th style="width: 10%;">PagerDuty</th> <th style="width: 10%;">{{lang.words.group|title()}}</th> <th style="width: 100%;">{{lang.words.desc|title()}}</th> <th></th> @@ -186,7 +158,7 @@ <div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;"> {{lang.phrases.read_about_parameters}} <a href="https://roxy-wi.org/services/smon" title="SMON service description" target="_blank">{{lang.words.here}}</a> </div> -<div id="smon-add-table" style="display: none;"> +<div id="smon-add-table" style="display: none;"> <table class="overview" id="smon-add-table-overview" title="{{lang.words.create|title()}} {{lang.words.w_a}} {{lang.words.new}} {{lang.words.server}} {{lang.words.for}} {{lang.words.monitoring}}"> {% include 'include/tr_validate_tips.html' %} <tr> @@ -323,13 +295,6 @@ </tr> </table> {% include 'include/del_confirm.html' %} -{% elif action == 'history' or action == 'checker_history' %} - {% include 'ajax/alerts_history.html' %} -{% else %} - <div class="main" id="smon_dashboard"> - {% include 'ajax/smon/smon_dashboard.html' %} - </div> -{% endif %} </div> {% endif %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/app/templates/smon/checker_history.html b/app/templates/smon/checker_history.html new file mode 100644 index 00000000..4a73c6ce --- /dev/null +++ b/app/templates/smon/checker_history.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} +{% block title %}{{ lang.menu_links.monitoring.checker_history }}{% endblock %} +{% block h2 %}{{ lang.menu_links.monitoring.checker_history }}{% endblock %} +{% block content %} +{% if user_status == 0 or user_plan == 'user' %} + {% include 'include/no_sub.html' %} +{% elif smon_error != '' %} +<div style="text-align: center;"> + <br /> + <h3>{{lang.smon_page.desc.not_installed}}</h3>. + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/smon" title="Simple monitoring network ports with alerting via Telegram and WEB panel" target="_blank">{{lang.words.here}}</a> + {{lang.phrases.how_to_install}} SMON {{lang.words.service}}.</h4> +</div> +{% elif smon_status.0 == 'failed' or smon_status.0 == 'inactive' %} +<div style="text-align: center;"> + <br /> + <h3>{{lang.smon_page.desc.smon_is_not_run}}</h3> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>{{lang.smon_page.desc.run_smon}} <a href="/app/users/services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4> +</div> +{% elif smon|length == 0 %} +<div style="text-align: center;"> + <br /> + <h3>{{lang.phrases.no_events_added}}</h3> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>Click <a href="/app/smon/admin" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.see_check}}</h4> + <br /> +</div> +{% else %} + {% include 'ajax/alerts_history.html' %} +{% endif %} +{% endblock %} diff --git a/app/templates/smon/dashboard.html b/app/templates/smon/dashboard.html new file mode 100644 index 00000000..154af5c2 --- /dev/null +++ b/app/templates/smon/dashboard.html @@ -0,0 +1,39 @@ +{% extends "base.html" %} +{% block title %}{{ lang.menu_links.monitoring.smon.dashboard }}{% endblock %} +{% block h2 %}{{ lang.menu_links.monitoring.smon.dashboard }}{% endblock %} +{% block content %} +<script src="/inc/smon.js"></script> +<script src="/inc/users.js"></script> +<script src="/inc/fontawesome.min.js"></script> +<script src="/inc/jquery.timeago.js" type="text/javascript"></script> +{% if user_status == 0 %} + {% include 'include/no_sub.html' %} +{% elif smon_error != '' %} +<div style="text-align: center;"> + <br /> + <h3>{{lang.smon_page.desc.not_installed}}</h3>. + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/smon" title="Simple monitoring network ports with alerting via Telegram and WEB panel" target="_blank">{{lang.words.here}}</a> + {{lang.phrases.how_to_install}} SMON {{lang.words.service}}.</h4> +</div> +{% elif smon_status.0 == 'failed' or smon_status.0 == 'inactive' %} +<div style="text-align: center;"> + <br /> + <h3>{{lang.smon_page.desc.smon_is_not_run}}</h3> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>{{lang.smon_page.desc.run_smon}} <a href="/app/users/services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4> +</div> +{% elif smon|length == 0 %} +<div style="text-align: center;"> + <br /> + <h3>{{lang.smon_page.desc.not_added}}</h3> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>{{lang.smon_page.desc.create_server}} <a href="/app/smon/admin" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4> + <br /> +</div> +{% else %} + <div class="main" id="smon_dashboard"> + {% include 'ajax/smon/smon_dashboard.html' %} + </div> +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/templates/smon/history.html b/app/templates/smon/history.html new file mode 100644 index 00000000..74674cc6 --- /dev/null +++ b/app/templates/smon/history.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} +{% block title %}{{ lang.menu_links.monitoring.smon.history }}{% endblock %} +{% block h2 %}{{ lang.menu_links.monitoring.smon.history }}{% endblock %} +{% block content %} +{% if user_status == 0 or user_plan == 'user' %} + {% include 'include/no_sub.html' %} +{% elif smon_error != '' %} +<div style="text-align: center;"> + <br /> + <h3>{{lang.smon_page.desc.not_installed}}</h3>. + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>{{lang.words.read|title()}} <a href="https://roxy-wi.org/services/smon" title="Simple monitoring network ports with alerting via Telegram and WEB panel" target="_blank">{{lang.words.here}}</a> + {{lang.phrases.how_to_install}} SMON {{lang.words.service}}.</h4> +</div> +{% elif smon_status.0 == 'failed' or smon_status.0 == 'inactive' %} +<div style="text-align: center;"> + <br /> + <h3>{{lang.smon_page.desc.smon_is_not_run}}</h3> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>{{lang.smon_page.desc.run_smon}} <a href="/app/users/services" title="Roxy-WI services" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.before_use}}</h4> +</div> +{% elif smon|length == 0 %} +<div style="text-align: center;"> + <br /> + <h3>{{lang.phrases.no_events_added}}</h3> + <img src="{{ url_for('static', filename='images/no_servers.png')}}" alt="There is no server"> + <h4>Click <a href="/app/smon/admin" title="Roxy-WI SMON" target="_blank">{{lang.words.here}}</a> {{lang.smon_page.desc.see_check}}</h4> + <br /> +</div> +{% else %} + {% include 'ajax/alerts_history.html' %} +{% endif %} +{% endblock %} diff --git a/app/templates/statsview.html b/app/templates/statsview.html index 984cb9b3..0b010578 100644 --- a/app/templates/statsview.html +++ b/app/templates/statsview.html @@ -7,7 +7,7 @@ {% if selects|length == 0 %} {% include 'include/getstarted.html' %} {% else %} -<form action="statsview.py" method="post" class="left-space"> +<form action="" method="post" class="left-space"> <input type="hidden" id="service" value="{{service}}" /> <select autofocus required name="serv" id="serv"> <option disabled>------</option> @@ -19,7 +19,7 @@ {% endif %} {% endfor %} </select> - <a class="ui-button ui-widget ui-corner-all" id="show" title="{{lang.words.show|title()}} {{lang.words.stats}}" onclick="{{ onclick }}">{{lang.words.open|title()}}</a> + <a class="ui-button ui-widget ui-corner-all" id="show" title="{{lang.words.show|title()}} {{lang.words.stats}}" onclick="showStats()">{{lang.words.open|title()}}</a> {% if service != 'nginx' and service != 'apache' %} <div id="stats_filter"> <div id="stats_filter_text">{{lang.words.filter|title()}}:</div> @@ -47,6 +47,7 @@ $('form').append('<input type="hidden" name="token" value='+$('#token').val()+'>'); $( "input[type=submit], button" ).button(); $('#notice').hide(); + $('.active_going_down').hide(); $('li').css('margin-top', '0'); $('li').css('width', '207px '); $('li').css('padding', '0px'); diff --git a/app/templates/waf.html b/app/templates/waf.html index a8c3a4cd..cff52127 100644 --- a/app/templates/waf.html +++ b/app/templates/waf.html @@ -2,7 +2,7 @@ {% block title %}{{title}}{% endblock %} {% block h2 %}{{title}}{% endblock %} {% block content %} -<script src="/inc/waf-6.3.8.js"></script> +<script src="/inc/waf.js"></script> {% if manage_rules == '1' %} {% from 'include/input_macros.html' import input, checkbox %} <table class="overview" id="waf_rules"> @@ -27,7 +27,7 @@ </td> <td style="padding-top: 5px;padding-bottom: 10px;">{{r.desc}}</td> <td style="padding: 0 10px 0 10px;"> - <a href="waf.py?service={{service}}&waf_rule_id={{r.id}}&serv={{serv}}" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.this4}} {{lang.words.rule}}">{{lang.words.view|title()}}/{{lang.words.edit|title()}}</a> + <a href="/app/waf/{{service}}/{{serv}}/rule/{{r.id}}" class="ui-button ui-widget ui-corner-all" title="{{lang.words.view|title()}} {{lang.words.this4}} {{lang.words.rule}}">{{lang.words.view|title()}}/{{lang.words.edit|title()}}</a> </td> </tr> {% endfor %} @@ -72,7 +72,7 @@ <script src="/inc/codemirror/keymap/sublime.js"></script> <script src="/inc/configshow.js"></script> <h4>{{lang.words.config|title()}} {{waf_rule_file}} {{lang.words.from|title()}} {{ serv }}</h4> - <form action="waf.py" name="saveconfig" id="saveconfig" method="post"> + <form action="/app/waf/{{service}}/{{serv}}/rule/{{waf_rule_id}}/save" name="saveconfig" id="saveconfig" method="post"> <input type="hidden" value="{{ serv }}" name="serv"> <input type="hidden" value="{{ cfg }}.old" name="oldconfig"> <input type="hidden" value="{{ token }}" name="token"> @@ -82,7 +82,7 @@ <textarea name="config" id="config_text_area" class="config" rows="35" cols="100">{{ config }}</textarea> </div> <p> - <a href="waf.py?manage_rules=1&serv={{serv}}" class="ui-button ui-widget ui-corner-all" title="Return to rules management">{{lang.words.back|title()}}</a> + <a href="/app/waf/{{service}}/{{serv}}/rules" class="ui-button ui-widget ui-corner-all" title="Return to rules management">{{lang.words.back|title()}}</a> {% if role <= 3 %} <button type="submit" value="save" name="save" class="btn btn-default" title="{{lang.words.save|title()}} {{lang.words.without}} {{lang.words.reloading}}">{{lang.words.save|title()}}</button> {% if service == 'haproxy' %} @@ -176,8 +176,8 @@ </table> {% if service == 'haproxy' %} <link href="/inc/css/chart.min.css" rel="stylesheet"> - <script src="/inc/overview-6.3.9.js"></script> - <script src="/inc/metrics-6.3.16.0.js"></script> + <script src="/inc/overview.js"></script> + <script src="/inc/metrics.js"></script> <script src="/inc/chart.min-4.3.0.js"></script> <div id="table_metrics"></div> <div class="metrics-time-range"> diff --git a/app/users.py b/app/users.py deleted file mode 100644 index 499ee035..00000000 --- a/app/users.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import sys - -import pytz - -import modules.db.sql as sql -import modules.common.common as common -import modules.server.server as server_mod -import modules.roxywi.roxy as roxywi -import modules.roxywi.auth as roxywi_auth -import modules.roxywi.common as roxywi_common - -from jinja2 import Environment, FileSystemLoader - -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('admin.html') -form = common.form - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params() - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) -except Exception as e: - print('error: your session is expired') - sys.exit() - -roxywi_auth.page_for_admin() - -users = sql.select_users() -settings = sql.get_setting('', all=1) -ldap_enable = sql.get_setting('ldap_enable') -services = sql.select_services() -gits = sql.select_gits() -masters = sql.select_servers(get_master_servers=1) -is_needed_tool = common.is_tool('ansible') -grafana = 0 -backups = sql.select_backups() -s3_backups = sql.select_s3_backups() - -if not roxywi.is_docker(): - grafana, stderr = server_mod.subprocess_execute("systemctl is-active grafana-server") - grafana = grafana[0] - -try: - user_subscription = roxywi_common.return_user_status() -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) - -rendered_template = template.render( - h2=1, role=user_params['role'], user=user_params['user'], users=users, groups=sql.select_groups(), - servers=sql.select_servers(full=1), masters=masters, sshs=sql.select_ssh(), roles=sql.select_roles(), - settings=settings, backups=backups, s3_backups=s3_backups, services=services, timezones=pytz.all_timezones, - page="users.py", user_services=user_params['user_services'], ldap_enable=ldap_enable, gits=gits, guide_me=1, - user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], token=user_params['token'], - is_needed_tool=is_needed_tool, lang=user_params['lang'], grafana=grafana -) -print(rendered_template) diff --git a/app/versions.py b/app/versions.py deleted file mode 100644 index 182d124f..00000000 --- a/app/versions.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python3 -import os - -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.roxywi.common as roxywi_common -import modules.config.config as config_mod -import modules.roxy_wi_tools as roxy_wi_tools - -get_config_var = roxy_wi_tools.GetConfigVar() -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('delver.html') - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params(disable=1) - -roxywi_auth.page_for_admin(level=3) - -form = common.form -serv = common.is_ip_or_dns(form.getvalue('serv')) -service = common.checkAjaxInput(form.getvalue('service')) -Select = form.getvalue('del') -configver = form.getvalue('configver') -conf_format = 'cfg' -configs_dir = '' -stderr = "" -aftersave = "" -file = set() - -if configver: - template = env.get_template('configver.html') - -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): - servers = roxywi_common.get_dick_permit(service=service_desc.slug) - action = f'versions.py?service={service_desc.slug}' - conf_format = 'conf' - - if service in ('haproxy', 'nginx', 'apache'): - configs_dir = get_config_var.get_config_var('configs', f'{service_desc.service}_save_configs_dir') - else: - configs_dir = get_config_var.get_config_var('configs', 'kp_save_configs_dir') - - if service == 'haproxy': - conf_format = 'cfg' -else: - print('<meta http-equiv="refresh" content="0; url=/app/overview.py">') - -if serv is not None and form.getvalue('del') is not None: - if Select is not None: - aftersave = 1 - env = Environment(loader=FileSystemLoader('templates/')) - template = env.get_template('delver.html') - for get in form: - if conf_format in get and serv in get: - try: - if form.getvalue('style') == 'new': - if sql.delete_config_version(service, form.getvalue(get)): - try: - os.remove(form.getvalue(get)) - except OSError as e: - if 'No such file or directory' in str(e): - pass - else: - os.remove(os.path.join(configs_dir, form.getvalue(get))) - try: - file.add(form.getvalue(get) + "<br />") - roxywi_common.logging( - serv, "Version of config has been deleted: %s" % form.getvalue(get), login=1, keep_history=1, service=service - ) - except Exception: - pass - except OSError as e: - stderr = "Error: %s - %s." % (e.filename, e.strerror) - -if serv is not None and form.getvalue('config') is not None: - configver = configs_dir + configver - save = form.getvalue('save') - aftersave = 1 - - try: - roxywi_common.logging( - serv, "Version of config has been uploaded %s" % configver, login=1, keep_history=1, service=service - ) - except Exception: - pass - - if service == 'keepalived': - stderr = config_mod.upload_and_restart(serv, configver, just_save=save, keepalived=1) - elif service == 'nginx': - config_file_name = sql.select_remote_path_from_version(server_ip=serv, service=service, local_path=configver) - stderr = config_mod.master_slave_upload_and_restart(serv, configver, just_save=save, nginx=1, config_file_name=config_file_name) - elif service == 'apache': - config_file_name = sql.select_remote_path_from_version(server_ip=serv, service=service, local_path=configver) - stderr = config_mod.master_slave_upload_and_restart(serv, configver, just_save=save, apache=1, config_file_name=config_file_name) - else: - stderr = config_mod.master_slave_upload_and_restart(serv, configver, just_save=save) - - -rendered_template = template.render( - h2=1, role=user_params['role'], user=user_params['user'], select_id="serv", serv=serv, aftersave=aftersave, - selects=user_params['servers'], stderr=stderr, open=form.getvalue('open'), Select=form.getvalue('del'), file=file, - configver=configver, service=service, user_services=user_params['user_services'], action=action, token=user_params['token'], - lang=user_params['lang'] -) -print(rendered_template) diff --git a/app/viewlogs.py b/app/viewlogs.py deleted file mode 100644 index eb1c24fb..00000000 --- a/app/viewlogs.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys -import datetime - -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.roxywi.common as roxywi_common -import modules.roxy_wi_tools as roxy_wi_tools - -get_config_var = roxy_wi_tools.GetConfigVar() -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('logs.html') -form = common.form -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params() - -try: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) -except Exception: - print('error: your session is expired') - sys.exit() - -if form.getvalue('grep') is None: - grep = "" -else: - grep = form.getvalue('grep') - -exgrep = form.getvalue('exgrep') if form.getvalue('exgrep') else '' - -if form.getvalue('rows') is None: - rows = 10 -else: - rows = form.getvalue('rows') - -if form.getvalue('viewlogs') is None: - serv = form.getvalue('serv') -else: - serv = form.getvalue('viewlogs') - -hour = form.getvalue('hour') -hour1 = form.getvalue('hour1') -minut = form.getvalue('minut') -minut1 = form.getvalue('minut1') - -if form.getvalue('type') == '2': - roxywi_auth.page_for_admin(level=2) - page = 'for_editor' -else: - roxywi_auth.page_for_admin() - page = '' - -log_path = get_config_var.get_config_var('main', 'log_path') -time_storage = sql.get_setting('log_time_storage') - -try: - time_storage_hours = time_storage * 24 - for dirpath, dirnames, filenames in os.walk(log_path): - for file in filenames: - curpath = os.path.join(dirpath, file) - file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath)) - if datetime.datetime.now() - file_modified > datetime.timedelta(hours=time_storage_hours): - os.remove(curpath) -except Exception: - pass - -selects = roxywi_common.get_files(log_path, file_format="log") -if form.getvalue('type') is None: - selects.append(['fail2ban.log', 'fail2ban.log']) - selects.append(['roxy-wi.error.log', 'error.log']) - selects.append(['roxy-wi.access.log', 'access.log']) - -if user_params['lang'] == 'ru': - title = 'Просмотр внутренних логов' -else: - title = 'View internal logs' - -rendered_template = template.render( - h2=1, autorefresh=1, title=title, role=user_params['role'], user=user_params['user'], serv=serv, - select_id="viewlogs", selects=selects, rows=rows, grep=grep, exgrep=exgrep, hour=hour, hour1=hour1, minut=minut, - minut1=minut1, page=page, user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'] -) -print(rendered_template) diff --git a/app/views.py b/app/views.py new file mode 100644 index 00000000..0f15c863 --- /dev/null +++ b/app/views.py @@ -0,0 +1,463 @@ +import os +import sys +import uuid + +import pytz +import distro +from flask import render_template, request, redirect, url_for, flash, make_response +from flask_login import login_user, login_required, logout_user, current_user +from datetime import datetime, timedelta + +from app import app, login_manager, cache + +sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) + +import modules.db.sql as sql +from modules.db.db_model import * +import modules.common.common as common +import modules.server.server as server_mod +import modules.roxy_wi_tools as roxy_wi_tools +import modules.roxywi.logs as roxy_logs +import modules.roxywi.roxy as roxywi +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.common as roxywi_common + +get_config = roxy_wi_tools.GetConfigVar() +time_zone = sql.get_setting('time_zone') +get_date = roxy_wi_tools.GetDate(time_zone) + + +@app.before_request +@cache.memoize(50) +def check_login(): + user_params = roxywi_common.get_users_params() + if user_params is None: + make_response(redirect(url_for('login_page'))) + + try: + roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) + except Exception: + make_response(redirect(url_for('login_page'))) + + +@app.errorhandler(404) +def page_not_found(e): + return render_template('404.html'), 404 + + +@app.errorhandler(500) +def page_not_found(e): + return render_template('500.html', e=e), 500 + + +@login_manager.user_loader +def load_user(user_id): + user = f'user_{user_id}' + user_obj = cache.get(user) + + if user_obj is None: + query = User.get(User.user_id == user_id) + cache.set(user, query, timeout=360) + return query + + return user_obj + + +@app.after_request +def redirect_to_login(response): + if response.status_code == 401: + return redirect(url_for('login_page') + '?next=' + request.url) + + return response + + +@app.route('/login', methods=['GET', 'POST']) +def login_page(): + next_url = request.args.get('next') or request.form.get('next') + login = request.form.get('login') + password = request.form.get('pass') + role = 5 + user1 = '' + + if next_url is None: + next_url = '' + + try: + groups = sql.select_groups(id=user_groups) + for g in groups: + if g[0] == int(user_groups): + user_group = g[1] + except Exception: + user_group = '' + + try: + if distro.id() == 'ubuntu': + if os.path.exists('/etc/apt/auth.conf.d/roxy-wi.conf'): + cmd = "grep login /etc/apt/auth.conf.d/roxy-wi.conf |awk '{print $2}'" + get_user_name, stderr = server_mod.subprocess_execute(cmd) + user_name = get_user_name[0] + else: + user_name = 'git' + else: + if os.path.exists('/etc/yum.repos.d/roxy-wi.repo'): + cmd = "grep base /etc/yum.repos.d/roxy-wi.repo |awk -F\":\" '{print $2}'|awk -F\"/\" '{print $3}'" + get_user_name, stderr = server_mod.subprocess_execute(cmd) + user_name = get_user_name[0] + else: + user_name = 'git' + if sql.select_user_name(): + sql.update_user_name(user_name) + else: + sql.insert_user_name(user_name) + except Exception as e: + roxywi_common.logging('Cannot update subscription: ', str(e), roxywi=1) + + try: + session_ttl = int(sql.get_setting('session_ttl')) + except Exception: + session_ttl = 5 + + expires = datetime.utcnow() + timedelta(days=session_ttl) + + if login and password: + users = sql.select_users(user=login) + + for user in users: + if user.activeuser == 0: + flash('Your login is disabled', 'alert alert-danger wrong-login') + if user.ldap_user == 1: + if login in user.username: + if check_in_ldap(login, password): + login_user(user) + resp = make_response(next_url or url_for('index')) + resp.set_cookie('uuid', user_uuid, secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT")) + resp.set_cookie('group', str(user.groups), secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT")) + else: + passwordHashed = roxy_wi_tools.Tools.get_hash(password) + if login in user.username and passwordHashed == user.password: + user_uuid = str(uuid.uuid4()) + user_token = str(uuid.uuid4()) + sql.write_user_uuid(login, user_uuid) + sql.write_user_token(login, user_token) + role = int(user.role) + user1 = user.username + + login_user(user) + resp = make_response(next_url or url_for('index')) + try: + resp.set_cookie('uuid', user_uuid, secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT")) + resp.set_cookie('group', str(user.groups), secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT")) + except Exception as e: + print(e) + + try: + user_name = sql.get_user_name_by_uuid(user_uuid) + roxywi_common.logging('Roxy-WI server', f' user: {user_name}, group: {user_group} login', roxywi=1) + except Exception: + pass + + return resp + + else: + flash('Login or password is not correct', 'alert alert-danger wrong-login') + else: + return 'ban', 200 + else: + flash('Login or password is not correct', 'alert alert-danger wrong-login') + + try: + lang = roxywi_common.get_user_lang() + except Exception: + lang = 'en' + + return render_template('login.html', role=role, user=user1, lang=lang) + + +@app.route('/logout', methods=['GET', 'POST']) +@login_required +def logout(): + user = f'user_{current_user.id}' + cache.delete(user) + logout_user() + resp = make_response(redirect(url_for('index'))) + resp.delete_cookie('uuid') + resp.delete_cookie('group') + + return resp + + +@app.route('/') +@app.route('/overview') +@login_required +def index(): + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + groups = sql.select_groups() + return render_template( + 'ovw.html', h2=1, autorefresh=1, role=user_params['role'], user=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, lang=user_params['lang'] + ) + + +@app.route('/stats/<service>/', defaults={'serv': None}) +@app.route('/stats/<service>/<serv>') +@login_required +def stats(service, serv): + try: + user_params = roxywi_common.get_users_params(virt=1, haproxy=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + try: + if serv is None: + first_serv = user_params['servers'] + for i in first_serv: + serv = i[2] + break + except Exception: + pass + + if service in ('haproxy', 'nginx', 'apache'): + service_desc = sql.select_service(service) + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + servers = roxywi_common.get_dick_permit(service=service_desc.slug) + else: + return redirect(url_for('index')) + + return render_template( + 'statsview.html', h2=1, autorefresh=1, role=user_params['role'], user=user, selects=servers, serv=serv, + service=service, user_services=user_params['user_services'], token=user_params['token'], + select_id="serv", lang=user_params['lang'], service_desc=service_desc + ) + + +@app.route('/logs/internal') +@login_required +def logs_internal(): + log_type = request.args.get('type') + + if log_type == '2': + roxywi_auth.page_for_admin(level=2) + else: + roxywi_auth.page_for_admin() + + try: + user_params = roxywi_common.get_users_params(virt=1, haproxy=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + time_storage = sql.get_setting('log_time_storage') + log_path = get_config.get_config_var('main', 'log_path') + selects = roxywi_common.get_files(log_path, file_format="log") + + try: + time_storage_hours = time_storage * 24 + for dirpath, dirnames, filenames in os.walk(log_path): + for file in filenames: + curpath = os.path.join(dirpath, file) + file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath)) + if datetime.datetime.now() - file_modified > datetime.timedelta(hours=time_storage_hours): + os.remove(curpath) + except Exception: + pass + + if log_type is None: + selects.append(['fail2ban.log', 'fail2ban.log']) + selects.append(['roxy-wi.error.log', 'error.log']) + selects.append(['roxy-wi.access.log', 'access.log']) + + return render_template( + 'logs_internal.html', + h2=1, autorefresh=1, role=user_params['role'], user=user, user_services=user_params['user_services'], + token=user_params['token'], lang=user_params['lang'], selects=selects, serv='viewlogs' + ) + + +@app.route('/logs/<service>', defaults={'waf': None}) +@app.route('/logs/<service>/<waf>') +@login_required +def logs(service, waf): + serv = request.args.get('serv') + rows = request.args.get('rows') + grep = request.args.get('grep') + exgrep = request.args.get('exgrep') + hour = request.args.get('hour') + minute = request.args.get('minute') + hour1 = request.args.get('hour1') + minute1 = request.args.get('minute1') + log_file = request.args.get('file') + + if rows is None: rows=10 + if grep is None: grep='' + + try: + user_params = roxywi_common.get_users_params(virt=1, haproxy=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + if service in ('haproxy', 'nginx', 'keepalived', 'apache') and not waf: + service_desc = sql.select_service(service) + service_name = service_desc.service + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=service_desc.service_id) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + servers = roxywi_common.get_dick_permit(service=service_desc.slug) + elif waf: + service_name = 'WAF' + is_redirect = roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) + + if is_redirect != 'ok': + return redirect(url_for(f'{is_redirect}')) + + servers = roxywi_common.get_dick_permit(haproxy=1) + else: + return redirect(url_for('index')) + + return render_template( + 'logs.html', + h2=1, autorefresh=1, role=user_params['role'], user=user, select_id='serv', rows=rows, remote_file=log_file, + selects=servers, waf=waf, service=service, user_services=user_params['user_services'], + token=user_params['token'], lang=user_params['lang'], service_name=service_name, grep=grep, serv=serv + ) + + +@app.route('/portscanner') +@login_required +def portscanner(): + try: + user_params = roxywi_common.get_users_params(virt=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + user_group = roxywi_common.get_user_group(id=1) + port_scanner_settings = sql.select_port_scanner_settings(user_group) + + if not port_scanner_settings: + port_scanner_settings = '' + count_ports = '' + else: + count_ports = list() + for s in user_params['servers']: + count_ports_from_sql = sql.select_count_opened_ports(s[2]) + i = (s[2], count_ports_from_sql) + count_ports.append(i) + + cmd = "systemctl is-active roxy-wi-portscanner" + port_scanner, port_scanner_stderr = server_mod.subprocess_execute(cmd) + user_subscription = roxywi_common.return_user_subscription() + + return render_template( + 'portscanner.html', h2=1, autorefresh=0, role=user_params['role'], user=user, servers=user_params['servers'], + port_scanner_settings=port_scanner_settings, count_ports=count_ports, 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'], lang=user_params['lang'] + ) + + +@app.route('/nettools') +@login_required +@cache.cached() +def nettools(): + try: + user_params = roxywi_common.get_users_params(virt=1) + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + return render_template( + 'nettools.html', h2=1, autorefresh=0, role=user_params['role'], user=user_params['user'], servers=user_params['servers'], + user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'] + ) + + +@app.route('/history/<service>/<server_ip>') +@login_required +def service_history(service, server_ip): + users = sql.select_users() + server_ip = common.checkAjaxInput(server_ip) + user_subscription = roxywi_common.return_user_subscription() + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + 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): + server_id = sql.select_server_id_by_ip(server_ip) + history = sql.select_action_history_by_server_id_and_service(server_id, service_desc.service) + elif service == 'server': + if roxywi_common.check_is_server_in_group(server_ip): + server_id = sql.select_server_id_by_ip(server_ip) + history = sql.select_action_history_by_server_id(server_id) + elif service == 'user': + history = sql.select_action_history_by_user_id(server_ip) + + try: + sql.delete_action_history_for_period() + except Exception as e: + print(e) + + return render_template( + 'history.html', h2=1, role=user_params['role'], user=user, users=users, serv=server_ip, service=service, + history=history, user_services=user_params['user_services'], token=user_params['token'], + user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], lang=user_params['lang'] + ) + + +@app.route('/servers') +@login_required +def servers(): + roxywi_auth.page_for_admin(level=2) + + try: + user_params = roxywi_common.get_users_params() + user = user_params['user'] + except Exception: + return redirect(url_for('login_page')) + + ldap_enable = sql.get_setting('ldap_enable') + user_group = roxywi_common.get_user_group(id=1) + settings = sql.get_setting('', all=1) + services = sql.select_services() + gits = sql.select_gits() + servers = roxywi_common.get_dick_permit(virt=1, disable=0, only_group=1) + masters = sql.select_servers(get_master_servers=1, uuid=user_params['user_uuid']) + is_needed_tool = common.is_tool('ansible') + user_roles = sql.select_user_roles_by_group(user_group) + backups = sql.select_backups() + s3_backups = sql.select_s3_backups() + user_subscription = roxywi_common.return_user_subscription() + + if user_params['lang'] == 'ru': + title = 'Сервера: ' + else: + title = "Servers: " + + return render_template( + 'servers.html', + h2=1, title=title, role=user_params['role'], user=user, users=sql.select_users(group=user_group), + groups=sql.select_groups(), servers=servers, roles=sql.select_roles(), sshs=sql.select_ssh(group=user_group), + masters=masters, group=user_group, services=services, timezones=pytz.all_timezones, guide_me=1, + token=user_params['token'], settings=settings, backups=backups, s3_backups=s3_backups, page="servers.py", + user_services=user_params['user_services'], ldap_enable=ldap_enable, + user_status=user_subscription['user_status'], user_plan=user_subscription['user_plan'], gits=gits, + is_needed_tool=is_needed_tool, lang=user_params['lang'], user_roles=user_roles + ) diff --git a/app/waf.py b/app/waf.py deleted file mode 100644 index 3ff9de96..00000000 --- a/app/waf.py +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env python3 -import os -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.roxywi.common as roxywi_common -import modules.config.config as config_mod -import modules.roxy_wi_tools as roxy_wi_tools - -time_zone = sql.get_setting('time_zone') -get_date = roxy_wi_tools.GetDate(time_zone) -env = Environment(loader=FileSystemLoader('templates/'), autoescape=True) -template = env.get_template('waf.html') - -print('Content-type: text/html\n') - -user_params = roxywi_common.get_users_params(haproxy=1) - -form = common.form -manage_rules = form.getvalue('manage_rules') -waf_rule_id = form.getvalue('waf_rule_id') -service = form.getvalue('service') -serv = form.getvalue('serv') -config_file_name = '' -waf_rule_file = '' -servers_waf = '' -autorefresh = 0 -config_read = '' -rules = '' -cfg = '' - - -roxywi_auth.page_for_admin(level=2) - -if service == 'nginx': - roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=2) - servers = roxywi_common.get_dick_permit(nginx=1) -else: - roxywi_auth.check_login(user_params['user_uuid'], user_params['token'], service=1) - servers = user_params['servers'] - -if manage_rules == '1': - serv = common.is_ip_or_dns(form.getvalue('serv')) - roxywi_common.check_is_server_in_group(serv) - title = "Manage rules - Web application firewall" - rules = sql.select_waf_rules(serv, service) -elif waf_rule_id and form.getvalue('config') is None: - serv = common.is_ip_or_dns(form.getvalue('serv')) - roxywi_common.check_is_server_in_group(serv) - title = 'Edit a WAF rule' - waf_rule_file = sql.select_waf_rule_by_id(waf_rule_id) - configs_dir = sql.get_setting('tmp_config_path') - cfg = configs_dir + serv + "-" + get_date.return_date('config') + "-" + waf_rule_file - error = config_mod.get_config(serv, cfg, waf=service, waf_rule_file=waf_rule_file) - if service == 'haproxy': - config_path = sql.get_setting('haproxy_dir') - elif service == 'nginx': - config_path = sql.get_setting('nginx_dir') - - config_file_name = common.return_nice_path(config_path) + 'waf/rules/' + waf_rule_file - try: - conf = open(cfg, "r") - config_read = conf.read() - conf.close() - except IOError: - print('Cannot read imported config file') -else: - title = "Web application firewall" - servers_waf = sql.select_waf_servers_metrics(user_params['user_uuid'].value) - autorefresh = 1 - -if serv is not None and form.getvalue('config') is not None: - roxywi_common.check_is_server_in_group(serv) - - configs_dir = sql.get_setting('tmp_config_path') - cfg = configs_dir + serv + "-" + get_date.return_date('config') - config_file_name = form.getvalue('config_file_name') - config = form.getvalue('config') - oldcfg = form.getvalue('oldconfig') - save = form.getvalue('save') - - try: - with open(cfg, "a") as conf: - conf.write(config) - except IOError: - print("error: Cannot read imported config file") - - stderr = config_mod.master_slave_upload_and_restart(serv, cfg, just_save=save, waf=1, oldcfg=oldcfg, config_file_name=config_file_name) - - config_mod.diff_config(oldcfg, cfg) - - try: - os.system("/bin/rm -f " + configs_dir + "*.old") - except Exception as e: - print('error: ' + str(e)) - - if stderr: - print(stderr) - - sys.exit() - -rendered_template = template.render( - h2=1, title=title, autorefresh=autorefresh, role=user_params['role'], user=user_params['user'], serv=serv, servers=servers_waf, - servers_all=servers, manage_rules=manage_rules, rules=rules, user_services=user_params['user_services'], - waf_rule_file=waf_rule_file, waf_rule_id=waf_rule_id, config=config_read, cfg=cfg, token=user_params['token'], - config_file_name=config_file_name, service=service, lang=user_params['lang'] -) -print(rendered_template) diff --git a/config_other/httpd/roxy-wi.conf b/config_other/httpd/roxy-wi.conf index d2e816f9..cee5e805 100644 --- a/config_other/httpd/roxy-wi.conf +++ b/config_other/httpd/roxy-wi.conf @@ -17,17 +17,15 @@ RewriteRule /(.*) ws://localhost:8765/ [P,L] ProxyPassReverse / http://localhost:8765/ - WSGIDaemonProcess api display-name=%{GROUP} user=apache group=apache processes=1 threads=5 + WSGIDaemonProcess roxy-wi-api display-name=%{GROUP} user=apache group=apache processes=1 threads=5 WSGIScriptAlias /api /var/www/haproxy-wi/api/app.wsgi - DocumentRoot /var/www/haproxy-wi - ScriptAlias /cgi-bin/ "/var/www/haproxy-wi/app/" + WSGIDaemonProcess roxy-wi-app display-name=%{GROUP} user=apache group=apache threads=10 + WSGIScriptAlias /app /var/www/haproxy-wi/app/app.wsgi - <Directory /var/www/haproxy-wi/app> - AllowOverride FileInfo - DirectoryIndex overview.py - Options +ExecCGI - AddHandler cgi-script .py + <Directory /var/www/haproxy-wi/app/> + WSGIProcessGroup roxy-wi-app + WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> diff --git a/config_other/httpd/roxy-wi_deb.conf b/config_other/httpd/roxy-wi_deb.conf index 7a4bf49b..beca71c0 100644 --- a/config_other/httpd/roxy-wi_deb.conf +++ b/config_other/httpd/roxy-wi_deb.conf @@ -17,17 +17,15 @@ RewriteRule /(.*) ws://localhost:8765/ [P,L] ProxyPassReverse / http://localhost:8765/ - WSGIDaemonProcess api display-name=%{GROUP} user=www-data group=www-data processes=1 threads=5 + WSGIDaemonProcess roxy-wi-api display-name=%{GROUP} user=www-data group=www-data processes=1 threads=5 WSGIScriptAlias /api /var/www/haproxy-wi/api/app.wsgi - DocumentRoot /var/www/haproxy-wi - ScriptAlias /cgi-bin/ "/var/www/haproxy-wi/app/" + WSGIDaemonProcess roxy-wi-app display-name=%{GROUP} user=www-data group=www-data threads=10 + WSGIScriptAlias /app /var/www/haproxy-wi/app/app.wsgi - <Directory /var/www/haproxy-wi/app> - AllowOverride FileInfo - DirectoryIndex overview.py - Options +ExecCGI - AddHandler cgi-script .py + <Directory /var/www/haproxy-wi/app/> + WSGIProcessGroup roxy-wi-app + WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> diff --git a/config_other/requirements_el7.txt b/config_other/requirements_el7.txt index 153f8f59..f86703a0 100644 --- a/config_other/requirements_el7.txt +++ b/config_other/requirements_el7.txt @@ -8,3 +8,4 @@ PyMySQL>=1.0.2 retry>=0.9.2 pdpyras>=4.5.2 pika>=1.3.1 +Flask-Caching>=1.10.1 diff --git a/config_other/requirements_el8.txt b/config_other/requirements_el8.txt index ef714cbb..b5748ed8 100644 --- a/config_other/requirements_el8.txt +++ b/config_other/requirements_el8.txt @@ -9,3 +9,4 @@ bottle>=0.12.18 retry>=0.9.2 pdpyras>=4.5.2 pika>=1.3.1 +Flask-Caching>=1.10.1 diff --git a/config_other/requirements_el9.txt b/config_other/requirements_el9.txt index 4b089ec4..b71612e4 100644 --- a/config_other/requirements_el9.txt +++ b/config_other/requirements_el9.txt @@ -9,3 +9,4 @@ bottle>=0.12.18 retry>=0.9.2 pdpyras>=4.5.2 pika>=1.3.1 +Flask-Caching>=1.10.1 diff --git a/inc/add.js b/inc/add.js index a46e8928..90782088 100644 --- a/inc/add.js +++ b/inc/add.js @@ -3,684 +3,653 @@ var ssl_offloading_var = "http-request set-header X-Forwarded-Port %[dst_port] \ "redirect scheme https if !{ ssl_fc } \n" $( function() { - $( "#listen-mode-select" ).on('selectmenuchange',function() { - if ($( "#listen-mode-select option:selected" ).val() == "tcp") { - $( "#https-listen-span" ).hide("fast"); - $( "#https-hide-listen" ).hide("fast"); - $("#compression").checkboxradio( "disable" ); - $("#cache").checkboxradio( "disable" ); - $("#ssl_offloading").checkboxradio( "disable" ); - $("#cookie").checkboxradio( "disable" ); - $("#slow_atack").checkboxradio( "disable" ); - $( "#https-listen" ).prop("checked", false); + $("#listen-mode-select").on('selectmenuchange', function () { + if ($("#listen-mode-select option:selected").val() == "tcp") { + $("#https-listen-span").hide("fast"); + $("#https-hide-listen").hide("fast"); + $("#compression").checkboxradio("disable"); + $("#cache").checkboxradio("disable"); + $("#ssl_offloading").checkboxradio("disable"); + $("#cookie").checkboxradio("disable"); + $("#slow_atack").checkboxradio("disable"); + $("#https-listen").prop("checked", false); } else { - $( "#https-listen-span" ).show("fast"); - $("#compression").checkboxradio( "enable" ); - $("#cache").checkboxradio( "enable" ); - $("#ssl_offloading").checkboxradio( "enable" ); - $("#cookie").checkboxradio( "enable" ); - $("#slow_atack").checkboxradio( "enable" ); + $("#https-listen-span").show("fast"); + $("#compression").checkboxradio("enable"); + $("#cache").checkboxradio("enable"); + $("#ssl_offloading").checkboxradio("enable"); + $("#cookie").checkboxradio("enable"); + $("#slow_atack").checkboxradio("enable"); } }); - $( "#frontend-mode-select" ).on('selectmenuchange',function() { - if ($( "#frontend-mode-select option:selected" ).val() == "tcp") { - $( "#https-frontend-span" ).hide("fast"); - $( "#https-hide-frontend" ).hide("fast"); - $("#compression2").checkboxradio( "disable" ); - $("#cache2").checkboxradio( "disable" ); - $("#ssl_offloading2").checkboxradio( "disable" ); - $("#cookie2").checkboxradio( "disable" ); - $("#slow_atack1").checkboxradio( "disable" ); + $("#frontend-mode-select").on('selectmenuchange', function () { + if ($("#frontend-mode-select option:selected").val() == "tcp") { + $("#https-frontend-span").hide("fast"); + $("#https-hide-frontend").hide("fast"); + $("#compression2").checkboxradio("disable"); + $("#cache2").checkboxradio("disable"); + $("#ssl_offloading2").checkboxradio("disable"); + $("#cookie2").checkboxradio("disable"); + $("#slow_atack1").checkboxradio("disable"); } else { - $( "#https-frontend-span" ).show("fast"); - $("#compression2").checkboxradio( "enable" ); - $("#cache2").checkboxradio( "enable" ); - $("#ssl_offloading2").checkboxradio( "enable" ); - $("#cookie2").checkboxradio( "enable" ); - $("#slow_atack1").checkboxradio( "enable" ); + $("#https-frontend-span").show("fast"); + $("#compression2").checkboxradio("enable"); + $("#cache2").checkboxradio("enable"); + $("#ssl_offloading2").checkboxradio("enable"); + $("#cookie2").checkboxradio("enable"); + $("#slow_atack1").checkboxradio("enable"); } }); - $( "#backend-mode-select" ).on('selectmenuchange',function() { - if ($( "#backend-mode-select option:selected" ).val() == "tcp") { - $( "#https-backend-span" ).hide("fast"); - $( "#https-hide-backend" ).hide("fast"); - $("#compression3").checkboxradio( "disable" ); - $("#cache3").checkboxradio( "disable" ); - $("#ssl_offloading3").checkboxradio( "disable" ); - $("#cookie3").checkboxradio( "disable" ); - $("#slow_atack2").checkboxradio( "disable" ); + $("#backend-mode-select").on('selectmenuchange', function () { + if ($("#backend-mode-select option:selected").val() == "tcp") { + $("#https-backend-span").hide("fast"); + $("#https-hide-backend").hide("fast"); + $("#compression3").checkboxradio("disable"); + $("#cache3").checkboxradio("disable"); + $("#ssl_offloading3").checkboxradio("disable"); + $("#cookie3").checkboxradio("disable"); + $("#slow_atack2").checkboxradio("disable"); } else { - $( "#https-backend-span" ).show("fast"); - $("#compression3").checkboxradio( "enable" ); - $("#cache3").checkboxradio( "enable" ); - $("#ssl_offloading3").checkboxradio( "enable" ); - $("#cookie3").checkboxradio( "enable" ); - $("#slow_atack2").checkboxradio( "enable" ); + $("#https-backend-span").show("fast"); + $("#compression3").checkboxradio("enable"); + $("#cache3").checkboxradio("enable"); + $("#ssl_offloading3").checkboxradio("enable"); + $("#cookie3").checkboxradio("enable"); + $("#slow_atack2").checkboxradio("enable"); } }); - $( "#https-listen" ).click( function(){ + $("#https-listen").click(function () { if ($('#https-listen').is(':checked')) { - $( "#https-hide-listen" ).show( "fast" ); - $( "#path-cert-listen" ).attr('required',true); + $("#https-hide-listen").show("fast"); + $("#path-cert-listen").attr('required', true); } else { - $( "#https-hide-listen" ).hide( "fast" ); - $( "#path-cert-listen" ).prop('required',false); + $("#https-hide-listen").hide("fast"); + $("#path-cert-listen").prop('required', false); } - }); - $( "#https-frontend" ).click( function(){ + }); + $("#https-frontend").click(function () { if ($('#https-frontend').is(':checked')) { - $( "#https-hide-frontend" ).show( "fast" ); - $( "#path-cert-frontend" ).attr('required',true); + $("#https-hide-frontend").show("fast"); + $("#path-cert-frontend").attr('required', true); } else { - $( "#https-hide-frontend" ).hide( "fast" ); - $( "#path-cert-frontend" ).prop('required',false); + $("#https-hide-frontend").hide("fast"); + $("#path-cert-frontend").prop('required', false); } - }); - $( "#https-backend" ).click( function(){ + }); + $("#https-backend").click(function () { if ($('#https-backend').is(':checked')) { - $( "#https-hide-backend" ).show( "fast" ); + $("#https-hide-backend").show("fast"); } else { - $( "#https-hide-backend" ).hide( "fast" ); + $("#https-hide-backend").hide("fast"); } }); - $( "#ssl-dis-check-listen" ).click( function(){ + $("#ssl-dis-check-listen").click(function () { if ($('#ssl-dis-check-listen').is(':checked')) { - $( "#ssl-check-listen" ).checkboxradio( "disable" ); - $( "#ssl-check-listen" ).prop( "checked", false ); - $( "#ssl-check-listen" ).checkboxradio("refresh"); + $("#ssl-check-listen").checkboxradio("disable"); + $("#ssl-check-listen").prop("checked", false); + $("#ssl-check-listen").checkboxradio("refresh"); } else { - $( "#ssl-check-listen" ).checkboxradio( "enable" ); - $( "#ssl-check-listen" ).prop( "checked", true ); - $( "#ssl-check-listen" ).checkboxradio("refresh"); + $("#ssl-check-listen").checkboxradio("enable"); + $("#ssl-check-listen").prop("checked", true); + $("#ssl-check-listen").checkboxradio("refresh"); } }); - $( "#ssl-dis-check-backend" ).click( function(){ + $("#ssl-dis-check-backend").click(function () { if ($('#ssl-dis-check-backend').is(':checked')) { - $( "#ssl-check-backend" ).checkboxradio( "disable" ); - $( "#ssl-check-backend" ).prop( "checked", false ); - $( "#ssl-check-backend" ).checkboxradio("refresh"); + $("#ssl-check-backend").checkboxradio("disable"); + $("#ssl-check-backend").prop("checked", false); + $("#ssl-check-backend").checkboxradio("refresh"); } else { - $( "#ssl-check-backend" ).checkboxradio( "enable" ); - $( "#ssl-check-backend" ).prop( "checked", true ); - $( "#ssl-check-backend" ).checkboxradio("refresh"); + $("#ssl-check-backend").checkboxradio("enable"); + $("#ssl-check-backend").prop("checked", true); + $("#ssl-check-backend").checkboxradio("refresh"); } }); - $( "#options-listen-show" ).click( function(){ + $("#options-listen-show").click(function () { if ($('#options-listen-show').is(':checked')) { - $( "#options-listen-show-div" ).show( "fast" ); + $("#options-listen-show-div").show("fast"); } else { - $( "#options-listen-show-div" ).hide( "fast" ); + $("#options-listen-show-div").hide("fast"); } - }); - $( "#options-frontend-show" ).click( function(){ + }); + $("#options-frontend-show").click(function () { if ($('#options-frontend-show').is(':checked')) { - $( "#options-frontend-show-div" ).show( "fast" ); + $("#options-frontend-show-div").show("fast"); } else { - $( "#options-frontend-show-div" ).hide( "fast" ); + $("#options-frontend-show-div").hide("fast"); } - }); - $( "#options-backend-show" ).click( function(){ + }); + $("#options-backend-show").click(function () { if ($('#options-backend-show').is(':checked')) { - $( "#options-backend-show-div" ).show( "fast" ); + $("#options-backend-show-div").show("fast"); } else { - $( "#options-backend-show-div" ).hide( "fast" ); + $("#options-backend-show-div").hide("fast"); } - }); - $( "#controlgroup-listen-show" ).click( function(){ + }); + $("#controlgroup-listen-show").click(function () { if ($('#controlgroup-listen-show').is(':checked')) { - $( "#controlgroup-listen" ).show( "fast" ); + $("#controlgroup-listen").show("fast"); if ($('#check-servers-listen').is(':checked')) { - $( "#rise-listen" ).attr('required',true); - $( "#fall-listen" ).attr('required',true); - $( "#inter-listen" ).attr('required',true); - $( "#inter-listen" ).attr('disable',false); - } + $("#rise-listen").attr('required', true); + $("#fall-listen").attr('required', true); + $("#inter-listen").attr('required', true); + $("#inter-listen").attr('disable', false); + } } else { - $( "#controlgroup-listen" ).hide( "fast" ); + $("#controlgroup-listen").hide("fast"); } - $( "#check-servers-listen" ).click( function(){ + $("#check-servers-listen").click(function () { if ($('#check-servers-listen').is(':checked')) { - $( "#rise-listen" ).attr('required',true); - $( "#fall-listen" ).attr('required',true); - $( "#inter-listen" ).attr('required',true); - $( "#inter-listen" ).selectmenu( "option", "disabled", false ); - $( "#fall-listen" ).selectmenu( "option", "disabled", false ); - $( "#rise-listen" ).selectmenu( "option", "disabled", false ); + $("#rise-listen").attr('required', true); + $("#fall-listen").attr('required', true); + $("#inter-listen").attr('required', true); + $("#inter-listen").selectmenu("option", "disabled", false); + $("#fall-listen").selectmenu("option", "disabled", false); + $("#rise-listen").selectmenu("option", "disabled", false); } else { - $( "#rise-listen" ).attr('required',false); - $( "#fall-listen" ).attr('required',false); - $( "#inter-listen" ).attr('required',false); - $( "#inter-listen" ).selectmenu( "option", "disabled", true ); - $( "#fall-listen" ).selectmenu( "option", "disabled", true ); - $( "#rise-listen" ).selectmenu( "option", "disabled", true ); + $("#rise-listen").attr('required', false); + $("#fall-listen").attr('required', false); + $("#inter-listen").attr('required', false); + $("#inter-listen").selectmenu("option", "disabled", true); + $("#fall-listen").selectmenu("option", "disabled", true); + $("#rise-listen").selectmenu("option", "disabled", true); } }); }); - $( "#controlgroup-backend-show" ).click( function(){ + $("#controlgroup-backend-show").click(function () { if ($('#controlgroup-backend-show').is(':checked')) { - $( "#controlgroup-backend" ).show( "fast" ); + $("#controlgroup-backend").show("fast"); if ($('#check-servers-backend').is(':checked')) { - $( "#rise-backend" ).attr('required',true); - $( "#fall-backend" ).attr('required',true); - $( "#inter-backend" ).attr('required',true); + $("#rise-backend").attr('required', true); + $("#fall-backend").attr('required', true); + $("#inter-backend").attr('required', true); } } else { - $( "#controlgroup-backend" ).hide( "fast" ); + $("#controlgroup-backend").hide("fast"); } }); - $( "#circuit_breaking_listen" ).click( function(){ + $("#circuit_breaking_listen").click(function () { if ($('#circuit_breaking_listen').is(':checked')) { - $( "#circuit_breaking_listen_div" ).show( "fast" ); + $("#circuit_breaking_listen_div").show("fast"); } else { - $( "#circuit_breaking_listen_div" ).hide( "fast" ); + $("#circuit_breaking_listen_div").hide("fast"); } }); - $( "#circuit_breaking_backend" ).click( function(){ + $("#circuit_breaking_backend").click(function () { if ($('#circuit_breaking_backend').is(':checked')) { - $( "#circuit_breaking_backend_div" ).show( "fast" ); + $("#circuit_breaking_backend_div").show("fast"); } else { - $( "#circuit_breaking_backend_div" ).hide( "fast" ); + $("#circuit_breaking_backend_div").hide("fast"); } }); - $( "#cookie" ).click( function(){ + $("#cookie").click(function () { if ($('#cookie').is(':checked')) { - $("#cookie_name" ).attr('required',true); - $("#cookie_div").show( "fast" ); + $("#cookie_name").attr('required', true); + $("#cookie_div").show("fast"); } else { - $("#cookie_name" ).attr('required',false); - $("#cookie_div").hide( "fast" ); - $("#dynamic-cookie-key" ).attr('required',false); + $("#cookie_name").attr('required', false); + $("#cookie_div").hide("fast"); + $("#dynamic-cookie-key").attr('required', false); } }); - $( "#cookie2" ).click( function(){ + $("#cookie2").click(function () { if ($('#cookie2').is(':checked')) { - $("#cookie_name2" ).attr('required',true); - $("#cookie_div2").show( "fast" ); + $("#cookie_name2").attr('required', true); + $("#cookie_div2").show("fast"); } else { - $("#cookie_name2" ).attr('required',false); - $("#cookie_div2").hide( "fast" ); - $("#dynamic-cookie-key2" ).attr('required',false); + $("#cookie_name2").attr('required', false); + $("#cookie_div2").hide("fast"); + $("#dynamic-cookie-key2").attr('required', false); } }); - $( "#rewrite" ).on('selectmenuchange',function() { - if ($( "#rewrite option:selected" ).val() == "insert" || $( "#rewrite option:selected" ).val() == "rewrite") { - $( "#prefix" ).checkboxradio( "disable" ); + $("#rewrite").on('selectmenuchange', function () { + if ($("#rewrite option:selected").val() == "insert" || $("#rewrite option:selected").val() == "rewrite") { + $("#prefix").checkboxradio("disable"); } else { - $( "#prefix" ).checkboxradio( "enable" ); + $("#prefix").checkboxradio("enable"); } }); - $( "#rewrite2" ).on('selectmenuchange',function() { - if ($( "#rewrite2 option:selected" ).val() == "insert" || $( "#rewrite2 option:selected" ).val() == "rewrite") { - $( "#prefix2" ).checkboxradio( "disable" ); + $("#rewrite2").on('selectmenuchange', function () { + if ($("#rewrite2 option:selected").val() == "insert" || $("#rewrite2 option:selected").val() == "rewrite") { + $("#prefix2").checkboxradio("disable"); } else { - $( "#prefix2" ).checkboxradio( "enable" ); + $("#prefix2").checkboxradio("enable"); } }); - $( "#dynamic" ).click( function(){ + $("#dynamic").click(function () { if ($('#dynamic').is(':checked')) { - $("#dynamic-cookie-key" ).attr('required',true); - $("#dynamic_div").show("slide", "fast" ); + $("#dynamic-cookie-key").attr('required', true); + $("#dynamic_div").show("slide", "fast"); } else { - $("#dynamic-cookie-key" ).attr('required',false); - $("#dynamic_div").hide("slide", "fast" ); + $("#dynamic-cookie-key").attr('required', false); + $("#dynamic_div").hide("slide", "fast"); } }); - $( "#dynamic2" ).click( function(){ + $("#dynamic2").click(function () { if ($('#dynamic2').is(':checked')) { - $("#dynamic-cookie-key2" ).attr('required',true); - $("#dynamic_div2").show("slide", "fast" ); + $("#dynamic-cookie-key2").attr('required', true); + $("#dynamic_div2").show("slide", "fast"); } else { - $("#dynamic-cookie-key2" ).attr('required',false); - $("#dynamic_div2").hide("slide", "fast" ); + $("#dynamic-cookie-key2").attr('required', false); + $("#dynamic_div2").hide("slide", "fast"); } }); - $( "#check-servers-backend" ).click( function(){ + $("#check-servers-backend").click(function () { if ($('#check-servers-backend').is(':checked')) { - $( "#rise-backend" ).attr('required',true); - $( "#fall-backend" ).attr('required',true); - $( "#inter-backend" ).attr('required',true); - $( "#inter-backend" ).selectmenu( "option", "disabled", false ); - $( "#fall-backend" ).selectmenu( "option", "disabled", false ); - $( "#rise-backend" ).selectmenu( "option", "disabled", false ); + $("#rise-backend").attr('required', true); + $("#fall-backend").attr('required', true); + $("#inter-backend").attr('required', true); + $("#inter-backend").selectmenu("option", "disabled", false); + $("#fall-backend").selectmenu("option", "disabled", false); + $("#rise-backend").selectmenu("option", "disabled", false); } else { - $( "#rise-backend" ).attr('required',false); - $( "#fall-backend" ).attr('required',false); - $( "#inter-backend" ).attr('required',false); - $( "#inter-backend" ).selectmenu( "option", "disabled", true ); - $( "#fall-backend" ).selectmenu( "option", "disabled", true ); - $( "#rise-backend" ).selectmenu( "option", "disabled", true ); + $("#rise-backend").attr('required', false); + $("#fall-backend").attr('required', false); + $("#inter-backend").attr('required', false); + $("#inter-backend").selectmenu("option", "disabled", true); + $("#fall-backend").selectmenu("option", "disabled", true); + $("#rise-backend").selectmenu("option", "disabled", true); } }); - - + + var availableTags = [ "acl", "hdr(host)", "hdr_beg(host)", "hdr_dom(host)", "http-request", "http-response", "set-uri", "set-url", "set-header", "add-header", "del-header", "replace-header", "path_beg", "url_beg()", "urlp_sub()", "set cookie", "dynamic-cookie-key", "mysql-check", "tcpka", "tcplog", "forwardfor", "option" ]; - - $( "#ip" ).autocomplete({ - source: function( request, response ) { - if(!checkIsServerFiled('#serv')) return false; - if ( request.term == "" ) { + + $("#ip").autocomplete({ + source: function (request, response) { + if (!checkIsServerFiled('#serv')) return false; + if (request.term == "") { request.term = 1 } - $.ajax( { - url: "options.py", - data: { - show_ip: request.term, - serv: $("#serv").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); - response(data.split(" ")); - } - } ); - }, - autoFocus: true, - minLength: -1, - select: function( event, ui ) { - $('#listen-port').focus(); - } - }); - $( "#ip1" ).autocomplete({ - source: function( request, response ) { - if(!checkIsServerFiled('#serv2')) return false; - if ( request.term == "" ) { - request.term = 1 - } - $.ajax( { - url: "options.py", - data: { - show_ip: request.term, - serv: $("#serv2").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + $.ajax({ + url: "/app/add/show/ip/" + $("#serv").val(), + // data: { + // show_ip: request.term, + // token: $('#token').val() + // }, + success: function (data) { + data = data.replace(/\s+/g, ' '); response(data.split(" ")); } - } ); + }); }, autoFocus: true, minLength: -1, - select: function( event, ui ) { + select: function (event, ui) { + $('#listen-port').focus(); + } + }); + $("#ip1").autocomplete({ + source: function (request, response) { + if (!checkIsServerFiled('#serv2')) return false; + if (request.term == "") { + request.term = 1 + } + $.ajax({ + url: "/app/add/show/ip/" + $("#serv2").val(), + // data: { + // show_ip: request.term, + // token: $('#token').val() + // }, + success: function (data) { + data = data.replace(/\s+/g, ' '); + response(data.split(" ")); + } + }); + }, + autoFocus: true, + minLength: -1, + select: function (event, ui) { $('#frontend-port').focus(); } }); - $( "#backends" ).autocomplete({ - source: function( request, response ) { - if(!checkIsServerFiled('#serv2')) return false; - if ( request.term == "" ) { + $("#backends").autocomplete({ + source: function (request, response) { + if (!checkIsServerFiled('#serv2')) return false; + if (request.term == "") { request.term = 1 } - $.ajax( { - url: "options.py", - data: { - backend: request.term, - serv: $("#serv2").val(), - token: $('#token').val() - }, - success: function( data ) { + $.ajax({ + url: "/app/runtimeapi/backends/" + $("#serv2").val(), + // data: { + // token: $('#token').val() + // }, + success: function (data) { response(data.split('<br>')); - } - } ); + } + }); }, autoFocus: true, minLength: -1 }); - $( "#blacklist-hide-input" ).autocomplete({ - source: function( request, response ) { - if ( request.term == "" ) { + $("#blacklist-hide-input").autocomplete({ + source: function (request, response) { + if (request.term == "") { request.term = 1 } - $.ajax( { - url: "options.py", - data: { - get_lists: request.term, - color: "black", - group: $("#group").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); - response(data.split(" ")); - } - } ); - }, - autoFocus: true, - minLength: -1 - }); - $( "#blacklist-hide-input1" ).autocomplete({ - source: function( request, response ) { - if ( request.term == "" ) { - request.term = 1 - } - $.ajax( { - url: "options.py", - data: { - get_lists: request.term, - color: "black", - group: $("#group").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); - response(data.split(" ")); - } - } ); - }, - autoFocus: true, - minLength: -1 - }); - $( "#whitelist-hide-input" ).autocomplete({ - source: function( request, response ) { - if ( request.term == "" ) { - request.term = 1 - } - $.ajax( { - url: "options.py", - data: { - get_lists: request.term, - color: "white", - group: $("#group").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + $.ajax({ + url: "/app/add/haproxy/bwlists/black/" + $("#group").val(), + success: function (data) { + data = data.replace(/\s+/g, ' '); response(data.split(" ")); } - } ); + }); }, autoFocus: true, minLength: -1 }); - $( "#whitelist-hide-input1" ).autocomplete({ - source: function( request, response ) { - if ( request.term == "" ) { + $("#blacklist-hide-input1").autocomplete({ + source: function (request, response) { + if (request.term == "") { request.term = 1 } - $.ajax( { - url: "options.py", - data: { - get_lists: request.term, - color: "white", - group: $("#group").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + $.ajax({ + url: "/app/add/haproxy/bwlists/black/" + $("#group").val(), + success: function (data) { + data = data.replace(/\s+/g, ' '); response(data.split(" ")); } - } ); + }); }, autoFocus: true, minLength: -1 }); - $( "#new-option" ).autocomplete({ + $("#whitelist-hide-input").autocomplete({ + source: function (request, response) { + if (request.term == "") { + request.term = 1 + } + $.ajax({ + url: "/app/add/haproxy/bwlists/white/" + $("#group").val(), + success: function (data) { + data = data.replace(/\s+/g, ' '); + response(data.split(" ")); + } + }); + }, + autoFocus: true, + minLength: -1 + }); + $("#whitelist-hide-input1").autocomplete({ + source: function (request, response) { + if (request.term == "") { + request.term = 1 + } + $.ajax({ + url: "/app/add/haproxy/bwlists/white/" + $("#group").val(), + success: function (data) { + data = data.replace(/\s+/g, ' '); + response(data.split(" ")); + } + }); + }, + autoFocus: true, + minLength: -1 + }); + $("#new-option").autocomplete({ source: availableTags, autoFocus: true, - minLength: -1, - select: function( event, ui ) { + minLength: -1, + select: function (event, ui) { $("#new-option").append(ui.item.value + " ") } }); - $( "#option_table input" ).change(function() { + $("#option_table input").change(function () { var id = $(this).attr('id').split('-'); updateOptions(id[2]) }); - $( "#options" ).autocomplete({ + $("#options").autocomplete({ source: availableTags, autoFocus: true, - minLength: -1, - select: function( event, ui ) { + minLength: -1, + select: function (event, ui) { $("#optionsInput").append(ui.item.value + " "); $(this).val(''); return false; } }); - $( "#saved-options" ).autocomplete({ + $("#saved-options").autocomplete({ dataType: "json", - source: "options.py?getoption="+$('#group').val()+'&token='+$('#token').val(), + source: "/app/add/option/get/" + $('#group').val(), autoFocus: true, - minLength: 1, - select: function( event, ui ) { + minLength: 1, + select: function (event, ui) { $("#optionsInput").append(ui.item.value + " \n"); $(this).val(''); return false; } }); - $( "#options1" ).autocomplete({ + $("#options1").autocomplete({ source: availableTags, autoFocus: true, - minLength: -1, - select: function( event, ui ) { + minLength: -1, + select: function (event, ui) { $("#optionsInput1").append(ui.item.value + " "); $(this).val(''); - return false; + return false; } }); - - $( "#saved-options1" ).autocomplete({ + + $("#saved-options1").autocomplete({ dataType: "json", - source: "options.py?getoption="+$('#group').val()+'&token='+$('#token').val(), + source: "/app/add/option/get/" + $('#group').val(), autoFocus: true, - minLength: 1, - select: function( event, ui ) { - $("#optionsInput1").append(ui.item.value + " \n"); + minLength: 1, + select: function (event, ui) { + $("#optionsInput1").append(ui.item.value + " \n"); $(this).val(''); - return false; + return false; } }); - $( "#options2" ).autocomplete({ + $("#options2").autocomplete({ source: availableTags, autoFocus: true, - minLength: -1, - select: function( event, ui ) { + minLength: -1, + select: function (event, ui) { $("#optionsInput2").append(ui.item.value + " "); $(this).val(''); return false; } }); - $( "#saved-options2" ).autocomplete({ + $("#saved-options2").autocomplete({ dataType: "json", - source: "options.py?getoption="+$('#group').val()+'&token='+$('#token').val(), + source: "/app/add/option/get/" + $('#group').val(), autoFocus: true, - minLength: 1, - select: function( event, ui ) { - $("#optionsInput2").append(ui.item.value + " \n"); + minLength: 1, + select: function (event, ui) { + $("#optionsInput2").append(ui.item.value + " \n"); $(this).val(''); return false; } }); - $('#add-option-button').click(function() { + $('#add-option-button').click(function () { if ($('#option-add-table').css('display', 'none')) { $('#option-add-table').show("blind", "fast"); - } + } }); - $('#add-option-new').click(function() { - $.ajax( { - url: "options.py", + $('#add-option-new').click(function () { + $.ajax({ + url: "/app/add/option/save", data: { - newtoption: $('#new-option').val(), - newoptiongroup: $('#group').val(), - token: $('#token').val() + option: $('#new-option').val(), + option_group: $('#group').val() }, type: "POST", - success: function( data ) { + success: function (data) { if (data.indexOf('error:') != '-1') { toastr.error(data); } else { $("#option_table").append(data); - setTimeout(function() { - $( ".newoption" ).removeClass( "update" ); - }, 2500 ); + setTimeout(function () { + $(".newoption").removeClass("update"); + }, 2500); $.getScript("/inc/fontawesome.min.js"); } - } - } ); + } + }); }); - $( "#servers_table input" ).change(function() { + $("#servers_table input").change(function () { var id = $(this).attr('id').split('-'); updateSavedServer(id[2]) }); - $( '[name=servers]' ).autocomplete({ - source: "options.py?getsavedserver="+$('#group').val()+'&token='+$('#token').val(), + $('[name=servers]').autocomplete({ + source: "/app/add/server/get/" + $('#group').val(), autoFocus: true, - minLength: 1, - select: function( event, ui ) { + minLength: 1, + select: function (event, ui) { $(this).append(ui.item.value + " "); $(this).next().focus(); } }) - .autocomplete( "instance" )._renderItem = function( ul, item ) { - return $( "<li>" ) - .append( "<div>" + item.value + "<br>" + item.desc + "</div>" ) - .appendTo( ul ); - }; - $('#add-saved-server-button').click(function() { + .autocomplete("instance")._renderItem = function (ul, item) { + return $("<li>") + .append("<div>" + item.value + "<br>" + item.desc + "</div>") + .appendTo(ul); + }; + $('#add-saved-server-button').click(function () { if ($('#saved-server-add-table').css('display', 'none')) { $('#saved-server-add-table').show("blind", "fast"); - } + } }); - $('#add-saved-server-new').click(function() { - $.ajax( { - - url: "options.py", + $('#add-saved-server-new').click(function () { + $.ajax({ + url: "/app/add/server/save", data: { - newsavedserver: $('#new-saved-servers').val(), - newsavedservergroup: $('#group').val(), - newsavedserverdesc: $('#new-saved-servers-description').val(), - token: $('#token').val() + server: $('#new-saved-servers').val(), + group: $('#group').val(), + desc: $('#new-saved-servers-description').val() }, type: "POST", - success: function( data ) { + success: function (data) { if (data.indexOf('error:') != '-1') { toastr.error(data); } else { $("#servers_table").append(data); - setTimeout(function() { - $( ".newsavedserver" ).removeClass( "update" ); - }, 2500 ); + setTimeout(function () { + $(".newsavedserver").removeClass("update"); + }, 2500); $.getScript("/inc/fontawesome.min.js"); } - } - } ); + } + }); }); var forward_for_var = "option forwardfor if-none\n"; - $('#forward_for').click(function() { - if($('#optionsInput').val().indexOf(forward_for_var) == '-1') { + $('#forward_for').click(function () { + if ($('#optionsInput').val().indexOf(forward_for_var) == '-1') { $("#optionsInput").append(forward_for_var) } else { replace_text("#optionsInput", forward_for_var); - } + } }); - $('#forward_for1').click(function() { - if($('#optionsInput1').val().indexOf(forward_for_var) == '-1') { + $('#forward_for1').click(function () { + if ($('#optionsInput1').val().indexOf(forward_for_var) == '-1') { $("#optionsInput1").append(forward_for_var) } else { replace_text("#optionsInput1", forward_for_var); - } + } }); - $('#forward_for2').click(function() { - if($('#optionsInput2').val().indexOf(forward_for_var) == '-1') { + $('#forward_for2').click(function () { + if ($('#optionsInput2').val().indexOf(forward_for_var) == '-1') { $("#optionsInput2").append(forward_for_var) } else { replace_text("#optionsInput2", forward_for_var); - } + } }); var redispatch_var = "option redispatch\n"; - $('#redispatch').click(function() { - if($('#optionsInput').val().indexOf(redispatch_var) == '-1') { + $('#redispatch').click(function () { + if ($('#optionsInput').val().indexOf(redispatch_var) == '-1') { $("#optionsInput").append(redispatch_var) } else { replace_text("#optionsInput", redispatch_var); - } + } }); - $('#redispatch2').click(function() { - if($('#optionsInput2').val().indexOf(redispatch_var) == '-1') { + $('#redispatch2').click(function () { + if ($('#optionsInput2').val().indexOf(redispatch_var) == '-1') { $("#optionsInput2").append(redispatch_var) } else { replace_text("#optionsInput2", redispatch_var); - } + } }); var slow_atack = "option http-buffer-request\ntimeout http-request 10s\n" - $('#slow_atack').click(function() { - if($('#optionsInput').val().indexOf(slow_atack) == '-1') { + $('#slow_atack').click(function () { + if ($('#optionsInput').val().indexOf(slow_atack) == '-1') { $("#optionsInput").append(slow_atack) } else { replace_text("#optionsInput", slow_atack); - } + } }); - $('#slow_atack1').click(function() { - if($('#optionsInput1').val().indexOf(slow_atack) == '-1') { + $('#slow_atack1').click(function () { + if ($('#optionsInput1').val().indexOf(slow_atack) == '-1') { $("#optionsInput1").append(slow_atack) } else { replace_text("#optionsInput1", slow_atack); - } + } }); - $("#ddos").checkboxradio( "disable" ); - $("#ddos1").checkboxradio( "disable" ); - $("#ddos2").checkboxradio( "disable" ); - $( "#name" ).change(function() { + $("#ddos").checkboxradio("disable"); + $("#ddos1").checkboxradio("disable"); + $("#ddos2").checkboxradio("disable"); + $("#name").change(function () { table_name = $('#name').val(); table_name = $.trim(table_name) - if($('#name').val() != "") { - $("#ddos").checkboxradio( "enable" ); + if ($('#name').val() != "") { + $("#ddos").checkboxradio("enable"); } else { - $("#ddos").checkboxradio( "disable" ); + $("#ddos").checkboxradio("disable"); } }); - $( "#new_frontend" ).change(function() { + $("#new_frontend").change(function () { table_name = $('#new_frontend').val(); table_name = $.trim(table_name) - if($('#new_frontend').val() != "") { - $("#ddos1").checkboxradio( "enable" ); + if ($('#new_frontend').val() != "") { + $("#ddos1").checkboxradio("enable"); } else { - $("#ddos1").checkboxradio( "disable" ); + $("#ddos1").checkboxradio("disable"); } }); - - $('#ddos').click(function() { - if($('#name').val() == "") { + + $('#ddos').click(function () { + if ($('#name').val() == "") { $("#optionsInput").append(ddos_var) } - var ddos_var = "#Start config for DDOS atack protect\n"+ - "stick-table type ip size 1m expire 1m store gpc0,http_req_rate(10s),http_err_rate(10s)\n"+ - "tcp-request connection track-sc1 src\n"+ - "tcp-request connection reject if { sc1_get_gpc0 gt 0 }\n"+ - "# Abuser means more than 100reqs/10s\n"+ - "acl abuse sc1_http_req_rate("+table_name+") ge 100\n"+ - "acl flag_abuser sc1_inc_gpc0("+table_name+")\n"+ - "tcp-request content reject if abuse flag_abuser\n"+ - "#End config for DDOS\n"; - if($('#optionsInput').val().indexOf(ddos_var) == '-1') { - if($('#name').val() == "") { + var ddos_var = "#Start config for DDOS atack protect\n" + + "stick-table type ip size 1m expire 1m store gpc0,http_req_rate(10s),http_err_rate(10s)\n" + + "tcp-request connection track-sc1 src\n" + + "tcp-request connection reject if { sc1_get_gpc0 gt 0 }\n" + + "# Abuser means more than 100reqs/10s\n" + + "acl abuse sc1_http_req_rate(" + table_name + ") ge 100\n" + + "acl flag_abuser sc1_inc_gpc0(" + table_name + ")\n" + + "tcp-request content reject if abuse flag_abuser\n" + + "#End config for DDOS\n"; + if ($('#optionsInput').val().indexOf(ddos_var) == '-1') { + if ($('#name').val() == "") { alert("First set Listen name") } else { $("#optionsInput").append(ddos_var); } } else { replace_text("#optionsInput", ddos_var); - } + } }); - $('#ddos1').click(function() { + $('#ddos1').click(function () { ddos_var = escapeHtml(ddos_var); table_name = escapeHtml(table_name); - if($('#new_frontend').val() == "") { + if ($('#new_frontend').val() == "") { $("#optionsInput1").append(ddos_var) } - var ddos_var = "#Start config for DDOS atack protect\n"+ - "stick-table type ip size 1m expire 1m store gpc0,http_req_rate(10s),http_err_rate(10s)\n"+ - "tcp-request connection track-sc1 src\n"+ - "tcp-request connection reject if { sc1_get_gpc0 gt 0 }\n"+ - "# Abuser means more than 100reqs/10s\n"+ - "acl abuse sc1_http_req_rate("+table_name+") ge 100\n"+ - "acl flag_abuser sc1_inc_gpc0("+table_name+")\n"+ - "tcp-request content reject if abuse flag_abuser\n"+ - "#End config for DDOS\n"; - if($('#optionsInput1').val().indexOf(ddos_var) == '-1') { - if($('#new_frontend').val() == "") { + var ddos_var = "#Start config for DDOS atack protect\n" + + "stick-table type ip size 1m expire 1m store gpc0,http_req_rate(10s),http_err_rate(10s)\n" + + "tcp-request connection track-sc1 src\n" + + "tcp-request connection reject if { sc1_get_gpc0 gt 0 }\n" + + "# Abuser means more than 100reqs/10s\n" + + "acl abuse sc1_http_req_rate(" + table_name + ") ge 100\n" + + "acl flag_abuser sc1_inc_gpc0(" + table_name + ")\n" + + "tcp-request content reject if abuse flag_abuser\n" + + "#End config for DDOS\n"; + if ($('#optionsInput1').val().indexOf(ddos_var) == '-1') { + if ($('#new_frontend').val() == "") { alert("First set Frontend name") } else { $("#optionsInput1").append(ddos_var) @@ -689,249 +658,240 @@ $( function() { replace_text("#optionsInput1", ddos_var); } }); - var antibot_var = "#Start config for Antibot protection\n"+ + var antibot_var = "#Start config for Antibot protection\n" + "http-request track-sc0 src table per_ip_rates\n" + "http-request track-sc1 url32+src table per_ip_and_url_rates unless { path_end .css .js .png .jpeg .gif }\n" + "acl exceeds_limit sc_gpc0_rate(0) gt 15 \n" + "http-request sc-inc-gpc0(0) if { sc_http_req_rate(1) eq 1 } !exceeds_limit\n" + "http-request deny if exceeds_limit\n" + "#End config for Antibot\n"; - $('#antibot').click(function() { - if($('#optionsInput').val().indexOf(antibot_var) == '-1') { + $('#antibot').click(function () { + if ($('#optionsInput').val().indexOf(antibot_var) == '-1') { $("#optionsInput").append(antibot_var) } else { replace_text("#optionsInput", antibot_var); } }); - $('#antibot1').click(function() { - if($('#optionsInput1').val().indexOf(antibot_var) == '-1') { + $('#antibot1').click(function () { + if ($('#optionsInput1').val().indexOf(antibot_var) == '-1') { $("#optionsInput1").append(antibot_var) } else { replace_text("#optionsInput1", antibot_var); } }); - $( "#blacklist_checkbox" ).click( function(){ + $("#blacklist_checkbox").click(function () { if ($('#blacklist_checkbox').is(':checked')) { - $( "#blacklist-hide" ).show( "fast" ); - $( "#blacklist-hide-input" ).attr('required',true); + $("#blacklist-hide").show("fast"); + $("#blacklist-hide-input").attr('required', true); } else { - $( "#blacklist-hide" ).hide( "fast" ); - $( "#blacklist-hide-input" ).prop('required',false); + $("#blacklist-hide").hide("fast"); + $("#blacklist-hide-input").prop('required', false); } }); - $( "#blacklist_checkbox1" ).click( function(){ + $("#blacklist_checkbox1").click(function () { if ($('#blacklist_checkbox1').is(':checked')) { - $( "#blacklist-hide1" ).show( "fast" ); - $( "#blacklist-hide-input1" ).attr('required',true); + $("#blacklist-hide1").show("fast"); + $("#blacklist-hide-input1").attr('required', true); } else { - $( "#blacklist-hide1" ).hide( "fast" ); - $( "#blacklist-hide-input1" ).prop('required',false); + $("#blacklist-hide1").hide("fast"); + $("#blacklist-hide-input1").prop('required', false); } }); - $( "#whitelist_checkbox" ).click( function(){ + $("#whitelist_checkbox").click(function () { if ($('#whitelist_checkbox').is(':checked')) { - $( "#whitelist-hide" ).show( "fast" ); - $( "#whitelist-hide-input" ).attr('required',true); + $("#whitelist-hide").show("fast"); + $("#whitelist-hide-input").attr('required', true); } else { - $( "#whitelist-hide" ).hide( "fast" ); - $( "#whitelist-hide-input" ).prop('required',false); + $("#whitelist-hide").hide("fast"); + $("#whitelist-hide-input").prop('required', false); } }); - $( "#whitelist_checkbox1" ).click( function(){ + $("#whitelist_checkbox1").click(function () { if ($('#whitelist_checkbox1').is(':checked')) { - $( "#whitelist-hide1" ).show( "fast" ); - $( "#whitelist-hide-input1" ).attr('required',true); + $("#whitelist-hide1").show("fast"); + $("#whitelist-hide-input1").attr('required', true); } else { - $( "#whitelist-hide1" ).hide( "fast" ); - $( "#whitelist-hide-input1" ).prop('required',false); + $("#whitelist-hide1").hide("fast"); + $("#whitelist-hide-input1").prop('required', false); } }); - $( ":regex(id, template)" ).click( function(){ + $(":regex(id, template)").click(function () { if ($(':regex(id, template)').is(':checked')) { - $( ".prefix" ).show( "fast" ); - $( ".second-server" ).hide( "fast" ); - $( ".backend_server" ).hide( "fast" ); - $( ".send_proxy" ).hide( "fast" ); - $( "input[name=server_maxconn]" ).hide( "fast" ); - $( "input[name=port_check]" ).hide( "fast" ); - $( "[name=maxconn_name]" ).hide( "fast" ); - $( "[name=port_check_text]" ).hide( "fast" ); - $( ".prefix" ).attr('required',true); + $(".prefix").show("fast"); + $(".second-server").hide("fast"); + $(".backend_server").hide("fast"); + $(".send_proxy").hide("fast"); + $("input[name=server_maxconn]").hide("fast"); + $("input[name=port_check]").hide("fast"); + $("[name=maxconn_name]").hide("fast"); + $("[name=port_check_text]").hide("fast"); + $(".prefix").attr('required', true); } else { - $( ".prefix" ).hide( "fast" ); - $( ".prefix" ).attr('required',false); - $( ".second-server" ).show( "fast" ); - $( ".backend_server" ).show( "fast" ) - $( ".send_proxy" ).show( "fast" ) - $( "input[name=server_maxconn]" ).show( "fast" ); - $( "input[name=port_check]" ).show( "fast" ); - $( "[name=maxconn_name]" ).show( "fast" ); - $( "[name=port_check_text]" ).show( "fast" ); + $(".prefix").hide("fast"); + $(".prefix").attr('required', false); + $(".second-server").show("fast"); + $(".backend_server").show("fast") + $(".send_proxy").show("fast") + $("input[name=server_maxconn]").show("fast"); + $("input[name=port_check]").show("fast"); + $("[name=maxconn_name]").show("fast"); + $("[name=port_check_text]").show("fast"); } }); - var location = window.location.href; - var cur_url = '/app/' + location.split('/').pop(); - cur_url = cur_url.split('?'); - cur_url = cur_url[0].split('#'); - if (cur_url[0] == "/app/add.py") { - $("#cache").checkboxradio( "disable" ); - $("#waf").checkboxradio( "disable" ); - $( "#serv" ).on('selectmenuchange',function() { + var cur_url = window.location.href.split('/app/').pop(); + cur_url = cur_url.split('/'); + if (cur_url[0] == "add") { + $("#cache").checkboxradio("disable"); + $("#waf").checkboxradio("disable"); + $("#serv").on('selectmenuchange', function () { change_select_acceleration(""); change_select_waf(""); }); - - $("#cache2").checkboxradio( "disable" ); - $("#waf2").checkboxradio( "disable" ); - $( "#serv2" ).on('selectmenuchange',function() { + $("#cache2").checkboxradio("disable"); + $("#waf2").checkboxradio("disable"); + $("#serv2").on('selectmenuchange', function () { change_select_acceleration("2"); change_select_waf("2"); }); - - $("#cache3").checkboxradio( "disable" ); - $( "#serv3" ).on('selectmenuchange',function() { + $("#cache3").checkboxradio("disable"); + $("#serv3").on('selectmenuchange', function () { change_select_acceleration("3"); }); - $('#compression').on( "click", function() { + $('#compression').on("click", function () { if ($('#compression').is(':checked')) { - $("#cache").checkboxradio( "disable" ); + $("#cache").checkboxradio("disable"); $("#cache").prop('checked', false); } else { change_select_acceleration(""); } }); - $('#compression2').on( "click", function() { + $('#compression2').on("click", function () { if ($('#compression2').is(':checked')) { - $("#cache2").checkboxradio( "disable" ); + $("#cache2").checkboxradio("disable"); $("#cache2").prop('checked', false); } else { change_select_acceleration('2'); } }); - $('#compression3').on( "click", function() { + $('#compression3').on("click", function () { if ($('#compression3').is(':checked')) { - $("#cache3").checkboxradio( "disable" ); + $("#cache3").checkboxradio("disable"); $("#cache3").prop('checked', false); } else { change_select_acceleration('3'); } }); - $('#cache').on( "click", function() { + $('#cache').on("click", function () { if ($('#cache').is(':checked')) { - $("#compression").checkboxradio( "disable" ); + $("#compression").checkboxradio("disable"); $("#compression").prop('checked', false); } else { - $("#compression").checkboxradio( "enable" ); + $("#compression").checkboxradio("enable"); } }); - $('#cache2').on( "click", function() { + $('#cache2').on("click", function () { if ($('#cache2').is(':checked')) { - $("#compression2").checkboxradio( "disable" ); + $("#compression2").checkboxradio("disable"); $("#compression2").prop('checked', false); } else { - $("#compression2").checkboxradio( "enable" ); + $("#compression2").checkboxradio("enable"); } }); - $('#cache3').on( "click", function() { + $('#cache3').on("click", function () { if ($('#cache3').is(':checked')) { - $("#compression3").checkboxradio( "disable" ); + $("#compression3").checkboxradio("disable"); $("#compression3").prop('checked', false); } else { - $("#compression3").checkboxradio( "enable" ); + $("#compression3").checkboxradio("enable"); } }); - $( "#add1" ).on( "click", function() { + $("#add1").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('padding-left', '20px') $(this).find('a').css('border-left', '0px solid #5D9CEB'); + $(this).find('a').css('background-color', '#48505A'); $(this).children("#add1").css('padding-left', '30px'); $(this).children("#add1").css('border-left', '4px solid #5D9CEB'); + $(this).children("#add1").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 0 ); - } ); - $( "#add3" ).on( "click", function() { + $("#tabs").tabs("option", "active", 0); + }); + $("#add3").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('padding-left', '20px') $(this).find('a').css('border-left', '0px solid #5D9CEB'); + $(this).find('a').css('background-color', '#48505A'); $(this).children("#add3").css('padding-left', '30px'); $(this).children("#add3").css('border-left', '4px solid #5D9CEB'); + $(this).children("#add3").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 4 ); - } ); - $( "#add4" ).on( "click", function() { - $( "#tabs" ).tabs( "option", "active", 5 ); - } ); - $( "#add5" ).on( "click", function() { - $( "#tabs" ).tabs( "option", "active", 6 ); - } ); - $( "#add6" ).on( "click", function() { - $( "#tabs" ).tabs( "option", "active", 7 ); - $( "#userlist_serv" ).selectmenu( "open" ); - } ); - $( "#add7" ).on( "click", function() { + $("#tabs").tabs("option", "active", 4); + }); + $("#add4").on("click", function () { + $("#tabs").tabs("option", "active", 5); + }); + $("#add5").on("click", function () { + $("#tabs").tabs("option", "active", 6); + }); + $("#add6").on("click", function () { + $("#tabs").tabs("option", "active", 7); + $("#userlist_serv").selectmenu("open"); + }); + $("#add7").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('padding-left', '20px') $(this).find('a').css('border-left', '0px solid #5D9CEB'); + $(this).find('a').css('background-color', '#48505A'); $(this).children("#add7").css('padding-left', '30px'); $(this).children("#add7").css('border-left', '4px solid #5D9CEB'); + $(this).children("#add7").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 9 ); - } ); + $("#tabs").tabs("option", "active", 9); + }); } - - $( "#path-cert-listen" ).autocomplete({ - source: function( request, response ) { - if(!checkIsServerFiled('#serv')) return false; - $.ajax( { - url: "options.py", - data: { - getcerts:1, - serv: $("#serv").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + + $("#path-cert-listen").autocomplete({ + source: function (request, response) { + if (!checkIsServerFiled('#serv')) return false; + $.ajax({ + url: "/app/add/certs/" + $('#serv').val(), + success: function (data) { + data = data.replace(/\s+/g, ' '); response(data.split(" ")); - } - } ); + } + }); }, autoFocus: true, minLength: -1 }); - $( "#path-cert-frontend" ).autocomplete({ - source: function( request, response ) { - if(!checkIsServerFiled('#serv2')) return false; - $.ajax( { - url: "options.py", - data: { - getcerts:1, - serv: $("#serv2").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + $("#path-cert-frontend").autocomplete({ + source: function (request, response) { + if (!checkIsServerFiled('#serv2')) return false; + $.ajax({ + url: "/app/add/certs/" + $('#serv2').val(), + success: function (data) { + data = data.replace(/\s+/g, ' '); response(data.split(" ")); - } - } ); + } + }); }, autoFocus: true, minLength: -1 }); - $( "#ssl_key_upload" ).click(function() { - if(!checkIsServerFiled('#serv4')) return false; - if(!checkIsServerFiled('#ssl_name', 'Enter the Certificate name')) return false; - if(!checkIsServerFiled('#ssl_cert', 'Paste the contents of the certificate file')) return false; - $.ajax( { - url: "options.py", + $("#ssl_key_upload").click(function () { + if (!checkIsServerFiled('#serv4')) return false; + if (!checkIsServerFiled('#ssl_name', 'Enter the Certificate name')) return false; + if (!checkIsServerFiled('#ssl_cert', 'Paste the contents of the certificate file')) return false; + $.ajax({ + url: "/app/add/cert/add", data: { serv: $('#serv4').val(), ssl_cert: $('#ssl_cert').val(), - ssl_name: $('#ssl_name').val(), - token: $('#token').val() + ssl_name: $('#ssl_name').val() }, type: "POST", - success: function( data ) { - data = data.split("<br/>"); + success: function (data) { + data = data.split("\n"); for (i = 0; i < data.length; i++) { if (data[i]) { if (data[i].indexOf('error: ') != '-1' || data[i].indexOf('Errno') != '-1') { @@ -944,19 +904,13 @@ $( function() { } } } - } ); + }); }); - $('#ssl_key_view').click(function() { - if(!checkIsServerFiled('#serv5')) return false; - $.ajax( { - url: "options.py", - data: { - serv: $('#serv5').val(), - getcerts: "viewcert", - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + $('#ssl_key_view').click(function () { + if (!checkIsServerFiled('#serv5')) return false; + $.ajax({ + url: "/app/add/certs/" + $('#serv5').val(), + success: function (data) { if (data.indexOf('error:') != '-1') { toastr.error(data); } else { @@ -965,7 +919,7 @@ $( function() { data = data.split("\n"); var j = 1 for (i = 0; i < data.length; i++) { - data[i] = data[i].replace(/\s+/g,' '); + data[i] = data[i].replace(/\s+/g, ' '); if (data[i] != '') { if (j % 2) { if (j != 0) { @@ -981,11 +935,11 @@ $( function() { } } $("#ajax-show-ssl").html(new_data); - } + } } - } ); + }); }); - $('#lets_button').click(function() { + $('#lets_button').click(function () { var lets_domain = $('#lets_domain').val(); var lets_email = $('#lets_email').val(); if (lets_email == '' || lets_domain == '') { @@ -993,12 +947,11 @@ $( function() { } else if (validateEmail(lets_email)) { $("#ajax-ssl").html(wait_mess); $.ajax({ - url: "options.py", + url: "/app/add/lets", data: { serv: $('#serv_for_lets').val(), lets_domain: lets_domain, - lets_email: lets_email, - token: $('#token').val() + lets_email: lets_email }, type: "POST", success: function (data) { @@ -1024,122 +977,122 @@ $( function() { '<input name="server_port" required title="Backend port" size=3 placeholder="yyy" class="form-control second-server add_server_number" type="number"> ' + 'port check: <input name="port_check" required title="Maxconn. Default 200" size=5 value="200" class="form-control add_server_number" type="number">' + ' maxconn: <input name="server_maxconn" required title="Maxconn. Default 200" size=5 value="200" class="form-control add_server_number" type="number">' - $('[name=add-server-input]').click(function() { + $('[name=add-server-input]').click(function () { $("[name=add_servers]").append(add_server_var); changePortCheckFromServerPort(); }); - $('[name=port]').on('input', function (){ + $('[name=port]').on('input', function () { var iNum = parseInt($('[name=port]').val()); $('[name=port_check]').val(iNum); $('[name=server_port]').val(iNum); }); changePortCheckFromServerPort(); var add_userlist_var = '<br /><input name="userlist-user" title="User name" placeholder="user_name" class="form-control"> <input name="userlist-password" required title="User password. By default it insecure-password" placeholder="password" class="form-control"> <input name="userlist-user-group" title="User`s group" placeholder="user`s group" class="form-control">' - $('#add-userlist-user').click(function() { - $('#userlist-users').append(add_userlist_var); + $('#add-userlist-user').click(function () { + $('#userlist-users').append(add_userlist_var); }); var add_userlist_group_var = '<br /><input name="userlist-group" title="User`s group" placeholder="group_name" class="form-control">' - $('#add-userlist-group').click(function() { - $('#userlist-groups').append(add_userlist_group_var); + $('#add-userlist-group').click(function () { + $('#userlist-groups').append(add_userlist_group_var); }); var add_peer_var = '<br /><input name="servers_name" required title="Peer name" size=14 placeholder="haproxyN" class="form-control">: ' + '<input name="servers" title="Backend IP" size=14 placeholder="xxx.xxx.xxx.xxx" class="form-control second-server">: ' + '<input name="server_port" required title="Backend port" size=3 placeholder="yyy" class="form-control second-server add_server_number" type="number">' - $('[name=add-peer-input]').click(function() { + $('[name=add-peer-input]').click(function () { $("[name=add_peers]").append(add_peer_var); }); - $('.advance-show-button').click(function() { + $('.advance-show-button').click(function () { $('.advance').fadeIn(); $('.advance-show-button').css('display', 'none'); $('.advance-hide-button').css('display', 'block'); return false; }); - $('.advance-hide-button').click(function() { + $('.advance-hide-button').click(function () { $('.advance').fadeOut(); $('.advance-show-button').css('display', 'block'); $('.advance-hide-button').css('display', 'none'); return false; }); - $('#ssl_offloading').click(function() { - if($('#optionsInput').val().indexOf('ssl_fc ') == '-1') { + $('#ssl_offloading').click(function () { + if ($('#optionsInput').val().indexOf('ssl_fc ') == '-1') { $("#optionsInput").append(ssl_offloading_var) } else { replace_text("#optionsInput", ssl_offloading_var); } }); - $('#ssl_offloading1').click(function() { - if($('#optionsInput1').val().indexOf('ssl_fc ') == '-1') { + $('#ssl_offloading1').click(function () { + if ($('#optionsInput1').val().indexOf('ssl_fc ') == '-1') { $("#optionsInput1").append(ssl_offloading_var) } else { replace_text("#optionsInput1", ssl_offloading_var); } }); - $('#ssl_offloading2').click(function() { - if($('#optionsInput2').val().indexOf('ssl_fc ') == '-1') { + $('#ssl_offloading2').click(function () { + if ($('#optionsInput2').val().indexOf('ssl_fc ') == '-1') { $("#optionsInput2").append(ssl_offloading_var) } else { replace_text("#optionsInput2", ssl_offloading_var); } }); - - $( ".redirectListen" ).on( "click", function() { + + $(".redirectListen").on("click", function () { resetProxySettings(); - $( "#tabs" ).tabs( "option", "active", 1 ); - $( "#serv" ).selectmenu( "open" ); - } ); - $( ".redirectFrontend" ).on( "click", function() { + $("#tabs").tabs("option", "active", 1); + $("#serv").selectmenu("open"); + }); + $(".redirectFrontend").on("click", function () { resetProxySettings(); var TabId = 2; - $( "#tabs" ).tabs( "option", "active", TabId ); - $( "#serv"+TabId ).selectmenu( "open" ); - } ); - $( ".redirectBackend" ).on( "click", function() { + $("#tabs").tabs("option", "active", TabId); + $("#serv" + TabId).selectmenu("open"); + }); + $(".redirectBackend").on("click", function () { resetProxySettings(); var TabId = 3; - $( "#tabs" ).tabs( "option", "active", TabId ); - $( "#serv"+TabId ).selectmenu( "open" ); - } ); - $( ".redirectSsl" ).on( "click", function() { - $( "#tabs" ).tabs( "option", "active", 4 ); - $( "#serv5" ).selectmenu( "open" ); - } ); - - $( "#create-http-listen" ).on( "click", function() { + $("#tabs").tabs("option", "active", TabId); + $("#serv" + TabId).selectmenu("open"); + }); + $(".redirectSsl").on("click", function () { + $("#tabs").tabs("option", "active", 4); + $("#serv5").selectmenu("open"); + }); + + $("#create-http-listen").on("click", function () { resetProxySettings(); createHttp(1, 'listen'); }); - $( "#create-http-frontend" ).on( "click", function() { + $("#create-http-frontend").on("click", function () { resetProxySettings(); createHttp(2, 'frontend'); }); - $( "#create-http-backend" ).on( "click", function() { + $("#create-http-backend").on("click", function () { resetProxySettings(); createHttp(3, 'backend'); }); - $( "#create-ssl-listen" ).on( "click", function() { + $("#create-ssl-listen").on("click", function () { resetProxySettings(); createSsl(1, 'listen'); }); - $( "#create-ssl-frontend" ).on( "click", function() { + $("#create-ssl-frontend").on("click", function () { resetProxySettings(); createSsl(2, 'frontend'); }); - $( "#create-ssl-backend" ).on( "click", function() { + $("#create-ssl-backend").on("click", function () { resetProxySettings(); createSsl(3, 'backend'); }); - $( "#create-https-listen" ).on( "click", function() { + $("#create-https-listen").on("click", function () { resetProxySettings(); - createHttps(1, 'listen'); + createHttps(1, 'listen'); }); - $( "#create-https-frontend" ).on( "click", function() { + $("#create-https-frontend").on("click", function () { resetProxySettings(); - createHttps(2, 'frontend'); + createHttps(2, 'frontend'); }); - $( "#create-https-backend" ).on( "click", function() { + $("#create-https-backend").on("click", function () { resetProxySettings(); - createHttps(3, 'backend'); + createHttps(3, 'backend'); }); var tcp_note = 'The check is valid when the server answers with a <b>SYN/ACK</b> packet' var ssl_note = 'The check is valid if the server answers with a valid SSL server <b>hello</b> message' @@ -1152,68 +1105,68 @@ $( function() { var pgsql_note = 'The check is valid if the server response contains a successful <b>Authentication</b> request' var redis_note = 'The check is valid if the server response contains the string <b>+PONG</b>' var smtpchk_note = 'The check is valid if the server response code starts with <b>\'2\'</b>' - $( "#listener_checks" ).on('selectmenuchange',function() { - if ($( "#listener_checks option:selected" ).val() == "option tcp-check") { + $("#listener_checks").on('selectmenuchange', function () { + if ($("#listener_checks option:selected").val() == "option tcp-check") { $("#listener_checks_note").html(tcp_note) } - if ($( "#listener_checks option:selected" ).val() == "option ssl-hello-chk") { + if ($("#listener_checks option:selected").val() == "option ssl-hello-chk") { $("#listener_checks_note").html(ssl_note) } - if ($( "#listener_checks option:selected" ).val() == "option httpchk") { + if ($("#listener_checks option:selected").val() == "option httpchk") { $("#listener_checks_note").html(httpchk_note) } - if ($( "#listener_checks option:selected" ).val() == "option ldap-check") { + if ($("#listener_checks option:selected").val() == "option ldap-check") { $("#listener_checks_note").html(ldap_note) } - if ($( "#listener_checks option:selected" ).val() == "option mysql-check") { + if ($("#listener_checks option:selected").val() == "option mysql-check") { $("#listener_checks_note").html(mysql_note) } - if ($( "#listener_checks option:selected" ).val() == "option pgsql-check") { + if ($("#listener_checks option:selected").val() == "option pgsql-check") { $("#listener_checks_note").html(pgsql_note) } - if ($( "#listener_checks option:selected" ).val() == "option redis-check") { + if ($("#listener_checks option:selected").val() == "option redis-check") { $("#listener_checks_note").html(redis_note) } - if ($( "#listener_checks option:selected" ).val() == "option smtpchk") { + if ($("#listener_checks option:selected").val() == "option smtpchk") { $("#listener_checks_note").html(smtpchk_note) } - if ($( "#listener_checks option:selected" ).val() == "") { + if ($("#listener_checks option:selected").val() == "") { $("#listener_checks_note").html('') } }); - $( "#backend_checks" ).on('selectmenuchange',function() { - if ($( "#backend_checks option:selected" ).val() == "") { + $("#backend_checks").on('selectmenuchange', function () { + if ($("#backend_checks option:selected").val() == "") { $("#backend_checks_note").html('') } - if ($( "#backend_checks option:selected" ).val() == "option tcp-check") { + if ($("#backend_checks option:selected").val() == "option tcp-check") { $("#backend_checks_note").html(tcp_note) } - if ($( "#backend_checks option:selected" ).val() == "option ssl-hello-chk") { + if ($("#backend_checks option:selected").val() == "option ssl-hello-chk") { $("#backend_checks_note").html(ssl_note) } - if ($( "#backend_checks option:selected" ).val() == "option httpchk") { + if ($("#backend_checks option:selected").val() == "option httpchk") { $("#backend_checks_note").html(httpchk_note) } - if ($( "#backend_checks option:selected" ).val() == "option ldap-check") { + if ($("#backend_checks option:selected").val() == "option ldap-check") { $("#backend_checks_note").html(ldap_note) } - if ($( "#backend_checks option:selected" ).val() == "option mysql-check") { + if ($("#backend_checks option:selected").val() == "option mysql-check") { $("#backend_checks_note").html(mysql_note) } - if ($( "#backend_checks option:selected" ).val() == "option pgsql-check") { + if ($("#backend_checks option:selected").val() == "option pgsql-check") { $("#backend_checks_note").html(pgsql_note) } - if ($( "#backend_checks option:selected" ).val() == "option redis-check") { + if ($("#backend_checks option:selected").val() == "option redis-check") { $("#backend_checks_note").html(redis_note) } - if ($( "#backend_checks option:selected" ).val() == "option smtpchk") { + if ($("#backend_checks option:selected").val() == "option smtpchk") { $("#backend_checks_note").html(smtpchk_note) } - if ($( "#backend_checks option:selected" ).val() == "") { + if ($("#backend_checks option:selected").val() == "") { $("#backend_checks_note").html('') } }); - $( "#listener_checks" ).on('selectmenuchange',function() { + $("#listener_checks").on('selectmenuchange', function () { if ($("#listener_checks").val() == 'option httpchk') { $("#listener_checks_http").show(); $("#listener_checks_http_path").attr('required', 'true'); @@ -1223,7 +1176,7 @@ $( function() { $("#listener_checks_http_domain").removeAttr('required'); } }); - $( "#backend_checks" ).on('selectmenuchange',function() { + $("#backend_checks").on('selectmenuchange', function () { if ($("#backend_checks").val() == 'option httpchk') { $("#backend_checks_http").show(); $("#backend_checks_http_path").attr('required', 'true'); @@ -1233,73 +1186,73 @@ $( function() { $("#backend_checks_http_domain").removeAttr('required'); } }); - $( "#add_listener_header" ).on( "click", function() { - $( "#listener_header_div" ).show(); - $( "#listener_add_header" ).show(); - $( "#add_listener_header" ).hide(); - } ); - $( "#add_frontend_header" ).on( "click", function() { - $( "#frontend_header_div" ).show(); - $( "#frontend_add_header" ).show(); - $( "#add_frontend_header" ).hide(); - } ); - $( "#add_backend_header" ).on( "click", function() { - $( "#backend_header_div" ).show(); - $( "#backend_add_header" ).show(); - $( "#add_backend_header" ).hide(); - } ); - $("#listener_add_header").click(function(){ + $("#add_listener_header").on("click", function () { + $("#listener_header_div").show(); + $("#listener_add_header").show(); + $("#add_listener_header").hide(); + }); + $("#add_frontend_header").on("click", function () { + $("#frontend_header_div").show(); + $("#frontend_add_header").show(); + $("#add_frontend_header").hide(); + }); + $("#add_backend_header").on("click", function () { + $("#backend_header_div").show(); + $("#backend_add_header").show(); + $("#add_backend_header").hide(); + }); + $("#listener_add_header").click(function () { make_actions_for_adding_header('#listener_header_div'); }); - $("#frontend_add_header").click(function(){ + $("#frontend_add_header").click(function () { make_actions_for_adding_header('#frontend_header_div'); }); - $("#backend_add_header").click(function(){ + $("#backend_add_header").click(function () { make_actions_for_adding_header('#backend_header_div'); }); - $( "#add_listener_acl" ).on( "click", function() { - $( "#listener_acl" ).show(); - $( "#listener_add_acl" ).show(); - $( "#add_listener_acl" ).hide(); - } ); - $( "#add_frontend_acl" ).on( "click", function() { - $( "#frontend_acl" ).show(); - $( "#frontend_add_acl" ).show(); - $( "#add_frontend_acl" ).hide(); - } ); - $( "#add_backend_acl" ).on( "click", function() { - $( "#backend_acl" ).show(); - $( "#backend_add_acl" ).show(); - $( "#add_backend_acl" ).hide(); - } ); - $("#listener_add_acl").click(function(){ + $("#add_listener_acl").on("click", function () { + $("#listener_acl").show(); + $("#listener_add_acl").show(); + $("#add_listener_acl").hide(); + }); + $("#add_frontend_acl").on("click", function () { + $("#frontend_acl").show(); + $("#frontend_add_acl").show(); + $("#add_frontend_acl").hide(); + }); + $("#add_backend_acl").on("click", function () { + $("#backend_acl").show(); + $("#backend_add_acl").show(); + $("#add_backend_acl").hide(); + }); + $("#listener_add_acl").click(function () { make_actions_for_adding_acl_rule('#listener_acl'); $("#listener_acl").find('option[value=5]').remove(); }); - $("#frontend_add_acl").click(function(){ + $("#frontend_add_acl").click(function () { make_actions_for_adding_acl_rule('#frontend_acl'); }); - $("#backend_add_acl").click(function(){ + $("#backend_add_acl").click(function () { make_actions_for_adding_acl_rule('#backend_acl'); }); - $("#add_bind_listener").click(function(){ + $("#add_bind_listener").click(function () { make_actions_for_adding_bind('#listener_bind'); - $( "#listener_bind" ).show(); + $("#listener_bind").show(); }); - $("#add_bind_frontend").click(function(){ + $("#add_bind_frontend").click(function () { make_actions_for_adding_bind('#frontend_bind'); - $( "#frontend_bind" ).show(); + $("#frontend_bind").show(); }); - $( "#serv" ).on('selectmenuchange',function() { + $("#serv").on('selectmenuchange', function () { $('#name').focus(); }); - $( "#serv2" ).on('selectmenuchange',function() { + $("#serv2").on('selectmenuchange', function () { $('#new_frontend').focus(); }); - $( "#serv3" ).on('selectmenuchange',function() { + $("#serv3").on('selectmenuchange', function () { $('#new_backend').focus(); }); - $( "#userlist_serv" ).on('selectmenuchange',function() { + $("#userlist_serv").on('selectmenuchange', function () { $('#new_userlist').focus(); }); }); @@ -1387,12 +1340,7 @@ function confirmDeleteOption(id) { function removeOption(id) { $("#option-"+id).css("background-color", "#f2dede"); $.ajax( { - url: "options.py", - data: { - optiondel: id, - token: $('#token').val() - }, - type: "POST", + url: "/app/add/option/delete/" + id, success: function( data ) { data = data.replace(/\s+/g,' '); if (data.indexOf('error:') != '-1') { @@ -1405,26 +1353,25 @@ function removeOption(id) { } function updateOptions(id) { toastr.clear(); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/add/option/update", data: { - updateoption: $('#option-body-'+id).val(), + option: $('#option-body-' + id).val(), id: id, - token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); } else { - $("#option-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#option-"+id ).removeClass( "update" ); - }, 2500 ); + $("#option-" + id).addClass("update", 1000); + setTimeout(function () { + $("#option-" + id).removeClass("update"); + }, 2500); } } - } ); + }); } function confirmDeleteSavedServer(id) { $( "#dialog-confirm" ).dialog({ @@ -1447,15 +1394,10 @@ function confirmDeleteSavedServer(id) { function removeSavedServer(id) { $("#servers-saved-"+id).css("background-color", "#f2dede"); $.ajax( { - url: "options.py", - data: { - savedserverdel: id, - token: $('#token').val() - }, - type: "POST", + url: "/app/add/server/delete/"+id, success: function( data ) { data = data.replace(/\s+/g,' '); - if(data.indexOf('Ok') != '-1') { + if(data.indexOf('ok') != '-1') { $("#servers-saved-"+id).remove(); } } @@ -1464,12 +1406,11 @@ function removeSavedServer(id) { function updateSavedServer(id) { toastr.clear(); $.ajax( { - url: "options.py", + url: "/app/add/server/update", data: { - updatesavedserver: $('#servers-ip-'+id).val(), - description: $('#servers-desc-'+id).val(), + server: $('#servers-ip-'+id).val(), + desc: $('#servers-desc-'+id).val(), id: id, - token: $('#token').val() }, type: "POST", success: function( data ) { @@ -1477,9 +1418,9 @@ function updateSavedServer(id) { if (data.indexOf('error:') != '-1') { toastr.error(data); } else { - $("#option-"+id).addClass( "update", 1000 ); + $("#servers-saved-"+id).addClass( "update", 1000 ); setTimeout(function() { - $( "#option-"+id ).removeClass( "update" ); + $( "#servers-saved-"+id ).removeClass( "update" ); }, 2500 ); } } @@ -1491,13 +1432,7 @@ function view_ssl(id) { var raw_word = $('#translate').attr('data-raw'); if(!checkIsServerFiled('#serv5')) return false; $.ajax( { - url: "options.py", - data: { - serv: $('#serv5').val(), - getcert: id, - token: $('#token').val() - }, - type: "POST", + url: "/app/add/cert/" + $('#serv5').val() + '/' + id, success: function( data ) { if (data.indexOf('error: ') != '-1') { toastr.error(data); @@ -1534,25 +1469,19 @@ function view_ssl(id) { function showRawSSL(id) { var delete_word = $('#translate').attr('data-delete'); var cancel_word = $('#translate').attr('data-cancel'); - $.ajax( { - url: "options.py", - data: { - serv: $('#serv5').val(), - getcert_raw: id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + $.ajax({ + url: "/app/add/cert/get/raw/" + $('#serv5').val() + "/" + id, + success: function (data) { if (data.indexOf('error: ') != '-1') { toastr.error(data); } else { $('#dialog-confirm-body').text(data); - $( "#dialog-confirm-cert" ).dialog({ + $("#dialog-confirm-cert").dialog({ resizable: false, height: "auto", width: 670, modal: true, - title: "Certificate from "+$('#serv5').val()+", name: "+id, + title: "Certificate from " + $('#serv5').val() + ", name: " + id, buttons: [{ text: cancel_word, click: function () { @@ -1573,65 +1502,56 @@ function showRawSSL(id) { }); } } - } ); + }); } function deleteSsl(id) { - if(!checkIsServerFiled('#serv5')) return false; - $.ajax( { - url: "options.py", - data: { - serv: $('#serv5').val(), - delcert: id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + if (!checkIsServerFiled('#serv5')) return false; + $.ajax({ + url: "/app/add/cert/" + $("#serv5").val() + "/" + id, + type: "DELETE", + success: function (data) { if (data.indexOf('error: ') != '-1') { toastr.error(data); } else { toastr.clear(); toastr.success('SSL cert ' + id + ' has been deleted'); - $("#ssl_key_view").trigger( "click" ); + $("#ssl_key_view").trigger("click"); } } - } ); + }); } function change_select_acceleration(id) { - $.ajax( { - url: "options.py", - data: { - get_hap_v: 1, - serv: $('#serv'+id+' option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(parseFloat(data) < parseFloat('1.8') || data == ' ') { - $("#cache"+id).checkboxradio( "disable" ); + $.ajax({ + url: "/app/service/haproxy/version/" + $('#serv' + id + ' option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (parseFloat(data) < parseFloat('1.8') || data == ' ') { + $("#cache" + id).checkboxradio("disable"); } else { - $("#cache"+id).checkboxradio( "enable" ); + $("#cache" + id).checkboxradio("enable"); } } - } ); + }); } function change_select_waf(id) { - $.ajax( { - url: "options.py", - data: { - get_hap_v: 1, - serv: $('#serv'+id+' option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - if(parseFloat(data) < parseFloat('1.8')) { - $("#waf"+id).checkboxradio( "disable" ); + $.ajax({ + url: "/app/service/haproxy/version/" + $('#serv' + id + ' option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + if (parseFloat(data) < parseFloat('1.8')) { + $("#waf" + id).checkboxradio("disable"); } else { - $("#waf"+id).checkboxradio( "enable" ); + $("#waf" + id).checkboxradio("enable"); } } - } ); + }); } function createList(color) { if(color == 'white') { @@ -1641,12 +1561,11 @@ function createList(color) { } list = escapeHtml(list); $.ajax( { - url: "options.py", + url: "/app/add/haproxy/bwlist/create", data: { bwlists_create: list, color: color, - group: $('#group').val(), - token: $('#token').val() + group: $('#group').val() }, type: "POST", success: function( data ) { @@ -1667,14 +1586,7 @@ function createList(color) { } function editList(list, color) { $.ajax( { - url: "options.py", - data: { - bwlists: list, - color: color, - group: $('#group').val(), - token: $('#token').val() - }, - type: "POST", + url: "/app/add/haproxy/bwlist/" + list + "/" + color + "/" + $('#group').val(), success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data); @@ -1731,15 +1643,14 @@ function saveList(action, list, color) { var serv = $( "#serv-"+color+"-list option:selected" ).val(); if(!checkIsServerFiled($("#serv-"+color+"-list"))) return false; $.ajax({ - url: "options.py", + url: "/app/add/haproxy/bwlist/save", data: { bwlists_save: list, serv: serv, bwlists_content: $('#edit_lists').val(), color: color, group: $('#group').val(), - bwlists_restart: action, - token: $('#token').val() + bwlists_restart: action }, type: "POST", success: function (data) { @@ -1762,15 +1673,7 @@ function deleteList(list, color) { var serv = $( "#serv-"+color+"-list option:selected" ).val(); if(!checkIsServerFiled($("#serv-"+color+"-list"))) return false; $.ajax({ - url: "options.py", - data: { - bwlists_delete: list, - serv: serv, - color: color, - group: $('#group').val(), - token: $('#token').val() - }, - type: "POST", + url: "/app/add/haproxy/bwlist/delete/" + serv + "/" + color + "/" + list + "/" + $('#group').val(), success: function (data) { if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1' || data.indexOf('Errno') != '-1') { toastr.error(data); @@ -1789,11 +1692,10 @@ function createMap() { map_name = $('#new_map_name').val() map_name = escapeHtml(map_name); $.ajax( { - url: "options.py", + url: "/app/add/map/create", data: { map_create: map_name, - group: $('#group').val(), - token: $('#token').val() + group: $('#group').val() }, type: "POST", success: function( data ) { @@ -1814,11 +1716,10 @@ function createMap() { } function editMap(map) { $.ajax( { - url: "options.py", + url: "/app/add/map/edit", data: { edit_map: map, - group: $('#group').val(), - token: $('#token').val() + group: $('#group').val() }, type: "POST", success: function( data ) { @@ -1877,14 +1778,13 @@ function saveMap(action, map) { var serv = $( "#serv-map option:selected" ).val(); if(!checkIsServerFiled($("#serv-map"))) return false; $.ajax({ - url: "options.py", + url: "/app/add/map/save", data: { map_save: map, serv: serv, content: $('#edit_map').val(), group: $('#group').val(), - map_restart: action, - token: $('#token').val() + map_restart: action }, type: "POST", success: function (data) { @@ -1907,12 +1807,11 @@ function deleteMap(map) { var serv = $( "#serv-map option:selected" ).val(); if(!checkIsServerFiled($("#serv-map"))) return false; $.ajax({ - url: "options.py", + url: "/app/add/map/delete", data: { map_delete: map, serv: serv, - group: $('#group').val(), - token: $('#token').val() + group: $('#group').val() }, type: "POST", success: function (data) { @@ -2215,27 +2114,26 @@ function make_actions_for_adding_bind(section_id) { serv = 'serv' } $( "#"+random_id + " > input[name=ip]").autocomplete({ - source: function( request, response ) { - if ( request.term == "" ) { + source: function (request, response) { + if (request.term == "") { request.term = 1 } - $.ajax( { - url: "options.py", - data: { - show_ip: request.term, - serv: $("#"+serv).val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + $.ajax({ + url: "/app/add/show/ip/" + $("#" + serv).val(), + // data: { + // show_ip: request.term, + // token: $('#token').val() + // }, + success: function (data) { + data = data.replace(/\s+/g, ' '); response(data.split(" ")); } - } ); + }); }, autoFocus: true, minLength: -1, - select: function( event, ui ) { - $( "#"+random_id + " > input[name=port]").focus(); + select: function (event, ui) { + $("#" + random_id + " > input[name=port]").focus(); } }); } @@ -2249,17 +2147,11 @@ function makeid(length) { return result; } function showUserlists() { - var serv = $( "#existing_userlist_serv option:selected" ).val(); - var select_id = $( "#existing_userlist_serv" ); - if(!checkIsServerFiled(select_id)) return false; + var serv = $("#existing_userlist_serv option:selected").val(); + var select_id = $("#existing_userlist_serv"); + if (!checkIsServerFiled(select_id)) return false; $.ajax({ - url: "options.py", - data: { - show_userlists: 1, - serv: serv, - token: $('#token').val() - }, - type: "POST", + url: "/app/add/haproxy/userlist/" + serv, success: function (data) { if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { toastr.error(data); @@ -2271,14 +2163,14 @@ function showUserlists() { var existing_userlist_ajax = $.find("#existing_userlist_ajax"); existing_userlist_ajax = existing_userlist_ajax[0].id; data[i] = escapeHtml(data[i]); - $('#'+existing_userlist_ajax).append('<a href="sections.py?serv='+serv+'§ion='+data[i]+'" title="Edit/Delete this userlist" target="_blank">'+data[i]+'</a> '); + $('#' + existing_userlist_ajax).append('<a href="/app/config/section/haproxy/' + serv + '/' + data[i] + '" title="Edit/Delete this userlist" target="_blank">' + data[i] + '</a> '); } } } }); } function changePortCheckFromServerPort() { - $('[name=server_port]').on('input', function (){ + $('[name=server_port]').on('input', function () { var iNum = parseInt($($(this)).val()); $($(this)).next().val(iNum); }); diff --git a/inc/add_nginx.js b/inc/add_nginx.js index 4cb816a7..77a9998b 100644 --- a/inc/add_nginx.js +++ b/inc/add_nginx.js @@ -29,18 +29,16 @@ $( function() { }); }); function resetProxySettings() { - $('[name=upstream]').val(''); - $('input:checkbox').prop("checked", false); - $('[name=check-servers]').prop("checked", true); - $('input:checkbox').checkboxradio("refresh"); - $('.advance-show').fadeIn(); - $('.advance').fadeOut(); - $('[name=mode').val('http'); - $('select').selectmenu('refresh'); - $("#path-cert-listen").attr('required', false); - $("#path-cert-frontend").attr('required', false); - // replace_text("#optionsInput", ssl_offloading_var); - // replace_text("#optionsInput1", ssl_offloading_var); + $('[name=upstream]').val(''); + $('input:checkbox').prop("checked", false); + $('[name=check-servers]').prop("checked", true); + $('input:checkbox').checkboxradio("refresh"); + $('.advance-show').fadeIn(); + $('.advance').fadeOut(); + $('[name=mode').val('http'); + $('select').selectmenu('refresh'); + $("#path-cert-listen").attr('required', false); + $("#path-cert-frontend").attr('required', false); } function checkIsServerFiled(select_id, message = 'Select a server first') { if ($(select_id).val() == null || $(select_id).val() == '') { @@ -50,31 +48,32 @@ function checkIsServerFiled(select_id, message = 'Select a server first') { return true; } function generateConfig(form_name) { - var frm = $('#'+form_name); + var frm = $('#' + form_name); if (form_name == 'add-upstream') { serv = '#serv' name_id = '#name' } - if(!checkIsServerFiled(serv)) return false; - if(!checkIsServerFiled(name_id, 'The name cannot be empty')) return false; + if (!checkIsServerFiled(serv)) return false; + if (!checkIsServerFiled(name_id, 'The name cannot be empty')) return false; var input = $("<input>") .attr("name", "generateconfig").val("1").attr("type", "hidden").attr("id", "generateconfig"); - $('#'+form_name +' input[name=acl_then_value]').each(function(){ - if (!$(this).val()){ + $('#' + form_name + ' input[name=acl_then_value]').each(function () { + if (!$(this).val()) { $(this).val('IsEmptY') } }); - $('#'+form_name +' input[name=ip]').each(function(){ - if (!$(this).val()){ + $('#' + form_name + ' input[name=ip]').each(function () { + if (!$(this).val()) { $(this).val('IsEmptY') } }); - $('#'+form_name +' input[name=port]').each(function(){ - if (!$(this).val()){ + $('#' + form_name + ' input[name=port]').each(function () { + if (!$(this).val()) { $(this).val('IsEmptY') } }); frm.append(input); + var generated_title = $('#translate').attr('data-generated_config'); $.ajax({ url: frm.attr('action'), data: frm.serialize(), @@ -90,7 +89,7 @@ function generateConfig(form_name) { height: "auto", width: 650, modal: true, - title: "Generated config", + title: generated_title, buttons: { Ok: function () { $(this).dialog("close"); @@ -101,13 +100,13 @@ function generateConfig(form_name) { } }); $("#generateconfig").remove(); - $('#'+form_name +' input[name=ip]').each(function(){ - if ($(this).val() == 'IsEmptY'){ + $('#' + form_name + ' input[name=ip]').each(function () { + if ($(this).val() == 'IsEmptY') { $(this).val('') } }); - $('#'+form_name +' input[name=port]').each(function(){ - if ($(this).val() == 'IsEmptY'){ + $('#' + form_name + ' input[name=port]').each(function () { + if ($(this).val() == 'IsEmptY') { $(this).val('') } }); diff --git a/inc/configshow.js b/inc/configshow.js index 672ddbb8..ad1f3961 100644 --- a/inc/configshow.js +++ b/inc/configshow.js @@ -64,7 +64,6 @@ $( function() { data = data.replace(/\n/g, "<br>"); if (data.indexOf(service + ': command not found') != '-1') { try { - var service = findGetParameter('service'); toastr.error('Cannot save config. There is no ' + service); } catch (err) { console.log(err); diff --git a/inc/css/provisioning.css b/inc/css/ha.css similarity index 100% rename from inc/css/provisioning.css rename to inc/css/ha.css diff --git a/inc/ha.js b/inc/ha.js index 10869be5..19b33385 100644 --- a/inc/ha.js +++ b/inc/ha.js @@ -4,16 +4,14 @@ $( function() { }); var ipformat = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; $( "#interface" ).autocomplete({ - source: function( request, response ) { - $.ajax( { - url: "options.py", - data: { - showif:1, - serv: $("#master").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + source: function (request, response) { + $.ajax({ + url: "/app/server/show/if/" + $("#master").val(), + // data: { + // token: $('#token').val() + // }, + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { toastr.error(data); } else if (data == '') { @@ -23,22 +21,20 @@ $( function() { response(data.split(" ")); } } - } ); + }); }, autoFocus: true, minLength: -1 }); $( "#interface-add" ).autocomplete({ - source: function( request, response ) { - $.ajax( { - url: "options.py", - data: { - showif:1, - serv: $("#master-add").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + source: function (request, response) { + $.ajax({ + url: "/app/server/show/if/" + $("#master-add").val(), + // data: { + // token: $('#token').val() + // }, + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); @@ -49,22 +45,20 @@ $( function() { response(data.split(" ")); } } - } ); + }); }, autoFocus: true, minLength: -1 }); $( "#slave_interface" ).autocomplete({ - source: function( request, response ) { - $.ajax( { - url: "options.py", - data: { - showif:1, - serv: $("#slave").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + source: function (request, response) { + $.ajax({ + url: "/app/server/show/if/" + $("#slave").val(), + // data: { + // token: $('#token').val() + // }, + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); @@ -75,22 +69,20 @@ $( function() { response(data.split(" ")); } } - } ); + }); }, autoFocus: true, minLength: -1 }); $( "#slave_interface-add" ).autocomplete({ - source: function( request, response ) { - $.ajax( { - url: "options.py", - data: { - showif:1, - serv: $("#slave-add").val(), - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); + source: function (request, response) { + $.ajax({ + url: "/app/server/show/if/" + $("#slave-add").val(), + // data: { + // token: $('#token').val() + // }, + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { toastr.error(data); } else if (data == '') { @@ -100,7 +92,7 @@ $( function() { response(data.split(" ")); } } - } ); + }); }, autoFocus: true, minLength: -1 @@ -224,20 +216,18 @@ $( function() { } }); $( "#master" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - get_keepalived_v: 1, - serv: $('#master option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); + $.ajax({ + url: "/app/install/keepalived/version/" + $('#master option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('error:') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if(data.indexOf('keepalived:') != '-1') { + } else if (data.indexOf('keepalived:') != '-1') { $('#cur_master_ver').text('Keepalived has not installed'); $('#create').attr('title', 'Create HA cluster'); } else { @@ -245,23 +235,21 @@ $( function() { $('#cur_master_ver').css('font-weight', 'bold'); } } - } ); + }); }); $( "#slave" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - get_keepalived_v: 1, - serv: $('#slave option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); + $.ajax({ + url: "/app/install/keepalived/version/" + $('#slave option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('error:') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if(data.indexOf('keepalived:') != '-1') { + } else if (data.indexOf('keepalived:') != '-1') { $('#cur_slave_ver').text('Keepalived has not installed'); $('#create').attr('title', 'Create HA cluster'); } else { @@ -269,23 +257,21 @@ $( function() { $('#cur_slave_ver').css('font-weight', 'bold'); } } - } ); + }); }); $( "#master-add" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - get_keepalived_v: 1, - serv: $('#master-add option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); + $.ajax({ + url: "/app/install/keepalived/version/" + $('#master-add option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('error:') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if(data.indexOf('keepalived:') != '-1') { + } else if (data.indexOf('keepalived:') != '-1') { $('#cur_master_ver-add').text('Keepalived has not installed'); $('#add-vrrp').attr('title', 'Add a HA configuration'); } else { @@ -293,23 +279,21 @@ $( function() { $('#cur_master_ver-add').css('font-weight', 'bold'); } } - } ); + }); }); $( "#slave-add" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - get_keepalived_v: 1, - serv: $('#slave-add option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); + $.ajax({ + url: "/app/install/keepalived/version/" + $('#slave-add option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('error:') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if(data.indexOf('keepalived:') != '-1') { + } else if (data.indexOf('keepalived:') != '-1') { $('#cur_slave_ver-add').text('Keepalived has not installed'); $('#add-vrrp').attr('title', 'Add a HA configuration'); } else { @@ -317,7 +301,7 @@ $( function() { $('#cur_slave_ver-add').css('font-weight', 'bold'); } } - } ); + }); }); }); function add_master_addr(kp, router_id) { @@ -325,59 +309,59 @@ function add_master_addr(kp, router_id) { if ($('#add_return_to_master').is(':checked')) { return_to_master = '1'; } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/keepalived/add", data: { - masteradd: $('#master-add').val(), - slaveadd: $('#slave-add').val(), - interfaceadd: $("#interface-add").val(), - slave_interfaceadd: $("#slave_interface-add").val(), - vrrpipadd: $('#vrrp-ip-add').val(), + master: $('#master-add').val(), + slave: $('#slave-add').val(), + interface: $("#interface-add").val(), + slave_interface: $("#slave_interface-add").val(), + vrrpip: $('#vrrp-ip-add').val(), return_to_master: return_to_master, kp: kp, router_id: router_id, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('UNREACHABLE') != '-1' || data.indexOf('FAILED') != '-1') { var p_err = show_pretty_ansible_error(data); showProvisioningError(p_err + '<br><br>', '#creating-master-add', '#wait-mess-add', '#creating-error-add'); - } else if (data == '' ){ + } else if (data == '') { showProvisioningWarning('#creating-master-add', 'master Keepalived', '#creating-warning-add', '#wait_mess-add'); - } else if (data.indexOf('success') != '-1' ){ - showProvisioningProccess('<p>'+data+'</p>', '#creating-master-add', '50', '#creating-progress-add', '#created-mess-add', '#wait-mess-add'); + } else if (data.indexOf('success') != '-1') { + showProvisioningProccess('<p>' + data + '</p>', '#creating-master-add', '50', '#creating-progress-add', '#created-mess-add', '#wait-mess-add'); } } - } ); + }); } function add_slave_addr(kp, router_id) { - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/keepalived/add/slave", data: { - masteradd_slave: $('#master-add').val(), - slaveadd: $('#slave-add').val(), - interfaceadd: $("#interface-add").val(), - slave_interfaceadd: $("#slave_interface-add").val(), - vrrpipadd: $('#vrrp-ip-add').val(), + master: $('#master-add').val(), + slave: $('#slave-add').val(), + interface: $("#interface-add").val(), + slave_interface: $("#slave_interface-add").val(), + vrrpip: $('#vrrp-ip-add').val(), kp: kp, router_id: router_id, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('UNREACHABLE') != '-1' || data.indexOf('FAILED') != '-1') { var p_err = show_pretty_ansible_error(data); showProvisioningError(p_err + '<br><br>', '#creating-slave-add', '#wait-mess-add', '#creating-error-add'); - } else if (data == '' ){ + } else if (data == '') { showProvisioningWarning('#creating-slave-add', 'master Keepalived', '#creating-warning-add', '#wait_mess-add'); - } else if (data.indexOf('success') != '-1' ){ - showProvisioningProccess('<p>'+data+'</p>', '#creating-slave-add', '100', '#creating-progress-add', '#created-mess-add', '#wait-mess-add'); + } else if (data.indexOf('success') != '-1') { + showProvisioningProccess('<p>' + data + '</p>', '#creating-slave-add', '100', '#creating-progress-add', '#created-mess-add', '#wait-mess-add'); } } - } ); + }); } function create_master_keepalived(hap, nginx, syn_flood, router_id) { if (hap == '0' && nginx == '0') { @@ -404,7 +388,7 @@ function create_master_keepalived(hap, nginx, syn_flood, router_id) { return_to_master = '1'; } $.ajax( { - url: "options.py", + url: "/app/install/keepalived", data: { master: $('#master').val(), slave: $('#slave').val(), @@ -460,9 +444,9 @@ function create_slave_keepalived(hap, nginx, syn_flood, router_id) { nginx_docker = '1'; } $.ajax( { - url: "options.py", + url: "/app/install/keepalived/slave", data: { - master_slave: $('#master').val(), + master: $('#master').val(), slave: $('#slave').val(), interface: $("#interface").val(), slave_interface: $("#slave_interface").val(), @@ -511,25 +495,25 @@ function create_keep_alived_hap(nginx, server, docker) { var install_step = 'slave Haproxy'; } $(step_id).addClass('proccessing'); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/haproxy/master-slave", data: { - master_slave_hap: $('#master').val(), + master: $('#master').val(), slave: $('#slave').val(), server: server, docker: docker, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') { var p_err = show_pretty_ansible_error(data); showProvisioningError(p_err + '<br><br>', step_id, '#wait-mess', '#creating-error'); - } else if (data == '' ){ + } else if (data == '') { showProvisioningWarning(step_id, install_step, '#creating-warning', '#wait_mess'); - } else if (data.indexOf('success') != '-1' ){ - showProvisioningProccess('<br>'+data, step_id, progress_value, '#creating-progress', '#created-mess', '#wait-mess'); + } else if (data.indexOf('success') != '-1') { + showProvisioningProccess('<br>' + data, step_id, progress_value, '#creating-progress', '#created-mess', '#wait-mess'); } else { toastr.clear(); toastr.info(data); @@ -538,7 +522,7 @@ function create_keep_alived_hap(nginx, server, docker) { create_keep_alived_nginx(hap, server, docker) } } - } ); + }); } function create_keep_alived_nginx(hap, server, docker) { if (hap == '0') { @@ -554,31 +538,31 @@ function create_keep_alived_nginx(hap, server, docker) { var install_step = 'slave Nginx'; } $(step_id).addClass('proccessing'); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/nginx/master-slave", data: { - master_slave_nginx: $('#master').val(), + master: $('#master').val(), slave: $('#slave').val(), server: server, docker: docker, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') { var p_err = show_pretty_ansible_error(data); showProvisioningError(p_err + '<br><br>', step_id, '#wait-mess', '#creating-error'); - } else if (data == '' ){ + } else if (data == '') { showProvisioningWarning(step_id, install_step, '#creating-warning', '#wait_mess'); - } else if (data.indexOf('success') != '-1' ){ - showProvisioningProccess('<br>'+data, step_id, progress_value, '#creating-progress', '#created-mess', '#wait-mess'); + } else if (data.indexOf('success') != '-1') { + showProvisioningProccess('<br>' + data, step_id, progress_value, '#creating-progress', '#created-mess', '#wait-mess'); } else { toastr.clear(); toastr.info(data); } } - } ); + }); } function showProvisioningError(data, step_id, wait_mess, error_id) { $(wait_mess).hide(); diff --git a/inc/images/logo_logo.png b/inc/images/logo_logo.png deleted file mode 100644 index 749bc6f6dd0e823a0727ad6a7959691fb1d3b1dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18044 zcmeIabx>Tv^Dnw+a0wb*gIjQi#X<<~3BlcES=?EiB{;zs5;VANa3?^p06~HiG-wDC z^c}wUcYk%?t5>()|L;~o!8tS2-P2>;)1N-ES{f?&I8-<w5C~uOrJ@c9g!1?C7Yh@3 zGx}pS4)}xOrK17{Rgcr`0T0;jFO9uGAcFqKUzBt%0%{P50i>!ZujiY4u<Vn?VrRj2 zfBd$56Qa42m$>+@%7BZp$`j5IE=B~-!oxfga~Io`q<$inKtg%YMlTZ)GH7QN7}cOo zj-~Wo%ShFp%wRFM@0V1bt~cz)%I8y}ptRt-I|IWI*@-^1iG$a(nF}lT7jMsh+{6)v zSbfJJCMFgZR)T_<n3kxLL0YlCVhV`E}aLtz?<iliWJ2oqBg$Q(gJOpF1-&5Ma) z2N~@uDk`FMgV~sva6td3$^TAcq0c2j+Lc^5xZ*}%i{rv;wY+KdU}&S>=Gag4k?!v< z6ADPcawvtZIC@xRAky}WE@4D(XgHQ$<U4$evKZu0r?O&CADGSYeS7VDFa}3fmOO^B zwvuU9t>%NW$6`pqeb>bKU4!^u04bKD37LnX!c&PwV&$h2Db-<EGjHx|h>{8GCS#?v z!Xi|)dn4JcaBN-|qpIbKk7V?O#RK9Hkq>HPz7IH`z%vv#{lf@hN?>)RR5i?`$cS+q z1hZ8{&{Sk;jbyp2Ws%xgE9yf(VhF$@RQ32{aYDHnLTf86%c*;w65I5U{G-Ipvq!Ow zjP=m&MTg&&a_3rwXpL?iKi4G}fyYU~nL?C%_`H~7+5)K=|DfHgu~bY6aqb$z$==Ev z)o;G^^6&9!W6a%YUY8Ob4>(bL3P^3692Tp<6kl94`JGiJheNw3t!z!{HDU<gA~C1i zv7ZQPe59Dz4`!24CnEq@5X5npC@Mj7OI~nrW|5})_T(wn#F+Ce)-J}%?-Y9~=3601 zXhm5$=c9$LmFS?LW0+_PSExrCKm4hw7RC>8m-*f1V*Fe!m0x7!5=}ye$Xyi_NhKT( zixD`<OLCI~-TL`x?u<5VXUNZ~9cAkwCL9`|9t#NpK@9f=yF=Qz$s$bZ1$P`Jxf07e zH0ouRA4T{Tqoa(9=iT7a3`?9R0q+Otl9gxKa61}{68KMZv-%Bus3;i1;-^shwt}EV z1Lg=_wX$xYQjaP5mzu2J9*yKd8PRyP$uQhysLYjeqZ~H`N9ZkbKJ3|n_KVtXrpw9- z_gekeRy8?;&mk6h)8zfa{xMPm;8HnH6dD~*-)Gb8xGT(V<VqHsnOWVgtgz8#-p>%L zdS+r_d~yklaU{D{e3t#<`3&~g7|whmt6iu9a&b>y6b#h(M~9n-T8vIT5$BP>&bpvo zrct7ZL0GO}^t<1q>1SWZQmkzcxU^&khax}`^C$mi4$rIdP695!1SG4;@r5}CUmr;x z8E#(oVnW%PgFqM_1q{2rzV;MJ+2_a><+NlPDgK5{0t2X!g1<&409$^g3?+4}4gM4= z&_Zw6CT+AiXfwq42M|*@uaW;WjdJs23%LO?K|cAW*oL)7M_c62=BFs_wn}4t7`3_| zPeUm!KahaTjX2iXUdh7a+7H+jzk5V#s3X|9r8owWc^r8NP7`PH%`DFm<oCnvaG{xc zqupNt#YK^0mUv|AU*TYxW|d*{#i})f(j=1YGS*Xl&CX`^Z)@5%kv1B_ABb$0Y6wnV z5j3%oOZ)>wwzH)CnVxpQK4bl=_OzC=*Hi{Yo+k>X(P@QEA*+8aP@QI@f_T1#vj!}f zG0WVyf3!x;5vh-Z+Ofgz*_%QOLtQIN8M+$*(fp8T0(Q}V%Bu5M$zpLYjx%*>KPi#P zYGZawU$XB4QsRnRtg95!>sJqG(0#?lmDPcFZ@kPyO@L{9w~36U=elz@+Wv*8cRx`$ zXRlZzW59V%E}@zp9($7}zaUVil;wUBw1xG0<p%;}iAWVnEegNU&kz^R;0ZmBFJ|}p zsDT3PFdTzgy?rC^4=87fXx2Aw_KDNbOGmWbYbVRsfs%<?;st@26SOV%SGf-wD8Rr+ zWrJZh8l8X8&e=z3%5{M=quk<qZ@&U3UqkA{t(<rq&T+YJsue<4!CH|_cFP(1hl65B zdH=auUN*2(NEwF03OLc~t%$}(!s6-6RIYL*gn7s%{3=kNT$ZDm6vStT<FA>1DwzIN z#!)vpESTZ$QShRBOQgJ9FEXNl^KNMpmQ4WAS??Z*uzcSTUCyx;35)J0;>yd$0bZX* zzKBXF8-dF=nhVComZoU~(gXWhY3om(7r^=ip2%I~NbBBOTMsc*VB_ZPJHFDZ)&Gz} z8&T%k9LJFmUw=TU=w*q}T~31~4h>)(OX?INQGIn1JY$XiNRvy<j-^`S*|@5yqUZrr zQcwAxMS5T&OvAfQSJf&!la-_Uxe`WOS|dPYrypFZq=rpWWBvw;$28Fq?(i{^LlSe! zxNg!xn;Yp1eg@;RW@G%5&lNgmnGiqzp6{_BpCa{Z-=j1ZFN)%-!VN!u4KdnnH18{l zQFx^R#Vd;XS!~TeEYAE(kQ?&mJtvJ67qD6wQfwP2HzS;XaXr4I=x3qVF3vC@5;4_z z4ix$Wi*egUG0pwu@F-lKWmzV9Ad7t%E{_hJ^Jl-h2gn5&B{7rTq`02@?&SrB0Wa%S ztlv}Q&T2rw@<#KlI>2DnO_oE+*3H|pl4&Ep`at8JkzUDXvH*iTW=fh`i%v1aAd$xt zN`c|?jOB~a0!o?qM_6oMILW&Gx*kPLpIl9mMO6h;IY$guSS_j|gE>2IZ?Doz6fg)f z07HPH+!-0nzl84LWQk~bV{r0ng~=^=YrE5szI%c(q_pBKus%O;Wk7w+G8oEkZjx5p zpD1*YtH=g$S2smfq1U5c)}JJx&D@vx0TcQ>X##QLeVUz!bnVmPE@Z64b$ppaRZ_`0 zSjmZ5*{wa=a~~JmSXRWcFPrXCnKhVq6xT|hSw_wc$(}|Zq13*zC&*L9nB0qUcVUl= z2jdv*^R^~(rbJ<MOWo7^E#l)IM!~#GgQVYKTa;8-E$O(=phI)WFXmZEDg5XIU+M94 z#~B?dQ+U%9!ORiUxu$wz5~Wr`SfBNoki6Dw;J$&l_pl>(GC41vh()^kNxJ%4^6vAY zE`vJZ1U)7(6XJP`#d*t&_Z~YT!}m4<W5Dt>+7+sl*Y0jC`wEv&!J^nz#1e&pky6~X zyp{+qJtZsN526Myy=$Mp>B(k4!32dyt*5{ZM^I(?vgh6ApiPXdukm704UhtSn@{tA z!EIRV*>QRccMoe~N|;mWLvrpH@|i@H2+d)&n`Wp~7}25JD?EAsqImwD&Z%{IoE_(u zaSL9s@#_X)KQP*bXlxdJoAQe%0*S=1uMi2k8}|?Xd5IyX4dpi5<L6$oH$n<v|Ej_= z9k2AQwYGSB{*6%5L3<#E-Qt;DyDnPY<X$c`qWG*3_Y2NZ?4Wx9o)K{sLrmuP4x%~d zr6t$RZK(NTf~AxEKoYJEjYmaI@PtM(uoxA9hM((;;uvAfjfMUSdP8H%lsT5q!JIX{ z+{&32>xoe?Q79G-@8GHZN{^<RQbPRG5+#gxt}mgAj>Oy$i3lCao=^kyqJ|}wk0m7f z=tuB9-?us8&@q&5rka)}ZIXf*RQh@*U&fmC4}o;=^ntSn6F1NF)2}B8_2bYo+q%2( zN}C~s#NI5r45gsE)6cr}Ina^SaZ{P?<_{=!OEX%8A4S^>)sL^=LAi0n$R*^5>B2-B z(BeLzfD&2?p5#QFm9*&So(z8s<FX_GRrm0Xj`(78ZL%h0famj6EsOezCH*2`E4?#I z#AVYpWdE?=N(8X57Wwb$p$7{->pgcN5Tm+G>U@b2l#Km4-TPqtxq!)9q<94%xj(K> zy-J~`TSVFR_*H|>N9s*RQz~a=V#brxW~`%^^OI!cU(CFtE0L^HFg>NA>eo*rxS<s! zKs(}ep}(hQV2*+SjyY*sHR`OGeR=ON!odySfHqjx;Lv!sl1f=zj(_QUVPR*@mWFwU zDWl!0?k0qK2Odw8-48b}Qd&M%5_}w`^AiJRI3c8USLl~(I2bn*m<ThHuu~nZ2~8g+ zv#p;mc<{``QA)R;AQIieYIjz6Tv}a>(Vl8c|HY;)a3!>|qNbO|jbly5S?RPSZTpUW z@QTgCi;j7W1XsE+Qa@az6T{J>cDrC<YUR*^sp1I+Dt!#g$@n-9lL^uD_q?tXmfr25 zJEal=rZ}T;1@%Z6ot&dTePekQk;dVrE)P$Xg0_strrk~@<E?8nd{+BNogU&bHuyVJ zV?$0P%1|e-R%|HQu^UWCWI={VltO8el0Gh=Jv3UE2bhs{4_T=$Etp0j{+Rl485gjd z8#gAHX+W*&oxj2rWQM?mSfBV&gCK&D4Yi`TnIwna8j9z&Z+5So4Jo<AIo*r}#s+DF zHs>=Ft$stI55#_1asLHrv6)5XFMe4oXh~oh#BYMf+Sf(mwhJyr5&C$YkxJMqFeQCj z#|ai+7_hP4`)ss3_N`iu-tVcSL!fr_hd7THxdn|1eRdL7$d8G|o)Y@s%QkpMhiawM z`>TcM1wQH4P3EMrYxYnE)AaK4T^mI&rg*<pJa><v>MQks#{$U^&-?j__8E74+R0yQ z(O2X()l&l8f1iIWxs)&P?c^QugvBij$WSroxQ8VTJiSUk8VHdq{xL}_a{9x@YF=t# z4Bre3RQQ!Z?rdF-KA_drh5+=%$ZZ*}gj=l8Lm^?bEff;9zlN{IcG7zB`GEZw8Vy1e zcP>ic3M&mmDn%qGS!6sr-JyK)WZ;PCnu*)%4N^_w#V(Hi$&4bQNj3jmy%^XHvl)AH zH^`gM3nWIAICqz&mowUk)wx(&%%_tMSWu6HAbOc7Ph6k+o|_v|Kw?0QV7>&GZ~qQ< zRuSO0Jz+}3^MP4jO@AWT$mWs6!FUNw<rZFg7?ap*HzjTeJ&7$jqEFW3#8SX(c*tK$ zoOkS~FInVvF@+NXb8FQLacPCM86?PUz3kYkoeX-V_Z^G&F1B<hE5_3sseH4nNWHS! z2ebV8mUyg3(tto=D|#@a7ktV1NhnO~K~q|GBH8}inb)LK=RENc^`i0i3?<`ik2F`b zA8Q#5pr_0M@1_jwKRZLlh28TX7l?+thds>F_HDT=8NsO3bWLtY_8BR0TAZ9P09mzh znE9jVoW6efriFUDbkq?8>g;5R!!61k*7(!zbk2{L{)r9(C_yW(m_LeIcN_E`w@LWG zr0RfcS^G22TqmD&vf)Zo+<z+3YrP@?h`H>Fm-e-X95r<v!7aT3JNN#yTEDOTmd>0T zGOXxV!Fc&iQ<Q3Bal-Uk$B>k|h}-K=flt-8;+H~8gc=K{LnJ0$isunCvFq23^a&Q` zc~YwnsUdfO(DvNt-4=*Z9Uh@yQ;iLEO=8^DEL*WjO-k-wDV1Hx4;@}xL<PEpl;o}G zy#mDhU1p2_)R{RCm*g)>USb^|nSaprnj~GTChIeKE+S{No4CC=c|-r#S$ytI+TWN) zuP3u)QDF~@eWJ>aycV+qZ!;1V+&|3AnIlBA1g<F495o!HXmC5Ke>hOxmqj1P%;csh zleO@EcuyO#9|~KMTkMb58riJ3Vi<jP<V`|>(>Y(v_|X%hF;>Z^(?j--V?n?^*=QHP z2-x>OU4Dh5fU>5LznnU5^))H6^Cr%9&VIiCYUSO|E{Vy5irayr$ck?TX*i&)$$o*i zK#aQHaHyR-q`$^4=eqkrxvggo(qM@QcrErkVSNZ?PPU<7n(ASZ;<t1izw4`$#H8?@ zj1_EN;-4R{#*YMC{yxLv;*%V#q!|e9b1^2j=_uJKeiztRY#z5K;(C+^n1tk^up>s+ z0CY!-m(T=VF)Frxo+w82`;XBr-0buIePkxz^8xE@I~I0CY>{55>6}cvi3cA6n<dD; zjG98+>|9_c8=B4~E2+F(@qZ>1!VO8<WzJ!wc{mJnshgxYxTp>LO~UQvNGp2&T7L7D zr+NhJ2!*F<j$$IGAo0^lO(5e2>QxmlFP%aaYxPg$XF(oG%-NXZBk$**QD=s$>aB89 zd9DmQiMr<Kl(OQ7v~b@Pd@bgClR+Ed*zI#EF|AS%6&k`f+G^71w^EJ0hipwuD%1Ym z+U%4q*&vKU?oV63z^wJ^-jrkk1vjWOxHO*Yx3*KfJpr%7&L^KPE5uy93pgjx6dETk z-u_F5uPZ%<0rBrL4p+O_`So@(|E=g$rfDC*Xo{^My7ulNCc01UNcgud+0w%J3pR=M z?CNI=#P;Oee<g_0pOq~z*IUgfBHIZKDm7cqh-HgX&m+}yhwx1T<3*qRmZJ{QfJSDQ zucdryLNb1|vU+{AyX1+kQv#2xD%!`=qd}RT)oLQmsz#kAug%kyO{K1g$g*XuHYA>Q z?)S#U&Lg=l3+Da(+M<joZ0nC>!D{U!g(?T0JdfrmTw8F!7BROWDyd%>Mju=Omm3k{ ze>as}5&6Et@oV<^TT79OH!ms4{d>v&Dvj)J;Fvec5zqDvUeG{4KCLgFbTHbD|ELbk zz~1&UnZ@(58W~E$;=WDkaUK=(&!mI)90|joSRX2m_Ws2+M_H=&8F3`gmb2hl6tkIh z<9L&DE%ot3FkG!U6p_=@G^BVG&tHhWPb_vmtF9^lgp?nn3Dp@Jh70gjj1pfv_o5<) zio>F}KxhM$n12KkGVtU!m?KLnEs<&6{7>h@@s0LrdeX<Okc+|S%~*_;JSrmXn4g+) z8J_<Bw8awgopdb)E@Yau@kCD60>Kw9(xeWJ^wTxkZMfES(N=7{Uh&H3{4JKHW?oAP z+nP3e$g0OAWTziOTO6tzTnNiKpx@j+kVQ4_rXjG<>OxOVR%ag+1+z?K(q;y(-8Q3M z*gpNLZ_FIbD07>rsu5rc;_0BzCiKzGQR7&QcxcOJu5M5*LtQ-*ESz&t`rH$U-d6AO zQa{_PIj}}BrtNdrknnh4X<$b<KW3Af0C5N2r)sCd$Tn71mIX{)3n}R-W=TxiA+Q<4 z<_Te;5$l4$cGc6P!ImE;43bfNck(LeEzLZ^@E&u<a6{XauWwgYDBRM>#^sk>g77mX zGz-orqSMbQ<5pt8H|az!T-3R6>i~EA@*OX^G7;{-81_G=#6k1^G^<h%Itv1UrRv02 zb6XOPN=rZT*<mN16|{os*JB!&soobN?LY5ven?18{FBzT6o)Ijfkiy<6>nNGOPGzt zUR@Hd+!}#wY@-jba7*-Zjw`^-f&6q~&&i?3?Ur2g64PPDU&_Aux#mlLbnVTY4e7DD zAVCgYb7r*O*#&C0NG2Th`h@lR2nha&MyqQnob=*SM7{%CI!30~y-4v-FNV;sVFl%< z-GUO5*=&Z4(vClO(R~@fQ$kZlb`u*zHuS{=H}#ATLBnoCrjU%_$LL~f#yZPzU^ zjFLN-^pn+n_BXV(0o8wGXoP80_U^lhucaKyrR$lw-$dImm!8(#M_vwCVO5^}g!DFI z<mc=Ux(gg=bB2(B^7U3>hG}n4hxd;+1MM!@WPZGzu(+G?`l{|@9&)Ar^1Ktpv9U$K zV%Uqz$_7|>e&fEG6-`lO@hsmGj$2f!l-dSpQ#GJ=KW}+;)YBDw?X4X~GyV;~D54Ir z2_%u73a%<ScJtCj*8hFCH1&Y}S?r3H!K-^Sa)zCHG22NU&R~g{h>&P_3yo}jX=K84 z6gldRwyb=3IZn7!boI}kFpgY>i7i0xX5y*<5h90OmmOjo<c;e}|4;h!@`IoG_7cfq znfPayQH82$=7L6k?!Rvqp3f{<EO6{I*?Q0(ldL?e3{t-S@d4`mVIN#**U8fx?7`Y; zeM|p3zSHk+$uU6EmHvT-cmCmtdx_D(*el&o@6+%DN}fcRDKn1`Iuk?X=Yena2Uwj% zWZj=m7hPqggjW)SK8Pfd2zLqC@N}BrauLL-pWQEPUC6Xs{P8lXdx&TMs3P@J#q{U< ztblM9zi5CGYmgSu!PpPCr1+pq#UlP~q@w*I4jtXzfV;r=LcOsXhLkI=%^Y9(py}}7 z;Ep@g6_IP|U8xh{Z`Oj|8Y-r7zeRw<XF=c%Ic^7L?>Df3o%K*zjuxz-2xaZu3lDjg z5v8K+p99@9C`Ug@y3Ra#f1Qj$Z<%^dxgvZ^97*sXS@C>M)1KVv=bw7!Ms9L{{F%SO z3&i`c#K>3<f8@7&CYM+_>@KCQ$7RF~DF>i61Xgli?ich1EwWK~Cs1>)4kSj)V7puq zH(rf4b9{~?Ltx)44R?cU!m{zlw=PIB4BrG;E(L7t<l`CEkx7ZPqARJnm=~?Jn%$t& z&8>8lS@pjk7+a{>j0@^QAr5U~2!Bo1UE!+@O~~j67ewgLgt>=bE<xSCG#z`rqm#Ya zZQsX|5@|;F%kX=5*LD%@YwCAalr+5uUu&+LVDS5Ew)V#XfAtN?rj5@tqg^kp1{E8X z6GfFz-m>yt95gaJ<mH-hA7-mR&%F2o6&`SDba=~0>#Et8<3|bZMV4Ok)3M@buf)V6 z$Ip4G5@9k=SVOikN#%(I-(HgZ<w<Tx>TJ>QF|YqNyDG&T+BJKRnQH0xj$m#NzH!dn z6`}ahHM`}jXU1h&C29X229v@4B!;uj?fitd3)k?w{j47sh04UO<l%%$9Upb(`;sQo zG?vbi2mIGF$HQS<@vD6U0U^|1@qZj<HTrTD2TC;qE?<LIeGg3@T4=5MXU->XuH7cC zFThykrNJq~SrW~!eN<n~_z$KDU-{f!{`UW7+Ctw#ct_6EM>uniY;<2na57QxwTV8( z4I+26kb|OYR`E2gu-5%7vRk1Kv8|_u@{^-DQ%#ilY}#x!x6)s>9>`jbg~?)mgDfYh zpS5s~oTE|2!h#82v0_*}33%@7R(DRGwLmKA-GB1uwIo}Q>K~rXv#*5>M?=yRi&2$? z4<bah=gir}$Hk)LxOX&Z;FGx&czTJAihY@SD?ICZQ7f>Bv^QVqIA>Hx?&)gz*{4gA z4Oh&Tq<a}KGhu*dV1>FHvRBELD&~=?hY=KgqTGO3t)j}S>L2`TIrAw+i6jHMk4EYq z>v`flVrh5b)a~o7^ff^cMn#|951YMsPr))}3q(Ppl{^Q0RAY+hH%^t8s`I9*=EuX) z!Q?7WV?)`i<_lxZq!7eEQUm&1RFj-bFB>DO?c)w@qg^{h+MD8UDCWj>!qA2nk=^wt zbvHXD#pVH=9OA@z?+r3GEY1z3rH6pcL4@v##=Lp(_p;_S6X0Rt;NEekegAlXg`dj( zx{!=l!pyZD`Xxw(6MJ-BZB>)*`vWuQ2~@j4=8{N+_Fkb-YHQDLS5IJB*@ST0pDwu1 zr>TKx>jwv9fYU-j;A*1Sj93Ed*I~^ypBbyFp-{?&z)!NrU3F|S$U9=Mmbea(lezM; zzKsm{D2n;W+0$w4zLSCecJw_3-KvR;T}2+rdf>kHxdOW-Tz&s{;h6gRVvj8Pi)blX z3fgI#+DYm#STL1^E$WxHMd#K(B=yX`uHN&?Q#u~})PRRKj^Hl3`f!1W%H@iqai#f( zr|9UTFg~~6Dh_tTBENP>BX932(f@ArY;A)7w>MeT#)dgBfji{LsY`1$iHWK~Bou|D zB{7KndIlF?+>Fafl-u5!dg9bDkZQ^@^QR_KEGLz=N6?VID<oKKNXh!Pn%mOXAn2{a zgx~Zp3WR#+{G?ZN(KwOHo~ae0K)G?(ibu_>r{kbg-jH7_rqKFqYXvV~Yjyg>YeniD zgT4G6zN{P9-U}o$Y3_=^hw9V!>>P>RPafP2;r~31D%!-d&V%d8W``o{sh*^(<I5i7 zTZQ0Q6NuclS22}0Om>ie^ErXla}hy*^M<?I_$veJq@T>Z-K6WTWjLTqk1Ak+76i#c z2LC#f<DGBg9!U{GmC_z!Guma-e)HG!23xv3xU61b##oV<lE=d~pkbk+Q+~v+k9}i* zeWHg4t|}h#-aE=@_pvV@_4!%~3g2KjbE5yIUxu~DG3VmVL2#I2J2o6ScHnKsCITmZ z-FQce+Qu8%(wCxB;dPUm24kZd49ggM=2cc*ucyAO`lb3C2Xr)gwX~5Kh5U;DK2EQv zs*!L;ihE~08-9TPeZWh>9(OW&_m%!m@s7G<CemR4pP^Vl-QUU8mt#aiE+*5<y4-(L z*~wLQd%fLVo^wemFJt|DPa8&V4>nFr*iFf{DE=o_)JF)^X3<WB9kG&Mt132mUtkuD zjm$7aa!D!$Va3B%zFn|;s_cQ>T`uSm-wxi>G80*H;x4NJq_J{f1fc8>J?SuWsm?hR znd%?kE;tN_;UEyw^){Xe21GToP1900fS8$V*yV)gY3p$Dqe;@QZ*ju9G85I0QO^tl zf!Q}V5Pb3;5$B{YiwAs%mvsYMBsDz5ZvI&N`(b91XW#gICopw&gWioOFA$r~ZsHZ) z?Y7tq**h}MZawFr+o-vSBsXO|G7(Y7AA#4h)AI7QJn4xvVwCKy6iGjhkmyi{CY0E+ z^T*Lv{!c7G`@s<z`L#zl^IyTp_)Q}-*OidK!}bt5EN08R1FTY{<3<Q-`j4gbIy!J1 zvn1FY7@k^W)9QkWv^a}oZ@70T?g)BM+HNZCI;r-rTHCeCdMhEGJlN4QfG7>3;2pPY zg7?;T?$@UtkOks00-X_^1>$k{{3iUV^@0)jR2mr2AQ$&v!&4<FuV?~&GOdL?UQebE z(Z^avXk<gH$c?6)g&rWam3!pTv(C*tqW3Vpb|PMljkrKnXo8<^kFZ$;1FOG{idgAc zwC`R}CmzhL+0+6-ztb9+JZ3w6wO&#&R6Cjp)k;&!Il$U!{Js$J^&|q2l1yLdSn+Mw zX4{I#n4ZB4dt1zwkJ)yKK6!kH-DOv|r+vTcA3!ZajFQUJlfYOA2F?YLsqA`*hirg) zHN0-EX2ijS2^BG4;rylN5g|O1;OWVTdhJNU(|5<{h!KsofH>Wr-=(&Id4jF7+oSCe z4mNW*mbX9f0OmsYNWgCXI>5QQ7hE$?|3P6__^vCzX)J&}Y+Y#h=S<0rC_=)-!;_av zWjEge9>S5>P3*58>9na{j8<>;t$bvN2#q;%n|+wlGX`&!PcrJ*<G#)ZSfD2#wz8Gt zHjx6G$IE+wbz^R?aVGV`&-gxo$oA|tU3w4H@835r=Q<KGa6u;S&?TeAzsut0VW1~O z*`<@-S-VvC@B_+DTaVrfyQ>`O@hz+%Q_{8sNwy)IA+b^`X2?VETH&Hnaw@HbDKCdC zR@3B?B$@y4x~$qn?SKYgyRSUm>qEA$O(fTHg>t(6zyLpaZljXbVpIHJ2t{A@d{iX& zUlLLUXm|<a-#jl1ZAfQA+$%3vPKDBa_Z+vWjI+wOg|>uW;p=Mc(MLcjiQ1Z@#R745 zisSal#d`47scM=KGQyMyA_l~lxnHjK69NX$Cr+m!!P~L?Zm?PH%U~j(k9VTKrFq1_ zgy9-3;<!OU=i=;Nf*<`J%hQVzL!;fHFL7OS@fU5go07HF2Q}&xFI>H(x?VTDJ)%pa zwdnC@J4&bR@fi_u8sY+|_Rkj8GYj#oOCY`NMJ<~{sypl=9}F9dzwmhH_@uQ>1)>(s z<Qh`8>v)KPFM)%RrF#28xcKgM)wcUwOvp;0VDGPHq`GTjgDx~u={Mab`<*o_d{Vk^ z^<bEEMaAs1Z!o&s#V{r>Zz!H!t7udDIAD;HA9`=8g#H0Sd!5=F(vXSTNzIL20pQxl zV)mD*N&e-~-ER+48<j#OqhsfES_JO~$x<vn=rw#?dSLZPbxEu304vO6YZCgIceE>7 z`gyk9f|kTI>$ojo>TZPh_SG|Af%A*KG=b$@!e-5eg}43&Y30uLG-E0K*Pzx0YOT5> ztc_m#m(5UFJWI*i_(2M-LTm1)Q8<x3u-%C<lKV?@7-0Jl(uQ)@X{)cB7pXR{e$;h= z<Y&?%sxv;)rP9i`=9UltkLpOOW5nFsGND8te8N}nR9)q;2ia?8KUZKnDF)R2!<{dA zAUAjX*gi(wnrXCK>VdbSQqyAXN_3f!_);>Y>+4y4Kq~Pp&9%D`G@(_nBp;y737_l$ zw$enWllnFa;IilR!b7~xHr?DxNAF{94!QCeT@R<wF^<Phy~w5D0`bQYeR1&RQ`|ct z*D_!Xy5C56f!uP(Uy5HcGVZiD@~eFV97JDBSOcML=fCENs^|)4Ef3^$_J71-0?N=A z{Ycu}f4**A-;oZd;lA=ZhDxOCWcR+1Mt;hC*|cqQx%Z-_?1Bp5pi!m<aCj@*NiAAZ zk1t)y6RN;8H|h1gx9r265i!ouh+}1(<}jRLpm7*{2{eFI5DdK>(IEDvNIdLUFCR3; zTxF|YI}j@n#MNquu2nvp$OoM_FNuRne<f`tQ*+pOs;Je}O-}S;`;5XTpNhZ_d&lr; z%IzX!i*Z!;f=fQZT?Xql(9h_uv8O(mjld_}r^x_q4T5E<$^H9G#F|N3gllKahy~X$ zon>s&5jGcA#_c$?B?m(JZ$1zXrZhKk{zO&cz1bHhzc!wq`UH4MY3Ejwrx&NEfOW*i zePBox@R09V{0WK%`k@>V@NgSRHg3vp`&-ISz<66DBe5GSi#zwSTi>^<G&y6OruPXZ zL7#g^L2Re`>*A4|y?e{_!jhzSwz9IMOE)`gy5D==V7rNsaQ}@mM-)Vmm@!I%M`Otb zPwtrmlK=WDWX8GIqE(4<3{N!f(Gm^Gesdv`WG!__fcJ_l5L4Oa!d8g5|9ZJwj#{hO zt17c5nu*uba&cyq?krS&Ovb$mTC`>SCe-*%2GspM3r6|IYGb2fBpz7Jk$dc4-G}G? z!<5zrF<NA#)V{Sliex!n=5?qB<r_Sgl9ZVp#3)Q^7m;@ka(-o+g{g*|)_PT3Z{_RS z`1NOIVlP;hVm8zY@>OH1K2mqUJL0X!O@a?eG=N_T_`>p8@A}uM*0(tWf_C;sGt2D3 zX~CXgDMHY5PT~dPH<*BjqS3Aijm+@5zv68VS;KnTEP6R>Mn276xIbLy04);wx9_zB zDs;f%C4bBM+_4?r3tb?V64l<odNkY{YBzU=;c}o2n0EWkq=<>$=Lfh$hWlySiyrag z#BDu`g#1?Y{Xy&B(i+GLsslp)g^DQW^venAM<-2m3BxcR2+4y;+ajrN%zA$gvN7&2 zb?O!+P$;^KqMb4a0oTKoz9VzIaWu(k%K2G2Fdh6OmxB91JwV`Iz)j6tV+Z^ITY|Md zl}pQVhq-g)O&T{mCh%R7s$J>FO9dXh{6E4JoFe6XFJG}3yUIaPC-BID`}Ic`ce)uc zI3?7}q#{~qgR$rAaJ;3D_y)wjw-+2$y`mcI&k*cvZ!V5Q{`AjWLSfLu+XhQ~sfc>5 zpGjN%sdjQ_EmC4_*QMTS(jn4m-JAL6NhbmYqW4?yO$)|}mkp&-MyqHAMr0Jd<Zt?S zBtMte`0tbX2}j{;vG=HMh9XqJt$_wLU)zoTTUV@OiQA_uVtL`Hb-SDCutb$~?W~hv z>_vl(H)NC%Nx2@YG$0}U9{rK&r#k->TKrxDb~4S@-B}cHJKVh<1TiCl!_J;xtT9J7 zZx(HAP!tcxaMBqnTX-D>yu%t&wBIFW|FPhfY_gQEjJ3kU^vkEi^@R6JsXD&+xT~8O zaPvS@Osf$S|LrQzcH7<R!Jys8-hC=_olWuCL>#tjQ>zgiBWSnI*oVCBIn}LQ-40WI zPwT--K@za+Q;c?n>m_(oXu}-S0RMUG#jQ4L5?h+Uyz@DR$027zPk}rTXceDR{My4> zB>Y3DAkly(_a-O%>$=o&!6<NBk(_FTYbb0zR7jN<`0TzF;@UG&O~`>ERRKVLq|g7= zjbh=;pniIBv$8$sgL#=;^^d=z$GESvi%4m~w&`p4>b2B-?0G%&q?Cg#L1w~H_YlEh zcjDe{_~37nqJ-#l3(~bi0(W`FZ%cK_Up{1?1-N}LaF%0wz<t{ga^mp(iC6m)FD`Bn z-RBE@fCy^&EDbN!GCYZH37(_7;FmP7+uM(}PxSn)?;iu6$IHO`f^q+e+er0y4lDvb zdoAH*WC`gwXZq<*Eo#7&B9z9I>;yw`-k?`y55a)FsxIQEyP5><KvmE;)38L9G>Zd@ zsxP3C1Cw2nx8?~_*y}$;7*8`OkMjzMe8N43gUm#LT}N%x3**eX#SBYWmIa8oq&Sk* zT0q!-XhwQ8I^pL#X%-cZ-~IbR)=e%DYta%)oogCdD8f)R@xhp~SQA|Sap!(zGec4R z^U(O0t~w=_JnYAl7K^P<bpTwz#<uum$X?cl(9Y2`?%m*GthA9N%14sQ+N$CwH^p9N zFKC`BEtTS}VftWav{ki*MrBK*2L<A4ZI<0e{*(;wBD@Mz)CzS<XKbuJV8?}uQ7FtB z-)?9$y0`!81Q}dDUm*U9cDR7DwD|B;#^0X8HAj`%aU!_5gPZ0S{A|G1hUSw&4!_}8 zALaG4zjbyy@3v##CsNN0N#p$J=NywRF!zbd{Asg^6@-#|#femYS`-y4I}->Ij5yzX zmMdG$lxG5`9d<p4&kOhk(fcLvk<`8XXKbQtJ+Ip2bvmwG&H_r%emVyI=8tM~o+2H- zxDVmfzf)<g<l);zCeOy7T#44o%~q>fB)9_687UU?VrIe6w=d9;s`$*bZ^M~g^5!#Q z*8U2Vvzj=QO^dDB0@Pu`u2M!#N2rcR3^U~}TI2O}0af7a_#9#Q_=K_%tmK`uuibMF zNz^b{r@6*YKlc*Tu*X0G7{74d24Z_N_2F=ctdBG9)D&-^t+t8>o^Y|4SD9OTl0Z2` z;Ded7MDSUe#*$8O?+)1DZIgf=Xipd0dwuz0hh@QiizffRT;mHzCg1*q7vzZI_N@_m zr4va)-H&C~3VrPPm@Sn$M%g%gtI%ghik#oW5ca4ymW-r&0AO~&Rv;{M$-#sn1=+36 z^h;zajjRoa#|z}>&(|+5qW__$Y<pwu8qHhWfC#%(yyb8?d3$$>4~Vg>vHa-%urjFa zA1^o}Xrz<hlS1mw3gSvreEvN)*`E4BiP=}Fpa+`V3t$@YT_ye3reUHcay)RkVY;Xk z`m%q1f8KO>42NZ`=)3U7=>ksF3fvQN#C4lv!~*}m2YJI9QT+<@ox|EwQ1eQZP8q%* za~y;{@|iR|awQ^iF)HgIBpi<MNeDBUKI{!;sAam8xcUq36U=jYO*k!S#m_)kXDTpF zfv8GKsu7xG#}h|!F((1tAYk2Y06(CN{J-9Y_O%MCNPp_cDFU`7Y_=ubvQ|4|6VNNx zAZHd+N|+AK>46DbfYW8K-9Ss6Ej5CEd_YX%^4Y!1OxSDy&kPD&#y&XGNuEm+tu%-d zlE7lZjH03mLZF-Qpv=Ye%{rQO4|;QB2|gL%l@mCV6UNmZQ{Yesi`jNO)O>SvSQ<RX zv1^|A^Z{qtGt^M$@bP>w+Vx(GYBOgYkIs;02ZHjUmbM^4ufd}FYOOUYRk_^e#2S!> z)bX$0aLaARKs|!v<J%7hSn7xmykCw-8jE{*bb^2zYc_)kGOaTe#$58Z0tr;gNCL&w zs^?G}O)95aO~5ZLY#S4>s5LL2&vQ+sjTjH7uiIC`@7eD(f#NW&Vma_0#V!HY4b$$~ z*2M*xb`sVqg<j@}x#Z<wMw*BQnOM-;IO~&1Ox`3DuA9GaIb?*i2`p-ffWYc_7|hh} zM~ah;3PXykcYXNWnLv}DLlp6Kye>`N%`@DNalofGqNRR><0<Q6$Yk6mA5f|f5wA#B z8xh{T@UX79AD`bh+NG=YuMW35NhWYq_c=dQW&`kh_7c?_tM%Uugq_tqAV)qxWL7V8 z8OQKsPOWO|_Ts6lE?qKhF^70u$T31zatgoAxFy_)(U~R*sf-Gpm<8Z@!mnpQGAUP` z0K-w8je6$X*$cg=9MfHfguBAr5JKZaif(un5Ckt{lxh8o%_6`ID4-tlApKKXcdCvn z4=8c$2VZ8*`k<MlC;4gBE;m}EQiT6*;)^Q&S1HD$vi2dC4v3A@0n&S=6IG150h;|P zsJ6koLUJt%c+dHjgVriy13x|x{Nj0#eWg-kfe;NPIZ|%Aqyi9^`{P;|GE>7h+vjUk z_g|uA-Y2bTjhoT)+q-iA#jN`&+U@!l2(@XyyW9U`HyJVL+(QLnT4I$%1u^JPoqn@! zIiPF=0W~Wwmiu?6Irv?VsRus!nnDxgzT$+W`3)GHupH-z@{s#SeBfHeGsFh$s77|D zMK0gc`*#ZhsLaI|kJmoFp6yRqS47?3aQ{`-#n0Ngd$Pb0L;hKCV=Xn-Z4^$-ZfsM2 zfaPn^N-|CM!0W2uWrYCzT!AdERVDzm*{+1YrYpUwMC!Mojryr@l;<z=7j^<$aqQ}a zx=B_KCTaf6E>i%WneD)NLalbZBXLN_uh8**T-sRVWGPMdXnlI4c9PZ8a@68t8K9@F zF4KBz{J9rE>7tfXy<ysFchK##vho~PKOX{Tesg$>@3oish>_h_;A-|%Zi`lIKUGuQ zso<o0wihv~ZiouR=Fv1Pc`DSZfsxq#ywYO%q*^;ag_gP2R*~MMs_wF8G$Z^;^vzoB zH#8XRhy>~>UD2_Wmw3C?!PUHpxg`KFb^)8MPM+!0hTTME^m!;LOsK6`A#P%Tg-{`F z2q0+DLB2zO?vUF5U<Z_8nZi^p;U5oCW$BE@JI2snrP79K*!Y;BqhKul!mTgX!VNf% zJLEpY<WQLtIWV~-_#8Tr><8RU1%2H|5>;#c2aW)HGZ}5@Ixri4`HgzO_3iTev)jTD zj0%ELsjo)6GBzz{AS{%iTX6t!u7uP&9ZuI=^WFgP=WhlRj4*xMyCSwgvUJuTT2RSb zlNN^0L$we|(#*gvl8Zp?YCf>Y<%15xzw0O`%=!5TjuIn%%*FW{TCm7lCl+Fx+-Hdr zELJ91+#2@?f;)~&jl!7giyL!a|FxWeyGY;!OCj+@M%!)NGXh8e&&8s;RTqkfQ`l*Q zQE+r4n(>7t{R$(WM$}N><G9;%zWv*Zj?u0<;O`ZCu1Kzhzopg*a<-pX_i5{lC3p=8 zkunkk?*HB8vJU|6&=f|I_OEd*5u(I^4`$*+Xu`uOi6i{wJXR`L@KlpuE1C9_4eeA- z#f`v|Kg73z)*SO&Rk5%YYZKvwk?gkh$hJo~xwq3XR&eDVb-h(%`(E>PHQpBh>?N2Q zXl8GdOFEYjiQ_e!H#wLO%aCS~#1~G!<XweR>uc2hMXNmf(@HbcNamb>FsR6(m$|8Z z28bfyw1@Ama5%~KZ;5}bTF`P+_FO77U5r~22Zd6LFT8SyA}AM-J(Wb7-8lEH0{7n% zJ7BEYnrW`T>S}#!1W;@WnNYh^#BLXJLdpR<WXT?K+QxM>I#}o3T1?=;&Th1e0_^Bn zI~}x(ztkpm+5kj<!K7Z8&&6T?*vJIXqiNFAOr9${V3wL`cw2lXt+ryqK_&MOHIg>$ zjjf3kX?+%_pGF(a@+ME{bm~{qBurpIdsk@MQhc)6QC?QkB*A>tnu0U1Gj}{3M#r!5 zkzzZ$4WZeICEQ^KrE%m}*LR=$o`+Pw`v6Es5N%mga5-T_aPs{%8^Mkx9ZON6IpRsO zmiA!>IW&;$@01;b^NOSk2DQX1U$c#&UC$vvLSxcaw-0ldni=>~k_(AUY@JgyK(DqH zZ?ufh2zGVfioYSOy{JtL@XsHzvBX6d#dP6wP@pE~XLrs)!w$=#2V;$XxpCouc#t@_ z<8f2%q9}l0!G1*VFjbJKV;t>@hl^4X%13iZ63m(x9yVupx|I<PHtRj9*Y8x)J-l*s zAg)f9^Zs{OtCl)B*diyOThBbjWU`Rg`)(?FG7Nh`+n(-Q^#Z-2nxRm;&~$9<3yN68 zKPyBFCEItjv-TGGF<O|!`HM71Qz%Pz^sFk$v8qgX`WjBym~D**$&%KM@xy0ewq@*h zCre#A6vBX(>}`iq^DaB`YL8db_`TcDX@h^zHo5y;o*_vmM&V#wq3@>#x%aikv&8c` z>gI0GQAU%W#-m2URyF{~q4ud00GpCiKa8jy1w>U{1QV=$Z=e?CN*aNK<M~-L6d<OM zkvRfutNCPCm4R(KV?BCq2r4P9!Oo{z2|j5khfD{>D+e8DMMiT)RruRfNsp#_V<>4w zM2Cw{*L4@+PVs!62GbC>o1R^u(iDe=Nu1#~p&!43qxK*uHaUE$%3mr1s9IF=dtUXZ z>xF-u2@t$)5I7iN(W<>Vj&1KTB+pB?YV6x@M-L&pA<A!Y>lOTfFP5@%R%`k)(!^v= zJT&KT=_K4?!J}+Ee`+Q6$<UA5uftw}uqpBL_{4dx>OtZCX=KTnLjvS;@Ah}^`RskA z*y0PNHl$$mZ>ygk<-YPz(m#`Tiy_t@bQMnYl^d=<+*cwer3}PI`#~$zwA}&4-Ox+U zcHq8T5<s2OXzZ8k+s*Wx5BDJr9#~a2dDd9Z&$9+!JmzlHPC6J!rc?7X{V@L!@GGsx zjMKFLQyqoHAlP@HlZuaG&cZM*K(IhvWu`~zRMmudCG312m`TEu%=<%tO+(%bE)`#{ z2|_I>3*P=5Vq55WkP`TFntv1X0+~}=*+~9VP))1xjn}X0%I<4L0t&^bTJ4|lGJi+m zicb%8tNXRLioSFumud7zcL@w1(%5ShR0e`7mx9i&KlCAqB)KRo3$qkMWTN7neA6^| z4cU!I_$<|(sVMetYUQ0XX=4M|_!L(A8S7M`c#e!T08&4=?7{F>^lWbDT+peG!bu?@ zj3|`AeBKy_;`9u2<Q*mVbAEH))90UuAo}L&Oi5=7Rz{Wd0~nUk2QPmKN~Tc*7)p0; zNX0PS7S(}vb&s;$x>^#iA!h9oW%oH|Xn$P|Z9QMNwi6lVH&;B;)U0a7eG;Tb3L|w; zGE+um{qFShy4TMJ{Wd}mjDC5^eh+yIMR$}3=q(U7tq$&dBm8lm^?T;dsPsryB+d<u z6U&N9jsNh%eDSEeF<q{LN~M(w+*!e7rf(r}9<UH4OpV>AoTIJOW&j5BAPm(InzTv< zlA$r|GlwQKRKex#WPL!ehH@s{XjiWRWeY4-x)l36H(E+k1<Qt8K{g}y-l|3eU+!w= zSl}I+_*7WJ&oG?cG9+e2H311GXEnT{vd<d>G7yf58&w9T(6_HGERK6$#=xQT(h?KX zb|G#1Z=O($;|a-~=;KfWX<vR{=B`Mqxn(hFOB(T__@`hVkl0fzGxO6F&83<<yKgZv zk8`SN+e@j@oa66?_8}0oAo{04wT#rf5eAB2K<>#3oq=prZ>+J4B0A`*`aYnZSu5TO zG2Nc7NOQU0#rl{dLPMH!lHwl?^lSsjN@36}zcjBwKBl*rUD<6;SgQbtnd#oUhSQz0 zTp5hKvVlO&8`{@#WdBJZaah+Wda^ndVg^)qxE@fJs+je0!7PFSO^T$7JJBT5e*>no zBa##EHsaI<FdI#QektA9-A#!9&U-U{dA_>!3Hk@f(BpZd0a*i3jezf3W&vdv-M~IK z1hRP^Q_A)?$hJhJYTAtf9uqc-6!)qR0ANPZ4#=-tzOB4B{x}7I7L!ZwTkZ|naaJsu z9xNUceH3X{h3-urn=I7?(>zHZeWb<(<oe8-Zc*L7yh#H{c>BnGp}E}a;suOBaUdJ! zi0+3>_~D2;(6w20oaHOYy9dA$vp3*|{OMn%en3k#0%~f%yM4DCf?!B_H09!88u_*6 zYomw|`DfY-+A-u?tA8g7&79MKW*R`V*Fdi{`&QF|#~wPv)v=wia);W<Vclt?C|TUP zneu<_MN8o!a}QdNW+sps<)yF@cuTkmm;^+#2Qf&>5WCwZK+rQ_;YW!Tn!q0l+}_Wi z4-UM#wb?BIG@C67WHo#f*&@Gn+vEeDB}z$KPfHQUJz;=7GSv?B31O;p)GfOo0;B^? zJ&UvN3n6?UCC7UdH4>(Qe;IyldrOiT!%AP?+kG5OZ~H-4*9wtJ`Zld)BS%6l?{<9} zQP8Jo1c;|(0c4v^l)DYcQknsy^d>8oNQP`BAteSlLK^M4Au0PxTZw?mxazI6a5)*m zR<UKrXYn}rjdod<x%R8B;!eFE=j69SiY|&^^ylFEVxn1m+`K@G8c+OA=UaN95F;UW z_Ud^3Mhpdx8Vw}hc^G{`523jRJRnkYl>y~j)!my~1i(%Y@TUHxYuAw%;4cr|Wb63^ z^b23<?7lS-ib9PC+6l5|Y<jI1FhoNawAmT*4OYUs2!d#NSO2hgU+q6P8z~|QA#J7T zv#bIV{`xEUPk8Q<P5{ISAdw#&Xs%C+9mx3C4Zr}!0~I1mYVpi)f~Yksfk*&&h6rFS zOfAuA5lFoH{Q;|F)Oc7gCvOAu*7!=2^6AcF6@G4rBMwk~b9CL!3J16{XDqluTyO*m z{}oOnPNjvFA&hosgrfTYT{WEe)ENhr0&seTXH&2)ydaV!dmuOqdx--KYx;|#tLA(0 zz}YLR`rY@m(Seqwp3?W<u6PMz)d5jenI937hES{`SWMfqz_RNdWUrqIlr)7Unx(TQ zgbElc0CMqC0-)5vb*OS0wr^I5{|vCh!<yNBHUb7qznG#-d1N1e6ywiR{GUL%=GI+* zyLq&YeX@#h#q79hJ{_9>WWpwilU(B-sS#GcxEzs`6%tN%B)_2j6)maaxKFe3Av_L< z%z}SO0-3BIe;yvMSMSdeD;PYU?u;HXoi2fND*Xe1tpCV?>{G4;)D@jOyCsV|E<7L$ zR{@tFW`opx@Ye8Wu0R3GYx?r~muG7>{C5BjWy*j;o-`$GdYnrG1RfJyn-V@9X)o#D z1(<Bz0{xVTW?DQEyfZv4yOz(w8ip&(=mBc=^k0_$Pn}IE!0@HDYsCcMVA0WyNeK3* z^_xV(tN@+QranYIZ&v#gFM<Gn;WO&f`Oh6BN#*o%$`BycWM&2+^Jj61)U_!j^zGp> z^Pa{ieEKP7KZdVK0DZppDx)NhwmFbgui=?@$Kcx186kYc3pkK_N?QcC-~d?y&P?En zj8u#pQq*9yO*5Ey(SaP_oJ=<YfzW<GeitA(RBeP;hv0Dj^Gd`})8(IfiR5S?2j2_% zJs3}PUbcsIT(G`aC=uvgoIjVT&T0%Tup?~}HKCJBXeTnc(q)QkZoInLLC!32OTv$9 z`(uAuB1m}TD3wgsrK0AHHLZ%z0!MiTMxV0%Aq1Mxe)fiLFzpz(kNc53<<Zt}`j*6q z0YX}I`LhzlaJeh`<sH0KgwWvTm5ukZo98v4{mwP49S6?Cae_$g6j~?wKTKh08=f>; zHN7ZXo`2&Lfpp?2aX<l7=1px+g2ss<Z3?^IPo_5U5I<?bPXXakKsviUAB|#F>u6H< zIbX-xP!7Do<D~csS5_4MZvBM85#!F1`Fd7Rr3I4{XgPUEP(1fcF-b7g)d&4BORhIh zp89*dj1SK8%XrgYiWJ|Ao;-svS3<0mxy22ZEDwt&<Q4w_8RaZ5h<o1~B{9~~X^r1Y zA7+7j^OXC?^3Eq*cFS<k^hF~p#O~=S`H7XuqN4X=ziI+XmdR8W{a!>(<Q2GS5~86P z289ctJbp5P<o|s4;D7hsga3biDWd3M&Xo2m@Qn`;-k+AvA;YIVp_3@)a=RdY1_+3f zNCJe1MGL}=Bmkj-pM;_y(7ONEVys4VvZv{H%A_C=>Qe_jBZ!guYY8hi7hVf%H%l8{ zUl;dB!XPPGUv~>DCmRTZrH!3~t2EnjTNfLHgS9l9p|Co?y1Rmny~9g?Pa9o-4LvJ= zCo6GlHdz@QDPIYIfQt>pg2C6t+0{$JSDNiVbR~fQA7AsaG5n_r#7UY>)y2ZjMnXc# z*TGiL&CQuXfS*^4pA8`5X>BW^qp18}B!DMrHhT!fU4oC#$H#})N08Ue(~eI-TwI)w z{{`QR7d$`>9xp#vh=nhYs~0ms0f*r~G!$*TtUMjuAr5Y?439J|EZw{z(rj!v4F5&i z{eL0t>h)h50Cd3z6z~b~3i1K87#O60Ckc6Ph`pPqjFtt|#+l)@8=w+5sMKS<|5*a? z<a=cDzcBs(E(oBs|L)`eO%PuTcR&#S{}KeKCZXVIV*zpVeAJkXf`u#8LW=MI`TGA= sl>Z?epjJS^eE&U6z{7tJw2dn;x}Lx=R!SHAdz=HRN*apQVDs?*3v4$@8~^|S diff --git a/inc/images/provisioning/flags/ae.svg b/inc/images/provisioning/flags/ae.svg deleted file mode 100644 index 64bc2bd6..00000000 --- a/inc/images/provisioning/flags/ae.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6 3"><path fill="#00843D" d="M0 0h6v3H0z"/><path fill="#fff" d="M0 1h6v2H0z"/><path d="M0 2h6v1H0z"/><path fill="#C8102E" d="M0 0h1.5v3H0z"/></svg> \ No newline at end of file diff --git a/inc/images/provisioning/flags/au.svg b/inc/images/provisioning/flags/au.svg deleted file mode 100644 index 407fef43..00000000 --- a/inc/images/provisioning/flags/au.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-au" viewBox="0 0 640 480"> - <path fill="#00008B" d="M0 0h640v480H0z"/> - <path fill="#fff" d="m37.5 0 122 90.5L281 0h39v31l-120 89.5 120 89V240h-40l-120-89.5L40.5 240H0v-30l119.5-89L0 32V0z"/> - <path fill="red" d="M212 140.5 320 220v20l-135.5-99.5zm-92 10 3 17.5-96 72H0zM320 0v1.5l-124.5 94 1-22L295 0zM0 0l119.5 88h-30L0 21z"/> - <path fill="#fff" d="M120.5 0v240h80V0h-80ZM0 80v80h320V80H0Z"/> - <path fill="red" d="M0 96.5v48h320v-48zM136.5 0v240h48V0z"/> - <path fill="#fff" d="m527 396.7-20.5 2.6 2.2 20.5-14.8-14.4-14.7 14.5 2-20.5-20.5-2.4 17.3-11.2-10.9-17.5 19.6 6.5 6.9-19.5 7.1 19.4 19.5-6.7-10.7 17.6 17.4 11.1Zm-3.7-117.2 2.7-13-9.8-9 13.2-1.5 5.5-12.1 5.5 12.1 13.2 1.5-9.8 9 2.7 13-11.6-6.6-11.6 6.6Zm-104.1-60-20.3 2.2 1.8 20.3-14.4-14.5-14.8 14.1 2.4-20.3-20.2-2.7 17.3-10.8-10.5-17.5 19.3 6.8L387 178l6.7 19.3 19.4-6.3-10.9 17.3 17.1 11.2ZM623 186.7l-20.9 2.7 2.3 20.9-15.1-14.7-15 14.8 2.1-21-20.9-2.4 17.7-11.5-11.1-17.9 20 6.7 7-19.8 7.2 19.8 19.9-6.9-11 18 17.8 11.3Zm-96.1-83.5-20.7 2.3 1.9 20.8-14.7-14.8-15.1 14.4 2.4-20.7-20.7-2.8 17.7-11L467 73.5l19.7 6.9 7.3-19.5 6.8 19.7 19.8-6.5-11.1 17.6 17.4 11.5ZM234 385.7l-45.8 5.4 4.6 45.9-32.8-32.4-33 32.2 4.9-45.9-45.8-5.8 38.9-24.8-24-39.4 43.6 15 15.8-43.4 15.5 43.5 43.7-14.7-24.3 39.2 38.8 25.1Z"/> -</svg> diff --git a/inc/images/provisioning/flags/bh.svg b/inc/images/provisioning/flags/bh.svg deleted file mode 100644 index 7a2ea549..00000000 --- a/inc/images/provisioning/flags/bh.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-bh" viewBox="0 0 640 480"> - <path fill="#fff" d="M0 0h640v480H0"/> - <path fill="#ce1126" d="M640 0H96l110.7 48L96 96l110.7 48L96 192l110.7 48L96 288l110.7 48L96 384l110.7 48L96 480h544"/> -</svg> diff --git a/inc/images/provisioning/flags/br.svg b/inc/images/provisioning/flags/br.svg deleted file mode 100644 index 354a7013..00000000 --- a/inc/images/provisioning/flags/br.svg +++ /dev/null @@ -1,45 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-br" viewBox="0 0 640 480"> - <g stroke-width="1pt"> - <path fill="#229e45" fill-rule="evenodd" d="M0 0h640v480H0z"/> - <path fill="#f8e509" fill-rule="evenodd" d="m321.4 436 301.5-195.7L319.6 44 17.1 240.7 321.4 436z"/> - <path fill="#2b49a3" fill-rule="evenodd" d="M452.8 240c0 70.3-57.1 127.3-127.6 127.3A127.4 127.4 0 1 1 452.8 240z"/> - <path fill="#ffffef" fill-rule="evenodd" d="m283.3 316.3-4-2.3-4 2 .9-4.5-3.2-3.4 4.5-.5 2.2-4 1.9 4.2 4.4.8-3.3 3m86 26.3-3.9-2.3-4 2 .8-4.5-3.1-3.3 4.5-.5 2.1-4.1 2 4.2 4.4.8-3.4 3.1m-36.2-30-3.4-2-3.5 1.8.8-3.9-2.8-2.9 4-.4 1.8-3.6 1.6 3.7 3.9.7-3 2.7m87-8.5-3.4-2-3.5 1.8.8-3.9-2.7-2.8 3.9-.4 1.8-3.5 1.6 3.6 3.8.7-2.9 2.6m-87.3-22-4-2.2-4 2 .8-4.6-3.1-3.3 4.5-.5 2.1-4.1 2 4.2 4.4.8-3.4 3.2m-104.6-35-4-2.2-4 2 1-4.6-3.3-3.3 4.6-.5 2-4.1 2 4.2 4.4.8-3.3 3.1m13.3 57.2-4-2.3-4 2 .9-4.5-3.2-3.3 4.5-.6 2.1-4 2 4.2 4.4.8-3.3 3.1m132-67.3-3.6-2-3.6 1.8.8-4-2.8-3 4-.5 1.9-3.6 1.7 3.8 4 .7-3 2.7m-6.7 38.3-2.7-1.6-2.9 1.4.6-3.2-2.2-2.3 3.2-.4 1.5-2.8 1.3 3 3 .5-2.2 2.2m-142.2 50.4-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2M419 299.8l-2.2-1.1-2.2 1 .5-2.3-1.7-1.6 2.4-.3 1.2-2 1 2 2.5.5-1.9 1.5"/> - <path fill="#ffffef" fill-rule="evenodd" d="m219.3 287.6-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2"/> - <path fill="#ffffef" fill-rule="evenodd" d="m219.3 287.6-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m42.3 3-2.6-1.4-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .5-2.3 2.1m-4.8 17-2.6-1.5-2.7 1.4.6-3-2.1-2.3 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m87.4-22.2-2.6-1.6-2.8 1.4.6-3-2-2.3 3-.3 1.4-2.7 1.2 2.8 3 .5-2.2 2.1m-25.1 3-2.7-1.5-2.7 1.4.6-3-2-2.3 3-.3 1.4-2.8 1.2 2.9 3 .5-2.2 2.1m-68.8-5.8-1.7-1-1.7.8.4-1.9-1.3-1.4 1.9-.2.8-1.7.8 1.8 1.9.3-1.4 1.3m167.8 45.4-2.6-1.5-2.7 1.4.6-3-2.1-2.3 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m-20.8 6-2.2-1.4-2.3 1.2.5-2.6-1.7-1.8 2.5-.3 1.2-2.3 1 2.4 2.5.4-1.9 1.8m10.4 2.3-2-1.2-2.1 1 .4-2.3-1.6-1.7 2.3-.3 1.1-2 1 2 2.3.5-1.7 1.6m29.1-22.8-2-1-2 1 .5-2.3-1.6-1.7 2.3-.3 1-2 1 2.1 2.1.4-1.6 1.6m-38.8 41.8-2.5-1.4-2.7 1.2.6-2.8-2-2 3-.3 1.3-2.5 1.2 2.6 3 .5-2.3 1.9m.6 14.2-2.4-1.4-2.4 1.3.6-2.8-1.9-2 2.7-.4 1.2-2.5 1.1 2.6 2.7.5-2 2m-19-23.1-1.9-1.2-2 1 .4-2.2-1.5-1.7 2.2-.2 1-2 1 2 2.2.4-1.6 1.6m-17.8 2.3-2-1.2-2 1 .5-2.2-1.6-1.7 2.3-.2 1-2 1 2 2.1.4-1.6 1.6m-30.4-24.6-2-1.1-2 1 .5-2.3-1.6-1.6 2.2-.3 1-2 1 2 2.2.5-1.6 1.5m3.7 57-1.6-.9-1.8.9.4-2-1.3-1.4 1.9-.2.9-1.7.8 1.8 1.9.3-1.4 1.3m-46.2-86.6-4-2.3-4 2 .9-4.5-3.2-3.3 4.5-.6 2.2-4 1.9 4.2 4.4.8-3.3 3.1"/> - <path fill="#fff" fill-rule="evenodd" d="M444.4 285.8a124.6 124.6 0 0 0 5.8-19.8c-67.8-59.5-143.3-90-238.7-83.7a124.5 124.5 0 0 0-8.5 20.9c113-10.8 196 39.2 241.4 82.6z"/> - <path fill="#309e3a" d="m414 252.4 2.3 1.3a3.4 3.4 0 0 0-.3 2.2 3 3 0 0 0 1.4 1.7c.7.5 1.4.8 2 .7.6 0 1-.3 1.3-.7a1.3 1.3 0 0 0 .2-.9 2.3 2.3 0 0 0-.5-1c-.2-.3-.7-1-1.5-1.8a7.7 7.7 0 0 1-1.8-3 3.7 3.7 0 0 1 2-4.4 3.8 3.8 0 0 1 2.3-.2 7 7 0 0 1 2.6 1.2c1.4 1 2.3 2 2.6 3.2a4.1 4.1 0 0 1-.6 3.3l-2.4-1.5c.3-.6.4-1.2.2-1.7-.1-.5-.5-1-1.2-1.4a3.2 3.2 0 0 0-1.8-.7 1 1 0 0 0-.9.5c-.2.3-.2.6-.1 1s.6 1.2 1.6 2.2c1 1 1.6 1.9 2 2.5a3.9 3.9 0 0 1-.3 4.2 4.1 4.1 0 0 1-1.9 1.5 4 4 0 0 1-2.4.3c-.9-.2-1.8-.6-2.8-1.3-1.5-1-2.4-2.1-2.7-3.3a5.4 5.4 0 0 1 .6-4zm-11.6-7.6 2.5 1.3a3.4 3.4 0 0 0-.2 2.2 3 3 0 0 0 1.4 1.6c.8.5 1.4.7 2 .6.6 0 1-.3 1.3-.8a1.3 1.3 0 0 0 .2-.8c0-.3-.2-.7-.5-1a34.6 34.6 0 0 0-1.6-1.8c-1.1-1.1-1.8-2-2-2.8a3.7 3.7 0 0 1 .4-3.1 3.6 3.6 0 0 1 1.6-1.4 3.8 3.8 0 0 1 2.2-.3 7 7 0 0 1 2.6 1c1.5 1 2.4 2 2.7 3.1a4.1 4.1 0 0 1-.4 3.4l-2.5-1.4c.3-.7.4-1.2.2-1.7s-.6-1-1.3-1.4a3.2 3.2 0 0 0-1.9-.6 1 1 0 0 0-.8.5c-.2.3-.2.6-.1 1s.7 1.2 1.7 2.2c1 1 1.7 1.8 2 2.4a3.9 3.9 0 0 1 0 4.2 4.2 4.2 0 0 1-1.8 1.6 4 4 0 0 1-2.4.3 8 8 0 0 1-2.9-1.1 6 6 0 0 1-2.8-3.2 5.4 5.4 0 0 1 .4-4zm-14.2-3.8 7.3-12 8.8 5.5-1.2 2-6.4-4-1.6 2.7 6 3.7-1.3 2-6-3.7-2 3.3 6.7 4-1.2 2-9-5.5zm-20.7-17 1.1-2 5.4 2.7-2.5 5c-.8.2-1.8.3-3 .2a9.4 9.4 0 0 1-3.3-1 7.7 7.7 0 0 1-3-2.6 6 6 0 0 1-1-3.5 8.6 8.6 0 0 1 1-3.7 8 8 0 0 1 2.6-3 6.2 6.2 0 0 1 3.6-1.1c1 0 2 .3 3.2 1 1.6.7 2.6 1.7 3.1 2.8a5 5 0 0 1 .3 3.5l-2.7-.8a3 3 0 0 0-.2-2c-.3-.6-.8-1-1.6-1.4a3.8 3.8 0 0 0-3.1-.3c-1 .3-1.9 1.2-2.6 2.6-.7 1.4-1 2.7-.7 3.8a3.7 3.7 0 0 0 2 2.4c.5.3 1.1.5 1.7.5a6 6 0 0 0 1.8 0l.8-1.6-2.9-1.5zm-90.2-22.3 2-14 4.2.7 1.1 9.8 3.9-9 4.2.6-2 13.8-2.7-.4 1.7-10.9-4.4 10.5-2.7-.4-1.1-11.3-1.6 11-2.6-.4zm-14.1-1.7 1.3-14 10.3 1-.2 2.4-7.5-.7-.3 3 7 .7-.3 2.4-7-.7-.3 3.8 7.8.7-.2 2.4-10.6-1z"/> - <g stroke-opacity=".5"> - <path fill="#309e3a" d="M216.5 191.3c0-1.5.3-2.6.7-3.6a6.7 6.7 0 0 1 1.4-1.9 5.4 5.4 0 0 1 1.8-1.2c1-.3 2-.5 3-.5 2.1 0 3.7.8 5 2a7.4 7.4 0 0 1 1.6 5.5c0 2.2-.7 4-2 5.3a6.5 6.5 0 0 1-5 1.7 6.6 6.6 0 0 1-4.8-2 7.3 7.3 0 0 1-1.7-5.3z"/> - <path fill="#f7ffff" d="M219.4 191.3c0 1.5.3 2.7 1 3.6.7.8 1.6 1.3 2.8 1.3a3.5 3.5 0 0 0 2.8-1.1c.7-.8 1-2 1.1-3.7 0-1.6-.2-2.8-1-3.6a3.5 3.5 0 0 0-2.7-1.3 3.6 3.6 0 0 0-2.8 1.2c-.8.8-1.1 2-1.2 3.6z"/> - </g> - <g stroke-opacity=".5"> - <path fill="#309e3a" d="m233 198.5.2-14h6c1.5 0 2.5.2 3.2.5.7.2 1.2.7 1.6 1.3s.6 1.4.6 2.3a3.8 3.8 0 0 1-1 2.6 4.5 4.5 0 0 1-2.7 1.2l1.5 1.2c.4.4.9 1.2 1.5 2.3l1.7 2.8h-3.4l-2-3.2-1.4-2a2.1 2.1 0 0 0-.9-.6 5 5 0 0 0-1.4-.2h-.6v5.8H233z"/> - <path fill="#fff" d="M236 190.5h2c1.4 0 2.3 0 2.6-.2.3 0 .6-.3.8-.5s.3-.7.3-1c0-.6-.1-1-.4-1.2-.2-.3-.6-.5-1-.6h-2l-2.3-.1v3.5z"/> - </g> - <g stroke-opacity=".5"> - <path fill="#309e3a" d="m249 185.2 5.2.3c1.1 0 2 .1 2.6.3a4.7 4.7 0 0 1 2 1.4 6 6 0 0 1 1.2 2.4c.3.9.4 2 .3 3.3a9.3 9.3 0 0 1-.5 3c-.4 1-1 1.8-1.7 2.4a5 5 0 0 1-2 1c-.6.2-1.5.2-2.5.2l-5.3-.3.7-14z"/> - <path fill="#fff" d="m251.7 187.7-.5 9.3h3.8c.5 0 .9-.2 1.2-.5.3-.3.6-.7.8-1.3.2-.6.4-1.5.4-2.6l-.1-2.5a3.2 3.2 0 0 0-.8-1.4 2.7 2.7 0 0 0-1.2-.7 13 13 0 0 0-2.3-.3h-1.3z"/> - </g> - <g stroke-opacity=".5"> - <path fill="#309e3a" d="m317.6 210.2 3.3-13.6 4.4 1 3.2 1c.7.4 1.3 1 1.6 1.9.4.8.4 1.7.2 2.8-.2.8-.5 1.5-1 2a3.9 3.9 0 0 1-3 1.4c-.7 0-1.7-.2-3-.5l-1.7-.5-1.2 5.2-2.8-.7z"/> - <path fill="#fff" d="m323 199.6-.8 3.8 1.5.4c1 .2 1.8.4 2.2.3a1.9 1.9 0 0 0 1.6-1.5c0-.5 0-.9-.2-1.3a2 2 0 0 0-1-.9l-1.9-.5-1.3-.3z"/> - </g> - <g stroke-opacity=".5"> - <path fill="#309e3a" d="m330.6 214.1 4.7-13.2 5.5 2c1.5.5 2.4 1 3 1.4.5.5.9 1 1 1.8s.2 1.5 0 2.3c-.4 1-1 1.7-1.8 2.2-.8.4-1.8.5-3 .3.4.5.8 1 1 1.6l.8 2.7.6 3.1-3.1-1.1-1-3.6a19.5 19.5 0 0 0-.7-2.4 2.1 2.1 0 0 0-.6-.8c-.2-.3-.6-.5-1.3-.7l-.5-.2-2 5.6-2.6-1z"/> - <path fill="#fff" d="m336 207.4 1.9.7c1.3.5 2.1.7 2.5.7.3 0 .6 0 .9-.3.3-.2.5-.5.6-.9.2-.4.2-.8 0-1.2a1.7 1.7 0 0 0-.8-.9l-2-.7-2-.7-1.2 3.3z"/> - </g> - <g stroke-opacity=".5"> - <path fill="#309e3a" d="M347 213.6a9 9 0 0 1 1.7-3.2 6.6 6.6 0 0 1 1.8-1.5 6 6 0 0 1 2-.7c1 0 2 0 3.1.4a6.5 6.5 0 0 1 4.2 3.3c.8 1.6.8 3.5.2 5.7a7.4 7.4 0 0 1-3.4 4.5c-1.5.9-3.3 1-5.2.4a6.6 6.6 0 0 1-4.2-3.3 7.3 7.3 0 0 1-.2-5.6z"/> - <path fill="#fff" d="M349.8 214.4c-.4 1.5-.5 2.8 0 3.8s1.2 1.6 2.3 2c1 .3 2 .2 3-.4 1-.5 1.6-1.6 2.1-3.2.5-1.5.5-2.7 0-3.7a3.5 3.5 0 0 0-2.2-2 3.6 3.6 0 0 0-3 .3c-1 .6-1.7 1.6-2.2 3.2z"/> - </g> - <g stroke-opacity=".5"> - <path fill="#309e3a" d="m374.3 233.1 6.4-12.4 5.3 2.7a10 10 0 0 1 2.7 1.9c.5.5.8 1.1.8 1.9s0 1.5-.4 2.2a3.8 3.8 0 0 1-2 2c-1 .2-2 .2-3.1-.2.4.6.6 1.2.8 1.7.2.6.3 1.5.4 2.8l.2 3.2-3-1.5-.4-3.7a20 20 0 0 0-.3-2.5 2 2 0 0 0-.5-1l-1.2-.7-.5-.3-2.7 5.2-2.5-1.3z"/> - <path fill="#fff" d="m380.5 227.2 1.9 1c1.2.6 2 1 2.3 1 .3 0 .7 0 1-.2.3-.1.5-.4.7-.8.2-.4.3-.8.2-1.2a2 2 0 0 0-.7-1 23.7 23.7 0 0 0-1.8-1l-2-1-1.6 3.2z"/> - </g> - <g stroke-opacity=".5"> - <path fill="#309e3a" d="M426.1 258.7a8.9 8.9 0 0 1 2.5-2.6 6.6 6.6 0 0 1 2.2-.9 5.5 5.5 0 0 1 2.2 0c1 .2 1.9.6 2.8 1.2a6.6 6.6 0 0 1 3 4.4c.3 1.7-.2 3.6-1.4 5.5a7.3 7.3 0 0 1-4.5 3.3 6.5 6.5 0 0 1-5.2-1.1 6.6 6.6 0 0 1-3-4.4c-.3-1.8.2-3.6 1.4-5.4z"/> - <path fill="#fff" d="M428.6 260.3c-1 1.3-1.3 2.5-1.1 3.6a3.6 3.6 0 0 0 1.6 2.5c1 .7 2 .9 3 .6 1-.3 2-1 2.9-2.4.9-1.4 1.3-2.6 1.1-3.6-.1-1-.7-1.9-1.6-2.6s-2-.8-3-.5c-1 .2-2 1-3 2.4z"/> - </g> - <path fill="#309e3a" d="m301.8 204.5 2.3-9.8 7.2 1.7-.3 1.6-5.3-1.2-.5 2.2 4.9 1.1-.4 1.7-4.9-1.2-.6 2.7 5.5 1.3-.4 1.6-7.5-1.7z"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/ca.svg b/inc/images/provisioning/flags/ca.svg deleted file mode 100644 index f1b2c968..00000000 --- a/inc/images/provisioning/flags/ca.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ca" viewBox="0 0 640 480"> - <path fill="#fff" d="M150.1 0h339.7v480H150z"/> - <path fill="#d52b1e" d="M-19.7 0h169.8v480H-19.7zm509.5 0h169.8v480H489.9zM201 232l-13.3 4.4 61.4 54c4.7 13.7-1.6 17.8-5.6 25l66.6-8.4-1.6 67 13.9-.3-3.1-66.6 66.7 8c-4.1-8.7-7.8-13.3-4-27.2l61.3-51-10.7-4c-8.8-6.8 3.8-32.6 5.6-48.9 0 0-35.7 12.3-38 5.8l-9.2-17.5-32.6 35.8c-3.5.9-5-.5-5.9-3.5l15-74.8-23.8 13.4c-2 .9-4 .1-5.2-2.2l-23-46-23.6 47.8c-1.8 1.7-3.6 1.9-5 .7L264 130.8l13.7 74.1c-1.1 3-3.7 3.8-6.7 2.2l-31.2-35.3c-4 6.5-6.8 17.1-12.2 19.5-5.4 2.3-23.5-4.5-35.6-7 4.2 14.8 17 39.6 9 47.7z"/> -</svg> diff --git a/inc/images/provisioning/flags/de.svg b/inc/images/provisioning/flags/de.svg deleted file mode 100644 index b08334b6..00000000 --- a/inc/images/provisioning/flags/de.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-de" viewBox="0 0 640 480"> - <path fill="#ffce00" d="M0 320h640v160H0z"/> - <path d="M0 0h640v160H0z"/> - <path fill="#d00" d="M0 160h640v160H0z"/> -</svg> diff --git a/inc/images/provisioning/flags/fr.svg b/inc/images/provisioning/flags/fr.svg deleted file mode 100644 index 1be61911..00000000 --- a/inc/images/provisioning/flags/fr.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-fr" viewBox="0 0 640 480"> - <g fill-rule="evenodd" stroke-width="1pt"> - <path fill="#fff" d="M0 0h640v480H0z"/> - <path fill="#002654" d="M0 0h213.3v480H0z"/> - <path fill="#ce1126" d="M426.7 0H640v480H426.7z"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/gb.svg b/inc/images/provisioning/flags/gb.svg deleted file mode 100644 index dbac25ea..00000000 --- a/inc/images/provisioning/flags/gb.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-gb" viewBox="0 0 640 480"> - <path fill="#012169" d="M0 0h640v480H0z"/> - <path fill="#FFF" d="m75 0 244 181L562 0h78v62L400 241l240 178v61h-80L320 301 81 480H0v-60l239-178L0 64V0h75z"/> - <path fill="#C8102E" d="m424 281 216 159v40L369 281h55zm-184 20 6 35L54 480H0l240-179zM640 0v3L391 191l2-44L590 0h50zM0 0l239 176h-60L0 42V0z"/> - <path fill="#FFF" d="M241 0v480h160V0H241zM0 160v160h640V160H0z"/> - <path fill="#C8102E" d="M0 193v96h640v-96H0zM273 0v480h96V0h-96z"/> -</svg> diff --git a/inc/images/provisioning/flags/hk.svg b/inc/images/provisioning/flags/hk.svg deleted file mode 100644 index e32924f1..00000000 --- a/inc/images/provisioning/flags/hk.svg +++ /dev/null @@ -1,30 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-hk" viewBox="0 0 640 480"> - <defs> - <clipPath id="a"> - <path fill-opacity=".7" d="M-89 0h682.6v512H-89z"/> - </clipPath> - </defs> - <g clip-path="url(#a)" transform="translate(83.5) scale(.94)"> - <path fill="#ba0000" fill-rule="evenodd" d="M618 512h-731.4V0H618z"/> - <path fill="#fff" fill-rule="evenodd" d="M241.9 247.8s-51.6-22.2-44.2-79.8c7.1-27.7 19.8-46.6 42.7-56.9 10.8-3.3 21.8-4.8 33-5.7-3 2.8-5.4 5.6-6.7 9-2.4 6.4-.6 12.4 2.7 18.5 4.1 7 6.6 14.2 7.4 23.6a36.6 36.6 0 0 1-14.6 33.7c-6.6 5.1-14.4 6.9-20.8 12.7-5 4.8-8 9.7-9 18.1-.2 16.1 4.1 18.4 9.5 26.8z"/> - <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="M232 164.5v-.3"/> - <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M235.3 241.8c-20-17.7-18.3-62.4-3-77.3"/> - <path fill="#ba0000" fill-rule="evenodd" d="m244.6 154.5 3.3 5.5-6-2.5-4.7 5 .8-6.5-6-2.5 6.5-1.5.8-6.4 3.3 5.5 6.6-1.5"/> - <path fill="#fff" fill-rule="evenodd" d="M246.3 244s6-55.9 63.3-65.7c28.6-1.2 50.4 5.3 67 24.3 6.3 9.3 10.9 19.4 15 29.8-3.5-2-6.8-3.5-10.6-3.7-6.7-.5-12 3-16.8 7.9a53.2 53.2 0 0 1-20.4 14 36.6 36.6 0 0 1-36.5-4c-6.8-4.9-10.8-11.8-18.2-16.2a28.2 28.2 0 0 0-20-3.4c-15.5 4.6-16.3 9.4-22.8 17z"/> - <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="M323 210.2h.3"/> - <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M250 236c11.2-24.4 54.4-35.8 73.1-25.6"/> - <path fill="#ba0000" fill-rule="evenodd" d="M336.3 219.3 332 224l.6-6.5-6-3 6.3-1 .6-6.7 3.4 6 6.4-1.2-4.3 4.7 3.3 6"/> - <path fill="#fff" fill-rule="evenodd" d="M250.1 248s55-12 82.4 39.3c10.3 26.7 11 49.4-1.7 71.1-6.8 9-15 16.5-23.5 23.8.8-4 1.1-7.6.1-11.2-1.6-6.6-6.6-10.5-12.8-13.5a53.1 53.1 0 0 1-19.8-15 36.6 36.6 0 0 1-7.7-35.8c2.4-8 7.7-14 9.5-22.4a28 28 0 0 0-3.1-20c-9.3-13.2-14.1-12.5-23.4-16.3z"/> - <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="m306.5 310.1.2.2"/> - <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M259 249c26.6 2.9 51.1 40.2 47.4 61.3"/> - <path fill="#ba0000" fill-rule="evenodd" d="m302.1 325.6-5.9-2.6 6.5-1.5.8-6.7 3.1 5.7 6.5-1.5-4.5 5 3 5.7-5.8-2.6-4.5 5.1"/> - <path fill="#fff" fill-rule="evenodd" d="M248.9 253.7s26.9 49.4-14.5 90c-22.8 17.4-44.4 24.5-68.8 18.4-10.5-4-20-9.7-29.5-15.9 4-.3 7.7-1 10.9-3 5.8-3.4 8.1-9.3 9.3-16a53 53 0 0 1 8.8-23.3 36.6 36.6 0 0 1 32.2-17.5c8.4.1 15.6 3.6 24.2 3 6.9-.9 12.3-2.8 18.4-8.8 10-12.5 8-17 9-27z"/> - <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="m205.1 325.3-.1.2"/> - <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M250.3 262.4c4.9 26.4-24.1 60.5-45.4 62.7"/> - <path fill="#ba0000" fill-rule="evenodd" d="m189 325.4.9-6.4 3.3 5.7 6.6-1-4.6 4.6 3.3 5.7-6.1-2.9-4.6 4.6.8-6.4-6.1-2.9"/> - <path fill="#fff" fill-rule="evenodd" d="M242.8 252.6S205.2 294.4 153 269c-24-15.7-37.8-33.8-40.1-58.8.3-11.3 2.4-22.1 5.1-33 1.7 3.6 3.6 6.8 6.5 9.2 5.1 4.3 11.5 4.5 18.3 3.4a52 52 0 0 1 24.7.6 36.6 36.6 0 0 1 27.3 24.6c2.7 7.9 1.8 15.9 5.3 23.8 3 6.2 6.6 10.6 14.3 14.4 15.2 5.3 18.7 1.9 28.4-.5z"/> - <path fill="#ba0000" fill-rule="evenodd" stroke="#000" stroke-width="2.1" d="m160.7 235.2-.2-.1"/> - <path fill="none" stroke="#ba0000" stroke-width="2.1" d="M235 256.9c-23.2 13.3-65-2.7-74.2-22"/> - <path fill="#ba0000" fill-rule="evenodd" d="m155.3 220 6.3-1.3-4.3 5 3.1 5.9-5.8-2.8-4.3 5 .7-6.8-5.9-2.8 6.3-1.3.7-6.8"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/ie.svg b/inc/images/provisioning/flags/ie.svg deleted file mode 100644 index 049be14d..00000000 --- a/inc/images/provisioning/flags/ie.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ie" viewBox="0 0 640 480"> - <g fill-rule="evenodd" stroke-width="1pt"> - <path fill="#fff" d="M0 0h640v480H0z"/> - <path fill="#009A49" d="M0 0h213.3v480H0z"/> - <path fill="#FF7900" d="M426.7 0H640v480H426.7z"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/in.svg b/inc/images/provisioning/flags/in.svg deleted file mode 100644 index 53c29b3a..00000000 --- a/inc/images/provisioning/flags/in.svg +++ /dev/null @@ -1,25 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="flag-icons-in" viewBox="0 0 640 480"> - <path fill="#f93" d="M0 0h640v160H0z"/> - <path fill="#fff" d="M0 160h640v160H0z"/> - <path fill="#128807" d="M0 320h640v160H0z"/> - <g transform="matrix(3.2 0 0 3.2 320 240)"> - <circle r="20" fill="#008"/> - <circle r="17.5" fill="#fff"/> - <circle r="3.5" fill="#008"/> - <g id="d"> - <g id="c"> - <g id="b"> - <g id="a" fill="#008"> - <circle r=".9" transform="rotate(7.5 -8.8 133.5)"/> - <path d="M0 17.5.6 7 0 2l-.6 5L0 17.5z"/> - </g> - <use xlink:href="#a" width="100%" height="100%" transform="rotate(15)"/> - </g> - <use xlink:href="#b" width="100%" height="100%" transform="rotate(30)"/> - </g> - <use xlink:href="#c" width="100%" height="100%" transform="rotate(60)"/> - </g> - <use xlink:href="#d" width="100%" height="100%" transform="rotate(120)"/> - <use xlink:href="#d" width="100%" height="100%" transform="rotate(-120)"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/jp.svg b/inc/images/provisioning/flags/jp.svg deleted file mode 100644 index acc57aff..00000000 --- a/inc/images/provisioning/flags/jp.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-jp" viewBox="0 0 640 480"> - <defs> - <clipPath id="a"> - <path fill-opacity=".7" d="M-88 32h640v480H-88z"/> - </clipPath> - </defs> - <g fill-rule="evenodd" stroke-width="1pt" clip-path="url(#a)" transform="translate(88 -32)"> - <path fill="#fff" d="M-128 32h720v480h-720z"/> - <circle cx="523.1" cy="344.1" r="194.9" fill="#d30000" transform="translate(-168.4 8.6) scale(.76554)"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/kh.svg b/inc/images/provisioning/flags/kh.svg deleted file mode 100644 index 984e84e5..00000000 --- a/inc/images/provisioning/flags/kh.svg +++ /dev/null @@ -1,61 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="flag-icons-kh" viewBox="0 0 640 480"> - <path fill="#032ea1" d="M0 0h640v480H0z"/> - <path fill="#e00025" d="M0 120h640v240H0z"/> - <g fill="#fff" stroke="#000" transform="matrix(1.2 0 0 1.2 85.6 -522)"> - <g stroke-linejoin="bevel"> - <path d="M139 623.5h113.8v43.8H139z"/> - <path d="M247 647.6h3.5v16.5H247zm-108-8.1h113.8v5H139zm0-7h113.8v4.6H139z"/> - <path stroke-width=".9" d="M139 625.7h113.8v4.3H139z"/> - <path d="M169 647.6h3.6v16.5H169zm49 0h3.6v16.5H218zm-78 0h3.5v16.5H140zm7 0h3.5v16.5H147zm7.5 0h3.5v16.5h-3.5zm7.5 0h3.5v16.5H162zm62.8 0h3.6v16.5h-3.6zm7.5 0h3.6v16.5h-3.6zm7.5 0h3.6v16.5h-3.6z"/> - <path stroke-linejoin="miter" d="M94.5 669.5a9.3 9.3 0 0 0 4.4-5.3H292a9.3 9.3 0 0 0 4.4 5.3z"/> - </g> - <path d="M193 556.8s-.1-4.1 2.3-4.2c2.3 0 2.2 4.2 2.2 4.2zm-12.5 54.5v-5.5c0-2.8-2.8-3-2.8-5 0 0-.4-3 .4-4.4 1.1 4 3 3.3 3 1.6 0-1.4-1-2.8-3.3-6.3-.8-1.1-.3-4.6.7-5.9.4 3 .9 4.5 2.2 4.5.8 0 1.4-.5 1.4-2 0-2-1.3-3-2-4.8a5 5 0 0 1 1.1-5.3c.5 3 .4 4.2 1.7 4.2 2.7-.9 0-4.8-.6-5.8-.6-1.1 1-3.4 1-3.4.8 2.7 1 2.9 2 2.6 1.2-.3 1-2-.4-3.4-.9-1-.8-2.3.2-3.3 1 1.9 2.2 1.8 2.3.6l-.8-4.4H204l-.9 4.3c-.2 1.2 1.4 1.5 2.4-.5 1 1 1.1 2.4.2 3.3-1.4 1.4-1.6 3.1-.4 3.4 1 .3 1.2 0 2-2.6 0 0 1.5 1.5 1 3.4-.6 1-3.3 5-.6 5.8 1.3 0 1.2-1.2 1.7-4.2a5 5 0 0 1 1 5.3c-.6 1.8-2 2.8-2 4.8 0 1.5.7 2 1.5 2 1.3 0 1.8-1.4 2.2-4.5 1 1.3 1.5 4.8.7 6-2.3 3.4-3.4 4.8-3.4 6.2 0 1.7 2 2.4 3-1.6.9 1.4.5 4.4.5 4.4 0 2-2.7 2.2-2.8 5v5.5zm7.2-46-.4-3.1h15.9l-.4 3.1zm1-3.2-.2-2.5H202l-.3 2.5zm2.3-2.6-.3-2.6h9l-.1 2.6zm33 110c-2-.7-5-2.9-5-5v-24.3l2.6-3.4H169l2.5 3.4v24.3c0 2.1-2 4.3-4 5z"/> - <path stroke-linejoin="bevel" d="M178.2 647.6h3.6v16.5h-3.6zm30.4 0h3.6v16.5h-3.6z"/> - <path d="M168 609.2v27.6h54v-27.6a4.2 4.2 0 0 0-2.6 2.8v11.8h-48.7V612s-.6-2-2.8-2.8z"/> - <path d="M214.6 669.5c-1.8-.7-5.6-2.9-5.6-5v-27.2c.4-1.5 2.4-2.4 3.7-3.4H177c1.7 1 3.6 1.7 4.3 3.4v27.2c0 2.1-3 4.3-4.8 5z"/> - <path d="M219.4 634.2v-19.6h-4.9v-1.9h-38.8v2h-5v19.5zM207 669.5c-1.8-.7-4.3-2.9-4.3-5v-23.2l1.4-2.1h-17.7l1.5 2v23.3c0 2.1-2.6 4.3-4.3 5z"/> - <path d="M190.7 639.2h9v30.3h-9z"/> - <path stroke-linejoin="bevel" d="M204.4 632.5c0-2 5.8-2.1 8.8-3.8h-36c3 1.7 8.7 1.8 8.7 3.8l1.2 3.9 15 .6z"/> - <path d="M211.4 611.3c0-4.9.2-6.7 1.7-6.7V620c-3.7 1.4-6.3 6-6.3 6h-23.2s-2.6-4.6-6.3-6v-15.5c1.8 0 1.8 2 1.8 6.7zm1.7-2c0-5.6 4.9-6.2 4.9-6.2v5c-1.9-.1-2.8 1.6-2.8 4 0 2.5 1.5 2.5 1.5 2.5v14.2h-3.6z"/> - <path d="M177.3 609.3c0-5.6-4.9-6.2-4.9-6.2v5c1.9-.1 2.8 1.6 2.8 4 0 2.5-1.5 2.5-1.5 2.5v14.2h3.6z"/> - <g fill="none" stroke-width=".8"> - <path d="M186.8 570.6H204m-19.2 5.4h21m-23 6.5h24.9m-27 7.9h29.5m-30.2 9h30.4"/> - <path stroke-width="1" d="M170.8 629h48.6m-33.2 0h18v6.6h-18z"/> - </g> - <path d="M184 614.2c3 3.6 2.6 9.7 2.6 13.3H204c0-3.6-.4-9.7 2.6-13.3zm9.7-41-2.4-1.3v-3.5c1 .3 2 .4 2.2 2 .3-2.3 1-2.1 1.9-3 1 .9 1.5.7 1.9 3 0-1.6 1.2-1.7 2.1-2v3.5l-2.3 1.2z"/> - <path d="m193.5 578.9-4-2.8V573c1.5.3 3 .5 3.2 2.2.4-2.5 1.3-3.7 2.7-4.7 1.3 1 2.2 2.2 2.7 4.7.1-1.7 1.7-1.9 3-2.2v3.2l-3.9 2.7z"/> - <path d="m193.2 587.8-4.5-4v-4.7c1.6.4 3.4.6 3.6 3.1.5-3.5 1.5-5.4 3-6.8 1.6 1.4 2.6 3.3 3.2 6.8.2-2.5 2-2.7 3.6-3.1v4.7l-4.6 4zm8.4 5.3-4 5.7h-4.7l-4.1-5.7zm-15.2 9.5c2 1.1 2.8 3.4 3 7.6H201c.2-4.2 1-6.5 3-7.6z"/> - <path stroke-linejoin="bevel" d="M204.2 593v-5.6a5.2 5.2 0 0 0-3.8 3.3c0-2-2.5-6.3-5.2-8.5-2.7 2.4-5.3 6.4-5.2 8.4-.5-1.5-1.8-2.7-3.8-3.2v5.7z"/> - <path stroke-linejoin="bevel" d="M205 602.6V597c-2.1.6-3.5 1.7-4.1 3.3 0-2-2.7-6.3-5.7-8.5-3 2.5-5.8 6.4-5.7 8.5-.5-1.5-2-2.7-4.1-3.3v5.7z"/> - <path stroke-linejoin="bevel" d="M207.4 614.3v-6.6a9.6 9.6 0 0 0-5.1 3.8c0-3.5-4-9-7.1-10.7-3.2 1.8-7.1 7.4-7.1 10.7a9.7 9.7 0 0 0-5.2-3.8v6.6z"/> - <path stroke-linejoin="bevel" d="M206 629v-6.8c-2.4.9-3 3.1-3.8 4.7.3-6.9-3.8-14.2-7-16.1-3.2 1.9-7.4 9.4-7 16-.8-1.4-1.5-3.7-3.8-4.6v6.7z"/> - <path d="M204.4 639.2v-6.8c-2.5.6-2.6 1.5-3.4 3 .3-4.1-2.6-8.8-5.8-10.6-3.2 1.8-6 6.5-5.8 10.6-.8-1.5-.9-2.4-3.4-3v6.8z"/> - <g id="a"> - <path d="M99 664.2v-20.4c-.7-2.6-3-5-4.6-5.4v-18l3.7 2 4.3 18.9v23z"/> - <path d="M99 664.3v-20.5c-.7-2.6-3-5-4.6-5.4v-19.2c2.5 0 3.7 3.2 3.7 3.2l4.3 18.9v22.9z"/> - <path d="M96.3 669.5c1.7-.7 4.2-2.9 4.2-5v-25.6l-1.2-2H143l-1.7 2v25.6a6 6 0 0 0 3.4 5z"/> - <path d="M135.8 669.5c-1.7-.7-4.2-2.9-4.2-5v-24.3l3.6-3.4h-29.6l3.6 3.4v24.3c0 2.1-2.5 4.3-4.2 5z"/> - <path d="M131.7 669.5c-1.7-.7-4.3-2.9-4.3-5v-22l2.4-3.3H111l2.4 3.3v22c0 2.1-2.5 4.3-4.3 5z"/> - <path d="M116 639.2h8.9v30.4h-9z"/> - <path stroke-linejoin="bevel" d="M103.7 647.6h3.6v16.5h-3.6zm30.8 0h3.5v16.5h-3.6zm-33.9-27.8h4.4v17h-4.4zm0-3.2h4.3v3.2h-4.3zm35.6 6.9h6.1v13h-6.1z"/> - <path d="M104.9 636.6v-29c1.2 0 1.4 4.3 4.2 4.3 1.5 0 1.4-1.8.5-3.2-.7-1.3-1.6-3-.4-6.3.9 2.5 3.1 3.3 2.7 1.8-.7-2.7-2.8-3.2-1.2-7.3.5 3.4 2.7 3.3 2.2 1.3-.6-2.3-1.9-3.3-.3-6.5.9 3.7 2 3.5 2 1.2 0-3.4 0-7 4.2-8.3 0 0 .3-3 1.9-3 1.5 0 1.8 3 1.8 3 4.3 1.3 4.2 5 4.2 8.3 0 2.3 1.1 2.5 2-1.2 1.6 3.2.3 4.2-.3 6.5-.5 2 1.7 2.1 2.2-1.3 1.6 4.1-.5 4.6-1.2 7.3-.4 1.5 1.8.7 2.7-1.8 1.2 3.3.3 5-.4 6.3-.8 1.4-1 3.2.5 3.2 2.8 0 3-4.2 4.2-4.2v28.9zM98 614.7v22.1h2.5v-22.1c-.9-.5-1.7-.5-2.5 0z"/> - <path d="M98.2 629c3.1 1.6 6.2 3.5 7 7.8h-7zm43.2-6.6v14.4h2v-14.4c-.6-.3-1.5-.4-2 0z"/> - <path d="M143.4 629c-3.1 1.5-6.2 3.3-7 7.7h7zm-20.6-33.7 1.8-1.5v-2c-.6 0-1 .3-1.5 1a5 5 0 0 0-2.5-3 5 5 0 0 0-2.6 2.9c-.5-.7-.8-.8-1.5-1v2l1.8 1.6z"/> - <path d="m123.8 600.2.8-1.9v-2.5c-.6 0-1 .3-1.5 1a5 5 0 0 0-2.5-3 5 5 0 0 0-2.6 2.9c-.5-.7-.8-.8-1.5-.9v2.5l.8 1.9z"/> - <path d="m124 606.8 2.6-3.3v-3.2c-1 0-1.5.5-2.2 1.6-.7-2.3-2-2.7-3.8-3.8-1.9 1-3.2 1.5-3.8 3.7-.8-1.1-1.3-1.4-2.3-1.5v3.2l2.7 3.3z"/> - <path d="M124.7 613.3s3.2-2.7 3.3-4.2v-3.5c-1.2.1-2.3.4-3.2 1.9-.8-2.9-2-3.7-4.2-5-2.3 1.3-3.5 2.1-4.2 5-1-1.5-2-1.8-3.3-2v3.6a15 15 0 0 0 3.3 4.2z"/> - <path d="M126 625.3s4.4-4.7 4.5-6.6v-5.4c-1.6.2-3.2 1.3-4.4 3.6-1-4.5-2.6-7.6-5.5-9.8-3 2.2-4.6 5.3-5.6 9.8-1.2-2.3-2.7-3.4-4.3-3.6v5.4c.3 1.9 4.4 6.6 4.4 6.6z"/> - <path d="M126 632.4s3.7-3.7 4.5-5.3v-5.4c-1.6.2-3.2 1.3-4.4 3.5a14 14 0 0 0-5.5-9.2c-3 2.2-4.6 4.7-5.6 9.2-1.2-2.2-2.7-3.3-4.3-3.5v5.4c1 1.6 4.4 5.3 4.4 5.3z"/> - <path d="M127.5 636.6c-1-4.7-2-8.2-7.1-11.7-5.2 3.5-6.1 7-7.2 11.7z"/> - <path d="M130.2 639.2v-6.8c-2.4 1-4.5 2.3-5.3 3.8-.8-3.8-2.5-5.4-4.6-7.7-2.1 2.3-3.5 4-4.4 7.7-.8-1.5-2.9-2.9-5.2-3.8v6.8z"/> - </g> - <use xlink:href="#a" width="100%" height="100%" transform="matrix(-1 0 0 1 390.7 0)"/> - <path d="M72.7 694.3H318v12.5H72.7zm-6.5 12.5h258.3v12.5H66.2zm19.4-31.3H305v8.1H85.6z"/> - <path d="M79.2 683.6h232.4v10.6H79.2zm10.2-14.3h212v6.2h-212z"/> - <path d="M112.4 669.3h16v50h-16z"/> - <path d="M116 669.3h8.9v50h-9zm71 0h16v50h-16z"/> - <path d="M190.7 669.3h9v50h-9zm71.5 0h16v50h-16z"/> - <path d="M265.7 669.3h9v50h-9z"/> - <path fill="none" d="M99 664.2h193M115.8 713h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m65.8 37.5h8.6m-8.6-6.3h8.6m-8.6-6.2h8.6m-8.6-6.3h8.6m-8.6-6.2h8.6m-8.6-6.3h8.6m-8.6-6.2h8.6m66.2 37.5h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2m-9.2-6.3h9.2m-9.2-6.2h9.2"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/kr.svg b/inc/images/provisioning/flags/kr.svg deleted file mode 100644 index 39fa999e..00000000 --- a/inc/images/provisioning/flags/kr.svg +++ /dev/null @@ -1,24 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="flag-icons-kr" viewBox="0 0 640 480"> - <defs> - <clipPath id="a"> - <path fill-opacity=".7" d="M-95.8-.4h682.7v512H-95.8z"/> - </clipPath> - </defs> - <g fill-rule="evenodd" clip-path="url(#a)" transform="translate(89.8 .4) scale(.9375)"> - <path fill="#fff" d="M-95.8-.4H587v512H-95.8Z"/> - <g transform="rotate(-56.3 361.6 -101.3) scale(10.66667)"> - <g id="c"> - <path id="b" d="M-6-26H6v2H-6Zm0 3H6v2H-6Zm0 3H6v2H-6Z"/> - <use xlink:href="#b" width="100%" height="100%" y="44"/> - </g> - <path stroke="#fff" d="M0 17v10"/> - <path fill="#cd2e3a" d="M0-12a12 12 0 0 1 0 24Z"/> - <path fill="#0047a0" d="M0-12a12 12 0 0 0 0 24A6 6 0 0 0 0 0Z"/> - <circle cy="-6" r="6" fill="#cd2e3a"/> - </g> - <g transform="rotate(-123.7 191.2 62.2) scale(10.66667)"> - <use xlink:href="#c" width="100%" height="100%"/> - <path stroke="#fff" d="M0-23.5v3M0 17v3.5m0 3v3"/> - </g> - </g> -</svg> diff --git a/inc/images/provisioning/flags/kz.svg b/inc/images/provisioning/flags/kz.svg deleted file mode 100644 index 64776c38..00000000 --- a/inc/images/provisioning/flags/kz.svg +++ /dev/null @@ -1,23 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-kz" viewBox="0 0 640 480"> - <g fill-rule="evenodd"> - <path fill="#00abc2" d="M0 0h640v480H0z"/> - <g fill="#ffec2d"> - <path d="M60.2 467c3.3 3.2 2.2 8.5 11.3 7.8 13.8 0 14.2-8.4 14.2-14.3S65 446.4 64 437.7c-1-8.7 4.8-11 9.6-11 4.7 0 8 2.7 8 5.1S79.4 435 76 435s1.5-1.7-1.4-3-4.8 2-4.8 4c0 2.2 7.2 2.8 12 1.3 1 4.7 1.4 5-5.3 13 4.8-3.1 5.2-3.8 10.5-2-5.3-4.6-1.3-13.8-1.2-16.1s-1-5.1-3-6.5c-3.9-3.5-12.2-3.7-17.2-1.4-7.3 3.2-7.7 12.8-5.8 16L80 460.7c1.4 2.4 2 9.2-6.6 9.5-9 .7-12.2-11.6-13.8-15.7-2.1 4.5-4.5 16.8-13.6 16.1-8.6-.3-10.2-7-8.8-9.5l20.7-21c2-3.2 1.6-12.8-5.7-16-5-2.3-13.3-2-17.1 1.4-2.2 1.4-3.4 4.1-3.2 6.5s4.1 11.5-1.1 16c5.2-1.7 5.7-1 10.5 2-6.7-7.9-6.2-8.2-5.3-13 4.8 1.6 12 1 12-1.1s-2-5.6-4.9-4.2c-2.8 1.4 2 3.1-1.4 3.1-3.3 0-5.7-.7-5.7-3s3.3-5.3 8.1-5.3 10.5 2.4 9.5 11.1-22 18.1-22 24c0 6 1.4 13.1 15.2 13.1 9 .7 10.1-4.6 13.4-7.8z"/> - <path d="M59.1 343.3c3.3-3.2 6-12.6 15-12 13.8 0 19 7.7 19 13.6 0 5.9-28 54-29 62.7-1 8.7 4.8 11.1 9.5 11.1 4.8 0 8.1-2.7 8.1-5.2s-2.4-3-5.7-3 1.4 1.7-1.4 3-4.8-2-4.8-4.1c0-2.1 7.2-2.8 12-1.2.9-4.7 1.3-5-5.3-13 4.8 3 5.2 3.8 10.5 2-5.3 4.6-1.4 13.7-1.2 16s-1 5.2-3.1 6.6c-3.8 3.5-12.2 3.6-17.2 1.4-7.2-3.3-7.6-12.8-5.7-16L87 346.6c1.5-2.4-2.3-10.4-10.9-10.7-9-.7-12.1 8.8-13.7 12.9l12.3-1s.5 2 0 3.2a110 110 0 0 0-12.3 1.6l-.5 6.2h6l-.4 2.8s-5.1-.4-5.6 0c-.5.3-1 6.2-1 6.2s-1 .4-2 .4-2-.4-2-.4-.4-5.9-.9-6.2c-.5-.4-5.6 0-5.6 0l-.5-2.8H56l-.5-6.2s-6-1.2-12.3-1.6c-.4-1.2 0-3.1 0-3.1l12.3.9c-1.6-4.1-4.7-13.6-13.7-13-8.6.4-12.4 8.4-11 10.8L58 405.2c1.9 3.1 1.5 12.7-5.7 16-5 2.2-13.4 2-17.2-1.4-2.1-1.4-3.3-4.2-3.1-6.5s4-11.6-1.2-16c5.3 1.7 5.8 1 10.5-2.1-6.6 8-6.2 8.3-5.2 13 4.7-1.6 11.9-1 11.9 1.2 0 2-2 5.5-4.8 4.1-2.8-1.4 2-3-1.4-3-3.3 0-5.7.6-5.7 3s3.3 5.2 8 5.2 10.5-2.4 9.6-11c-1-8.7-29-57-29-62.8 0-6 5.2-13.5 19-13.5 9-.7 12.3 8.7 15.5 11.9z"/> - <path d="M59.1 319.4c3.3 3.2 6 12.6 15 12 13.8 0 19-7.7 19-13.6 0-5.9-28-54-29-62.7-1-8.7 4.8-11.1 9.5-11.1 4.8 0 8.1 2.7 8.1 5.2s-2.4 3-5.7 3 1.4-1.6-1.4-3-4.8 2-4.8 4.1c0 2.1 7.2 2.8 12 1.2.9 4.7 1.3 5-5.3 13 4.8-3 5.2-3.8 10.5-2-5.3-4.6-1.4-13.7-1.2-16s-1-5.2-3.1-6.6c-3.8-3.4-12.2-3.6-17.2-1.4-7.2 3.3-7.6 12.8-5.7 16L87 316c1.5 2.4-2.3 10.4-10.9 10.7-9 .7-12.1-8.8-13.7-12.9l12.3 1s.5-2 0-3.2a110 110 0 0 1-12.3-1.6l-.5-6.2h6l-.4-2.8s-5.1.4-5.6 0c-.5-.3-1-6.2-1-6.2s-1-.4-2-.4-2 .4-2 .4-.4 5.9-.9 6.2c-.5.4-5.6 0-5.6 0l-.5 2.8H56l-.5 6.2s-6 1.2-12.3 1.6c-.4 1.2 0 3.1 0 3.1l12.3-.9c-1.6 4.1-4.7 13.6-13.7 13-8.6-.4-12.4-8.4-11-10.8L58 257.5c1.9-3.2 1.5-12.7-5.7-16-5-2.2-13.4-2-17.2 1.4-2.1 1.4-3.3 4.2-3.1 6.5s4 11.5-1.2 16c5.3-1.7 5.8-1 10.5 2.1-6.6-8-6.2-8.3-5.2-13 4.7 1.6 11.9 1 11.9-1.2 0-2-2-5.5-4.8-4.1-2.8 1.4 2 3-1.4 3-3.3 0-5.7-.6-5.7-3s3.3-5.2 8-5.2 10.5 2.4 9.6 11c-1 8.7-29 57-29 62.8 0 6 5.2 13.5 19 13.5 9 .7 12.3-8.7 15.5-11.9z"/> - <path d="M59.1 160.6c3.3-3.2 6-12.6 15-12 13.8 0 19 7.7 19 13.6 0 5.9-28 54-29 62.8-1 8.6 4.8 11 9.5 11 4.8 0 8.1-2.7 8.1-5.1s-2.4-3.2-5.7-3.2 1.4 1.8-1.4 3.2-4.8-2.1-4.8-4.2c0-2 7.2-2.8 12-1.2.9-4.7 1.3-5-5.3-13 4.8 3.1 5.2 3.8 10.5 2-5.3 4.6-1.4 13.8-1.2 16s-1 5.2-3.1 6.6c-3.8 3.5-12.2 3.6-17.2 1.4-7.2-3.3-7.6-12.8-5.7-16L87 164c1.5-2.4-2.3-10.4-10.9-10.7-9-.7-12.1 8.8-13.7 12.9l12.3-1s.5 2 0 3.2c-6.4.4-12.3 1.6-12.3 1.6l-.5 6.2h6l-.4 2.8s-5.1-.3-5.6 0-1 6.3-1 6.3-1 .3-2 .3-2-.3-2-.3-.4-6-.9-6.3c-.5-.3-5.6 0-5.6 0l-.5-2.8H56l-.5-6.2s-6-1.2-12.3-1.6c-.4-1.2 0-3.1 0-3.1l12.3.9c-1.6-4.1-4.7-13.6-13.7-13-8.6.4-12.4 8.4-11 10.8L58 222.5c1.9 3.2 1.5 12.7-5.7 16-5 2.2-13.4 2-17.2-1.4-2.1-1.4-3.3-4.2-3.1-6.5s4-11.5-1.2-16c5.3 1.7 5.8 1 10.5-2.1-6.6 8-6.2 8.3-5.2 13 4.7-1.6 11.9-.9 11.9 1.2 0 2-2 5.5-4.8 4.1-2.8-1.3 2-3-1.4-3-3.3 0-5.7.6-5.7 3s3.3 5.2 8 5.2 10.5-2.4 9.6-11c-1-8.7-29-56.9-29-62.8 0-5.9 5.2-13.5 19-13.5 9-.7 12.3 8.7 15.5 12z"/> - <path d="M59.1 136.7c3.3 3.2 6 12.7 15 12 13.8 0 19-7.7 19-13.6 0-5.9-28-54-29-62.7-1-8.7 4.8-11.1 9.5-11.1 4.8 0 8.1 2.8 8.1 5.2s-2.4 3.1-5.7 3.1 1.4-1.7-1.4-3.1-4.8 2-4.8 4.1c0 2.1 7.2 2.8 12 1.2.9 4.7 1.3 5-5.3 13 4.8-3 5.2-3.8 10.5-2-5.3-4.5-1.4-13.7-1.2-16s-1-5.2-3.1-6.6c-3.8-3.4-12.2-3.6-17.2-1.3-7.2 3.2-7.6 12.8-5.7 15.9L87 133.4c1.5 2.4-2.3 10.4-10.9 10.8-9 .6-12.1-8.8-13.7-13l12.3 1s.5-2 0-3.2a111.5 111.5 0 0 1-12.3-1.5l-.5-6.3h6l-.4-2.8s-5.1.4-5.6 0c-.5-.3-1-6.2-1-6.2s-1-.4-2-.4-2 .4-2 .4-.4 5.9-.9 6.2c-.5.4-5.6 0-5.6 0l-.5 2.8H56l-.5 6.3s-6 1.1-12.3 1.5c-.4 1.3 0 3.2 0 3.2l12.3-1c-1.6 4.2-4.7 13.6-13.7 13-8.6-.4-12.4-8.4-11-10.8L58 74.8c1.9-3.1 1.5-12.7-5.7-16-5-2.2-13.4-2-17.2 1.4-2.1 1.4-3.3 4.2-3.1 6.5s4 11.6-1.2 16c5.3-1.7 5.8-1 10.5 2.1-6.6-8-6.2-8.3-5.2-13 4.8 1.6 11.9 1 11.9-1.2 0-2-2-5.5-4.8-4.1-2.8 1.4 2 3.1-1.4 3.1-3.3 0-5.7-.7-5.7-3.1s3.3-5.2 8-5.2 10.6 2.4 9.6 11c-1 8.7-29 57-29 62.8 0 6 5.2 13.6 19 13.6 9 .7 12.3-8.8 15.5-12z"/> - <path d="M60.2 13c3.3-3.2 2.2-8.5 11.3-7.8 13.8 0 14.2 8.4 14.2 14.3S65 33.6 64 42.3c-1 8.7 4.8 11 9.6 11 4.7 0 8-2.7 8-5.1S79.4 45 76 45s1.5 1.7-1.4 3-4.8-2-4.8-4c0-2.2 7.2-2.9 12-1.3 1-4.7 1.4-5-5.3-13 4.8 3.1 5.2 3.8 10.5 2-5.3 4.6-1.3 13.8-1.2 16.1s-1 5.1-3 6.5c-4 3.7-12.3 3.7-17.3 1.5-7.3-3.2-7.7-12.8-5.8-16L80 19.3c1.4-2.4 2-9.2-6.6-9.5-9-.7-12.2 11.6-13.8 15.7C57.5 21 55.1 8.6 46 9.3c-8.6.3-10.2 7-8.8 9.5l20.7 21c2 3.2 1.6 12.8-5.7 16-5 2.3-13.3 2.1-17.1-1.4-2.2-1.4-3.4-4.1-3.2-6.5s4.1-11.5-1.1-16c5.2 1.7 5.7 1 10.4-2-6.6 7.9-6.1 8.2-5.2 13 4.8-1.6 12-1 12 1.1s-2 5.6-4.9 4.2c-2.8-1.4 2-3.1-1.4-3.1-3.3 0-5.7.7-5.7 3s3.3 5.3 8.1 5.3 10.5-2.4 9.5-11.1-22-18.1-22-24c0-6 1.4-13.1 15.2-13.1 9-.7 10.1 4.6 13.4 7.8z"/> - </g> - <g fill="#ffec2d" transform="translate(-194.7 8.3) scale(1.0673)"> - <rect width="170.2" height="161.3" x="425.9" y="104.5" rx="85.1" ry="80.7"/> - <path d="M507 56.4c-.8 0-4.6 26.8-6 32.8-1.4 13.5 18 13 14.8-.5L507 56.3zm6.8 259.8c.7 0 6.5-26.5 8.4-32.4 2.3-13.3-17.1-14-15-.4l6.6 32.8zM378.2 184.6c0 .7 27.9 6.3 34.1 8.1 14 2.3 15-16 .6-14l-34.7 6zm271.7 3.2c0-.7-28.2-5.3-34.5-6.9-14.1-1.7-14.2 16.6 0 14.1l34.5-7.2zM406.8 99.6c-.5.5 17.9 21.3 21.6 26.4 9.6 10 22.3-4 9.6-10.8l-31.2-15.5zm211.1 171c.5-.5-19.7-19.7-23.9-24.4-10.5-9.2-21.8 5.7-8.6 11.5l32.5 13zm-169-200c-.6.3 8 26.1 9.4 32.2 4.8 12.7 22.2 4.4 13.2-6.5L449 70.6zM572 303c.7-.3-6-26.6-6.9-32.7-3.9-13-21.8-6-13.7 5.6l20.7 27zm30.3-214.4c-.6-.5-22.8 16.6-28.2 20-10.7 9 3.8 21.2 11.2 9.3l17-29.3zm-183 193.7c.5.5 24-15 29.6-18.1 11.3-8.2-2.2-21.4-10.5-10l-19 28.1zm-35-144.1c-.3.6 24 14.7 29.3 18.4 12.5 6.5 19.8-10.5 5.5-13.2l-34.8-5.2zM638 236.6c.3-.6-23-16.3-28-20.3-12-7.4-20.5 9.1-6.4 12.7l34.4 7.6zM557.4 63.7c-.7-.2-14.6 23.4-18.3 28.5a7.8 7.8 0 0 0 14 4.7l4.3-33.2zM463.5 308c.7.3 16.3-22.4 20.3-27.3 7.3-11.6-10.4-19-13.7-5.6l-6.6 32.9zM386 238.7c.3.6 28-6 34.5-7 13.6-3.8 6-20.6-6-12.8L386 238.7zM638.1 136c-.2-.6-28.3 4.1-34.8 4.7-14 2.9-7.5 20.2 5 13.2l29.8-17.9z"/> - <path d="M534.6 58.1c-.7-.1-10.1 25.4-12.9 31-4.1 13 15 16.2 14.7 2.4L534.7 58zM486.1 314c.7.2 12-24.7 15.2-30.2 5-12.6-13.8-17-14.5-3.3L486 314zm-9.7-253.4c-.7.2 1.9 27.2 1.9 33.4 1.9 13.3 20.6 8.7 14.4-3.7l-16.3-29.7zm68 251.9c.7-.1 0-27.2.5-33.4-.9-13.5-20-10.1-14.6 2.7l14 30.7zM428.2 83c-.6.4 12.7 24.3 15.2 30 7.2 11.7 22.7.7 11.8-8.6l-27-21.4zM593 290.9c.6-.4-11-25.2-13-31-6.3-12.1-22.5-2.1-12.4 7.8l25.4 23.2zM393 116.6c-.4.6 21.1 18.4 25.6 23 11.1 8.4 21.4-7.2 7.8-12.1L393 116.6zm234.2 139.7c.4-.6-19.7-19.8-23.9-24.6-10.4-9.1-21.8 5.8-8.6 11.6l32.5 13zm-249.6-97.8c-.2.7 26.3 10.8 32.1 13.7 13.4 4.5 17.7-13.4 3.1-13.8l-35.2.1zM645 216.3c.3-.6-25.4-12.4-31-15.7-13-5.4-18.7 12.2-4.2 13.6l35.2 2.1zM376.7 210c.1.6 28.7.2 35.2.7 14.2-.7 10.8-18.8-2.8-13.9L376.7 210zm270.2-45c0-.7-28.6-2.2-35-3.1-14.3-.2-12.2 18.1 1.7 14l33.3-11zm-245.7 98.4c.4.6 26-11.6 32-13.9 12.4-6.5 1-21.4-8.9-11.3l-23.1 25.2zm222.3-152.3c-.4-.6-26.7 9.9-33 11.8-12.9 5.7-2.6 21.3 8 11.9l25-23.7zM442.8 298.8c.6.3 18.9-20.5 23.5-24.9 8.7-10.7-8-20-12.9-7l-10.6 31.9zM582.5 75c-.5-.4-20.3 19.1-25.2 23.2-9.4 10.1 6.6 20.5 12.4 7.9L582.4 75z"/> - <g transform="matrix(2.1824 0 0 2.0629 -405 -272.6)"> - <path d="M360.1 247.9c.7 2.5.8 16.5 14.9 30 14 13.4 38 16.4 38 16.4s.1 1.9-1.6 2c-1.7.2-9.9-1.5-14-2.8-4-1.2-7.6-3.4-8-3.3-.5.2-1.3 1.6-2.5 1.4s-7-6.2-9.6-7.8a80.6 80.6 0 0 1-13.7-15.3c-2.8-4.5-3.5-7.5-4.4-7.5s-4.2 2.2-4.2 2.2-3-4.5-5.6-11.7c-2.7-7.2-2.4-11.4-1.8-11.7.7-.3.7 5.3 2.7 10.4 2 5.2 4.8 6.8 4.8 6.8s-1.8-2.7-3.2-9.4-2-13.2-1-15.2 1.9-2.6 2-2.5c.2.2-1.7 3.1-.4 10.8s4.8 14.2 5.6 13.9c.8-.3-.5-1.9-1-6.4s.5-7.3 1.6-7.7c.5-.4 1.3 5 1.4 7.4zm-9.8 12.8c-2.7-2.5-6.9-11.2-7.8-10.8-1 .5 6.8 13 7 14 .2 1.2 1.9 4.6.6 4.1s-10.6-10.3-9.5-8.4 8.1 10.5 7.7 11-5.8-4.8-6-4.1c-.1.6 5.3 5.8 5.2 6.4s-3.5-3.3-3.5-2.5 3.5 4.7 3.5 5.3-3-2.8-2-1c.9 2 3.5 3.7 3.4 4.3s-2.2-.8-2.2-.5c0 .3 3.9 1.7 4.8 2.8 1 1.1 7.4 8.5 12.2 12.2s18.6 10.2 19.6 10.2c.9 0 2.3-2 2-2.8-.3-.8-13.8-5.4-17.5-8.8-3.8-3.4-13-11.6-13.8-12-.7-.5-2.8-.3-2.8-.8s2.7.3 2.5 0c-.1-.3-3.7-1.9-3.6-2.2.2-.3 2.5.6 2.5.3s-4.2-2.6-4-3.1c.1-.5 3.1 1.4 3.1 1 0-.2-4-3-3.9-3.5.1-.5 3.1 2.2 3 1.6s-2.4-4-2.4-4.4c0-.5 3.6 3.4 4 2.6.2-.7-1.3-7.2-1.2-7.3s2.7 1.4 3.1.5c.5-1-1.8-2.3-4-4.1zm46.1 49.2c-1.9.3-2.8-.4-1.7-2 1.5 0 5.5-1.3 6.9-1.9s2.9-1.4 4.1-2.5c1.2-1.3 2 .7 1.3 1.8-.5.7-2.8 2-4.5 2.7-2.5.8-4.7 2-6.1 1.9zm12.5-5.1c-1.3-1.4-.2-2.4 1.7-3.5 2.8-1.5 2-3.6 5.6-5.3 1.6-1 24-10 31.3-14.8s27.8-20.3 33.3-31c5.4-10.6 2.8-11.4 3.6-11.8.7-.5 1.5 1.5 1.4 3.9-.2 2.3-2 9.3-1.4 10s8.2-5.5 11.4-13 5.6-15.3 7.1-15.3c1.6 0-2.6 12.8-5.3 17.8-2.6 5-5.7 7.5-5 8.6.8 1 8.6-5.5 11.3-10.3 2.6-4.9 5.1-9.2 5.6-8.3a34 34 0 0 1-6.7 16.1c-4.2 4.8-9.2 8.3-8.4 9 .7.8 6.4 1.6 12.3-2.4 6-4.1 6.6-10 7.3-9.7.8.3-.7 8.4-6.4 13.4s-13.2 5.5-13 6.6c.4 1 16.3-4.6 16-3.3-.3 1.2-20.6 9.2-20.8 10 0 .6 3.5.8 9-.5 5.4-1.2 10.6-5.5 11.3-4.5.2 1.4-3.9 4.8-10.1 6.4-6.3 1.6-9.4 3.7-9.6 4.2-.1.5 11.2-1.4 11.2-.8s-14.8 3.5-14.9 4.3c-.2.7 14-2.9 13.8-2-.4.7-19.3 6.3-19.1 6.6.1.4 15.8-3.4 15.5-2.8-.4.7-26.4 8-26.6 8.5-.2.4 23-5.2 22.8-4.7s-12 3.4-12 3.7c0 .3 9.5-1.5 9.3-1-.1.4-24 6.5-24.5 7.4-.5 1 12.4-2.5 12.2-.7s-27.7 11-27.8 9.3c-.2-1.7 16.7-6 16.6-6.5-.2-.5-9.7 1-9.9.1-.1-1 6.3-3 5.8-3.4-.5-.5-5.3 1.4-4.9.3.5-1.1 9.6-5.3 9.4-5.6-.1-.3-3.3 1-3 0 .4-1.1 19.7-6.7 19.4-7.4-.3-.6-8.9 1.4-9.7 1.6-.3-.6 12-5.2 11.8-6-.4-.7-6.6 2.7-7 1.8-.2-1 10.9-5.3 10.2-6s-5.7 1.8-6.4 1.1 10.5-8.4 8.8-8.6c-1.7-.1-3.8 2.4-4 .8.2-2 8.7-5.3 6.8-6.9-3-.9-13.1.7-17.3 3.2s-18.2 16.4-21.6 18.6c-3.4 2.1-15 7-17.2 8-3.4 1.2-4 3-7.5 4.8-6.3 1.7-6.2 3.6-9.2 4.7-1.1.3-12.4 5.7-12.5 5.3zm-15.8 7c-1.9 1-3.6 3.4-2.5 4.4.6 1.2 2.5-2.7 4-2.5l8 .4c4.3.3 6.4-.9 8.8-.7s7.7-1.3 10.2-1.3 3 .3 3.2-.8c.3-1-7.8-.3-11.4-.4-3.6-.2-8.1.7-10.8.7-2.5-.1-6.8-.9-9.5.2z"/> - <rect width="3.4" height="3" x="401.7" y="309.1" rx="1.7" ry="1.5"/> - <path d="M445 307.7c1.7-.3 6.3 1.3 9.5 2 5.8 2.3 16.6 1.2 16.6 2.3s-.7 2.4-3.2 2.6-8.8-1-8.6-1 5 2.3 3.6 2.9-5.5-1.3-6.2-.8 3.8 1.4 3 1.7c-.6.3-3.7-.4-4.7-.3-1 .2.8 1.3-.4 1.7-1.2.5-3.2-.6-4-.3-.9.3 1.8 2 .6 2.2-1.2.2-4-.8-5.6-1-1.6 0 1.5 1.6.5 1.8-1 .1-3.8-1.3-4.5-1.3s0 2-1 2-2.2-1.7-2.8-1.7 0 2-1 2-1.4-2.1-2.2-2c-1 .2 0 2.7-1.4 2.5-1.3-.1-1.5-2.6-2.6-2.5-1 .2.2 2.5-.8 2.5s-1.2-2.3-2.2-2.5c-1-.1-.6 2.2-1.2 2.2s-1.2-2.2-1.6-2.2c-.3 0 0 2.2-1.2 2s-1.2-2.4-1.5-2.3c-.4.2-.4 1.8-1.2 1.8s-.9-1.6-1.2-1.4c-.4.1-1.6 2.1-2.4 1.8-.9-.3.2-1.9-.2-1.9s-1.4 1.1-2 1 0-1.4-.2-1.4-1.7.8-2.4.8-2.6 1-3.1.1c-.5-1 1.3-1 1.7-1.9.3-.9-1-3.6.4-4.5 1.3-1 5.6 1.3 12-.3 11.6-3.1 20.6-6.7 21.5-6.6z"/> - </g> - </g> - </g> -</svg> diff --git a/inc/images/provisioning/flags/lu.svg b/inc/images/provisioning/flags/lu.svg deleted file mode 100644 index c31d2bfa..00000000 --- a/inc/images/provisioning/flags/lu.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-lu" viewBox="0 0 640 480"> - <path fill="#00a1de" d="M0 240h640v240H0z"/> - <path fill="#ed2939" d="M0 0h640v240H0z"/> - <path fill="#fff" d="M0 160h640v160H0z"/> -</svg> diff --git a/inc/images/provisioning/flags/nl.svg b/inc/images/provisioning/flags/nl.svg deleted file mode 100644 index 4faaf498..00000000 --- a/inc/images/provisioning/flags/nl.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-nl" viewBox="0 0 640 480"> - <path fill="#21468b" d="M0 0h640v480H0z"/> - <path fill="#fff" d="M0 0h640v320H0z"/> - <path fill="#ae1c28" d="M0 0h640v160H0z"/> -</svg> diff --git a/inc/images/provisioning/flags/pl.svg b/inc/images/provisioning/flags/pl.svg deleted file mode 100644 index 0fa51452..00000000 --- a/inc/images/provisioning/flags/pl.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-pl" viewBox="0 0 640 480"> - <g fill-rule="evenodd"> - <path fill="#fff" d="M640 480H0V0h640z"/> - <path fill="#dc143c" d="M640 480H0V240h640z"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/ru.svg b/inc/images/provisioning/flags/ru.svg deleted file mode 100644 index f4d27efc..00000000 --- a/inc/images/provisioning/flags/ru.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ru" viewBox="0 0 640 480"> - <g fill-rule="evenodd" stroke-width="1pt"> - <path fill="#fff" d="M0 0h640v480H0z"/> - <path fill="#0039a6" d="M0 160h640v320H0z"/> - <path fill="#d52b1e" d="M0 320h640v160H0z"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/se.svg b/inc/images/provisioning/flags/se.svg deleted file mode 100644 index 0e41780e..00000000 --- a/inc/images/provisioning/flags/se.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-se" viewBox="0 0 640 480"> - <path fill="#005293" d="M0 0h640v480H0z"/> - <path fill="#fecb00" d="M176 0v192H0v96h176v192h96V288h368v-96H272V0h-96z"/> -</svg> diff --git a/inc/images/provisioning/flags/sg.svg b/inc/images/provisioning/flags/sg.svg deleted file mode 100644 index c0d3d083..00000000 --- a/inc/images/provisioning/flags/sg.svg +++ /dev/null @@ -1,13 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-sg" viewBox="0 0 640 480"> - <defs> - <clipPath id="a"> - <path fill-opacity=".7" d="M0 0h640v480H0z"/> - </clipPath> - </defs> - <g fill-rule="evenodd" clip-path="url(#a)"> - <path fill="#fff" d="M-20 0h720v480H-20z"/> - <path fill="#df0000" d="M-20 0h720v240H-20z"/> - <path fill="#fff" d="M146 40.2a84.4 84.4 0 0 0 .8 165.2 86 86 0 0 1-106.6-59 86 86 0 0 1 59-106c16-4.6 30.8-4.7 46.9-.2z"/> - <path fill="#fff" d="m133 110 4.9 15-13-9.2-12.8 9.4 4.7-15.2-12.8-9.3 15.9-.2 5-15 5 15h15.8zm17.5 52 5 15.1-13-9.2-12.9 9.3 4.8-15.1-12.8-9.4 15.9-.1 4.9-15.1 5 15h16zm58.5-.4 4.9 15.2-13-9.3-12.8 9.3 4.7-15.1-12.8-9.3 15.9-.2 5-15 5 15h15.8zm17.4-51.6 4.9 15.1-13-9.2-12.8 9.3 4.8-15.1-12.9-9.4 16-.1 4.8-15.1 5 15h16zm-46.3-34.3 5 15.2-13-9.3-12.9 9.4 4.8-15.2-12.8-9.4 15.8-.1 5-15.1 5 15h16z"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/tr.svg b/inc/images/provisioning/flags/tr.svg deleted file mode 100644 index a92804f8..00000000 --- a/inc/images/provisioning/flags/tr.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-tr" viewBox="0 0 640 480"> - <g fill-rule="evenodd"> - <path fill="#e30a17" d="M0 0h640v480H0z"/> - <path fill="#fff" d="M407 247.5c0 66.2-54.6 119.9-122 119.9s-122-53.7-122-120 54.6-119.8 122-119.8 122 53.7 122 119.9z"/> - <path fill="#e30a17" d="M413 247.5c0 53-43.6 95.9-97.5 95.9s-97.6-43-97.6-96 43.7-95.8 97.6-95.8 97.6 42.9 97.6 95.9z"/> - <path fill="#fff" d="m430.7 191.5-1 44.3-41.3 11.2 40.8 14.5-1 40.7 26.5-31.8 40.2 14-23.2-34.1 28.3-33.9-43.5 12-25.8-37z"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/ua.svg b/inc/images/provisioning/flags/ua.svg deleted file mode 100644 index a339eb1b..00000000 --- a/inc/images/provisioning/flags/ua.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ua" viewBox="0 0 640 480"> - <g fill-rule="evenodd" stroke-width="1pt"> - <path fill="gold" d="M0 0h640v480H0z"/> - <path fill="#0057b8" d="M0 0h640v240H0z"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/us.svg b/inc/images/provisioning/flags/us.svg deleted file mode 100644 index 73b62457..00000000 --- a/inc/images/provisioning/flags/us.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-us" viewBox="0 0 640 480"> - <g fill-rule="evenodd"> - <g stroke-width="1pt"> - <path fill="#bd3d44" d="M0 0h912v37H0zm0 73.9h912v37H0zm0 73.8h912v37H0zm0 73.8h912v37H0zm0 74h912v36.8H0zm0 73.7h912v37H0zM0 443h912V480H0z"/> - <path fill="#fff" d="M0 37h912v36.9H0zm0 73.8h912v36.9H0zm0 73.8h912v37H0zm0 73.9h912v37H0zm0 73.8h912v37H0zm0 73.8h912v37H0z"/> - </g> - <path fill="#192f5d" d="M0 0h364.8v258.5H0z"/> - <path fill="#fff" d="m30.4 11 3.4 10.3h10.6l-8.6 6.3 3.3 10.3-8.7-6.4-8.6 6.3L25 27.6l-8.7-6.3h10.9zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.2 10.3-8.6-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.6zm60.8 0 3.3 10.3H166l-8.6 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.4-10.2-8.8-6.3h10.7zm60.8 0 3.3 10.3h10.7l-8.6 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.3 10.3h10.8l-8.8 6.3 3.4 10.3-8.7-6.4-8.7 6.3 3.4-10.2-8.8-6.3h10.8zM60.8 37l3.3 10.2H75l-8.7 6.2 3.2 10.3-8.5-6.3-8.7 6.3 3.1-10.3-8.4-6.2h10.7zm60.8 0 3.4 10.2h10.7l-8.8 6.2 3.4 10.3-8.7-6.3-8.7 6.3 3.3-10.3-8.7-6.2h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.2 3.3 10.3-8.7-6.3-8.7 6.3 3.3-10.3-8.6-6.2H179zm60.8 0 3.4 10.2h10.7l-8.8 6.2 3.4 10.3-8.7-6.3-8.6 6.3 3.2-10.3-8.7-6.2H240zm60.8 0 3.3 10.2h10.8l-8.7 6.2 3.3 10.3-8.7-6.3-8.7 6.3 3.3-10.3-8.6-6.2h10.7zM30.4 62.6l3.4 10.4h10.6l-8.6 6.3 3.3 10.2-8.7-6.3-8.6 6.3L25 79.3 16.3 73h10.9zm60.8 0L94.5 73h10.8l-8.7 6.3 3.2 10.2-8.6-6.3-8.7 6.3 3.3-10.3-8.6-6.3h10.6zm60.8 0 3.3 10.3H166l-8.6 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.3-8.7-6.3h10.8zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.8-6.3h10.7zm60.8 0 3.3 10.3h10.7l-8.6 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.3-8.6-6.3h10.7zm60.8 0 3.3 10.3h10.8l-8.8 6.3 3.4 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.8-6.3h10.8zM60.8 88.6l3.3 10.2H75l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.4 10.2h10.7l-8.8 6.3 3.4 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3H179zm60.8 0 3.4 10.2h10.7l-8.7 6.3 3.3 10.3-8.7-6.4-8.6 6.3 3.2-10.2-8.7-6.3H240zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zM30.4 114.5l3.4 10.2h10.6l-8.6 6.3 3.3 10.3-8.7-6.4-8.6 6.3L25 131l-8.7-6.3h10.9zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.2 10.2-8.6-6.3-8.7 6.3 3.3-10.2-8.6-6.3h10.6zm60.8 0 3.3 10.2H166l-8.6 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.4-10.2-8.8-6.3h10.7zm60.8 0 3.3 10.2h10.7L279 131l3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.3 10.2h10.8l-8.8 6.3 3.4 10.3-8.7-6.4-8.7 6.3L329 131l-8.8-6.3h10.8zM60.8 140.3l3.3 10.3H75l-8.7 6.2 3.3 10.3-8.7-6.4-8.7 6.4 3.3-10.3-8.6-6.3h10.7zm60.8 0 3.4 10.3h10.7l-8.8 6.2 3.4 10.3-8.7-6.4-8.7 6.4 3.3-10.3-8.7-6.3h10.8zm60.8 0 3.3 10.3h10.8l-8.7 6.2 3.3 10.3-8.7-6.4-8.7 6.4 3.3-10.3-8.6-6.3H179zm60.8 0 3.4 10.3h10.7l-8.7 6.2 3.3 10.3-8.7-6.4-8.6 6.4 3.2-10.3-8.7-6.3H240zm60.8 0 3.3 10.3h10.8l-8.7 6.2 3.3 10.3-8.7-6.4-8.7 6.4 3.3-10.3-8.6-6.3h10.7zM30.4 166.1l3.4 10.3h10.6l-8.6 6.3 3.3 10.1-8.7-6.2-8.6 6.2 3.2-10.2-8.7-6.3h10.9zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.3 10.1-8.7-6.2-8.7 6.2 3.4-10.2-8.7-6.3h10.6zm60.8 0 3.3 10.3H166l-8.6 6.3 3.3 10.1-8.7-6.2-8.7 6.2 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.3h10.8l-8.7 6.3 3.3 10.1-8.7-6.2-8.7 6.2 3.4-10.2-8.8-6.3h10.7zm60.8 0 3.3 10.3h10.7l-8.6 6.3 3.3 10.1-8.7-6.2-8.7 6.2 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.3 10.3h10.8l-8.8 6.3 3.4 10.1-8.7-6.2-8.7 6.2 3.4-10.2-8.8-6.3h10.8zM60.8 192l3.3 10.2H75l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm60.8 0 3.4 10.2h10.7l-8.8 6.3 3.4 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.7-6.3h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3H179zm60.8 0 3.4 10.2h10.7l-8.7 6.3 3.3 10.3-8.7-6.4-8.6 6.3 3.2-10.2-8.7-6.3H240zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.3-8.7-6.4-8.7 6.3 3.3-10.2-8.6-6.3h10.7zM30.4 217.9l3.4 10.2h10.6l-8.6 6.3 3.3 10.2-8.7-6.3-8.6 6.3 3.2-10.3-8.7-6.3h10.9zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.7-6.3h10.6zm60.8 0 3.3 10.2H166l-8.4 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.3-8.7-6.3h10.8zm60.8 0 3.3 10.2h10.8l-8.7 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.8-6.3h10.7zm60.8 0 3.3 10.2h10.7l-8.6 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.3-8.6-6.3h10.7zm60.8 0 3.3 10.2h10.8l-8.8 6.3 3.4 10.2-8.7-6.3-8.7 6.3 3.4-10.3-8.8-6.3h10.8z"/> - </g> -</svg> diff --git a/inc/images/provisioning/flags/za.svg b/inc/images/provisioning/flags/za.svg deleted file mode 100644 index ea1937f3..00000000 --- a/inc/images/provisioning/flags/za.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-za" viewBox="0 0 640 480"> - <defs> - <clipPath id="a"> - <path fill-opacity=".7" d="M-71.9 0h682.7v512H-71.9z"/> - </clipPath> - </defs> - <g clip-path="url(#a)" transform="translate(67.4) scale(.93748)"> - <g fill-rule="evenodd" stroke-width="1pt"> - <path d="M-71.9 407.8V104.4L154 256.1-72 407.8z"/> - <path fill="#00c" d="m82.2 512.1 253.6-170.6H696V512H82.2z"/> - <path fill="red" d="M66 0h630v170.8H335.7S69.3-1.7 66 0z"/> - <path fill="#fc0" d="M-71.9 64v40.4L154 256-72 407.8v40.3l284.5-192L-72 64z"/> - <path fill="#093" d="M-71.9 64V0h95l301.2 204h371.8v104.2H324.3L23 512h-94.9v-63.9l284.4-192L-71.8 64z"/> - <path fill="#fff" d="M23 0h59.2l253.6 170.7H696V204H324.3L23 .1zm0 512.1h59.2l253.6-170.6H696v-33.2H324.3L23 512z"/> - </g> - </g> -</svg> diff --git a/inc/images/provisioning/oss/.DS_Store b/inc/images/provisioning/oss/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**<q8>++&mCkOWA81W14cNZ<zv;LbK1Poaz?KmsK2CSc!( z0ynLxE!0092;Krf2c+FF_Fe*7ECH>lEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0<F0fCPF1$Cyrb|F7^5{eNG?83~ZUUlGt@xh*qZDeu<Z%US-OSsOPv j)R!Z4KLME7ReXlK;d!wEw5GODWMKRea10D2@KpjYNUI8I diff --git a/inc/images/provisioning/oss/centos.svg b/inc/images/provisioning/oss/centos.svg deleted file mode 100644 index 1ed0f7bd..00000000 --- a/inc/images/provisioning/oss/centos.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="15" height="15" viewBox="0.038 0.038 25.514 25.514" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><path d="m10.786 11.864 0.922 0.918 -0.922 0.917H4.29v3.057L0.329 12.782l3.961 -3.907v2.99h6.496Zm2.855 -7.807H21.535v7.893H13.642V4.057Z" fill="#932279"/><path d="m13.727 10.786 -0.917 0.922 -0.917 -0.922V4.29h-3.058L12.81 0.329l3.907 3.961h-2.99v6.496Zm-0.085 2.855H21.535V21.535H13.642V13.642Z" fill="#EFA724"/><path d="m14.806 13.727 -0.922 -0.917 0.922 -0.917h6.496v-3.058l3.962 3.975 -3.962 3.907v-2.99h-6.496Zm-10.748 -0.085h7.893V21.535H4.057V13.642Z" fill="#262577"/><path d="m11.864 14.806 0.917 -0.922 0.918 0.922v6.496h3.057l-3.975 3.961 -3.907 -3.961h2.99v-6.496ZM4.057 4.057h7.893v7.893H4.057V4.057Z" fill="#9CCD2A"/><path d="M3.775 3.775h8.457v8.457H3.775V3.775Zm0.563 7.893H11.667V4.34H4.34v7.328ZM13.359 3.775h8.457v8.457H13.359V3.775Zm0.563 7.893h7.328V4.34H13.923v7.328Zm-0.563 1.692h8.457v8.457H13.359V13.36Zm0.563 7.893h7.328V13.925H13.923v7.328ZM3.775 13.36h8.457v8.457H3.775V13.36Zm0.563 7.893H11.667V13.925H4.34v7.328Z" fill="#FFF"/><path d="M6.02 18.775 0.04 12.796l5.978 -5.979 5.98 5.98 -5.98 5.98ZM0.837 12.796l5.182 5.182 5.182 -5.182 -5.182 -5.182 -5.182 5.182Zm11.96 -0.797 -5.98 -5.979L12.796 0.038l5.98 5.98 -5.98 5.98ZM7.613 6.02l5.182 5.182 5.182 -5.182 -5.182 -5.182 -5.182 5.182Zm11.96 12.757 -5.98 -5.98 5.98 -5.98 5.98 5.98 -5.98 5.98Zm-5.182 -5.98 5.182 5.182 5.182 -5.182 -5.182 -5.182 -5.182 5.182Zm-1.595 12.757 -5.98 -5.981 5.98 -5.98 5.98 5.98 -5.98 5.98Zm-5.183 -5.981 5.182 5.182 5.182 -5.182 -5.182 -5.182 -5.182 5.182Z" fill="#FFF"/></svg> diff --git a/inc/images/provisioning/oss/debian.svg b/inc/images/provisioning/oss/debian.svg deleted file mode 100644 index 0808548a..00000000 --- a/inc/images/provisioning/oss/debian.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="15" height="18.574" viewBox="0 0 15 18.574" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><g fill="#A80030"><path d="M8.953 9.81c-.308.004.058.159.46.22a4.06 4.06 0 0 0 .301-.259c-.25.061-.505.063-.761.039m1.651-.412c.183-.252.317-.529.364-.816-.041.205-.152.381-.256.567-.575.362-.054-.215 0-.435-.619.779-.085.467-.108.684m.61-1.586c.037-.554-.109-.379-.158-.167.057.03.102.39.158.167M7.786.24c.164.029.355.052.328.091.18-.04.221-.076-.328-.091m.328.091-.116.024.108-.01.008-.014"/><path d="M13.234 8.022c.019.498-.145.739-.293 1.167l-.266.133c-.217.422.021.268-.135.604-.339.302-1.03.945-1.252 1.004-.161-.004.11-.191.145-.264-.455.312-.365.469-1.06.658l-.021-.045c-1.715.807-4.097-.792-4.066-2.974-.018.139-.052.104-.09.16-.089-1.123.518-2.25 1.542-2.711 1.001-.495 2.175-.292 2.892.377-.394-.517-1.178-1.064-2.107-1.012-.911.014-1.762.593-2.046 1.221-.467.293-.521 1.131-.724 1.285-.274 2.009.514 2.878 1.847 3.899.21.141.059.163.087.27a3.614 3.614 0 0 1-1.181-.903c.177.259.368.511.614.708-.417-.141-.975-1.011-1.138-1.047.72 1.289 2.92 2.26 4.072 1.778-.533.02-1.21.011-1.809-.21-.252-.13-.594-.398-.533-.448 1.572.587 3.196.445 4.557-.646.346-.269.724-.728.833-.734-.165.247.028.119-.098.337.345-.556-.15-.226.356-.96l.187.258c-.069-.462.573-1.023.508-1.753.148-.223.165.241.008.754.217-.57.057-.661.113-1.131.06.158.14.326.18.492-.141-.55.145-.927.216-1.247-.07-.031-.218.244-.252-.407.005-.282.079-.148.107-.218-.055-.031-.201-.248-.29-.663.065-.098.172.253.259.267-.056-.33-.153-.582-.156-.835-.256-.534-.091.071-.298-.229-.271-.847.226-.197.259-.582.412.597.647 1.521.754 1.904a7.809 7.809 0 0 0-.377-1.357c.125.053-.201-.96.162-.289-.388-1.43-1.663-2.766-2.836-3.393.144.131.325.296.26.322-.583-.348-.481-.375-.564-.521-.475-.194-.506.015-.821 0C9.883.566 9.711.617 8.887.319l.037.175c-.593-.197-.691.075-1.332.001-.039-.031.205-.11.407-.14-.574.076-.547-.113-1.108.021.138-.097.284-.161.432-.244-.468.029-1.117.273-.917.051-.762.34-2.117.818-2.878 1.531l-.024-.16c-.348.419-1.519 1.249-1.612 1.791l-.094.022c-.181.307-.298.655-.442.971-.237.404-.348.155-.314.219-.466.945-.698 1.74-.898 2.391.143.214.003 1.284.057 2.14-.234 4.23 2.969 8.337 6.47 9.285.513.183 1.276.176 1.925.195-.766-.219-.865-.116-1.611-.376-.538-.254-.656-.543-1.037-.874l.151.267c-.748-.265-.435-.327-1.043-.52l.161-.21c-.242-.019-.642-.409-.751-.625l-.265.011c-.318-.393-.488-.676-.476-.896l-.085.153c-.097-.167-1.172-1.474-.615-1.17-.103-.094-.241-.154-.39-.425l.113-.13c-.268-.345-.493-.787-.476-.935.143.194.242.23.341.263-.678-1.681-.716-.093-1.229-1.711l.108-.009c-.083-.125-.133-.261-.2-.395l.047-.471c-.488-.564-.136-2.398-.066-3.404.049-.409.407-.844.68-1.527l-.166-.029c.317-.553 1.812-2.223 2.504-2.137.336-.422-.066-.002-.132-.108.737-.762.969-.539 1.466-.676.536-.318-.46.124-.206-.121.927-.237.657-.539 1.866-.659.128.073-.296.112-.402.207.772-.378 2.444-.292 3.53.209 1.26.589 2.675 2.33 2.731 3.967l.064.017c-.033.651.099 1.404-.129 2.096l.155-.328"/><path d="m5.595 10.232-.043.216c.202.275.362.572.62.787-.185-.363-.323-.512-.577-1.003m.478-.018c-.107-.119-.171-.261-.241-.403.067.249.206.464.335.682l-.094-.279m8.458-1.839-.045.113a5.485 5.485 0 0 1-.536 1.712c.303-.57.499-1.193.581-1.825M7.847.092C8.055.016 8.358.05 8.579 0c-.287.024-.574.039-.856.075l.124.017M.544 3.975c.048.444-.334.616.084.324.225-.505-.087-.14-.084-.324M.052 6.029c.097-.296.114-.473.151-.644-.267.34-.123.413-.151.644"/></g></svg> diff --git a/inc/images/provisioning/oss/fedora.svg b/inc/images/provisioning/oss/fedora.svg deleted file mode 100644 index c4b42466..00000000 --- a/inc/images/provisioning/oss/fedora.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="15" height="15" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid"><path d="M15 7.5a7.5 7.5 0 0 0-15-.005v5.804A1.705 1.705 0 0 0 1.705 15h5.797A7.5 7.5 0 0 0 15 7.5" fill="#294172"/><path d="M9.702 1.776a3.522 3.522 0 0 0-3.518 3.518v1.867h-1.86a3.522 3.522 0 0 0-3.518 3.518 3.522 3.522 0 0 0 3.518 3.519 3.522 3.522 0 0 0 3.518-3.518V8.812h1.859a3.522 3.522 0 0 0 3.518-3.518 3.522 3.522 0 0 0-3.518-3.518ZM6.197 10.68a1.875 1.875 0 0 1-1.873 1.872 1.874 1.874 0 0 1-1.872-1.872 1.875 1.875 0 0 1 1.872-1.873h1.86v.005h.013v1.868Zm3.505-3.513H7.843v-.005H7.83V5.294a1.875 1.875 0 0 1 1.872-1.873 1.875 1.875 0 0 1 1.873 1.873 1.875 1.875 0 0 1-1.873 1.872Z" fill="#3C6EB4"/><path d="M10.48 1.882a2.812 2.812 0 0 0-.778-.104 3.52 3.52 0 0 0-3.52 3.52v1.866H4.707a.82.82 0 1 0-.008 1.638H5.92c.145 0 .262.117.262.262v1.614a1.859 1.859 0 0 1-1.858 1.855c-.347 0-.433-.046-.67-.046-.498 0-.832.334-.832.792.001.38.325.706.724.811.273.071.483.104.777.104a3.52 3.52 0 0 0 3.52-3.52V8.808h1.474a.822.822 0 0 0 .831-.82.817.817 0 0 0-.822-.819H8.107a.263.263 0 0 1-.263-.262V5.295A1.859 1.859 0 0 1 9.702 3.44c.348 0 .433.046.67.046.498 0 .831-.334.831-.792 0-.38-.325-.706-.723-.811" fill="#FFF"/></svg> diff --git a/inc/images/provisioning/oss/rocky-linux.svg b/inc/images/provisioning/oss/rocky-linux.svg deleted file mode 100644 index 504bbdb1..00000000 --- a/inc/images/provisioning/oss/rocky-linux.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="23" height="5.054" viewBox="0 0 23 5.054" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.316 3.153a1.894 1.894 0 1 0-3.14.703l1.923-1.922.474.475.743.744Zm-.345.602-.872-.872-1.366 1.366a1.893 1.893 0 0 0 2.238-.494Z" fill="#10B981"/><path d="M5.589 3.514v-1.99h.972c.1 0 .192.015.276.046a.62.62 0 0 1 .218.127.548.548 0 0 1 .142.194.604.604 0 0 1-.056.585.637.637 0 0 1-.282.22l.441.818h-.461l-.39-.762h-.448v.762h-.412Zm.935-1.634h-.523v.533h.523a.32.32 0 0 0 .221-.073.244.244 0 0 0 .086-.193.246.246 0 0 0-.086-.194.32.32 0 0 0-.221-.073Zm.815.895a.757.757 0 0 1 .226-.546.814.814 0 0 1 .873-.165c.097.04.181.095.25.165a.742.742 0 0 1 .231.546.758.758 0 0 1-.231.546.8.8 0 0 1-.56.221.808.808 0 0 1-.563-.221.793.793 0 0 1-.167-.242.773.773 0 0 1-.059-.304Zm.789.43c.114 0 .21-.042.29-.126a.421.421 0 0 0 .12-.304.422.422 0 0 0-.12-.306.381.381 0 0 0-.29-.126.383.383 0 0 0-.29.126.426.426 0 0 0-.119.306c0 .12.04.221.119.304.08.084.177.126.29.126Zm1.767-.003a.438.438 0 0 0 .184-.04.522.522 0 0 0 .168-.126l.233.242a.831.831 0 0 1-.273.197.814.814 0 0 1-.329.067.794.794 0 0 1-.555-.221.781.781 0 0 1-.163-.242.773.773 0 0 1-.058-.304.756.756 0 0 1 .468-.711.836.836 0 0 1 .645.012.744.744 0 0 1 .276.193l-.239.253a.537.537 0 0 0-.17-.133.423.423 0 0 0-.197-.046.367.367 0 0 0-.283.126.43.43 0 0 0-.114.306c0 .121.039.223.117.304.08.081.176.123.29.123Zm.788.312v-1.99l.389-.086v1.221l.64-.626h.44l-.693.679.736.802h-.497l-.626-.676v.676h-.389Zm2.044.068.023-.054-.577-1.495h.429l.367 1.009.42-1.009h.422l-.683 1.598c-.076.178-.164.305-.265.38a.625.625 0 0 1-.392.114 1.08 1.08 0 0 1-.174-.017v-.334c.02.003.039.006.06.007a.837.837 0 0 0 .077.003.3.3 0 0 0 .176-.05.351.351 0 0 0 .117-.152Zm1.858-.068v-1.99h.218v1.794h1.187v.196h-1.405Zm1.78-1.697a.136.136 0 0 1-.099-.043.136.136 0 0 1-.042-.1c0-.039.014-.072.042-.099a.139.139 0 0 1 .099-.042c.04 0 .074.014.1.042a.13.13 0 0 1 .043.099.133.133 0 0 1-.043.1.129.129 0 0 1-.1.043Zm.106.273v1.424h-.21V2.09h.21Zm.359 1.424V2.09h.21v.167a.531.531 0 0 1 .196-.144.609.609 0 0 1 .253-.052c.161 0 .293.052.396.155a.531.531 0 0 1 .153.397v.901h-.207v-.858a.408.408 0 0 0-.109-.299.385.385 0 0 0-.29-.111.464.464 0 0 0-.23.057.444.444 0 0 0-.162.163v1.048h-.21Zm1.748-1.424v.859c0 .124.037.223.109.299.07.073.168.11.29.11a.434.434 0 0 0 .392-.222V2.09h.21v1.424h-.21v-.165a.534.534 0 0 1-.196.145.616.616 0 0 1-.252.048.54.54 0 0 1-.397-.153.534.534 0 0 1-.153-.397V2.09h.207Zm1.193 1.424.561-.734-.532-.69h.25l.403.535.405-.535h.241l-.526.688.562.736h-.249l-.434-.579-.442.579h-.239Zm1.552-1.508v-.309h-.103v-.059h.103v-.12l.069-.018v.138h.142v.059h-.142v.292c0 .024.004.043.016.055.011.011.03.015.056.015a.175.175 0 0 0 .035-.003.107.107 0 0 0 .034-.009v.061a.146.146 0 0 1-.04.01c-.016.003-.029.003-.043.003a.137.137 0 0 1-.095-.03c-.022-.019-.032-.047-.032-.085Zm.286.107v-.475h.071v.052a.178.178 0 0 1 .139-.062.167.167 0 0 1 .149.086.188.188 0 0 1 .071-.064.198.198 0 0 1 .092-.022c.052 0 .093.017.125.051a.182.182 0 0 1 .049.133v.301h-.069v-.287c0-.041-.01-.075-.033-.099a.113.113 0 0 0-.089-.037.128.128 0 0 0-.072.02.152.152 0 0 0-.054.058l.002.021c.001.007.003.014.003.023v.301h-.069v-.287a.148.148 0 0 0-.034-.099.114.114 0 0 0-.089-.037.131.131 0 0 0-.069.018.127.127 0 0 0-.052.051v.354h-.071Z" fill="#000"/></svg> diff --git a/inc/images/provisioning/oss/suse.svg b/inc/images/provisioning/oss/suse.svg deleted file mode 100644 index 61a8c547..00000000 --- a/inc/images/provisioning/oss/suse.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 1.157 1.157"><g fill-rule="evenodd" clip-rule="evenodd"><path fill="#fff" d="M0 0h1.157v1.157H0V0z"/><path d="M.095.868c.002.061.047.087.103.087.048 0 .097-.022.097-.077A.065.065 0 0 0 .247.816 1.313 1.313 0 0 1 .176.797C.159.793.147.783.147.766c0-.025.025-.032.045-.032.029 0 .05.012.053.043h.042C.287.726.245.699.193.699c-.044 0-.09.023-.09.072 0 .025.012.051.055.062.034.009.055.014.073.02.01.003.021.011.021.03C.252.901.237.92.2.92.165.92.138.905.138.867H.095zM.532.772H.493v.103C.493.903.482.923.45.923.428.923.415.912.415.881V.772H.376v.113c0 .046.02.069.067.069a.058.058 0 0 0 .05-.029h.001v.024h.038V.772zm.082.096c.001.061.047.087.102.087.049 0 .098-.022.098-.077A.065.065 0 0 0 .766.816 1.101 1.101 0 0 1 .695.797C.678.793.666.783.666.766c0-.025.025-.032.045-.032.029 0 .051.012.053.043h.043C.807.726.764.699.713.699.669.699.624.722.624.771c0 .025.012.051.054.062.034.009.056.014.074.02.01.003.02.011.02.03C.772.901.758.92.72.92.686.92.659.905.659.867H.616zM.9.95h.179V.914H.944V.842h.123V.807H.944V.743h.133V.706H.9v.245z" fill="#0c0e0f"/><path d="M.059.602.06.605c.019.051.055.072.115.068C.216.669.233.644.224.602L.172.601C.171.615.164.627.148.629H.146a.05.05 0 0 1-.04-.027L.058.601zm.068 0c.005.006.011.01.02.01a.01.01 0 0 0 .008-.01L.127.601zm.211 0c0 .009 0 .023.019.023.025 0 .025-.012.027-.022L.338.602zm.102 0c0 .017.003.023.018.025.019.002.023-.01.024-.016l.002-.01H.44zm.28 0c.003.01.003.027.027.025C.762.625.763.612.761.602H.72zm.098 0C.826.621.836.626.85.623.859.62.862.616.86.602H.818z" fill="#9dc14e"/><path d="M.053.527a.166.166 0 0 0 .006.074h.048A.066.066 0 0 1 .104.553L.105.551A.07.07 0 0 1 .124.526H.053zm.28 0L.338.6l.001.002h.046V.601C.386.551.386.544.388.527H.333zm.109 0C.443.53.442.535.441.539v.063L.485.601C.489.574.488.564.492.54L.494.526H.442zm.257 0 .02.072.002.003h.041L.761.593.752.53.751.527H.699zm.096 0 .017.058.006.016v.001H.86L.856.583S.842.548.85.528H.795zm-.64.075A.02.02 0 0 0 .153.589C.143.591.137.575.148.572.164.567.174.585.172.603L.224.602.221.59C.205.559.188.541.169.535l-.01.003C.143.541.129.543.12.56.116.578.118.593.128.602h.028z" fill="#9dc14e"/><path d="M.091.427a.248.248 0 0 0-.038.1h.07A.217.217 0 0 1 .157.515C.165.498.185.481.216.468.274.453.323.465.333.519v.008h.055L.389.52C.394.494.442.486.443.527h.052C.498.507.51.499.56.507c.034.01.055.005.101.001.033-.007.031.001.038.017L.7.527h.052C.748.504.768.461.795.524l.001.003h.055C.854.518.861.512.874.513.882.511.891.51.893.504.87.494.857.483.811.447.802.44.813.426.821.433c.058.045.073.06.125.073a.161.161 0 0 0 .152-.08h-.029a.31.31 0 0 1-.074.012.175.175 0 0 1-.042-.007.235.235 0 0 0-.014-.005H.091z" fill="#9dc14e"/><path d="M.938.427C.922.421.904.412.887.41.873.408.877.392.886.392.92.397.96.423.994.424c.048-.001.082-.016.112-.028C1.09.339 1.019.277.959.294.867.239.848.236.737.212A.88.88 0 0 0 .39.23C.311.257.251.272.147.362a.301.301 0 0 0-.055.066h.847zm.159 0 .006-.012c-.011.004-.022.009-.035.012h.029zM.989.307c.028 0 .055.021.055.048 0 .028-.028.047-.055.047S.943.379.943.351c0-.027.018-.044.046-.044zm.004.012a.036.036 0 0 0-.037.036c0 .019.016.035.037.035S1.03.374 1.03.355A.036.036 0 0 0 .993.319zm.003.012c.014 0 .02.01.02.023S1.009.377.995.377C.982.377.968.369.968.355c0-.013.015-.024.028-.024zM.993.345a.01.01 0 0 0-.01.01c0 .006.004.011.01.011s.011-.005.011-.011c0-.005-.005-.01-.011-.01z" fill="#9dc14e"/><path d="M.252.639h.824v.027H.242s.01-.01.01-.027z" fill="#0c0e0f"/></g></svg> diff --git a/inc/images/provisioning/oss/ubuntu.svg b/inc/images/provisioning/oss/ubuntu.svg deleted file mode 100644 index 78bc7c96..00000000 --- a/inc/images/provisioning/oss/ubuntu.svg +++ /dev/null @@ -1 +0,0 @@ -<svg id="Livello_1" data-name="Livello 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 178.36 183.21"><defs><style>.cls-1{fill:#ffb516;}.cls-2{fill:#fe6309;}.cls-3{fill:#d70000;}</style></defs><title>Ubuntu_Linux_logo</title><path class="cls-1" d="M208.94,319.38a44.2,44.2,0,0,1,17-34.86l-15.8-25.28a74.15,74.15,0,0,0-27.9,39.28,26.64,26.64,0,0,1,.8,44.29A74.2,74.2,0,0,0,210.76,380l14.68-26.11A44.21,44.21,0,0,1,208.94,319.38Z" transform="translate(-148.68 -229.83)"/><path class="cls-2" d="M187,320.93a19.15,19.15,0,1,1-19.15-19.15A19.15,19.15,0,0,1,187,320.93Z" transform="translate(-148.68 -229.83)"/><path class="cls-3" d="M294.58,367.26a26.52,26.52,0,0,1,12.34,3A73.66,73.66,0,0,0,327,324.53L297.28,324a44.3,44.3,0,0,1-61.9,36L220.59,385.8a73.63,73.63,0,0,0,32.64,7.58,74.44,74.44,0,0,0,14.8-1.49A26.62,26.62,0,0,1,294.58,367.26Z" transform="translate(-148.68 -229.83)"/><path class="cls-1" d="M313.74,393.89a19.16,19.16,0,1,1-19.16-19.16A19.15,19.15,0,0,1,313.74,393.89Z" transform="translate(-148.68 -229.83)"/><path class="cls-2" d="M309,270.72A26.63,26.63,0,0,1,267,249c0-.77,0-1.54.1-2.3a74.94,74.94,0,0,0-13.82-1.29,73.67,73.67,0,0,0-32.94,7.72L235,279a44.3,44.3,0,0,1,62.2,35.22l29.76-.9A73.6,73.6,0,0,0,309,270.72Z" transform="translate(-148.68 -229.83)"/><path class="cls-3" d="M312.74,249a19.16,19.16,0,1,1-19.16-19.15A19.16,19.16,0,0,1,312.74,249Z" transform="translate(-148.68 -229.83)"/></svg> \ No newline at end of file diff --git a/inc/images/provisioning/oss/windows.svg b/inc/images/provisioning/oss/windows.svg deleted file mode 100644 index bb0d991f..00000000 --- a/inc/images/provisioning/oss/windows.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 88 88"><path d="m0 12.402 35.687-4.8602.0156 34.423-35.67.20313zm35.67 33.529.0277 34.453-35.67-4.9041-.002-29.78zm4.3261-39.025 47.318-6.906v41.527l-47.318.37565zm47.329 39.349-.0111 41.34-47.318-6.6784-.0663-34.739z" fill="#00adef"/></svg> \ No newline at end of file diff --git a/inc/images/provisioning/providers/aws.svg b/inc/images/provisioning/providers/aws.svg deleted file mode 100644 index 3fd29769..00000000 --- a/inc/images/provisioning/providers/aws.svg +++ /dev/null @@ -1 +0,0 @@ -<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 304 182" style="enable-background:new 0 0 304 182" xml:space="preserve"><style>.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#f90}</style><path d="M86.4 66.4c0 3.7.4 6.7 1.1 8.9.8 2.2 1.8 4.6 3.2 7.2.5.8.7 1.6.7 2.3 0 1-.6 2-1.9 3L83.2 92c-.9.6-1.8.9-2.6.9-1 0-2-.5-3-1.4-1.4-1.5-2.6-3.1-3.6-4.7-1-1.7-2-3.6-3.1-5.9-7.8 9.2-17.6 13.8-29.4 13.8-8.4 0-15.1-2.4-20-7.2-4.9-4.8-7.4-11.2-7.4-19.2 0-8.5 3-15.4 9.1-20.6 6.1-5.2 14.2-7.8 24.5-7.8 3.4 0 6.9.3 10.6.8 3.7.5 7.5 1.3 11.5 2.2v-7.3c0-7.6-1.6-12.9-4.7-16-3.2-3.1-8.6-4.6-16.3-4.6-3.5 0-7.1.4-10.8 1.3-3.7.9-7.3 2-10.8 3.4-1.6.7-2.8 1.1-3.5 1.3-.7.2-1.2.3-1.6.3-1.4 0-2.1-1-2.1-3.1v-4.9c0-1.6.2-2.8.7-3.5.5-.7 1.4-1.4 2.8-2.1 3.5-1.8 7.7-3.3 12.6-4.5C41 1.9 46.2 1.3 51.7 1.3c11.9 0 20.6 2.7 26.2 8.1 5.5 5.4 8.3 13.6 8.3 24.6v32.4zM45.8 81.6c3.3 0 6.7-.6 10.3-1.8 3.6-1.2 6.8-3.4 9.5-6.4 1.6-1.9 2.8-4 3.4-6.4.6-2.4 1-5.3 1-8.7v-4.2c-2.9-.7-6-1.3-9.2-1.7-3.2-.4-6.3-.6-9.4-.6-6.7 0-11.6 1.3-14.9 4-3.3 2.7-4.9 6.5-4.9 11.5 0 4.7 1.2 8.2 3.7 10.6 2.4 2.5 5.9 3.7 10.5 3.7zm80.3 10.8c-1.8 0-3-.3-3.8-1-.8-.6-1.5-2-2.1-3.9L96.7 10.2c-.6-2-.9-3.3-.9-4 0-1.6.8-2.5 2.4-2.5h9.8c1.9 0 3.2.3 3.9 1 .8.6 1.4 2 2 3.9l16.8 66.2 15.6-66.2c.5-2 1.1-3.3 1.9-3.9.8-.6 2.2-1 4-1h8c1.9 0 3.2.3 4 1 .8.6 1.5 2 1.9 3.9l15.8 67 17.3-67c.6-2 1.3-3.3 2-3.9.8-.6 2.1-1 3.9-1h9.3c1.6 0 2.5.8 2.5 2.5 0 .5-.1 1-.2 1.6-.1.6-.3 1.4-.7 2.5l-24.1 77.3c-.6 2-1.3 3.3-2.1 3.9-.8.6-2.1 1-3.8 1h-8.6c-1.9 0-3.2-.3-4-1-.8-.7-1.5-2-1.9-4L156 23l-15.4 64.4c-.5 2-1.1 3.3-1.9 4-.8.7-2.2 1-4 1h-8.6zm128.5 2.7c-5.2 0-10.4-.6-15.4-1.8-5-1.2-8.9-2.5-11.5-4-1.6-.9-2.7-1.9-3.1-2.8-.4-.9-.6-1.9-.6-2.8v-5.1c0-2.1.8-3.1 2.3-3.1.6 0 1.2.1 1.8.3.6.2 1.5.6 2.5 1 3.4 1.5 7.1 2.7 11 3.5 4 .8 7.9 1.2 11.9 1.2 6.3 0 11.2-1.1 14.6-3.3 3.4-2.2 5.2-5.4 5.2-9.5 0-2.8-.9-5.1-2.7-7-1.8-1.9-5.2-3.6-10.1-5.2L246 52c-7.3-2.3-12.7-5.7-16-10.2-3.3-4.4-5-9.3-5-14.5 0-4.2.9-7.9 2.7-11.1 1.8-3.2 4.2-6 7.2-8.2 3-2.3 6.4-4 10.4-5.2 4-1.2 8.2-1.7 12.6-1.7 2.2 0 4.5.1 6.7.4 2.3.3 4.4.7 6.5 1.1 2 .5 3.9 1 5.7 1.6 1.8.6 3.2 1.2 4.2 1.8 1.4.8 2.4 1.6 3 2.5.6.8.9 1.9.9 3.3v4.7c0 2.1-.8 3.2-2.3 3.2-.8 0-2.1-.4-3.8-1.2-5.7-2.6-12.1-3.9-19.2-3.9-5.7 0-10.2.9-13.3 2.8-3.1 1.9-4.7 4.8-4.7 8.9 0 2.8 1 5.2 3 7.1 2 1.9 5.7 3.8 11 5.5l14.2 4.5c7.2 2.3 12.4 5.5 15.5 9.6 3.1 4.1 4.6 8.8 4.6 14 0 4.3-.9 8.2-2.6 11.6-1.8 3.4-4.2 6.4-7.3 8.8-3.1 2.5-6.8 4.3-11.1 5.6-4.5 1.4-9.2 2.1-14.3 2.1z" style="fill:#252f3e"/><path class="st1" d="M273.5 143.7c-32.9 24.3-80.7 37.2-121.8 37.2-57.6 0-109.5-21.3-148.7-56.7-3.1-2.8-.3-6.6 3.4-4.4 42.4 24.6 94.7 39.5 148.8 39.5 36.5 0 76.6-7.6 113.5-23.2 5.5-2.5 10.2 3.6 4.8 7.6z"/><path class="st1" d="M287.2 128.1c-4.2-5.4-27.8-2.6-38.5-1.3-3.2.4-3.7-2.4-.8-4.5 18.8-13.2 49.7-9.4 53.3-5 3.6 4.5-1 35.4-18.6 50.2-2.7 2.3-5.3 1.1-4.1-1.9 4-9.9 12.9-32.2 8.7-37.5z"/></svg> diff --git a/inc/images/provisioning/providers/do.svg b/inc/images/provisioning/providers/do.svg deleted file mode 100644 index 27c48093..00000000 --- a/inc/images/provisioning/providers/do.svg +++ /dev/null @@ -1,72 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - viewBox="0 0 354 354" style="enable-background:new 0 0 354 354;" xml:space="preserve"> -<style type="text/css"> - .st0{fill:#0080FF;} - .st1{fill-rule:evenodd;clip-rule:evenodd;fill:#0080FF;} -</style> -<g id="XMLID_229_"> - <g id="XMLID_690_"> - <g id="XMLID_691_"> - <g> - <g id="XMLID_44_"> - <g id="XMLID_48_"> - <path id="XMLID_49_" class="st0" d="M177,221.5l0-34.2c36.2,0,64.3-35.9,50.4-74C222.3,99.3,211,88,196.9,82.9 - c-38.1-13.8-74,14.2-74,50.4c0,0,0,0,0,0l-34.1,0c0-57.7,55.8-102.7,116.3-83.8c26.4,8.3,47.5,29.3,55.7,55.7 - C279.7,165.7,234.7,221.5,177,221.5z"/> - </g> - <polygon id="XMLID_47_" class="st1" points="177.1,187.5 143,187.5 143,153.4 143,153.4 177.1,153.4 177.1,153.4 "/> - <polygon id="XMLID_46_" class="st1" points="143,213.6 116.9,213.6 116.9,213.6 116.9,187.5 143,187.5 143,213.6 "/> - <path id="XMLID_45_" class="st1" d="M116.9,187.5H95c0,0,0,0,0,0v-21.9c0,0,0,0,0,0h21.9c0,0,0,0,0,0V187.5z"/> - </g> - </g> - </g> - </g> - <g id="XMLID_234_"> - <path id="XMLID_677_" class="st0" d="M31.2,256.1c-4.4-3.1-10-4.6-16.4-4.6H0.8V296h14.1c6.4,0,12-1.6,16.4-4.9 - c2.4-1.7,4.3-4.1,5.7-7.1c1.3-3,2-6.6,2-10.5c0-3.9-0.7-7.4-2-10.4C35.6,260.1,33.7,257.7,31.2,256.1z M9,259h4.4 - c4.9,0,8.9,1,12,2.9c3.4,2.1,5.1,6,5.1,11.6c0,5.8-1.7,9.9-5.1,12.1h0c-2.9,1.9-6.9,2.9-11.9,2.9H9V259z"/> - <path id="XMLID_676_" class="st0" d="M48.7,250.9c-1.4,0-2.5,0.5-3.5,1.4c-0.9,0.9-1.4,2-1.4,3.4c0,1.4,0.5,2.5,1.4,3.5 - c0.9,0.9,2.1,1.4,3.5,1.4c1.3,0,2.5-0.5,3.5-1.4c0.9-0.9,1.4-2.1,1.4-3.5c0-1.4-0.5-2.5-1.4-3.4C51.2,251.4,50,250.9,48.7,250.9z" - /> - <rect id="XMLID_675_" x="44.7" y="264.6" class="st0" width="7.9" height="31.4"/> - <path id="XMLID_670_" class="st0" d="M81.3,267.2c-2.4-2.1-5-3.4-7.9-3.4c-4.4,0-8,1.5-10.8,4.5c-2.8,2.9-4.3,6.7-4.3,11.3 - c0,4.4,1.4,8.2,4.2,11.2c2.8,2.9,6.5,4.4,10.8,4.4c3,0,5.7-0.8,7.8-2.5v0.7c0,2.6-0.7,4.6-2.1,6c-1.4,1.4-3.3,2.1-5.7,2.1 - c-3.6,0-5.9-1.4-8.7-5.2l-5.4,5.2l0.1,0.2c1.2,1.6,2.9,3.2,5.3,4.7c2.3,1.5,5.3,2.3,8.8,2.3c4.7,0,8.5-1.4,11.3-4.3 - c2.8-2.9,4.2-6.7,4.2-11.4v-28.5h-7.8V267.2z M79.2,285.8c-1.4,1.6-3.2,2.3-5.4,2.3c-2.3,0-4-0.8-5.4-2.3c-1.4-1.6-2-3.6-2-6.1 - c0-2.6,0.7-4.6,2-6.2c1.3-1.6,3.2-2.3,5.4-2.3c2.3,0,4,0.8,5.4,2.3c1.4,1.6,2.1,3.7,2.1,6.2C81.3,282.2,80.6,284.2,79.2,285.8z"/> - <rect id="XMLID_668_" x="95.8" y="264.6" class="st0" width="7.9" height="31.4"/> - <path id="XMLID_660_" class="st0" d="M99.8,250.9c-1.4,0-2.5,0.5-3.5,1.4c-0.9,0.9-1.4,2-1.4,3.4c0,1.4,0.5,2.5,1.4,3.5 - c0.9,0.9,2.1,1.4,3.5,1.4c1.3,0,2.5-0.5,3.5-1.4c0.9-0.9,1.4-2.1,1.4-3.5c0-1.4-0.5-2.5-1.4-3.4 - C102.3,251.4,101.2,250.9,99.8,250.9z"/> - <path id="XMLID_652_" class="st0" d="M121,256.1h-7.8v8.5h-4.5v7.2h4.5v13c0,4.1,0.8,7,2.4,8.7c1.6,1.7,4.5,2.5,8.5,2.5 - c1.3,0,2.6,0,3.8-0.1l0.4,0v-7.2l-2.7,0.1c-1.9,0-3.1-0.3-3.7-1c-0.6-0.7-0.9-2.1-0.9-4.2v-11.9h7.4v-7.2H121V256.1z"/> - <rect id="XMLID_642_" x="165.4" y="251.4" class="st0" width="7.9" height="44.6"/> - <path id="XMLID_448_" class="st0" d="M253.1,284.8c-1.4,1.6-2.9,3-4,3.7v0c-1.1,0.7-2.5,1.1-4.1,1.1c-2.3,0-4.2-0.8-5.7-2.6 - c-1.5-1.7-2.3-4-2.3-6.6c0-2.7,0.8-4.9,2.3-6.6c1.5-1.7,3.4-2.6,5.7-2.6c2.5,0,5.2,1.6,7.5,4.3l5.2-5l0,0 - c-3.4-4.4-7.7-6.5-12.9-6.5c-4.3,0-8.1,1.6-11.2,4.7c-3.1,3.1-4.6,7-4.6,11.7s1.6,8.6,4.6,11.7c3.1,3.1,6.8,4.7,11.2,4.7 - c5.7,0,10.3-2.5,13.5-7L253.1,284.8z"/> - <path id="XMLID_445_" class="st0" d="M285.6,269c-1.1-1.6-2.6-2.8-4.5-3.7c-1.9-0.9-4.1-1.4-6.5-1.4c-4.4,0-8,1.6-10.7,4.8 - c-2.6,3.2-4,7.1-4,11.8c0,4.8,1.5,8.7,4.3,11.7c2.9,3,6.7,4.5,11.4,4.5c5.3,0,9.7-2.2,13-6.4l0.2-0.2l-5.2-5l0,0 - c-0.5,0.6-1.2,1.2-1.8,1.8c-0.8,0.7-1.5,1.3-2.3,1.7c-1.2,0.6-2.5,0.9-4,0.9c-2.2,0-4-0.6-5.4-1.9c-1.3-1.2-2.1-2.8-2.3-4.8h20.9 - l0.1-2.9c0-2-0.3-4-0.8-5.8C287.5,272.3,286.7,270.6,285.6,269z M268.3,276.4c0.4-1.5,1.1-2.8,2.1-3.7c1.1-1.1,2.5-1.6,4.1-1.6 - c1.9,0,3.4,0.5,4.4,1.6c0.9,1,1.5,2.2,1.6,3.7H268.3z"/> - <path id="XMLID_442_" class="st0" d="M315.9,267L315.9,267c-2.4-2-5.7-3.1-9.8-3.1c-2.6,0-5.1,0.6-7.3,1.7c-2.1,1-4.1,2.8-5.4,5 - l0.1,0.1l5.1,4.8c2.1-3.3,4.4-4.5,7.5-4.5c1.7,0,3,0.4,4.1,1.3c1,0.9,1.6,2,1.6,3.4v1.5c-2-0.6-3.9-0.9-5.8-0.9 - c-3.9,0-7.1,0.9-9.5,2.7c-2.4,1.8-3.6,4.5-3.6,7.9c0,3,1,5.3,3.1,7.1c2.1,1.7,4.6,2.6,7.6,2.6c3,0,5.8-1.2,8.4-3.3v2.6h7.8v-20.2 - C319.5,272,318.3,269,315.9,267z M301.9,284c0.9-0.6,2.2-0.9,3.8-0.9c1.9,0,3.9,0.4,6,1.1v3.1c-1.7,1.6-4,2.4-6.8,2.4 - c-1.4,0-2.4-0.3-3.2-0.9c-0.7-0.6-1.1-1.3-1.1-2.3C300.6,285.4,301,284.6,301.9,284z"/> - <path id="XMLID_393_" class="st0" d="M349.9,267.6c-2.2-2.5-5.3-3.7-9.2-3.7c-3.1,0-5.7,0.9-7.6,2.7v-1.9h-7.7V296h7.9v-17.3 - c0-2.4,0.6-4.3,1.7-5.6c1.1-1.3,2.6-2,4.7-2c1.8,0,3.1,0.6,4.1,1.8c1,1.2,1.5,2.9,1.5,4.9V296h7.9v-18.2 - C353.2,273.5,352.1,270,349.9,267.6z"/> - <path id="XMLID_320_" class="st0" d="M155.5,267L155.5,267c-2.4-2-5.7-3.1-9.8-3.1c-2.6,0-5.1,0.6-7.3,1.7c-2.1,1-4.1,2.8-5.4,5 - l0.1,0.1l5.1,4.8c2.1-3.3,4.4-4.5,7.5-4.5c1.7,0,3,0.4,4.1,1.3c1,0.9,1.6,2,1.6,3.4v1.5c-2-0.6-3.9-0.9-5.8-0.9 - c-3.9,0-7.1,0.9-9.5,2.7c-2.4,1.8-3.6,4.5-3.6,7.9c0,3,1,5.3,3.1,7.1c2.1,1.7,4.6,2.6,7.6,2.6c3,0,5.8-1.2,8.4-3.3v2.6h7.8v-20.2 - C159.1,272,157.9,269,155.5,267z M141.5,284c0.9-0.6,2.2-0.9,3.8-0.9c1.9,0,3.9,0.4,6,1.1v3.1c-1.7,1.6-4,2.4-6.8,2.4 - c-1.4,0-2.4-0.3-3.2-0.9c-0.7-0.6-1.1-1.3-1.1-2.3C140.2,285.4,140.6,284.6,141.5,284z"/> - <path id="XMLID_235_" class="st0" d="M202,296.7c-12.7,0-23-10.3-23-23s10.3-23,23-23s23,10.3,23,23S214.7,296.7,202,296.7z - M202,258.8c-8.2,0-14.9,6.7-14.9,14.9s6.7,14.9,14.9,14.9s14.9-6.7,14.9-14.9S210.2,258.8,202,258.8z"/> - </g> -</g> -</svg> diff --git a/inc/images/provisioning/providers/gcore.svg b/inc/images/provisioning/providers/gcore.svg deleted file mode 100644 index bc1bcdb6..00000000 --- a/inc/images/provisioning/providers/gcore.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15"><g fill="#818181" fill-rule="evenodd"><path fill="#231F20" d="M7.515 0c1.683 0 3.311.569 4.628 1.619l.39.307-.345.351-1.332 1.337a5.105 5.105 0 0 1 1.534 2.342h2.591V7.59l-.005.01c-.059 4.134-3.449 7.441-7.569 7.381-4.121-.06-7.417-3.461-7.358-7.6C.109 3.287 3.434 0 7.515 0z"/><path fill="#FF4713" d="M10.855 3.609a5.105 5.105 0 0 1 1.534 2.342H9.512l-.128.128-2.181 2.193-.755.757h5.127a4.335 4.335 0 0 1-5.595 2.54 4.36 4.36 0 0 1-2.531-5.614 4.335 4.335 0 0 1 6.567-2.024l.301.213.262-.263.276-.272z"/><path fill="#FFF" d="m10.505 3.332 1.367-1.371a7.012 7.012 0 0 0-9.869 1.158 7.063 7.063 0 0 0 1.154 9.901 7.013 7.013 0 0 0 9.869-1.153 7.068 7.068 0 0 0 1.515-4.332V6.401H9.7L7.519 8.589h4.653a4.782 4.782 0 0 1-5.748 3.574c-2.571-.604-4.164-3.188-3.563-5.768a4.778 4.778 0 0 1 7.407-2.826l.237-.237z"/></g></svg> diff --git a/inc/metrics-6.3.16.0.js b/inc/metrics.js similarity index 94% rename from inc/metrics-6.3.16.0.js rename to inc/metrics.js index 626c40cd..b22ab557 100644 --- a/inc/metrics-6.3.16.0.js +++ b/inc/metrics.js @@ -4,12 +4,9 @@ function getHttpChartData(server) { return false; } $.ajax({ - url: "options.py", + url: "/app/metrics/haproxy/" + server + "/http", data: { - new_http_metrics: '1', - server: server, time_range: $( "#time-range option:selected" ).val(), - token: $('#token').val() }, type: "POST", success: function (result) { @@ -129,12 +126,9 @@ function renderHttpChart(data, labels, server) { } function getChartData(server) { $.ajax({ - url: "options.py", + url: "/app/metrics/haproxy/" + server, data: { - new_metrics: '1', - server: server, time_range: $( "#time-range option:selected" ).val(), - token: $('#token').val() }, type: "POST", success: function (result) { @@ -238,12 +232,9 @@ function renderChart(data, labels, server) { } function getWafChartData(server) { $.ajax({ - url: "options.py", + url: "/app/metrics/waf/" + server, data: { - new_waf_metrics: '1', - server: server, time_range: $( "#time-range option:selected" ).val(), - token: $('#token').val() }, type: "POST", success: function (result) { @@ -328,12 +319,9 @@ function renderServiceChart(data, labels, server, service) { } function getNginxChartData(server) { $.ajax({ - url: "options.py", + url: "/app/metrics/nginx/" + server, data: { - new_nginx_metrics: '1', - server: server, time_range: $( "#time-range option:selected" ).val(), - token: $('#token').val() }, type: "POST", success: function (result) { @@ -347,12 +335,9 @@ function getNginxChartData(server) { } function getApacheChartData(server) { $.ajax({ - url: "options.py", + url: "/app/metrics/apache/" + server, data: { - new_apache_metrics: '1', - server: server, time_range: $( "#time-range option:selected" ).val(), - token: $('#token').val() }, type: "POST", success: function (result) { @@ -365,16 +350,13 @@ function getApacheChartData(server) { }); } function loadMetrics() { - $.ajax({ - url: "options.py", - data: { - table_metrics: '1', - token: $('#token').val() - }, - beforeSend: function() { - $('#table_metrics').html('<img class="loading_full_page" src="/inc/images/loading.gif" />') - }, - type: "POST", + var service = $('#service').val(); + $.ajax({ + url: "/app/metrics/" + service + "/table-metrics", + beforeSend: function () { + $('#table_metrics').html('<img class="loading_full_page" src="/app/static/images/loading.gif" />') + }, + type: "GET", success: function (data) { if (data.indexOf('error:') != '-1') { toastr.error(data); @@ -386,14 +368,14 @@ function loadMetrics() { } function getChartDataHapWiRam(ip) { $.ajax({ - url: "options.py", + url: "/app/metrics/ram", data: { metrics_hapwi_ram: '1', ip: ip, token: $('#token').val() }, beforeSend: function() { - $('#ram').html('<img class="loading_hapwi_overview" src="/inc/images/loading.gif" />') + $('#ram').html('<img class="loading_hapwi_overview" src="/app/static/images/loading.gif" />') }, type: "POST", success: function (result) { @@ -464,7 +446,7 @@ function renderChartHapWiRam(data) { } function getChartDataHapWiCpu(ip) { $.ajax({ - url: "options.py", + url: "/app/metrics/cpu", data: { metrics_hapwi_cpu: '1', ip: ip, @@ -529,7 +511,8 @@ function renderChartHapWiCpu(data) { scales: { x: { ticks: { - max: 100 + max: 100, + min: 100 } } }, @@ -602,15 +585,11 @@ function updatingCpuRamCharts() { } function getSmonHistoryCheckData(server, check_id) { $.ajax({ - url: "options.py", - data: { - smon_history_check: '1', - check_id: check_id, - server_id: server, + url: "/app/smon/history/metric/" + server + "/" + check_id, + // data: { // time_range: $( "#time-range option:selected" ).val(), - token: $('#token').val() - }, - type: "POST", + // }, + // type: "POST", success: function (result) { var data = []; data.push(result.chartData.curr_con); diff --git a/inc/overview-6.3.9.js b/inc/overview.js similarity index 63% rename from inc/overview-6.3.9.js rename to inc/overview.js index c131d04a..490c6463 100644 --- a/inc/overview-6.3.9.js +++ b/inc/overview.js @@ -1,5 +1,5 @@ -var cur_url = window.location.href.split('/').pop(); -cur_url = cur_url.split('?'); +var cur_url = window.location.href.split('/app/').pop(); +cur_url = cur_url.split('/'); function showHapservers(serv, hostnamea, service) { var i; for (i = 0; i < serv.length; i++) { @@ -8,17 +8,11 @@ function showHapservers(serv, hostnamea, service) { } function showHapserversCallBack(serv, hostnamea, service) { $.ajax( { - url: "options.py", - data: { - act: "overviewHapservers", - serv: serv, - service: service, - token: $('#token').val() - }, + url: "/app/service/" + service + "/" + serv + "/last-edit", beforeSend: function() { - $("#edit_date_"+hostnamea).html('<img class="loading_small_haproxyservers" src="/inc/images/loading.gif" />'); + $("#edit_date_"+hostnamea).html('<img class="loading_small_haproxyservers" src="/app/static/images/loading.gif" />'); }, - type: "POST", + type: "GET", success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data); @@ -36,17 +30,10 @@ function showHapserversCallBack(serv, hostnamea, service) { } function overviewHapserverBackends(serv, hostnamea, service) { $.ajax( { - url: "options.py", - data: { - act: "overviewHapserverBackends", - serv: serv[0], - service: service, - token: $('#token').val() - }, + url: "/app/service/" + service + "/backends/" + serv[0], beforeSend: function() { - $("#top-"+hostnamea).html('<img class="loading_small" style="padding-left: 45%;" src="/inc/images/loading.gif" />'); + $("#top-"+hostnamea).html('<img class="loading_small" style="padding-left: 45%;" src="/app/static/images/loading.gif" />'); }, - type: "POST", success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data); @@ -70,16 +57,11 @@ function showOverview(serv, hostnamea) { } function showOverviewCallBack(serv, hostnamea) { $.ajax( { - url: "options.py", - data: { - act: "overview", - serv: serv, - token: $('#token').val() - }, + url: "/app/overview/server/"+serv, beforeSend: function() { - $("#"+hostnamea).html('<img class="loading_small" src="/inc/images/loading.gif" />'); + $("#"+hostnamea).html('<img class="loading_small" src="/app/static/images/loading.gif" />'); }, - type: "POST", + type: "GET", success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data); @@ -92,16 +74,12 @@ function showOverviewCallBack(serv, hostnamea) { } function showServicesOverview() { $.ajax( { - url: "options.py", - data: { - act: "overviewServices", - token: $('#token').val() - }, + url: "/app/overview/services", beforeSend: function() { - $("#services_ovw").html('<img class="loading_small_bin_bout" style="padding-left: 100%;padding-top: 40px;padding-bottom: 40px;" src="/inc/images/loading.gif" />'); + $("#services_ovw").html('<img class="loading_small_bin_bout" style="padding-left: 100%;padding-top: 40px;padding-bottom: 40px;" src="/app/static/images/loading.gif" />'); }, - type: "POST", + type: "GET", success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data); @@ -114,17 +92,7 @@ function showServicesOverview() { } function showOverviewServer(name, ip, id, service) { $.ajax( { - url: "options.py", - data: { - act: "overviewServers", - name: name, - serv: ip, - id: id, - service: service, - page: 'hapservers.py', - token: $('#token').val() - }, - type: "POST", + url: "/app/service/cpu-ram-metrics/" + ip + "/" + id + "/" + name + "/" + service, success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data); @@ -148,15 +116,11 @@ function showOverviewServer(name, ip, id, service) { } } ); } -function ajaxActionServers(action, id) { - var bad_ans = 'Bad config, check please'; +function ajaxActionServers(action, id, service) { + // var cur_url = window.location.href.split('/app/').pop(); + // cur_url = cur_url.split('/'); $.ajax( { - url: "options.py", - data: { - action_hap: action, - serv: id, - token: $('#token').val() - }, + url: "/app/service/action/" + service + "/" + id + "/" + action, success: function( data ) { data = data.replace(/\s+/g,' '); if( data == 'Bad config, check please ' ) { @@ -164,14 +128,12 @@ function ajaxActionServers(action, id) { } else { if (data.indexOf('error:') != '-1') { toastr.error(data); - } else if (cur_url[0] == "hapservers.py") { + } else { if (data.indexOf('warning: ') != '-1') { toastr.warning(data); } else { location.reload(); } - } else { - setTimeout(showOverview(ip, hostnamea), 2000); } } }, @@ -180,149 +142,9 @@ function ajaxActionServers(action, id) { } } ); } -function ajaxActionNginxServers(action, id) { - var bad_ans = 'Bad config, check please'; - $.ajax( { - url: "options.py", - data: { - action_nginx: action, - serv: id, - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); - if( data == 'Bad config, check please ' ) { - alert(data); - } else { - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } else if (cur_url[0] == "hapservers.py") { - if (data.indexOf('warning: ') != '-1') { - toastr.warning(data) - } else { - location.reload() - } - } else if (cur_url[0] == "waf.py") { - setTimeout(showOverviewWaf(ip, hostnamea), 2000) - } else { - setTimeout(showOverview(ip, hostnamea), 2000) - } - } - }, - error: function(){ - alert(w.data_error); - } - } ); -} -function ajaxActionKeepalivedServers(action, id) { - var bad_ans = 'Bad config, check please'; - $.ajax( { - url: "options.py", - data: { - action_keepalived: action, - serv: id, - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); - if( data == 'Bad config, check please ' ) { - alert(data); - } else { - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } else if (cur_url[0] == "hapservers.py") { - location.reload() - } else { - setTimeout(showOverview(ip, hostnamea), 2000) - } - } - }, - error: function(){ - alert(w.data_error); - } - } ); -} -function ajaxActionApacheServers(action, id) { - var bad_ans = 'Bad config, check please'; - $.ajax( { - url: "options.py", - data: { - action_apache: action, - serv: id, - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); - if( data == 'Bad config, check please ' ) { - alert(data); - } else { - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } else if (cur_url[0] == "hapservers.py") { - if (data.indexOf('warning: ') != '-1') { - toastr.warning(data) - } else { - location.reload() - } - } else { - setTimeout(showOverview(ip, hostnamea), 2000) - } - } - }, - error: function(){ - alert(w.data_error); - } - } ); -} -function ajaxActionWafServers(action, id) { - $.ajax( { - url: "options.py", - data: { - action_waf: action, - serv: id, - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } else if( data == 'Bad config, check please ' ) { - toastr.error(data); - } else { - setTimeout(showOverviewWaf(ip, hostnamea), 2000) - } - }, - error: function(){ - alert(w.data_error); - } - } ); -} -function ajaxActionWafNginxServers(action, id) { - $.ajax( { - url: "options.py", - data: { - action_waf_nginx: action, - serv: id, - token: $('#token').val() - }, - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } else if( data == 'Bad config, check please ' ) { - toastr.error(data); - } else { - setTimeout(showOverviewWaf(ip, hostnamea), 2000) - } - }, - error: function(){ - alert(w.data_error); - } - } ); -} $( function() { try { - if ((cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[1].split('=')[0] == 'serv') || cur_url[0] == 'overview.py') { + if ((cur_url[0] == 'service' && cur_url[2] != '') || cur_url[0] == '') { ChartsIntervalId = setInterval(updatingCpuRamCharts, 30000); $(window).focus(function () { ChartsIntervalId = setInterval(updatingCpuRamCharts, 30000); @@ -335,7 +157,7 @@ $( function() { console.log(e); } try { - if (cur_url[0] == 'overview.py') { + if (cur_url[0] == '') { UsersShowIntervalId = setInterval(showUsersOverview, 600000); $(window).focus(function () { UsersShowIntervalId = setInterval(showUsersOverview, 600000); @@ -380,7 +202,7 @@ $( function() { $("#show-all-haproxy-wi-log").css("display", "block"); }); - if (cur_url[0] == "overview.py" || cur_url[0] == "waf.py" || cur_url[0] == "metrics.py") { + if (cur_url[0] == "" || cur_url[0] == "waf" || cur_url[0] == "metrics") { $('#secIntervals').css('display', 'none'); } $('#apply_close').click( function() { @@ -390,14 +212,15 @@ $( function() { $( ".server-act-links" ).change(function() { var id = $(this).attr('id').split('-'); - try { - var service_name = id[2] - } - catch (err) { - var service_name = 'haproxy' - } + if (cur_url[0] != 'portscanner') { + try { + var service_name = id[2] + } catch (err) { + var service_name = 'haproxy' + } - updateHapWIServer(id[1], service_name) + updateHapWIServer(id[1], service_name) + } }); }); function confirmAjaxAction(action, service, id) { @@ -414,7 +237,7 @@ function confirmAjaxAction(action, service, id) { click: function () { $(this).dialog("close"); if (service == "haproxy") { - ajaxActionServers(action, id); + ajaxActionServers(action, id, service); if (action == "restart" || action == "reload") { if (localStorage.getItem('restart')) { localStorage.removeItem('restart'); @@ -422,15 +245,15 @@ function confirmAjaxAction(action, service, id) { } } } else if (service == "waf") { - ajaxActionWafServers(action, id) + ajaxActionServers(action, id, 'waf_haproxy'); } else if (service == "nginx") { - ajaxActionNginxServers(action, id) + ajaxActionServers(action, id, service); } else if (service == "keepalived") { - ajaxActionKeepalivedServers(action, id) + ajaxActionServers(action, id, service); } else if (service == "apache") { - ajaxActionApacheServers(action, id) + ajaxActionServers(action, id, service); } else if (service == "waf_nginx") { - ajaxActionWafNginxServers(action, id) + ajaxActionServers(action, id, service); } } }, { @@ -445,65 +268,62 @@ function updateHapWIServer(id, service_name) { var alert_en = 0; var metrics = 0; var active = 0; - if ($('#alert-'+id).is(':checked')) { + if ($('#alert-' + id).is(':checked')) { alert_en = '1'; } - if ($('#metrics-'+id).is(':checked')) { + if ($('#metrics-' + id).is(':checked')) { metrics = '1'; } - if ($('#active-'+id).is(':checked')) { + if ($('#active-' + id).is(':checked')) { active = '1'; } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/service/" + service_name + "/tools/update", data: { - updatehapwiserver: id, - name: $('#server-name-'+id).val(), + server_id: id, + name: $('#server-name-' + id).val(), metrics: metrics, alert_en: alert_en, active: active, - service_name: service_name, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); } else { toastr.clear(); - $("#server-"+id+"-"+service_name).addClass( "update", 1000 ); - setTimeout(function() { - $( "#server-"+id+"-"+service_name).removeClass( "update" ); - }, 2500 ); + $("#server-" + id + "-" + service_name).addClass("update", 1000); + setTimeout(function () { + $("#server-" + id + "-" + service_name).removeClass("update"); + }, 2500); } } - } ); + }); } function change_pos(pos, id) { - $.ajax( { - url: "options.py", - data: { - change_pos: pos, - pos_server_id: id, - token: $('#token').val() - }, - error: function(){ + $.ajax({ + url: "/app/service/position/" + id + "/" + pos, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + error: function () { console.log(w.data_error); } - } ); + }); } function showBytes(serv) { $.ajax( { - url: "options.py", + url: "/app/service/haproxy/bytes", data: { - showBytes: serv, - token: $('#token').val() + showBytes: serv }, type: "POST", beforeSend: function() { - $("#show_bin_bout").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />'); - $("#sessions").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />'); + $("#show_bin_bout").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />'); + $("#sessions").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />'); }, success: function( data ) { data = data.replace(/\s+/g,' '); @@ -518,14 +338,13 @@ function showBytes(serv) { } function showNginxConnections(serv) { $.ajax( { - url: "options.py", + url: "/app/service/nginx/connections", data: { - nginxConnections: serv, - token: $('#token').val() + nginxConnections: serv }, type: "POST", beforeSend: function() { - $("#sessions").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />'); + $("#sessions").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />'); }, success: function( data ) { data = data.replace(/\s+/g,' '); @@ -540,14 +359,13 @@ function showNginxConnections(serv) { } function showApachekBytes(serv) { $.ajax( { - url: "options.py", + url: "/app/service/apache/bytes", data: { - apachekBytes: serv, - token: $('#token').val() + apachekBytes: serv }, type: "POST", beforeSend: function() { - $("#sessions").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />'); + $("#sessions").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />'); }, success: function( data ) { data = data.replace(/\s+/g,' '); @@ -562,14 +380,13 @@ function showApachekBytes(serv) { } function keepalivedBecameMaster(serv) { $.ajax( { - url: "options.py", + url: "/app/service/keepalived/become-master", data: { - keepalivedBecameMaster: serv, - token: $('#token').val() + keepalivedBecameMaster: serv }, type: "POST", beforeSend: function() { - $("#bin_bout").html('<img class="loading_small_bin_bout" src="/inc/images/loading.gif" />'); + $("#bin_bout").html('<img class="loading_small_bin_bout" src="/app/static/images/loading.gif" />'); }, success: function( data ) { data = data.replace(/\s+/g,' '); @@ -584,14 +401,14 @@ function keepalivedBecameMaster(serv) { } function showUsersOverview() { $.ajax( { - url: "options.py", - data: { - show_users_ovw: 1, - token: $('#token').val() - }, - type: "POST", + url: "overview/users", + // data: { + // show_users_ovw: 1, + // token: $('#token').val() + // }, + type: "GET", beforeSend: function() { - $("#users-table").html('<img class="loading_small_bin_bout" style="padding-left: 100%;padding-top: 40px;padding-bottom: 40px;" src="/inc/images/loading.gif" />'); + $("#users-table").html('<img class="loading_small_bin_bout" style="padding-left: 100%;padding-top: 40px;padding-bottom: 40px;" src="/app/static/images/loading.gif" />'); }, success: function( data ) { data = data.replace(/\s+/g,' '); @@ -605,14 +422,14 @@ function showUsersOverview() { } function showSubOverview() { $.ajax( { - url: "options.py", - data: { - show_sub_ovw: 1, - token: $('#token').val() - }, - type: "POST", + url: "/app/overview/sub", + // data: { + // show_sub_ovw: 1, + // token: $('#token').val() + // }, + type: "GET", beforeSend: function() { - $("#sub-table").html('<img class="loading_small_bin_bout" style="padding-left: 40%;padding-top: 40px;padding-bottom: 40px;" src="/inc/images/loading.gif" />'); + $("#sub-table").html('<img class="loading_small_bin_bout" style="padding-left: 40%;padding-top: 40px;padding-bottom: 40px;" src="/app/static/images/loading.gif" />'); }, success: function( data ) { data = data.replace(/\s+/g,' '); @@ -631,26 +448,24 @@ function serverSettings(id, name) { var for_word = $('#translate').attr('data-for'); var service = $('#service').val(); $.ajax({ - url: "options.py", - data: { - serverSettings: id, - serverSettingsService: service, - token: $('#token').val() - }, - type: "POST", + url: "/app/service/settings/" + service + "/" + id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); } else { $("#dialog-settings-service").html(data) - $( "input[type=checkbox]" ).checkboxradio(); + $("input[type=checkbox]").checkboxradio(); $("#dialog-settings-service").dialog({ resizable: false, height: "auto", width: 400, modal: true, - title: settings_word + " "+for_word+" " + name, + title: settings_word + " " + for_word + " " + name, buttons: [{ text: save_word, click: function () { @@ -694,10 +509,9 @@ function serverSettingsSave(id, name, service, dialog_id) { service_restart = '1'; } $.ajax({ - url: "options.py", + url: "/app/service/settings/" + service, data: { serverSettingsSave: id, - serverSettingsService: service, serverSettingsEnterprise: haproxy_enterprise, serverSettingsDockerized: service_dockerized, serverSettingsRestart: service_restart, @@ -717,19 +531,17 @@ function serverSettingsSave(id, name, service, dialog_id) { } function check_service_status(id, ip, service) { NProgress.configure({showSpinner: false}); + if (service == 'keepalived') return false; $.ajax({ - url: "options.py", + url: "/app/service/action/check-service", data: { - act: 'check_service', service: service, - serv: ip, - server_id: id, - token: $('#token').val() + server_ip: ip }, type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); - if (cur_url[0] == 'hapservers.py') { + if (cur_url[0] == 'service') { if (data.indexOf('up') != '-1') { $('#div-server-' + id).addClass('div-server-head-up'); $('#div-server-' + id).removeClass('div-server-head-down'); @@ -737,7 +549,7 @@ function check_service_status(id, ip, service) { $('#div-server-' + id).removeClass('div-server-head-up'); $('#div-server-' + id).addClass('div-server-head-down'); } - } else if (cur_url[0] == 'overview.py') { + } else if (cur_url[0] == '') { let span_id = $('#' + service + "_" + id); if (data.indexOf('up') != '-1') { span_id.addClass('serverUp'); diff --git a/inc/provisioning.js b/inc/provisioning.js deleted file mode 100644 index 064b0a60..00000000 --- a/inc/provisioning.js +++ /dev/null @@ -1,2050 +0,0 @@ -$( function() { - $('#add-provider-button').click(function() { - addProvidersChoosing.dialog('open'); - }); - $('#create-provider-button').click(function() { - createProvidersChoosing.dialog('open'); - }); - $('#do_create_ssh_choose').on('selectmenuchange', function (){ - if ($('#do_create_ssh_choose option:selected').val() == 'ssh_name') { - $('#do_create_ssh_name_tr').show(); - $('#do_create_ssh_ids_tr').hide(); - } else if ($('#do_create_ssh_choose option:selected').val() == 'ssh_ids') { - $('#do_create_ssh_name_tr').hide(); - $('#do_create_ssh_ids_tr').show(); - } - }); - $('#gcore_create_network_type').on('selectmenuchange', function (){ - if ($('#gcore_create_network_type option:selected').val() == 'any_subnet') { - $('#gcore_any_subnet').show(); - } else if ($('#gcore_create_network_type option:selected').val() == 'external') { - $('#gcore_any_subnet').hide(); - } - }); - $('#gcore-instance-enter').on('click', function() { - $('#gcore_create_size').css('display', 'none'); - $('#gcore-instance-enter').css('display', 'none'); - $('#gcore_create_size').attr('id', 'gcore_create_size_select'); - $("#gcore_create_size_select" ).selectmenu( "destroy" ); - $("#gcore_create_size_select" ).css('display', 'none'); - $('#gcore_create_size_text').attr('id', 'gcore_create_size'); - $('#gcore_create_size').css('display', 'inline'); - $('#gcore-instance-enter-select').css('display', 'inline'); - }); - $('#gcore-instance-enter-select').on('click', function() { - $('#gcore_create_size').css('display', 'none'); - $('#gcore_create_size').attr('id', 'gcore_create_size_text'); - $('#gcore_create_size_select').attr('id', 'gcore_create_size'); - $("#gcore_create_size" ).selectmenu(); - $("#gcore-instance-enter-select" ).css('display', 'none'); - $('#gcore-instance-enter').css('display', 'inline'); - }); - $('#do-instance-enter').on('click', function() { - $('#do_create_size').css('display', 'none'); - $('#do-instance-enter').css('display', 'none'); - $('#do_create_size').attr('id', 'do_create_size_select'); - $("#do_create_size_select" ).selectmenu( "destroy" ); - $("#do_create_size_select" ).css('display', 'none'); - $('#do_create_size_text').attr('id', 'do_create_size'); - $('#do_create_size').css('display', 'inline'); - $('#do-instance-enter-select').css('display', 'inline'); - }); - $('#do-instance-enter-select').on('click', function() { - $('#do_create_size').css('display', 'none'); - $('#do_create_size').attr('id', 'do_create_size_text'); - $('#do_create_size_select').attr('id', 'do_create_size'); - $("#do_create_size" ).selectmenu(); - $("#do-instance-enter-select" ).css('display', 'none'); - $('#do-instance-enter').css('display', 'inline'); - }); -}); -var addProvidersChoosing = $( "#add_providers_choosing" ).dialog({ - autoOpen: false, - width: 250, - modal: true, - title: "Add a new provider", - buttons: { - "Add": function() { - addProvider($('#add_select_providers option:selected').val()); - $( this ).dialog( "close" ); - clearTips(); - }, - Cancel: function() { - $( this ).dialog( "close" ); - clearTips(); - } - } - }); -var createProvidersChoosing = $( "#create_providers_choosing" ).dialog({ - autoOpen: false, - width: 250, - modal: true, - title: "Choose provider for provisioning", - buttons: { - "Choose": function() { - CreateServer($('#create_select_providers option:selected').val()); - $( this ).dialog( "close" ); - clearTips(); - }, - Cancel: function() { - $( this ).dialog( "close" ); - clearTips(); - } - } - }); -var awsProvider = $( "#aws_provider" ).dialog({ - autoOpen: false, - width: 574, - modal: true, - title: "Add AWS as provider", - buttons: { - "Add": function() { - addAwsProvider($( this )); - clearTips(); - }, - Cancel: function() { - $( this ).dialog( "close" ); - addProvidersChoosing.dialog('open'); - clearTips(); - } - } -}); -var doProvider = $( "#do_provider" ).dialog({ - autoOpen: false, - width: 574, - modal: true, - title: "Add DigitalOcean as provider", - buttons: { - "Add": function() { - addDoProvider($( this )); - clearTips(); - }, - Cancel: function() { - $( this ).dialog( "close" ); - addProvidersChoosing.dialog('open'); - clearTips(); - } - } -}); -var gcoreProvider = $( "#gcore_provider" ).dialog({ - autoOpen: false, - width: 574, - modal: true, - title: "Add G-Core Labs as provider", - buttons: { - "Add": function() { - addGcoreProvider($( this )); - clearTips(); - }, - Cancel: function() { - $( this ).dialog( "close" ); - addProvidersChoosing.dialog('open'); - clearTips(); - } - } -}); -var doCreate = $( "#do_create" ).dialog({ - autoOpen: false, - width: 574, - modal: true, - title: "Create a new Droplet in DigitalOcean", - buttons: { - "Create": function() { - doCreateServer($(this)); - clearTips(); - }, - Cancel: function() { - $( this ).dialog( "close" ); - createProvidersChoosing.dialog('open'); - clearTips(); - } - } -}); -var gcoreCreate = $( "#gcore_create" ).dialog({ - autoOpen: false, - width: 574, - modal: true, - title: "Create a new Instance in G-Core Labs", - buttons: { - "Create": function() { - gcoreCreateServer($(this)); - clearTips(); - }, - Cancel: function() { - $( this ).dialog( "close" ); - createProvidersChoosing.dialog('open'); - clearTips(); - } - } -}); -var awsCreate = $( "#aws_create" ).dialog({ - autoOpen: false, - width: 574, - modal: true, - title: "Create a new Instance in AWS", - buttons: { - "Create": function() { - awsCreateServer($(this)); - }, - Cancel: function() { - $( this ).dialog( "close" ); - createProvidersChoosing.dialog('open'); - clearTips(); - } - } -}); -var creatingServer = $( "#server_creating" ).dialog({ - autoOpen: false, - height: 420, - width: 574, - modal: true, - title: "Server is creating", - buttons: { - Close: function() { - $( this ).dialog( "close" ); - $('#wait-mess').show(); - cleanProvisioningProccess('#server_creating ul li', '#created-mess'); - remove_button_after_server_created(); - hideProvisioningError('#creating-error'); - clearTips(); - } - } -}); -var editingServer = $( "#server_editing" ).dialog({ - autoOpen: false, - height: 420, - width: 574, - modal: true, - title: "Server is editing", - buttons: { - Close: function() { - $( this ).dialog( "close" ); - $('#editing-wait-mess').show(); - cleanProvisioningProccess('#server_editing ul li', '#edited-mess'); - hideProvisioningError('#editing-error'); - clearTips(); - $('#edited-mess').html(''); - $('#edited-mess').hide(); - } - } -}); -function addProvider(provider) { - if (provider == 'aws') { - awsProvider.dialog('open'); - } else if (provider == 'do') { - doProvider.dialog('open'); - } else if (provider == 'gcore') { - gcoreProvider.dialog('open'); - } else { - toastr.error('Choose provider before adding'); - } -} -function CreateServer(provider) { - if (provider == 'aws') { - awsCreate.dialog('open'); - } else if (provider == 'do') { - doCreate.dialog('open'); - } else if (provider == 'gcore') { - gcoreCreate.dialog('open'); - } else { - toastr.error('Choose provider before creating server'); - } -} -function doCreateServer(dialog_id) { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#do_create_server_name') ).add( $('#do_create_size')) - .add( $('#do_create_regions') ); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#do_create_server_name'), "Server name", 1 ); - valid = valid && checkLength( $('#do_create_size'), "Droplet size", 1 ); - if (valid) { - clearTips(); - dialog_id.dialog('close'); - startCreatingServer('do'); - } -} -function gcoreCreateServer(dialog_id) { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#gcore_create_server_name') ).add( $('#gcore_create_size') ).add( $('#gcore_create_volume_size') ) - .add( $('#gcore_create_project_name') ).add( $('#gcore_create_ssh_name') ); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#gcore_create_server_name'), "Server name", 1 ); - valid = valid && checkLength( $('#gcore_create_size'), "Flavor", 1 ); - valid = valid && checkLength( $('#gcore_create_project_name'), "Project", 1 ); - valid = valid && checkLength( $('#gcore_create_ssh_name'), "SSH key pair name", 1 ); - valid = valid && checkLength( $('#gcore_create_volume_size'), "Volume size ", 1 ); - if (valid) { - clearTips(); - dialog_id.dialog('close'); - startCreatingServer('gcore'); - } -} -function awsCreateServer(dialog_id) { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#aws_create_server_name') ).add( $('#aws_create_size')).add( $('#aws_create_ssh_name')) - .add( $('#aws_create_volume_size')); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#aws_create_server_name'), "Server name", 1 ); - valid = valid && checkLength( $('#aws_create_size'), "Instance type", 1 ); - valid = valid && checkLength( $('#aws_create_ssh_name'), "SSH key pair name", 1 ); - valid = valid && checkLength( $('#aws_create_volume_size'), "Volume size", 1 ); - if(valid) { - clearTips(); - dialog_id.dialog('close'); - startCreatingServer('aws'); - } -} -function awsEditServer(dialog_id, server_id) { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#aws_edit_size')).add( $('#aws_edit_ssh_name')).add( $('#aws_edit_volume_size')); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#aws_edit_size'), "Instance type", 1 ); - valid = valid && checkLength( $('#aws_edit_ssh_name'), "SSH key pair name", 1 ); - valid = valid && checkLength( $('#aws_edit_volume_size'), "Volume size", 1 ); - if(valid) { - clearTips(); - dialog_id.dialog('destroy'); - startEditingServer('aws', server_id); - $('#editing-wait-mess').show(); - } - -} -function startCreatingServer(provider) { - $("#wait-mess").html(wait_mess); - creatingServer.dialog('open'); - if (provider == 'aws') { - awsInitServer(); - } else if (provider == 'do') { - doInitServer(); - } else if (provider == 'gcore') { - gcoreInitServer(); - } - $.getScript("/inc/fontawesome.min.js"); -} -function startEditingServer(provider, server_id) { - $("#editing-wait-mess").html(wait_mess); - editingServer.dialog('open'); - if (provider == 'aws') { - awsEditInitServer(server_id); - } else if (provider == 'do') { - doEditInitServer(server_id); - } else if (provider == 'gcore') { - gcoreEditInitServer(server_id); - } - $.getScript("/inc/fontawesome.min.js"); -} -function awsInitServer() { - $('#creating-init').addClass('proccessing'); - $.ajax( { - url: "options.py", - data: { - awsinit: 1, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#creating-init', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'aws'); - } else { - showProvisioningProccess('#creating-init', '#creating-init', '#creating-vars', '20', '#creating-progress'); - awsVarsServer(); - } - } - } ); -} -function awsVarsServer() { - var aws_create_floating_net = 'false'; - var aws_create_firewall = 'false'; - var aws_create_public_ip = 'false'; - var aws_create_delete_on_termination = 'false'; - if ($('#aws_create_firewall').is(':checked')) { - aws_create_firewall = 'true'; - } - if ($('#aws_create_delete_on_termination').is(':checked')) { - aws_create_delete_on_termination = 'true'; - } - if ($('#aws_create_public_ip option:selected').val() == 'public') { - aws_create_public_ip = 'true'; - } else if ($('#aws_create_public_ip option:selected').val() == 'elastic') { - aws_create_floating_net = 'true'; - } - $.ajax( { - url: "options.py", - data: { - awsvars: $('#aws_create_server_name').val(), - aws_create_group: $('#aws_create_group').val(), - aws_create_provider: $('#aws_create_provider').val(), - aws_create_regions: $('#aws_create_regions').val(), - aws_create_size: $('#aws_create_size').val(), - aws_create_oss: $('#aws_create_oss').val(), - aws_create_ssh_name: $('#aws_create_ssh_name').val(), - aws_create_volume_size: $('#aws_create_volume_size').val(), - aws_create_volume_type: $('#aws_create_volume_type').val(), - delete_on_termination: aws_create_delete_on_termination, - aws_create_floating_net: aws_create_floating_net, - aws_create_firewall: aws_create_firewall, - aws_create_public_ip: aws_create_public_ip, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#creating-vars', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'aws'); - } else { - showProvisioningProccess('#creating-init', '#creating-vars', '#creating-validate', '40', '#creating-progress'); - awsValidateServer(); - } - } - } ); -} -function awsValidateServer() { - $.ajax( { - url: "options.py", - data: { - awsvalidate: $('#aws_create_server_name').val(), - aws_create_group: $('#aws_create_group').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#creating-validate', '#creating-vars', '#wait-mess', '#creating-error', '#creating-progress', 'aws'); - } else { - showProvisioningProccess('#creating-vars', '#creating-validate', '#creating-workspace', '60', '#creating-progress'); - awsWorkspaceServer(); - } - } - } ); -} -function awsWorkspaceServer() { - var aws_create_floating_net = 0; - var aws_create_firewall = 0; - var aws_create_public_ip = 0; - var aws_create_delete_on_termination = 0; - if ($('#aws_create_firewall').is(':checked')) { - aws_create_firewall = 1; - } - if ($('#aws_create_delete_on_termination').is(':checked')) { - aws_create_delete_on_termination = 1; - } - if ($('#aws_create_public_ip option:selected').val() == 'public') { - aws_create_public_ip = 1; - } else if ($('#aws_create_public_ip option:selected').val() == 'elastic') { - aws_create_floating_net = 1; - } - $.ajax( { - url: "options.py", - data: { - awsworkspace: $('#aws_create_server_name').val(), - aws_create_group: $('#aws_create_group').val(), - aws_create_provider: $('#aws_create_provider option:selected').val(), - aws_create_regions: $('#aws_create_regions').val(), - aws_create_size: $('#aws_create_size').val(), - aws_create_oss: $('#aws_create_oss option:selected').val(), - aws_create_ssh_name: $('#aws_create_ssh_name').val(), - aws_create_volume_size: $('#aws_create_volume_size').val(), - aws_create_volume_type: $('#aws_create_volume_type').val(), - aws_create_delete_on_termination: aws_create_delete_on_termination, - aws_create_floating_net: aws_create_floating_net, - aws_create_firewall: aws_create_firewall, - aws_create_public_ip: aws_create_public_ip, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#creating-workspace', '#creating-validate', '#wait-mess', '#creating-error', '#creating-progress', 'aws'); - } else { - showProvisioningProccess('#creating-validate', '#creating-workspace', '#creating-server', '80', '#creating-progress'); - common_ajax_action_after_success('1', 'newserver', 'ajax-provisioning-body', data); - awsProvisiningServer(); - } - } - } ); -} -function awsProvisiningServer() { - $.ajax( { - url: "options.py", - data: { - awsprovisining: 1, - provisioning_workspace: $('#aws_create_server_name').val(), - provisioning_group: $('#aws_create_group').val(), - provider_id: $('#aws_create_provider').val(), - provisioning_action: 'created', - provisioning_cloud: 'aws', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - var server_id = $('#ajax-provisioning-body tr td span:regex(id, server-ip-)').last().attr('id').split('-')[2] - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#creating-server', '#creating-workspace', '#wait-mess', '#creating-error', '#creating-progress', 'aws'); - $('#sever-status-'+server_id).text('Error'); - $('#sever-status-'+server_id).attr('title', data); - $('#sever-status-'+server_id).css('color', 'red'); - } else { - showProvisioningProccess('#creating-workspace', '#creating-server', '', '100', '#creating-progress'); - $('#wait-mess').hide(); - $('#created-mess').html('Server has been created. Server IPs are:' + data); - $('#created-mess').show(); - $('#sever-status-'+server_id).text('Created'); - $('#server-ip-'+server_id).text(data); - $('#sever-status-'+server_id).css('color', 'var(--green-color)'); - add_button_after_server_created(); - } - } - } ); -} -function awsEditInitServer(server_id) { - $('#editing-init').addClass('proccessing'); - $('#server-'+server_id).css('background-color', '#fff3cd'); - $.ajax( { - url: "options.py", - data: { - awsinit: 1, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#editing-init', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws'); - $('#server-'+server_id).css('background-color', '#fff'); - add_button_after_server_edited(server_id) - } else { - showProvisioningProccess('#editing-init', '#editing-init', '#editing-vars', '20', '#editing-progress'); - awsEditingVarsServer(server_id); - } - } - } ); -} -function awsEditingVarsServer(server_id) { - var aws_edit_floating_net = 'false'; - var aws_editing_firewall = 'false'; - var aws_edit_public_ip = 'false'; - var aws_edit_delete_on_termination = 'false'; - if ($('#aws_edit_firewall').is(':checked')) { - aws_editing_firewall = 'true'; - } - if ($('#aws_edit_delete_on_termination').is(':checked')) { - aws_edit_delete_on_termination = 'true'; - } - if ($('#aws_edit_public_ip option:selected').val() == 'public') { - aws_edit_public_ip = 'true'; - } else if ($('#aws_edit_public_ip option:selected').val() == 'elastic') { - aws_edit_floating_net = 'true'; - } - $.ajax( { - url: "options.py", - data: { - awseditvars: $('#aws_edit_server_name').text(), - aws_editing_group: $('#aws_edit_group').val(), - aws_editing_provider: $('#aws_edit_id_provider option:selected').val(), - aws_editing_regions: $('#aws_edit_region').text(), - aws_editing_size: $('#aws_edit_size').val(), - aws_editing_oss: $('#aws_edit_oss option:selected').val(), - aws_editing_ssh_name: $('#aws_edit_ssh_name').val(), - aws_editing_volume_size: $('#aws_edit_volume_size').val(), - aws_editing_volume_type: $('#aws_edit_volume_type').val(), - aws_editing_delete_on_termination: aws_edit_delete_on_termination, - aws_editing_floating_net: aws_edit_floating_net, - aws_editing_firewall: aws_editing_firewall, - aws_editing_public_ip: aws_edit_public_ip, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#editing-vars', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws'); - $('#server-'+server_id).css('background-color', '#fff'); - add_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-init', '#editing-vars', '#editing-validate', '40', '#editing-progress'); - awsEditValidateServer(server_id); - } - } - } ); -} -function awsEditValidateServer(server_id) { - $.ajax( { - url: "options.py", - data: { - awseditvalidate: $('#aws_edit_server_name').text(), - aws_edit_group: $('#aws_edit_group').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#editing-validate', '#editing-vars', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws'); - $('#server-'+server_id).css('background-color', '#fff'); - add_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-vars', '#editing-validate', '#editing-workspace', '60', '#editing-progress'); - awsEditWorkspaceServer(server_id); - } - } - } ); -} -function awsEditWorkspaceServer(server_id) { - var aws_edit_floating_net = 0; - var aws_editing_firewall = 0; - var aws_edit_public_ip = 0; - var aws_edit_delete_on_termination = 0; - if ($('#aws_edit_firewall').is(':checked')) { - aws_editing_firewall = 1; - } - if ($('#aws_edit_delete_on_termination').is(':checked')) { - aws_edit_delete_on_termination = 1; - } - if ($('#aws_edit_public_ip option:selected').val() == 'public') { - aws_edit_public_ip = 1; - } else if ($('#aws_edit_public_ip option:selected').val() == 'elastic') { - aws_edit_floating_net = 1; - } - $.ajax( { - url: "options.py", - data: { - awseditworkspace: $('#aws_edit_server_name').text(), - aws_editing_group: $('#aws_edit_group').val(), - aws_editing_provider: $('#aws_edit_id_provider option:selected').val(), - aws_editing_regions: $('#aws_edit_region').text(), - aws_editing_size: $('#aws_edit_size').val(), - aws_editing_oss: $('#aws_edit_oss option:selected').val(), - aws_editing_ssh_name: $('#aws_edit_ssh_name').val(), - aws_editing_volume_size: $('#aws_edit_volume_size').val(), - aws_editing_volume_type: $('#aws_edit_volume_type').val(), - aws_editing_delete_on_termination: aws_edit_delete_on_termination, - aws_editing_floating_net: aws_edit_floating_net, - aws_editing_firewall: aws_editing_firewall, - aws_editing_public_ip: aws_edit_public_ip, - server_id: server_id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#editing-workspace', '#editing-validate', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws'); - showEditProvisioningError(data, server_id); - add_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-validate', '#editing-workspace', '#editing-server', '80', '#editing-progress'); - $('#sever-status-'+server_id).text('Editing'); - $('#sever-status-'+server_id).css('color', '#000'); - awsEditProvisiningServer(server_id); - } - } - } ); -} -function awsEditProvisiningServer(server_id, dialog_id) { - $.ajax( { - url: "options.py", - data: { - awseditingprovisining: 1, - provisioning_workspace: $('#aws_edit_server_name').text(), - provisioning_group: $('#aws_edit_group').val(), - provisioning_provider_id: $('#aws_edit_id_provider option:selected').val(), - provisioning_action: 'modified', - provisioning_cloud: 'aws', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#editing-server', '#editing-workspace', '#editing-wait-mess', '#editing-error', '#editing-progress', 'aws'); - showEditProvisioningError(data, server_id); - add_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-workspace', '#editing-server', '', '100', '#editing-progress'); - $('#editing-wait-mess').hide(); - $('#edited-mess').html('Server has been changed. IPs are: ' + data); - $('#edited-mess').show(); - $('#sever-status-'+server_id).text('Created'); - $('#sever-size-'+server_id).text($('#aws_edit_size').val()); - $('#sever-os-'+server_id).text($('#aws_edit_oss').val()); - $('#server-'+server_id).css('background-color', '#fff'); - $('#sever-status-'+server_id).css('color', '#000'); - $('#server-ip-'+server_id).text(data); - } - } - } ); -} -function confirmDeleteProvisionedServer(id) { - $( "#dialog-confirm" ).dialog({ - resizable: false, - height: "auto", - width: 400, - modal: true, - title: "Are you sure you want to delete " +$('#server-name-'+id).text() + "?", - buttons: { - "Delete": function() { - $( this ).dialog( "close" ); - deleteProvisionedServer(id); - }, - Cancel: function() { - $( this ).dialog( "close" ); - } - } - }); -} -function deleteProvisionedServer(id) { - $("#server-"+id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", - data: { - provisiningdestroyserver: id, - servername: $('#server-name-'+id).text(), - type: $('#server-cloud-'+id).text(), - provider_id: $('#server-provider-'+id).text(), - group: $('#server-group-'+id).text(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data == "ok ") { - $("#server-"+id).remove(); - } else if (data.indexOf('error: ') != '-1') { - toastr.error(data); - } else if (data.indexOf('warning: ') != '-1') { - toastr.clear(); - toastr.warning(data); - } - } - } ); -} -function editAwsServer(id) { - $.ajax( { - url: "options.py", - data: { - editServerId: id, - editProviderName: 'aws', - editGroup: $('#server-group-'+id).text(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error: ') != '-1') { - toastr.error(data); - } else if (data.indexOf('warning: ') != '-1') { - toastr.clear(); - toastr.warning(data); - } else { - $('#ajax').html(data); - var awsEdit = $( "#aws_edit" ).dialog({ - autoOpen: false, - width: 576, - modal: true, - title: "Editing AWS server: " + $('#server-name-'+id).text(), - close: function( event, ui ) {$( this ).dialog( "destroy" );}, - buttons: { - "Edit": function() { - awsEditServer($(this), id); - }, - Cancel: function() { - $( this ).dialog( "destroy" ); - clearTips(); - } - } - }); - $( "select" ).selectmenu(); - $( "input[type=checkbox]" ).checkboxradio(); - $.getScript("/inc/fontawesome.min.js"); - awsEdit.dialog('open'); - } - } - } ); -} -function editGcoreServer(id) { - $.ajax( { - url: "options.py", - data: { - editServerId: id, - editProviderName: 'gcore', - editGroup: $('#server-group-' + id).text(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error: ') != '-1') { - toastr.error(data); - } else if (data.indexOf('warning: ') != '-1') { - toastr.clear(); - toastr.warning(data); - } else { - $('#ajax').html(data); - var gcoreEdit = $( "#gcore_edit" ).dialog({ - autoOpen: false, - width: 576, - modal: true, - title: "Editing G-Core Labs server: " + $('#server-name-'+id).text(), - close: function( event, ui ) {$( this ).dialog( "destroy" );}, - buttons: { - "Edit": function() { - gcoreEditServer($(this), id); - }, - Cancel: function() { - $( this ).dialog( "destroy" ); - clearTips(); - } - } - }); - $( "select" ).selectmenu(); - $( "input[type=checkbox]" ).checkboxradio(); - $.getScript("/inc/fontawesome.min.js"); - gcoreEdit.dialog('open'); - } - } - } ); -} -function editDoServer(id) { - $.ajax( { - url: "options.py", - data: { - editServerId: id, - editProviderName: 'do', - editGroup: $('#server-group-' + id).text(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error: ') != '-1') { - toastr.error(data); - } else if (data.indexOf('warning: ') != '-1') { - toastr.clear(); - toastr.warning(data); - } else { - $('#ajax').html(data); - var doEdit = $( "#do_edit" ).dialog({ - autoOpen: false, - width: 576, - modal: true, - title: "Editing Do server: " + $('#server-name-'+id).text(), - close: function( event, ui ) {$( this ).dialog( "destroy" );}, - buttons: { - "Edit": function() { - doEditServer($(this), id); - }, - Cancel: function() { - $( this ).dialog( "destroy" ); - clearTips(); - } - } - }); - $( "select" ).selectmenu(); - $( "input[type=checkbox]" ).checkboxradio(); - $.getScript("/inc/fontawesome.min.js"); - doEdit.dialog('open'); - } - } - } ); -} -function add_button_after_server_created() { - var buttons = creatingServer.dialog("option", "buttons"); - $.extend(buttons, { Back: function() { - $( this ).dialog( "close" ); - awsCreate.dialog( "open" ); - cleanProvisioningProccess('#server_creating ul li', '#created-mess'); - $('#wait-mess').show(); - $('#edited-mess').html(''); - $('#edited-mess').hide(); - hideProvisioningError('#creating-error'); - } }); - creatingServer.dialog("option", "buttons", buttons); -} -function add_do_button_after_server_created() { - var buttons = creatingServer.dialog("option", "buttons"); - $.extend(buttons, { Back: function() { - $( this ).dialog( "close" ); - doCreate.dialog( "open" ); - cleanProvisioningProccess('#server_creating ul li', '#created-mess'); - $('#wait-mess').show(); - $('#edited-mess').html(''); - $('#edited-mess').hide(); - hideProvisioningError('#creating-error'); - } }); - creatingServer.dialog("option", "buttons", buttons); -} -function add_gcore_button_after_server_created() { - var buttons = creatingServer.dialog("option", "buttons"); - $.extend(buttons, { Back: function() { - $( this ).dialog( "close" ); - gcoreCreate.dialog( "open" ); - cleanProvisioningProccess('#server_creating ul li', '#created-mess'); - $('#wait-mess').show(); - $('#edited-mess').html(''); - $('#edited-mess').hide(); - hideProvisioningError('#creating-error'); - } }); - creatingServer.dialog("option", "buttons", buttons); -} -function add_button_after_server_edited(server_id) { - var buttons = editingServer.dialog("option", "buttons"); - $.extend(buttons, { Back: function() { - $( this ).dialog( "close" ); - editAwsServer(server_id) - cleanProvisioningProccess('#server_editing ul li', '#edited-mess'); - $('#wait-mess').show(); - $('#edited-mess').html(''); - $('#edited-mess').hide(); - hideProvisioningError('#editing-error'); - } }); - editingServer.dialog("option", "buttons", buttons); -} -function add_gcore_button_after_server_edited(server_id) { - var buttons = editingServer.dialog("option", "buttons"); - $.extend(buttons, { Back: function() { - $(this).dialog("close"); - editGcoreServer(server_id) - cleanProvisioningProccess('#server_editing ul li', '#edited-mess'); - $('#wait-mess').show(); - $('#edited-mess').html(''); - $('#edited-mess').hide(); - hideProvisioningError('#editing-error'); - } }); - editingServer.dialog("option", "buttons", buttons); -} -function add_do_button_after_server_edited(server_id) { - var buttons = editingServer.dialog("option", "buttons"); - $.extend(buttons, { Back: function() { - $( this ).dialog( "close" ); - editDoServer(server_id); - cleanProvisioningProccess('#server_editing ul li', '#edited-mess'); - $('#wait-mess').show(); - $('#edited-mess').html(''); - $('#edited-mess').hide(); - hideProvisioningError('#editing-error'); - } }); - editingServer.dialog("option", "buttons", buttons); -} -function add_gcore_button_after_server_edited(server_id) { - var buttons = editingServer.dialog("option", "buttons"); - $.extend(buttons, { Back: function() { - $( this ).dialog( "close" ); - editGcoreServer(server_id); - cleanProvisioningProccess('#server_editing ul li', '#edited-mess'); - $('#wait-mess').show(); - $('#edited-mess').html(''); - $('#edited-mess').hide(); - hideProvisioningError('#editing-error'); - } }); - editingServer.dialog("option", "buttons", buttons); -} -function remove_button_after_server_created() { - creatingServer.dialog("option",{buttons:{ Close: function() { - $( this ).dialog( "close" ); - $('#creating-error').hide(); - $('#wait-mess').show(); - cleanProvisioningProccess('#server_creating ul li', 'created-mess'); - clearTips(); - }}} - ); -} -function hideProvisioningError(error_id) { - $(error_id).html(''); - $(error_id).hide(); -} -function showProvisioningError(data, step_id, prev_step_id, wait_mess, error_id, progress_id, cloud, step, server_id) { - $(wait_mess).hide(); - $(error_id).html(data); - $(error_id).show(); - $(prev_step_id).removeClass('proccessing'); - $(step_id).addClass('processing_error'); - $(progress_id).css('width', '0%'); - if(cloud == 'aws') { - add_button_after_server_created(); - } else if (cloud == 'do') { - add_do_button_after_server_created(); - } else if (cloud == 'gcore') { - add_gcore_button_after_server_created(); - } - $.getScript("/inc/fontawesome.min.js"); -} -function showEditProvisioningError(data, server_id){ - $('#server-'+server_id).css('background-color', '#fff'); - $('#sever-status-'+server_id).text('Error'); - $('#sever-status-'+server_id).attr('title', data); - $('#sever-status-'+server_id).css('color', 'red'); - $('#sever-status-'+server_id).css('cursor', 'help'); -} -function showProvisioningProccess(prev_step_id, step_id, next_step_id, progress_value, progress_id) { - $(prev_step_id).removeClass('proccessing'); - $(step_id).addClass('proccessing_done'); - $(step_id).removeClass('proccessing'); - $(next_step_id).addClass('proccessing'); - $(progress_id).css('width', progress_value+'%'); - $.getScript("/inc/fontawesome.min.js"); -} -function cleanProvisioningProccess(div_id, success_div) { - $(success_div).hide(); - $(div_id).each(function () { - $(this).removeClass('proccessing_done'); - $(this).removeClass('processing_error'); - $(this).removeClass('proccessing'); - }); - $.getScript("/inc/fontawesome.min.js"); -} -function addDoProvider(dialog_id) { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#do_new_name') ).add( $('#do_new_group')).add( $('#do_new_token') ); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#do_new_name'), "Provider name", 1 ); - valid = valid && checkLength( $('#do_new_group'), "Group", 1 ); - valid = valid && checkLength( $('#do_new_token'), "Token", 1 ); - if (valid) { - $.ajax( { - url: "options.py", - data: { - new_provider_name: $('#do_new_name').val(), - new_provider_group: $('#do_new_group').val(), - new_provider_token: $('#do_new_token').val(), - new_provider_cloud: 'do', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } else { - var getId = new RegExp('[0-9]+'); - var id = data.match(getId); - $('select:regex(id, do_create_provider)').append('<option value=' + id + '>' +$('#do_new_name').val()+'</option>').selectmenu("refresh"); - common_ajax_action_after_success(dialog_id, 'newprovider', 'ajax-providers', data); - } - } - } ); - } -} -function addGcoreProvider(dialog_id) { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#gcore_new_name') ).add( $('#gcore_new_name')).add( $('#gcore_new_pass') ); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#gcore_new_name'), "Provider name", 1 ); - valid = valid && checkLength( $('#gcore_new_name'), "User name", 1 ); - valid = valid && checkLength( $('#gcore_new_pass'), "Password", 1 ); - if (valid) { - $.ajax( { - url: "options.py", - data: { - new_provider_name: $('#gcore_new_name').val(), - new_provider_group: $('#gcore_new_group').val(), - new_provider_token: $('#gcore_new_user').val(), - gcore_new_pass: $('#gcore_new_pass').val(), - new_provider_cloud: 'gcore', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } else { - var getId = new RegExp('[0-9]+'); - var id = data.match(getId); - $('select:regex(id, gcore_create_provider)').append('<option value=' + id + '>' +$('#gcore_new_name').val()+'</option>').selectmenu("refresh"); - common_ajax_action_after_success(dialog_id, 'newprovider', 'ajax-providers', data); - } - } - } ); - } -} -function addAwsProvider(dialog_id) { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#aws_new_name') ).add( $('#aws_new_key') ).add( $('#aws_new_secret') ); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#aws_new_name'), "Provider name", 1 ); - valid = valid && checkLength( $('#aws_new_key'), "ACCESS_KEY", 1 ); - valid = valid && checkLength( $('#aws_new_secret'), "SECRET_KEY", 1 ); - if (valid) { - $.ajax( { - url: "options.py", - data: { - new_provider_name: $('#aws_new_name').val(), - new_provider_group: $('#aws_new_group').val(), - new_provider_token: $('#aws_new_key').val(), - aws_new_secret: $('#aws_new_secret').val(), - new_provider_cloud: 'aws', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } else { - var getId = new RegExp('[0-9]+'); - var id = data.match(getId); - $('select:regex(id, aws_create_provider)').append('<option value=' + id + '>' +$('#aws_new_name').val()+'</option>').selectmenu("refresh"); - common_ajax_action_after_success(dialog_id, 'newprovider', 'ajax-providers', data); - } - } - } ); - } -} -function confirmDeleteProvider(id) { - $( "#dialog-confirm" ).dialog({ - width: 400, - modal: true, - title: "Are you sure you want to delete " +$('#provider-name-'+id).val() + "?", - buttons: { - "Delete": function() { - $( this ).dialog( "close" ); - removeProvider(id); - }, - Cancel: function() { - $( this ).dialog( "close" ); - } - } - }); -} -function removeProvider(id) { - $("#provider-"+id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", - data: { - providerdel: id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data == "Ok ") { - $("#provider-"+id).remove(); - } else if (data.indexOf('error:') != '-1') { - toastr.error(data); - } - } - } ); -} -var doEditProvider = $( "#do_edit_provider" ).dialog({ - autoOpen: false, - width: 574, - modal: true, - title: "Editing DigitalOcean provider", - buttons: { - "Edit": function() { - doEditProviderSave(); - }, - Cancel: function() { - $( this ).dialog( "close" ); - clearTips(); - } - } -}); -function editDoProvider(id) { - $('#do_edit_provider_id').val(id); - name = $('#provider-name-'+id).text(); - $('#do_edit_provider_name').val(name); - doEditProvider.dialog('open'); -} -function doEditProviderSave() { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#do_edit_provider_name')).add( $('#do_edit_provider_token') ); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#do_edit_provider_name'), "Provider name", 1 ); - valid = valid && checkLength( $('#do_edit_provider_token'), "Token", 1 ); - if(valid) { - doEditProvider.dialog( "close" ); - id = $('#do_edit_provider_id').val(); - token = $('#do_edit_provider_token').val(); - new_name = $('#do_edit_provider_name').val(); - $.ajax({ - url: "options.py", - data: { - edit_provider_id: id, - provider_name: 'do', - edit_do_provider_name: new_name, - edit_do_provider_token: token, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.replace(/\s+/g, ' '); - if (data == "ok ") { - $("#provider-name-" + id).text(new_name); - $("#provider-" + id).addClass("update", 1000); - setTimeout(function () { - $("#provider-" + id).removeClass("update"); - }, 2500); - $('#provider-edited-date-' + id).text(returnFormatedDate()) - } else if (data.indexOf('error:') != '-1') { - toastr.error(data); - } - } - }); - } -} -var gcoreEditProvider = $( "#gcore_edit_provider" ).dialog({ - autoOpen: false, - width: 574, - modal: true, - title: "Editing G-Core Labs provider", - buttons: { - "Edit": function() { - gcoreEditProviderSave(); - }, - Cancel: function() { - $( this ).dialog( "close" ); - clearTips(); - } - } -}); -function editGcoreProvider(id) { - $('#gcore_edit_provider_id').val(id); - name = $('#provider-name-'+id).text(); - $('#gcore_edit_provider_name').val(name); - gcoreEditProvider.dialog('open'); -} -function gcoreEditProviderSave() { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#gcore_edit_provider_name')).add( $('#gcore_edit_provider_user') ).add( $('#gcore_edit_provider_password')); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#gcore_edit_provider_name'), "User name", 1 ); - valid = valid && checkLength( $('#gcore_edit_provider_user'), "Provider name", 1 ); - valid = valid && checkLength( $('#gcore_edit_provider_password'), "Password", 1 ); - if(valid) { - gcoreEditProvider.dialog('close'); - clearTips(); - id = $('#gcore_edit_provider_id').val(); - username = $('#gcore_edit_provider_user').val(); - pass = $('#gcore_edit_provider_password').val(); - new_name = $('#gcore_edit_provider_name').val(); - $.ajax({ - url: "options.py", - data: { - edit_provider_id: id, - provider_name: 'gcore', - edit_gcore_provider_name: new_name, - edit_gcore_provider_user: username, - edit_gcore_provider_pass: pass, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.replace(/\s+/g, ' '); - if (data == "ok ") { - $("#provider-name-" + id).text(new_name); - $("#provider-" + id).addClass("update", 1000); - setTimeout(function () { - $("#provider-" + id).removeClass("update"); - }, 2500); - $('#provider-edited-date-' + id).text(returnFormatedDate()) - } else if (data.indexOf('error:') != '-1') { - toastr.error(data); - } - } - }); - } -} -var awsEditProvider = $("#aws_edit_provider").dialog({ - autoOpen: false, - width: 574, - modal: true, - title: "Editing AWS provider", - buttons: { - "Edit": function () { - awsEditProviderSave($(this)); - }, - Cancel: function () { - $(this).dialog("close"); - clearTips(); - } - } -}); -function editAwsProvider(id) { - $('#aws_edit_provider_id').val(id); - name = $('#provider-name-' + id).text(); - $('#aws_edit_provider_name').val(name); - awsEditProvider.dialog('open'); -} -function awsEditProviderSave() { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#aws_edit_provider_name')).add( $('#aws_edit_provider_key') ).add($('#aws_edit_provider_secret')); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#aws_edit_provider_name'), "Provider name", 1 ); - valid = valid && checkLength( $('#aws_edit_provider_key'), "ACCESS_KEY", 1 ); - valid = valid && checkLength( $('#aws_edit_provider_secret'), "ACCESS_SECRET", 1 ); - if(valid) { - awsEditProvider.dialog("close"); - id = $('#aws_edit_provider_id').val(); - new_name = $('#aws_edit_provider_name').val(); - key = $('#aws_edit_provider_key').val(); - secret = $('#aws_edit_provider_secret').val(); - $.ajax({ - url: "options.py", - data: { - edit_provider_id: id, - provider_name: 'aws', - edit_aws_provider_name: new_name, - edit_aws_provider_key: key, - edit_aws_provider_secret: secret, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.replace(/\s+/g, ' '); - if (data == "ok ") { - $("#provider-name-" + id).text(new_name); - $("#provider-" + id).addClass("update", 1000); - $('#provider-edited-date-' + id).text(returnFormatedDate()) - setTimeout(function () { - $("#provider-" + id).removeClass("update"); - }, 2500); - } else if (data.indexOf('error:') != '-1') { - toastr.error(data); - } - } - }); - } -} -function doEditServer(dialog_id, server_id) { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#do_edit_size')); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#do_edit_size'), "Droplet size", 1 ); - if (valid) { - clearTips(); - dialog_id.dialog('destroy'); - startEditingServer('do', server_id); - $('#editing-wait-mess').show(); - } -} -function doInitServer() { - $('#creating-init').addClass('proccessing'); - $.ajax( { - url: "options.py", - data: { - doinit: 1, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#creating-init', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'do'); - } else { - showProvisioningProccess('#creating-init', '#creating-init', '#creating-vars', '20', '#creating-progress'); - doVarsServer(); - } - } - } ); -} - -function doEditInitServer(server_id) { - $('#editing-init').addClass('proccessing'); - $('#server-'+server_id).css('background-color', '#fff3cd'); - $.ajax( { - url: "options.py", - data: { - doinit: 1, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#editing-init', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do'); - $('#server-'+server_id).css('background-color', '#fff'); - add_do_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-init', '#editing-init', '#editing-vars', '20', '#editing-progress'); - doEditVarsServer(server_id); - } - } - } ); -} -function doEditVarsServer(server_id) { - var do_edit_private_net = 'false'; - var do_edit_floating_net = 'false'; - var do_edit_monitoring = 'false'; - var do_edit_backup = 'false'; - var do_edit_firewall = 'false'; - if ($('#do_edit_private_networking').is(':checked')) { - do_edit_private_net = 'true'; - } - if ($('#do_edit_floating_ip').is(':checked')) { - do_edit_floating_net = 'true'; - } - if ($('#do_edit_monitoring').is(':checked')) { - do_edit_monitoring = 'true'; - } - if ($('#do_edit_backup').is(':checked')) { - do_edit_backup = 'true'; - } - if ($('#do_edit_firewall').is(':checked')) { - do_edit_firewall = 'true'; - } - $.ajax({ - url: "options.py", - data: { - doeditvars: $('#do_edit_server_name').text(), - do_edit_group: $('#do_edit_group').val(), - do_edit_provider: $('#do_edit_id_provider').val(), - do_edit_regions: $('#do_edit_regions').text(), - do_edit_size: $('#do_edit_size').val(), - do_edit_oss: $('#do_edit_oss').val(), - do_edit_ssh_name: $('#do_edit_ssh_name').val(), - do_edit_ssh_ids: $('#do_edit_ssh_ids').val(), - do_edit_backup: do_edit_backup, - do_edit_private_net: do_edit_private_net, - do_edit_floating_net: do_edit_floating_net, - do_edit_monitoring: do_edit_monitoring, - do_edit_firewall: do_edit_firewall, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#editing-vars', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do'); - $('#server-'+server_id).css('background-color', '#fff'); - add_do_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-init', '#editing-vars', '#editing-validate', '40', '#editing-progress'); - doEditValidateServer(server_id) - } - } - }); -} -function doEditValidateServer(server_id) { - $.ajax( { - url: "options.py", - data: { - doeditvalidate: $('#do_edit_server_name').text(), - do_edit_group: $('#do_edit_group').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#editing-validate', '#editing-vars', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do'); - $('#server-'+server_id).css('background-color', '#fff'); - add_do_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-vars', '#editing-validate', '#editing-workspace', '60', '#editing-progress'); - doEditWorkspaceServer(server_id); - } - } - } ); -} -function doEditWorkspaceServer(server_id) { - var do_edit_private_net = 0; - var do_edit_floating_net = 0; - var do_edit_monitoring = 0; - var do_edit_backup = 0; - var do_edit_firewall = 0; - if ($('#do_edit_private_networking').is(':checked')) { - do_edit_private_net = 1; - } - if ($('#do_edit_floating_ip').is(':checked')) { - do_edit_floating_net = 1; - } - if ($('#do_edit_monitoring').is(':checked')) { - do_edit_monitoring = 1; - } - if ($('#do_edit_backup').is(':checked')) { - do_edit_backup = 1; - } - if ($('#do_edit_firewall').is(':checked')) { - do_edit_firewall = 1; - } - $.ajax({ - url: "options.py", - data: { - doeditworkspace: $('#do_edit_server_name').text(), - do_edit_group: $('#do_edit_group').val(), - do_edit_provider: $('#do_edit_id_provider').val(), - do_edit_regions: $('#do_edit_regions').text(), - do_edit_size: $('#do_edit_size').val(), - do_edit_oss: $('#do_edit_oss').val(), - do_edit_ssh_name: $('#do_edit_ssh_name').val(), - do_edit_ssh_ids: $('#do_edit_ssh_ids').val(), - do_edit_private_net: do_edit_private_net, - do_edit_floating_net: do_edit_floating_net, - do_edit_monitoring: do_edit_monitoring, - do_edit_backup: do_edit_backup, - do_edit_firewall: do_edit_firewall, - server_id: server_id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#editing-workspace', '#editing-validate', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do'); - showEditProvisioningError(data, server_id); - add_do_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-validate', '#editing-workspace', '#editing-server', '80', '#editing-progress'); - $('#sever-status-'+server_id).text('Editing'); - $('#sever-status-'+server_id).css('color', '#000'); - doEditProvisiningServer(server_id); - } - } - } ); -} -function doEditProvisiningServer(server_id) { - $.ajax( { - url: "options.py", - data: { - doeditprovisining: 1, - provisioning_workspace: $('#do_edit_server_name').text(), - provisioning_group: $('#do_edit_group').val(), - provisioning_provider_id: $('#do_edit_id_provider').val(), - provisioning_action: 'modified', - provisioning_cloud: 'do', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#editing-server', '#editing-workspace', '#editing-wait-mess', '#editing-error', '#editing-progress', 'do'); - showEditProvisioningError(data, server_id); - add_do_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-workspace', '#editing-server', '', '100', '#editing-progress'); - $('#editing-wait-mess').hide(); - $('#edited-mess').html('Server has been changed. IPs are: ' + data); - $('#edited-mess').show(); - $('#sever-status-'+server_id).text('Created'); - $('#sever-size-'+server_id).text($('#do_edit_size').val()); - $('#sever-os-'+server_id).text($('#do_edit_oss').val()); - $('#server-'+server_id).css('background-color', '#fff'); - $('#sever-status-'+server_id).css('color', 'var(--green-color)'); - $('#server-ip-'+server_id).text(data); - } - } - } ); -} -function doVarsServer() { - var do_create_private_net = 'false'; - var do_create_floating_net = 'false'; - var do_create_monitoring = 'false'; - var do_create_backup = 'false'; - var do_create_firewall = 'false'; - if ($('#do_create_private_net').is(':checked')) { - do_create_private_net = 'true'; - } - if ($('#do_create_floating_net').is(':checked')) { - do_create_floating_net = 'true'; - } - if ($('#do_create_monitoring').is(':checked')) { - do_create_monitoring = 'true'; - } - if ($('#do_create_backup').is(':checked')) { - do_create_backup = 'true'; - } - if ($('#do_create_backup').is(':checked')) { - do_create_firewall = 'true'; - } - $.ajax({ - url: "options.py", - data: { - dovars: $('#do_create_server_name').val(), - do_create_group: $('#do_create_group').val(), - do_create_provider: $('#do_create_provider').val(), - do_create_regions: $('#do_create_regions').val(), - do_create_size: $('#do_create_size').val(), - do_create_oss: $('#do_create_oss').val(), - do_create_ssh_name: $('#do_create_ssh_name').val(), - do_create_ssh_ids: $('#do_create_ssh_ids').val(), - do_create_backup: do_create_backup, - do_create_private_net: do_create_private_net, - do_create_floating_net: do_create_floating_net, - do_create_monitoring: do_create_monitoring, - do_create_firewall: do_create_firewall, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#creating-vars', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'do'); - } else { - showProvisioningProccess('#creating-init', '#creating-vars', '#creating-validate', '40', '#creating-progress'); - doValidateServer(); - } - } - }); -} -function doValidateServer() { - $.ajax( { - url: "options.py", - data: { - dovalidate: $('#do_create_server_name').val(), - do_create_group: $('#do_create_group').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#creating-validate', '#creating-vars', '#wait-mess', '#creating-error', '#creating-progress', 'do'); - } else { - showProvisioningProccess('#creating-vars', '#creating-validate', '#creating-workspace', '60', '#creating-progress'); - doWorkspaceServer(); - } - } - } ); -} -function doWorkspaceServer() { - var do_create_private_net = 0; - var do_create_floating_net = 0; - var do_create_monitoring = 0; - var do_create_backup = 0; - var do_create_firewall = 0; - if ($('#do_create_private_net').is(':checked')) { - do_create_private_net = 1; - } - if ($('#do_create_floating_net').is(':checked')) { - do_create_floating_net = 1; - } - if ($('#do_create_monitoring').is(':checked')) { - do_create_monitoring = 1; - } - if ($('#do_create_backup').is(':checked')) { - do_create_backup = 1; - } - if ($('#do_create_backup').is(':checked')) { - do_create_firewall = 1; - } - $.ajax({ - url: "options.py", - data: { - doworkspace: $('#do_create_server_name').val(), - do_create_group: $('#do_create_group').val(), - do_create_provider: $('#do_create_provider').val(), - do_create_regions: $('#do_create_regions').val(), - do_create_size: $('#do_create_size').val(), - do_create_oss: $('#do_create_oss').val(), - do_create_ssh_name: $('#do_create_ssh_name').val(), - do_create_ssh_ids: $('#do_create_ssh_ids').val(), - do_create_backup: do_create_backup, - do_create_private_net: do_create_private_net, - do_create_floating_net: do_create_floating_net, - do_create_monitoring: do_create_monitoring, - do_create_firewall: do_create_firewall, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#creating-workspace', '#creating-validate', '#wait-mess', '#creating-error', '#creating-progress', 'do'); - } else { - showProvisioningProccess('#creating-validate', '#creating-workspace', '#creating-server', '80', '#creating-progress'); - common_ajax_action_after_success('1', 'newserver', 'ajax-provisioning-body', data); - doProvisiningServer(); - } - } - } ); -} -function doProvisiningServer() { - $.ajax( { - url: "options.py", - data: { - doprovisining: 1, - provisioning_workspace: $('#do_create_server_name').val(), - provisioning_group: $('#do_create_group').val(), - provisioning_provider_id: $('#do_create_provider').val(), - provisioning_action: 'created', - provisioning_cloud: 'do', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - var server_id = $('#ajax-provisioning-body tr td span:regex(id, server-ip-)').last().attr('id').split('-')[2] - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#creating-server', '#creating-workspace', '#wait-mess', '#creating-error', '#creating-progress', 'do'); - $('#sever-status-'+server_id).text('Error'); - $('#sever-status-'+server_id).attr('title', data); - $('#sever-status-'+server_id).css('color', 'red'); - } else { - showProvisioningProccess('#creating-workspace', '#creating-server', '', '100', '#creating-progress'); - $('#wait-mess').hide(); - $('#created-mess').html('Server has been created. Server IPs are: ' + data); - $('#created-mess').show(); - $('#sever-status-'+server_id).text('Created'); - $('#server-ip-'+server_id).text(data); - $('#sever-status-'+server_id).css('color', 'var(--green-color)'); - add_do_button_after_server_created(); - } - } - } ); -} -function gcoreInitServer() { - $('#creating-init').addClass('proccessing'); - $.ajax( { - url: "options.py", - data: { - gcoreinitserver: 1, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#creating-init', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'gcore'); - } else { - showProvisioningProccess('#creating-init', '#creating-init', '#creating-vars', '20', '#creating-progress'); - gcoreVarsServer(); - } - } - } ); -} -function gcoreVarsServer() { - var gcore_create_firewall = 'false'; - var gcore_create_delete_on_termination = 'false'; - if ($('#gcore_create_firewall').is(':checked')) { - gcore_create_firewall = 'true'; - } - if ($('#gcore_create_delete_on_termination').is(':checked')) { - gcore_create_delete_on_termination = 'true'; - } - $.ajax( { - url: "options.py", - data: { - gcorevars: $('#gcore_create_server_name').val(), - gcore_create_group: $('#gcore_create_group').val(), - gcore_create_provider: $('#gcore_create_provider').val(), - gcore_create_regions: $('#gcore_create_regions').val(), - gcore_create_project: $('#gcore_create_project_name').val(), - gcore_create_size: $('#gcore_create_size').val(), - gcore_create_oss: $('#gcore_create_oss').val(), - gcore_create_ssh_name: $('#gcore_create_ssh_name').val(), - gcore_create_volume_size: $('#gcore_create_volume_size').val(), - gcore_create_volume_type: $('#gcore_create_volume_type').val(), - gcore_create_delete_on_termination: gcore_create_delete_on_termination, - gcore_create_network_name: $('#gcore_create_network_name').val(), - gcore_create_firewall: gcore_create_firewall, - gcore_create_network_type: $('#gcore_create_network_type').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#creating-vars', '#creating-init', '#wait-mess', '#creating-error', '#creating-progress', 'gcore'); - } else { - showProvisioningProccess('#creating-init', '#creating-vars', '#creating-validate', '40', '#creating-progress'); - gcoreValidateServer(); - } - } - } ); -} -function gcoreValidateServer() { - $.ajax( { - url: "options.py", - data: { - gcorevalidate: $('#gcore_create_server_name').val(), - gcore_create_group: $('#gcore_create_group').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#creating-validate', '#creating-vars', '#wait-mess', '#creating-error', '#creating-progress', 'gcore'); - } else { - showProvisioningProccess('#creating-vars', '#creating-validate', '#creating-workspace', '60', '#creating-progress'); - gcoreWorkspaceServer(); - } - } - } ); -} -function gcoreWorkspaceServer() { - var gcore_create_firewall = 0; - var gcore_create_delete_on_termination = 0; - if ($('#gcore_create_firewall').is(':checked')) { - gcore_create_firewall = 1; - } - if ($('#gcore_create_delete_on_termination').is(':checked')) { - gcore_create_delete_on_termination = 1; - } - $.ajax( { - url: "options.py", - data: { - gcoreworkspace: $('#gcore_create_server_name').val(), - gcore_create_group: $('#gcore_create_group').val(), - gcore_create_provider: $('#gcore_create_provider').val(), - gcore_create_regions: $('#gcore_create_regions').val(), - gcore_create_project: $('#gcore_create_project_name').val(), - gcore_create_size: $('#gcore_create_size').val(), - gcore_create_oss: $('#gcore_create_oss').val(), - gcore_create_ssh_name: $('#gcore_create_ssh_name').val(), - gcore_create_volume_size: $('#gcore_create_volume_size').val(), - gcore_create_volume_type: $('#gcore_create_volume_type').val(), - gcore_create_delete_on_termination: gcore_create_delete_on_termination, - gcore_create_network_name: $('#gcore_create_network_name').val(), - gcore_create_firewall: gcore_create_firewall, - gcore_create_network_type: $('#gcore_create_network_type').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#creating-workspace', '#creating-validate', '#wait-mess', '#creating-error', '#creating-progress', 'gcore'); - } else { - showProvisioningProccess('#creating-validate', '#creating-workspace', '#creating-server', '80', '#creating-progress'); - common_ajax_action_after_success('1', 'newserver', 'ajax-provisioning-body', data); - gcoreProvisiningServer(); - } - } - } ); -} -function gcoreProvisiningServer() { - var gcoreprovisining = $('#gcore_create_server_name').val() - $.ajax( { - url: "options.py", - data: { - gcoreprovisining: 1, - provisioning_workspace: gcoreprovisining, - provisioning_group: $('#gcore_create_group').val(), - provisioning_provider_id: $('#gcore_create_provider').val(), - provisioning_action: 'created', - provisioning_cloud: 'gcore', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - var server_id = $('#ajax-provisioning-body tr td span:regex(id, server-ip-)').last().attr('id').split('-')[2] - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#creating-server', '#creating-workspace', '#wait-mess', '#creating-error', '#creating-progress', 'gcore'); - $('#sever-status-'+server_id).text('Error'); - $('#sever-status-'+server_id).attr('title', data); - $('#sever-status-'+server_id).css('color', 'red'); - } else { - data = data.split(':'); - data[1] = data[1].replace(/\s+/g, ' '); - showProvisioningProccess('#creating-workspace', '#creating-server', '', '100', '#creating-progress'); - $('#wait-mess').hide(); - $('#created-mess').html('Server has been created. Server IPs are:' + data[0]); - $('#created-mess').show(); - $('#sever-status-'+server_id).text('Created'); - $('#sever-status-'+server_id).css('color', 'var(--green-color)'); - $('#server-ip-'+server_id).text(data[0]); - add_gcore_button_after_server_created(); - } - } - } ); -} -function gcoreEditServer(dialog_id, server_id) { - var valid = true; - toastr.clear(); - allFields = $( [] ).add( $('#gcore_edit_size')).add( $('#gcore_edit_ssh_name')).add( $('#gcore_edit_volume_size')); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#gcore_edit_size'), "Instance type", 1 ); - valid = valid && checkLength( $('#gcore_edit_ssh_name'), "SSH key pair name", 1 ); - valid = valid && checkLength( $('#gcore_edit_volume_size'), "Volume size", 1 ); - if(valid) { - clearTips(); - dialog_id.dialog('destroy'); - startEditingServer('gcore', server_id); - $('#editing-wait-mess').show(); - } -} -function gcoreEditInitServer(server_id) { - $('#editing-init').addClass('proccessing'); - $('#server-'+server_id).css('background-color', '#fff3cd'); - $.ajax( { - url: "options.py", - data: { - gcoreinitserver: 1, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#editing-init', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore'); - $('#server-'+server_id).css('background-color', '#fff'); - add_gcore_button_after_server_edited(server_id) - } else { - showProvisioningProccess('#editing-init', '#editing-init', '#editing-vars', '20', '#editing-progress'); - gcoreEditingVarsServer(server_id); - } - } - } ); -} - -function gcoreEditingVarsServer(server_id, dialog_id) { - var gcore_edit_firewall = 'false'; - var gcore_edit_delete_on_termination = 'false'; - if ($('#gcore_edit_firewall').is(':checked')) { - gcore_edit_firewall = 'true'; - } - if ($('#gcore_edit_delete_on_termination').is(':checked')) { - gcore_edit_delete_on_termination = 'true'; - } - $.ajax( { - url: "options.py", - data: { - gcoreeditvars: $('#gcore_edit_server_name').text(), - gcore_edit_group: $('#gcore_edit_group').val(), - gcore_edit_provider: $('#gcore_edit_id_provider').val(), - gcore_edit_regions: $('#gcore_edit_region').text(), - gcore_edit_project: $('#gcore_edit_project_name').text(), - gcore_edit_size: $('#gcore_edit_size').val(), - gcore_edit_oss: $('#gcore_edit_oss').text(), - gcore_edit_ssh_name: $('#gcore_edit_ssh_name').val(), - gcore_edit_volume_size: $('#gcore_edit_volume_size').val(), - gcore_edit_volume_type: $('#gcore_edit_volume_type').val(), - gcore_edit_delete_on_termination: gcore_edit_delete_on_termination, - gcore_edit_network_name: $('#gcore_edit_network_name').val(), - gcore_edit_firewall: gcore_edit_firewall, - gcore_edit_network_type: $('#gcore_edit_network_type').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#editing-vars', '#editing-init', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore'); - $('#server-'+server_id).css('background-color', '#fff'); - add_gcore_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-init', '#editing-vars', '#editing-validate', '40', '#editing-progress'); - gcoreEditValidateServer(server_id); - } - } - } ); -} -function gcoreEditValidateServer(server_id) { - $.ajax( { - url: "options.py", - data: { - gcoreeditvalidate: $('#gcore_edit_server_name').text(), - gcore_edit_group: $('#gcore_edit_group').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1') { - showProvisioningError(data, '#editing-validate', '#editing-vars', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore'); - $('#server-'+server_id).css('background-color', '#fff'); - add_gcore_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-vars', '#editing-validate', '#editing-workspace', '60', '#editing-progress'); - gcoreEditWorkspaceServer(server_id); - } - } - } ); -} -function gcoreEditWorkspaceServer(server_id) { - var gcore_edit_firewall = 0; - var gcore_edit_delete_on_termination = 0; - if ($('#gcore_edit_firewall').is(':checked')) { - gcore_edit_firewall = 1; - } - if ($('#gcore_edit_delete_on_termination').is(':checked')) { - gcore_edit_delete_on_termination = 1; - } - $.ajax( { - url: "options.py", - data: { - gcoreeditworkspace: $('#gcore_edit_server_name').text(), - gcore_edit_group: $('#gcore_edit_group').val(), - gcore_edit_provider: $('#gcore_edit_id_provider').val(), - gcore_edit_regions: $('#gcore_edit_region').text(), - gcore_edit_project: $('#gcore_edit_project_name').text(), - gcore_edit_size: $('#gcore_edit_size').val(), - gcore_edit_oss: $('#gcore_edit_oss').text(), - gcore_edit_ssh_name: $('#gcore_edit_ssh_name').val(), - gcore_edit_volume_size: $('#gcore_edit_volume_size').val(), - gcore_edit_volume_type: $('#gcore_edit_volume_type').val(), - gcore_edit_delete_on_termination: gcore_edit_delete_on_termination, - gcore_edit_network_name: $('#gcore_edit_network_name').val(), - gcore_edit_firewall: gcore_edit_firewall, - gcore_edit_network_type: $('#gcore_edit_network_type').val(), - server_id: server_id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#editing-workspace', '#editing-validate', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore'); - showEditProvisioningError(data, server_id); - add_gcore_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-validate', '#editing-workspace', '#editing-server', '80', '#editing-progress'); - $('#sever-status-'+server_id).text('Editing'); - $('#sever-status-'+server_id).css('color', '#000'); - gcoreEditProvisiningServer(server_id); - } - } - } ); -} -function gcoreEditProvisiningServer(server_id, dialog_id) { - var gcoreeditgprovisining = $('#gcore_edit_server_name').text(); - $.ajax( { - url: "options.py", - data: { - gcoreeditgprovisining: 1, - provisioning_workspace: gcoreeditgprovisining, - provisioning_group: $('#gcore_edit_group').val(), - provisioning_provider_id: $('#gcore_edit_id_provider option:selected').val(), - provisioning_action: 'modified', - provisioning_cloud: 'gcore', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' && data.indexOf('Last error:') == '-1') { - showProvisioningError(data, '#editing-server', '#editing-workspace', '#editing-wait-mess', '#editing-error', '#editing-progress', 'gcore'); - showEditProvisioningError(data, server_id); - add_gcore_button_after_server_edited(server_id); - } else { - showProvisioningProccess('#editing-workspace', '#editing-server', '', '100', '#editing-progress'); - data = data.split(':'); - data[1] = data[1].replace(/\s+/g, ' '); - $('#editing-wait-mess').hide(); - $('#edited-mess').html('Server has been changed. IPs are: ' + data[0]); - $('#edited-mess').show(); - $('#sever-status-'+server_id).text('Created'); - $('#sever-size-'+server_id).text($('#gcore_edit_size').val()); - $('#sever-os-'+server_id).text($('#gcore_edit_oss').text()); - $('#server-'+server_id).css('background-color', '#fff'); - $('#sever-status-'+server_id).css('color', 'var(--green-color)'); - $('#server-ip-'+server_id).text(data[0]); - // $('#server-name-'+server_id).text(gcoreeditgprovisining+'('+data[1]+')'); - } - } - } ); -} -function returnFormatedDate() { - let date = new Date(); - current_date = date.toISOString().slice(0,10)+' '+date.toTimeString().split(' ')[0] - return current_date -} diff --git a/inc/runtimeapi.js b/inc/runtimeapi.js index 4023cc84..f3dc738a 100644 --- a/inc/runtimeapi.js +++ b/inc/runtimeapi.js @@ -5,10 +5,9 @@ function showRuntime() { saveCheck = ""; } $.ajax({ - url: "options.py", + url: "/app/runtimeapi/action/" + $("#serv").val(), data: { servaction: $('#servaction').val(), - serv: $("#serv").val(), servbackend: $("#servbackend").val(), save: saveCheck, token: $('#token').val() @@ -20,20 +19,15 @@ function showRuntime() { } ); } $( function() { - $('#runtimeapiform').submit(function() { + $('#runtimeapiform').submit(function () { showRuntime(); return false; }); - $( "#maxconn_select" ).on('selectmenuchange',function() { + $("#maxconn_select").on('selectmenuchange', function () { let server_ip = $('#maxconn_select').val(); - $.ajax( { - url: "options.py", - data: { - maxconn_select: $('#maxconn_select').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + $.ajax({ + url: "/app/runtimeapi/maxconn/" + $('#maxconn_select').val(), + success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error: ') != '-1') { toastr.error(data); @@ -41,27 +35,26 @@ $( function() { generate_select(data, '#maxconnfront'); } } - } ); + }); }); - $('#maxconnbackend').on('selectmenuchange', function (){ + $('#maxconnbackend').on('selectmenuchange', function () { let server_ip = $('#maxconn_backend_select').val(); let backend = $('#maxconnbackend').val(); get_backend_servers(server_ip, backend, '#maxconn_backend_server', 0); }); - $( "#maxconn_backend_select" ).on('selectmenuchange',function() { + $("#maxconn_backend_select").on('selectmenuchange', function () { let server_ip = $('#maxconn_backend_select').val(); get_backends(server_ip, '#maxconnbackend', 0); }); - $('#maxconnglobalform').submit(function() { - $.ajax( { - url: "options.py", + $('#maxconnglobalform').submit(function () { + $.ajax({ + url: "/app/runtimeapi/maxconn/global/" + $('#maxconn_global_select').val(), data: { - serv: $('#maxconn_global_select').val(), - maxconn_global: $('#maxconnintglobal').val(), + maxconn: $('#maxconnintglobal').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error: ') != '-1') { toastr.error(data); @@ -69,20 +62,19 @@ $( function() { toastr.success(data); } } - } ); + }); return false; }); - $('#maxconnform').submit(function() { - $.ajax( { - url: "options.py", + $('#maxconnform').submit(function () { + $.ajax({ + url: "/app/runtimeapi/maxconn/frontend/" + $('#maxconn_select').val(), data: { - serv: $('#maxconn_select').val(), maxconn_frontend: $('#maxconnfront').val(), - maxconn_int: $('#maxconnint').val(), + maxconn: $('#maxconnint').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error: ') != '-1') { toastr.error(data); @@ -90,21 +82,20 @@ $( function() { toastr.success(data); } } - } ); + }); return false; }); - $('#maxconnbackform').submit(function() { - $.ajax( { - url: "options.py", + $('#maxconnbackform').submit(function () { + $.ajax({ + url: "/app/runtimeapi/maxconn/backend/" + $('#maxconn_backend_select').val(), data: { - serv: $('#maxconn_backend_select').val(), maxconn_backend: $('#maxconnbackend').val(), maxconn_backend_server: $('#maxconn_backend_server').val(), - maxconn_int: $('#maxconn_backend_int').val(), + maxconn: $('#maxconn_backend_int').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error: ') != '-1') { toastr.error(data); @@ -112,48 +103,41 @@ $( function() { toastr.success(data); } } - } ); + }); return false; }); - $( "#ip_select" ).on('selectmenuchange',function() { + $("#ip_select").on('selectmenuchange', function () { let server_ip = $('#ip_select').val(); get_backends(server_ip, '#ipbackend', 1); }); - $( "#ipbackend" ).on('selectmenuchange',function() { + $("#ipbackend").on('selectmenuchange', function () { let server_ip = $('#ip_select').val(); let backend = $('#ipbackend').val(); get_backend_servers(server_ip, backend, '#backend_server', 1); }); - $( "#backend_server" ).on('selectmenuchange',function() { + $("#backend_server").on('selectmenuchange', function () { $('#backend_ip').val(); $('#backend_port').val(); - $.ajax( { - url: "options.py", - data: { - serv: $('#ip_select').val(), - ipbackend: $('#ipbackend').val(), - backend_server: $('#backend_server').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + $.ajax({ + url: "/app/runtimeapi/backend/server/" + $('#ip_select').val() + "/" + $('#ipbackend').val() + "/" + $('#backend_server').val(), + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error: ') != '-1') { toastr.error(data); } else { var server = data.split(':')[0] var port = data.split(':')[1] - port = port.replace(/\s+/g,''); - server = server.replace(/\s+/g,''); + port = port.replace(/\s+/g, ''); + server = server.replace(/\s+/g, ''); $('#backend_port').val(port); - $('#backend_ip').val(server); - } + $('#backend_ip').val(server); + } } - } ); + }); }); - $('#runtimeapiip').submit(function() { + $('#runtimeapiip').submit(function () { $.ajax({ - url: "options.py", + url: "/app/runtimeapi/change/ip", data: { serv: $('#ip_select').val(), backend_backend: $('#ipbackend').val(), @@ -171,49 +155,41 @@ $( function() { toastr.success(data); } } - } ); + }); return false; }); - $( "#table_serv_select" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - serv: $('#table_serv_select').val(), - table_serv_select: $('#table_serv_select').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,''); + $("#table_serv_select").on('selectmenuchange', function () { + $.ajax({ + url: "/app/runtimeapi/tables/" + $('#table_serv_select').val(), + success: function (data) { + data = data.replace(/\s+/g, ''); if (data.indexOf('error: ') != '-1') { toastr.error(data); } else { generate_select(data, '#table_select', 'All', ','); } } - } ); + }); }); - $('#runtimeapitable').submit(function() { + $('#runtimeapitable').submit(function () { getTable(); return false; }); - $('#runtimeapilist').submit(function() { + $('#runtimeapilist').submit(function () { getList(); return false; }); - $('#runtimeapisessions').submit(function() { + $('#runtimeapisessions').submit(function () { getSessions(); return false; }); - $( "#list_serv_select" ).on('selectmenuchange',function() { + $("#list_serv_select").on('selectmenuchange', function () { $.ajax({ - url: "options.py", - data: { - serv: $('#list_serv_select').val(), - list_serv_select: $('#list_serv_select').val(), - token: $('#token').val() - }, - type: "POST", + url: "/app/runtimeapi/list/" + $('#list_serv_select').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/, /g, ','); if (data.indexOf('error: ') != '-1') { @@ -224,15 +200,19 @@ $( function() { for (let i = 0; i < data.split(',').length; i++) { if (value[i] != '') { - value[i] = value[i].replace(/\'/g, ''); - value[i] = value[i].replace('(', ''); - value[i] = value[i].replace(')', ''); - value[i] = value[i].replace('[', ''); - value[i] = value[i].replace(']', ''); - id = value[i].split(' ')[0]; - full_text_option = value[i].split(' ')[1] - text_option = full_text_option.split('/').slice(-2)[0]; - text_option = text_option + '/' + full_text_option.split('/').slice(-1)[0]; + try { + value[i] = value[i].replace(/\'/g, ''); + value[i] = value[i].replace('(', ''); + value[i] = value[i].replace(')', ''); + value[i] = value[i].replace('[', ''); + value[i] = value[i].replace(']', ''); + id = value[i].split(' ')[0]; + full_text_option = value[i].split(' ')[1] + text_option = full_text_option.split('/').slice(-2)[0]; + text_option = text_option + '/' + full_text_option.split('/').slice(-1)[0]; + } catch (err) { + text_option = value[i]; + } $('#list_select').append($("<option title=\"Show list " + text_option + "\"></option>") .attr("value", id) .text(text_option)); @@ -241,20 +221,13 @@ $( function() { $('#list_select').selectmenu("refresh"); } } - } ); + }); }); }); function deleteTableEntry(id, table, ip) { $(id).parent().parent().css("background-color", "#f2dede"); $.ajax( { - url: "options.py", - data: { - serv: $('#table_serv_select').val(), - table_for_delete: table, - ip_for_delete: ip, - token: $('#token').val() - }, - type: "POST", + url: "/app/runtimeapi/table/" + $('#table_serv_select').val() + "/" + table + "/" + ip , success: function( data ) { if (data.indexOf('error: ') != '-1') { toastr.error(data); @@ -266,13 +239,7 @@ function deleteTableEntry(id, table, ip) { } function clearTable(table) { $.ajax( { - url: "options.py", - data: { - serv: $('#table_serv_select').val(), - table_for_clear: table, - token: $('#token').val() - }, - type: "POST", + url: "/app/runtimeapi/table/clear/" + $('#table_serv_select').val() + "/" + table, success: function( data ) { if (data.indexOf('error: ') != '-1') { toastr.error(data); @@ -284,20 +251,14 @@ function clearTable(table) { } function getTable() { $.ajax( { - url: "options.py", - data: { - serv: $('#table_serv_select').val(), - table_select: $('#table_select').val(), - token: $('#token').val() - }, - type: "POST", + url: "/app/runtimeapi/table/" + $('#table_serv_select').val() + "/" + $('#table_select').val(), success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data); } else { $("#ajaxtable").html(data); $( "input[type=submit], button" ).button(); - $.getScript("/inc/script-6.3.9.js"); + $.getScript("/inc/script.js"); $.getScript("/inc/fontawesome.min.js"); FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false }; } @@ -306,21 +267,18 @@ function getTable() { } function getList() { $.ajax( { - url: "options.py", - data: { - serv: $('#list_serv_select').val(), - list_select_id: $('#list_select').val(), - list_select_name: $('#list_select option:selected').text(), - token: $('#token').val() - }, - type: "POST", + url: "/app/runtimeapi/list/" + $('#list_serv_select').val() + "/" + $('#list_select').val() + "/" + $('#list_select option:selected').text(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function( data ) { if (data.indexOf('error: ') != '-1') { toastr.error(data); } else { $("#ajaxlist").html(data); $( "input[type=submit], button" ).button(); - $.getScript("/inc/script-6.3.9.js"); + $.getScript("/inc/script.js"); $.getScript("/inc/fontawesome.min.js"); FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false }; } @@ -331,7 +289,7 @@ function deleteListIp(id, list_id, ip_id, ip) { toastr.clear(); $(id).parent().parent().css("background-color", "#f2dede !important"); $.ajax( { - url: "options.py", + url: "/app/runtimeapi/list/delete", data: { serv: $('#list_serv_select').val(), list_id_for_delete: list_id, @@ -361,7 +319,7 @@ function addNewIp() { var ip = $('#list_add_ip_new_ip').val(); if(valid) { $.ajax({ - url: "options.py", + url: "/app/runtimeapi/add/", data: { serv: $('#list_serv_select').val(), list_ip_for_add: ip, @@ -384,70 +342,65 @@ function addNewIp() { } } function getSessions() { - $.ajax( { - url: "options.py", - data: { - sessions_select: $('#sessions_serv_select').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + $.ajax({ + url: "/app/runtimeapi/session/" + $('#sessions_serv_select').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { if (data.indexOf('error: ') != '-1') { toastr.error(data); } else { $("#ajaxsessions").html(data); - $( "input[type=submit], button" ).button(); - $.getScript("/inc/script-6.3.9.js"); + $("input[type=submit], button").button(); + $.getScript("/inc/script.js"); $.getScript("/inc/fontawesome.min.js"); - FontAwesomeConfig = { searchPseudoElements: true, observeMutations: false }; + FontAwesomeConfig = {searchPseudoElements: true, observeMutations: false}; } } - } ); + }); } function getSessionInfo(sess_id) { - $.ajax( { - url: "options.py", - data: { - sessions_select_show: $('#sessions_serv_select').val(), - sessions_select_id: sess_id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + $.ajax({ + url: "/app/runtimeapi/session/" + $('#sessions_serv_select').val() + "/" + sess_id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { if (data.indexOf('danger') != '-1') { toastr.error(data); } else { toastr.clear(); $("#get-session-info-body").html(data); - $( "#get-session-info" ).dialog({ + $("#get-session-info").dialog({ resizable: false, height: "auto", width: 790, modal: true, title: "View session", buttons: { - Close: function() { - $( this ).dialog( "close" ); + Close: function () { + $(this).dialog("close"); $("#get-session-info-body").html(''); } } }); } } - } ); + }); } function deleteSession(id, sess_id) { toastr.clear(); $(id).parent().parent().css("background-color", "#f2dede !important"); - $.ajax( { - url: "options.py", - data: { - serv: $('#sessions_serv_select').val(), - session_delete_id: sess_id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + $.ajax({ + url: "/app/runtimeapi/session/delete/" +$('#sessions_serv_select').val() + "/" + sess_id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { if (data.indexOf('error: ') != '-1') { toastr.error(data); } else { @@ -456,17 +409,11 @@ function deleteSession(id, sess_id) { getSessions(); } } - } ); + }); } function get_backends(server_ip, backends_select_tag, ip_and_port=0) { $.ajax({ - url: "options.py", - data: { - ip_select: 1, - serv: server_ip, - token: $('#token').val() - }, - type: "POST", + url: "/app/runtimeapi/backends/" + server_ip, success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error: ') != '-1') { @@ -485,13 +432,7 @@ function get_backends(server_ip, backends_select_tag, ip_and_port=0) { } function get_backend_servers(server_ip, backend, servers_select_tag, ip_and_port=0) { $.ajax({ - url: "options.py", - data: { - serv: server_ip, - ipbackend: backend, - token: $('#token').val() - }, - type: "POST", + url: "/app/runtimeapi/backend/servers/" + server_ip + "/" + backend, success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error: ') != '-1') { diff --git a/inc/script-6.3.9.js b/inc/script.js similarity index 68% rename from inc/script-6.3.9.js rename to inc/script.js index 79db20b3..9b79f5f0 100644 --- a/inc/script-6.3.9.js +++ b/inc/script.js @@ -1,6 +1,6 @@ -var url = "/inc/script-6.3.9.js"; -var cur_url = window.location.href.split('/').pop(); -cur_url = cur_url.split('?'); +var url = "/inc/script.js"; +var cur_url = window.location.href.split('/app/').pop(); +cur_url = cur_url.split('/'); var intervalId; function validateEmail(email) { const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; @@ -27,77 +27,101 @@ function show_current_page(id) { } $( function() { $('.menu li ul li').each(function () { - var link = $(this).find('a').attr('href'); + var link = $(this).find('a').attr('href'); var link2 = link.split('/')[2]; + var link3 = link.split('/')[3]; + var link4 = link.split('/')[4]; if (cur_url[1] == null) { cur_url[1] = 'haproxy'; } - if (cur_url[0] == link2 && cur_url[1].split('&')[0] != 'service=keepalived' && cur_url[1].split('&')[0] != 'service=nginx' && cur_url[1].split('&')[0] != 'service=apache') { - show_current_page($(this)) - } else if(cur_url[0] == 'config.py' && cur_url[1].split('&')[0] == 'service=keepalived' && link2 == 'config.py?service=keepalived'){ - show_current_page($(this)) - } else if(cur_url[0] == 'config.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'config.py?service=haproxy'){ - show_current_page($(this)) - } else if(cur_url[0] == 'config.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'config.py?service=nginx'){ - show_current_page($(this)) - } else if(cur_url[0] == 'config.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'config.py?service=apache'){ - show_current_page($(this)) - } else if(cur_url[0] == 'versions.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'versions.py?service=nginx'){ - show_current_page($(this)) - } else if(cur_url[0] == 'versions.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'versions.py?service=haproxy'){ - show_current_page($(this)) - } else if(cur_url[0] == 'versions.py' && cur_url[1].split('&')[0] == 'service=keepalived' && link2 == 'versions.py?service=keepalived'){ - show_current_page($(this)) - } else if(cur_url[0] == 'versions.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'versions.py?service=apache'){ - show_current_page($(this)) - } else if(cur_url[0] == 'logs.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'logs.py?service=haproxy'){ - show_current_page($(this)) - } else if(cur_url[0] == 'logs.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'logs.py?service=nginx'){ - show_current_page($(this)) - } else if(cur_url[0] == 'logs.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'logs.py?service=apache'){ - show_current_page($(this)) - } else if(cur_url[0] == 'logs.py' && cur_url[1].split('&')[0] == 'service=keepalived' && link2 == 'logs.py?service=keepalived'){ - show_current_page($(this)) - } else if(cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'hapservers.py?service=haproxy'){ - show_current_page($(this)) - } else if(cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'hapservers.py?service=nginx'){ - show_current_page($(this)) - } else if(cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[0] == 'service=keepalived' && link2 == 'hapservers.py?service=keepalived'){ - show_current_page($(this)) - } else if(cur_url[0] == 'hapservers.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'hapservers.py?service=apache'){ - show_current_page($(this)) - } else if(cur_url[0] == 'statsview.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'statsview.py?service=haproxy'){ - show_current_page($(this)) - } else if(cur_url[0] == 'statsview.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'statsview.py?service=nginx'){ - show_current_page($(this)) - } else if(cur_url[0] == 'statsview.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'statsview.py?service=apache'){ - show_current_page($(this)) - } else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=view' && link2 == 'smon.py?action=view'){ + var full_uri = cur_url[0] + '/' + cur_url[1] + var full_uri1 = link2 + '/' + link3 + var full_uri2 = cur_url[0] + '/' + cur_url[1] + '/' + cur_url[2] + var full_uri3 = link2 + '/' + link3 + '/' + link4 + if (cur_url[0] == link2 && link3 == null) { show_current_page($(this)) - } else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=add' && link2 == 'smon.py?action=add'){ + } else if (full_uri == 'config/haproxy' && full_uri1 == 'config/haproxy') { show_current_page($(this)) - } else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=history' && link2 == 'smon.py?action=history'){ + } else if (full_uri == 'config/nginx' && full_uri1 == 'config/nginx') { show_current_page($(this)) - } else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=checker_history' && link2 == 'smon.py?action=checker_history'){ + } else if (full_uri == 'config/apache' && full_uri1 == 'config/apache') { show_current_page($(this)) - } else if(cur_url[0] == 'smon.py' && cur_url[1].split('&')[0] == 'action=dashboard' && link2.indexOf('smon.py?action=view') != '-1'){ + } else if (full_uri == 'config/keepalived' && full_uri1 == 'config/keepalived') { show_current_page($(this)) - } else if(cur_url[0] == 'add.py' && cur_url[1].split('&')[0] == 'service=nginx#ssl' && link2 == 'add.py?service=nginx#ssl'){ + } else if (full_uri2 == 'config/versions/haproxy' && full_uri3 == 'config/versions/haproxy') { show_current_page($(this)) - } else if(cur_url[0] == 'viewlogs.py' && cur_url[1].split('&')[0] == 'type=2' && link2 == 'viewlogs.py?type=2') { + } else if (full_uri2 == 'config/versions/nginx' && full_uri3 == 'config/versions/nginx') { + show_current_page($(this)) + } else if (full_uri2 == 'config/versions/keepalived' && full_uri3 == 'config/versions/keepalived') { + show_current_page($(this)) + } else if (full_uri2 == 'config/versions/apache' && full_uri3 == 'config/versions/apache') { + show_current_page($(this)) + } else if (full_uri2 == 'config/map/haproxy' && full_uri1 == 'config/haproxy') { + show_current_page($(this)) + } else if (full_uri2 == 'config/compare/haproxy' && full_uri1 == 'config/haproxy') { + show_current_page($(this)) + } else if (full_uri2 == 'config/compare/nginx' && full_uri1 == 'config/nginx') { + show_current_page($(this)) + } else if (full_uri2 == 'config/compare/keepalived' && full_uri3 == 'config/keepalived') { + show_current_page($(this)) + } else if (full_uri2 == 'config/compare/apache' && full_uri3 == 'config/apache') { + show_current_page($(this)) + } else if (full_uri == 'logs/haproxy' && full_uri1 == 'logs/haproxy') { + show_current_page($(this)) + } else if (full_uri == 'logs/nginx' && full_uri1 == 'logs/nginx') { + show_current_page($(this)) + } else if (full_uri == 'logs/keepalived' && full_uri1 == 'logs/keepalived') { + show_current_page($(this)) + } else if (full_uri == 'logs/apache' && full_uri1 == 'logs/apache') { + show_current_page($(this)) + } else if (full_uri == 'service/haproxy' && full_uri1 == 'service/haproxy') { + show_current_page($(this)) + } else if (full_uri == 'service/nginx' && full_uri1 == 'service/nginx') { + show_current_page($(this)) + } else if (full_uri == 'service/keepalived' && full_uri1 == 'service/keepalived') { + show_current_page($(this)) + } else if (full_uri == 'service/apache' && full_uri1 == 'service/apache') { + show_current_page($(this)) + } else if (full_uri == 'stats/haproxy' && full_uri1 == 'stats/haproxy') { + show_current_page($(this)) + } else if (full_uri == 'stats/nginx' && full_uri1 == 'stats/nginx') { + show_current_page($(this)) + } else if (full_uri == 'stats/apache' && full_uri1 == 'stats/apache') { + show_current_page($(this)) + } else if (full_uri.indexOf('add/haproxy#') != '-1' && full_uri1.indexOf('add/haproxy#proxy') != '-1') { + show_current_page($(this)) + } else if (full_uri == 'add/haproxy#ssl' && full_uri1 == 'add/haproxy#ssl') { + show_current_page($(this)) + } else if (full_uri == 'add/nginx#proxy' && full_uri1 == 'add/nginx#proxy') { + show_current_page($(this)) + } else if (full_uri == 'smon/dashboard' && full_uri1 == 'smon/dashboard') { + show_current_page($(this)) + } else if (full_uri == 'smon/admin' && full_uri1 == 'smon/admin') { + show_current_page($(this)) + } else if (full_uri == 'smon/history' && full_uri1 == 'smon/history') { + show_current_page($(this)) + } else if (full_uri == 'checker/settings' && full_uri1 == 'checker/settings') { + show_current_page($(this)) + } else if (full_uri == 'checker/history' && full_uri1 == 'checker/history') { + show_current_page($(this)) + } else if (full_uri == 'add/haproxy?service=nginx#ssl' && cur_url[1].split('?')[1] == 'service=nginx#ssl' && full_uri1 == 'add/haproxy?service=nginx#ssl') { + show_current_page($(this)) + } else if (cur_url[0] == 'app/logs' && cur_url[1].split('&')[0] == 'type=2' && link2 == 'viewlogs.py?type=2') { show_current_page($(this)); return false; - } else if(cur_url[0] == 'metrics.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'metrics.py?service=haproxy'){ + } else if (full_uri == 'metrics/haproxy' && full_uri1 == 'metrics/haproxy') { show_current_page($(this)) - } else if(cur_url[0] == 'metrics.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'metrics.py?service=nginx'){ + } else if (full_uri == 'metrics/nginx' && full_uri1 == 'metrics/nginx') { show_current_page($(this)) - } else if(cur_url[0] == 'metrics.py' && cur_url[1].split('&')[0] == 'service=apache' && link2 == 'metrics.py?service=apache'){ + } else if (full_uri == 'metrics/apache' && full_uri1 == 'metrics/apache') { show_current_page($(this)) - } else if(cur_url[0] == 'add.py' && cur_url[1].split('&')[0] == 'service=apache#ssl' && link2 == 'add.py?service=apache#ssl'){ + } else if (full_uri == 'add/haproxy?service=apache#ssl' && cur_url[1].split('?')[1] == 'service=apache#ssl' && full_uri1 == 'add/haproxy?service=apache#ssl') { show_current_page($(this)) - } else if(cur_url[0] == 'waf.py' && cur_url[1].split('&')[0] == 'service=haproxy' && link2 == 'waf.py?service=haproxy'){ + } else if (full_uri == 'waf/haproxy' && full_uri1 == 'waf/haproxy') { show_current_page($(this)) - } else if(cur_url[0] == 'waf.py' && cur_url[1].split('&')[0] == 'service=nginx' && link2 == 'waf.py?service=nginx'){ + } else if (full_uri == 'waf/nginx' && full_uri1 == 'waf/nginx') { + show_current_page($(this)) + } else if (full_uri == 'install/ha' && full_uri1 == 'install/ha') { show_current_page($(this)) } }); @@ -118,17 +142,17 @@ jQuery.expr[':'].regex = function(elem, index, match) { window.onblur= function() { window.onfocus= function () { if(sessionStorage.getItem('auto-refresh-pause') == "0" && sessionStorage.getItem('auto-refresh') > 5000) { - if (cur_url[0] == "logs.py") { + if (cur_url[0] == "logs") { showLog(); - } else if (cur_url[0] == "statsview.py") { + } else if (cur_url[0] == "stats") { showStats() - } else if (cur_url[0] == "overview.py") { + } else if (cur_url[0] == "/") { showOverview(); - } else if (cur_url[0] == "viewlogs.py") { + } else if (cur_url[0] == "internal") { viewLogs(); - } else if (cur_url[0] == "metrics.py") { + } else if (cur_url[0] == "metrics") { showMetrics(); - } else if (cur_url[0] == "smon.py" && cur_url[1].split('&')[0] == "action=view") { + } else if (cur_url[0] == "smon" && cur_url[1] == "dasboards") { showSmon('refresh') } } @@ -136,59 +160,57 @@ window.onblur= function() { }; if(localStorage.getItem('restart')) { var ip_for_restart = localStorage.getItem('restart'); - $.ajax( { - url: "options.py", - data: { - act: "checkrestart", - serv: ip_for_restart, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - if(data.indexOf('ok') != '-1') { + $.ajax({ + url: "/app/service/check-restart/" + ip_for_restart, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + if (data.indexOf('ok') != '-1') { var apply_div = $.find("#apply_div"); apply_div = apply_div[0].id; $("#apply").css('display', 'block'); - $('#'+apply_div).css('width', '850px'); + $('#' + apply_div).css('width', '850px'); ip_for_restart = escapeHtml(ip_for_restart); - if (cur_url[0] == "hapservers.py") { - $('#'+apply_div).css('width', '650px'); - $('#'+apply_div).addClass("alert-one-row"); - $('#'+apply_div).html("You have made changes to the server: "+ip_for_restart+". Changes will take effect only after<a id='"+ip_for_restart+"' class='restart' title='Restart HAproxy service' onclick=\"confirmAjaxAction('restart', 'hap', '"+ip_for_restart+"')\">restart</a><a href='#' title='close' id='apply_close' style='float: right'><b>X</b></a>"); + if (cur_url[0] == "service") { + $('#' + apply_div).css('width', '650px'); + $('#' + apply_div).addClass("alert-one-row"); + $('#' + apply_div).html("You have made changes to the server: " + ip_for_restart + ". Changes will take effect only after<a id='" + ip_for_restart + "' class='restart' title='Restart HAproxy service' onclick=\"confirmAjaxAction('restart', 'hap', '" + ip_for_restart + "')\">restart</a><a href='#' title='close' id='apply_close' style='float: right'><b>X</b></a>"); } else { - $('#'+apply_div).html("You have made changes to the server: "+ip_for_restart+". Changes will take effect only after restart. <a href='hapservers.py' title='Overview'>Go to the HAProxy Overview page and restart</a><a href='#' title='close' id='apply_close' style='float: right'><b>X</b></a>"); + $('#' + apply_div).html("You have made changes to the server: " + ip_for_restart + ". Changes will take effect only after restart. <a href='service' title='Overview'>Go to the HAProxy Overview page and restart</a><a href='#' title='close' id='apply_close' style='float: right'><b>X</b></a>"); } - $.getScript('/inc/overview-6.3.9.js'); + $.getScript('/inc/overview.js'); } - } - } ); + } + }); } function autoRefreshStyle(autoRefresh) { var margin; - if (cur_url[0] == "overview.py" || cur_url[0] == "waf.py" || cur_url[0] == "metrics.py") { - if(autoRefresh < 60000) { + if (cur_url[0] == "/" || cur_url[0] == "waf" || cur_url[0] == "metrics") { + if (autoRefresh < 60000) { autoRefresh = 60000; } } autoRefresh = autoRefresh / 1000; - if ( autoRefresh == 60) { + if (autoRefresh == 60) { timeRange = " minute" autoRefresh = autoRefresh / 60; - } else if ( autoRefresh > 60 && autoRefresh < 3600 ) { + } else if (autoRefresh > 60 && autoRefresh < 3600) { timeRange = " minutes" autoRefresh = autoRefresh / 60; - } else if ( autoRefresh >= 3600 && autoRefresh < 86401 ) { + } else if (autoRefresh >= 3600 && autoRefresh < 86401) { timeRange = " hours" - autoRefresh = autoRefresh / 3600; + autoRefresh = autoRefresh / 3600; } else { timeRange = " seconds"; } $('#1').text(autoRefresh + timeRange); $('#0').text(autoRefresh + timeRange); - $('.auto-refresh-pause').css('display', 'inline'); - $('.auto-refresh-resume').css('display', 'none'); - $('.auto-refresh-pause').css('margin-left', "-25px"); - $('.auto-refresh-resume').css('margin-left', "-25px"); + $('.auto-refresh-pause').css('display', 'inline'); + $('.auto-refresh-resume').css('display', 'none'); + $('.auto-refresh-pause').css('margin-left', "-25px"); + $('.auto-refresh-resume').css('margin-left', "-25px"); $('#browse_histroy').css("border-bottom", "none"); $('.auto-refresh img').remove(); } @@ -219,44 +241,44 @@ function setRefreshInterval(interval) { } function startSetInterval(interval) { if(sessionStorage.getItem('auto-refresh-pause') == "0") { - if (cur_url[0] == "logs.py") { + if (cur_url[0] == "logs") { intervalId = setInterval('showLog()', interval); showLog(); - } else if (cur_url[0] == "statsview.py") { + } else if (cur_url[0] == "stats") { intervalId = setInterval('showStats()', interval); showStats() - } else if (cur_url[0] == "overview.py") { + } else if (cur_url[0] == "/") { if(interval < 60000) { interval = 60000; } intervalId = setInterval('showOverview(ip, hostnamea)', interval); - showOverview(ip, hostnamea); - } else if (cur_url[0] == "viewlogs.py") { + showOverview(ip, hostnamea); + } else if (cur_url[1] == "internal") { intervalId = setInterval('viewLogs()', interval); viewLogs(); - } else if (cur_url[0] == "metrics.py") { + } else if (cur_url[0] == "metrics") { if(interval < 60000) { interval = 60000; } intervalId = setInterval('showMetrics()', interval); showMetrics(); - } else if (cur_url[0] == "waf.py") { + } else if (cur_url[0] == "waf") { if(interval < 60000) { interval = 60000; } intervalId = setInterval('showOverviewWaf(ip, hostnamea)', interval); showOverviewWaf(ip, hostnamea); showWafMetrics(); - } else if (cur_url[0] == "hapservers.py") { + } else if (cur_url[0] == "service") { if(interval < 60000) { interval = 60000; } intervalId = setInterval('showMetrics()', interval); showMetrics(); - } else if (cur_url[0] == "smon.py" && cur_url[1].split('&')[0] == "action=view") { + } else if (cur_url[0] == "smon" && cur_url[1] == "dashboards") { intervalId = setInterval("showSmon('refresh')", interval); showSmon('refresh'); - } else if (cur_url[0] == "smon.py" && cur_url[1].split('&')[0] == "action=dashboard") { + } else if (cur_url[0] == "smon" && cur_url[1] == "history") { if(interval < 60000) { interval = 60000; } @@ -278,7 +300,6 @@ function pauseAutoResume(){ setRefreshInterval(autoRefresh); sessionStorage.setItem('auto-refresh-pause', '0'); } - function hideAutoRefreshDiv() { $(function() { $('.auto-refresh-div').hide("blind", "fast"); @@ -293,45 +314,49 @@ $( document ).ajaxComplete(function( event, request, settings ) { NProgress.done(); }); function showStats() { - $.ajax( { - url: "options.py", - data: { - act: "stats", - serv: $("#serv").val(), - service: $("#service").val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + $.ajax({ + url: "/app/stats/view/" + $("#service").val() + "/" + $("#serv").val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { if (data.indexOf('error:') != '-1' && data.indexOf('Internal error:') == '-1') { toastr.error(data); } else { toastr.clear(); $("#ajax").html(data); - window.history.pushState("Stats", "Stats", cur_url[0] + "?service=" + $("#service").val() + "&serv=" + $("#serv").val()); + window.history.pushState("Stats", "Stats", "/app/stats/" + $("#service").val() + "/" + $("#serv").val()); wait(); } - } - } ); + } + }); } function openStats() { var serv = $("#serv").val(); - var service_url = cur_url[1].split('&')[0]; - var url = "statsview.py?"+service_url+"&serv="+serv+"&open=open" + var service_url = cur_url[1]; + var url = "/app/stats/"+service_url+"/"+serv var win = window.open(url, '_blank'); win.focus(); } function openVersions() { var serv = $("#serv").val(); - var service_url = cur_url[1].split('&')[0]; - var url = "versions.py?"+service_url+"&serv="+serv+"&open=open" + var service_url = cur_url[1]; + var url = "/app/config/versions/"+service_url+"/"+serv + var win = window.open(url,"_self"); + win.focus(); +} +function openSection() { + var serv = $("#serv").val(); + var section = $("#section").val(); + var url = "/app/config/section/haproxy/"+serv+"/"+section; var win = window.open(url,"_self"); win.focus(); } function showLog() { - var waf = findGetParameter('waf'); + var waf = cur_url[2]; var file = $('#log_files').val(); - if ((file === undefined || file === null) && waf != '1') { + if ((file === undefined || file === null) && waf == '') { var file_from_get = findGetParameter('file'); if (file_from_get === undefined || file_from_get === null) { toastr.warning('Select a log file first') @@ -344,26 +369,30 @@ function showLog() { var grep = $('#grep').val() var exgrep = $('#exgrep').val() var hour = $('#time_range_out_hour').val() - var minut = $('#time_range_out_minut').val() + var minute = $('#time_range_out_minut').val() var hour1 = $('#time_range_out_hour1').val() - var minut1 = $('#time_range_out_minut1').val() + var minute1 = $('#time_range_out_minut1').val() var service = $('#service').val() if (service == 'None') { service = 'haproxy'; } + if (waf) { + var url = "/app/logs/" + service + "/waf/" + $("#serv").val() + "/" + rows; + waf = 1; + } else { + var url = "/app/logs/" + service + "/" + $("#serv").val() + "/" + rows; + } $.ajax( { - url: "options.py", + url: url, data: { show_log: rows, - serv: $("#serv").val(), waf: waf, grep: grep, exgrep: exgrep, hour: hour, - minut: minut, + minute: minute, hour1: hour1, - minut1: minut1, - service: service, + minute1: minute1, file: file, token: $('#token').val() }, @@ -371,17 +400,6 @@ function showLog() { success: function( data ) { toastr.clear(); $("#ajax").html(data); - window.history.pushState("Logs", "Logs", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() + - '&rows=' + rows + - '&exgrep=' + exgrep + - '&grep=' + grep + - '&hour=' + hour + - '&minut=' + minut + - '&hour1=' + hour1 + - '&minut1=' + minut1 + - '&file=' + file + - '&waf=' + waf); - } } ); } @@ -395,19 +413,17 @@ function showRemoteLogFiles() { var grep = $('#grep').val() var exgrep = $('#exgrep').val() var hour = $('#time_range_out_hour').val() - var minut = $('#time_range_out_minut').val() + var minute = $('#time_range_out_minut').val() var hour1 = $('#time_range_out_hour1').val() - var minut1 = $('#time_range_out_minut1').val() + var minute1 = $('#time_range_out_minut1').val() var service = $('#service').val() if (service == 'None') { service = 'haproxy'; } $.ajax( { - url: "options.py", + url: "/app/logs/" + service + "/" + serv , data: { serv: $("#serv").val(), - act: "showRemoteLogFiles", - service: service, token: $('#token').val() }, type: "POST", @@ -418,15 +434,6 @@ function showRemoteLogFiles() { toastr.clear(); $("#remote_log_files").html(data); $.getScript('/inc/configshow.js'); - window.history.pushState("Logs", "Logs", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() + - '&rows=' + rows + - '&exgrep=' + exgrep + - '&grep=' + grep + - '&hour=' + hour + - '&minut=' + minut + - '&hour1=' + hour1 + - '&minut1=' + minut1 + - '&waf=0'); } } } ); @@ -448,34 +455,25 @@ function clearAllAjaxFields() { function showMap() { clearAllAjaxFields(); $('#ajax-config_file_name').empty(); - var unique = $.now(); $.ajax( { - url: "options.py", - data: { - serv: $("#serv").val(), - act: "showMap", - token: $('#token').val() - }, - type: "POST", + url: "/app/config/map/haproxy/" + $("#serv").val() + '/show', success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data); } else { toastr.clear(); $("#ajax").html(data); - window.history.pushState("Show map", "Show map", cur_url[0] + '?service=haproxy&serv=' + $("#serv").val() + '&showMap'); + window.history.pushState("Show Map", "Show Map", '/app/config/map/' + $("#service").val() + '/' + $("#serv").val()); } } } ); } function showCompare() { $.ajax( { - url: "options.py", + url: "/app/config/compare/" + $("#service").val() + "/" + $("#serv").val() + "/show", data: { - serv: $("#serv").val(), left: $('#left').val(), right: $("#right").val(), - service: $("#service").val(), token: $('#token').val() }, type: "POST", @@ -493,15 +491,8 @@ function showCompareConfigs() { clearAllAjaxFields(); $('#ajax-config_file_name').empty(); $.ajax( { - url: "options.py", - data: { - serv: $("#serv").val(), - act: "showCompareConfigs", - open: "open", - service: $("#service").val(), - token: $('#token').val() - }, - type: "POST", + url: "/app/config/compare/" + $("#service").val() + "/" + $("#serv").val() + "/files", + type: "GET", success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data); @@ -510,7 +501,7 @@ function showCompareConfigs() { $("#ajax-compare").html(data); $("input[type=submit], button").button(); $("select").selectmenu(); - window.history.pushState("Show compare config", "Show compare config", cur_url[0] + '?service=' + $("#service").val() + '&serv=' + $("#serv").val() + '&showCompare'); + window.history.pushState("Show compare config", "Show compare config", '/app/config/compare/' + $("#service").val() + '/' + $("#serv").val()); } } } ); @@ -520,19 +511,22 @@ function showConfig() { var config_file_name = encodeURI($('#config_file_name').val()); if (service == 'nginx' || service == 'apache') { if ($('#config_file_name').val() === undefined || $('#config_file_name').val() === null) { - toastr.warning('Select a config file firts'); - return false; + config_file_name = cur_url[4] + if (config_file_name == '') { + toastr.warning('Select a config file firts'); + return false; + } else { + showConfigFiles(true); + } } } clearAllAjaxFields(); $.ajax( { - url: "options.py", + url: "/app/config/" + service + "/show", data: { serv: $("#serv").val(), - act: "configShow", service: service, - config_file_name: config_file_name, - token: $('#token').val() + config_file_name: config_file_name }, type: "POST", success: function( data ) { @@ -542,21 +536,20 @@ function showConfig() { toastr.clear(); $("#ajax").html(data); $.getScript('/inc/configshow.js'); - window.history.pushState("Show config", "Show config", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() + "&showConfig"); + window.history.pushState("Show config", "Show config", "/app/config/" + service + "/" + $("#serv").val() + "/show/" + config_file_name); } } } ); } -function showConfigFiles() { +function showConfigFiles(not_redirect=false) { var service = $('#service').val(); + var server_ip = $("#serv").val(); clearAllAjaxFields(); $.ajax( { - url: "options.py", + url: "/app/config/" + service + "/show-files", data: { - serv: $("#serv").val(), - act: "configShowFiles", - service: service, - token: $('#token').val() + serv: server_ip, + service: service }, type: "POST", success: function( data ) { @@ -566,7 +559,9 @@ function showConfigFiles() { toastr.clear(); $("#ajax-config_file_name").html(data); if (findGetParameter('findInConfig') === null) { - window.history.pushState("Show config", "Show config", cur_url[0] + "?service=" + service + "&serv=" + $("#serv").val() + "&showConfigFiles"); + if (not_redirect) { + window.history.pushState("Show config", "Show config", "/app/config/" + service + "/" + server_ip + "/show-files"); + } } } } @@ -574,18 +569,11 @@ function showConfigFiles() { } function showConfigFilesForEditing() { var service = $('#service').val(); + var server_ip = $("#serv").val(); var config_file_name = findGetParameter('config_file_name') - var service = findGetParameter('service') if (service == 'nginx' || service == 'apache') { $.ajax({ - url: "options.py", - data: { - serv: $("#serv").val(), - act: "configShowFiles", - service: service, - config_file_name: config_file_name, - token: $('#token').val() - }, + url: "/app/config/" + service + "/" + server_ip + "/edit/" + config_file_name, type: "POST", success: function (data) { if (data.indexOf('error:') != '-1') { @@ -603,13 +591,10 @@ function showUploadConfig() { var configver = $('#configver').val(); var serv = $("#serv").val() $.ajax( { - url: "options.py", + url: "/app/config/" + service + "/show", data: { serv: serv, - act: "configShow", - configver: configver, - service: service, - token: $('#token').val(), + configver: configver }, type: "POST", success: function( data ) { @@ -618,26 +603,25 @@ function showUploadConfig() { } else { toastr.clear(); $("#ajax").html(data); - window.history.pushState("Show config", "Show config", cur_url[0] + "?service=" + service + "&serv=" + serv + "&open=open&configver=" + configver); + window.history.pushState("Show config", "Show config", "/app/config/versions/" + service + "/" + serv + "/" + configver); $.getScript('/inc/configshow.js'); } } } ); } function showListOfVersion(for_delver) { + var cur_url = window.location.href.split('/app/').pop(); + cur_url = cur_url.split('/'); var service = $('#service').val(); var serv = $("#serv").val(); - var configver = findGetParameter('configver'); + var configver = cur_url[4]; clearAllAjaxFields(); $.ajax( { - url: "options.py", + url: "/app/config/version/" + service + "/list", data: { serv: serv, - act: "showListOfVersion", - service: service, configver: configver, - for_delver: for_delver, - token: $('#token').val(), + for_delver: for_delver }, type: "POST", success: function( data ) { @@ -647,6 +631,7 @@ function showListOfVersion(for_delver) { toastr.clear(); $("#config_version_div").html(data); $( "input[type=checkbox]" ).checkboxradio(); + window.history.pushState("Show config", "Show config", "/app/config/versions/" + service + "/" + serv); } } } ); @@ -677,10 +662,12 @@ function viewLogs() { if (viewlogs == null){ viewlogs = findGetParameter('viewlogs') } - $.ajax( { - url: "options.py", + var url = "/app/logs/internal/" + viewlogs + "/" + rows; + $.ajax({ + url: url, data: { viewlogs: viewlogs, + serv: viewlogs, rows: rows, grep: grep, exgrep: exgrep, @@ -691,17 +678,8 @@ function viewLogs() { token: $('#token').val(), }, type: "POST", - success: function( data ) { + success: function (data) { $("#ajax").html(data); - window.history.pushState("View logs", "View logs", cur_url[0] + "?type=" + type + - "&viewlogs=" + viewlogs + - '&rows=' + rows + - '&grep=' + grep + - '&exgrep=' + exgrep + - '&hour=' + hour + - '&minut=' + minut + - '&hour1=' + hour1 + - '&minut1=' + minut1); } } ); } @@ -711,7 +689,7 @@ $( function() { try { var cur_path = window.location.pathname; var attr = $(this).attr('href'); - if (cur_path == '/app/add.py' || cur_path == '/app/add_nginx.py' || cur_path == '/app/servers.py' || cur_path == '/app/users.py') { + if (cur_path == '/app/add/haproxy' || cur_path == '/app/add/nginx' || cur_path == '/app/servers' || cur_path == '/app/admin' || cur_path == '/app/install') { if (typeof attr !== typeof undefined && attr !== false) { $('title').text($(this).attr('title')); history.pushState({}, '', $(this).attr('href')); @@ -885,42 +863,37 @@ $( function() { $('#0').css("display", "inline"); }); $('#auth').submit(function() { - let searchParams = new URLSearchParams(window.location.search) - if(searchParams.has('ref')) { - var ref = /.*ref=([^&]*).*/.exec(document.location.href)[1]; - } else { - var ref = "overview.py"; - } $.ajax( { - url: "login.py", + url: "/app/login", data: { login: $('#login').val(), pass: $('#pass').val() }, type: "POST", success: function( data ) { - if (data.indexOf('ok') != '-1') { - window.location.replace(ref); - } else if (data.indexOf('disabled') != '-1') { + if (data.indexOf('disabled') != '-1') { $('.alert').show(); $('.alert').html(data); } else if (data.indexOf('ban') != '-1') { ban(); } else if (data.indexOf('error') != '-1') { toastr.error(data); + } else { + window.location.replace(data); } } } ); return false; }); $('#show_log_form').submit(function() { - if(cur_url[0] == '/app/logs.py') { - showLog(); - } else { - viewLogs(); - } + showLog(); return false; }); + $('#show_internal_log_form').submit(function() { + viewLogs(); + return false; + }); + var user_settings_tabel_title = $( "#show-user-settings-table" ).attr('title'); var cancel_word = $('#translate').attr('data-cancel'); var save_word = $('#translate').attr('data-save'); @@ -928,29 +901,29 @@ $( function() { var password_word = $('#translate').attr('data-password'); var change_pass_word = change_word + ' ' + password_word var showUserSettings = $( "#show-user-settings" ).dialog({ - autoOpen: false, - width: 600, - modal: true, - title: user_settings_tabel_title, - buttons: [{ - text: save_word, - click: function () { - saveUserSettings(); - $(this).dialog("close"); - } - }, { - text: change_pass_word, - click: function () { - changePassword(); - $(this).dialog("close"); - } - }, { - text: cancel_word, - click: function () { - $(this).dialog("close"); - } - }] - }); + autoOpen: false, + width: 600, + modal: true, + title: user_settings_tabel_title, + buttons: [{ + text: save_word, + click: function () { + saveUserSettings(); + $(this).dialog("close"); + } + }, { + text: change_pass_word, + click: function () { + changePassword(); + $(this).dialog("close"); + } + }, { + text: cancel_word, + click: function () { + $(this).dialog("close"); + } + }] + }); $('#show-user-settings-button').click(function() { if (localStorage.getItem('disabled_alert') == '1') { @@ -958,170 +931,208 @@ $( function() { } else { $('#disable_alerting').prop('checked', true).checkboxradio('refresh'); } - $.ajax( { - url: "options.py", - data: { - getcurrentusergroup: 1, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + $.ajax({ + url: "/app/user/group/current", + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { if (data.indexOf('danger') != '-1') { $("#ajax").html(data); } else { $('#show-user-settings-group').html(data); - $( "select" ).selectmenu(); + $("select").selectmenu(); } } - } ); + }); showUserSettings.dialog('open'); }); - var location = window.location.href; - var cur_url = '/app/' + location.split('/').pop(); - cur_url = cur_url.split('?'); - cur_url = cur_url[0].split('#'); - if (cur_url[0] == "/app/users.py" || cur_url[0] == "/app/servers.py") { - $( ".users" ).on( "click", function() { + var cur_url = window.location.href.split('/app/').pop(); + cur_url = cur_url.split('/'); + if (cur_url[0].indexOf('install') != '-1') { + $(".installproxy").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('padding-left', '20px') $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); + $(this).children(".installproxy").css('padding-left', '30px'); + $(this).children(".installproxy").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".installproxy").css('background-color', 'var(--right-menu-blue-rolor)'); + }); + $("#tabs").tabs("option", "active", 0); + }); + $(".installmon").on("click", function () { + $('.menu li ul li').each(function () { + $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); + $(this).children(".installmon").css('padding-left', '30px'); + $(this).children(".installmon").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".installmon").css('background-color', 'var(--right-menu-blue-rolor)'); + }); + $("#tabs").tabs("option", "active", 1); + }); + $(".installgeo").on("click", function () { + $('.menu li ul li').each(function () { + $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); + $(this).children(".installgeo").css('padding-left', '30px'); + $(this).children(".installgeo").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".installgeo").css('background-color', 'var(--right-menu-blue-rolor)'); + }); + $("#tabs").tabs("option", "active", 2); + }); + } + if (cur_url[0].indexOf('admin') != '-1' || cur_url[0].indexOf('servers') != '-1') { + $(".users").on("click", function () { + $('.menu li ul li').each(function () { + $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".users").css('padding-left', '30px'); $(this).children(".users").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".users").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 0 ); - } ); - if (cur_url[0] == "/app/users.py") { - $( ".group" ).on( "click", function() { + $("#tabs").tabs("option", "active", 0); + }); + if (cur_url[0].indexOf('admin') != '-1') { + $(".group").on("click", function () { $('.menu li ul li').each(function () { - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".group").css('padding-left', '30px'); $(this).children(".group").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".group").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 1 ); - } ); - $( ".runtime" ).on( "click", function() { + $("#tabs").tabs("option", "active", 1); + }); + $(".runtime").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".runtime").css('padding-left', '30px'); $(this).children(".runtime").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".runtime").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 2 ); - } ); - $( ".admin" ).on( "click", function() { + $("#tabs").tabs("option", "active", 2); + }); + $(".admin").on("click", function () { $('.menu li ul li').each(function () { - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".admin").css('padding-left', '30px'); $(this).children(".admin").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".admin").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 3 ); - } ); - $( ".checker" ).on( "click", function() { + $("#tabs").tabs("option", "active", 3); + }); + $(".settings").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); - $(this).find('a').css('padding-left', '20px') - $(this).children(".checker").css('padding-left', '30px'); - $(this).children(".checker").css('border-left', '4px solid var(--right-menu-blue-rolor)'); - }); - loadchecker(); - $( "#tabs" ).tabs( "option", "active", 4 ); - } ); - $( ".settings" ).on( "click", function() { - $('.menu li ul li').each(function () { - $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".settings").css('padding-left', '30px'); $(this).children(".settings").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".settings").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 6 ); - } ); - $( ".services" ).on( "click", function() { + $("#tabs").tabs("option", "active", 5); + }); + $(".services").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".services").css('padding-left', '30px'); $(this).children(".services").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".services").css('background-color', 'var(--right-menu-blue-rolor)'); }); + $("#tabs").tabs("option", "active", 6); loadServices(); - $( "#tabs" ).tabs( "option", "active", 7 ); - } ); - $( ".updatehapwi" ).on( "click", function() { + }); + $(".updatehapwi").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".updatehapwi").css('padding-left', '30px'); $(this).children(".updatehapwi").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".updatehapwi").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 8 ); + $("#tabs").tabs("option", "active", 7); loadupdatehapwi(); - } ); + }); } else { - $( ".runtime" ).on( "click", function() { + $(".runtime").on("click", function () { $('.menu li ul li').each(function () { - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".runtime").css('padding-left', '30px'); $(this).children(".runtime").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".runtime").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 1 ); - } ); - $( ".admin" ).on( "click", function() { + $("#tabs").tabs("option", "active", 1); + }); + $(".admin").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".admin").css('padding-left', '30px'); $(this).children(".admin").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".admin").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 2 ); - } ); - $( ".checker" ).on( "click", function() { + $("#tabs").tabs("option", "active", 2); + }); + $(".settings").on("click", function () { $('.menu li ul li').each(function () { $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); - $(this).find('a').css('padding-left', '20px') - $(this).children(".checker").css('padding-left', '30px'); - $(this).children(".checker").css('border-left', '4px solid var(--right-menu-blue-rolor)'); - }); - loadchecker(); - $( "#tabs" ).tabs( "option", "active", 3 ); - } ); - $( ".settings" ).on( "click", function() { - $('.menu li ul li').each(function () { - $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".settings").css('padding-left', '30px'); $(this).children(".settings").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".settings").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 4 ); - } ); - $( ".installproxy" ).on( "click", function() { + $("#tabs").tabs("option", "active", 4); + }); + $(".installproxy").on("click", function () { $('.menu li ul li').each(function () { - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".installproxy").css('padding-left', '30px'); $(this).children(".installproxy").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".installproxy").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 5 ); - } ); - $( ".installmon" ).on( "click", function() { + $("#tabs").tabs("option", "active", 5); + }); + $(".installmon").on("click", function () { $('.menu li ul li').each(function () { - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".installmon").css('padding-left', '30px'); $(this).children(".installmon").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".installmon").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 6 ); - } ); - $( ".backup" ).on( "click", function() { + $("#tabs").tabs("option", "active", 6); + }); + $(".backup").on("click", function () { $('.menu li ul li').each(function () { - $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('padding-left', '20px'); $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); + $(this).find('a').css('background-color', '#48505A'); $(this).children(".backup").css('padding-left', '30px'); $(this).children(".backup").css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children(".backup").css('background-color', 'var(--right-menu-blue-rolor)'); }); - $( "#tabs" ).tabs( "option", "active", 7 ); - } ); + $("#tabs").tabs("option", "active", 7); + }); } } $('.copyToClipboard').hover(function (){ @@ -1147,7 +1158,7 @@ function saveUserSettings(){ localStorage.setItem('disabled_alert', '1'); } changeCurrentGroupF(); - Cookies.set('lang', $('#lang_select').val(), { expires: 365, path: '/app', samesite: 'strict', secure: 'true' }); + Cookies.set('lang', $('#lang_select').val(), { expires: 365, path: '/', samesite: 'strict', secure: 'true' }); } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); @@ -1156,7 +1167,7 @@ async function ban() { $( '#login').attr('disabled', 'disabled'); $( '#pass').attr('disabled', 'disabled'); $( "input[type=submit], button" ).button('disable'); - $('.alert').show(); + $('#wrong-login').show(); $('#ban_10').show(); $( '#ban_timer').text(10); @@ -1183,7 +1194,7 @@ function replace_text(id_textarea, text_var) { } function createHistroy() { if(localStorage.getItem('history') === null) { - var get_history_array = ['login.py', 'login.py','login.py']; + var get_history_array = ['login', 'login','login']; localStorage.setItem('history', JSON.stringify(get_history_array)); } } @@ -1201,7 +1212,7 @@ function listHistroy() { } if (i == 2) { if(cur_url[1] !== undefined) { - browse_history[2] = cur_url[0] + '?' + cur_url[1] + browse_history[2] = cur_url[0] + '/' + cur_url[1] } else { browse_history[2] = cur_url[0] } @@ -1209,8 +1220,7 @@ function listHistroy() { $( function() { $('.menu li ul li').each(function () { var link1 = $(this).find('a').attr('href'); - var link2 = link1.split('/')[2] - if (browse_history[i] == link2) { + if (browse_history[i] == link1) { title[i] = $(this).find('a').attr('title'); link_text[i] = $(this).find('a').text(); history_link = '<li><a href="'+browse_history[i]+'" title="'+title[i]+'">'+link_text[i]+'</a></li>' @@ -1224,18 +1234,18 @@ function listHistroy() { createHistroy() listHistroy() -function changeCurrentGroupF(){ +function changeCurrentGroupF() { Cookies.remove('group'); - Cookies.set('group', $('#newCurrentGroup').val(), { expires: 365, path: '/app', samesite: 'strict', secure: 'true' }); - $.ajax( { - url: "options.py", + Cookies.set('group', $('#newCurrentGroup').val(), {expires: 365, path: '/', samesite: 'strict', secure: 'true'}); + $.ajax({ + url: "/app/user/group/change", data: { changeUserCurrentGroupId: $('#newCurrentGroup').val(), changeUserGroupsUser: Cookies.get('uuid'), token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { if (data.indexOf('error: ') != '-1') { toastr.error(data); } else { @@ -1243,8 +1253,7 @@ function changeCurrentGroupF(){ location.reload(); } } - } ); - + }); } function updateTips( t ) { var tips = $( ".validateTips" ); @@ -1367,71 +1376,68 @@ function changePassword() { function changeUserPasswordItOwn(d) { var pass = $('#change-password').val(); var pass2 = $('#change2-password').val(); - if(pass != pass2) { + if (pass != pass2) { $('#missmatchpass').show(); } else { $('#missmatchpass').hide(); toastr.clear(); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/user/password", data: { updatepassowrd: pass, uuid: Cookies.get('uuid'), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); } else { toastr.clear(); - d.dialog( "close" ); + d.dialog("close"); } } - } ); + }); } } function findInConfig(words) { clearAllAjaxFields(); - $.ajax( { - url: "options.py", - data: { - serv: $("#serv").val(), - act: "findInConfigs", - service: $("#service").val(), - words: words, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - if (data.indexOf('error:') != '-1') { - toastr.error(data); - } else { - toastr.clear(); - $("#ajax").html(data); - } + $.ajax({ + url: "/app/config/" + $("#service").val() + "/find-in-config", + data: { + serv: $("#serv").val(), + words: words + }, + type: "POST", + success: function (data) { + if (data.indexOf('error:') != '-1') { + toastr.error(data); + } else { + toastr.clear(); + $("#ajax").html(data); } - } ); + } + }); } function waitForElm(selector) { - return new Promise(resolve => { - if (document.querySelector(selector)) { - return resolve(document.querySelector(selector)); - } + return new Promise(resolve => { + if (document.querySelector(selector)) { + return resolve(document.querySelector(selector)); + } - const observer = new MutationObserver(mutations => { - if (document.querySelector(selector)) { - resolve(document.querySelector(selector)); - observer.disconnect(); - } - }); + const observer = new MutationObserver(mutations => { + if (document.querySelector(selector)) { + resolve(document.querySelector(selector)); + observer.disconnect(); + } + }); - observer.observe(document.body, { - childList: true, - subtree: true - }); - }); + observer.observe(document.body, { + childList: true, + subtree: true + }); + }); } function randomIntFromInterval(min, max) { return Math.floor(Math.random() * (max - min + 1) + min) @@ -1469,7 +1475,7 @@ function returnNiceCheckingConfig(data) { console.log(err); } alerts.forEach((element) => { - if (element.indexOf('error: ') != '-1' || element.indexOf('Fatal') != '-1' || element.indexOf('Error') != '-1' || element.indexOf('failed ') != '-1' || element.indexOf('emerg] ') != '-1' || element.indexOf('Syntax error ') != '-1' || element.indexOf('Parsing') != '-1' || element.indexOf('parsing') != '-1') { + if (element.indexOf('error: ') != '-1' || element.indexOf('Fatal') != '-1' || element.indexOf('Error') != '-1' || element.indexOf('failed ') != '-1' || element.indexOf('emerg] ') != '-1' || element.indexOf('Syntax error ') != '-1' || element.indexOf('Parsing') != '-1') { alert_error = alert_error + element; return } @@ -1512,12 +1518,7 @@ function returnNiceCheckingConfig(data) { function show_version() { NProgress.configure({showSpinner: false}); $.ajax( { - url: "options.py", - data: { - show_versions: 1, - token: $('#token').val() - }, - type: "POST", + url: "/app/internal/show_version", success: function( data ) { $('#version').html(data); var showUpdates = $( "#show-updates" ).dialog({ diff --git a/inc/smon-6.3.16.js b/inc/smon.js similarity index 93% rename from inc/smon-6.3.16.js rename to inc/smon.js index 108be196..800dbec3 100644 --- a/inc/smon-6.3.16.js +++ b/inc/smon.js @@ -13,8 +13,7 @@ function showSmon(action) { var sort = ''; var location = window.location.href; var cur_url = '/app/' + location.split('/').pop(); - cur_url = cur_url.split('?'); - cur_url[1] = cur_url[1].split('#')[0]; + console.log(cur_url) if (action == 'refresh') { try { sort = cur_url[1].split('&')[1]; @@ -23,28 +22,27 @@ function showSmon(action) { sort = ''; } } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/smon/refresh", data: { - showsmon: 1, sort: sort, token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { if (data.indexOf('SMON error:') != '-1') { toastr.error(data); } else { toastr.clear(); $("#smon_dashboard").html(data); - if (action == 'not_sort') { - window.history.pushState("SMON Dashboard", document.title, "smon.py?action=view"); - } else { - window.history.pushState("SMON Dashboard", document.title, cur_url[0] + "?" + cur_url[1]); - } + // if (action == 'not_sort') { + // window.history.pushState("SMON Dashboard", document.title, "/app/smon"); + // } else { + // window.history.pushState("SMON Dashboard", document.title, cur_url[0] + "?" + cur_url[1]); + // } } } - } ); + }); } function addNewSmonServer(dialog_id) { var valid = true; @@ -83,7 +81,7 @@ function addNewSmonServer(dialog_id) { } if (valid) { $.ajax( { - url: "options.py", + url: "/app/smon/add", data: { newsmonname: $('#new-smon-name').val(), newsmon: $('#new-smon-ip').val(), @@ -155,15 +153,15 @@ function confirmDeleteSmon(id, check_type) { function removeSmon(id, check_type) { $("#smon-"+id).css("background-color", "#f2dede"); $.ajax( { - url: "options.py", - data: { - smondel: id, - token: $('#token').val() - }, - type: "POST", + url: "/app/smon/delete/" + id, + // data: { + // smondel: id, + // token: $('#token').val() + // }, + type: "GET", success: function( data ) { data = data.replace(/\s+/g,' '); - if(data == "Ok ") { + if(data == "Ok") { $("#smon-"+check_type+"-"+id).remove(); } else { toastr.error(data); @@ -179,7 +177,7 @@ function updateSmon(id, check_type) { enable = '1'; } $.ajax( { - url: "options.py", + url: "/app/smon/update/"+id, data: { updateSmonName: $('#smon-name-'+id).val(), updateSmonIp: $('#smon-ip-'+id).val(), @@ -197,7 +195,6 @@ function updateSmon(id, check_type) { updateSmonPacket_size: $('#smon-packet_size-'+id).val(), updateSmon_http_method: $('#smon-http_method-'+id).val(), check_type: check_type, - id: id, token: $('#token').val() }, type: "POST", @@ -374,14 +371,7 @@ function clear_check_vals() { } function show_statuses(dashboard_id, check_id) { $.ajax({ - url: "options.py", - data: { - smon_history_statuses: 1, - dashboard_id: dashboard_id, - check_id: check_id, - token: $('#token').val() - }, - type: "POST", + url: "/app/smon/history/statuses/" + dashboard_id + "/" + check_id, success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { @@ -399,14 +389,7 @@ function show_statuses(dashboard_id, check_id) { } }); $.ajax({ - url: "options.py", - data: { - smon_cur_status: 1, - dashboard_id: dashboard_id, - check_id: check_id, - token: $('#token').val() - }, - type: "POST", + url: "/app/smon/history/cur_status/" + dashboard_id + "/" + check_id, success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { diff --git a/inc/users.js b/inc/users.js index e2280949..4e9c6b68 100644 --- a/inc/users.js +++ b/inc/users.js @@ -1,4 +1,6 @@ var awesome = "/inc/fontawesome.min.js" +var cur_url = window.location.href.split('/app/').pop(); +cur_url = cur_url.split('/'); $( function() { var add_word = $('#translate').attr('data-add'); var delete_word = $('#translate').attr('data-delete'); @@ -20,27 +22,26 @@ $( function() { return false } $("#ajax").html(wait_mess); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/haproxy/" + $('#haproxyaddserv').val(), data: { - haproxyaddserv: $('#haproxyaddserv').val(), syn_flood: syn_flood, - hapver: $('#hapver option:selected' ).val(), + hapver: $('#hapver option:selected').val(), docker: docker, token: $('#token').val() - }, + }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); $("#ajax").html('') if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if (data.indexOf('success') != '-1' ){ + } else if (data.indexOf('success') != '-1') { toastr.remove(); toastr.success(data); - $( "#haproxyaddserv" ).trigger( "selectmenuchange" ); - } else if (data.indexOf('Info') != '-1' ){ + $("#haproxyaddserv").trigger("selectmenuchange"); + } else if (data.indexOf('Info') != '-1') { toastr.remove(); toastr.info(data); } else { @@ -48,7 +49,7 @@ $( function() { toastr.info(data); } } - } ); + }); }); $('#nginx_install').click(function() { installService('nginx'); @@ -59,24 +60,23 @@ $( function() { $('#grafna_install').click(function() { $("#ajaxmon").html(''); $("#ajaxmon").html(wait_mess); - $.ajax( { - url: "options.py", - data: { - install_grafana: '1', - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + $.ajax({ + url: "/app/install/grafana", + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); $("#ajaxmon").html(''); if (data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1' || data.indexOf('ERROR') != '-1') { toastr.clear(); var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if (data.indexOf('success') != '-1' ){ + } else if (data.indexOf('success') != '-1') { toastr.clear(); toastr.success(data); - } else if (data.indexOf('Info') != '-1' ){ + } else if (data.indexOf('Info') != '-1') { toastr.clear(); toastr.info(data); } else { @@ -84,7 +84,7 @@ $( function() { toastr.info(data); } } - } ); + }); }); $('#haproxy_exp_install').click(function() { $("#ajaxmon").html('') @@ -93,28 +93,28 @@ $( function() { if ($('#haproxy_ext_prom').is(':checked')) { ext_prom = '1'; } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/exporter/haproxy", data: { - haproxy_exp_install: $('#haproxy_exp_addserv').val(), + server_ip: $('#haproxy_exp_addserv').val(), exporter_v: $('#hapexpver').val(), ext_prom: ext_prom, token: $('#token').val() - }, + }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); $("#ajaxmon").html(''); if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') { toastr.clear(); var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if (data.indexOf('success') != '-1' ){ + } else if (data.indexOf('success') != '-1') { toastr.clear(); toastr.success(data); $('#cur_haproxy_exp_ver').text('HAProxy exporter is installed'); - $("#haproxy_exp_addserv").trigger( "selectmenuchange" ); - } else if (data.indexOf('Info') != '-1' ){ + $("#haproxy_exp_addserv").trigger("selectmenuchange"); + } else if (data.indexOf('Info') != '-1') { toastr.clear(); toastr.info(data); } else { @@ -122,7 +122,7 @@ $( function() { toastr.info(data); } } - } ); + }); }); $('#nginx_exp_install').click(function() { $("#ajaxmon").html('') @@ -131,28 +131,27 @@ $( function() { if ($('#nginx_ext_prom').is(':checked')) { ext_prom = '1'; } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/exporter/nginx", data: { - nginx_exp_install: 1, - serv: $('#nginx_exp_addserv').val(), + server_ip: $('#nginx_exp_addserv').val(), exporter_v: $('#nginxexpver').val(), ext_prom: ext_prom, token: $('#token').val() - }, + }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); $("#ajaxmon").html(''); if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if (data.indexOf('success') != '-1' ){ + } else if (data.indexOf('success') != '-1') { toastr.clear(); toastr.success(data); $('#cur_nginx_exp_ver').text('NGINX exporter is installed'); - $("#nginx_exp_addserv").trigger( "selectmenuchange" ); - } else if (data.indexOf('Info') != '-1' ){ + $("#nginx_exp_addserv").trigger("selectmenuchange"); + } else if (data.indexOf('Info') != '-1') { toastr.clear(); toastr.info(data); } else { @@ -160,7 +159,7 @@ $( function() { toastr.info(data); } } - } ); + }); }); $('#apache_exp_install').click(function() { $("#ajaxmon").html('') @@ -169,28 +168,27 @@ $( function() { if ($('#apache_ext_prom').is(':checked')) { ext_prom = '1'; } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/exporter/apache", data: { - apache_exp_install: 1, - serv: $('#apache_exp_addserv').val(), + server_ip: $('#apache_exp_addserv').val(), exporter_v: $('#apacheexpver').val(), ext_prom: ext_prom, token: $('#token').val() - }, + }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); $("#ajaxmon").html(''); if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if (data.indexOf('success') != '-1' ){ + } else if (data.indexOf('success') != '-1') { toastr.clear(); toastr.success(data); $('#cur_apache_exp_ver').text('Apache exporter is installed'); - $("#apache_exp_addserv").trigger( "selectmenuchange" ); - } else if (data.indexOf('Info') != '-1' ){ + $("#apache_exp_addserv").trigger("selectmenuchange"); + } else if (data.indexOf('Info') != '-1') { toastr.clear(); toastr.info(data); } else { @@ -198,7 +196,7 @@ $( function() { toastr.info(data); } } - } ); + }); }); $('#keepalived_exp_install').click(function() { $("#ajaxmon").html('') @@ -208,9 +206,9 @@ $( function() { ext_prom = '1'; } $.ajax( { - url: "options.py", + url: "/app/install/exporter/keepalived", data: { - keepalived_exp_install: $('#keepalived_exp_addserv').val(), + server_ip: $('#keepalived_exp_addserv').val(), exporter_v: $('#keepalivedexpver').val(), ext_prom: ext_prom, token: $('#token').val() @@ -244,27 +242,27 @@ $( function() { if ($('#node_ext_prom').is(':checked')) { ext_prom = '1'; } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/exporter/node", data: { - node_exp_install: $('#node_exp_addserv').val(), + server_ip: $('#node_exp_addserv').val(), exporter_v: $('#nodeexpver').val(), ext_prom: ext_prom, token: $('#token').val() - }, + }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); $("#ajaxmon").html(''); if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') { var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if (data.indexOf('success') != '-1' ){ + } else if (data.indexOf('success') != '-1') { toastr.clear(); toastr.success(data); $('#cur_node_exp_ver').text('Node exporter is installed'); - $("#node_exp_addserv").trigger( "selectmenuchange" ); - } else if (data.indexOf('Info') != '-1' ){ + $("#node_exp_addserv").trigger("selectmenuchange"); + } else if (data.indexOf('Info') != '-1') { toastr.clear(); toastr.info(data); } else { @@ -272,7 +270,7 @@ $( function() { toastr.info(data); } } - } ); + }); }); $( "#haproxyaddserv" ).on('selectmenuchange',function() { showServiceVersion('haproxy'); @@ -285,13 +283,11 @@ $( function() { }); $( "#haproxy_exp_addserv" ).on('selectmenuchange',function() { $.ajax( { - url: "options.py", - data: { - get_exporter_v: 'haproxy_exporter', - serv: $('#haproxy_exp_addserv option:selected').val(), - token: $('#token').val() - }, - type: "POST", + url: "/app/install/exporter/haproxy/version/" + $('#haproxy_exp_addserv option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function( data ) { data = data.replace(/^\s+|\s+$/g,''); if (data.indexOf('error:') != '-1') { @@ -306,94 +302,86 @@ $( function() { } ); }); $( "#nginx_exp_addserv" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - get_exporter_v: 'nginx_exporter', - serv: $('#nginx_exp_addserv option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); + $.ajax({ + url: "/app/install/exporter/nginx/version/" + $('#nginx_exp_addserv option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('error:') != '-1') { toastr.clear(); toastr.error(data); - } else if(data == 'no' || data == '' || data.indexOf('No') != '-1') { + } else if (data == 'no' || data == '' || data.indexOf('No') != '-1') { $('#cur_nginx_exp_ver').text('NGINX exporter has not been installed'); } else { $('#cur_nginx_exp_ver').text(data); } } - } ); + }); }); $( "#apache_exp_addserv" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - get_exporter_v: 'apache_exporter', - serv: $('#apache_exp_addserv option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); + $.ajax({ + url: "/app/install/exporter/apache/version/" + $('#apache_exp_addserv option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('error:') != '-1') { toastr.clear(); toastr.error(data); - } else if(data == 'no' || data == '' || data.indexOf('No') != '-1') { + } else if (data == 'no' || data == '' || data.indexOf('No') != '-1') { $('#cur_apache_exp_ver').text('Apache exporter has not been installed'); } else { $('#cur_apache_exp_ver').text(data); } } - } ); + }); }); $( "#keepalived_exp_addserv" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - get_exporter_v: 'keepalived_exporter', - serv: $('#keepalived_exp_addserv option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); + $.ajax({ + url: "/app/install/exporter/keepalived/version/" + $('#keepalived_exp_addserv option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('error:') != '-1') { toastr.clear(); toastr.error(data); } else if (data.indexOf('keepalived_exporter.service') != '-1') { $('#cur_keepalived_exp_ver').text('Keepalived exporter has been installed'); - } else if(data == 'no' || data == '' || data.indexOf('No') != '-1') { + } else if (data == 'no' || data == '' || data.indexOf('No') != '-1') { $('#cur_keepalived_exp_ver').text('Keepalived exporter has not been installed'); } else { $('#cur_keepalived_exp_ver').text(data); } } - } ); + }); }); $( "#node_exp_addserv" ).on('selectmenuchange',function() { - $.ajax( { - url: "options.py", - data: { - get_exporter_v: 'node_exporter', - serv: $('#node_exp_addserv option:selected').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); + $.ajax({ + url: "/app/install/exporter/node/version/" + $('#node_exp_addserv option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('error:') != '-1') { toastr.clear(); toastr.error(data); - } else if(data == 'no' || data.indexOf('command') != '-1' || data == '') { + } else if (data == 'no' || data.indexOf('command') != '-1' || data == '') { $('#cur_node_exp_ver').text('Node exporter has not been installed'); } else { $('#cur_node_exp_ver').text(data); } } - } ); + }); }); $('#add-group-button').click(function() { addGroupDialog.dialog('open'); @@ -846,20 +834,19 @@ $( function() { $('#search_ldap_user').click(function() { var valid = true; toastr.clear(); - allFields = $( [] ).add( $('#new-username') ); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#new-username'), "user name", 1 ); + allFields = $([]).add($('#new-username')); + allFields.removeClass("ui-state-error"); + valid = valid && checkLength($('#new-username'), "user name", 1); user = $('#new-username').val() if (valid) { - $.ajax( { - url: "options.py", - data: { - get_ldap_email: $('#new-username').val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + $.ajax({ + url: "/app/user/ldap/" + $('#new-username').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); $('#new-email').val(''); @@ -876,7 +863,7 @@ $( function() { $('#new-password').attr('readonly', true); } } - } ); + }); clearTips(); } }); @@ -897,27 +884,27 @@ $( function() { updating_geoip = '1'; } $("#ajax-geoip").html(wait_mess); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/geoip", data: { - geoip_install: $('#geoipserv option:selected').val(), - geoip_service: $('#geoip_service option:selected').val(), - geoip_update: updating_geoip, + server_ip: $('#geoipserv option:selected').val(), + service: $('#geoip_service option:selected').val(), + update: updating_geoip, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/^\s+|\s+$/g,''); + success: function (data) { + data = data.replace(/^\s+|\s+$/g, ''); $("#ajax-geoip").html('') if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1') { toastr.clear(); var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if (data.indexOf('success:') != '-1' ){ + } else if (data.indexOf('success:') != '-1') { toastr.clear(); toastr.success(data); - $( "#geoip_service" ).trigger( "selectmenuchange" ); - } else if (data.indexOf('Info') != '-1' ){ + $("#geoip_service").trigger("selectmenuchange"); + } else if (data.indexOf('Info') != '-1') { toastr.clear(); toastr.info(data); } else { @@ -925,35 +912,29 @@ $( function() { toastr.info(data); } } - } ); + }); }); $("#tabs ul li").click(function() { var activeTab = $(this).find("a").attr("href"); var activeTabClass = activeTab.replace('#', ''); + console.log(activeTab) + console.log(activeTabClass) $('.menu li ul li').each(function () { $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); $(this).find('a').css('padding-left', '20px') + $(this).find('a').css('background-color', '#48505A'); $(this).children("."+activeTabClass).css('padding-left', '30px'); $(this).children("."+activeTabClass).css('border-left', '4px solid var(--right-menu-blue-rolor)'); + $(this).children("."+activeTabClass).css('background-color', 'var(--right-menu-blue-rolor)'); }); - if (activeTab == '#services') { + if (activeTab == '#tools') { loadServices(); } else if (activeTab == '#updatehapwi') { loadupdatehapwi(); - } else if (activeTab == '#checker'){ - loadchecker(); } else if (activeTab == '#openvpn'){ loadopenvpn(); } }); - $("#checker_tabs ul li").click(function() { - $('.menu li ul li').each(function () { - $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); - $(this).find('a').css('padding-left', '20px') - $(this).children(".checker").css('padding-left', '30px'); - $(this).children(".checker").css('border-left', '4px solid var(--right-menu-blue-rolor)'); - }); - }); $("#backup_tabs ul li").click(function() { $('.menu li ul li').each(function () { $(this).find('a').css('border-left', '0px solid var(--right-menu-blue-rolor)'); @@ -966,20 +947,14 @@ $( function() { window.onload = function() { $('#tabs').tabs(); var activeTabIdx = $('#tabs').tabs('option','active') - if (cur_url[0].split('#')[0] == 'users.py') { - if (activeTabIdx == 7) { + if (cur_url[0].split('#')[0] == 'admin') { + if (activeTabIdx == 6) { loadServices(); - } else if (activeTabIdx == 8) { + } else if (activeTabIdx == 7) { loadupdatehapwi(); } else if (activeTabIdx == 4) { - loadchecker(); - } else if (activeTabIdx == 5) { loadopenvpn(); } - } else if (cur_url[0].split('#')[0] == 'servers.py') { - if (activeTabIdx == 3) { - loadchecker(); - } } } function common_ajax_action_after_success(dialog_id, new_group, ajax_append_id, data) { @@ -996,20 +971,19 @@ function common_ajax_action_after_success(dialog_id, new_group, ajax_append_id, function addUser(dialog_id) { var valid = true; toastr.clear(); - allFields = $( [] ).add( $('#new-username') ).add( $('#new-password') ).add( $('#new-email') ) - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#new-username'), "user name", 1 ); - valid = valid && checkLength( $('#new-password'), "password", 1 ); - valid = valid && checkLength( $('#new-email'), "Email", 1 ); + allFields = $([]).add($('#new-username')).add($('#new-password')).add($('#new-email')) + allFields.removeClass("ui-state-error"); + valid = valid && checkLength($('#new-username'), "user name", 1); + valid = valid && checkLength($('#new-password'), "password", 1); + valid = valid && checkLength($('#new-email'), "Email", 1); var activeuser = 0; if ($('#activeuser').is(':checked')) { activeuser = '1'; } if (valid) { - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/user/create", data: { - newuser: "1", newusername: $('#new-username').val(), newpassword: $('#new-password').val(), newemail: $('#new-email').val(), @@ -1020,46 +994,45 @@ function addUser(dialog_id) { token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); } else { var getId = new RegExp('[0-9]+'); var id = data.match(getId); - common_ajax_action_after_success(dialog_id, 'user-'+id, 'ajax-users', data); + common_ajax_action_after_success(dialog_id, 'user-' + id, 'ajax-users', data); } } - } ); + }); } } function addGroup(dialog_id) { toastr.clear(); var valid = true; - allFields = $( [] ).add( $('#new-group-add') ); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#new-group-add'), "new group name", 1 ); - if(valid) { - $.ajax( { - url: "options.py", + allFields = $([]).add($('#new-group-add')); + allFields.removeClass("ui-state-error"); + valid = valid && checkLength($('#new-group-add'), "new group name", 1); + if (valid) { + $.ajax({ + url: "/app/server/group/create", data: { - newgroup: "1", groupname: $('#new-group-add').val(), newdesc: $('#new-desc').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { if (data.indexOf('error:') != '-1') { toastr.error(data); } else { var getId = new RegExp('[0-9]+'); var id = data.match(getId); - $('select:regex(id, group)').append('<option value='+id+'>'+$('#new-group-add').val()+'</option>').selectmenu("refresh"); + $('select:regex(id, group)').append('<option value=' + id + '>' + $('#new-group-add').val() + '</option>').selectmenu("refresh"); common_ajax_action_after_success(dialog_id, 'newgroup', 'ajax-group', data); } } - } ); + }); } } function addServer(dialog_id) { @@ -1101,11 +1074,11 @@ function addServer(dialog_id) { if ($('#add_to_smon').is(':checked')) { add_to_smon = '1'; } - allFields = $( [] ).add( $('#new-server-add') ).add( $('#new-ip') ).add( $('#new-port') ) - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#new-server-add'), "Hostname", 1 ); - valid = valid && checkLength( $('#new-ip'), "IP", 1 ); - valid = valid && checkLength( $('#new-port'), "Port", 1 ); + allFields = $([]).add($('#new-server-add')).add($('#new-ip')).add($('#new-port')) + allFields.removeClass("ui-state-error"); + valid = valid && checkLength($('#new-server-add'), "Hostname", 1); + valid = valid && checkLength($('#new-ip'), "IP", 1); + valid = valid && checkLength($('#new-port'), "Port", 1); if (cred == null) { toastr.error('First select credentials'); return false; @@ -1115,10 +1088,9 @@ function addServer(dialog_id) { return false; } if (valid) { - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/server/create", data: { - newserver: "1", servername: servername, newip: newip, newport: $('#new-port').val(), @@ -1130,45 +1102,45 @@ function addServer(dialog_id) { firewall: firewall, add_to_smon: add_to_smon, enable: enable, - slave: $('#slavefor' ).val(), + slave: $('#slavefor').val(), cred: cred, page: cur_url[0].split('#')[0], desc: $('#desc').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); } else { common_ajax_action_after_success(dialog_id, 'newserver', 'ajax-servers', data); - $( "input[type=submit], button" ).button(); - $( "input[type=checkbox]" ).checkboxradio(); - $( ".controlgroup" ).controlgroup(); - $( "select" ).selectmenu(); + $("input[type=submit], button").button(); + $("input[type=checkbox]").checkboxradio(); + $(".controlgroup").controlgroup(); + $("select").selectmenu(); var getId = new RegExp('server-[0-9]+'); var id = data.match(getId) + ''; id = id.split('-').pop(); - $('select:regex(id, git-server)').append('<option value=' + id + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh"); - $('select:regex(id, backup-server)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh"); - $('select:regex(id, haproxy_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh"); - $('select:regex(id, nginx_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh"); - $('select:regex(id, apache_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh"); - $('select:regex(id, node_exp_addserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh"); - $('select:regex(id, geoipserv)').append('<option value=' + $('#ip-'+id).text() + '>' + $('#hostname-'+id).val() + '</option>').selectmenu("refresh"); + $('select:regex(id, git-server)').append('<option value=' + id + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh"); + $('select:regex(id, backup-server)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh"); + $('select:regex(id, haproxy_exp_addserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh"); + $('select:regex(id, nginx_exp_addserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh"); + $('select:regex(id, apache_exp_addserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh"); + $('select:regex(id, node_exp_addserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh"); + $('select:regex(id, geoipserv)').append('<option value=' + $('#ip-' + id).text() + '>' + $('#hostname-' + id).val() + '</option>').selectmenu("refresh"); $('select:regex(id, haproxyaddserv)').append('<option value=' + newip + '>' + servername + '</option>').selectmenu("refresh"); $('select:regex(id, nginxaddserv)').append('<option value=' + newip + '>' + servername + '</option>').selectmenu("refresh"); $('select:regex(id, apacheaddserv)').append('<option value=' + newip + '>' + servername + '</option>').selectmenu("refresh"); after_server_creating(servername, newip, scan_server); } } - } ); + }); } } function after_server_creating(servername, newip, scan_server) { $.ajax({ - url: "options.py", + url: "/app/server/create/after", data: { act: 'after_adding', servername: servername, @@ -1185,7 +1157,7 @@ function after_server_creating(servername, newip, scan_server) { toastr.error(data); } } - } ); + }); } function addCreds(dialog_id) { toastr.clear(); @@ -1194,13 +1166,13 @@ function addCreds(dialog_id) { ssh_enable = '1'; } var valid = true; - allFields = $( [] ).add( $('#new-ssh-add') ).add( $('#ssh_user') ) - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#new-ssh-add'), "Name", 1 ); - valid = valid && checkLength( $('#ssh_user'), "Credentials", 1 ); - if(valid) { + allFields = $([]).add($('#new-ssh-add')).add($('#ssh_user')) + allFields.removeClass("ui-state-error"); + valid = valid && checkLength($('#new-ssh-add'), "Name", 1); + valid = valid && checkLength($('#ssh_user'), "Credentials", 1); + if (valid) { $.ajax({ - url: "options.py", + url: "/app/server/ssh/create", data: { new_ssh: $('#new-ssh-add').val(), new_group: $('#new-sshgroup').val(), @@ -1219,9 +1191,9 @@ function addCreds(dialog_id) { var getId = new RegExp('ssh-table-[0-9]+'); var id = data.match(getId) + ''; id = id.split('-').pop(); - common_ajax_action_after_success(dialog_id, 'ssh-table-'+id, 'ssh_enable_table', data); + common_ajax_action_after_success(dialog_id, 'ssh-table-' + id, 'ssh_enable_table', data); $('select:regex(id, credentials)').append('<option value=' + id + '>' + $('#new-ssh-add').val() + '</option>').selectmenu("refresh"); - $('select:regex(id, ssh-key-name)').append('<option value=' + $('#new-ssh-add').val() + '_'+group_name+'>' + $('#new-ssh-add').val() + '_'+group_name+'</option>').selectmenu("refresh"); + $('select:regex(id, ssh-key-name)').append('<option value=' + $('#new-ssh-add').val() + '_' + group_name + '>' + $('#new-ssh-add').val() + '_' + group_name + '</option>').selectmenu("refresh"); $("input[type=submit], button").button(); $("input[type=checkbox]").checkboxradio(); $("select").selectmenu(); @@ -1233,13 +1205,12 @@ function addCreds(dialog_id) { function getGroupNameById(group_id) { var group_name = '' $.ajax({ - url: "options.py", + url: "/app/user/group/name/" + group_id, async: false, - data: { - get_group_name_by_id: group_id, - token: $('#token').val() - }, - type: "POST", + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { if (data.indexOf('error:') != '-1') { toastr.error(data); @@ -1253,55 +1224,53 @@ function getGroupNameById(group_id) { function addRecevier(dialog_id, receiver_name) { var valid = true; toastr.clear(); - allFields = $( [] ).add( $('#'+receiver_name+'-token-add') ).add( $('#'+receiver_name+'-chanel-add') ); - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#'+receiver_name+'-token-add'), "token", 1 ); - valid = valid && checkLength( $('#'+receiver_name+'-chanel-add'), "channel name", 1 ); - if(valid) { + allFields = $([]).add($('#' + receiver_name + '-token-add')).add($('#' + receiver_name + '-chanel-add')); + allFields.removeClass("ui-state-error"); + valid = valid && checkLength($('#' + receiver_name + '-token-add'), "token", 1); + valid = valid && checkLength($('#' + receiver_name + '-chanel-add'), "channel name", 1); + if (valid) { toastr.clear(); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/checker/receiver/" + receiver_name, data: { - new_receiver: $('#'+receiver_name+'-token-add').val(), - receiver_name: receiver_name, - chanel: $('#'+receiver_name+'-chanel-add').val(), - group_receiver: $('#new-'+receiver_name+'-group-add').val(), + receiver: $('#' + receiver_name + '-token-add').val(), + channel: $('#' + receiver_name + '-chanel-add').val(), + group: $('#new-' + receiver_name + '-group-add').val(), page: cur_url[0].split('#')[0], token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { if (data.indexOf('error:') != '-1') { toastr.error(data); } else { - var getId = new RegExp(receiver_name+'-table-[0-9]+'); + var getId = new RegExp(receiver_name + '-table-[0-9]+'); var id = data.match(getId) + ''; id = id.split('-').pop(); - $('select:regex(id, '+receiver_name+'_channel)').append('<option value=' + id + '>' + $('#'+receiver_name+'-chanel-add').val() + '</option>').selectmenu("refresh"); - common_ajax_action_after_success(dialog_id, 'newgroup', 'checker_'+receiver_name+'_table', data); - $( "input[type=submit], button" ).button(); - $( "input[type=checkbox]" ).checkboxradio(); - $( "select" ).selectmenu(); + $('select:regex(id, ' + receiver_name + '_channel)').append('<option value=' + id + '>' + $('#' + receiver_name + '-chanel-add').val() + '</option>').selectmenu("refresh"); + common_ajax_action_after_success(dialog_id, 'newgroup', 'checker_' + receiver_name + '_table', data); + $("input[type=submit], button").button(); + $("input[type=checkbox]").checkboxradio(); + $("select").selectmenu(); } } - } ); + }); } } function addBackup(dialog_id) { var valid = true; toastr.clear(); - allFields = $( [] ).add( $('#backup-server') ).add( $('#rserver') ).add( $('#rpath') ).add( $('#backup-time') ).add( $('#backup-credentials') ) - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#backup-server'), "backup server ", 1 ); - valid = valid && checkLength( $('#rserver'), "remote server", 1 ); - valid = valid && checkLength( $('#rpath'), "remote path", 1 ); - valid = valid && checkLength( $('#backup-time'), "backup time", 1 ); - valid = valid && checkLength( $('#backup-credentials'), "backup credentials", 1 ); + allFields = $([]).add($('#backup-server')).add($('#rserver')).add($('#rpath')).add($('#backup-time')).add($('#backup-credentials')) + allFields.removeClass("ui-state-error"); + valid = valid && checkLength($('#backup-server'), "backup server ", 1); + valid = valid && checkLength($('#rserver'), "remote server", 1); + valid = valid && checkLength($('#rpath'), "remote path", 1); + valid = valid && checkLength($('#backup-time'), "backup time", 1); + valid = valid && checkLength($('#backup-credentials'), "backup credentials", 1); if (valid) { - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/server/backup/create", data: { - backup: '1', server: $('#backup-server').val(), rserver: $('#rserver').val(), rpath: $('#rpath').val(), @@ -1312,37 +1281,37 @@ function addBackup(dialog_id) { token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); - } else if (data.indexOf('success: ') != '-1') { - common_ajax_action_after_success(dialog_id, 'newbackup', 'ajax-backup-table', data); - $( "select" ).selectmenu(); } else if (data.indexOf('info: ') != '-1') { toastr.clear(); toastr.info(data); } else if (data.indexOf('warning: ') != '-1') { toastr.clear(); toastr.warning(data); + } else { + common_ajax_action_after_success(dialog_id, 'newbackup', 'ajax-backup-table', data); + $("select").selectmenu(); } } - } ); + }); } } function addS3Backup(dialog_id) { var valid = true; toastr.clear(); - allFields = $( [] ).add( $('#s3-backup-server') ).add( $('#s3_server') ).add( $('#s3_bucket') ).add( $('#s3_secret_key') ).add( $('#s3_access_key') ) - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#s3-backup-server'), "backup server ", 1 ); - valid = valid && checkLength( $('#s3_server'), "S3 server", 1 ); - valid = valid && checkLength( $('#s3_bucket'), "S3 bucket", 1 ); - valid = valid && checkLength( $('#s3_secret_key'), "S3 secret key", 1 ); - valid = valid && checkLength( $('#s3_access_key'), "S3 access key", 1 ); + allFields = $([]).add($('#s3-backup-server')).add($('#s3_server')).add($('#s3_bucket')).add($('#s3_secret_key')).add($('#s3_access_key')) + allFields.removeClass("ui-state-error"); + valid = valid && checkLength($('#s3-backup-server'), "backup server ", 1); + valid = valid && checkLength($('#s3_server'), "S3 server", 1); + valid = valid && checkLength($('#s3_bucket'), "S3 bucket", 1); + valid = valid && checkLength($('#s3_secret_key'), "S3 secret key", 1); + valid = valid && checkLength($('#s3_access_key'), "S3 access key", 1); if (valid) { - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/server/s3backup/create", data: { s3_backup_server: $('#s3-backup-server').val(), s3_server: $('#s3_server').val(), @@ -1354,13 +1323,10 @@ function addS3Backup(dialog_id) { token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); - } else if (data.indexOf('success: ') != '-1') { - common_ajax_action_after_success(dialog_id, 'newbackup', 'ajax-backup-s3-table', data); - $( "select" ).selectmenu(); } else if (data.indexOf('info: ') != '-1') { toastr.clear(); toastr.info(data); @@ -1370,29 +1336,31 @@ function addS3Backup(dialog_id) { } else if (data.indexOf('error: ') != '-1') { toastr.clear(); toastr.error(data); + } else { + common_ajax_action_after_success(dialog_id, 'newbackup', 'ajax-backup-s3-table', data); + $("select").selectmenu(); } } - } ); + }); } } function addGit(dialog_id) { var valid = true; toastr.clear(); - allFields = $( [] ).add( $('#git-server') ).add( $('#git-service') ).add( $('#git-time')).add( $('#git-credentials') ).add( $('#git-branch') ) - allFields.removeClass( "ui-state-error" ); - valid = valid && checkLength( $('#git-server'), "Server ", 1 ); - valid = valid && checkLength( $('#git-service'), "Service", 1 ); - valid = valid && checkLength( $('#git-credentials'), "Credentials", 1 ); - valid = valid && checkLength( $('#git-branch'), "Branch name", 1 ); + allFields = $([]).add($('#git-server')).add($('#git-service')).add($('#git-time')).add($('#git-credentials')).add($('#git-branch')) + allFields.removeClass("ui-state-error"); + valid = valid && checkLength($('#git-server'), "Server ", 1); + valid = valid && checkLength($('#git-service'), "Service", 1); + valid = valid && checkLength($('#git-credentials'), "Credentials", 1); + valid = valid && checkLength($('#git-branch'), "Branch name", 1); var git_init = 0; if ($('#git-init').is(':checked')) { - git_init = '1'; - } + git_init = '1'; + } if (valid) { - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/server/git/create", data: { - git_backup: '1', server: $('#git-server').val(), git_service: $('#git-service').val(), git_init: git_init, @@ -1405,13 +1373,13 @@ function addGit(dialog_id) { token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); } else if (data.indexOf('success: ') != '-1') { common_ajax_action_after_success(dialog_id, 'newgit', 'ajax-git-table', data); - $( "select" ).selectmenu(); + $("select").selectmenu(); } else if (data.indexOf('info: ') != '-1') { toastr.clear(); toastr.info(data); @@ -1420,16 +1388,14 @@ function addGit(dialog_id) { toastr.warning(data); } } - } ); + }); } } function updateSettings(param, val) { toastr.clear(); $.ajax( { - url: "options.py", + url: "/app/app/admin/setting/" + param + "/" + val, data: { - updatesettings: param, - val: val, token: $('#token').val() }, type: "POST", @@ -1557,7 +1523,7 @@ function confirmDeleteSsh(id) { function confirmDeleteReceiver(id, reciever_name) { var delete_word = $('#translate').attr('data-delete'); var cancel_word = $('#translate').attr('data-cancel'); - $( "#dialog-confirm" ).dialog({ + $( "#dialog-confirm-services" ).dialog({ resizable: false, height: "auto", width: 400, @@ -1703,37 +1669,35 @@ function cloneBackup(id) { $('#backup-credentials').selectmenu("refresh"); } function removeUser(id) { - $("#user-"+id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", - data: { - userdel: id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data == "Ok ") { - $("#user-"+id).remove(); + $("#user-" + id).css("background-color", "#f2dede"); + $.ajax({ + url: "/app/user/delete/" + id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data == "ok") { + $("#user-" + id).remove(); } else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } } - } ); + }); } function removeServer(id) { - $("#server-"+id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", - data: { - serverdel: id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data == "Ok ") { - $("#server-"+id).remove(); + $("#server-" + id).css("background-color", "#f2dede"); + $.ajax({ + url: "/app/server/delete/" + id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data == "Ok") { + $("#server-" + id).remove(); } else if (data.indexOf('error: ') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else if (data.indexOf('warning: ') != '-1') { @@ -1741,41 +1705,39 @@ function removeServer(id) { toastr.warning(data); } } - } ); + }); } function removeGroup(id) { - $("#group-"+id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", - data: { - groupdel: id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data == "Ok ") { - $("#group-"+id).remove(); - $('select:regex(id, group) option[value='+id+']').remove(); + $("#group-" + id).css("background-color", "#f2dede"); + $.ajax({ + url: "/app/server/group/delete/" + id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data == "ok") { + $("#group-" + id).remove(); + $('select:regex(id, group) option[value=' + id + ']').remove(); $('select:regex(id, group)').selectmenu("refresh"); } else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } } - } ); + }); } function removeSsh(id) { $("#ssh-table-"+id).css("background-color", "#f2dede"); $.ajax( { - url: "options.py", - data: { - sshdel: id, - token: $('#token').val() - }, - type: "POST", + url: "/app/server/ssh/delete/" + id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function( data ) { data = data.replace(/\s+/g,' '); - if(data == "Ok ") { + if(data == "ok") { $("#ssh-table-"+id).remove(); $('select:regex(id, credentials) option[value='+id+']').remove(); $('select:regex(id, credentials)').selectmenu("refresh"); @@ -1786,73 +1748,71 @@ function removeSsh(id) { } ); } function removeReciver(receiver_name, receiver_id) { - $("#"+receiver_name+"-table-"+receiver_id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", + $("#" + receiver_name + "-table-" + receiver_id).css("background-color", "#f2dede"); + $.ajax({ + url: "/app/checker/receiver/" + receiver_name, data: { - receiver_del: receiver_id, - receiver_name: receiver_name, + channel_id: receiver_id, token: $('#token').val() }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data == "Ok ") { - $("#"+receiver_name+"-table-"+receiver_id).remove(); + type: "DELETE", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data == "ok") { + $("#" + receiver_name + "-table-" + receiver_id).remove(); } else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } } - } ); + }); } function removeBackup(id) { - $("#backup-table-"+id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", + $("#backup-table-" + id).css("background-color", "#f2dede"); + $.ajax({ + url: "/app/server/backup/delete", data: { deljob: id, - cred: $('#backup-credentials-'+id).val(), - server: $('#backup-server-'+id).text(), - rserver: $('#backup-rserver-'+id).val(), + cred: $('#backup-credentials-' + id).val(), + server: $('#backup-server-' + id).text(), + rserver: $('#backup-rserver-' + id).val(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data.indexOf('Ok') != '-1') { - $("#backup-table-"+id).remove(); + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('ok') != '-1') { + $("#backup-table-" + id).remove(); } else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } } - } ); + }); } function removeS3Backup(id) { - $("#backup-table-s3-"+id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", + $("#backup-table-s3-" + id).css("background-color", "#f2dede"); + $.ajax({ + url: "/app/server/s3backup/delete", data: { dels3job: id, - s3_backet: $('#backup-s3-backet-'+id).val(), - s3_backup_server: $('#backup-s3-server-'+id).text(), - s3_bucket: $('#s3-bucket-'+id).val(), + s3_bucket: $('#bucket-' + id).text(), + s3_backup_server: $('#backup-s3-server-' + id).text(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data.indexOf('Ok') != '-1') { - $("#s3-backup-table-"+id).remove(); + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('ok') != '-1') { + $("#s3-backup-table-" + id).remove(); } else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } } - } ); + }); } function removeGit(id) { - $("#git-table-"+id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", + $("#git-table-" + id).css("background-color", "#f2dede"); + $.ajax({ + url: "/app/server/git/delete", data: { git_backup: id, git_deljob: 1, @@ -1860,41 +1820,41 @@ function removeGit(id) { repo: 0, branch: 0, time: 0, - cred: $('#git-credentials-id-'+id).text(), - server: $('#git-server-id-'+id).text(), - git_service: $('#git-service-id-'+id).text(), + cred: $('#git-credentials-id-' + id).text(), + server: $('#git-server-id-' + id).text(), + git_service: $('#git-service-id-' + id).text(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data.indexOf('Ok') != '-1') { - $("#git-table-"+id).remove(); + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('ok') != '-1') { + $("#git-table-" + id).remove(); } else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } } - } ); + }); } function updateUser(id) { toastr.remove(); cur_url[0] = cur_url[0].split('#')[0] var usergroup = Cookies.get('group'); - var role = $('#role-'+id).val(); + var role = $('#role-' + id).val(); var activeuser = 0; - if ($('#activeuser-'+id).is(':checked')) { + if ($('#activeuser-' + id).is(':checked')) { activeuser = '1'; } - if (role == null && role !== undefined){ + if (role == null && role !== undefined) { toastr.warning('Please edit this user only on the Admin area'); return false; } toastr.remove(); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/user/update", data: { - updateuser: $('#login-'+id).val(), - email: $('#email-'+id).val(), + updateuser: $('#login-' + id).val(), + email: $('#email-' + id).val(), role: role, usergroup: usergroup, activeuser: activeuser, @@ -1902,46 +1862,46 @@ function updateUser(id) { token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else { toastr.remove(); - $("#user-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#user-"+id ).removeClass( "update" ); - }, 2500 ); + $("#user-" + id).addClass("update", 1000); + setTimeout(function () { + $("#user-" + id).removeClass("update"); + }, 2500); } } - } ); + }); } function updateGroup(id) { toastr.clear(); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/server/group/update", data: { - updategroup: $('#name-'+id).val(), - descript: $('#descript-'+id).val(), + updategroup: $('#name-' + id).val(), + descript: $('#descript-' + id).val(), id: id, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else { toastr.clear(); - $("#group-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#group-"+id ).removeClass( "update" ); - }, 2500 ); - $('select:regex(id, group) option[value='+id+']').remove(); - $('select:regex(id, group)').append('<option value='+id+'>'+$('#name-'+id).val()+'</option>').selectmenu("refresh"); + $("#group-" + id).addClass("update", 1000); + setTimeout(function () { + $("#group-" + id).removeClass("update"); + }, 2500); + $('select:regex(id, group) option[value=' + id + ']').remove(); + $('select:regex(id, group)').append('<option value=' + id + '>' + $('#name-' + id).val() + '</option>').selectmenu("refresh"); } } - } ); + }); } function updateServer(id) { toastr.clear(); @@ -1949,263 +1909,220 @@ function updateServer(id) { let enable = 0; let firewall = 0; let protected_serv = 0; - if ($('#typeip-'+id).is(':checked')) { + if ($('#typeip-' + id).is(':checked')) { typeip = '1'; } - if ($('#enable-'+id).is(':checked')) { + if ($('#enable-' + id).is(':checked')) { enable = '1'; } - if ($('#firewall-'+id).is(':checked')) { + if ($('#firewall-' + id).is(':checked')) { firewall = '1'; } - if ($('#protected-'+id).is(':checked')) { + if ($('#protected-' + id).is(':checked')) { protected_serv = '1'; } - var servergroup = $('#servergroup-'+id+' option:selected' ).val(); + var servergroup = $('#servergroup-' + id + ' option:selected').val(); if (cur_url[0].split('#')[0] == "servers.py") { - servergroup = $('#new-server-group-add').val(); + servergroup = $('#new-server-group-add').val(); } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/admin/update", data: { - updateserver: $('#hostname-'+id).val(), - port: $('#port-'+id).val(), + updateserver: $('#hostname-' + id).val(), + port: $('#port-' + id).val(), servergroup: servergroup, typeip: typeip, firewall: firewall, enable: enable, - slave: $('#slavefor-'+id+' option:selected' ).val(), - cred: $('#credentials-'+id+' option:selected').val(), + slave: $('#slavefor-' + id + ' option:selected').val(), + cred: $('#credentials-' + id + ' option:selected').val(), id: id, - desc: $('#desc-'+id).val(), + desc: $('#desc-' + id).val(), protected: protected_serv, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else { toastr.clear(); - $("#server-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#server-"+id ).removeClass( "update" ); - }, 2500 ); + $("#server-" + id).addClass("update", 1000); + setTimeout(function () { + $("#server-" + id).removeClass("update"); + }, 2500); } } - } ); + }); } function uploadSsh() { toastr.clear(); - if ($( "#ssh-key-name option:selected" ).val() == "------" || $('#ssh_cert').val() == '') { + if ($("#ssh-key-name option:selected").val() == "------" || $('#ssh_cert').val() == '') { toastr.error('All fields must be completed'); } else { - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/server/ssh/upload", data: { ssh_cert: $('#ssh_cert').val(), name: $('#ssh-key-name').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { - toastr.error(data); - } else if (data.indexOf('success') != '-1') { - toastr.clear(); - toastr.success(data) - } else { - toastr.error('Something wrong, check and try again'); - } + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { + toastr.error(data); + } else if (data.indexOf('success') != '-1') { + toastr.clear(); + toastr.success(data) + } else { + toastr.error('Something wrong, check and try again'); + } } - } ); + }); } } function updateSSH(id) { toastr.clear(); var ssh_enable = 0; - if ($('#ssh_enable-'+id).is(':checked')) { + if ($('#ssh_enable-' + id).is(':checked')) { ssh_enable = '1'; } - var group = $('#sshgroup-'+id).val(); + var group = $('#sshgroup-' + id).val(); if (cur_url[0].split('#')[0] == "servers.py") { - group = $('#new-server-group-add').val(); + group = $('#new-server-group-add').val(); } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/server/ssh/update", data: { - updatessh: 1, - name: $('#ssh_name-'+id).val(), + name: $('#ssh_name-' + id).val(), group: group, ssh_enable: ssh_enable, - ssh_user: $('#ssh_user-'+id).val(), - ssh_pass: $('#ssh_pass-'+id).val(), + ssh_user: $('#ssh_user-' + id).val(), + ssh_pass: $('#ssh_pass-' + id).val(), id: id, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else { toastr.clear(); - $("#ssh-table-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#ssh-table-"+id ).removeClass( "update" ); - }, 2500 ); - $('select:regex(id, credentials) option[value='+id+']').remove(); - $('select:regex(id, ssh-key-name) option[value='+$('#ssh_name-'+id).val()+']').remove(); - $('select:regex(id, credentials)').append('<option value='+id+'>'+$('#ssh_name-'+id).val()+'</option>').selectmenu("refresh"); - $('select:regex(id, ssh-key-name)').append('<option value='+$('#ssh_name-'+id).val()+'>'+$('#ssh_name-'+id).val()+'</option>').selectmenu("refresh"); + $("#ssh-table-" + id).addClass("update", 1000); + setTimeout(function () { + $("#ssh-table-" + id).removeClass("update"); + }, 2500); + $('select:regex(id, credentials) option[value=' + id + ']').remove(); + $('select:regex(id, ssh-key-name) option[value=' + $('#ssh_name-' + id).val() + ']').remove(); + $('select:regex(id, credentials)').append('<option value=' + id + '>' + $('#ssh_name-' + id).val() + '</option>').selectmenu("refresh"); + $('select:regex(id, ssh-key-name)').append('<option value=' + $('#ssh_name-' + id).val() + '>' + $('#ssh_name-' + id).val() + '</option>').selectmenu("refresh"); } } - } ); + }); } function updateReceiver(id, receiver_name) { if (cur_url[0].split('#')[0] == 'servers.py') { var group = $('#new-group').val(); } else { - var group = $('#'+receiver_name+'group-'+id).val(); + var group = $('#' + receiver_name + 'group-' + id).val(); } toastr.clear(); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/checker/receiver/" + receiver_name, data: { - receiver_name: receiver_name, - update_receiver_token: $('#'+receiver_name+'-token-'+id).val(), - update_receiver_channel: $('#'+receiver_name+'-chanel-'+id).val(), - update_receiver_group: group, + receiver_token: $('#' + receiver_name + '-token-' + id).val(), + channel: $('#' + receiver_name + '-chanel-' + id).val(), + group: group, id: id, token: $('#token').val() }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + type: "PUT", + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else { toastr.clear(); - $("#"+receiver_name+"-table-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#"+receiver_name+"-table-"+id ).removeClass( "update" ); - }, 2500 ); + $("#" + receiver_name + "-table-" + id).addClass("update", 1000); + setTimeout(function () { + $("#" + receiver_name + "-table-" + id).removeClass("update"); + }, 2500); } } - } ); + }); } function updateBackup(id) { toastr.clear(); - if ($( "#backup-type-"+id+" option:selected" ).val() == "-------" || $('#backup-rserver-'+id).val() == '' || $('#backup-rpath-'+id).val() == '') { + if ($("#backup-type-" + id + " option:selected").val() == "-------" || $('#backup-rserver-' + id).val() == '' || $('#backup-rpath-' + id).val() == '') { toastr.error('All fields must be completed'); } else { - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/server/backup/update", data: { backupupdate: id, - server: $('#backup-server-'+id).text(), - rserver: $('#backup-rserver-'+id).val(), - rpath: $('#backup-rpath-'+id).val(), - type: $('#backup-type-'+id).val(), - time: $('#backup-time-'+id).val(), - cred: $('#backup-credentials-'+id).val(), - description: $('#backup-description-'+id).val(), + server: $('#backup-server-' + id).text(), + rserver: $('#backup-rserver-' + id).val(), + rpath: $('#backup-rpath-' + id).val(), + type: $('#backup-type-' + id).val(), + time: $('#backup-time-' + id).val(), + cred: $('#backup-credentials-' + id).val(), + description: $('#backup-description-' + id).val(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else { toastr.clear(); - $("#backup-table-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#backup-table-"+id ).removeClass( "update" ); - }, 2500 ); + $("#backup-table-" + id).addClass("update", 1000); + setTimeout(function () { + $("#backup-table-" + id).removeClass("update"); + }, 2500); } } - } ); - } -} -function updateS3Backup(id) { - toastr.clear(); - if ($( "#backup-type-"+id+" option:selected" ).val() == "-------" || $('#backup-rserver-'+id).val() == '' || $('#backup-rpath-'+id).val() == '') { - toastr.error('All fields must be completed'); - } else { - $.ajax( { - url: "options.py", - data: { - s3_backupupdate: id, - server: $('#backup-server-'+id).text(), - rserver: $('#backup-rserver-'+id).val(), - rpath: $('#backup-rpath-'+id).val(), - type: $('#backup-type-'+id).val(), - time: $('#backup-time-'+id).val(), - cred: $('#backup-credentials-'+id).val(), - description: $('#backup-description-'+id).val(), - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { - toastr.error(data); - } else { - toastr.clear(); - $("#backup-table-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#backup-table-"+id ).removeClass( "update" ); - }, 2500 ); - } - } - } ); + }); } } function showApacheLog(serv) { - var rows = $('#rows').val() - var grep = $('#grep').val() - var exgrep = $('#exgrep').val() - var hour = $('#time_range_out_hour').val() - var minut = $('#time_range_out_minut').val() - var hour1 = $('#time_range_out_hour1').val() - var minut1 = $('#time_range_out_minut1').val() + var rows = $('#rows').val(); + var grep = $('#grep').val(); + var exgrep = $('#exgrep').val(); + var hour = $('#time_range_out_hour').val(); + var minute = $('#time_range_out_minut').val(); + var hour1 = $('#time_range_out_hour1').val(); + var minute1 = $('#time_range_out_minut1').val(); + var url = "/app/logs/apache_internal/" + serv + "/" + rows; $.ajax( { - url: "options.py", + url: url, data: { - rows1: rows, + rows: rows, serv: serv, grep: grep, exgrep: exgrep, hour: hour, - minut:minut, + minute: minute, hour1: hour1, - minut1: minut1, + minute1: minute1, token: $('#token').val() }, type: "POST", success: function( data ) { $("#ajax").html(data); - window.history.pushState("Logs", "Logs", cur_url[0] + "?serv=" + serv + "&rows1=" + rows + "&grep=" + grep + - '&exgrep=' + exgrep + - '&hour=' + hour + - '&minut=' + minut + - '&hour1=' + hour1 + - '&minut1=' + minut1); } } ); } function checkSshConnect(ip) { $.ajax( { - url: "options.py", - data: { - checkSshConnect: 1, - serv: ip, - token: $('#token').val() - }, - type: "POST", + url: "/app/server/check/ssh/" + ip, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function( data ) { if (data.indexOf('error:') != '-1') { toastr.error(data) @@ -2236,64 +2153,64 @@ function changeUserPasswordDialog(id) { return false; } $( "#user-change-password-table" ).dialog({ - autoOpen: true, - resizable: false, - height: "auto", - width: 600, - modal: true, - title: change_word+ " "+$('#login-'+id).val()+" " +password_word, - show: { - effect: "fade", - duration: 200 - }, - hide: { - effect: "fade", - duration: 200 - }, - buttons: [{ - text: change_word, - click: function () { - changeUserPassword(id, $(this)); - } - }, { - text: cancel_word, - click: function() { - $(this).dialog("close"); - $('#missmatchpass').hide(); - } - }] - }); + autoOpen: true, + resizable: false, + height: "auto", + width: 600, + modal: true, + title: change_word + " " + $('#login-' + id).val() + " " + password_word, + show: { + effect: "fade", + duration: 200 + }, + hide: { + effect: "fade", + duration: 200 + }, + buttons: [{ + text: change_word, + click: function () { + changeUserPassword(id, $(this)); + } + }, { + text: cancel_word, + click: function () { + $(this).dialog("close"); + $('#missmatchpass').hide(); + } + }] + }); } function changeUserPassword(id, d) { var pass = $('#change-password').val(); var pass2 = $('#change2-password').val(); - if(pass != pass2) { + if (pass != pass2) { $('#missmatchpass').show(); } else { $('#missmatchpass').hide(); toastr.clear(); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/user/password", data: { updatepassowrd: pass, id: id, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1') { toastr.error(data); } else { toastr.clear(); - $("#user-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#user-"+id ).removeClass( "update" ); - }, 2500 ); - d.dialog( "close" ); + $("#user-" + id).addClass("update", 1000); + setTimeout(function () { + $("#user-" + id).removeClass("update"); + }, 2500); + d.dialog("close"); } } - } ); + }); } } function changeUserServiceDialog(id) { @@ -2302,29 +2219,28 @@ function changeUserServiceDialog(id) { var services_word = $('#translate').attr('data-services3'); var save_word = $('#translate').attr('data-save'); var superAdmin_services = $('#translate').attr('data-superAdmin_services'); - if ($('#role-'+id + ' option:selected' ).val() == 'Select a role') { + if ($('#role-' + id + ' option:selected').val() == 'Select a role') { toastr.warning(superAdmin_services); return false; } - $.ajax( { - url: "options.py", - data: { - getuserservices: id, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + $.ajax({ + url: "/app/user/services/" + id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { if (data.indexOf('danger') != '-1') { toastr.error(data); } else { toastr.clear(); $('#change-user-service-form').html(data); - $( "#change-user-service-dialog" ).dialog({ + $("#change-user-service-dialog").dialog({ resizable: false, height: "auto", width: 700, modal: true, - title: manage_word+" "+$('#login-'+id).val()+" "+services_word, + title: manage_word + " " + $('#login-' + id).val() + " " + services_word, buttons: [{ text: save_word, click: function () { @@ -2340,7 +2256,7 @@ function changeUserServiceDialog(id) { }); } } - } ); + }); } function changeUserServices(user_id) { var jsonData = {}; @@ -2350,9 +2266,8 @@ function changeUserServices(user_id) { jsonData[user_id][this_id] = {} }); $.ajax( { - url: "options.py", + url: "/app/user/services/" + user_id, data: { - changeUserServicesId: user_id, jsonDatas: JSON.stringify(jsonData), changeUserServicesUser: $('#login-'+user_id).val(), token: $('#token').val() @@ -2425,19 +2340,18 @@ function confirmAjaxServiceAction(action, service) { } function ajaxActionServies(action, service) { $.ajax( { - url: "options.py", - data: { - action_service: action, - serv: service, - token: $('#token').val() - }, + url: "/app/admin/tools/action/" + service + "/" + action, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function( data ) { if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { toastr.error(data); } else if (data.indexOf('warning: ') != '-1') { toastr.warning(data); } else { - window.history.pushState("services", "services", cur_url[0].split("#")[0] + "#services"); + window.history.pushState("services", "services", cur_url[0].split("#")[0] + "#tools"); toastr.success('The ' + service + ' has been ' + action +'ed'); loadServices(); } @@ -2450,19 +2364,17 @@ function ajaxActionServies(action, service) { function updateService(service, action='update') { $("#ajax-update").html('') $("#ajax-update").html(wait_mess); - $.ajax( { - url: "options.py", - data: { - update_roxy_wi: 1, - service: service, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('Complete!') != '-1' || data.indexOf('Unpacking') != '-1'){ + $.ajax({ + url: "/app/admin/tools/update/" + service, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('Complete!') != '-1' || data.indexOf('Unpacking') != '-1') { toastr.clear(); - toastr.success(service + ' has been '+action+'ed'); + toastr.success(service + ' has been ' + action + 'ed'); } else if (data.indexOf('Unauthorized') != '-1' || data.indexOf('Status code: 401') != '-1') { toastr.clear(); toastr.error('It looks like there is no authorization in the Roxy-WI repository. Your subscription may have expired or there is no subscription. How to get the <b><a href="https://roxy-wi.org/pricing.py" title="Pricing" target="_blank">subscription</a></b>'); @@ -2497,7 +2409,7 @@ function updateService(service, action='update') { loadupdatehapwi(); show_version(); } - } ); + }); } function confirmDeleteOpenVpnProfile(id) { $( "#dialog-confirm" ).dialog({ @@ -2519,40 +2431,40 @@ function confirmDeleteOpenVpnProfile(id) { } function removeOpenVpnProfile(id) { - $("#"+id).css("background-color", "#f2dede"); - $.ajax( { - url: "options.py", + $("#" + id).css("background-color", "#f2dede"); + $.ajax({ + url: "/app/admin/openvpn/delete", data: { openvpndel: id, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if(data == "Ok ") { - $("#"+id).remove(); + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data == "ok") { + $("#" + id).remove(); } else if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } } - } ); + }); } function uploadOvpn() { toastr.clear(); - if ($( "#ovpn_upload_name" ).val() == '' || $('#ovpn_upload_file').val() == '') { + if ($("#ovpn_upload_name").val() == '' || $('#ovpn_upload_file').val() == '') { toastr.error('All fields must be completed'); } else { - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/admin/openvpn/upload", data: { uploadovpn: $('#ovpn_upload_file').val(), ovpnname: $('#ovpn_upload_name').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); - if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { toastr.error(data); } else if (data.indexOf('success') != '-1') { toastr.clear(); @@ -2562,18 +2474,16 @@ function uploadOvpn() { toastr.error('Something wrong, check and try again'); } } - } ); + }); } } function OpenVpnSess(id, action) { $.ajax({ - url: "options.py", - data: { - actionvpn: action, - openvpnprofile: id, - token: $('#token').val() - }, - type: "POST", + url: "/app/admin/openvpn/" + action + "/" + id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { @@ -2586,48 +2496,15 @@ function OpenVpnSess(id, action) { toastr.error('Something wrong, check and try again'); } } - } ); + }); } -function scanPorts(id) { +function viewFirewallRules(ip) { $.ajax({ - url: "options.py", - data: { - scan_ports: id, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { - toastr.error(data); - } else { - toastr.clear(); - $("#show_scans_ports_body").html(data); - $("#show_scans_ports" ).dialog({ - resizable: false, - height: "auto", - width: 360, - modal: true, - title: "Openned ports", - buttons: { - Close: function() { - $( this ).dialog( "close" ); - $("#show_scans_ports_body").html(''); - } - } - }); - } - } - } ); -} -function viewFirewallRules(id) { - $.ajax({ - url: "options.py", - data: { - viewFirewallRules: id, - token: $('#token').val() - }, - type: "POST", + url: "/app/server/firewall/" + ip, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error: ') != '-1') { @@ -2654,12 +2531,11 @@ function viewFirewallRules(id) { } function loadServices() { $.ajax({ - url: "options.py", - data: { - loadservices: 1, - token: $('#token').val() - }, - type: "POST", + url: "/app/admin/tools", + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { @@ -2673,12 +2549,11 @@ function loadServices() { } function loadupdatehapwi() { $.ajax({ - url: "options.py", - data: { - load_update_hapwi: 1, - token: $('#token').val() - }, - type: "POST", + url: "/app/server/update", + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { @@ -2689,15 +2564,10 @@ function loadupdatehapwi() { } } ); } -function loadchecker(tab = 0) { +function loadchecker() { $.ajax({ - url: "options.py", - data: { - loadchecker: 1, - page: cur_url[0].split('#')[0], - token: $('#token').val() - }, - type: "POST", + url: "/app/checker/settings/load", + type: "GET", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('group_error') == '-1' && data.indexOf('error:') != '-1') { @@ -2709,19 +2579,18 @@ function loadchecker(tab = 0) { $( "input[type=checkbox]" ).checkboxradio(); $.getScript('/inc/users.js'); $.getScript(awesome); - $( "#checker_tabs" ).tabs( "option", "active", tab ); + // $( "#checker_tabs" ).tabs( "option", "active", tab ); } } } ); } function loadopenvpn() { $.ajax({ - url: "options.py", - data: { - loadopenvpn: 1, - token: $('#token').val() - }, - type: "POST", + url: "/app/admin/openvpn", + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('group_error') == '-1' && data.indexOf('error:') != '-1') { @@ -2735,14 +2604,11 @@ function loadopenvpn() { } function checkReceiver(channel_id, receiver_name) { $.ajax({ - url: "options.py", - data: { - check_receiver: 1, - receiver_channel_id: channel_id, - receiver_name: receiver_name, - token: $('#token').val() - }, - type: "POST", + url: "/app/checker/check/" + channel_id + "/" + receiver_name, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') { @@ -2751,43 +2617,37 @@ function checkReceiver(channel_id, receiver_name) { toastr.success('Test message has been sent'); } } - } ); + }); } function updateServerInfo(ip, id) { $.ajax({ - url: "options.py", - data: { - act: 'updateSystemInfo', - server_ip: ip, - server_id: id, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') { - toastr.error(data); - } else { - $("#server_info-"+id).html(data); - $('#server_info-'+id).show(); - $('#server_info_link-'+id).attr('title', 'Hide System info'); - $.getScript(awesome); - } + url: "/app/server/system_info/update/" + ip + "/" + id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') { + toastr.error(data); + } else { + $("#server_info-" + id).html(data); + $('#server_info-' + id).show(); + $('#server_info_link-' + id).attr('title', 'Hide System info'); + $.getScript(awesome); } - } ); + } + }); } function showServerInfo(id, ip) { var close_word = $('#translate').attr('data-close'); var server_info = $('#translate').attr('data-server_info'); $.ajax({ - url: "options.py", - data: { - act: 'getSystemInfo', - server_ip: ip, - server_id: id, - token: $('#token').val() - }, - type: "POST", + url: "/app/server/system_info/get/" + ip + "/" +id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') { @@ -2810,7 +2670,7 @@ function showServerInfo(id, ip) { $.getScript(awesome); } } - } ); + }); } function updateHaproxyCheckerSettings(id) { toastr.clear(); @@ -2818,168 +2678,167 @@ function updateHaproxyCheckerSettings(id) { let server = 0; let backend = 0; let maxconn = 0; - if ($('#haproxy_server_email-'+id).is(':checked')) { + if ($('#haproxy_server_email-' + id).is(':checked')) { email = '1'; } - if ($('#haproxy_server_status-'+id).is(':checked')) { + if ($('#haproxy_server_status-' + id).is(':checked')) { server = '1'; } - if ($('#haproxy_server_backend-'+id).is(':checked')) { + if ($('#haproxy_server_backend-' + id).is(':checked')) { backend = '1'; } - if ($('#haproxy_server_maxconn-'+id).is(':checked')) { + if ($('#haproxy_server_maxconn-' + id).is(':checked')) { maxconn = '1'; } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/checker/settings/update", data: { - updateHaproxyCheckerSettings: id, + service: 'haproxy', + setting_id: id, email: email, server: server, backend: backend, maxconn: maxconn, - telegram_id: $('#haproxy_server_telegram_channel-'+id+' option:selected' ).val(), - slack_id: $('#haproxy_server_slack_channel-'+id+' option:selected').val(), - pd_id: $('#haproxy_server_pd_channel-'+id+' option:selected').val(), + telegram_id: $('#haproxy_server_telegram_channel-' + id + ' option:selected').val(), + slack_id: $('#haproxy_server_slack_channel-' + id + ' option:selected').val(), + pd_id: $('#haproxy_server_pd_channel-' + id + ' option:selected').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else if (data.indexOf('ok') != '-1') { toastr.clear(); - $("#haproxy_server_tr_id-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#haproxy_server_tr_id-"+id ).removeClass( "update" ); - }, 2500 ); + $("#haproxy_server_tr_id-" + id).addClass("update", 1000); + setTimeout(function () { + $("#haproxy_server_tr_id-" + id).removeClass("update"); + }, 2500); } } - } ); + }); } function updateKeepalivedCheckerSettings(id) { toastr.clear(); let email = 0; let server = 0; let backend = 0; - if ($('#keepalived_server_email-'+id).is(':checked')) { + if ($('#keepalived_server_email-' + id).is(':checked')) { email = '1'; } - if ($('#keepalived_server_status-'+id).is(':checked')) { + if ($('#keepalived_server_status-' + id).is(':checked')) { server = '1'; } - if ($('#keepalived_server_backend-'+id).is(':checked')) { + if ($('#keepalived_server_backend-' + id).is(':checked')) { backend = '1'; } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/checker/settings/update", data: { - updateKeepalivedCheckerSettings: id, + service: 'keepavlied', + settings_id: id, email: email, server: server, backend: backend, - telegram_id: $('#keepalived_server_telegram_channel-'+id+' option:selected' ).val(), - slack_id: $('#keepalived_server_slack_channel-'+id+' option:selected').val(), - pd_id: $('#keepalived_server_pd_channel-'+id+' option:selected').val(), + telegram_id: $('#keepalived_server_telegram_channel-' + id + ' option:selected').val(), + slack_id: $('#keepalived_server_slack_channel-' + id + ' option:selected').val(), + pd_id: $('#keepalived_server_pd_channel-' + id + ' option:selected').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else if (data.indexOf('ok') != '-1') { toastr.clear(); - $("#keepalived_server_tr_id-"+id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#keepalived_server_tr_id-"+id ).removeClass( "update" ); - }, 2500 ); + $("#keepalived_server_tr_id-" + id).addClass("update", 1000); + setTimeout(function () { + $("#keepalived_server_tr_id-" + id).removeClass("update"); + }, 2500); } } - } ); + }); } function updateServiceCheckerSettings(id, service_name) { toastr.clear(); let email = 0; let server = 0; - if ($('#'+service_name+'_server_email-'+id).is(':checked')) { + if ($('#' + service_name + '_server_email-' + id).is(':checked')) { email = '1'; } - if ($('#'+service_name+'_server_status-'+id).is(':checked')) { + if ($('#' + service_name + '_server_status-' + id).is(':checked')) { server = '1'; } - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/checker/settings/update", data: { - updateServiceCheckerSettings: id, + service: service_name, + settings_id: id, email: email, server: server, - telegram_id: $('#'+service_name+'_server_telegram_channel-'+id+' option:selected' ).val(), - slack_id: $('#'+service_name+'_server_slack_channel-'+id+' option:selected').val(), - pd_id: $('#'+service_name+'_server_pd_channel-'+id+' option:selected').val(), + telegram_id: $('#' + service_name + '_server_telegram_channel-' + id + ' option:selected').val(), + slack_id: $('#' + service_name + '_server_slack_channel-' + id + ' option:selected').val(), + pd_id: $('#' + service_name + '_server_pd_channel-' + id + ' option:selected').val(), token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('unique') != '-1') { toastr.error(data); } else if (data.indexOf('ok') != '-1') { toastr.clear(); - $('#'+service_name+'_server_tr_id-'+id).addClass( "update", 1000 ); - setTimeout(function() { - $('#'+service_name+'_server_tr_id-'+id ).removeClass( "update" ); - }, 2500 ); + $('#' + service_name + '_server_tr_id-' + id).addClass("update", 1000); + setTimeout(function () { + $('#' + service_name + '_server_tr_id-' + id).removeClass("update"); + }, 2500); } } - } ); + }); } function checkWebPanel() { $.ajax({ - url: "options.py", - data: { - check_rabbitmq_alert: 1, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') { - toastr.error(data); - } else { - toastr.success('Test message has been sent'); - } - } + url: "/app/checker/check/rabbit", + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') { + toastr.error(data); + } else { + toastr.success('Test message has been sent'); + } + } }); } function checkEmail() { $.ajax({ - url: "options.py", - data: { - check_email_alert: 1, - token: $('#token').val() - }, - type: "POST", - success: function (data) { - data = data.replace(/\s+/g, ' '); - if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') { - toastr.error(data); - } else { - toastr.success('Test message has been sent'); - } - } + url: "/app/checker/check/email", + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { + data = data.replace(/\s+/g, ' '); + if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') { + toastr.error(data); + } else { + toastr.success('Test message has been sent'); + } + } }); } function checkGeoipInstallation() { $.ajax( { - url: "options.py", - data: { - geoipserv: $('#geoipserv option:selected').val(), - geoip_service: $('#geoip_service option:selected').val(), - token: $('#token').val() - }, - type: "POST", + url: "/app/install/geoip/" + $('#geoip_service option:selected').val() + "/" + $('#geoipserv option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function( data ) { data = data.replace(/^\s+|\s+$/g,''); if(data.indexOf('No such file or directory') != '-1' || data.indexOf('cannot access') != '-1') { @@ -2992,44 +2851,42 @@ function checkGeoipInstallation() { } } ); } -function installService(service){ +function installService(service) { $("#ajax").html('') var syn_flood = 0; var docker = 0; - if ($('#'+service+'_syn_flood').is(':checked')) { + if ($('#' + service + '_syn_flood').is(':checked')) { syn_flood = '1'; } - if ($('#'+service+'_docker').is(':checked')) { + if ($('#' + service + '_docker').is(':checked')) { docker = '1'; } - if ($('#'+service+'addserv').val() == '------') { + if ($('#' + service + 'addserv').val() == '------') { var select_server = $('#translate').attr('data-select_server'); toastr.warning(select_server); return false } $("#ajax").html(wait_mess); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/install/" + service + "/" + $('#' + service + 'addserv').val(), data: { - install_service: $('#' + service + 'addserv').val(), - service: service, syn_flood: syn_flood, docker: docker, token: $('#token').val() }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); $("#ajax").html('') if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') { toastr.clear(); var p_err = show_pretty_ansible_error(data); toastr.error(p_err); - } else if (data.indexOf('success') != '-1' ){ + } else if (data.indexOf('success') != '-1') { toastr.clear(); toastr.success(data); - $('#'+service+'addserv').trigger( "selectmenuchange" ); - } else if (data.indexOf('Info') != '-1' ){ + $('#' + service + 'addserv').trigger("selectmenuchange"); + } else if (data.indexOf('Info') != '-1') { toastr.clear(); toastr.info(data); } else { @@ -3037,49 +2894,45 @@ function installService(service){ toastr.info(data); } } - } ); + }); } function showServiceVersion(service) { $.ajax({ - url: "options.py", - data: { - get_service_v: service, - serv: $('#'+service+'addserv option:selected').val(), - token: $('#token').val() - }, - type: "POST", + url: "/app/install/" + service + "/version/" + $('#' + service + 'addserv option:selected').val(), + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('bash') != '-1' || data.indexOf('such') != '-1' || data.indexOf('command not found') != '-1' || data.indexOf('from') != '-1') { - $('#cur_'+service+'_ver').text(service+' has not installed'); - $('#'+service+'_install').text('Install'); - $('#'+service+'_install').attr('title', 'Install'); + $('#cur_' + service + '_ver').text(service + ' has not installed'); + $('#' + service + '_install').text('Install'); + $('#' + service + '_install').attr('title', 'Install'); } else if (data.indexOf('warning: ') != '-1') { toastr.warning(data); } else if (data == '') { - $('#cur_'+service+'_ver').text(service+' has not installed'); - $('#'+service+'_install').text('Install'); - $('#'+service+'_install').attr('title', 'Install'); + $('#cur_' + service + '_ver').text(service + ' has not installed'); + $('#' + service + '_install').text('Install'); + $('#' + service + '_install').attr('title', 'Install'); } else { - $('#cur_'+service+'_ver').text(data); - $('#cur_'+service+'_ver').css('font-weight', 'bold'); - $('#'+service+'_install').text('Update'); - $('#'+service+'_install').attr('title', 'Update'); + $('#cur_' + service + '_ver').text(data); + $('#cur_' + service + '_ver').css('font-weight', 'bold'); + $('#' + service + '_install').text('Update'); + $('#' + service + '_install').attr('title', 'Update'); } } - } ); + }); } function serverIsUp(server_ip, server_id) { var cur_url = window.location.href.split('/').pop(); if (cur_url.split('#')[1] == 'servers') { $.ajax({ - url: "options.py", - data: { - act: 'server_is_up', - server_is_up: server_ip, - token: $('#token').val() - }, - type: "POST", + url: "/app/server/check/server/" + server_ip, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { data = data.replace(/^\s+|\s+$/g, ''); if (data.indexOf('up') != '-1') { @@ -3106,15 +2959,13 @@ function confirmChangeGroupsAndRoles(user_id) { var cancel_word = $('#translate').attr('data-cancel'); var action_word = $('#translate').attr('data-save'); var user_groups_word = $('#translate').attr('data-user_groups'); - var username = $('#login-'+user_id).val(); + var username = $('#login-' + user_id).val(); $.ajax({ - url: "options.py", - data: { - act: 'show_user_group_and_role', - user_id: user_id, - token: $('#token').val() - }, - type: "POST", + url: "/app/user/groups/" + user_id, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function (data) { $("#groups-roles").html(data); $("#groups-roles").dialog({ @@ -3182,14 +3033,13 @@ function saveGroupsAndRoles(user_id) { jsonData[user_id] = {}; $('#checked_groups tbody tr').each(function () { var this_id = $(this).attr('id').split('-')[1]; - var role_id = $('#add_role-'+this_id).val(); + var role_id = $('#add_role-' + this_id).val(); jsonData[user_id][this_id] = {'role_id': role_id}; }); $.ajax({ - url: "options.py", + url: "/app/user/groups/save", data: { - act: 'save_user_group_and_role', - changeUserGroupsUser: $('#login-'+user_id).val(), + changeUserGroupsUser: $('#login-' + user_id).val(), jsonDatas: JSON.stringify(jsonData), token: $('#token').val() }, @@ -3198,10 +3048,10 @@ function saveGroupsAndRoles(user_id) { if (data.indexOf('error: ') != '-1') { toastr.warning(data); } else { - $("#user-"+user_id).addClass( "update", 1000 ); - setTimeout(function() { - $( "#user-"+user_id ).removeClass( "update" ); - }, 2500 ); + $("#user-" + user_id).addClass("update", 1000); + setTimeout(function () { + $("#user-" + user_id).removeClass("update"); + }, 2500); } } }); @@ -3210,15 +3060,13 @@ function openChangeServerServiceDialog(server_id) { var cancel_word = $('#translate').attr('data-cancel'); var action_word = $('#translate').attr('data-save'); var user_groups_word = $('#translate').attr('data-user_groups'); - var hostname = $('#hostname-'+server_id).val(); + var hostname = $('#hostname-' + server_id).val(); $.ajax({ - url: "options.py", - data: { - act: 'show_server_services', - server_id: server_id, - token: $('#token').val() - }, - type: "POST", + url: "/app/server/services/" + server_id, + // data: { + // token: $('#token').val() + // }, + // type: "GET", success: function (data) { $("#groups-roles").html(data); $("#groups-roles").dialog({ @@ -3283,16 +3131,15 @@ function changeServerServices(server_id) { var this_id = $(this).attr('id').split('-')[1]; jsonData[this_id] = 0 }); - $.ajax( { - url: "options.py", + $.ajax({ + url: "/app/server/services/" + server_id, data: { - changeServerServicesId: server_id, jsonDatas: JSON.stringify(jsonData), - changeServerServicesServer: $('#hostname-'+server_id).val(), + changeServerServicesServer: $('#hostname-' + server_id).val(), token: $('#token').val() }, type: "POST", - success: function( data ) { + success: function (data) { if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1') { toastr.error(data); } else { @@ -3302,5 +3149,5 @@ function changeServerServices(server_id) { }, 2500); } } - } ); + }); } diff --git a/inc/waf-6.3.8.js b/inc/waf.js similarity index 65% rename from inc/waf-6.3.8.js rename to inc/waf.js index eb98e23c..7b825994 100644 --- a/inc/waf-6.3.8.js +++ b/inc/waf.js @@ -1,8 +1,8 @@ var awesome = "/inc/fontawesome.min.js" -var waf = "/inc/waf-6.3.8.js" -var overview = "/inc/overview-6.3.9.js" +var waf = "/inc/waf.js" +var overview = "/inc/overview.js" function showOverviewWaf(serv, hostnamea) { - var service = findGetParameter('service'); + var service = cur_url[1]; if (service == 'haproxy') { $.getScript('/inc/chart.min-4.3.0.js'); showWafMetrics(); @@ -15,28 +15,25 @@ function showOverviewWaf(serv, hostnamea) { $.getScript(waf); } function showOverviewWafCallBack(serv, hostnamea) { - var service = findGetParameter('service'); - $.ajax( { - url: "options.py", - data: { - act: "overviewwaf", - serv: serv, - service: service, - token: $('#token').val() + var service = cur_url[1]; + $.ajax({ + url: "/app/waf/overview/" + service + "/" + serv, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + beforeSend: function () { + $("#" + hostnamea).html('<img class="loading_small" src="/app/static/images/loading.gif" />'); }, - beforeSend: function() { - $("#"+hostnamea).html('<img class="loading_small" src="/inc/images/loading.gif" />'); - }, - type: "POST", - success: function( data ) { - $("#"+hostnamea).empty(); - $("#"+hostnamea).html(data) - $( "input[type=submit], button" ).button(); - $( "input[type=checkbox]" ).checkboxradio(); + success: function (data) { + $("#" + hostnamea).empty(); + $("#" + hostnamea).html(data) + $("input[type=submit], button").button(); + $("input[type=checkbox]").checkboxradio(); $.getScript(overview); $.getScript(awesome); - } - } ); + } + }); } function metrics_waf(name) { var enable = 0; @@ -45,13 +42,11 @@ function metrics_waf(name) { } name = name.split('metrics')[1] $.ajax( { - url: "options.py", - data: { - metrics_waf: name, - enable: enable, - token: $('#token').val() - }, - type: "POST", + url: "/app/waf/metric/enable/" + enable + "/" + name, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function( data ) { showOverviewWaf(ip, hostnamea); setTimeout(function() { @@ -63,52 +58,47 @@ function metrics_waf(name) { function installWaf(ip1) { $("#ajax").html(''); $("#ajax").html(wait_mess); - var service = findGetParameter('service'); - $.ajax( { - url: "options.py", - data: { - installwaf: ip1, - service: service, - token: $('#token').val() - }, + var service = cur_url[1]; + $.ajax({ + url: "/app/install/waf/" + service + "/" + ip1, + // data: { + // token: $('#token').val() + // }, type: "POST", - success: function( data ) { - data = data.replace(/\s+/g,' '); + success: function (data) { + data = data.replace(/\s+/g, ' '); if (data.indexOf('error:') != '-1' || data.indexOf('Failed') != '-1' || data.indexOf('fatal') != '-1') { toastr.error(data); - } else if (data.indexOf('Info') != '-1' ){ + } else if (data.indexOf('Info') != '-1') { toastr.clear(); toastr.info(data); - } else if (data.indexOf('success') != '-1' ){ + } else if (data.indexOf('success') != '-1') { toastr.clear(); toastr.success('WAF service has been installed'); showOverviewWaf(ip, hostnamea); $("#ajax").html(''); - } + } } - } ); + }); } function changeWafMode(id) { - var waf_mode = $('#'+id+' option:selected').val(); + var waf_mode = $('#' + id + ' option:selected').val(); var server_hostname = id.split('_')[0]; - var service = findGetParameter('service'); - $.ajax( { - url: "options.py", - data: { - change_waf_mode: waf_mode, - server_hostname: server_hostname, - service: service, - token: $('#token').val() - }, - type: "POST", - success: function( data ) { + var service = cur_url[1]; + $.ajax({ + url: "/app/waf/" + service + "/mode/" + server_hostname + "/" + waf_mode, + // data: { + // token: $('#token').val() + // }, + // type: "POST", + success: function (data) { toastr.info('Do not forget restart WAF service'); - $( '#'+server_hostname+'-select-line' ).addClass( "update", 1000 ); - setTimeout(function() { - $( '#'+server_hostname+'-select-line' ).removeClass( "update" ); - }, 2500 ); + $('#' + server_hostname + '-select-line').addClass("update", 1000); + setTimeout(function () { + $('#' + server_hostname + '-select-line').removeClass("update"); + }, 2500); } - } ); + }); } $( function() { $( "#waf_rules input" ).change(function() { @@ -121,16 +111,13 @@ function waf_rules_en(id) { if ($('#rule_id-'+id).is(':checked')) { enable = '1'; } - var serv = findGetParameter('serv') + var serv = cur_url[2]; $.ajax( { - url: "options.py", - data: { - waf_rule_id: id, - waf_en: enable, - serv: serv, - token: $('#token').val() - }, - type: "POST", + url: "/app/waf/" + serv + "/rule/" + id + "/" + enable, + // data: { + // token: $('#token').val() + // }, + // type: "POST", success: function( data ) { if (data.indexOf('sed:') != '-1' || data.indexOf('error: ') != '-1' ) { toastr.error(data); @@ -171,21 +158,19 @@ function addNewConfig() { let new_rule_name = $('#new_rule_name').val(); let new_rule_description = $('#new_rule_description').val(); let new_rule_file = new_rule_name.replaceAll(' ','_'); - var service = findGetParameter('service'); - var serv = findGetParameter('serv'); + var service = cur_url[1]; + var serv = cur_url[2]; service = escapeHtml(service); new_rule_name = escapeHtml(new_rule_name); new_rule_description = escapeHtml(new_rule_description); new_rule_file = escapeHtml(new_rule_file); serv = escapeHtml(serv); $.ajax({ - url: "options.py", + url: "/app/waf/" + service + "/" + serv + "/rule/create", data: { new_waf_rule: new_rule_name, new_rule_description: new_rule_description, new_rule_file: new_rule_file, - service: service, - serv: serv, token: $('#token').val() }, type: "POST", diff --git a/index.html b/index.html index dd38b2b8..3a175c53 100644 --- a/index.html +++ b/index.html @@ -8,30 +8,29 @@ </script> <meta charset="utf-8"> <title>Roxy-WI</title> - <link href="/inc/images/favicon/favicon.ico" rel="icon" type="image/png" /> - <link rel="apple-touch-icon" sizes="57x57" href="/inc/images/favicon/inc/images/favicon/apple-icon-57x57.png"> - <link rel="apple-touch-icon" sizes="60x60" href="/inc/images/favicon/apple-icon-60x60.png"> - <link rel="apple-touch-icon" sizes="72x72" href="/inc/images/favicon/apple-icon-72x72.png"> - <link rel="apple-touch-icon" sizes="76x76" href="/inc/images/favicon/apple-icon-76x76.png"> - <link rel="apple-touch-icon" sizes="114x114" href="/inc/images/favicon/apple-icon-114x114.png"> - <link rel="apple-touch-icon" sizes="120x120" href="/inc/images/favicon/apple-icon-120x120.png"> - <link rel="apple-touch-icon" sizes="144x144" href="/inc/images/favicon/apple-icon-144x144.png"> - <link rel="apple-touch-icon" sizes="152x152" href="/inc/images/favicon/apple-icon-152x152.png"> - <link rel="apple-touch-icon" sizes="180x180" href="/inc/images/favicon/apple-icon-180x180.png"> - <link rel="icon" type="image/png" sizes="192x192" href="/inc/images/favicon/android-icon-192x192.png"> - <link rel="icon" type="image/png" sizes="32x32" href="/inc/images/favicon/favicon-32x32.png"> - <link rel="icon" type="image/png" sizes="96x96" href="/inc/images/favicon/favicon-96x96.png"> - <link rel="icon" type="image/png" sizes="16x16" href="/inc/images/favicon/favicon-16x16.png"> - <link rel="manifest" href="/inc/images/favicon/manifest.json"> + <link href="/app/static/images/favicon/favicon.ico" rel="icon" type="image/png" /> + <link rel="apple-touch-icon" sizes="57x57" href="/app/static/images/favicon/app/static/images/favicon/apple-icon-57x57.png"> + <link rel="apple-touch-icon" sizes="60x60" href="/app/static/images/favicon/apple-icon-60x60.png"> + <link rel="apple-touch-icon" sizes="72x72" href="/app/static/images/favicon/apple-icon-72x72.png"> + <link rel="apple-touch-icon" sizes="76x76" href="/app/static/images/favicon/apple-icon-76x76.png"> + <link rel="apple-touch-icon" sizes="114x114" href="/app/static/images/favicon/apple-icon-114x114.png"> + <link rel="apple-touch-icon" sizes="120x120" href="/app/static/images/favicon/apple-icon-120x120.png"> + <link rel="apple-touch-icon" sizes="144x144" href="/app/static/images/favicon/apple-icon-144x144.png"> + <link rel="apple-touch-icon" sizes="152x152" href="/app/static/images/favicon/apple-icon-152x152.png"> + <link rel="apple-touch-icon" sizes="180x180" href="/app/static/images/favicon/apple-icon-180x180.png"> + <link rel="icon" type="image/png" sizes="192x192" href="/app/static/images/favicon/android-icon-192x192.png"> + <link rel="icon" type="image/png" sizes="32x32" href="/app/static/images/favicon/favicon-32x32.png"> + <link rel="icon" type="image/png" sizes="96x96" href="/app/static/images/favicon/favicon-96x96.png"> + <link rel="icon" type="image/png" sizes="16x16" href="/app/static/images/favicon/favicon-16x16.png"> + <link rel="manifest" href="/app/static/images/favicon/manifest.json"> <meta name="msapplication-TileColor" content="#ffffff"> - <meta name="msapplication-TileImage" content="/inc/images/favicon/ms-icon-144x144.png"> + <meta name="msapplication-TileImage" content="/app/static/images/favicon/ms-icon-144x144.png"> <meta name="theme-color" content="#ffffff"> <script defer src="/inc/intro/introjs.min.js"></script> <link href="/inc/intro/introjs.min.css" rel="stylesheet"> <link href="/inc/intro/introjs-modern.css" rel="stylesheet"> <link href="/inc/css/style-6.3.9.css" rel="stylesheet"> <link href="/inc/css/nprogress.css" rel="stylesheet"> - <link href="/inc/css/provisioning.css" rel="stylesheet"> <link href="/inc/css/jquery-ui.min.css" rel="stylesheet"> <link href="/inc/css/jquery-ui.structure.min.css" rel="stylesheet"> <script src="/inc/jquery-3.6.0.min.js"></script> @@ -41,7 +40,7 @@ <script defer src="/inc/fontawesome.min.js"></script> <link href="/inc/css/awesome-6.3.9.css" rel="stylesheet"> <link href="/inc/css/chart.min.css" rel="stylesheet"> - <script src="/inc/metrics-6.3.16.0.js"></script> + <script src="/inc/metrics.js"></script> <script src="/inc/chart.min-4.3.0.js"></script> <link rel="stylesheet" href="/inc/codemirror/codemirror.css"> <script src="/inc/codemirror/codemirror.js"></script> @@ -50,15 +49,14 @@ <link href="/inc/css/toastr-6.3.9.css" rel="stylesheet"/> <script src="/inc/toastr.js"></script> <script defer src="/inc/ion.sound.min.js"></script> - <script src="/inc/provisioning.js"></script> <link href="/inc/css/select2.css" rel="stylesheet" /> <script src="/inc/select2.js"></script> <script src="/inc/reconnecting-websocket.js"></script> <link href="/inc/css/table-6.3.9.css" rel="stylesheet" type="text/css"> <script type="text/javascript" charset="utf8" src="/inc/dataTables.min.js"></script> <script src="/inc/js.cookie.min.js"></script> - <script src="/inc/script-6.3.9.js"></script> - <meta http-equiv="refresh" content="0; url=/app/overview.py" /> + <script src="/inc/script.js"></script> + <meta http-equiv="refresh" content="0; url=/app/" /> </head> <body style="background-color: #239dee;"> <style> @@ -83,7 +81,7 @@ <center> <div style="color: white;"> <h1 style="font-size: 100px;">Welcome to</h1> - <img src="/inc/images/logo_index.png" alt="logo" style="margin-top: -50px;display: block;padding-bottom: 70px;" /> + <img src="/app/static/images/logo_index.png" alt="logo" style="margin-top: -50px;display: block;padding-bottom: 70px;" /> <b style="font-size: 30px;">Redirecting... Please wait</b> </div> </center> diff --git a/requirements.txt b/requirements.txt index 9e92766c..f7456895 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ bottle>=0.12.20 psutil>=5.9.1 pdpyras>=4.5.2 pika>=1.3.1 +Flask-Caching>=1.10.1