Files
haproxy-dashboard/routes/edit_routes.py
Mateusz Gruszczyński 1502ea3ff6 supervisord
2025-11-01 20:39:46 +01:00

110 lines
6.0 KiB
Python

from flask import Blueprint, render_template, request
import subprocess
from auth.auth_middleware import requires_auth
edit_bp = Blueprint('edit', __name__)
@edit_bp.route('/edit', methods=['GET', 'POST'])
@requires_auth
def edit_haproxy_config():
if request.method == 'POST':
edited_config = request.form['haproxy_config']
# Save the edited config to the haproxy.cfg file
with open('/etc/haproxy/haproxy.cfg', 'w') as f:
f.write(edited_config)
check_output = ""
if 'save_check' in request.form:
# Run haproxy -c -V -f to check the configuration
check_result = subprocess.run(['haproxy', '-c', '-V', '-f', '/etc/haproxy/haproxy.cfg'], capture_output=True, text=True)
check_output = check_result.stdout
# Check if there was an error, and if so, append it to the output
if check_result.returncode != 0:
error_message = check_result.stderr
check_output += f"\n\nError occurred:\n{error_message}"
elif 'save_reload' in request.form:
# Run haproxy -c -V -f to check the configuration
check_result = subprocess.run(['haproxy', '-c', '-V', '-f', '/etc/haproxy/haproxy.cfg'], capture_output=True, text=True)
check_output = check_result.stdout
# Check if there was an error, and if so, append it to the output
if check_result.returncode != 0:
error_message = check_result.stderr
check_output += f"\n\nError occurred:\n{error_message}"
else:
# Try to reload HAProxy - support both Docker (supervisor) and systemd
reload_success = False
reload_output = ""
# Method 1: Supervisor with sudo (Docker)
try:
supervisor_result = subprocess.run(['sudo', 'supervisorctl', 'restart', 'haproxy'], capture_output=True, text=True, timeout=10)
if supervisor_result.returncode == 0:
reload_output = f"\n\n✓ HAProxy Restarted via Supervisor:\n{supervisor_result.stdout}"
reload_success = True
print(f"[HAPROXY] Supervisor restart successful", flush=True)
except Exception as e:
print(f"[HAPROXY] Supervisor restart failed: {e}", flush=True)
# Method 2: Direct supervisorctl without sudo (Docker)
if not reload_success:
try:
supervisor_result = subprocess.run(['supervisorctl', 'restart', 'haproxy'], capture_output=True, text=True, timeout=10)
if supervisor_result.returncode == 0:
reload_output = f"\n\n✓ HAProxy Restarted via Supervisor:\n{supervisor_result.stdout}"
reload_success = True
print(f"[HAPROXY] Supervisor restart successful", flush=True)
else:
print(f"[HAPROXY] Supervisor failed: {supervisor_result.stderr}", flush=True)
except Exception as e:
print(f"[HAPROXY] Supervisor failed: {e}", flush=True)
# Method 3: Systemctl with sudo (Linux)
if not reload_success:
try:
systemctl_result = subprocess.run(['sudo', 'systemctl', 'restart', 'haproxy'], capture_output=True, text=True, timeout=10)
if systemctl_result.returncode == 0:
reload_output = f"\n\n✓ HAProxy Restarted via Systemctl:\n{systemctl_result.stdout}"
reload_success = True
print(f"[HAPROXY] Systemctl restart successful", flush=True)
else:
print(f"[HAPROXY] Systemctl failed: {systemctl_result.stderr}", flush=True)
except Exception as e:
print(f"[HAPROXY] Systemctl failed: {e}", flush=True)
# Method 4: Direct systemctl without sudo (Linux)
if not reload_success:
try:
systemctl_result = subprocess.run(['systemctl', 'restart', 'haproxy'], capture_output=True, text=True, timeout=10)
if systemctl_result.returncode == 0:
reload_output = f"\n\n✓ HAProxy Restarted via Systemctl:\n{systemctl_result.stdout}"
reload_success = True
print(f"[HAPROXY] Systemctl restart successful", flush=True)
else:
print(f"[HAPROXY] Systemctl failed: {systemctl_result.stderr}", flush=True)
except Exception as e:
print(f"[HAPROXY] Systemctl failed: {e}", flush=True)
if reload_success:
check_output += reload_output
else:
check_output += f"\n\n⚠ Warning: Could not restart HAProxy.\nConfig is valid but reload failed.\n\nTroubleshooting:\n1. Check if supervisord/systemd is running\n2. Verify haproxy program is defined in supervisor\n3. Check Docker logs: docker-compose logs\n4. Manual restart: docker-compose exec <container> supervisorctl restart haproxy"
return render_template('edit.html', config_content=edited_config, check_output=check_output)
# GET request - Read the current contents of haproxy.cfg
try:
with open('/etc/haproxy/haproxy.cfg', 'r') as f:
config_content = f.read()
except FileNotFoundError:
config_content = "# HAProxy configuration file not found\n# Please create /etc/haproxy/haproxy.cfg"
except PermissionError:
config_content = "# Permission denied reading HAProxy configuration file"
return render_template('edit.html', config_content=config_content)