initial commit
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Daily Scrutiny drive health check — outputs formatted health report to stdout.
|
||||
|
||||
Designed for cron jobs with no_agent=True: script output is delivered verbatim.
|
||||
All-clear days produce a quiet report; flagged drives show in red/orange.
|
||||
|
||||
Temp thresholds:
|
||||
- SSDs: normal <55°C, warm 55-65°C, critical >65°C
|
||||
- HDDs: normal <48°C, warm 48-55°C, critical >55°C
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import urllib.request
|
||||
from datetime import datetime
|
||||
|
||||
SCRUTINY_URL = "http://localhost:7272/api/summary"
|
||||
|
||||
|
||||
def get_scrutiny_data():
|
||||
try:
|
||||
with urllib.request.urlopen(SCRUTINY_URL, timeout=10) as r:
|
||||
return json.loads(r.read())
|
||||
except Exception as e:
|
||||
print(f"❌ *Scrutiny Health Check Failed*\nCould not reach Scrutiny API: {e}")
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def check_drives(data):
|
||||
devices = data.get("data", {}).get("summary", {})
|
||||
if not devices:
|
||||
print("❌ *Scrutiny Health Check*\nNo drives found in Scrutiny.")
|
||||
return
|
||||
|
||||
issues = []
|
||||
healthy = []
|
||||
|
||||
for wwn, info in devices.items():
|
||||
d = info.get("device", {})
|
||||
s = info.get("smart", {})
|
||||
|
||||
name = d.get("device_name", "?")
|
||||
model = d.get("model_name", "Unknown")
|
||||
temp = s.get("temp")
|
||||
hours = s.get("power_on_hours", 0)
|
||||
status = d.get("device_status", 0)
|
||||
|
||||
if status == 2:
|
||||
issues.append(f"🔴 *{name}* ({model}) — FAILED status")
|
||||
continue
|
||||
|
||||
is_ssd = "SSD" in model.upper()
|
||||
if temp is not None:
|
||||
high_warn = 55 if is_ssd else 48
|
||||
high_crit = 65 if is_ssd else 55
|
||||
if temp > high_crit:
|
||||
issues.append(f"🔴 *{name}* ({model}) — Critical temp: {temp}°C")
|
||||
continue
|
||||
elif temp > high_warn:
|
||||
issues.append(f"⚠️ *{name}* ({model}) — High temp: {temp}°C")
|
||||
continue
|
||||
temp_str = f"🌡️ {temp}°C"
|
||||
else:
|
||||
temp_str = "N/A temp"
|
||||
|
||||
healthy.append(f"✅ *{name}* ({model}) — {temp_str}")
|
||||
|
||||
lines = ["📀 *Daily Drive Health Check*\n"]
|
||||
if issues:
|
||||
lines.append("*⚠️ Issues Found:*")
|
||||
lines.extend(issues)
|
||||
lines.append("")
|
||||
|
||||
lines.append("*All Drives:*")
|
||||
lines.extend(healthy)
|
||||
lines.append("")
|
||||
lines.append(f"📅 {datetime.now().strftime('%b %d, %Y %I:%M %p')}")
|
||||
lines.append("🛡️ Scrutiny + Hermes")
|
||||
|
||||
print("\n".join(lines))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
data = get_scrutiny_data()
|
||||
check_drives(data)
|
||||
Reference in New Issue
Block a user