haproxy map

This commit is contained in:
Mateusz Gruszczyński
2026-02-23 13:10:16 +01:00
parent d82926a4d1
commit bf02af0192
7 changed files with 348 additions and 142 deletions

View File

@@ -874,7 +874,7 @@ class ConfigGenerator:
config += "}\n"
# Log conversion statistics
print(f"[INFO] Generated nginx map: {converted_count} regex patterns", flush=True)
#print(f"[INFO] Generated nginx map: {converted_count} regex patterns", flush=True)
if failed_count > 0:
print(f"[WARNING] Failed to convert {failed_count} networks to regex - check config file", flush=True)
@@ -1143,7 +1143,69 @@ class ConfigGenerator:
default_backend servers
"""
return config
@staticmethod
def generate_haproxy_map(country_networks: dict, aggregate: bool = True, redis_ips: set = None) -> str:
"""
Generate HAProxy MAP file (IP COUNTRY format)
"""
countries = sorted(country_networks.keys())
redisstats = None
if redis_ips:
redisstats = {"total": len(redis_ips), "unique": len(redis_ips), "deduped": 0}
handler = GeoIPHandler()
metadata = generate_metadata(countries, country_networks, redisstats, handler)
# Aggregate networks
all_networks = []
for networks in country_networks.values():
all_networks.extend(networks)
if redis_ips:
all_networks.extend(redis_ips)
if aggregate:
all_networks = ConfigGenerator._aggregate_networks(all_networks)
else:
all_networks = sorted(list(set(all_networks)))
# Generate header
config = "# " + "="*77 + "\n"
config += "# HAProxy MAP Configuration\n"
config += f"# Generated: {metadata['timestamp']}\n"
config += "# " + "="*77 + "\n"
config += "# \n"
config += f"# Countries: {metadata['countries_string']} ({metadata['country_count']} countries)\n"
config += f"# Total networks: {len(all_networks):,}\n"
config += "# \n"
config += "# Data sources:\n"
config += metadata['sources_formatted'] + "\n"
config += "# \n"
if metadata['redis']:
config += f"# {metadata['redis']['formatted']}\n"
config += "# \n"
config += "# Cache settings:\n"
config += f"# Max age: {metadata['cache_max_age_hours']} hours ({metadata['cache_max_age_days']:.1f} days)\n"
config += f"# Database: {metadata['cache_db_path']}\n"
config += "# \n"
config += "# Usage in HAProxy:\n"
config += "# acl banned_ips src -f /path/to/this_file.acl\n"
config += "# http-request deny if banned_ips\n"
config += "# \n"
config += "# " + "="*77 + "\n"
config += "\n"
# MAP BODY
for network in all_networks:
country = next((c for c, nets in country_networks.items() if network in nets), 'XX')
config += f"{network} {country}\n"
return config
@staticmethod
def generate_haproxy_lua(country_networks: dict, aggregate: bool = True, redis_ips: set = None) -> str:
"""Generate HAProxy Lua script with detailed metadata header"""
@@ -1283,7 +1345,6 @@ class ConfigGenerator:
return config
@staticmethod
def generate_csv(country_networks: dict, aggregate: bool = True, redis_ips: set = None) -> str:
"""Generate CSV format with detailed metadata header"""