-
-
Notifications
You must be signed in to change notification settings - Fork 11
Implement Plugin System with Built-in Plugins and Comprehensive Examples #64
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
byjg
wants to merge
11
commits into
master
Choose a base branch
from
plugins
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+8,132
−37
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- Introduced a plugin system enabling EasyHAProxy extensions. - Added `CleanupPlugin` (GLOBAL): Handles temporary file cleanup. - Added `CloudflarePlugin` (DOMAIN): Restores visitor IP from Cloudflare headers. - Added `DenyPagesPlugin` (DOMAIN): Blocks access to specified paths. - Documented the plugin architecture, configuration options, and built-in plugins in `docs/plugin-development.md` and `docs/plugins.md`.
- Added `plugin_configs` attribute to test cases. - Improved handling of enabled plugins in `easymapping/__init__.py`. - Updated templates directory path resolution for robustness. - Refactored example files to enhance formatting consistency.
…dling - Created fixtures for `services-with-cloudflare`, `services-with-deny-pages`, and `services-with-multiple-plugins`. - Added comprehensive test cases for `CloudflarePlugin`, `DenyPagesPlugin`, and `CleanupPlugin`. - Ensured proper configuration propagation to plugins using labels in `easymapping/__init__.py`. - Validated multi-plugin integration and consistent output in HAProxy configuration generation.
- Introduced `IpWhitelistPlugin` (DOMAIN): Restricts access to specific IP addresses or CIDR ranges. - Added configuration options: `enabled`, `allowed_ips`, and `status_code`. - Updated `plugins.md` and `plugin-development.md` to document `IpWhitelistPlugin`. - Created fixtures for `services-with-ip-whitelist`. - Added extensive test cases for `IpWhitelistPlugin` to validate configuration and HAProxy output generation. - Ensured seamless integration into the plugin framework alongside other domain plugins.
- Introduced `JwtValidatorPlugin` (DOMAIN): Validates JWT tokens for protected API endpoints using HAProxy's JWT functionality. - Added configuration options: `enabled`, `algorithm`, `issuer`, `audience`, `pubkey_path`, and `pubkey`. - Documented the plugin setup and usage in `plugins.md` and `plugin-development.md`. - Created fixtures for `services-with-jwt-validator`. - Added extensive test cases to validate configuration and HAProxy output generation. - Ensured seamless integration into the plugin framework alongside existing domain plugins.
…port
- Updated `plugins.md` and `kubernetes.md` with detailed plugin configuration examples for Kubernetes annotations.
- Introduced support for `easyhaproxy.plugins` and `easyhaproxy.plugin.{name}.{key}` annotations in Kubernetes.
- Added comprehensive examples for JWT validation, IP whitelisting, and deny pages
… examples - Added detailed `README.md` files with step-by-step instructions for Docker Compose, Kubernetes, Swarm, and static configuration examples. - Included use cases for SSL setup, Let's Encrypt integration, load balancing, and advanced features like plugins and path-based routing. - Documented environment variables, service labels, and troubleshooting tips across all examples. - Enhanced examples with clear testing guidelines, SSL certificate generation steps, and debugging workflows.
…warm - Introduced multiple detailed plugin examples for Cloudflare IP restoration, IP whitelisting, JWT validation, and combined usage. - Added configurations for `docker-compose`, `Kubernetes`, and `Swarm` showcasing individual and multi-plugin use cases. - Included clear prerequisites, setup steps, and testing procedures for each example. - Documented advanced scenarios like path blocking, custom IP lists, and JWT validation for production environments.
…mentation - Replaced `config.yml` with modular configuration examples: `config-basic.yml`, `config-certbot.yml`, `config-deny-pages.yml`, and `config-jwt-validator.yml`. - Improved examples with detailed usage instructions, prerequisites, and testing steps for each configuration. - Fixed indentation and formatting inconsistencies across plugin files and HAProxy configuration generation. - Streamlined README comparison table for static vs. dynamic discovery. - Updated `docker-compose-jwt-validator.yml` to correct audience key formatting.
Owner
Author
|
Link to Issue #51 |
- Introduced `paths` and `only_paths` configuration options to define protected API paths. - Enhanced HAProxy configuration generation to handle path-specific JWT validation. - Updated plugin metadata to include path details and validation logic. - Modified documentation with detailed examples for protecting paths. - Added comprehensive tests for path-based validation scenarios and edge cases.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
This PR implements a complete plugin system for EasyHAProxy, including four built-in security plugins, comprehensive test coverage, and extensive documentation with runnable examples across all deployment methods.
Major Features
🔌 Plugin System Architecture
Plugin Types:
PluginType.DOMAIN- Execute once per domain/hostPluginType.GLOBAL- Execute once per discovery cycleConfiguration Sources (in order of precedence):
Plugin Lifecycle:
src/plugins/builtin/and custom paths🛡️ Built-in Plugins
1. JWT Validator Plugin
File:
src/plugins/builtin/jwt_validator.pyFeatures:
Configuration Example:
2. IP Whitelist Plugin
File:
src/plugins/builtin/ip_whitelist.pyFeatures:
Configuration Example:
3. Deny Pages Plugin
File:
src/plugins/builtin/deny_pages.pyFeatures:
/admin,/.env,/wp-adminConfiguration Example:
4. Cloudflare Plugin
File:
src/plugins/builtin/cloudflare.pyFeatures:
Configuration Example:
🧪 Testing
Added comprehensive plugin test suite with 34 new tests:
enabled_list=NoneTest Results:
pytest -c src/tests -v # 80 tests passed (including 34 plugin-specific tests)📁 File Structure
Core Plugin System
src/plugins/__init__.py- Plugin base classes and discovery logicsrc/plugins/builtin/jwt_validator.py- JWT validation pluginsrc/plugins/builtin/ip_whitelist.py- IP restriction pluginsrc/plugins/builtin/deny_pages.py- Path blocking pluginsrc/plugins/builtin/cloudflare.py- IP restoration pluginsrc/processor/__init__.py- Modified to integrate plugin systemsrc/easymapping/__init__.py- Modified to support plugin configurationsrc/templates/haproxy.cfg.j2- Modified to inject plugin configurationsDocumentation
docs/plugins.md- Complete plugin system documentationdocs/plugin-development.md- Guide for creating custom pluginsexamples/docker/README.md- Docker Compose examples guide (165+ lines)examples/kubernetes/README.md- Kubernetes ingress examples guide (485+ lines)examples/static/README.md- Static configuration guide (437+ lines)examples/swarm/README.md- Docker Swarm deployment guide (596+ lines)🚀 Runnable Examples (12 files)
Docker Compose Examples (4 files)
examples/docker/docker-compose-jwt-validator.yml- JWT token validation with key generation and test commandsexamples/docker/docker-compose-cloudflare.yml- Cloudflare IP restoration with download instructionsexamples/docker/docker-compose-ip-whitelist.yml- IP address restriction with CIDR notation examplesexamples/docker/docker-compose-plugins-combined.yml- Multiple plugins working togetherKubernetes Examples (4 files)
examples/kubernetes/jwt-validator.yml- Complete JWT setup with ConfigMap, Deployment, Service, and Ingressexamples/kubernetes/cloudflare.yml- Cloudflare IP restoration with actual IP ranges in ConfigMapexamples/kubernetes/ip-whitelist.yml- IP whitelist with annotation-based configurationexamples/kubernetes/plugins-combined.yml- Three-tier security setup (Website, API, Admin)Docker Swarm Examples (4 files)
examples/swarm/jwt-validator.yml- JWT validation using Docker configs with creation commandsexamples/swarm/cloudflare.yml- Cloudflare IP restoration using Docker configsexamples/swarm/ip-whitelist.yml- IP whitelist with service label syntaxexamples/swarm/plugins-combined.yml- Production-ready multi-service stackStatic Configuration Examples (4 files)
examples/static/conf/config-basic.yml- Minimal configuration without pluginsexamples/static/conf/config-deny-pages.yml- Global plugin with per-domain overridesexamples/static/conf/config-jwt-validator.yml- JWT validation for multiple APIsexamples/static/conf/config-certbot.yml- Let's Encrypt/ACME automatic SSL certificates🐛 Bug Fixes
1. Critical: Plugin execution with None enabled_list
Problem: Plugins were executing even when
enabled_list=NoneFix: Added proper check to skip plugin execution when no plugins are enabled
Impact: Prevents unnecessary plugin execution and potential errors
2. Double indentation in HAProxy output
Problem: Plugins were adding 4 spaces to HAProxy config lines, and the Jinja2 template was also adding 4 spaces via
indent(4, first=True), resulting in 8 spaces total instead of 4.Fix: Removed indentation from all plugin output. The Jinja2 template now handles all indentation consistently.
Files Modified:
src/plugins/builtin/jwt_validator.pysrc/plugins/builtin/ip_whitelist.pysrc/plugins/builtin/deny_pages.pysrc/plugins/builtin/cloudflare.pyBefore:
After:
🎯 Kubernetes Annotation Support
Added full plugin support via Kubernetes Ingress annotations:
Benefits
Migration Guide
Enabling Plugins
Docker Compose
Kubernetes
Static Mode (Global)
Static Mode (Per-Domain)
Breaking Changes
None - This is a new feature addition. Existing configurations continue to work without modification.
What's Next
Users can now: