diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/os-info/CHANGELOG.md b/os-info/CHANGELOG.md new file mode 100644 index 0000000..852dfdd --- /dev/null +++ b/os-info/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +## 1.0.0 + +- Erste Version +- Checkmk Check API V2 +- Service `Betriebssystem` +- Linux/macOS Agent-Plug-in +- Windows PowerShell Agent-Plug-in +- Anzeige von Betriebssystem, Version/Build, Architektur und Kernel diff --git a/os-info/LICENSE b/os-info/LICENSE new file mode 100644 index 0000000..9c96f2e --- /dev/null +++ b/os-info/LICENSE @@ -0,0 +1,5 @@ +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +This project is distributed under the terms of the GNU General Public License version 2. +The complete license text is available from the Free Software Foundation. diff --git a/os-info/PROJECT.md b/os-info/PROJECT.md new file mode 100644 index 0000000..87bcbaf --- /dev/null +++ b/os-info/PROJECT.md @@ -0,0 +1,12 @@ +# Projektübersicht – Checkmk OS Info + +**Projekt:** Checkmk OS Info +**Version:** 1.0.0 +**Ziel:** Betriebssysteminformationen als eigenen Checkmk-Service pro Host anzeigen. +**Checkmk:** Community 2.5.x / Check API V2 + +Das Repository enthält den vollständigen Quellcode für Linux/macOS und Windows, +das Checkmk Check-Plug-in, die Checkman-Dokumentation sowie das fertige MKP unter `dist/`. + +Wichtig: MKP-Dateien werden im lokalen Site-Bereich installiert. Die Agent-Plug-ins liegen +daher nach Aktivierung unter `~/local/share/check_mk/agents/...`. diff --git a/os-info/README.md b/os-info/README.md new file mode 100644 index 0000000..49c88e0 --- /dev/null +++ b/os-info/README.md @@ -0,0 +1,161 @@ +# Checkmk OS Info + +MKP-Erweiterung für **Checkmk Community 2.5.x**, die auf überwachten Hosts einen eigenen Service **„Betriebssystem“** bereitstellt. + +## Funktionen + +Der Service zeigt unter anderem: + +- Betriebssystem bzw. Linux-Distribution +- Betriebssystem-Version / Windows-Build +- Architektur +- Kernel-Version +- OS-ID und Version-ID + +Unterstützt werden Linux, Windows und grundsätzlich auch macOS. + +## Repository-Struktur + +```text +checkmk-os-info/ +├── src/ +│ ├── agents/ +│ │ ├── plugins/ +│ │ │ └── os_info +│ │ └── windows/ +│ │ └── plugins/ +│ │ └── os_info.ps1 +│ └── cmk_addons_plugins/ +│ └── os_info/ +│ ├── agent_based/ +│ │ └── os_info.py +│ └── checkman/ +│ └── os_info +├── dist/ +│ └── os_info-1.0.0.mkp +├── CHANGELOG.md +├── LICENSE +└── README.md +``` + +## Installation des MKP + +Das fertige Paket befindet sich unter: + +```text +dist/os_info-1.0.0.mkp +``` + +Auf den Checkmk-Server kopieren und als Site-Benutzer installieren: + +```bash +mkp add /tmp/os_info-1.0.0.mkp +mkp enable os_info 1.0.0 +cmk -R +``` + +Kontrolle: + +```bash +mkp list +``` + +Der Eintrag `os_info` sollte als `Enabled (active on this site)` erscheinen. + +## Agent-Plug-in für Linux/macOS + +Nach Aktivierung des MKP liegt das Plug-in im lokalen Site-Verzeichnis: + +```text +~/local/share/check_mk/agents/plugins/os_info +``` + +Auf den Zielhost kopieren: + +```bash +scp ~/local/share/check_mk/agents/plugins/os_info \ +root@HOST:/usr/lib/check_mk_agent/plugins/os_info +``` + +Danach auf dem Zielhost: + +```bash +chmod 755 /usr/lib/check_mk_agent/plugins/os_info +/usr/lib/check_mk_agent/plugins/os_info +``` + +Die Ausgabe muss mit folgender Sektion beginnen: + +```text +<<>> +``` + +## Agent-Plug-in für Windows + +Nach Aktivierung liegt die PowerShell-Datei auf dem Checkmk-Server unter: + +```text +~/local/share/check_mk/agents/windows/plugins/os_info.ps1 +``` + +Auf dem Windows-Host nach folgendem Verzeichnis kopieren: + +```text +C:\ProgramData\checkmk\agent\plugins\os_info.ps1 +``` + +## Service Discovery + +Auf dem Checkmk-Server zunächst prüfen, ob die Agent-Sektion ankommt: + +```bash +cmk -d HOSTNAME | grep -A2 '^<</dev/null 2>&1; then + name="macOS" + version="$(sw_vers -productVersion 2>/dev/null || true)" + os_id="macos" + version_id="$version" + pretty="macOS $version" +else + name="$(uname -s 2>/dev/null || echo unknown)" + version="$kernel" + os_id="$(printf '%s' "$name" | tr '[:upper:]' '[:lower:]')" + version_id="$version" + pretty="$name $version" +fi + +sanitize() { + printf '%s' "$1" | tr '\t\r\n' ' ' +} + +printf '<<>>\n' +printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ + "$(sanitize "$name")" \ + "$(sanitize "$version")" \ + "$(sanitize "$os_id")" \ + "$(sanitize "$version_id")" \ + "$(sanitize "$pretty")" \ + "$(sanitize "$arch")" \ + "$(sanitize "$kernel")" diff --git a/os-info/src/agents/windows/plugins/os_info.ps1 b/os-info/src/agents/windows/plugins/os_info.ps1 new file mode 100644 index 0000000..dff2a05 --- /dev/null +++ b/os-info/src/agents/windows/plugins/os_info.ps1 @@ -0,0 +1,23 @@ +# Checkmk agent plug-in: operating system information +$ErrorActionPreference = "SilentlyContinue" + +$os = Get-CimInstance -ClassName Win32_OperatingSystem +$arch = $env:PROCESSOR_ARCHITECTURE +if ($os.OSArchitecture) { $arch = $os.OSArchitecture } + +$name = [string]$os.Caption +$version = [string]$os.Version +$osId = "windows" +$versionId = [string]$os.BuildNumber +$pretty = "$($os.Caption) (Build $($os.BuildNumber))" +$kernel = [string]$os.Version + +function Clean([string]$Value) { + if ($null -eq $Value) { return "" } + return ($Value -replace "[`t`r`n]", " ") +} + +Write-Output "<<>>" +Write-Output ("{0}`t{1}`t{2}`t{3}`t{4}`t{5}`t{6}" -f ` + (Clean $name), (Clean $version), (Clean $osId), (Clean $versionId), ` + (Clean $pretty), (Clean $arch), (Clean $kernel)) diff --git a/os-info/src/cmk_addons_plugins/os_info/agent_based/os_info.py b/os-info/src/cmk_addons_plugins/os_info/agent_based/os_info.py new file mode 100644 index 0000000..137eddb --- /dev/null +++ b/os-info/src/cmk_addons_plugins/os_info/agent_based/os_info.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +from collections.abc import Mapping, Sequence + +from cmk.agent_based.v2 import AgentSection, CheckPlugin, Result, Service, State, StringTable + + +Section = Mapping[str, str] + + +def parse_os_info(string_table: StringTable) -> Section: + if not string_table: + return {} + + row: Sequence[str] = string_table[0] + fields = ("name", "version", "id", "version_id", "pretty", "architecture", "kernel") + values = list(row) + [""] * max(0, len(fields) - len(row)) + return dict(zip(fields, values[: len(fields)])) + + +def discover_os_info(section: Section): + if section: + yield Service() + + +def check_os_info(section: Section): + pretty = section.get("pretty") or section.get("name") or "Unbekannt" + architecture = section.get("architecture") or "unbekannt" + kernel = section.get("kernel") or "unbekannt" + + yield Result( + state=State.OK, + summary=f"{pretty}, Architektur: {architecture}", + details=( + f"Betriebssystem: {pretty}\n" + f"Name: {section.get('name', '')}\n" + f"Version: {section.get('version', '')}\n" + f"OS-ID: {section.get('id', '')}\n" + f"Version-ID/Build: {section.get('version_id', '')}\n" + f"Architektur: {architecture}\n" + f"Kernel: {kernel}" + ), + ) + + +agent_section_os_info = AgentSection( + name="os_info", + parse_function=parse_os_info, +) + +check_plugin_os_info = CheckPlugin( + name="os_info", + service_name="Betriebssystem", + discovery_function=discover_os_info, + check_function=check_os_info, +) diff --git a/os-info/src/cmk_addons_plugins/os_info/checkman/os_info b/os-info/src/cmk_addons_plugins/os_info/checkman/os_info new file mode 100644 index 0000000..ece46de --- /dev/null +++ b/os-info/src/cmk_addons_plugins/os_info/checkman/os_info @@ -0,0 +1,19 @@ +title: Betriebssystem +agents: check_mk +catalog: operating_system +license: GPLv2 +distribution: check_mk +description: + Dieses Plug-in erzeugt pro Host den Service "Betriebssystem". + Angezeigt werden Betriebssystem/Distribution, Version bzw. Build, + Architektur und Kernel-Version. + + Der mitgelieferte Agent-Plug-in muss auf den überwachten Linux-, macOS- + oder Windows-Systemen installiert werden. +item: + Kein Item. Pro Host wird genau ein Service erzeugt. +discovery: + Ein Service wird erkannt, sobald die Agent-Sektion <<>> vorhanden ist. +check: + Der Service ist OK und dient der übersichtlichen Anzeige der erkannten + Betriebssysteminformationen.