#!/usr/bin/env python3 """ Скрипт для генерации конфигурации FRR из переменных окружения """ import os import sys from pathlib import Path def get_env_var(name, default): """Получение переменной окружения с значением по умолчанию""" return os.environ.get(name, default) def generate_frr_config(): """Генерация конфигурации FRR""" # Получение настроек из переменных окружения local_as = get_env_var('BGP_LOCAL_AS', '65000') router_id = get_env_var('BGP_ROUTER_ID', '192.168.100.99') neighbor_ip = get_env_var('BGP_NEIGHBOR_IP', '192.168.0.254') neighbor_as = get_env_var('BGP_NEIGHBOR_AS', '65001') hold_time = get_env_var('BGP_HOLD_TIME', '90') keepalive = get_env_var('BGP_KEEPALIVE', '30') log_level = get_env_var('BGP_LOG_LEVEL', 'info') # Конфигурация FRR config = f"""# FRR Configuration File # Generated automatically from environment variables # Глобальные настройки frr version 8.5.2 frr defaults traditional hostname bgp-server log syslog {log_level} service integrated-vtysh-config # Настройки BGP router bgp {local_as} bgp router-id {router_id} bgp log-neighbor-changes neighbor {neighbor_ip} remote-as {neighbor_as} neighbor {neighbor_ip} description RouterOS Client neighbor {neighbor_ip} timers {keepalive} {hold_time} neighbor {neighbor_ip} capability graceful-restart neighbor {neighbor_ip} soft-reconfiguration inbound ! address-family ipv4 unicast neighbor {neighbor_ip} activate neighbor {neighbor_ip} route-map OUTBOUND out neighbor {neighbor_ip} route-map INBOUND in exit-address-family ! # Route maps для фильтрации route-map OUTBOUND permit 10 description Allow all outbound routes ! route-map INBOUND deny 10 description Deny all inbound routes (receive-only mode) ! # Настройки интерфейса interface eth0 ip address {router_id}/24 ! # Статические маршруты (будут добавлены динамически) # ip route 192.168.1.0/24 Null0 """ return config def main(): """Основная функция""" try: # Генерация конфигурации config = generate_frr_config() # Запись в файл config_path = Path('/etc/frr/frr.conf') config_path.parent.mkdir(parents=True, exist_ok=True) with open(config_path, 'w') as f: f.write(config) print(f"FRR configuration generated: {config_path}") print("Configuration content:") print(config) except Exception as e: print(f"Error generating FRR configuration: {e}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": main()