Add Checkmk OS info plugin
This commit is contained in:
1 parent
f90b81606d
commit
11ce8a4615
10 files changed
+334
No files matched your search
@@ -0,0 +1 @@
|
|||||||
|
.DS_Store
|
||||||
@@ -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
|
||||||
@@ -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.
|
||||||
@@ -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/...`.
|
||||||
@@ -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
|
||||||
|
<<<os_info:sep(9)>>>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 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 '^<<<os_info'
|
||||||
|
```
|
||||||
|
|
||||||
|
Danach die Service-Erkennung ausführen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmk -vI HOSTNAME
|
||||||
|
cmk -R
|
||||||
|
```
|
||||||
|
|
||||||
|
Anschließend erscheint beim Host der Service:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Betriebssystem
|
||||||
|
```
|
||||||
|
|
||||||
|
## Fehlersuche
|
||||||
|
|
||||||
|
Installierte Dateien des MKP suchen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
find ~/local -type f -name 'os_info*'
|
||||||
|
```
|
||||||
|
|
||||||
|
Status des Pakets:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkp list
|
||||||
|
```
|
||||||
|
|
||||||
|
Agent-Ausgabe kontrollieren:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmk -d HOSTNAME | grep -A2 '^<<<os_info'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Kompatibilität
|
||||||
|
|
||||||
|
Entwickelt für:
|
||||||
|
|
||||||
|
- Checkmk Community 2.5.x
|
||||||
|
- Check API V2
|
||||||
|
- Linux-Agent
|
||||||
|
- Windows-Agent
|
||||||
|
|
||||||
|
Aktuelle Paketversion: **1.0.0**
|
||||||
|
|
||||||
|
## Lizenz
|
||||||
|
|
||||||
|
GPL-2.0
|
||||||
Vendored
BIN
Binary file not shown.
Executable
+48
@@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Checkmk agent plug-in: operating system information
|
||||||
|
# Output is tab-separated for safe parsing.
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
name=""
|
||||||
|
version=""
|
||||||
|
os_id=""
|
||||||
|
version_id=""
|
||||||
|
pretty=""
|
||||||
|
arch="$(uname -m 2>/dev/null || echo unknown)"
|
||||||
|
kernel="$(uname -r 2>/dev/null || echo unknown)"
|
||||||
|
|
||||||
|
if [ -r /etc/os-release ]; then
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
. /etc/os-release
|
||||||
|
name="${NAME:-}"
|
||||||
|
version="${VERSION:-}"
|
||||||
|
os_id="${ID:-}"
|
||||||
|
version_id="${VERSION_ID:-}"
|
||||||
|
pretty="${PRETTY_NAME:-}"
|
||||||
|
elif command -v sw_vers >/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 '<<<os_info:sep(9)>>>\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")"
|
||||||
@@ -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 "<<<os_info:sep(9)>>>"
|
||||||
|
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))
|
||||||
@@ -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,
|
||||||
|
)
|
||||||
@@ -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 <<<os_info>>> vorhanden ist.
|
||||||
|
check:
|
||||||
|
Der Service ist OK und dient der übersichtlichen Anzeige der erkannten
|
||||||
|
Betriebssysteminformationen.
|
||||||
Reference in new issue
Block a user