6.9 KiB
6.9 KiB
HBD/HBC Separation Refactoring
Overview
The heartbeat monitoring system has been refactored into a modular package structure with separate client and server components. This allows users to install only what they need and provides clear separation of concerns.
New Package Structure
hbd/
├── __init__.py # Main package (minimal)
├── client/ # HBC - System monitoring client
│ ├── __init__.py
│ ├── main.py # Entry point (was hbc.py)
│ ├── config.py # Client-specific configuration
│ ├── plugin.py # Plugin framework
│ ├── threshold.py # Threshold checking
│ └── plugins/ # Monitoring plugins
│ ├── cpu_monitor.py
│ ├── disk_monitor.py
│ ├── memory_monitor.py
│ ├── network_monitor.py
│ ├── filesystem_info.py
│ ├── os_info.py
│ └── nagios_runner.py
├── server/ # HBD - Heartbeat daemon/server
│ ├── __init__.py
│ ├── main.py # Server runtime (was server.py)
│ ├── cli.py # Command-line interface
│ ├── config.py # Server-specific configuration
│ ├── http.py # HTTP/REST API
│ ├── ws.py # WebSocket server
│ ├── udp.py # UDP heartbeat listener
│ ├── dns.py # DNS update functionality
│ ├── notify.py # Notification handlers
│ ├── monitor.py # Host monitoring
│ ├── hbdclass.py # Host class definitions
│ ├── journal.py # Message journaling
│ ├── templates/ # Jinja2 web templates
│ └── static/ # Web UI assets
└── common/ # Shared utilities
├── __init__.py
├── proto.py # Protocol encoding/decoding
└── utils.py # Common utilities
## Configuration Files
### Client Configuration (hbd/client/config.py)
Client-specific defaults:
- `hb_port`: Port where hbd servers listen (default: 50003)
- `interval`: Heartbeat interval in seconds (default: 10)
- `plugins`: Per-plugin configuration
- `thresholds`: Threshold configuration for monitoring
### Server Configuration (hbd/server/config.py)
Server-specific defaults:
- `hb_port`: Port to listen for heartbeats (default: 50003)
- `hbd_port`: HTTP API port (default: 50004)
- `ws_port`: WebSocket port (default: 50005)
- `logfile`: Log file path
- `pushsrv`, `pushover_token`, etc.: Notification settings
- `watchhosts`, `dyndnshosts`: Host monitoring
- `smtpserver`, etc.: Email settings
- `journal_*`: Message journaling settings
## Installation Options
### Install Core Only (minimal, PyYAML only)
```bash
pip install hbd
Install Client Only (for monitoring)
pip install hbd[client]
# Installs: PyYAML, psutil
Install Server Only (for daemon)
pip install hbd[server]
# Installs: PyYAML, websockets, mattermostdriver, aiohttp, Jinja2
Install Everything
pip install hbd[all]
# Installs all dependencies for both client and server
Development Installation
pip install -e ".[dev]"
# Includes all dependencies plus testing/linting tools
Command-Line Interfaces
HBC (Client)
hbc [options] host1 [host2 ...]
# Entry point: hbd.client.main:main
# Location: hbd/client/main.py
HBD (Server)
hbd [options]
# Entry point: hbd.server.cli:main
# Location: hbd/server/cli.py → hbd/server/main.py
Import Changes
Client Code
# Old imports
from .config import load_config
from .proto import dicttos, stodict
from .plugin import PluginRegistry
# New imports
from .config import load_config # Still in client/
from ..common.proto import dicttos # Moved to common/
from .plugin import PluginRegistry # Still in client/
Server Code
# Old imports
from .config import load_config
from .proto import stodict
from .threshold import AlertLevel
# New imports
from .config import load_config # Server-specific config
from ..common.proto import stodict # Moved to common/
from ..client.threshold import AlertLevel # Client module
Plugin Code
# Old import
from hbd.plugin import MonitorPlugin
# New import
from hbd.client.plugin import MonitorPlugin
Benefits
-
Modular Installation: Install only what you need
- Client-only systems don't need web server dependencies
- Server-only systems don't need psutil
-
Clearer Architecture: Explicit separation of concerns
- Client: System monitoring and data collection
- Server: Heartbeat reception, web UI, notifications
- Common: Shared protocol and utilities
-
Independent Evolution: Client and server can evolve separately
- Different release cycles possible
- Clear API boundaries via common/
-
Smaller Footprint: Reduced dependency installation
- Client: ~1 dependency (psutil)
- Server: ~4 dependencies (websockets, aiohttp, Jinja2, mattermostdriver)
Migration Guide
For Existing Installations
-
Reinstall the package:
pip install -e ".[all]" # For development # or pip install hbd[all] # For production -
Configuration files remain unchanged:
- Both client and server read from
~/.hb.yaml - All existing config keys are supported in both configs
- Server has additional keys (journal, websocket, email, etc.)
- Client has minimal keys (interval, plugins, thresholds)
- Both client and server read from
-
Commands remain the same:
hbccommand works identicallyhbdcommand works identically
For New Deployments
-
Client-only system (monitoring host):
pip install hbd[client] hbc server1.example.com server2.example.com -
Server-only system (monitoring daemon):
pip install hbd[server] hbd -c /etc/hbd.yaml -f -
Combined system (dev/test):
pip install hbd[all]
Testing
All imports and entry points have been tested and validated:
- ✅ Package imports work correctly
- ✅
hbccommand entry point functional - ✅
hbdcommand entry point functional - ✅ Optional dependencies properly configured
- ✅ All internal imports updated
Files Archived
The following files were renamed to avoid conflicts:
hbd/config.py→hbd/config.py.old(split into client/server configs)hbd/hbc_old.py→hbd/hbc_old.py.bak(backup file)
Next Steps
- Test client functionality with a monitoring host
- Test server functionality with web UI and notifications
- Update documentation (README.md) with new structure
- Consider publishing to PyPI with new structure
- Update any deployment scripts/Dockerfiles to use optional dependencies