diff --git a/app/__init__.py b/app/__init__.py index ba70c2e0..d11838d0 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -16,6 +16,12 @@ login_manager = LoginManager(app) app.config['SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS'] = True app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=3) +from app.routes.main import bp as main_bp +app.register_blueprint(main_bp) + +from app.routes.overview import bp as overview_bp +app.register_blueprint(overview_bp) + from app.routes.add import bp as add_bp app.register_blueprint(add_bp, url_prefix='/add') @@ -25,6 +31,9 @@ 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.logs import bp as logs_bp +app.register_blueprint(logs_bp, url_prefix='/logs') + from app.routes.metric import bp as metric_bp app.register_blueprint(metric_bp, url_prefix='/metrics') @@ -40,6 +49,9 @@ 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.portscanner import bp as portscanner_bp +app.register_blueprint(portscanner_bp, url_prefix='/portscanner') + from app.routes.install import bp as install_bp app.register_blueprint(install_bp, url_prefix='/install') @@ -51,6 +63,3 @@ 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/ajax_views.py b/app/ajax_views.py deleted file mode 100644 index a029112a..00000000 --- a/app/ajax_views.py +++ /dev/null @@ -1,191 +0,0 @@ -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/') -@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//', 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///', defaults={'waf': '0'}, methods=['GET', 'POST']) -@app.route('/logs//waf//', 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//') -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/') -@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/') -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/') -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/modules/roxywi/roxy.py b/app/modules/roxywi/roxy.py index d44b4938..61c029e7 100644 --- a/app/modules/roxywi/roxy.py +++ b/app/modules/roxywi/roxy.py @@ -2,9 +2,11 @@ import os import re import distro +import requests +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.retry import Retry import modules.db.sql as sql -import modules.server.server as server_mod import modules.roxywi.common as roxywi_common @@ -19,43 +21,6 @@ def is_docker() -> bool: return False -def update_roxy_wi(service): - restart_service = '' - services = ['roxy-wi-checker', - 'roxy-wi', - 'roxy-wi-keep_alive', - 'roxy-wi-smon', - 'roxy-wi-metrics', - 'roxy-wi-portscanner', - 'roxy-wi-socket', - 'roxy-wi-prometheus-exporter'] - - if service not in services: - raise Exception(f'error: {service} is not part of Roxy-WI') - - if distro.id() == 'ubuntu': - try: - if service == 'roxy-wi-keep_alive': - service = 'roxy-wi-keep-alive' - except Exception: - pass - - if service != 'roxy-wi': - restart_service = f'&& sudo systemctl restart {service}' - - cmd = f'sudo -S apt-get update && sudo apt-get install {service} {restart_service}' - else: - if service != 'roxy-wi': - restart_service = f'&& sudo systemctl restart {service}' - cmd = f'sudo -S yum -y install {service} {restart_service}' - - output, stderr = server_mod.subprocess_execute(cmd) - if stderr: - return stderr - else: - return output - - def check_ver(): return sql.get_ver() @@ -87,67 +52,7 @@ def versions(): return current_ver, new_ver, current_ver_without_dots, new_ver_without_dots -def get_services_status(): - services = [] - is_in_docker = is_docker() - services_name = { - 'roxy-wi-checker': '', - 'roxy-wi-keep_alive': '', - 'roxy-wi-metrics': '', - 'roxy-wi-portscanner': '', - 'roxy-wi-smon': '', - 'roxy-wi-socket': '', - 'roxy-wi-prometheus-exporter': 'Prometheus exporter', - 'prometheus': 'Prometheus service', - 'grafana-server': 'Grafana service', - 'fail2ban': 'Fail2ban service', - 'rabbitmq-server': 'Message broker service' - } - for s, v in services_name.items(): - if is_in_docker: - cmd = f"sudo supervisorctl status {s}|awk '{{print $2}}'" - else: - cmd = f"systemctl is-active {s}" - - status, stderr = server_mod.subprocess_execute(cmd) - - if s != 'roxy-wi-keep_alive': - service_name = s.split('_')[0] - if s == 'grafana-server': - service_name = 'grafana' - elif s == 'roxy-wi-keep_alive' and distro.id() == 'ubuntu': - service_name = 'roxy-wi-keep-alive' - else: - service_name = s - - if service_name == 'prometheus': - cmd = "prometheus --version 2>&1 |grep prometheus|awk '{print $3}'" - else: - if distro.id() == 'ubuntu': - cmd = f"apt list --installed 2>&1 |grep {service_name}|awk '{{print $2}}'|sed 's/-/./'" - else: - cmd = f"rpm -q {service_name}|awk -F\"{service_name}\" '{{print $2}}' |awk -F\".noa\" '{{print $1}}' |sed 's/-//1' |sed 's/-/./'" - service_ver, stderr = server_mod.subprocess_execute(cmd) - - try: - if service_ver[0] == 'command' or service_ver[0] == 'prometheus:': - service_ver[0] = '' - except Exception: - pass - - try: - services.append([s, status, v, service_ver[0]]) - except Exception: - services.append([s, status, v, '']) - - return services - - def check_new_version(service): - import requests - from requests.adapters import HTTPAdapter - from requests.packages.urllib3.util.retry import Retry - current_ver = check_ver() proxy = sql.get_setting('proxy') res = '' diff --git a/app/modules/tools/checker.py b/app/modules/tools/checker.py index e24d1a11..348f3361 100644 --- a/app/modules/tools/checker.py +++ b/app/modules/tools/checker.py @@ -1,13 +1,13 @@ from flask import render_template, redirect, url_for import modules.db.sql as sql -import modules.roxywi.roxy as roxywi_mod +import modules.tools.common as tools_common import modules.roxywi.common as roxywi_common def load_checker() -> None: groups = sql.select_groups() - services = roxywi_mod.get_services_status() + services = tools_common.get_services_status() keepalived_settings = '' haproxy_settings = '' apache_settings = '' diff --git a/app/modules/tools/common.py b/app/modules/tools/common.py new file mode 100644 index 00000000..038e02bc --- /dev/null +++ b/app/modules/tools/common.py @@ -0,0 +1,100 @@ +import distro + +import modules.db.sql as sql +import modules.roxywi.roxy as roxywi_mod +import modules.server.server as server_mod +import modules.roxywi.common as roxywi_common + + +def get_services_status(): + services = [] + is_in_docker = roxywi_mod.is_docker() + services_name = { + 'roxy-wi-checker': '', + 'roxy-wi-keep_alive': '', + 'roxy-wi-metrics': '', + 'roxy-wi-portscanner': '', + 'roxy-wi-smon': '', + 'roxy-wi-socket': '', + 'roxy-wi-prometheus-exporter': 'Prometheus exporter', + 'prometheus': 'Prometheus service', + 'grafana-server': 'Grafana service', + 'fail2ban': 'Fail2ban service', + 'rabbitmq-server': 'Message broker service' + } + for s, v in services_name.items(): + if is_in_docker: + cmd = f"sudo supervisorctl status {s}|awk '{{print $2}}'" + else: + cmd = f"systemctl is-active {s}" + + status, stderr = server_mod.subprocess_execute(cmd) + + if s != 'roxy-wi-keep_alive': + service_name = s.split('_')[0] + if s == 'grafana-server': + service_name = 'grafana' + elif s == 'roxy-wi-keep_alive' and distro.id() == 'ubuntu': + service_name = 'roxy-wi-keep-alive' + else: + service_name = s + + if service_name == 'prometheus': + cmd = "prometheus --version 2>&1 |grep prometheus|awk '{print $3}'" + else: + if distro.id() == 'ubuntu': + cmd = f"apt list --installed 2>&1 |grep {service_name}|awk '{{print $2}}'|sed 's/-/./'" + else: + cmd = f"rpm -q {service_name}|awk -F\"{service_name}\" '{{print $2}}' |awk -F\".noa\" '{{print $1}}' |sed 's/-//1' |sed 's/-/./'" + service_ver, stderr = server_mod.subprocess_execute(cmd) + + try: + if service_ver[0] == 'command' or service_ver[0] == 'prometheus:': + service_ver[0] = '' + except Exception: + pass + + try: + services.append([s, status, v, service_ver[0]]) + except Exception: + services.append([s, status, v, '']) + + return services + + +def update_roxy_wi(service: str) -> str: + restart_service = '' + services = ['roxy-wi-checker', + 'roxy-wi', + 'roxy-wi-keep_alive', + 'roxy-wi-smon', + 'roxy-wi-metrics', + 'roxy-wi-portscanner', + 'roxy-wi-socket', + 'roxy-wi-prometheus-exporter'] + + if service not in services: + raise Exception(f'error: {service} is not part of Roxy-WI') + + if distro.id() == 'ubuntu': + try: + if service == 'roxy-wi-keep_alive': + service = 'roxy-wi-keep-alive' + except Exception: + pass + + if service != 'roxy-wi': + restart_service = f'&& sudo systemctl restart {service}' + + cmd = f'sudo -S apt-get update && sudo apt-get install {service} {restart_service}' + else: + if service != 'roxy-wi': + restart_service = f'&& sudo systemctl restart {service}' + cmd = f'sudo -S yum -y install {service} {restart_service}' + + output, stderr = server_mod.subprocess_execute(cmd) + + if stderr != '': + return str(stderr) + else: + return str(output) diff --git a/app/routes/add/routes.py b/app/routes/add/routes.py index f309de00..dbd90170 100644 --- a/app/routes/add/routes.py +++ b/app/routes/add/routes.py @@ -1,20 +1,16 @@ import os -import sys from flask import render_template, request, jsonify, redirect, url_for from flask_login import login_required 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 modules.server.server as server_mod +import app.modules.db.sql as sql +import app.modules.config.add as add_mod +import app.modules.common.common as common +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common +import app.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') diff --git a/app/routes/admin/routes.py b/app/routes/admin/routes.py index 85cc1dd5..c8d30452 100644 --- a/app/routes/admin/routes.py +++ b/app/routes/admin/routes.py @@ -1,5 +1,4 @@ import os -import sys import pytz import distro @@ -7,15 +6,13 @@ from flask import render_template, request, redirect, url_for from flask_login import login_required 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 +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.roxywi.roxy as roxy +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common +import app.modules.server.server as server_mod +import app.modules.tools.common as tools_common @bp.before_request @@ -66,7 +63,7 @@ def show_tools(): roxywi_auth.page_for_admin() lang = roxywi_common.get_user_lang_for_flask() try: - services = roxy.get_services_status() + services = tools_common.get_services_status() except Exception as e: return str(e) @@ -78,7 +75,7 @@ def update_tools(service): roxywi_auth.page_for_admin() try: - return roxy.update_roxy_wi(service) + return tools_common.update_roxy_wi(service) except Exception as e: return f'error: {e}' @@ -103,7 +100,7 @@ def update_roxywi(): 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() + services = tools_common.get_services_status() lang = roxywi_common.get_user_lang_for_flask() return render_template( diff --git a/app/routes/checker/routes.py b/app/routes/checker/routes.py index 7db963ab..44902454 100644 --- a/app/routes/checker/routes.py +++ b/app/routes/checker/routes.py @@ -1,19 +1,13 @@ -import os -import sys - from flask import render_template, request, redirect, url_for from flask_login import login_required 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 -import modules.tools.smon as smon_mod +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.roxywi.common as roxywi_common +import app.modules.tools.alerting as alerting +import app.modules.tools.checker as checker_mod +import app.modules.tools.smon as smon_mod @bp.before_request diff --git a/app/routes/config/routes.py b/app/routes/config/routes.py index e7ff93f0..281d9607 100644 --- a/app/routes/config/routes.py +++ b/app/routes/config/routes.py @@ -1,22 +1,18 @@ import os -import sys from flask import render_template, request, redirect, url_for from flask_login import login_required 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 +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.roxy_wi_tools as roxy_wi_tools +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common +import app.modules.config.config as config_mod +import app.modules.config.section as section_mod +import app.modules.service.haproxy as service_haproxy +import app.modules.server.server as server_mod get_config = roxy_wi_tools.GetConfigVar() time_zone = sql.get_setting('time_zone') diff --git a/app/routes/install/routes.py b/app/routes/install/routes.py index cb61feef..def6641d 100644 --- a/app/routes/install/routes.py +++ b/app/routes/install/routes.py @@ -1,21 +1,15 @@ -import os -import sys - from flask import render_template, request, redirect, url_for from flask_login import login_required 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.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 +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common +import app.modules.server.server as server_mod +import app.modules.service.common as service_common +import app.modules.service.installation as service_mod +import app.modules.service.exporter_installation as exp_installation @bp.before_request diff --git a/app/routes/logs/__init__.py b/app/routes/logs/__init__.py new file mode 100644 index 00000000..19a27c7e --- /dev/null +++ b/app/routes/logs/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('logs', __name__) + +from app.routes.logs import routes diff --git a/app/routes/logs/routes.py b/app/routes/logs/routes.py new file mode 100644 index 00000000..cda5a560 --- /dev/null +++ b/app/routes/logs/routes.py @@ -0,0 +1,157 @@ +from flask import render_template, request, redirect, url_for +from flask_login import login_required + +from app.routes.logs import bp +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.logs as roxy_logs +import app.modules.roxywi.common as roxywi_common +import app.modules.server.server as server_mod +import app.modules.roxy_wi_tools as roxy_wi_tools + +get_config = roxy_wi_tools.GetConfigVar() + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/internal') +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' + ) + + +@bp.route('/', defaults={'waf': None}) +@bp.route('//') +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', 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 + ) + + +@bp.route('//', methods=['GET', 'POST']) +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 + ) + + +@bp.route('///', defaults={'waf': '0'}, methods=['GET', 'POST']) +@bp.route('//waf//', defaults={'waf': '1'}, methods=['GET', 'POST']) +def show_logs(service, serv, rows, waf): + if request.method == 'GET': + grep = request.args.get('grep') + exgrep = request.args.get('exgrep') + hour = request.args.get('hour') + minute = request.args.get('minute') + hour1 = request.args.get('hour1') + minute1 = request.args.get('minute1') + log_file = request.args.get('file') + else: + grep = request.form.get('grep') + exgrep = request.form.get('exgrep') + hour = request.form.get('hour') + minute = request.form.get('minute') + hour1 = request.form.get('hour1') + minute1 = request.form.get('minute1') + log_file = request.form.get('file') + + 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 diff --git a/app/routes/main/__init__.py b/app/routes/main/__init__.py new file mode 100644 index 00000000..e83c3520 --- /dev/null +++ b/app/routes/main/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('main', __name__) + +from app.routes.main import routes diff --git a/app/routes/main/routes.py b/app/routes/main/routes.py new file mode 100644 index 00000000..2e89a21c --- /dev/null +++ b/app/routes/main/routes.py @@ -0,0 +1,353 @@ +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 login_manager, cache +from app.routes.main 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.server.server as server_mod +import modules.roxy_wi_tools as roxy_wi_tools +import modules.roxywi.roxy as roxy +import modules.roxywi.auth as roxywi_auth +import modules.roxywi.nettools as nettools +import modules.roxywi.common as roxywi_common +import modules.service.common as service_common +import modules.service.haproxy as service_haproxy + + +@bp.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'))) + + +@bp.errorhandler(404) +def page_not_found(e): + return render_template('404.html'), 404 + + +@bp.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 + + +@bp.after_request +def redirect_to_login(response): + if response.status_code == 401: + return redirect(url_for('login_page') + '?next=' + request.url) + + return response + + +@bp.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_for_flask() + except Exception: + lang = 'en' + + return render_template('login.html', role=role, user=user1, lang=lang) + + +@bp.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 + + +@bp.route('/stats//', defaults={'serv': None}) +@bp.route('/stats//') +@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 + ) + + +@bp.route('/stats/view//') +@login_required +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) + + +@bp.route('/nettools') +@login_required +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', autorefresh=0, role=user_params['role'], user=user, servers=user_params['servers'], + user_services=user_params['user_services'], token=user_params['token'], lang=user_params['lang'] + ) + + +@bp.post('/nettols/') +@login_required +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' + + +@bp.route('/history//') +@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'] + ) + + +@bp.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 + ) + + +@bp.route('/internal/show_version') +@cache.cached() +def show_roxywi_version(): + return render_template('ajax/check_version.html', versions=roxy.versions()) diff --git a/app/routes/metric/routes.py b/app/routes/metric/routes.py index 7677f535..9f0c03bc 100644 --- a/app/routes/metric/routes.py +++ b/app/routes/metric/routes.py @@ -1,20 +1,14 @@ -import os -import sys - import distro from flask import render_template, request, jsonify, redirect, url_for from flask_login import login_required 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 +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.server.server as server_mod +import app.modules.roxywi.metrics as metric +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common @bp.before_request diff --git a/app/routes/overview/__init__.py b/app/routes/overview/__init__.py new file mode 100644 index 00000000..2a4d3fcb --- /dev/null +++ b/app/routes/overview/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('overview', __name__) + +from app.routes.overview import routes diff --git a/app/routes/overview/routes.py b/app/routes/overview/routes.py new file mode 100644 index 00000000..67dd4fa3 --- /dev/null +++ b/app/routes/overview/routes.py @@ -0,0 +1,55 @@ +from flask import render_template, request, redirect, url_for +from flask_login import login_required + +from app import cache +from app.routes.overview import bp +import app.modules.db.sql as sql +from app.modules.db.db_model import * +import app.modules.roxywi.logs as roxy_logs +import app.modules.roxywi.common as roxywi_common +import app.modules.roxywi.overview as roxy_overview + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('/') +@bp.route('/overview') +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'] + ) + + +@bp.route('/overview/services') +def show_services_overview(): + return roxy_overview.show_services_overview() + + +@bp.route('/overview/server/') +def overview_server(server_ip): + return roxy_overview.show_overview(server_ip) + + +@bp.route('/overview/users') +def overview_users(): + return roxy_overview.user_owv() + + +@bp.route('/overview/sub') +@cache.cached() +def overview_sub(): + return roxy_overview.show_sub_ovw() diff --git a/app/routes/portscanner/__init__.py b/app/routes/portscanner/__init__.py new file mode 100644 index 00000000..b818edb4 --- /dev/null +++ b/app/routes/portscanner/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('portscanner', __name__) + +from app.routes.portscanner import routes diff --git a/app/routes/portscanner/routes.py b/app/routes/portscanner/routes.py new file mode 100644 index 00000000..e7d277ec --- /dev/null +++ b/app/routes/portscanner/routes.py @@ -0,0 +1,108 @@ +from flask import render_template, request +from flask_login import login_required + +from app.routes.portscanner import bp +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.server.server as server_mod +import app.modules.roxywi.common as roxywi_common + + +@bp.before_request +@login_required +def before_request(): + """ Protect all of the admin endpoints. """ + pass + + +@bp.route('') +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'] + ) + + +@bp.route('/history/') +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, history=history, + servers=user_params['servers'], 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'] + ) + + +@bp.post('/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' + + +@bp.route('/scan/') +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) + diff --git a/app/routes/runtime/routes.py b/app/routes/runtime/routes.py index f7f49f6c..2b3f0c9b 100644 --- a/app/routes/runtime/routes.py +++ b/app/routes/runtime/routes.py @@ -1,17 +1,11 @@ -import os -import sys - from flask import render_template, request, redirect, url_for from flask_login import login_required from app.routes.runtime import bp - -sys.path.append(os.path.join(sys.path[0], '/var/www/haproxy-wi/app')) - -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 +import app.modules.common.common as common +import app.modules.roxywi.common as roxywi_common +import app.modules.config.runtime as runtime +import app.modules.service.haproxy as service_haproxy @bp.before_request diff --git a/app/routes/server/routes.py b/app/routes/server/routes.py index d200b728..31a91d8b 100644 --- a/app/routes/server/routes.py +++ b/app/routes/server/routes.py @@ -1,5 +1,3 @@ -import os -import sys import json import distro @@ -7,20 +5,16 @@ from flask import render_template, request from flask_login import login_required 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 +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.roxywi.group as group_mod +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common +import app.modules.roxy_wi_tools as roxy_wi_tools +import app.modules.server.ssh as ssh_mod +import app.modules.server.server as server_mod +import app.modules.tools.smon as smon_mod +import app.modules.service.backup as backup_mod get_config = roxy_wi_tools.GetConfigVar() time_zone = sql.get_setting('time_zone') @@ -235,155 +229,6 @@ def update_system_info(server_ip, server_id): 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/') -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//') -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 ' - - -@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//') -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/', methods=['GET', 'POST']) def show_server_services(server_id): roxywi_auth.page_for_admin(level=2) diff --git a/app/routes/service/routes.py b/app/routes/service/routes.py index c1c20f3f..5bff293b 100644 --- a/app/routes/service/routes.py +++ b/app/routes/service/routes.py @@ -1,5 +1,3 @@ -import os -import sys from functools import wraps import distro @@ -8,17 +6,14 @@ from flask_login import login_required from app import 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 +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.server.server as server_mod +import app.modules.service.action as service_action +import app.modules.service.common as service_common +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common +import app.modules.roxywi.overview as roxy_overview def check_services(fn): diff --git a/app/routes/smon/routes.py b/app/routes/smon/routes.py index 61f2d34e..5a3738e4 100644 --- a/app/routes/smon/routes.py +++ b/app/routes/smon/routes.py @@ -1,20 +1,14 @@ -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 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 +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common +import app.modules.tools.smon as smon_mod @bp.before_request diff --git a/app/routes/user/routes.py b/app/routes/user/routes.py index 84e09a8a..027829a8 100644 --- a/app/routes/user/routes.py +++ b/app/routes/user/routes.py @@ -1,19 +1,14 @@ -import os -import sys import json from flask import render_template, request from flask_login import login_required 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 +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.roxywi.user as roxywi_user +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common @bp.before_request diff --git a/app/routes/waf/routes.py b/app/routes/waf/routes.py index ff329c08..aa501081 100644 --- a/app/routes/waf/routes.py +++ b/app/routes/waf/routes.py @@ -1,20 +1,14 @@ -import os -import sys - from flask import render_template, request from flask_login import login_required 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 -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 +import app.modules.db.sql as sql +import app.modules.common.common as common +import app.modules.roxy_wi_tools as roxy_wi_tools +import app.modules.roxywi.waf as roxy_waf +import app.modules.roxywi.auth as roxywi_auth +import app.modules.roxywi.common as roxywi_common +import app.modules.config.config as config_mod get_config = roxy_wi_tools.GetConfigVar() time_zone = sql.get_setting('time_zone') diff --git a/app/templates/ajax/load_services.html b/app/templates/ajax/load_services.html index 0e85a278..ac30308a 100644 --- a/app/templates/ajax/load_services.html +++ b/app/templates/ajax/load_services.html @@ -42,7 +42,7 @@ {% if 'is not installed' in s.3 or not s.3 %} {% if s.0 in ('prometheus', 'grafana-server') %} - {{lang.words.install|title()}} + {{lang.words.install|title()}} {% elif s.0 in ('rabbitmq-server', 'fail2ban') %} {{lang.words.install|title()}} {% else %} @@ -66,7 +66,7 @@ {% endif %} - {{ services_name[s.0]['desc'] }} + {{ services_name[s.0]['desc'] | safe }} {% endfor %} diff --git a/app/templates/ajax/load_updateroxywi.html b/app/templates/ajax/load_updateroxywi.html index 872800ae..bed92a4f 100644 --- a/app/templates/ajax/load_updateroxywi.html +++ b/app/templates/ajax/load_updateroxywi.html @@ -120,7 +120,7 @@ {% endif %} - {{services_name[s.0]['desc']}} + {{services_name[s.0]['desc']|safe}} {% endif %} diff --git a/app/templates/base.html b/app/templates/base.html index f15bd78c..711663aa 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -38,7 +38,6 @@ - diff --git a/app/templates/include/errors.html b/app/templates/include/errors.html index db8b8645..a7bc855f 100644 --- a/app/templates/include/errors.html +++ b/app/templates/include/errors.html @@ -1,4 +1,4 @@
- {{stderr}} - {{error}} -
\ No newline at end of file + {{stderr|safe}} + {{error|safe}} + diff --git a/app/views.py b/app/views.py deleted file mode 100644 index e3c7fe47..00000000 --- a/app/views.py +++ /dev/null @@ -1,463 +0,0 @@ -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_for_flask() - 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//', defaults={'serv': None}) -@app.route('/stats//') -@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/', defaults={'waf': None}) -@app.route('/logs//') -@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//') -@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/inc/users.js b/inc/users.js index a6469929..2670e657 100644 --- a/inc/users.js +++ b/inc/users.js @@ -2554,7 +2554,7 @@ function loadServices() { } function loadupdatehapwi() { $.ajax({ - url: "/app/server/update", + url: "/app/admin/update", // data: { // token: $('#token').val() // },