#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# 10-disk — 42i-hc Drop-in: Plattenbelegung der relevanten Mounts.
# hc-tags: cheap, metrics, local, host
# hc-ttl: 300
#
# Liefert {"metrics": {"disk": [...]}}. Plattenplatz fuellt sich langsam, daher
# lange Cache-TTL (5 min). Schwellen aus HC_WARN_PCT/HC_FAIL_PCT (Default 85/95)
# annotieren jeden Mount mit status; die Aggregation macht der hc-Daemon generisch.
#
# Geliefert von 42i-hc.

import json
import os
import sys

WARN = float(os.environ.get("HC_WARN_PCT") or 85)
FAIL = float(os.environ.get("HC_FAIL_PCT") or 95)


def classify(pct):
    """Bildet einen Prozentwert auf ok/warn/fail nach den Schwellen ab."""
    if pct >= FAIL:
        return "fail"
    if pct >= WARN:
        return "warn"
    return "ok"


def candidate_mounts():
    """Feste Kandidaten plus direkte Kind-Mounts von /srv (eigene Datasets wie
    /srv/git auf git.corp tauchen sonst nie auf, weil /srv selbst auf / liegt)."""
    mounts = ["/", "/srv", "/srv/podman/storage"]
    try:
        for entry in sorted(os.listdir("/srv")):
            path = os.path.join("/srv", entry)
            if os.path.ismount(path):
                mounts.append(path)
    except OSError:
        pass
    return mounts


def disks():
    """Belegung der relevanten Mountpoints (siehe candidate_mounts)."""
    out = []
    seen = set()
    for mount in candidate_mounts():
        if not os.path.isdir(mount):
            continue
        try:
            st = os.statvfs(mount)
        except Exception:
            continue
        dev = st.f_fsid
        if dev in seen:
            continue
        seen.add(dev)
        total = st.f_blocks * st.f_frsize
        free = st.f_bavail * st.f_frsize
        if total <= 0:
            continue
        pct = round((total - free) / total * 100, 1)
        out.append({"mount": mount, "pct": pct, "status": classify(pct)})
    return out


def main():
    """Gibt {"metrics": {"disk": ...}} als JSON aus (leer, wenn nichts lesbar)."""
    metrics = {}
    d = disks()
    if d:
        metrics["disk"] = d
    json.dump({"metrics": metrics}, sys.stdout, ensure_ascii=False)
    sys.stdout.write("\n")


if __name__ == "__main__":
    main()
