From 92b7bff149345326c15f1e0f67a244a004ea0012 Mon Sep 17 00:00:00 2001 From: Ludovic Cartier Date: Fri, 19 Sep 2025 09:18:44 +0200 Subject: [PATCH] update check_disk_usage - handle inode, exclude & regex --- files/nrpe/check_disk_advanced | Bin 94128 -> 0 bytes files/nrpe/check_disk_usage | 200 +++++++++++++++++++-------------- 2 files changed, 114 insertions(+), 86 deletions(-) delete mode 100755 files/nrpe/check_disk_advanced diff --git a/files/nrpe/check_disk_advanced b/files/nrpe/check_disk_advanced deleted file mode 100755 index 34577688f46fa081991a965bc57f4ba3115e72ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94128 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 diff --git a/files/nrpe/check_disk_usage b/files/nrpe/check_disk_usage index a4ca113..b7d0a63 100755 --- a/files/nrpe/check_disk_usage +++ b/files/nrpe/check_disk_usage @@ -2,29 +2,37 @@ # # ============================================================================= # -# Nagios plugin to check disk space usage. +# Nagios plugin to check disk space and inode usage. # # Author: GitHub Copilot -# Version: 1.0 +# Version: 1.2 # # ============================================================================= # -# This script checks the disk space utilization of all mounted filesystems. +# This script checks both block and inode utilization of all mounted filesystems. # It is designed to be used as a Nagios/Icinga check command. # -# The script compares the percentage of used space against configurable -# warning and critical thresholds. If any filesystems exceed these thresholds, -# it will exit with the appropriate status and display a human-readable -# table of the problematic filesystems. +# The script compares usage percentages against configurable thresholds. +# It can also exclude specific mount points or filesystem types. # -# Thresholds are managed via the -w (warning) and -c (critical) flags. +# Block Usage Flags: +# -w <%>: Warning threshold for block usage. +# -c <%>: Critical threshold for block usage. +# +# Inode Usage Flags: +# -W <%>: Warning threshold for inode usage. +# -C <%>: Critical threshold for inode usage. +# +# Exclusion Flags (can be used multiple times): +# -e : Exclude a mount point by exact match (e.g., -e /tmp). +# -E : Exclude mount points matching a regex pattern (e.g., -E '/run/user/.*'). +# -x : Exclude a filesystem type (e.g., -x tmpfs). # # Nagios Exit Codes: -# 0 - OK: All filesystems are within thresholds. -# 1 - WARNING: One or more filesystems have exceeded the warning threshold. -# 2 - CRITICAL: One or more filesystems have exceeded the critical threshold. -# 3 - UNKNOWN: The script encountered an error (e.g., bad arguments or -# the 'df' command failed). +# 0 - OK: All checked filesystems are within thresholds. +# 1 - WARNING: Usage has exceeded a warning threshold. +# 2 - CRITICAL: Usage has exceeded a critical threshold. +# 3 - UNKNOWN: The script encountered an error. # # ============================================================================= @@ -34,115 +42,135 @@ WARNING=1 CRITICAL=2 UNKNOWN=3 -# Default Thresholds (in percentage) +# --- Defaults --- WARN_THRESHOLD=80 CRIT_THRESHOLD=90 +INODE_WARN_THRESHOLD=80 +INODE_CRIT_THRESHOLD=90 +declare -a EXCLUDE_MOUNTS +declare -a EXCLUDE_MOUNTS_REGEX +declare -a EXCLUDE_TYPES # --- Functions --- -# Function to display help/usage information usage() { - echo "Usage: $0 [-w ] [-c ]" - echo " -w: Warning threshold percentage (e.g., 80). Default: ${WARN_THRESHOLD}%" - echo " -c: Critical threshold percentage (e.g., 90). Default: ${CRIT_THRESHOLD}%" - echo " -h: Display this help message" + echo "Usage: $0 -w -c [-W ] [-C ] [-e ] [-E ] [-x ]" + echo " Block Usage Thresholds (%):" + echo " -w: Warning threshold. Default: ${WARN_THRESHOLD}%" + echo " -c: Critical threshold. Default: ${CRIT_THRESHOLD}%" + echo " Inode Usage Thresholds (%):" + echo " -W: Warning threshold. Default: ${INODE_WARN_THRESHOLD}%" + echo " -C: Critical threshold. Default: ${INODE_CRIT_THRESHOLD}%" + echo " Exclusions (can be specified multiple times):" + echo " -e: Mount point to exclude by exact match (e.g., -e /tmp)." + echo " -E: Regex for mount points to exclude (e.g., -E '/run/user/.*')." + echo " -x: Filesystem type to exclude (e.g., -x tmpfs)." + echo " Help:" + echo " -h: Display this help message." exit $UNKNOWN } # --- Argument Parsing --- - -while getopts "w:c:h" opt; do - case ${opt} in - w) - WARN_THRESHOLD=${OPTARG} - ;; - c) - CRIT_THRESHOLD=${OPTARG} - ;; - h) - usage - ;; - *) - usage - ;; +while [[ $# -gt 0 ]]; do + case "$1" in + -w) WARN_THRESHOLD="$2"; shift 2 ;; + -c) CRIT_THRESHOLD="$2"; shift 2 ;; + -W) INODE_WARN_THRESHOLD="$2"; shift 2 ;; + -C) INODE_CRIT_THRESHOLD="$2"; shift 2 ;; + -e) EXCLUDE_MOUNTS+=("$2"); shift 2 ;; + -E) EXCLUDE_MOUNTS_REGEX+=("$2"); shift 2 ;; + -x) EXCLUDE_TYPES+=("$2"); shift 2 ;; + -h) usage ;; + *) echo "Unknown option: $1"; usage ;; esac done -# Validate that thresholds are numbers -if ! [[ "$WARN_THRESHOLD" =~ ^[0-9]+$ ]] || ! [[ "$CRIT_THRESHOLD" =~ ^[0-9]+$ ]]; then - echo "UNKNOWN: Warning and critical thresholds must be integers." - exit $UNKNOWN -fi - # --- Main Logic --- -# Final exit status, assuming OK until a problem is found final_status=$OK -# Summary message for the first line of output summary_message="OK: All filesystems are within thresholds." +declare -a critical_alerts +declare -a warning_alerts +declare -A inode_usage_map -# Arrays to store problematic filesystems -declare -a critical_filesystems -declare -a warning_filesystems +# 1. Get inode usage and store it in a map +df_inode_output=$(df -iP) +if [ $? -ne 0 ]; then echo "UNKNOWN: 'df -iP' failed."; exit $UNKNOWN; fi -# Get the disk usage data. Exit if the command fails. -df_output=$(df -hP) -if [ $? -ne 0 ]; then - echo "UNKNOWN: 'df -hP' command failed to execute." - exit $UNKNOWN -fi - - -# Use process substitution to read df output line by line, skipping the header -# This avoids creating a subshell for the loop, so variables can be modified. while read -r line; do - # Extract usage percentage and mount point - usage_percent=$(echo "$line" | awk '{print $5}' | sed 's/%//') - - # Skip non-numeric usage percentages (e.g., for certain pseudo-filesystems) - if ! [[ "$usage_percent" =~ ^[0-9]+$ ]]; then - continue + [ -z "$line" ] && continue + mount_point=$(echo "$line" | awk '{print $6}') + iuse_percent=$(echo "$line" | awk '{print $5}' | sed 's/%//') + if [[ "$mount_point" && "$iuse_percent" =~ ^[0-9]+$ ]]; then + inode_usage_map["$mount_point"]=$iuse_percent fi +done < <(echo "${df_inode_output}" | tail -n +2) - # Check against thresholds - if [ "$usage_percent" -ge "$CRIT_THRESHOLD" ]; then - critical_filesystems+=("$line") +# 2. Get block usage and perform checks +df_block_output=$(df -hPT) +if [ $? -ne 0 ]; then echo "UNKNOWN: 'df -hPT' failed."; exit $UNKNOWN; fi + +while read -r line; do + [ -z "$line" ] && continue + + fs_type=$(echo "$line" | awk '{print $2}') + block_percent=$(echo "$line" | awk '{print $6}' | sed 's/%//') + mount_point=$(echo "$line" | awk '{print $7}') + + # --- Exclusion Logic --- + is_excluded=false + # a) Check for exact mount point match + for excluded_mount in "${EXCLUDE_MOUNTS[@]}"; do + if [[ "$mount_point" == "$excluded_mount" ]]; then is_excluded=true; break; fi + done + [ "$is_excluded" = true ] && continue + + # b) Check for regex mount point match + for pattern in "${EXCLUDE_MOUNTS_REGEX[@]}"; do + if [[ "$mount_point" =~ $pattern ]]; then is_excluded=true; break; fi + done + [ "$is_excluded" = true ] && continue + + # c) Check for filesystem type match + for excluded_type in "${EXCLUDE_TYPES[@]}"; do + if [[ "$fs_type" == "$excluded_type" ]]; then is_excluded=true; break; fi + done + [ "$is_excluded" = true ] && continue + + # --- Threshold Checks --- + inode_percent=${inode_usage_map["$mount_point"]} + + if [[ "$block_percent" =~ ^[0-9]+$ && "$block_percent" -ge "$CRIT_THRESHOLD" ]] || \ + [[ "$inode_percent" =~ ^[0-9]+$ && "$inode_percent" -ge "$INODE_CRIT_THRESHOLD" ]]; then + critical_alerts+=("$line") final_status=$CRITICAL summary_message="CRITICAL: Filesystem usage has exceeded critical threshold." - elif [ "$usage_percent" -ge "$WARN_THRESHOLD" ]; then - warning_filesystems+=("$line") + elif [[ "$block_percent" =~ ^[0-9]+$ && "$block_percent" -ge "$WARN_THRESHOLD" ]] || \ + [[ "$inode_percent" =~ ^[0-9]+$ && "$inode_percent" -ge "$INODE_WARN_THRESHOLD" ]]; then + warning_alerts+=("$line") if [ "$final_status" -ne "$CRITICAL" ]; then final_status=$WARNING summary_message="WARNING: Filesystem usage has exceeded warning threshold." fi fi -done < <(echo "${df_output}" | tail -n +2) - +done < <(echo "${df_block_output}" | tail -n +2) # --- Output Generation --- -# Print the one-line summary for Nagios echo "$summary_message" -# If there are any issues, print the detailed table if [ "$final_status" -ne "$OK" ]; then - echo "" # Add a newline for better formatting - printf "%-30s %-10s %-10s %-10s %-10s %-30s\n" "Filesystem" "Size" "Used" "Avail" "Use%" "Mounted on" - printf "%s\n" "---------------------------------------------------------------------------------------------------------------" + echo "" + printf "%-30s %-15s %-10s %-10s %-10s %-10s %-10s %-30s\n" "Filesystem" "Type" "Size" "Used" "Avail" "Use%" "IUse%" "Mounted on" + printf "%s\n" "----------------------------------------------------------------------------------------------------------------------------------" - # Print critical filesystems - if [ ${#critical_filesystems[@]} -gt 0 ]; then - for item in "${critical_filesystems[@]}"; do - printf "%-30s %-10s %-10s %-10s %-10s %-30s\n" $(echo "$item") - done - fi - - # Print warning filesystems - if [ ${#warning_filesystems[@]} -gt 0 ]; then - for item in "${warning_filesystems[@]}"; do - printf "%-30s %-10s %-10s %-10s %-10s %-30s\n" $(echo "$item") - done - fi + all_alerts=("${critical_alerts[@]}" "${warning_alerts[@]}") + for item in "${all_alerts[@]}"; do + mount_point=$(echo "$item" | awk '{print $7}') + inode_percent=${inode_usage_map["$mount_point"]:-"N/A"} + formatted_item=$(echo "$item" | awk -v iuse="$inode_percent%" '{printf "%-30s %-15s %-10s %-10s %-10s %-10s %-10s %-30s", $1, $2, $3, $4, $5, $6, iuse, $7}') + echo "$formatted_item" + done fi exit $final_status