a534c06b26
Add ComparisonOperator.NAGIOS ("nagios") that maps Nagios exit codes
directly to alert levels (0=OK 1=WARNING 2=CRITICAL 3=UNKNOWN) without
requiring numeric warning/critical thresholds. Hysteresis is bypassed for
discrete codes. Display template defaults to "{check_name}: {output}".
_format_display() handles None threshold_value gracefully.
Add nagios_runner.status_code as a built-in default threshold config so
nagios checks alert out of the box.
Also: fix alerts.html scrolling (override html,body), make hostname a link
to /plugins#<hostname>, remove overall_status/overall_status_code/plugin_count
from nagios_runner and hbc_mini, replace with computed worst-status in
plugins.html via nagiosWorstStatus() helper.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
150 lines
4.9 KiB
Python
150 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test the Nagios Runner Plugin.
|
|
"""
|
|
|
|
import asyncio
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
# Setup path
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from hbd.plugins.nagios_runner import NagiosRunnerPlugin, NAGIOS_OK, NAGIOS_WARNING
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s %(name)s %(levelname)s: %(message)s"
|
|
)
|
|
|
|
async def test_nagios_runner():
|
|
"""Test Nagios runner plugin."""
|
|
print("=" * 70)
|
|
print("Testing Nagios Runner Plugin")
|
|
print("=" * 70)
|
|
|
|
# Create test configuration with simple shell commands
|
|
# These mimic Nagios plugin output format
|
|
config = {
|
|
"interval": 60,
|
|
"timeout": 10,
|
|
"commands": [
|
|
{
|
|
"name": "check_uptime",
|
|
"command": "echo 'OK - uptime is 5 days | uptime=432000s;;;0'"
|
|
},
|
|
{
|
|
"name": "check_memory",
|
|
"command": "echo 'OK - Memory usage 45% | memory=45%;80;90;0;100'"
|
|
},
|
|
{
|
|
"name": "check_cpu",
|
|
"command": "echo 'WARNING - CPU load high | load1=5.2;5.0;10.0;0 load5=4.8;4.0;8.0;0 load15=3.2;3.0;6.0;0' && exit 1"
|
|
},
|
|
{
|
|
"name": "check_disk",
|
|
"command": "echo 'OK - Disk usage 62% | /=62%;80;90;0;100 /home=45%;80;90;0;100'"
|
|
}
|
|
]
|
|
}
|
|
|
|
print("\n1. Creating Nagios Runner plugin with test configuration")
|
|
print(f" Configured {len(config['commands'])} test commands")
|
|
|
|
plugin = NagiosRunnerPlugin(config)
|
|
|
|
print(f"\n2. Initializing plugin...")
|
|
initialized = await plugin.initialize()
|
|
print(f" Initialized: {initialized}")
|
|
|
|
if not initialized:
|
|
print(" ERROR: Plugin failed to initialize!")
|
|
return
|
|
|
|
print(f"\n3. Collecting metrics from Nagios plugins...")
|
|
data = await plugin.collect()
|
|
|
|
print(f" ✓ Collected {len(data)} data points")
|
|
|
|
print(f"\n4. Results:")
|
|
print(f" Data points collected: {len(data)}")
|
|
|
|
# Show individual plugin results
|
|
print(f"\n5. Individual Plugin Results:")
|
|
for cmd_config in config["commands"]:
|
|
name = cmd_config["name"]
|
|
status = data.get(f"{name}_status", "N/A")
|
|
status_code = data.get(f"{name}_status_code", "N/A")
|
|
output = data.get(f"{name}_output", "N/A")
|
|
|
|
print(f"\n {name}:")
|
|
print(f" Status: {status} (code: {status_code})")
|
|
print(f" Output: {output}")
|
|
|
|
# Show performance data if present
|
|
perf_keys = [k for k in data.keys() if k.startswith(f"{name}_") and
|
|
k not in [f"{name}_status", f"{name}_status_code", f"{name}_output"]]
|
|
if perf_keys:
|
|
print(f" Performance Data:")
|
|
for key in perf_keys:
|
|
metric_name = key.replace(f"{name}_", "")
|
|
print(f" {metric_name}: {data[key]}")
|
|
|
|
print(f"\n6. Testing Nagios plugin detection (if available)...")
|
|
|
|
# Try to find actual Nagios plugins on the system
|
|
common_nagios_paths = [
|
|
"/usr/lib/nagios/plugins",
|
|
"/usr/local/nagios/libexec",
|
|
"/usr/lib64/nagios/plugins"
|
|
]
|
|
|
|
nagios_plugin_dir = None
|
|
for path in common_nagios_paths:
|
|
if Path(path).exists():
|
|
nagios_plugin_dir = Path(path)
|
|
print(f" ✓ Found Nagios plugins at: {nagios_plugin_dir}")
|
|
break
|
|
|
|
if nagios_plugin_dir:
|
|
# Try check_users if it exists
|
|
check_users = nagios_plugin_dir / "check_users"
|
|
if check_users.exists():
|
|
print(f"\n Testing real Nagios plugin: check_users")
|
|
real_config = {
|
|
"commands": [{
|
|
"name": "users",
|
|
"command": f"{check_users} -w 10 -c 20"
|
|
}]
|
|
}
|
|
real_plugin = NagiosRunnerPlugin(real_config)
|
|
await real_plugin.initialize()
|
|
real_data = await real_plugin.collect()
|
|
|
|
print(f" Status: {real_data.get('users_status')}")
|
|
print(f" Output: {real_data.get('users_output')}")
|
|
|
|
# Show any performance data
|
|
for key in real_data:
|
|
if key.startswith("users_") and "status" not in key and "output" not in key:
|
|
print(f" {key}: {real_data[key]}")
|
|
else:
|
|
print(f" check_users not found at {check_users}")
|
|
else:
|
|
print(f" No Nagios plugins directory found")
|
|
print(f" Install nagios-plugins to test with real plugins:")
|
|
print(f" sudo apt-get install nagios-plugins # Debian/Ubuntu")
|
|
print(f" sudo yum install nagios-plugins-all # RHEL/CentOS")
|
|
|
|
print(f"\n7. Cleanup...")
|
|
await plugin.cleanup()
|
|
print(f" ✓ Cleanup complete")
|
|
|
|
print(f"\n" + "=" * 70)
|
|
print("Test complete!")
|
|
print("=" * 70)
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(test_nagios_runner())
|