#!/bin/bash # Скрипт запуска BGP сервера set -e echo "Starting BGP Server..." # Создание директорий если не существуют mkdir -p /app/logs mkdir -p /app/run mkdir -p /run/exabgp mkdir -p /app/data # Установка правильных прав доступа chmod 755 /app/logs chmod 755 /app/run chmod 755 /run/exabgp chmod 755 /app/data # Удаление старых named pipes если они существуют echo "Cleaning up old named pipes..." for dir in /run/exabgp /var/run/exabgp /usr/local/run/exabgp /usr/local/var/run/exabgp; do if [ -d "$dir" ]; then echo "Cleaning $dir..." rm -f $dir/exabgp.in $dir/exabgp.out rmdir $dir 2>/dev/null || true fi done # Создание named pipes для CLI в стандартном месте echo "Creating named pipes for ExaBGP CLI..." for dir in /run/exabgp /var/run/exabgp /usr/local/run/exabgp /usr/local/var/run/exabgp; do mkdir -p $dir echo "Creating named pipes in $dir..." # Проверяем, существуют ли уже named pipes if [ ! -p "$dir/exabgp.in" ]; then mkfifo $dir/exabgp.in chmod 666 $dir/exabgp.in echo "Created $dir/exabgp.in" else echo "Named pipe $dir/exabgp.in already exists" fi if [ ! -p "$dir/exabgp.out" ]; then mkfifo $dir/exabgp.out chmod 666 $dir/exabgp.out echo "Created $dir/exabgp.out" else echo "Named pipe $dir/exabgp.out already exists" fi done # Проверка наличия файлов с префиксами 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/exabgp.log chmod 666 /app/logs/prefixes.log chmod 666 /app/logs/exabgp.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 ExaBGP configuration from environment variables..." echo "Environment variables:" env | grep BGP_ || echo "No BGP_ variables found" echo "---" python3 /app/scripts/generate_config.py # Проверка конфигурации echo "Validating ExaBGP configuration..." echo "Configuration file content:" cat /app/exabgp.conf echo "---" exabgp --validate /app/exabgp.conf # Тестовый запуск скрипта загрузки префиксов 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 # Запуск ExaBGP в фоновом режиме с логированием echo "Starting ExaBGP..." LOG_LEVEL=${BGP_LOG_LEVEL:-INFO} # Дополнительная проверка конфигурационного файла echo "Final config file check:" ls -la /app/exabgp.conf echo "Config file first few lines:" head -10 /app/exabgp.conf echo "---" # Проверка что ExaBGP может прочитать файл echo "Testing ExaBGP config validation:" if exabgp --validate /app/exabgp.conf; then echo "Configuration validation passed" else echo "Configuration validation failed" echo "Full config content:" cat /app/exabgp.conf exit 1 fi echo "---" # Проверка переменных окружения и путей echo "Environment check:" echo "PWD: $PWD" echo "PATH: $PATH" echo "PYTHONPATH: $PYTHONPATH" echo "BGP_ variables:" env | grep BGP_ || echo "No BGP_ variables found" echo "---" # Запуск ExaBGP echo "Starting ExaBGP with config: /app/exabgp.conf" # Проверяем что файл существует и читается if [ ! -f "/app/exabgp.conf" ]; then echo "ERROR: Configuration file /app/exabgp.conf not found!" exit 1 fi if [ ! -r "/app/exabgp.conf" ]; then echo "ERROR: Configuration file /app/exabgp.conf is not readable!" exit 1 fi # Запуск ExaBGP с правильными параметрами cd /app echo "Starting ExaBGP in background..." # Запуск ExaBGP в фоновом режиме if [ -n "$LOG_LEVEL" ]; then nohup exabgp --log.level $LOG_LEVEL /app/exabgp.conf > /app/logs/exabgp.log 2>&1 & else nohup exabgp /app/exabgp.conf > /app/logs/exabgp.log 2>&1 & fi EXABGP_PID=$! # Проверяем что процесс запустился sleep 5 echo "Checking if ExaBGP process is running..." ps aux | grep exabgp | grep -v grep || echo "No exabgp process found in ps" if ! kill -0 $EXABGP_PID 2>/dev/null; then echo "Failed to start ExaBGP. Checking logs:" cat /app/logs/exabgp.log echo "Trying to run ExaBGP directly for diagnosis:" exabgp --version echo "---" echo "Direct execution test:" timeout 10 exabgp /app/exabgp.conf || echo "Direct execution completed" exit 1 fi # Сохранение PID echo $EXABGP_PID > /app/logs/exabgp.pid # Ожидание запуска sleep 5 # Проверка статуса if kill -0 $EXABGP_PID 2>/dev/null; then echo "ExaBGP started successfully with PID: $EXABGP_PID" echo "Recent logs:" tail -10 /app/logs/exabgp.log # Дополнительная проверка через несколько секунд sleep 3 if kill -0 $EXABGP_PID 2>/dev/null; then echo "ExaBGP is still running after 3 seconds" echo "Process details:" ps aux | grep exabgp | grep -v grep || echo "Process not found in ps output" else echo "ExaBGP process died after startup" echo "Full logs:" cat /app/logs/exabgp.log exit 1 fi else echo "Failed to start ExaBGP" echo "Full logs:" cat /app/logs/exabgp.log echo "---" echo "Process status:" ps aux | grep exabgp || echo "No exabgp process found" exit 1 fi # Функция для graceful shutdown cleanup() { echo "Shutting down BGP server..." if [ -f "/app/logs/exabgp.pid" ]; then kill $(cat /app/logs/exabgp.pid) 2>/dev/null || true fi exit 0 } # Обработка сигналов trap cleanup SIGTERM SIGINT # Ожидание завершения echo "Waiting for ExaBGP to run..." echo "Process status:" ps aux | grep exabgp || echo "No exabgp process found" echo "---" # Проверка процесса загрузки префиксов echo "Checking prefix loader process:" ps aux | grep load_prefixes || echo "No prefix loader process found" echo "---" wait $EXABGP_PID