Files
geoip_block_generator/config.py
Mateusz Gruszczyński 83c3564bd1 more countries
2026-03-05 12:19:22 +01:00

332 lines
11 KiB
Python

"""
Configuration file for GeoIP Ban Generator
"""
import os
from pathlib import Path
# Base paths
BASE_DIR = Path(__file__).parent
STATIC_DIR = BASE_DIR / 'static'
TEMPLATE_DIR = BASE_DIR / 'templates'
GEOIP_DB_DIR = BASE_DIR / 'geoip_db'
# Flask settings
FLASK_HOST = os.getenv('FLASK_HOST', '0.0.0.0')
FLASK_PORT = int(os.getenv('FLASK_PORT', 5000))
FLASK_DEBUG = os.getenv('FLASK_DEBUG', 'False').lower() == 'true'
SECRET_KEY = os.getenv('SECRET_KEY', 'change-me-in-production')
# Application settings
APP_NAME = os.getenv('APP_NAME', 'GeoIP Ban Generator')
APP_VERSION = '1.0.0'
# Logo settings
LOGO_URL = os.getenv('LOGO_URL', '')
LOGO_LINK = os.getenv('LOGO_LINK', '/')
# Footer settings
FOOTER_TEXT = os.getenv('FOOTER_TEXT', '© 2026 GeoIP Ban Generator')
FOOTER_LINK = os.getenv('FOOTER_LINK', '')
FOOTER_LINK_TEXT = os.getenv('FOOTER_LINK_TEXT', 'Documentation')
# MaxMind database settings
MAXMIND_PRIMARY_URL = os.getenv(
'MAXMIND_PRIMARY_URL',
'https://github.com/P3TERX/GeoLite.mmdb/releases/download/2026.02.07/GeoLite2-Country.mmdb'
)
MAXMIND_FALLBACK_URL = os.getenv(
'MAXMIND_FALLBACK_URL',
'https://git.io/GeoLite2-Country.mmdb'
)
MAXMIND_UPDATE_INTERVAL_DAYS = int(os.getenv('MAXMIND_UPDATE_INTERVAL_DAYS', 7))
MAXMIND_AUTO_UPDATE = os.getenv('MAXMIND_AUTO_UPDATE', 'True').lower() == 'true'
# IP range sources
IP_RANGE_SOURCES = {
'github': 'https://raw.githubusercontent.com/herrbischoff/country-ip-blocks/master/ipv4/{country_lower}.cidr',
'ipdeny': 'https://www.ipdeny.com/ipblocks/data/aggregated/{country_lower}-aggregated.zone'
}
# Cache settings
CACHE_ENABLED = os.getenv('CACHE_ENABLED', 'True').lower() == 'true'
CACHE_TTL_SECONDS = int(os.getenv('CACHE_TTL_SECONDS', 3600))
# Static file cache busting
ENABLE_CACHE_BUSTING = True
def get_country_flag(country_code: str) -> str:
"""
Convert ISO 3166-1 alpha-2 country code to flag emoji.
Uses Unicode Regional Indicator Symbols.
Example: 'PL' -> '🇵🇱'
"""
if not country_code or len(country_code) != 2:
return ''
# Convert to uppercase and get Unicode regional indicators
# Regional Indicator Symbol Letter A starts at 0x1F1E6
code = country_code.upper()
return chr(0x1F1E6 + ord(code[0]) - ord('A')) + chr(0x1F1E6 + ord(code[1]) - ord('A'))
# Available countries (ISO 3166-1 alpha-2)
# Focus on high-risk scammer countries and commonly blocked regions
COMMON_COUNTRIES = [
# High-risk Asian countries
{'code': 'CN', 'name': 'China'},
{'code': 'IN', 'name': 'India'},
{'code': 'PK', 'name': 'Pakistan'},
{'code': 'BD', 'name': 'Bangladesh'},
{'code': 'ID', 'name': 'Indonesia'},
{'code': 'PH', 'name': 'Philippines'},
{'code': 'VN', 'name': 'Vietnam'},
{'code': 'TH', 'name': 'Thailand'},
{'code': 'MY', 'name': 'Malaysia'},
{'code': 'SG', 'name': 'Singapore'},
{'code': 'KH', 'name': 'Cambodia'},
{'code': 'MM', 'name': 'Myanmar'},
{'code': 'LA', 'name': 'Laos'},
{'code': 'NP', 'name': 'Nepal'},
{'code': 'LK', 'name': 'Sri Lanka'},
# Middle East
{'code': 'IR', 'name': 'Iran'},
{'code': 'IQ', 'name': 'Iraq'},
{'code': 'SY', 'name': 'Syria'},
{'code': 'YE', 'name': 'Yemen'},
{'code': 'SA', 'name': 'Saudi Arabia'},
{'code': 'AE', 'name': 'United Arab Emirates'},
{'code': 'QA', 'name': 'Qatar'},
{'code': 'KW', 'name': 'Kuwait'},
{'code': 'BH', 'name': 'Bahrain'},
{'code': 'OM', 'name': 'Oman'},
{'code': 'JO', 'name': 'Jordan'},
{'code': 'LB', 'name': 'Lebanon'},
# Africa - West
{'code': 'NG', 'name': 'Nigeria'},
{'code': 'GH', 'name': 'Ghana'},
{'code': 'CI', 'name': 'Ivory Coast'},
{'code': 'SN', 'name': 'Senegal'},
{'code': 'BJ', 'name': 'Benin'},
{'code': 'TG', 'name': 'Togo'},
{'code': 'ML', 'name': 'Mali'},
{'code': 'BF', 'name': 'Burkina Faso'},
{'code': 'NE', 'name': 'Niger'},
{'code': 'LR', 'name': 'Liberia'},
{'code': 'SL', 'name': 'Sierra Leone'},
# Africa - East
{'code': 'KE', 'name': 'Kenya'},
{'code': 'ET', 'name': 'Ethiopia'},
{'code': 'TZ', 'name': 'Tanzania'},
{'code': 'UG', 'name': 'Uganda'},
{'code': 'SO', 'name': 'Somalia'},
{'code': 'SD', 'name': 'Sudan'},
{'code': 'SS', 'name': 'South Sudan'},
{'code': 'ER', 'name': 'Eritrea'},
{'code': 'DJ', 'name': 'Djibouti'},
# Africa - South
{'code': 'ZA', 'name': 'South Africa'},
{'code': 'ZW', 'name': 'Zimbabwe'},
{'code': 'MZ', 'name': 'Mozambique'},
{'code': 'AO', 'name': 'Angola'},
{'code': 'ZM', 'name': 'Zambia'},
{'code': 'MW', 'name': 'Malawi'},
{'code': 'BW', 'name': 'Botswana'},
# Africa - Central
{'code': 'CM', 'name': 'Cameroon'},
{'code': 'CD', 'name': 'DR Congo'},
{'code': 'CG', 'name': 'Congo'},
{'code': 'CF', 'name': 'Central African Republic'},
{'code': 'TD', 'name': 'Chad'},
{'code': 'GA', 'name': 'Gabon'},
# Africa - North
{'code': 'EG', 'name': 'Egypt'},
{'code': 'DZ', 'name': 'Algeria'},
{'code': 'MA', 'name': 'Morocco'},
{'code': 'TN', 'name': 'Tunisia'},
{'code': 'LY', 'name': 'Libya'},
# Eastern Europe
{'code': 'RU', 'name': 'Russia'},
{'code': 'UA', 'name': 'Ukraine'},
{'code': 'BY', 'name': 'Belarus'},
{'code': 'MD', 'name': 'Moldova'},
{'code': 'GE', 'name': 'Georgia'},
{'code': 'AM', 'name': 'Armenia'},
{'code': 'AZ', 'name': 'Azerbaijan'},
{'code': 'KZ', 'name': 'Kazakhstan'},
{'code': 'UZ', 'name': 'Uzbekistan'},
{'code': 'TM', 'name': 'Turkmenistan'},
{'code': 'KG', 'name': 'Kyrgyzstan'},
{'code': 'TJ', 'name': 'Tajikistan'},
# Balkans
{'code': 'RO', 'name': 'Romania'},
{'code': 'BG', 'name': 'Bulgaria'},
{'code': 'AL', 'name': 'Albania'},
{'code': 'RS', 'name': 'Serbia'},
{'code': 'BA', 'name': 'Bosnia and Herzegovina'},
{'code': 'MK', 'name': 'North Macedonia'},
{'code': 'XK', 'name': 'Kosovo'},
{'code': 'ME', 'name': 'Montenegro'},
# Latin America
{'code': 'BR', 'name': 'Brazil'},
{'code': 'MX', 'name': 'Mexico'},
{'code': 'CO', 'name': 'Colombia'},
{'code': 'VE', 'name': 'Venezuela'},
{'code': 'AR', 'name': 'Argentina'},
{'code': 'PE', 'name': 'Peru'},
{'code': 'CL', 'name': 'Chile'},
{'code': 'EC', 'name': 'Ecuador'},
{'code': 'BO', 'name': 'Bolivia'},
{'code': 'PY', 'name': 'Paraguay'},
{'code': 'NI', 'name': 'Nicaragua'},
# Caribbean
{'code': 'CU', 'name': 'Cuba'},
{'code': 'HT', 'name': 'Haiti'},
{'code': 'DO', 'name': 'Dominican Republic'},
{'code': 'JM', 'name': 'Jamaica'},
{'code': 'TT', 'name': 'Trinidad and Tobago'},
{'code': 'UY', 'name': 'Uruguay'},
# Other high-risk
{'code': 'KP', 'name': 'North Korea'},
{'code': 'AF', 'name': 'Afghanistan'},
{'code': 'TR', 'name': 'Turkey'},
# Western countries (for reference/testing)
{'code': 'US', 'name': 'United States'},
{'code': 'GB', 'name': 'United Kingdom'},
{'code': 'DE', 'name': 'Germany'},
{'code': 'FR', 'name': 'France'},
{'code': 'IT', 'name': 'Italy'},
{'code': 'ES', 'name': 'Spain'},
{'code': 'PL', 'name': 'Poland'},
{'code': 'NL', 'name': 'Netherlands'},
{'code': 'BE', 'name': 'Belgium'},
{'code': 'SE', 'name': 'Sweden'},
{'code': 'NO', 'name': 'Norway'},
{'code': 'DK', 'name': 'Denmark'},
{'code': 'FI', 'name': 'Finland'},
{'code': 'CH', 'name': 'Switzerland'},
{'code': 'AT', 'name': 'Austria'},
{'code': 'CA', 'name': 'Canada'},
{'code': 'AU', 'name': 'Australia'},
{'code': 'NZ', 'name': 'New Zealand'},
{'code': 'JP', 'name': 'Japan'},
{'code': 'KR', 'name': 'South Korea'},
# Asia
{'code': 'HK', 'name': 'Hong Kong'},
{'code': 'TW', 'name': 'Taiwan'},
{'code': 'MN', 'name': 'Mongolia'},
# Baltic states
{'code': 'LT', 'name': 'Lithuania'},
{'code': 'LV', 'name': 'Latvia'},
{'code': 'EE', 'name': 'Estonia'},
# Europe
{'code': 'CZ', 'name': 'Czechia'},
{'code': 'SK', 'name': 'Slovakia'},
{'code': 'HU', 'name': 'Hungary'},
{'code': 'GR', 'name': 'Greece'},
{'code': 'IS', 'name': 'Iceland'},
{'code': 'CY', 'name': 'Cyprus'},
{'code': 'MT', 'name': 'Malta'},
{'code': 'LU', 'name': 'Luxembourg'},
{'code': 'IE', 'name': 'Ireland'},
{'code': 'PT', 'name': 'Portugal'},
{'code': 'SI', 'name': 'Slovenia'},
{'code': 'HR', 'name': 'Croatia'},
# Middle East
{'code': 'IL', 'name': 'Israel'},
{'code': 'PS', 'name': 'Palestine'},
# Latin America
{'code': 'CR', 'name': 'Costa Rica'},
{'code': 'PA', 'name': 'Panama'},
{'code': 'BM', 'name': 'Bermuda'},
{'code': 'LC', 'name': 'Saint Lucia'},
{'code': 'MU', 'name': 'Mauritius'},
{'code': 'GD', 'name': 'Grenada'},
{'code': 'BN', 'name': 'Brunei Darussalam'},
{'code': 'RW', 'name': 'Rwanda'},
{'code': 'MG', 'name': 'Madagascar'},
{'code': 'BZ', 'name': 'Belize'},
{'code': 'MR', 'name': 'Mauritania'},
{'code': 'BS', 'name': 'Bahamas'},
{'code': 'SR', 'name': 'Suriname'},
{'code': 'GY', 'name': 'Guyana'},
{'code': 'PR', 'name': 'Puerto Rico'},
{'code': 'GT', 'name': 'Guatemala'},
{'code': 'SV', 'name': 'El Salvador'},
{'code': 'BB', 'name': 'Barbados'},
{'code': 'HN', 'name': 'Honduras'},
{'code': 'SC', 'name': 'Seychelles'},
]
# Sort countries by name
COMMON_COUNTRIES = sorted(COMMON_COUNTRIES, key=lambda x: x['name'])
# Add flags dynamically to countries
for country in COMMON_COUNTRIES:
country['flag'] = get_country_flag(country['code'])
PRECACHE_APP_TYPES = [
'nginx_geo',
'nginx_map',
'nginx_deny',
'apache_24',
'apache_22',
'haproxy_acl',
'haproxy_lua',
'haproxy_map',
'raw-cidr_txt',
'raw-newline_txt',
'raw-json',
'raw-csv',
]
PRECACHE_AGGREGATE_VARIANTS = [True]
# Redis Configuration
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost')
REDIS_PORT = int(os.getenv('REDIS_PORT', '6379'))
REDIS_DB = int(os.getenv('REDIS_DB', '0'))
REDIS_PASSWORD = os.getenv('REDIS_PASSWORD', None)
REDIS_CACHE_TTL = int(os.getenv('REDIS_CACHE_TTL', '86400')) # 24h default
REDIS_ENABLED = os.getenv('REDIS_ENABLED', 'true').lower() == 'true'
CACHE_MAX_AGE_HOURS = 168
# Precache settings
PRECACHE_INTERVAL_HOURS = int(os.getenv('PRECACHE_INTERVAL_HOURS', 168))
PRECACHE_CHECK_INTERVAL = int(os.getenv('PRECACHE_CHECK_INTERVAL', 3600))
PRECACHE_MIN_TTL_HOURS = int(os.getenv('PRECACHE_MIN_TTL_HOURS', 7))
# MaxMind scan chunking
MAXMIND_CHUNK_TASKS_PER_WORKER = int(os.getenv('MAXMIND_CHUNK_TASKS_PER_WORKER', '16'))
MAXMIND_CHUNK_MIN = int(os.getenv('MAXMIND_CHUNK_MIN', '200'))
MAXMIND_CHUNK_MAX = int(os.getenv('MAXMIND_CHUNK_MAX', '4000'))
MAXMIND_WORKERS_MIN = int(os.getenv('MAXMIND_WORKERS_MIN', '6'))
MAXMIND_WORKERS_MAX = int(os.getenv('MAXMIND_WORKERS_MAX', '48'))