95 lines
2.9 KiB
Python
95 lines
2.9 KiB
Python
#!/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() |