189 lines
5.8 KiB
Bash
189 lines
5.8 KiB
Bash
#!/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 |