Enhance ExaBGP configuration and scripts by adding environment variable support for neighbor IP, local AS, and router ID. Update Dockerfile to include permissions for the new generate_config.py script. Improve start.sh to generate configuration dynamically and display relevant information during startup.
Build and Push Docker Image / build (push) Successful in 3m34s
Build and Push Docker Image / build (push) Successful in 3m34s
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Скрипт для генерации конфигурации ExaBGP из переменных окружения
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
def get_env_var(name: str, default: str) -> str:
|
||||
"""Получение переменной окружения с значением по умолчанию"""
|
||||
return os.environ.get(name, default)
|
||||
|
||||
def generate_exabgp_config():
|
||||
"""Генерация конфигурации ExaBGP"""
|
||||
|
||||
# Получение переменных окружения
|
||||
local_as = get_env_var('BGP_LOCAL_AS', '65000')
|
||||
router_id = get_env_var('BGP_ROUTER_ID', '192.168.1.100')
|
||||
neighbor_ip = get_env_var('BGP_NEIGHBOR_IP', '192.168.1.1')
|
||||
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')
|
||||
md5_password = get_env_var('BGP_MD5_PASSWORD', '')
|
||||
|
||||
# Генерация конфигурации
|
||||
config = f"""# Автоматически сгенерированная конфигурация ExaBGP
|
||||
process load-prefixes {{
|
||||
run /app/scripts/load_prefixes.py;
|
||||
encoder json;
|
||||
}}
|
||||
|
||||
# Настройки CLI
|
||||
cli {{
|
||||
in /run/exabgp/exabgp.in;
|
||||
out /run/exabgp/exabgp.out;
|
||||
}}
|
||||
|
||||
# Настройки BGP
|
||||
neighbor {neighbor_ip} {{
|
||||
router-id {router_id};
|
||||
local-address {router_id};
|
||||
local-as {local_as};
|
||||
peer-as {neighbor_as};
|
||||
|
||||
# Только исходящие анонсы (не принимаем префиксы)
|
||||
capability {{
|
||||
graceful-restart;
|
||||
}}
|
||||
|
||||
# Настройки сессии
|
||||
hold-time {hold_time};
|
||||
"""
|
||||
|
||||
# Добавление MD5 пароля если указан
|
||||
if md5_password:
|
||||
config += f" md5-password \"{md5_password}\";\n"
|
||||
|
||||
config += f"""
|
||||
# Логирование
|
||||
api {{
|
||||
processes [load-prefixes];
|
||||
neighbor-changes;
|
||||
receive {{
|
||||
parsed;
|
||||
update;
|
||||
}}
|
||||
send {{
|
||||
parsed;
|
||||
update;
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
|
||||
# Глобальные настройки логирования
|
||||
log {{
|
||||
destination /app/logs/exabgp.log;
|
||||
level INFO;
|
||||
}}
|
||||
"""
|
||||
|
||||
return config
|
||||
|
||||
def main():
|
||||
"""Основная функция"""
|
||||
if len(sys.argv) > 1 and sys.argv[1] == '--print':
|
||||
# Вывод конфигурации в stdout
|
||||
print(generate_exabgp_config())
|
||||
else:
|
||||
# Запись конфигурации в файл
|
||||
config = generate_exabgp_config()
|
||||
with open('/app/exabgp.conf', 'w') as f:
|
||||
f.write(config)
|
||||
print("Configuration generated successfully")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -78,18 +78,23 @@ def load_all_prefixes() -> Set[str]:
|
||||
|
||||
def announce_prefixes(prefixes: Set[str]):
|
||||
"""Анонсирование префиксов через ExaBGP API"""
|
||||
# Получение настроек из переменных окружения
|
||||
neighbor_ip = os.environ.get('BGP_NEIGHBOR_IP', '192.168.1.1')
|
||||
local_as = int(os.environ.get('BGP_LOCAL_AS', '65000'))
|
||||
router_id = os.environ.get('BGP_ROUTER_ID', '192.168.1.100')
|
||||
|
||||
for prefix in sorted(prefixes):
|
||||
# Формат команды для ExaBGP
|
||||
command = {
|
||||
"command": "announce route",
|
||||
"neighbor": {
|
||||
"ip": "192.168.1.1",
|
||||
"ip": neighbor_ip,
|
||||
"description": "RouterOS peer"
|
||||
},
|
||||
"attribute": {
|
||||
"origin": "igp",
|
||||
"as-path": [65000],
|
||||
"next-hop": "192.168.1.100"
|
||||
"as-path": [local_as],
|
||||
"next-hop": router_id
|
||||
},
|
||||
"nlri": prefix
|
||||
}
|
||||
@@ -100,11 +105,14 @@ def announce_prefixes(prefixes: Set[str]):
|
||||
|
||||
def withdraw_prefixes(prefixes: Set[str]):
|
||||
"""Отзыв префиксов через ExaBGP API"""
|
||||
# Получение настроек из переменных окружения
|
||||
neighbor_ip = os.environ.get('BGP_NEIGHBOR_IP', '192.168.1.1')
|
||||
|
||||
for prefix in sorted(prefixes):
|
||||
command = {
|
||||
"command": "withdraw route",
|
||||
"neighbor": {
|
||||
"ip": "192.168.1.1",
|
||||
"ip": neighbor_ip,
|
||||
"description": "RouterOS peer"
|
||||
},
|
||||
"nlri": prefix
|
||||
|
||||
@@ -10,6 +10,7 @@ echo "Starting BGP Server..."
|
||||
mkdir -p /app/logs
|
||||
mkdir -p /app/run
|
||||
mkdir -p /run/exabgp
|
||||
mkdir -p /app/data
|
||||
|
||||
# Создание named pipes для CLI в стандартном месте
|
||||
if [ ! -p "/run/exabgp/exabgp.in" ] || [ ! -p "/run/exabgp/exabgp.out" ]; then
|
||||
@@ -32,8 +33,19 @@ if [ ! -f "/app/data/prefixes.txt" ]; then
|
||||
echo "192.168.1.0/24" >> /app/data/prefixes.txt
|
||||
fi
|
||||
|
||||
echo "Prefixes file content:"
|
||||
cat /app/data/prefixes.txt
|
||||
echo "---"
|
||||
|
||||
# Генерация конфигурации из переменных окружения
|
||||
echo "Generating ExaBGP configuration from environment variables..."
|
||||
python3 /app/scripts/generate_config.py
|
||||
|
||||
# Проверка конфигурации
|
||||
echo "Validating ExaBGP configuration..."
|
||||
echo "Configuration file content:"
|
||||
cat /app/exabgp.conf
|
||||
echo "---"
|
||||
exabgp --validate /app/exabgp.conf
|
||||
|
||||
# Запуск ExaBGP в фоновом режиме
|
||||
|
||||
Reference in New Issue
Block a user