All notable changes to ExaFS will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.3.0 - 2026-04-20
- Migrated entire codebase to SQLAlchemy 2.0 Query API — replaced all legacy
session.query()/Model.querypatterns withsession.execute(select()),session.scalars(), anddb.paginate()across models, services, and views - Moved DB queries out of views into model classmethods following separation of concerns (
ApiKey,Flowspec4/6,RTBH,Community,Action,Log,User,Role,Organization,ASPath, etc.) - New
get_org_rule_stats()utility replaces inline admin view queries
- API response discrepancy: rules returned via API now apply the same data transformation as the UI, fixing inconsistency between
/api/v3/responses and dashboard display
- Extensive new test coverage for previously untested DB-touching code paths (
test_auth.py,test_model_utils.py,test_services_base.py,test_admin_models.py, additions totest_flowapp.py,test_messages.py,test_models.py,test_whitelist_service.py) - Tests for all new model classmethods (added before implementation, TDD-style)
- ExaBGP 5.x support via
EXABGP_MAJOR_VERSIONconfig option (default:4)- TCP flags formatted as
tcp-flags [ syn ack ];(lowercase, bracketed) when version is 5 - Fragment conditions use updated
!is-fragmentsyntax for version 5 IPV4_FRAGMENT_V5constants dict added for version 5 fragment mappings
- TCP flags formatted as
- Unit tests for ExaBGP message formatting helpers (
tests/test_messages.py)
1.2.2 - 2026-02-19
- Database migrations now tracked in git —
migrations/removed from.gitignore - Replaced
db-init.pywith migration-based initialization (flask db upgrade) - Removed one-time
/admin/set-org-if-zeroendpoint, replaced with standalonescripts/migrate_v0x_to_v1.py - Fixed Flask-SQLAlchemy deprecation warning in Alembic
env.py - Template URLs changed to use
url_forhelper, removed unusedrule.htmltemplate db-init.pyandcreate-admin.pymoved toscripts/— all setup scripts now live underscripts/
- Idempotent baseline migration (
001_baseline) that brings any ExaFS database (from v0.4+ to current) to the v1.2.2 schema - Optional
scripts/migrate_v0x_to_v1.pyhelper for v0.x to v1.0+ data migration (org_id backfill) scripts/create-admin.py— interactive script to create the first admin user and organization (replaces manual SQL inserts)scripts/db-init.py --resetflag for development database reset- Migration test suite (
tests/test_migration.py) — 46 tests covering fresh install, idempotency, upgrade from v0.4/v0.8/v1.0 schemas, and real 2019 production backup upgrade PYTHONPATHset in Docker dev container for easier development
1.2.1 - 2026-01-30
- Fixed nested
<form>elements in dashboard tables causing delete button to fail on the first row - Delete actions reverted from POST forms to GET links with CSRF token passed as URL query parameter
- CSRF protection preserved via manual
validate_csrfcheck in delete endpoints
1.2.0 - 2026-01-29
- Changed delete operations from GET to POST requests to prevent CSRF attacks
- Fixed possible wrong behavior of
admin_or_user_requiredauth decorator - Fixed wrong session key in
rules.pyis_adminfunction
- GRE protocol support
- AS Paths added to admin menu
- Tests moved outside
flowapppackage - Updated documentation schema
1.1.9 - 2025-11-18
- bugfix for #74 new RTBH records can be created in wrong state
1.1.8 - 2025-10-20
- check all for group edit / delete
- pagination for Expired and All Dashboard cards
- search form quick clear by button or ESC key
- improved search to work with paginated data
1.1.7 - 2025-10-16
- Fixed config loading to use Flask instance folder
- Resolves path issues when package is installed via pip
1.1.6 - 2025-10-08
- Fixed problem with session overflow on too many rules id
- Updated
withdraw_expiredmethod to also delete expired rules - Expiration threshold can now be set in config (default: 30 days)
- New auth helpers to determine which rules a user can modify
- Functions
get_user_allowed_rule_idsandcheck_user_can_modify_rulein auth module EXPIRATION_THRESHOLDconfig option- PyPi package published
- Docker base image published
- updated docs
1.1.5 - 2025-10-06
- Introduced instance config override
- Copy the sample to
instance_config_override.pyto customize dashboard menu items easily
- For normal installations, no override is needed
- Changed
MAX_COMMA_VALUESconstant to 5 as default value
1.1.4 - 2025-08-20
- Minor bug fixes
- More robust function for filtering and splitting flowspec rules for user
- Code cleanup
- Updated filter rules action to be more robust
1.1.3 - 2025-07-14
- Introduced configurable footer menu for links in bottom of the default template
- Removed debug print statements in update_set_org
1.1.2 - 2025-07-02
- Minor security updates (removed unused JS files)
setup.pynow reads dependencies fromrequirements.txt
- Fixed bugs for flowspec limit in various views
1.1.1 - 2025-06-03
- Machine API Key rewritten
- API keys for machines are now tied to one of the existing users
- If there is a need to have API access for machine, first create service user and set the access rights
- Then create machine key as Admin and assign it to this user
- Machine key now has user rights of the assigned user, not of admin
1.1.0 - 2025-03-25
- RTBH Whitelist Integration
- System automatically evaluates new RTBH rules against existing whitelists
- Can automatically modify or block rules that conflict with whitelisted networks
- Automatically whitelist rules that exactly match or are contained within whitelisted networks
- Create subnet rules when RTBH rules are supersets of whitelisted networks
- Maintain rule cache that tracks relationships between rules and whitelists for proper cleanup
- Dedicated services layer for better separation of concerns
rule_service.pyfor rule management operationswhitelist_service.pyfor whitelist functionalitywhitelist_common.pyfor shared whitelist utilities
- Major Architecture Refactoring
- Significant architectural refactoring focused on better separation of concerns
- Improved maintainability through services layer
- Business logic extracted from view controllers
- Models structure reorganization
- Better separation into logical modules
- Rule models organized under
flowapp/models/rules/ - Separate files for different rule types (
flowspec.py,rtbh.py,whitelist.py) - Backward compatibility maintained through main models
__init__.py
- Form handling improvements
- Better organization under
flowapp/forms/ - Enhanced validation logic
- Better organization under
1.0.2 - 2025-03-19
- Fixed bug in IPv6 Flowspec messages
- Fixed JSON output for route if ExaBGP process HTTP API is used
- Empty fragment in IPv6 messages should be empty string not None
1.0.1 - 2025-01-09
- Minor bug fixes
- Application is now Flask 3 compliant (updated requirements)
1.0.0 - 2024-10-15
- Limits for number of rules in the system
- Limits for rules per organization
- Overall limit for the installation
- Rules are now tied to organization
- Organization selection required after login for users belonging to multiple organizations
- Bulk import for users enabled for admin
- Swagger documentation for API on local system (available at
/apidocsURL) - New format of message for ExaAPI
- Now sends information about rule author (user) for logging purposes
- Database schema changes - migration required
- Existing rules need to be linked to organizations
- See detailed migration documentation
- ExaAPI and Guarda modules moved outside of the project
- ExaAPI now available as pip package exabgp-process
- ExaAPI has own GitHub repository
- Watch of ExaBGP restart can be done by guarda service or by override of the ExaBGP service settings
0.8.1 - 2024-09-23
- Application now uses Flask-Session stored in DB using SQL Alchemy driver
- Can be configured for other drivers
- Server-side session is required for proper application function
0.8.0 - 2024-03-28
- API keys expiration date
- API keys readonly flag
- Admin can create special keys for certain machines
- API keys update - migration required
- Run migration scripts to update your database
0.7.3 - 2023-11-03
- New possibility of external auth proxy
- Support for authentication using external proxy (expects HTTP header authentication)
0.7.2 - 2023-07-12
- Dashboard and Main menu are now customizable in config
- App is ready to be packaged using
setup.py
0.7.0 - 2022-09-02
- ExaAPI now has two options: HTTP or RabbitMQ
- ExaAPI process has been renamed
- Update of ExaBGP process value is needed for this version
0.6.2 - 2022-09-02
- External config for ExaAPI
0.6.0 - 2022-04-29
- Bootstrap 5 in UI
0.5.5 - 2022-02-25
- API v3: auth API key in cookie, not in URL
0.5.4 - 2021-08-31
- Right click menu on address with Whois or Copy to clipboard functionality
- Fixed
form.process()bug
0.5.3 - 2021-06-30
- Dashboard update
- Forms with default action (no default action/community in forms)
0.5.2 - 2021-04-16
- API v2 with new keys
0.5.1 - 2021-03-27
- Bug fixes
- Urgent and push values for TCP FLAGS
0.5.0 - 2021-03-09
- New format of LOG table in database - migration required
- Run migration scripts to update your database
- Removed foreign key
user_id - Author email is stored directly to logs for faster grep text search
0.4.8 - 2020
- Enhanced String Filtering
0.4.7 - 2020
- Multi neighbor support enabled
- See config example and update your
config.py
0.4.6 - 2020
- Route Distinguisher for VRF now supported
- See config example and update your
config.py