#!/bin/bash # Скрипт запуска BGP сервера на FRR set -e echo "Starting BGP Server (FRR)..." # Создание директорий если не существуют mkdir -p /app/logs mkdir -p /app/run mkdir -p /app/data mkdir -p /var/run/frr mkdir -p /etc/frr # Установка правильных прав доступа chmod 755 /app/logs chmod 755 /app/run chmod 755 /app/data chmod 755 /var/run/frr chmod 755 /etc/frr # Проверка наличия файлов с префиксами if [ ! -f "/app/data/prefixes.txt" ]; then echo "Warning: /app/data/prefixes.txt not found. Creating empty file." echo "# Default prefixes file" > /app/data/prefixes.txt echo "192.168.1.0/24" >> /app/data/prefixes.txt fi # Создание лог-файлов с правильными правами echo "Creating log files with proper permissions..." touch /app/logs/prefixes.log touch /app/logs/frr.log chmod 666 /app/logs/prefixes.log chmod 666 /app/logs/frr.log echo "Prefixes file content:" cat /app/data/prefixes.txt echo "---" # Проверка прав доступа к файлам echo "Checking file permissions:" ls -la /app/data/ ls -la /app/scripts/ echo "---" # Генерация конфигурации из переменных окружения echo "Generating FRR configuration from environment variables..." echo "Environment variables:" env | grep BGP_ || echo "No BGP_ variables found" echo "---" python3 /app/scripts/generate_config.py # Проверка конфигурации echo "Validating FRR configuration..." echo "Configuration file content:" cat /etc/frr/frr.conf echo "---" # Проверка синтаксиса конфигурации FRR if vtysh -c "show running-config" > /dev/null 2>&1; then echo "FRR configuration validation passed" else echo "FRR configuration validation failed" echo "Full config content:" cat /etc/frr/frr.conf exit 1 fi # Тестовый запуск скрипта загрузки префиксов echo "Testing prefix loader script..." python3 /app/scripts/load_prefixes.py --test 2>&1 || echo "Prefix loader test failed (this is normal)" echo "---" # Проверка сетевого подключения echo "Checking network connectivity..." NEIGHBOR_IP=${BGP_NEIGHBOR_IP:-192.168.1.1} if ping -c 1 $NEIGHBOR_IP > /dev/null 2>&1; then echo "Network connectivity to $NEIGHBOR_IP: OK" else echo "Warning: Cannot reach $NEIGHBOR_IP. BGP session may not establish." fi # Запуск FRR демонов echo "Starting FRR daemons..." # Запуск zebra (обязательный демон для FRR) echo "Starting zebra daemon..." zebra -d -f /etc/frr/frr.conf -A 127.0.0.1 -z /var/run/frr/zebra.api sleep 2 # Запуск bgpd echo "Starting bgpd daemon..." bgpd -d -f /etc/frr/frr.conf -A 127.0.0.1 -z /var/run/frr/zebra.api sleep 2 # Проверка что демоны запустились echo "Checking if FRR daemons are running..." ps aux | grep -E "(zebra|bgpd)" | grep -v grep || echo "No FRR daemons found in ps" # Сохранение PID файлов echo "Saving PID files..." pgrep zebra > /app/logs/zebra.pid 2>/dev/null || echo "zebra PID not found" pgrep bgpd > /app/logs/bgpd.pid 2>/dev/null || echo "bgpd PID not found" # Ожидание запуска sleep 5 # Проверка статуса через vtysh echo "Checking FRR status via vtysh..." if vtysh -c "show version" > /dev/null 2>&1; then echo "FRR started successfully" echo "FRR version:" vtysh -c "show version" 2>/dev/null || echo "Could not get version" echo "BGP neighbors:" vtysh -c "show ip bgp neighbors" 2>/dev/null || echo "Could not get BGP neighbors" echo "BGP summary:" vtysh -c "show ip bgp summary" 2>/dev/null || echo "Could not get BGP summary" else echo "Failed to start FRR. Checking logs:" cat /app/logs/frr.log 2>/dev/null || echo "No FRR logs found" exit 1 fi # Запуск скрипта загрузки префиксов в фоновом режиме echo "Starting prefix loader in background..." python3 /app/scripts/load_prefixes.py > /app/logs/prefixes.log 2>&1 & PREFIX_LOADER_PID=$! echo $PREFIX_LOADER_PID > /app/logs/prefix_loader.pid # Запуск монитора в фоновом режиме echo "Starting monitor in background..." python3 /app/scripts/monitor.py > /app/logs/monitor.log 2>&1 & MONITOR_PID=$! echo $MONITOR_PID > /app/logs/monitor.pid echo "All services started successfully!" echo "Recent logs:" tail -10 /app/logs/prefixes.log 2>/dev/null || echo "No prefix logs yet" echo "---" # Функция для graceful shutdown cleanup() { echo "Received shutdown signal. Cleaning up..." # Остановка скриптов if [ -f "/app/logs/prefix_loader.pid" ]; then kill $(cat /app/logs/prefix_loader.pid) 2>/dev/null || true fi if [ -f "/app/logs/monitor.pid" ]; then kill $(cat /app/logs/monitor.pid) 2>/dev/null || true fi # Отзыв всех префиксов echo "Withdrawing all prefixes..." python3 /app/scripts/load_prefixes.py --withdraw > /dev/null 2>&1 || true # Остановка FRR демонов echo "Stopping FRR daemons..." killall bgpd 2>/dev/null || true killall zebra 2>/dev/null || true echo "Cleanup completed." exit 0 } # Установка обработчиков сигналов trap cleanup SIGTERM SIGINT # Ожидание завершения echo "BGP Server is running. Press Ctrl+C to stop." while true; do sleep 10 # Проверка что демоны все еще работают if ! pgrep zebra > /dev/null; then echo "ERROR: zebra daemon stopped unexpectedly" exit 1 fi if ! pgrep bgpd > /dev/null; then echo "ERROR: bgpd daemon stopped unexpectedly" exit 1 fi done