Monitoring-Scripts¶
Wenn die eingebauten Check-Typen nicht reichen — z. B. weil ein eigenes Backup-Tool, ein vendor-spezifisches CLI oder eine REST-API geprüft werden soll — sind Monitoring-Scripts der Weg.
Konzept¶
Scripts werden zentral in Vesana verwaltet (Tabelle monitoring_scripts), in der Datenbank gespeichert und über die API an Agents ausgeliefert. Auf der Maschine selbst liegt nichts — der Agent zieht den Script-Inhalt zur Laufzeit.
sequenceDiagram
participant U as User
participant API
participant DB
participant A as Agent
U->>API: Script anlegen / editieren
API->>DB: speichern
A->>API: GET /agent/config (alle 5 Min)
API->>DB: SELECT host_services + scripts
API-->>A: { script_content, interpreter, expected_output }
A->>A: Interpreter starten, Script piped in stdin
A->>API: Result (Status + Wert + Message + perfdata)
Builtin vs. Custom¶
| Typ | is_builtin |
tenant_id |
Editierbar |
|---|---|---|---|
| Builtin | true | NULL | ❌ (nur duplizieren) |
| Custom | false | Tenant-UUID | ✅ |
Aktuell sind 39 Builtin-Scripts mitgeliefert (System-Badge im Frontend). Beispiele:
check_backup_log— Bash, parst typische Backup-Log-Filescheck_disk_smart— Bash, ruftsmartctlaufcheck_iis_pool— PowerShell, Application-Pool-Statuscheck_systemd_failed— Bash, listet failed units
Builtin-Scripts können dupliziert werden — die Kopie landet als Custom-Script und ist frei editierbar.
Script anlegen¶
/scripts → Neu:
| Feld | Pflicht | Bedeutung |
|---|---|---|
| Name | ✅ | Eindeutig pro Tenant |
| Beschreibung | – | Wofür das Script da ist |
| Interpreter | ✅ | powershell, bash, python |
| Script-Body | ✅ | Code, Multi-Line |
| Expected-Output | ✅ | nagios, text, json |
| Timeout (s) | ✅ | Default 30 |
Expected-Output-Modi¶
nagios¶
Klassisches Nagios-Plugin-Format:
- Exit-Code 0 → OK
- Exit-Code 1 → WARNING
- Exit-Code 2 → CRITICAL
- Exit-Code 3 → UNKNOWN
Output-Format:
Beispiel:
#!/bin/bash
LOAD=$(awk '{print $1}' /proc/loadavg)
if (( $(echo "$LOAD > 5" | bc -l) )); then
echo "CRITICAL - Load $LOAD | load1=$LOAD;1;5"
exit 2
elif (( $(echo "$LOAD > 1" | bc -l) )); then
echo "WARNING - Load $LOAD | load1=$LOAD;1;5"
exit 1
else
echo "OK - Load $LOAD | load1=$LOAD;1;5"
exit 0
fi
perfdata (alles nach |) wird automatisch in check_results.perfdata als JSONB geschrieben.
text¶
Freier Text-Output, Status nur über Exit-Code (0/1/2/3). Wird 1:1 ins message-Feld übernommen, kein perfdata.
#!/bin/bash
if [ -f /tmp/maintenance ]; then
echo "Wartungsmodus aktiv"
exit 1 # WARNING
fi
echo "Normalbetrieb"
exit 0
json¶
Strukturierter JSON-Output, Status frei wählbar:
import json, sys
result = {
"status": "OK", # OK / WARNING / CRITICAL / UNKNOWN
"message": "Backup von gestern um 02:14",
"value": 42, # optional, numerisch
"perfdata": { # optional
"duration_s": 1834,
"size_gb": 12.4
}
}
print(json.dumps(result))
Vorteil: kein Exit-Code-Hack, bessere Lesbarkeit, perfdata strukturiert.
Script auf einen Service binden¶
Im Profile-Check oder direkt am Host-Service:
| Feld | Bedeutung |
|---|---|
check_type |
agent_script |
script_id |
UUID des Scripts |
Beim Config-Refresh holt der Agent zusätzlich zur Service-Config auch den Script-Inhalt — er muss also nichts lokal vorhalten.
Agent-Sicherheit¶
Scripts laufen unter dem User des Agent-Services. Linux: typischerweise root (für viele Checks nötig). Windows: LocalSystem (analog).
Scripts haben Root-Zugriff
Wer ein Custom-Script anlegen kann, kann auf Agent-Maschinen Code als root ausführen. Permission script.create ist daher nur für Tenant-Admins und höher empfehlenswert. Details: Rollen & Permissions.
Beispiel: TLS-Cert-Ablauf via Script¶
#!/bin/bash
# check_cert_expiry.sh — argument: domain
DOMAIN="$1"
END=$(echo | openssl s_client -servername "$DOMAIN" -connect "$DOMAIN:443" 2>/dev/null | \
openssl x509 -noout -enddate | cut -d= -f2)
END_EPOCH=$(date -d "$END" +%s)
NOW_EPOCH=$(date +%s)
DAYS=$(( (END_EPOCH - NOW_EPOCH) / 86400 ))
if [ "$DAYS" -lt 7 ]; then
echo "CRITICAL - $DOMAIN läuft in $DAYS Tagen ab | days=$DAYS"
exit 2
elif [ "$DAYS" -lt 21 ]; then
echo "WARNING - $DOMAIN läuft in $DAYS Tagen ab | days=$DAYS"
exit 1
fi
echo "OK - $DOMAIN noch $DAYS Tage gültig | days=$DAYS"
exit 0
Aufruf: Script ohne Argumente speichern und als agent_script-Service mit args: ["example.com"] (in check_config) konfigurieren.
Script duplizieren¶
Builtin-Scripts duplizieren erzeugt eine Custom-Kopie:
/scripts → Builtin-Eintrag → Duplizieren → editieren → speichern.
Script löschen¶
Wenn Services aktuell auf das Script verweisen, blockiert der Delete-Endpoint mit einer Liste der Verweise. Erst die Services umstellen, dann löschen.
Audit¶
Script-Änderungen landen mit track_change im Audit-Log — alte und neue Werte als JSONB-Diff. Sichtbar in Admin → Audit-Log mit Filter target_kind = monitoring_script.
Anschluss¶
- Check-Typen-Referenz — wie Scripts an Services hängen
- Rollen & Permissions — Permission
script.create