🛡️ Check BitDefender GravityZone
A comprehensive Nagios plugin for monitoring BitDefender GravityZone for Endpoint API endpoints. Built with modern Python practices and designed for enterprise monitoring environments.
✨ Features
- 🔐 Authentication - Support for API Token
- 🎯 Multiple Endpoints - Monitor onboarding status, last seen, last scan, and endpoint details
- 📊 Nagios Compatible - Standard exit codes and performance data output
- 🏗️ Clean Architecture - Modular design with testable components
- 🔧 Flexible Configuration - File-based configuration with sensible defaults
- 📈 Verbose Logging - Multi-level debugging support
- 🐍 Modern Python - Built with Python 3.9+ using type hints and async patterns
🚀 Quick Start
Installation
# Create virtual environment (recommended)
python -m venv /usr/local/libexec/nagios/check_bitdefender
source /usr/local/libexec/nagios/check_bitdefender/bin/activate
# Install from source
pip install git+https://github.com/lduchosal/check_bitdefender.git
Basic Usage
# List all endpoints
check_bitdefender endpoints
# Check onboarding status
check_bitdefender onboarding -d endpoint.domain.tld
# Check last seen (days since endpoint last connected)
check_bitdefender lastseen -d endpoint.domain.tld
# Check last scan (days since last antivirus scan)
check_bitdefender lastscan -d endpoint.domain.tld
# Get detailed endpoint info
check_bitdefender detail -d endpoint.domain.tld
📋 Available Commands
| Command | Description | Default Thresholds |
|---|---|---|
endpoints |
List all endpoints | W:10, C:25 |
onboarding |
Check endpoint onboarding status | W:2, C:1 |
lastseen |
Check days since endpoint was last seen | W:7, C:30 |
lastscan |
Check days since endpoint was last scanned | W:7, C:30 |
detail |
Get detailed endpoint information | - |
Onboarding Status Values
0- Onboarded ✅1- InsufficientInfo ⚠️2- Unknown ❌
⚙️ Configuration
Authentication Setup
Create check_bitdefender.ini in your Nagios directory or current working directory:
API Token Authentication
[auth]
token = your-api-token-here
[settings]
timeout = 5
parent_id = your-company-id-here # Optional: specify company/parent ID
BitDefender GravityZone API Setup
- Log into GravityZone Control Center
- Navigate to My Account > API Keys
- Generate a new API key with appropriate permissions
- Copy the API token to your configuration file
🔧 Command Line Options
| Option | Description | Example |
|---|---|---|
-c, --config |
Configuration file path | -c /custom/path/config.ini |
-m, --endpointId |
Endpoint ID (GUID) | -m "12345678-1234-1234-1234-123456789abc" |
-d, --fqdn |
Computer DNS Name (FQDN) | -d "server.domain.com" |
-W, --warning |
Warning threshold | -W 10 |
-C, --critical |
Critical threshold | -C 100 |
-v, --verbose |
Verbosity level | -v, -vv, -vvv |
--version |
Show version | --version |
🏢 Nagios Integration
Command Definitions
# BitDefender GravityZone Commands
define command {
command_name check_bitdefender_onboarding
command_line $USER1$/check_bitdefender/bin/check_bitdefender onboarding -d $HOSTALIAS$
}
define command {
command_name check_bitdefender_lastseen
command_line $USER1$/check_bitdefender/bin/check_bitdefender lastseen -d $HOSTALIAS$ -W 7 -C 30
}
define command {
command_name check_bitdefender_lastscan
command_line $USER1$/check_bitdefender/bin/check_bitdefender lastscan -d $HOSTALIAS$ -W 7 -C 30
}
Service Definitions
# BitDefender GravityZone Services
define service {
use generic-service
service_description BITDEFENDER_ONBOARDING
check_command check_bitdefender_onboarding
hostgroup_name bitdefender
}
define service {
use generic-service
service_description BITDEFENDER_LASTSEEN
check_command check_bitdefender_lastseen
hostgroup_name bitdefender
}
define service {
use generic-service
service_description BITDEFENDER_LASTSCAN
check_command check_bitdefender_lastscan
hostgroup_name bitdefender
}
🏗️ Architecture
This plugin follows clean architecture principles with clear separation of concerns:
check_bitdefender/
├── 📁 cli/ # Command-line interface
│ ├── commands/ # Individual command handlers
│ │ ├── endpoints.py # List endpoints command
│ │ ├── onboarding.py # Onboarding status command
│ │ ├── lastseen.py # Last seen command
│ │ ├── lastscan.py # Last scan command
│ │ └── detail.py # Endpoint detail command
│ └── decorators.py # Common CLI decorators
├── 📁 core/ # Core business logic
│ ├── auth.py # Authentication management
│ ├── config.py # Configuration handling
│ ├── defender.py # BitDefender API client
│ ├── exceptions.py # Custom exceptions
│ └── nagios.py # Nagios plugin framework
├── 📁 services/ # Business services
│ ├── endpoint_service.py # Endpoints business logic
│ ├── onboarding_service.py # Onboarding check logic
│ ├── lastseen_service.py # Last seen check logic
│ ├── lastscan_service.py # Last scan check logic
│ ├── detail_service.py # Detail retrieval logic
│ └── models.py # Data models
└── 📁 tests/ # Comprehensive test suite
├── unit/ # Unit tests
└── integration/ # Integration tests
Key Design Principles
- 🎯 Single Responsibility - Each module has one clear purpose
- 🔌 Dependency Injection - Easy testing and mocking
- 🧪 Testable - Comprehensive test coverage
- 📈 Extensible - Easy to add new commands and features
- 🔒 Secure - No secrets in code, proper credential handling
🧪 Development
Development Setup
# Clone repository
git clone https://github.com/lduchosal/check_bitdefender.git
cd check_bitdefender
# Create development environment
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# Install in development mode
pip install -e .
Code Quality Tools
# Format code
black check_bitdefender/
# Lint code
flake8 check_bitdefender/
# Type checking
mypy check_bitdefender/
# Run tests
pytest tests/ -v --cov=check_bitdefender
Building & Publishing
# Build package
python -m build
# Test installation
pip install dist/*.whl
# Publish to PyPI
python -m twine upload dist/*
🔍 Output Examples
Successful Check
DEFENDER OK - Onboarding status: 0 (Onboarded) | onboarding=0;1;2;0;2
Warning State
DEFENDER WARNING - Last seen: 10 days ago | lastseen=10;7;30;0;
Critical State
DEFENDER CRITICAL - Last scan: 35 days ago | lastscan=35;7;30;0;
🔧 Troubleshooting
Common Issues
| Issue | Solution |
|---|---|
| Authentication Errors | Verify BitDefender GravityZone API token |
| Network Connectivity | Check firewall rules for cloudgz.gravityzone.bitdefender.com |
| Import Errors | Ensure all dependencies are installed |
| Configuration Issues | Validate config file syntax and paths |
Debug Mode
Enable verbose logging for detailed troubleshooting:
# Maximum verbosity
check_bitdefender lastseen -d endpoint.domain.tld -vvv
# Check specific configuration
check_bitdefender onboarding -c /path/to/config.ini -d endpoint.domain.tld -vv
Required Network Access
Ensure connectivity to:
cloudgz.gravityzone.bitdefender.com
📊 Exit Codes
| Code | Status | Description |
|---|---|---|
0 |
OK | Value within acceptable range |
1 |
WARNING | Value exceeds warning threshold |
2 |
CRITICAL | Value exceeds critical threshold |
3 |
UNKNOWN | Error occurred during execution |
🤝 Contributing
We welcome contributions! Here's how to get started:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Development Guidelines
- Follow PEP 8 style guide
- Add tests for new features
- Update documentation as needed
- Ensure all tests pass before submitting
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- Built with nagiosplugin framework
- Powered by Click for CLI interface
- Integrates with BitDefender GravityZone API
⭐ Star this repository if you find it useful!
Metadata
Release files for check-bitdefender 1.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| check_bitdefender-1.0.5.tar.gz | 33.4 kB | Without provenance | Details for check_bitdefender-1.0.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| check_bitdefender-1.0.5-py3-none-any.whl | Python 3 | none | any | Details for check_bitdefender-1.0.5-py3-none-any.whl |
Total release size: 64.2 kB
Release files / check_bitdefender-1.0.5.tar.gz
| Download URL | check_bitdefender-1.0.5.tar.gz |
|---|---|
| Size | 33.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f2784af132c0fbbb3b4e9cf79c5dbf38a650edaa0f7e4da9d09b32eee1bde34c
|
|
BLAKE2b-256 checksum How to use checksums |
2ba469a9d14f1d43801560daf61625ebdc63eab93d5d5a6d064cee73d3785149
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
pdm/2.25.9 CPython/3.9.23 Darwin/24.6.0
|
Release files / check_bitdefender-1.0.5-py3-none-any.whl
| Download URL | check_bitdefender-1.0.5-py3-none-any.whl |
|---|---|
| Size | 30.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d04036aeefab95a158f16aa9c0006ad7f5b18b31badb6e6ef2ef3b2eee40a25
|
|
BLAKE2b-256 checksum How to use checksums |
1652531deb064920f4149c5dccc8138af3662067de9f4d78731146669fea0d3a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
pdm/2.25.9 CPython/3.9.23 Darwin/24.6.0
|
Security for check-bitdefender 1.0.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.