Releases: Exa-Networks/exabgp
ExaBGP 'Back 2 Back' Release
ExaBGP 'Flying Bell' Release
Version 5.0.7
-
Fix: send zero-length capabilities in OPEN message (#1371)
Route Refresh (RFC 2918), Enhanced Route Refresh (RFC 7313), and
Extended Message (RFC 8654) capabilities were silently dropped from
the wire OPEN message despite appearing in debug logs. These are
valid zero-length capabilities that were incorrectly filtered out
by a too-broad check added in PR #1221 (fcf6bb0). -
Fix: do not send empty Hostname capability when hostname is not configured
When hostname was None, HostName.extract() returned an invalid
zero-length payload instead of suppressing the capability entirely.
Also hardens the parser against truncated hostname data from peers. -
Fix: wrap log message in lambda for lazy evaluation
The named pipes error message in server.py triggered a non-callable
log message warning at runtime.
ExaBGP 'Easter Rabbit' Release
Version 5.0.6:
- Feature: add --env-file flag and EXABGP_ENVFILE env var for custom env file (#1367)
The exabgp 5.x CLI had no way to specify a custom exabgp.env file path,
unlike the 4.x --env flag. Two override mechanisms are now available:
exabgp --env-file /path/to/exabgp.env server config.conf
EXABGP_ENVFILE=/path/to/exabgp.env exabgp server config.conf - Fix: show error details when configuration validation fails (#1367)
Validation errors were silently swallowed with exit code 1 and no output.
Now writes errors to stderr with the actual parse error. - Fix: accept wildcard * in healthcheck --neighbor option (#1367)
The --neighbor argument rejected * which is common in 4.x config files.
Adds neighbor_address() validator that accepts * as a wildcard. - Fix: show error on stderr when server can't find config file (#1367)
The server silently exited with code 1 when given a nonexistent config
file. Now writes the error to stderr. - Fix: healthcheck uses per-state as-path instead of ignoring it
The locally-resolved as_path variable (from --up-as-path, --down-as-path,
--disabled-as-path) was computed but never used.
ExaBGP 'Saint Patrick' release
Version 5.0.5:
- Fix: healthcheck --neighbor produced doubled neighbor prefix (#1366)
- Fix: healthcheck crash when --ip-ifname not used (#1365)
- Fix: Align column headers in show neighbor extensive
- Fix: Route Refresh messages sent after new updates instead of before
When flush adj-rib out and a new announce arrived in the same reactor
cycle, the new route UPDATE was sent before the ROUTE_REFRESH start
marker, violating the Enhanced Route Refresh sequence. - Fix: pytest collecting tests from wrong exabgp installation
Added pythonpath to pyproject.toml so tests use local src/.
ExaBGP 'Alpine' release
Version 5.0.4:
- Fix: Flaky test on slow CI runners (Alpine Linux) (#1359)
Race condition in test_connection_lifecycle where client-side TCP
handshake completes before server thread calls accept(). Added
retry loop instead of bare assertion. - Fix: Release script no longer generates debian/changelog
ExaBGP 'Lancastrian' release
Version 5.0.3:
- Fix: CLI hang on failing async commands ASYNC error handler now sends error response when callback fails, preventing the CLI from hanging indefinitely.
- Fix: peer-id field in show neighbor extensive cli_data() now correctly uses peer['peer-id'] instead of peer['router-id'].
- Fix: timedelta formatting error on Python 3.12+ Python 3.12+ timedelta.format rejects alignment specs like :>15. Wrapping in str() before formatting fixes the TypeError.
ExaBGP "A La French" Release
Version 5.0.2:
- Fix: healthcheck (and other subcommands) not working when api.cli is enabled
When exabgp.api.cli is true, the exabgp_cli_pipe environment variable was
inherited by all child processes, causing 'python -m exabgp healthcheck'
to run the CLI pipe code instead of the healthcheck subcommand.
Only the internal CLI process now receives this variable.
ExaBGP 'Never trust 0.0 code' release
ExaBGP 5.0.1
This is a bug fix release addressing issues introduced in 5.0.0.
🚨 Critical Fixes
Container ImportError Fix
- Fix: Container startup failure in 5.0.0 - The 5.0.0 Docker container (ghcr.io/exa-networks/exabgp:5.0.0) failed to start with ImportError: cannot import name 'get_root' from
'exabgp.version' - Added missing get_root() and get_zipapp() functions that were removed during 5.0.0 release but still required by application/version.py
- All exabgp commands (--help, version, etc.) now work correctly
RIB Stability Fixes
- Fix: RIB iterator crash in delete_cached_family() - Modified dictionary during iteration causing RuntimeError on configuration reload
- Fix: RIB iterator safety in cached_changes() - Prevented iterator corruption during concurrent access
- Fix: race condition in RIB updates() generator - Fixed missing/duplicate route updates when API flush commands arrive during peer sending
✨ Testing Improvements
- Added comprehensive RIB stress test suite (tests/unit/test_rib_stress.py) - 18 tests covering critical bugs, race conditions, edge cases, and performance
ExaBGP "Claude" release
Major code release
This is the first stable release of ExaBGP 5.0.
This release is based on the main branch, which has been widely used in production (with some recent changes). Development in main will lead to the creation of version 6.0.0, which already includes significant work to leverage modern Python asynchronous features as well as code annotations with mypy. As these changes are more likely to introduce potential issues, we are releasing 5.0 as a stable version for production use.
This release removes support for Python 3.7 and requires Python 3.8+.
"Nothing much" happened since the latest 4.2.22 release "but":
- 871 commits since 4.2.22
- 920 files changed, 88,481 insertions, 29,566 deletions
- 20+ contributors
- All major changes are documented in the CHANGELOG
🙏 Acknowledgments
Special thanks to:
- All contributors who submitted patches, bug reports, and feature requests
- The BGP community for protocol clarifications
- Early adopters who tested pre-release versions
- Everyone who contributed to documentation and examples
🐛 Known Issues
See the issue tracker for known issues.
Notable TODOs for future releases:
- OriginASN4Number extended community (Type 2,2)
- RouteTargetASN4Number extended community (Type 2,3)
- IP/Range/CIDR class API improvements
📄 License
ExaBGP is licensed under the BSD-3-Clause License.
🔗 Links
- Homepage: https://github.com/Exa-Networks/exabgp
- Documentation: https://github.com/Exa-Networks/exabgp/wiki
- PyPI: https://pypi.org/project/exabgp/
- Docker: https://github.com/Exa-Networks/exabgp/pkgs/container/exabgp
- Issues: https://github.com/Exa-Networks/exabgp/issues
- Discussions: https://github.com/Exa-Networks/exabgp/discussions
💬 Questions?
- GitHub Discussions: https://github.com/Exa-Networks/exabgp/discussions
- Bug Reports: https://github.com/Exa-Networks/exabgp/issues
Full Changelog: 4.2.22...5.0.0
👻 Ghost written by Claude (Anthropic AI)
ExaBGP 'Not a Zen Day' release
This release fixes an issue with doctopt introduced in 4.2.23.
The short option of the command line -1, -s and -x were not understood anymore.