Zum Inhalt

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-Files
  • check_disk_smart — Bash, ruft smartctl auf
  • check_iis_pool — PowerShell, Application-Pool-Status
  • check_systemd_failed — Bash, listet failed units

Builtin-Scripts können dupliziert werden — die Kopie landet als Custom-Script und ist frei editierbar.

Script anlegen

/scriptsNeu:

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:

STATUS - Beschreibung | label1=value;warn;crit label2=value

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