diff --git a/app/__init__.py b/app/__init__.py index 120ec1a4..0df9d4e4 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -11,8 +11,9 @@ 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) -login_manager.login_view = 'app.login.login_page' +login_manager.login_view = 'login_page' app.config['SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS'] = True app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=3) diff --git a/app/login.py b/app/login.py index 5b85dd01..7154ef1c 100644 --- a/app/login.py +++ b/app/login.py @@ -1,5 +1,5 @@ from flask import render_template, request, redirect, url_for, make_response -from flask_login import login_required, logout_user, current_user +from flask_login import login_required, logout_user, current_user, login_url from app import app, login_manager, cache import app.modules.db.sql as sql @@ -10,21 +10,20 @@ import app.modules.roxy_wi_tools as roxy_wi_tools @app.before_request -@cache.memoize(2) def check_login(): if request.endpoint not in ('login_page', 'static', 'main.show_roxywi_version'): try: user_params = roxywi_common.get_users_params() except Exception: - return redirect(url_for('login_page')) + return redirect(login_url('login_page', next_url=request.url)) if not sql.is_user_active(user_params['user_id']): - return redirect(url_for('login_page')) + return redirect(login_url('login_page', next_url=request.url)) try: roxywi_auth.check_login(user_params['user_uuid'], user_params['token']) except Exception: - return redirect(url_for('login_page')) + return redirect(login_url('login_page', next_url=request.url)) @login_manager.user_loader @@ -43,7 +42,7 @@ def load_user(user_id): @app.after_request def redirect_to_login(response): if response.status_code == 401: - return redirect(url_for('login_page') + '?next=' + request.url) + return redirect(login_url('login_page', next_url=request.url)) return response diff --git a/app/modules/roxywi/auth.py b/app/modules/roxywi/auth.py index 2137502c..04a68e79 100644 --- a/app/modules/roxywi/auth.py +++ b/app/modules/roxywi/auth.py @@ -117,12 +117,17 @@ def do_login(user_uuid: str, user_group: str, user: str, next_url: str): except Exception: session_ttl = 5 + if next_url: + redirect_to = f'https://{request.host}{next_url}' + else: + redirect_to = f"https://{request.host}{url_for('overview.index')}" + expires = datetime.utcnow() + timedelta(days=session_ttl) login_user(user) - resp = make_response(next_url or url_for('overview.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_group), secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT")) + resp = make_response(redirect_to) + resp.set_cookie('uuid', user_uuid, secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT"), httponly=True, samesite='Strict') + resp.set_cookie('group', str(user_group), secure=True, expires=expires.strftime("%a, %d %b %Y %H:%M:%S GMT"), httponly=True, samesite='Strict') try: user_group_name = sql.get_group_name_by_id(user_group) diff --git a/app/modules/roxywi/overview.py b/app/modules/roxywi/overview.py index 27efa207..9f39fc0a 100644 --- a/app/modules/roxywi/overview.py +++ b/app/modules/roxywi/overview.py @@ -144,7 +144,7 @@ def show_nginx_connections(server_ip: str) -> str: return 'error: cannot connect to NGINX stat page' -def show_apache_bytes(server_ip: str) -> None: +def show_apache_bytes(server_ip: str) -> str: port = sql.get_setting('apache_stats_port') user = sql.get_setting('apache_stats_user') password = sql.get_setting('apache_stats_password') @@ -221,11 +221,10 @@ def show_services_overview(): socket, stderr = server_mod.subprocess_execute(cmd) 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), - is_checker_worker=is_checker_worker, is_metrics_worker=is_metrics_worker, host=host, + '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), is_checker_worker=is_checker_worker, is_metrics_worker=is_metrics_worker, host=host, roxy_wi_log_id=roxy_logs.roxy_wi_log(log_id=1, file="roxy-wi-"), metrics_log_id=roxy_logs.roxy_wi_log(log_id=1, file="metrics"), checker_log_id=roxy_logs.roxy_wi_log(log_id=1, file="checker"), diff --git a/app/routes/config/routes.py b/app/routes/config/routes.py index ed31ade0..f3d0bf33 100644 --- a/app/routes/config/routes.py +++ b/app/routes/config/routes.py @@ -141,7 +141,7 @@ def config(service, serv, edit, config_file_name, new): config_read = ' ' return render_template( - 'config.html', h2=1, role=user_params['role'], user=user, select_id="serv", serv=serv, aftersave=aftersave, + 'config.html', 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 @@ -164,7 +164,7 @@ def save_config(service, server_ip): if is_redirect != 'ok': return redirect(url_for(f'{is_redirect}')) - config = request.form.get('config') + config_file = request.form.get('config') oldcfg = request.form.get('oldconfig') save = request.form.get('save') config_file_name = request.form.get('config_file_name') @@ -176,7 +176,7 @@ def save_config(service, server_ip): try: with open(cfg, "a") as conf: - conf.write(config) + conf.write(config_file) except IOError as e: return f"error: Cannot read imported config file: {e}", 200 @@ -246,7 +246,7 @@ def versions(service, server_ip): 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, + 'delver.html', 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 ) @@ -335,7 +335,7 @@ def haproxy_section(server_ip): 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.html', 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'] ) @@ -370,10 +370,10 @@ def haproxy_section_show(server_ip, section): 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'] + 'sections.html', 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'] ) @@ -392,21 +392,21 @@ def haproxy_section_save(server_ip): 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') + config_file = 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 = '' + config_file = '' save = 'reload' - config = section_mod.rewrite_section(start_line, end_line, oldcfg, config) + config_file = section_mod.rewrite_section(start_line, end_line, oldcfg, config_file) try: with open(cfg, "w") as conf: - conf.write(config) + conf.write(config_file) except IOError as e: return f"error: Cannot read import config file: {e}" @@ -447,7 +447,7 @@ def show_compare_config(service, serv): 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.html', 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'], diff --git a/app/routes/service/routes.py b/app/routes/service/routes.py index 39677435..d8ec2908 100644 --- a/app/routes/service/routes.py +++ b/app/routes/service/routes.py @@ -79,7 +79,7 @@ def services(service, serv): if distro.id() == 'ubuntu': if s == 'roxy-wi-keep_alive': s = 'roxy-wi-keep-alive' - cmd = "apt list --installed 2>&1 |grep " + s + cmd = f"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) @@ -90,7 +90,6 @@ def services(service, serv): haproxy_sock_port = sql.get_setting('haproxy_sock_port') servers_with_status1 = [] - out1 = '' for s in servers: servers_with_status = list() servers_with_status.append(s[0]) @@ -101,14 +100,14 @@ def services(service, serv): 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"] + "'{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" + "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) @@ -163,7 +162,7 @@ def services(service, serv): 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) + cmd = f'echo "show info" |nc {s[2]} {haproxy_sock_port} -w 1 -v|grep -e "Ver\|Uptime:\|Process_num"' out = server_mod.subprocess_execute(cmd) for k in out: @@ -197,7 +196,7 @@ def services(service, serv): 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, + 'service.html', 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'], @@ -234,7 +233,8 @@ 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')) + sock_port = sql.get_setting('haproxy_sock_port') + cmd = f'echo "show info" |nc {server_ip} {sock_port} -w 1|grep -e "node\|Nbproc\|Maxco\|MB\|Nbthread"' out = server_mod.subprocess_execute(cmd) return_out = "" @@ -263,28 +263,28 @@ def cpu_ram_metrics(server_ip, server_id, name, service): ) -@bp.route('/haproxy/bytes', methods=['POST']) +@bp.post('/haproxy/bytes') 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']) +@bp.post('/nginx/connections') 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']) +@bp.post('/apache/bytes') 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']) +@bp.post('/keepalived/become-master') @cache.cached() def show_keepalived_become_master(): server_ip = common.is_ip_or_dns(request.form.get('keepalivedBecameMaster')) diff --git a/app/templates/ajax/overviewWaf.html b/app/templates/ajax/overviewWaf.html index fd319557..7940cbe6 100644 --- a/app/templates/ajax/overviewWaf.html +++ b/app/templates/ajax/overviewWaf.html @@ -68,14 +68,14 @@ {% endif %}