- Add exabgp/ container: ExaBGP 5.x + Flask REST API for on-demand BGP route injection into CML IOS-XR lab (AS 65020 via eBGP from AS 65100) - Add 6 injection scenarios: internet_sample, churn, blackhole, anycast, full_table, lab_prefixes - Add inject.py CLI wrapper for the ExaBGP API - Add iosxr_bgp_config.md with IOS-XR neighbor config and NETCONF script - Add obmp-grafana/ dashboards and provisioning (17 dashboards) - Update docker-compose.yml: add exabgp service, fix Kafka external listener IP, extend log retention from 90min to 720min - Add DOCS.md: full project documentation including architecture, setup, user guide, sanity checks, troubleshooting, and command reference - Update .gitignore: exclude .env and .claude/ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
68 lines
1.6 KiB
Bash
68 lines
1.6 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
LOCAL_IP=${EXABGP_LOCAL_IP:-10.40.40.202}
|
|
LOCAL_AS=${EXABGP_LOCAL_AS:-65100}
|
|
PEER_AS=${EXABGP_PEER_AS:-65020}
|
|
PEER_1=${EXABGP_PEER_1:-10.100.0.100}
|
|
PEER_2=${EXABGP_PEER_2:-10.100.0.200}
|
|
API_PORT=${EXABGP_API_PORT:-5050}
|
|
|
|
echo "================================================================"
|
|
echo " ExaBGP Route Injector"
|
|
echo " Local: ${LOCAL_IP} AS${LOCAL_AS}"
|
|
echo " Peers: ${PEER_1}, ${PEER_2} (AS${PEER_AS})"
|
|
echo " API: http://0.0.0.0:${API_PORT}"
|
|
echo "================================================================"
|
|
|
|
# Generate ExaBGP 5.x env file — ExaBGP looks here based on pip install prefix
|
|
mkdir -p /usr/local/etc/exabgp
|
|
exabgp env > /usr/local/etc/exabgp/exabgp.env
|
|
sed -i 's/drop = true/drop = false/' /usr/local/etc/exabgp/exabgp.env
|
|
sed -i 's/cli = true/cli = false/' /usr/local/etc/exabgp/exabgp.env
|
|
sed -i "s/destination = 'stdout'/destination = 'stderr'/" /usr/local/etc/exabgp/exabgp.env
|
|
|
|
# Generate exabgp.conf from environment
|
|
cat > /tmp/exabgp.conf << EOF
|
|
process api {
|
|
run /usr/local/bin/python3 /exabgp/api/server.py;
|
|
encoder text;
|
|
}
|
|
|
|
neighbor ${PEER_1} {
|
|
router-id ${LOCAL_IP};
|
|
local-address ${LOCAL_IP};
|
|
local-as ${LOCAL_AS};
|
|
peer-as ${PEER_AS};
|
|
description "CML-R9K-CORE-01";
|
|
hold-time 90;
|
|
|
|
family {
|
|
ipv4 unicast;
|
|
}
|
|
|
|
api {
|
|
processes [ api ];
|
|
}
|
|
}
|
|
|
|
neighbor ${PEER_2} {
|
|
router-id ${LOCAL_IP};
|
|
local-address ${LOCAL_IP};
|
|
local-as ${LOCAL_AS};
|
|
peer-as ${PEER_AS};
|
|
description "CML-R9K-CORE-02";
|
|
hold-time 90;
|
|
|
|
family {
|
|
ipv4 unicast;
|
|
}
|
|
|
|
api {
|
|
processes [ api ];
|
|
}
|
|
}
|
|
EOF
|
|
|
|
exec exabgp server /tmp/exabgp.conf
|