proxmox-check hinzugefügt
This commit is contained in:
+214
@@ -0,0 +1,214 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def run(cmd):
|
||||||
|
try:
|
||||||
|
return subprocess.check_output(
|
||||||
|
cmd,
|
||||||
|
shell=True,
|
||||||
|
text=True,
|
||||||
|
stderr=subprocess.DEVNULL
|
||||||
|
).strip()
|
||||||
|
except Exception:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
# Proxmox Version
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
px_version = run("pveversion")
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
# VMs
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
qm_list = run("qm list")
|
||||||
|
lines = qm_list.splitlines()
|
||||||
|
|
||||||
|
# Header entfernen
|
||||||
|
vm_lines = lines[1:] if len(lines) > 1 else []
|
||||||
|
|
||||||
|
px_vms_sum = len(vm_lines)
|
||||||
|
px_vms_started = sum(1 for l in vm_lines if "running" in l.lower())
|
||||||
|
px_vms_stopped = sum(1 for l in vm_lines if "stopped" in l.lower())
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
# Updates
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
apt_out = run("apt list --upgradable 2>/dev/null")
|
||||||
|
|
||||||
|
updates = apt_out.splitlines()[1:] if apt_out else []
|
||||||
|
|
||||||
|
supdates = sum(1 for l in updates if "security" in l.lower())
|
||||||
|
nupdates = len(updates) - supdates
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
# Kernel / Reboot
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
kernel = run("uname -r")
|
||||||
|
|
||||||
|
latest_kernel = run(
|
||||||
|
"ls -t /boot/vmlinuz-* 2>/dev/null | head -n1"
|
||||||
|
).replace("/boot/vmlinuz-", "")
|
||||||
|
|
||||||
|
reboot = 0
|
||||||
|
|
||||||
|
if os.path.exists("/var/run/reboot-required"):
|
||||||
|
reboot = 1
|
||||||
|
|
||||||
|
if kernel and latest_kernel and kernel != latest_kernel:
|
||||||
|
reboot = 1
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
# Netzwerk
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
iface = run(
|
||||||
|
"ip route | awk '/default/ {print $5; exit}'"
|
||||||
|
)
|
||||||
|
|
||||||
|
ip_addr = run(
|
||||||
|
f"ip -4 addr show {iface} | awk '/inet / {{print $2}}' | cut -d/ -f1"
|
||||||
|
)
|
||||||
|
|
||||||
|
gateway = run(
|
||||||
|
"ip route | awk '/default/ {print $3; exit}'"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
# Sensors
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
sensor_out = run("sensors")
|
||||||
|
perfdata = []
|
||||||
|
|
||||||
|
prefix = ""
|
||||||
|
|
||||||
|
for raw_line in sensor_out.splitlines():
|
||||||
|
|
||||||
|
line = raw_line.strip()
|
||||||
|
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Adapter-Zeilen ignorieren
|
||||||
|
if line.startswith("Adapter:"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Klammer-/Infozeilen ignorieren
|
||||||
|
if line.startswith("("):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Chipnamen erkennen
|
||||||
|
if ":" not in line and "°C" not in line:
|
||||||
|
prefix = re.sub(r"[^A-Za-z0-9_-]", "_", line)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Nur Temperaturzeilen verarbeiten
|
||||||
|
if "°C" not in line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if ":" not in line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
key, values = line.split(":", 1)
|
||||||
|
|
||||||
|
key = key.strip()
|
||||||
|
|
||||||
|
# Sensorname säubern
|
||||||
|
key = re.sub(r"\s+", "_", key)
|
||||||
|
key = re.sub(r"[^A-Za-z0-9_-]", "", key)
|
||||||
|
|
||||||
|
# Problematische Sensoren ignorieren
|
||||||
|
if key in ["PECIAgent1", "AUXTIN"]:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Temperaturwert extrahieren
|
||||||
|
val_match = re.search(r"[-+]?\d+(\.\d+)?", values)
|
||||||
|
|
||||||
|
if not val_match:
|
||||||
|
continue
|
||||||
|
|
||||||
|
value = val_match.group(0)
|
||||||
|
|
||||||
|
metric = f"{prefix}-{key}"
|
||||||
|
|
||||||
|
# Final säubern
|
||||||
|
metric = re.sub(r"[^A-Za-z0-9_-]", "_", metric)
|
||||||
|
|
||||||
|
# Doppelte Unterstriche reduzieren
|
||||||
|
metric = re.sub(r"_+", "_", metric)
|
||||||
|
|
||||||
|
perfdata.append(
|
||||||
|
f"{metric}={value};100;120"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Local Check Output
|
||||||
|
if perfdata:
|
||||||
|
temp_output = "P Proxmox_LMsensors " + "|".join(perfdata)
|
||||||
|
else:
|
||||||
|
temp_output = "0 Proxmox_LMsensors - Keine Sensordaten gefunden"
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
# Patchstatus
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
patch_status = 0
|
||||||
|
|
||||||
|
if reboot > 0:
|
||||||
|
patch_status = 1
|
||||||
|
|
||||||
|
if supdates > 0:
|
||||||
|
patch_status = 2
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
# Output
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"0 Proxmox_Version "
|
||||||
|
f"Version={px_version} "
|
||||||
|
f"- Version OK"
|
||||||
|
)
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"0 Proxmox_VMs "
|
||||||
|
f"Started={px_vms_started}|"
|
||||||
|
f"Stopped={px_vms_stopped}|"
|
||||||
|
f"Total={px_vms_sum} "
|
||||||
|
f"- {px_vms_started} von {px_vms_sum} VMs laufen"
|
||||||
|
)
|
||||||
|
|
||||||
|
print(temp_output)
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"0 Proxmox_Network "
|
||||||
|
f"- IP: {ip_addr}, "
|
||||||
|
f"Gateway: {gateway}, "
|
||||||
|
f"Interface: {iface}"
|
||||||
|
)
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"{patch_status} Proxmox-Patchstatus "
|
||||||
|
f"SecurityUpdates={supdates}|"
|
||||||
|
f"RegularUpdates={nupdates}|"
|
||||||
|
f"Reboot={reboot} "
|
||||||
|
f"- Security: {supdates}, "
|
||||||
|
f"Updates: {nupdates}, "
|
||||||
|
f"Reboot: {reboot}"
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user