332 lines
11 KiB
Python
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'))
|