diff --git a/routes/main_routes.py b/routes/main_routes.py index f3e92e5..42899ca 100644 --- a/routes/main_routes.py +++ b/routes/main_routes.py @@ -1,9 +1,42 @@ -from flask import Blueprint, render_template, request +from flask import Blueprint, render_template, request, flash +import subprocess from auth.auth_middleware import requires_auth from utils.haproxy_config import update_haproxy_config, is_frontend_exist, count_frontends_and_backends main_bp = Blueprint('main', __name__) +def reload_haproxy(): + """Reload HAProxy via supervisorctl""" + try: + result = subprocess.run( + ['/usr/sbin/haproxy', '-f', '/etc/haproxy/haproxy.cfg', '-c'], + capture_output=True, + text=True, + timeout=10 + ) + + if result.returncode != 0: + print(f"[HAPROXY] Config validation failed: {result.stderr}", flush=True) + return False, "Config validation failed" + + result = subprocess.run( + ['/usr/bin/supervisorctl', 'restart', 'haproxy'], + capture_output=True, + text=True, + timeout=10 + ) + + if result.returncode == 0: + print(f"[HAPROXY] Restarted successfully via supervisorctl", flush=True) + return True, "HAProxy restarted successfully" + else: + print(f"[HAPROXY] Restart failed: {result.stderr}", flush=True) + return False, f"Restart failed: {result.stderr}" + + except Exception as e: + print(f"[HAPROXY] Error reloading: {e}", flush=True) + return False, f"Error: {e}" + @main_bp.route('/', methods=['GET', 'POST']) @requires_auth def index(): @@ -35,7 +68,7 @@ def index(): backend_server_ports = request.form.getlist('backend_server_ports[]') backend_server_maxconns = request.form.getlist('backend_server_maxconns[]') - # Custom ACL (NEW) + # Custom ACL add_custom_acl = 'add_custom_acl' in request.form custom_acl_name = request.form.get('custom_acl_name', '').strip() if add_custom_acl else '' custom_acl_type = request.form.get('custom_acl_type', 'path_beg') if add_custom_acl else '' @@ -88,13 +121,12 @@ def index(): ip = backend_server_ips[i] if i < len(backend_server_ips) else '' port = backend_server_ports[i] if i < len(backend_server_ports) else '' maxconn = backend_server_maxconns[i] if i < len(backend_server_maxconns) else None - if ip and port: backend_servers.append((name, ip, port, maxconn)) # Validate frontend existence if is_frontend_exist(frontend_name, frontend_ip, frontend_port): - return render_template('index.html', + return render_template('index.html', message="Frontend or Port already exists. Cannot add duplicate.", message_type="danger") @@ -177,14 +209,23 @@ def index(): custom_acl_redirect_url=custom_acl_redirect_url ) - # Determine message type - message_type = "success" if "successfully" in message else "danger" + # ===== RELOAD HAPROXY ===== + message_type = "success" if "successfully" in message.lower() else "danger" - return render_template('index.html', + if message_type == "success": + reload_ok, reload_msg = reload_haproxy() + if reload_ok: + message = message + " ✓ " + reload_msg + message_type = "success" + else: + message = message + " ⚠ " + reload_msg + message_type = "warning" + + return render_template('index.html', message=message, message_type=message_type) - - # GET request - display stats + + # GET request - display stats frontend_count, backend_count, acl_count, layer7_count, layer4_count = count_frontends_and_backends() return render_template('index.html',