Files
blackroad-os-kpis/collectors/services-probe.py
Alexa Amundson 42fb629ba5 v2: 9 collectors, 60+ KPIs — cloudflare, services, local mac, github-deep, autonomy bars
RoadChain-SHA2048: f59eb7b3bb74e603
RoadChain-Identity: alexa@sovereign
RoadChain-Full: f59eb7b3bb74e60325e3dc2bde2dce2d3f77e4afdadb4b559bf44b95318aac5e44854cc056bec1414243177e469feccdf8a5bf21697916f004706ac784fc70a9ce221703ff29c91581884e5903b5d4a6127a3b570eda54801cf7641a17b13490bb8a3d3be04ee01a96030087800f62f02f47e6ca3d76a3e832c8cdfbeefa3ffbd57acc133d9a7d684161e565dd53636a48410cd38d322620c3fac516a79e5831edf3dab2e81c484f583628c617f85f066351f403163cea6e939484ab33bdaaaa27b23695999aa0e68ae9bff10bf9dfbabcd2785b286600e940359f8e2122c708ed62e7a358accafd224da40151104d77017d4c91fa5b35cce8ca7a728d1b37e0
2026-03-12 23:45:44 -05:00

93 lines
3.2 KiB
Python

#!/usr/bin/env python3
"""Deep service probe — runs on each Pi via SSH"""
import json, subprocess, os
def run(cmd):
try:
return subprocess.check_output(cmd, shell=True, stderr=subprocess.DEVNULL, timeout=10).decode().strip()
except:
return ""
# Ollama
ollama = {"count": 0, "size_gb": 0, "models": []}
try:
import urllib.request
r = urllib.request.urlopen("http://localhost:11434/api/tags", timeout=3)
data = json.loads(r.read())
models = data.get("models", [])
ollama["count"] = len(models)
ollama["size_gb"] = round(sum(m.get("size", 0) for m in models) / 1e9, 1)
ollama["models"] = [m.get("name", "") for m in models]
except:
pass
# Docker
docker = {"running": 0, "images": 0, "containers_total": 0, "names": []}
docker["running"] = int(run("docker ps -q 2>/dev/null | wc -l").strip() or "0")
docker["images"] = int(run("docker images -q 2>/dev/null | wc -l").strip() or "0")
docker["containers_total"] = int(run("docker ps -aq 2>/dev/null | wc -l").strip() or "0")
names = run("docker ps --format '{{.Names}}' 2>/dev/null")
docker["names"] = names.split("\n") if names else []
# PostgreSQL
postgres = {"databases": 0}
pg_count = run("sudo -u postgres psql -tc 'SELECT count(*) FROM pg_database' 2>/dev/null").strip()
if pg_count and pg_count.isdigit():
postgres["databases"] = int(pg_count)
# Nginx
nginx = {"sites": 0, "active": False}
nginx["sites"] = int(run("ls /etc/nginx/sites-enabled/ 2>/dev/null | wc -l").strip() or "0")
nginx["active"] = run("systemctl is-active nginx 2>/dev/null") == "active"
# Systemd
systemd = {"services": 0, "timers": 0, "failed": 0}
systemd["services"] = int(run("systemctl list-units --type=service --no-legend 2>/dev/null | wc -l").strip() or "0")
systemd["timers"] = int(run("systemctl list-timers --no-legend 2>/dev/null | wc -l").strip() or "0")
systemd["failed"] = int(run("systemctl --failed --no-legend 2>/dev/null | wc -l").strip() or "0")
# Processes & connections
processes = int(run("ps aux 2>/dev/null | wc -l").strip() or "0")
connections = int(run("ss -tunp 2>/dev/null | wc -l").strip() or "0")
# Swap
swap = {"used_mb": 0, "total_mb": 0}
swap_line = run("free -m | grep Swap")
if swap_line:
parts = swap_line.split()
if len(parts) >= 3:
swap["total_mb"] = int(parts[1])
swap["used_mb"] = int(parts[2])
# Cloudflared
cloudflared = run("systemctl is-active cloudflared 2>/dev/null") == "active"
# Tailscale peers
tailscale_peers = int(run("tailscale status 2>/dev/null | wc -l").strip() or "0")
# Hailo
hailo = os.path.exists("/dev/hailo0")
# Crons (all users)
cron_root = int(run("crontab -l 2>/dev/null | grep -cv '^#\\|^$'") or "0")
cron_users = 0
for u in run("ls /home/ 2>/dev/null").split():
c = run(f"sudo crontab -u {u} -l 2>/dev/null | grep -cv '^#\\|^$'")
cron_users += int(c) if c and c.isdigit() else 0
d = {
"ollama": ollama,
"docker": docker,
"postgres": postgres,
"nginx": nginx,
"systemd": systemd,
"processes": processes,
"connections": connections,
"swap": swap,
"cloudflared": cloudflared,
"tailscale_peers": tailscale_peers,
"hailo": hailo,
"crons": {"root": cron_root, "users": cron_users, "total": cron_root + cron_users},
}
print(json.dumps(d))