84 lines
3.0 KiB
Python
84 lines
3.0 KiB
Python
"""Migration: Import existing HAProxy config to database"""
|
|
|
|
import re
|
|
from database import db
|
|
from database.models import VirtualHost, BackendServer
|
|
|
|
def parse_existing_haproxy_config(config_path):
|
|
"""Parse existing haproxy.cfg and import to DB"""
|
|
try:
|
|
with open(config_path, 'r') as f:
|
|
config_content = f.read()
|
|
|
|
print(f"[MIGRATION] Parsing {config_path}...")
|
|
|
|
# Pattern: frontend FNAME ...
|
|
frontend_pattern = r'frontend\s+(\S+)\s*\n(.*?)(?=\n\nbackend|\Z)'
|
|
frontends = re.findall(frontend_pattern, config_content, re.DOTALL)
|
|
|
|
vhost_count = 0
|
|
for fe_name, fe_content in frontends:
|
|
# Skip stats frontend
|
|
if 'stats' in fe_name.lower():
|
|
continue
|
|
|
|
# Extract bind
|
|
bind_match = re.search(r'bind\s+([^\s:]+):(\d+)', fe_content)
|
|
if not bind_match:
|
|
continue
|
|
|
|
ip, port = bind_match.groups()
|
|
|
|
# Extract backend name
|
|
backend_match = re.search(r'default_backend\s+(\S+)', fe_content)
|
|
backend_name = backend_match.group(1) if backend_match else f'be_{fe_name}'
|
|
|
|
# Check if already exists
|
|
vhost = VirtualHost.query.filter_by(name=fe_name).first()
|
|
if vhost:
|
|
print(f"[MIGRATION] Vhost '{fe_name}' already exists, skipping...")
|
|
continue
|
|
|
|
# Create vhost
|
|
vhost = VirtualHost(
|
|
name=fe_name,
|
|
hostname=f"{fe_name}.local",
|
|
frontend_ip=ip,
|
|
frontend_port=int(port),
|
|
protocol='http',
|
|
use_ssl='ssl' in fe_content,
|
|
enabled=True
|
|
)
|
|
|
|
db.session.add(vhost)
|
|
db.session.flush() # Get vhost.id
|
|
|
|
# Parse backend servers
|
|
be_pattern = rf'backend\s+{re.escape(backend_name)}\s*\n(.*?)(?=\nbackend|\Z)'
|
|
be_match = re.search(be_pattern, config_content, re.DOTALL)
|
|
|
|
if be_match:
|
|
servers_pattern = r'server\s+(\S+)\s+([^\s:]+):(\d+)'
|
|
servers = re.findall(servers_pattern, be_match.group(1))
|
|
|
|
for srv_name, srv_ip, srv_port in servers:
|
|
server = BackendServer(
|
|
vhost_id=vhost.id,
|
|
name=srv_name,
|
|
ip_address=srv_ip,
|
|
port=int(srv_port),
|
|
enabled=True
|
|
)
|
|
db.session.add(server)
|
|
|
|
vhost_count += 1
|
|
|
|
db.session.commit()
|
|
print(f"[MIGRATION] Successfully imported {vhost_count} vhosts!", flush=True)
|
|
return vhost_count
|
|
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
print(f"[MIGRATION] Error: {e}", flush=True)
|
|
return 0
|