Переписан BGP сервер на FRR
This commit is contained in:
+104
-154
@@ -1,56 +1,24 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт запуска BGP сервера
|
||||
# Скрипт запуска BGP сервера на FRR
|
||||
|
||||
set -e
|
||||
|
||||
echo "Starting BGP Server..."
|
||||
echo "Starting BGP Server (FRR)..."
|
||||
|
||||
# Создание директорий если не существуют
|
||||
mkdir -p /app/logs
|
||||
mkdir -p /app/run
|
||||
mkdir -p /run/exabgp
|
||||
mkdir -p /app/data
|
||||
mkdir -p /var/run/frr
|
||||
mkdir -p /etc/frr
|
||||
|
||||
# Установка правильных прав доступа
|
||||
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
|
||||
chmod 755 /var/run/frr
|
||||
chmod 755 /etc/frr
|
||||
|
||||
# Проверка наличия файлов с префиксами
|
||||
if [ ! -f "/app/data/prefixes.txt" ]; then
|
||||
@@ -62,9 +30,9 @@ fi
|
||||
# Создание лог-файлов с правильными правами
|
||||
echo "Creating log files with proper permissions..."
|
||||
touch /app/logs/prefixes.log
|
||||
touch /app/logs/exabgp.log
|
||||
touch /app/logs/frr.log
|
||||
chmod 666 /app/logs/prefixes.log
|
||||
chmod 666 /app/logs/exabgp.log
|
||||
chmod 666 /app/logs/frr.log
|
||||
|
||||
echo "Prefixes file content:"
|
||||
cat /app/data/prefixes.txt
|
||||
@@ -77,7 +45,7 @@ ls -la /app/scripts/
|
||||
echo "---"
|
||||
|
||||
# Генерация конфигурации из переменных окружения
|
||||
echo "Generating ExaBGP configuration from environment variables..."
|
||||
echo "Generating FRR configuration from environment variables..."
|
||||
echo "Environment variables:"
|
||||
env | grep BGP_ || echo "No BGP_ variables found"
|
||||
echo "---"
|
||||
@@ -85,11 +53,20 @@ echo "---"
|
||||
python3 /app/scripts/generate_config.py
|
||||
|
||||
# Проверка конфигурации
|
||||
echo "Validating ExaBGP configuration..."
|
||||
echo "Validating FRR configuration..."
|
||||
echo "Configuration file content:"
|
||||
cat /app/exabgp.conf
|
||||
cat /etc/frr/frr.conf
|
||||
echo "---"
|
||||
exabgp --validate /app/exabgp.conf
|
||||
|
||||
# Проверка синтаксиса конфигурации 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..."
|
||||
@@ -105,135 +82,108 @@ else
|
||||
echo "Warning: Cannot reach $NEIGHBOR_IP. BGP session may not establish."
|
||||
fi
|
||||
|
||||
# Запуск ExaBGP в фоновом режиме с логированием
|
||||
echo "Starting ExaBGP..."
|
||||
LOG_LEVEL=${BGP_LOG_LEVEL:-INFO}
|
||||
# Запуск FRR демонов
|
||||
echo "Starting FRR daemons..."
|
||||
|
||||
# Дополнительная проверка конфигурационного файла
|
||||
echo "Final config file check:"
|
||||
ls -la /app/exabgp.conf
|
||||
echo "Config file first few lines:"
|
||||
head -10 /app/exabgp.conf
|
||||
echo "---"
|
||||
# Запуск 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
|
||||
|
||||
# Проверка что 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 "---"
|
||||
# Запуск 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 "Environment check:"
|
||||
echo "PWD: $PWD"
|
||||
echo "PATH: $PATH"
|
||||
echo "PYTHONPATH: $PYTHONPATH"
|
||||
echo "BGP_ variables:"
|
||||
env | grep BGP_ || echo "No BGP_ variables found"
|
||||
echo "---"
|
||||
# Проверка что демоны запустились
|
||||
echo "Checking if FRR daemons are running..."
|
||||
ps aux | grep -E "(zebra|bgpd)" | grep -v grep || echo "No FRR daemons found in ps"
|
||||
|
||||
# Запуск 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
|
||||
# Сохранение 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
|
||||
|
||||
# Проверка статуса
|
||||
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
|
||||
# Проверка статуса через 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"
|
||||
|
||||
# Дополнительная проверка через несколько секунд
|
||||
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
|
||||
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 ExaBGP"
|
||||
echo "Full logs:"
|
||||
cat /app/logs/exabgp.log
|
||||
echo "---"
|
||||
echo "Process status:"
|
||||
ps aux | grep exabgp || echo "No exabgp process found"
|
||||
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 "Shutting down BGP server..."
|
||||
if [ -f "/app/logs/exabgp.pid" ]; then
|
||||
kill $(cat /app/logs/exabgp.pid) 2>/dev/null || true
|
||||
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 "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
|
||||
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
|
||||
Reference in New Issue
Block a user