from flask import Blueprint, render_template, request import subprocess from auth.auth_middleware import requires_auth # Updated import 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 = "" # Try supervisor first (Docker) try: supervisor_result = subprocess.run(['supervisorctl', 'restart', 'haproxy'], capture_output=True, text=True, timeout=5) if supervisor_result.returncode == 0: reload_output = f"\n\n✓ HAProxy Restarted via Supervisor:\n{supervisor_result.stdout}" reload_success = True except Exception as e: reload_output += f"\nSupervisor restart failed: {e}" # If supervisor failed, try systemctl (Linux) if not reload_success: try: systemctl_result = subprocess.run(['systemctl', 'restart', 'haproxy'], capture_output=True, text=True, timeout=5) if systemctl_result.returncode == 0: reload_output = f"\n\n✓ HAProxy Restarted via Systemctl:\n{systemctl_result.stdout}" reload_success = True else: reload_output += f"\nSystemctl restart error: {systemctl_result.stderr}" except Exception as e: reload_output += f"\nSystemctl restart failed: {e}" if reload_success: check_output += reload_output else: check_output += f"\n\n⚠ Warning: Could not restart HAProxy.\nConfig is valid but reload failed.\nPlease restart manually or check supervisor/systemd status." 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)