#!/usr/bin/env bash
set -euo pipefail
detect() {
    return 0
}

# Version eines installierten Pakets. Leer, wenn das Paket fehlt oder nur noch
# als Konfigurationsrest vorhanden ist ("rc" nach apt remove ohne purge) -
# dpkg-query liefert dort naemlich weiterhin eine Versionsnummer.
pkg_version() {
    local st ver
    read -r st ver < <(dpkg-query -W -f='${db:Status-Status} ${Version}\n' "$1" 2>/dev/null || echo "")
    [ "${st:-}" = "installed" ] || return 0
    printf '%s\n' "$ver"
}

virt=none
if systemd-detect-virt > /dev/null 2>&1 ; then
    virt=$(systemd-detect-virt)
fi
echo "<<<labels:sep(0)>>>"
echo "{\"machine/virtualization\": \"${virt}\"}"
if [ $virt == none ]; then
    ecc=$(dmidecode --type 16 | grep -m1 "Error Correction Type" | cut -d : -f 2)
    mb_name=$(dmidecode --type 2 | grep -m1 "Product Name" | cut -d: -f2)
    mb_manufacturer=$(dmidecode --type 2 | grep -m1 "Manufacturer" | cut -d: -f2)
    mb_serial=$(dmidecode --type 2 | grep -m1 "Serial Number" | cut -d: -f2)
    cpu_model=$(dmidecode --type 4 | grep -m1 "Version" | awk -F: '{gsub(/^[ \t]+|[ \t]+$/, "", $2); print $2}')
    echo "{\"machine/ecc\": \"${ecc:1}\"}"
    echo "{\"mainboard/manufacturer\": \"${mb_manufacturer:1}\"}"
    echo "{\"mainboard/product\": \"${mb_name:1}\"}"
    echo "{\"mainboard/serial\": \"${mb_serial:1}\"}"
    echo "{\"cpu/model\": \"${cpu_model}\"}"
fi
echo "{\"cpu/threads\": \"$(nproc)\"}"
source /etc/os-release
echo "{\"os/distribution\": \"${ID}\"}"
echo "{\"os/version\": \"${VERSION_ID}\"}"
echo "{\"os/codename\": \"${VERSION_CODENAME}\"}"

agent_version=$(pkg_version cmk-push-agent)
server_version=$(pkg_version cmk-push-server)

# Als Label zusaetzlich zum Service: damit laesst sich in CheckMK nach
# Agent-Version filtern, ohne den Servicetext auszuwerten.
[ -n "$agent_version" ]  && echo "{\"cmk/push-agent\": \"${agent_version}\"}"
[ -n "$server_version" ] && echo "{\"cmk/push-server\": \"${server_version}\"}"

echo "<<<local:sep(0)>>>"
echo "0 \"Last Execution\" - $(date '+%Y-%m-%d %H:%M:%S')"

if [ -n "$agent_version" ]; then
    echo "0 \"CMK Push Agent Version\" - OK - cmk-push-agent ${agent_version}"
else
    echo "1 \"CMK Push Agent Version\" - WARN - Paket cmk-push-agent nicht installiert (Agent laeuft ausserhalb der Paketverwaltung?)"
fi

# Der Server laeuft nur auf wenigen Hosts - fehlt das Paket, ist das kein
# Fehler, sondern der Normalfall. Deshalb nur melden, wenn vorhanden.
if [ -n "$server_version" ]; then
    echo "0 \"CMK Push Server Version\" - OK - cmk-push-server ${server_version}"
fi