Files
checkmk_monintoring/CheckMK Agents/Linux/check_npm
T
2026-09-13 10:08:10 +02:00

440 lines
11 KiB
Bash

#!/bin/bash
# /usr/lib/check_mk_agent/local/300/check_npm
set -u
CONFIG="/etc/check_mk/npm.conf"
OK=0
WARN=1
CRIT=2
UNKNOWN=3
#
# ---------------------------------------------------------------------------
# Configuration
# ---------------------------------------------------------------------------
#
if [[ ! -r "$CONFIG" ]]; then
printf '%s\n' \
"${UNKNOWN} \"Nginx Proxy Manager\" - Configuration file ${CONFIG} missing or unreadable"
exit 0
fi
# shellcheck disable=SC1090
source "$CONFIG"
NPM_URL="${NPM_URL:-http://127.0.0.1:81}"
NPM_IDENTITY="${NPM_IDENTITY:-}"
NPM_SECRET="${NPM_SECRET:-}"
CHECK_UPDATES="${CHECK_UPDATES:-yes}"
NPM_RELEASE_API="${NPM_RELEASE_API:-https://api.github.com/repos/NginxProxyManager/nginx-proxy-manager/releases/latest}"
#
# ---------------------------------------------------------------------------
# Requirements
# ---------------------------------------------------------------------------
#
if ! command -v curl >/dev/null 2>&1; then
printf '%s\n' \
"${UNKNOWN} \"Nginx Proxy Manager\" - curl is not installed"
exit 0
fi
if ! command -v jq >/dev/null 2>&1; then
printf '%s\n' \
"${UNKNOWN} \"Nginx Proxy Manager\" - jq is not installed"
exit 0
fi
if [[ -z "$NPM_IDENTITY" || -z "$NPM_SECRET" ]]; then
printf '%s\n' \
"${UNKNOWN} \"Nginx Proxy Manager\" - NPM_IDENTITY or NPM_SECRET is not configured"
exit 0
fi
#
# ---------------------------------------------------------------------------
# curl configuration
# ---------------------------------------------------------------------------
#
CURL_OPTS=(
--silent
--show-error
--fail
--connect-timeout 3
--max-time 10
)
#
# ---------------------------------------------------------------------------
# Public API health / installed version
# ---------------------------------------------------------------------------
#
STATUS_RESPONSE="$(
curl \
"${CURL_OPTS[@]}" \
"${NPM_URL%/}/api/" \
2>/dev/null
)"
STATUS_RC=$?
if [[ $STATUS_RC -ne 0 || -z "$STATUS_RESPONSE" ]]; then
printf '%s\n' \
"${CRIT} \"Nginx Proxy Manager\" - API unavailable at ${NPM_URL}"
exit 0
fi
if ! printf '%s' "$STATUS_RESPONSE" |
jq -e 'type == "object"' >/dev/null 2>&1
then
printf '%s\n' \
"${UNKNOWN} \"Nginx Proxy Manager\" - Public API returned unexpected data"
exit 0
fi
API_STATUS="$(
printf '%s' "$STATUS_RESPONSE" |
jq -r '.status // empty'
)"
SETUP_COMPLETE="$(
printf '%s' "$STATUS_RESPONSE" |
jq -r '.setup // false'
)"
VERSION_MAJOR="$(
printf '%s' "$STATUS_RESPONSE" |
jq -r '.version.major // empty'
)"
VERSION_MINOR="$(
printf '%s' "$STATUS_RESPONSE" |
jq -r '.version.minor // empty'
)"
VERSION_REVISION="$(
printf '%s' "$STATUS_RESPONSE" |
jq -r '.version.revision // empty'
)"
INSTALLED_VERSION=""
if [[ -n "$VERSION_MAJOR" && -n "$VERSION_MINOR" && -n "$VERSION_REVISION" ]]; then
INSTALLED_VERSION="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}"
fi
if [[ "$API_STATUS" != "OK" ]]; then
printf '%s\n' \
"${CRIT} \"Nginx Proxy Manager\" - API responded with status ${API_STATUS:-unknown}"
exit 0
fi
if [[ "$SETUP_COMPLETE" != "true" ]]; then
printf '%s\n' \
"${WARN} \"Nginx Proxy Manager\" - API reachable but initial setup is incomplete"
else
if [[ -n "$INSTALLED_VERSION" ]]; then
printf '%s\n' \
"${OK} \"Nginx Proxy Manager\" - API reachable, version ${INSTALLED_VERSION}"
else
printf '%s\n' \
"${OK} \"Nginx Proxy Manager\" - API reachable"
fi
fi
#
# ---------------------------------------------------------------------------
# Update check
# ---------------------------------------------------------------------------
#
if [[ "$CHECK_UPDATES" == "yes" ]]; then
RELEASE_RESPONSE="$(
curl \
"${CURL_OPTS[@]}" \
-H "Accept: application/vnd.github+json" \
-H "User-Agent: checkmk-npm-local-check" \
"$NPM_RELEASE_API" \
2>/dev/null
)"
RELEASE_RC=$?
if [[ $RELEASE_RC -ne 0 || -z "$RELEASE_RESPONSE" ]]; then
printf '%s\n' \
"${UNKNOWN} \"NPM Update\" - Installed ${INSTALLED_VERSION:-unknown}, unable to query GitHub releases"
elif ! printf '%s' "$RELEASE_RESPONSE" |
jq -e 'type == "object"' >/dev/null 2>&1
then
printf '%s\n' \
"${UNKNOWN} \"NPM Update\" - GitHub release API returned unexpected data"
else
LATEST_VERSION="$(
printf '%s' "$RELEASE_RESPONSE" |
jq -r '.tag_name // empty'
)"
LATEST_VERSION="${LATEST_VERSION#v}"
if [[ -z "$LATEST_VERSION" ]]; then
printf '%s\n' \
"${UNKNOWN} \"NPM Update\" - Unable to determine latest release"
elif [[ -z "$INSTALLED_VERSION" ]]; then
printf '%s\n' \
"${UNKNOWN} \"NPM Update\" - Latest ${LATEST_VERSION}, installed version unknown"
else
NEWEST="$(
printf '%s\n%s\n' \
"$INSTALLED_VERSION" \
"$LATEST_VERSION" |
sort -V |
tail -n 1
)"
if [[ "$INSTALLED_VERSION" == "$LATEST_VERSION" ]]; then
printf '%s\n' \
"${OK} \"NPM Update\" - Current: installed ${INSTALLED_VERSION}, latest ${LATEST_VERSION}"
elif [[ "$NEWEST" == "$LATEST_VERSION" ]]; then
printf '%s\n' \
"${WARN} \"NPM Update\" - Update available: installed ${INSTALLED_VERSION}, latest ${LATEST_VERSION}"
else
printf '%s\n' \
"${OK} \"NPM Update\" - Installed ${INSTALLED_VERSION} is newer than latest ${LATEST_VERSION}"
fi
fi
fi
fi
#
# ---------------------------------------------------------------------------
# Authentication
# ---------------------------------------------------------------------------
#
LOGIN_PAYLOAD="$(
jq -n \
--arg identity "$NPM_IDENTITY" \
--arg secret "$NPM_SECRET" \
'{
identity: $identity,
secret: $secret
}'
)"
TOKEN_RESPONSE="$(
curl \
"${CURL_OPTS[@]}" \
-X POST \
-H "Content-Type: application/json" \
-d "$LOGIN_PAYLOAD" \
"${NPM_URL%/}/api/tokens" \
2>/dev/null
)"
TOKEN_RC=$?
if [[ $TOKEN_RC -ne 0 || -z "$TOKEN_RESPONSE" ]]; then
printf '%s\n' \
"${CRIT} \"NPM Proxy Hosts\" - API reachable but authentication failed"
exit 0
fi
if ! printf '%s' "$TOKEN_RESPONSE" |
jq -e 'type == "object"' >/dev/null 2>&1
then
printf '%s\n' \
"${UNKNOWN} \"NPM Proxy Hosts\" - Authentication API returned unexpected data"
exit 0
fi
TOKEN="$(
printf '%s' "$TOKEN_RESPONSE" |
jq -r '.token // empty'
)"
TOKEN_EXPIRES="$(
printf '%s' "$TOKEN_RESPONSE" |
jq -r '.expires // empty'
)"
if [[ -z "$TOKEN" ]]; then
printf '%s\n' \
"${CRIT} \"NPM Proxy Hosts\" - Authentication response did not contain a token"
exit 0
fi
#
# ---------------------------------------------------------------------------
# Proxy host inventory
# ---------------------------------------------------------------------------
#
HOSTS_RESPONSE="$(
curl \
"${CURL_OPTS[@]}" \
-H "Authorization: Bearer ${TOKEN}" \
"${NPM_URL%/}/api/nginx/proxy-hosts" \
2>/dev/null
)"
HOSTS_RC=$?
if [[ $HOSTS_RC -ne 0 || -z "$HOSTS_RESPONSE" ]]; then
printf '%s\n' \
"${CRIT} \"NPM Proxy Hosts\" - Unable to retrieve proxy hosts"
exit 0
fi
if ! printf '%s' "$HOSTS_RESPONSE" |
jq -e 'type == "array"' >/dev/null 2>&1
then
printf '%s\n' \
"${UNKNOWN} \"NPM Proxy Hosts\" - Proxy host API returned unexpected data"
exit 0
fi
TOTAL_HOSTS="$(
printf '%s' "$HOSTS_RESPONSE" |
jq 'length'
)"
ENABLED_HOSTS="$(
printf '%s' "$HOSTS_RESPONSE" |
jq '[.[] | select(.enabled == true)] | length'
)"
DISABLED_HOSTS="$(
printf '%s' "$HOSTS_RESPONSE" |
jq '[.[] | select(.enabled != true)] | length'
)"
ONLINE_HOSTS="$(
printf '%s' "$HOSTS_RESPONSE" |
jq '
[
.[]
| select(
.enabled == true
and
(.meta.nginx_online == true)
)
]
| length
'
)"
ERROR_HOSTS="$(
printf '%s' "$HOSTS_RESPONSE" |
jq '
[
.[]
| select(
.enabled == true
and
(
.meta.nginx_online != true
or
.meta.nginx_err != null
)
)
]
| length
'
)"
#
# ---------------------------------------------------------------------------
# Broken host details
# ---------------------------------------------------------------------------
#
ERROR_LIST="$(
printf '%s' "$HOSTS_RESPONSE" |
jq -r '
.[]
| select(
.enabled == true
and
(
.meta.nginx_online != true
or
.meta.nginx_err != null
)
)
|
(
(.domain_names | join(","))
+
" -> "
+
(.forward_scheme // "http")
+
"://"
+
(.forward_host // "unknown")
+
":"
+
((.forward_port // 0) | tostring)
+
(
if .meta.nginx_err != null
then " (" + (.meta.nginx_err | tostring) + ")"
else ""
end
)
)
' |
paste -sd ';' -
)"
STATE=$OK
if [[ "$ERROR_HOSTS" -gt 0 ]]; then
STATE=$CRIT
fi
PERFDATA="total=${TOTAL_HOSTS};;;0|enabled=${ENABLED_HOSTS};;;0|disabled=${DISABLED_HOSTS};;;0|online=${ONLINE_HOSTS};;;0|errors=${ERROR_HOSTS};;;0"
DETAILS="${ENABLED_HOSTS}/${TOTAL_HOSTS} enabled, ${ONLINE_HOSTS} online"
if [[ "$DISABLED_HOSTS" -gt 0 ]]; then
DETAILS="${DETAILS}, ${DISABLED_HOSTS} disabled"
fi
if [[ "$ERROR_HOSTS" -gt 0 ]]; then
DETAILS="${DETAILS}, ${ERROR_HOSTS} with nginx errors"
fi
if [[ -n "$ERROR_LIST" ]]; then
DETAILS="${DETAILS}: ${ERROR_LIST}"
fi
printf '%s\n' \
"${STATE} \"NPM Proxy Hosts\" ${PERFDATA} ${DETAILS}"
exit 0