#!/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