revue de l'option reset du check_reboot_required (ajout d'un fichier d'exclusion)

This commit is contained in:
Ludovic Cartier
2026-05-23 11:38:21 +02:00
parent 80d5d98c9d
commit a4d214e451
+66 -43
View File
@@ -4,18 +4,21 @@
# #
# Supported distributions: # Supported distributions:
# - Debian / Ubuntu : checks /run/reboot-required (written by unattended-upgrades # - Debian / Ubuntu : checks /run/reboot-required (written by unattended-upgrades
# or update-notifier after kernel/libc upgrades) # or update-notifier after kernel/libc upgrades), then falls back to comparing
# the running kernel with the latest installed kernel package.
# #
# Exit codes: # Exit codes:
# 0 - OK : No reboot required. # 0 - OK : No reboot required (or alert acknowledged).
# 1 - WARNING : (not used) # 1 - WARNING : (not used)
# 2 - CRITICAL : System needs to be rebooted. # 2 - CRITICAL : System needs to be rebooted.
# 3 - UNKNOWN : Cannot determine reboot status. # 3 - UNKNOWN : Cannot determine reboot status.
# #
# Usage: check_reboot_required [-v] [-r] # Usage: check_reboot_required [-v] [-r] [-f <ack_file>]
# -v Verbose: also print the list of packages that triggered the requirement. # -v Verbose: also print the list of packages that triggered the requirement.
# -r Reset: remove /run/reboot-required (and .pkgs) to clear the alert. # -r Acknowledge: create the ack file to suppress the alert until next reboot.
# Requires root privileges (or sudo). # The ack file is auto-removed once no reboot is needed anymore.
# -f Path to the acknowledgement file
# (default: /var/lib/nagios/reboot_required_ack).
# #
# --- Nagios exit codes --- # --- Nagios exit codes ---
@@ -25,30 +28,28 @@ STATE_CRITICAL=2
STATE_UNKNOWN=3 STATE_UNKNOWN=3
VERBOSE=0 VERBOSE=0
RESET=0 ACK=0
ACK_FILE="/var/lib/nagios/reboot_required_ack"
while getopts "vr" opt; do while getopts "vrf:" opt; do
case $opt in case $opt in
v) VERBOSE=1 ;; v) VERBOSE=1 ;;
r) RESET=1 ;; r) ACK=1 ;;
*) echo "Usage: $0 [-v] [-r]"; exit $STATE_UNKNOWN ;; f) ACK_FILE="$OPTARG" ;;
*) echo "Usage: $0 [-v] [-r] [-f <ack_file>]"; exit $STATE_UNKNOWN ;;
esac esac
done done
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# Reset: remove /run/reboot-required to clear the alert # Acknowledge mode: create the ack file to suppress the alert
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
if [ "$RESET" -eq 1 ]; then if [ "$ACK" -eq 1 ]; then
if [ ! -f /run/reboot-required ]; then touch "$ACK_FILE" && chmod 640 "$ACK_FILE"
echo "OK: /run/reboot-required does not exist, nothing to clear."
exit $STATE_OK
fi
rm -f /run/reboot-required /run/reboot-required.pkgs 2>/dev/null
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "OK: /run/reboot-required cleared successfully." echo "OK: Reboot alert acknowledged. Alert suppressed until next reboot."
exit $STATE_OK exit $STATE_OK
else else
echo "UNKNOWN: Failed to remove /run/reboot-required (permission denied?)" echo "UNKNOWN: Failed to create acknowledgement file '${ACK_FILE}' (permission denied?)"
exit $STATE_UNKNOWN exit $STATE_UNKNOWN
fi fi
fi fi
@@ -59,7 +60,6 @@ fi
_debian_pkg_list() { _debian_pkg_list() {
local pkgs_file="/run/reboot-required.pkgs" local pkgs_file="/run/reboot-required.pkgs"
if [ -f "$pkgs_file" ] && [ -s "$pkgs_file" ]; then if [ -f "$pkgs_file" ] && [ -s "$pkgs_file" ]; then
# Deduplicate, sort, join on commas
sort -u "$pkgs_file" | tr '\n' ',' | sed 's/,$//' | sed 's/,/, /g' sort -u "$pkgs_file" | tr '\n' ',' | sed 's/,$//' | sed 's/,/, /g'
else else
echo "(package list unavailable)" echo "(package list unavailable)"
@@ -67,25 +67,30 @@ _debian_pkg_list() {
} }
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# Debian / Ubuntu path # Detect if a reboot is needed
# -----------------------------------------------------------------------
if [ -f /run/reboot-required ]; then
if [ "$VERBOSE" -eq 1 ]; then
pkg_list=$(_debian_pkg_list)
echo "CRITICAL: Reboot required. Triggering packages: ${pkg_list}"
else
echo "CRITICAL: Reboot required."
fi
exit $STATE_CRITICAL
fi
# -----------------------------------------------------------------------
# Fallback: compare running kernel with installed kernel
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
running_kernel=$(uname -r) running_kernel=$(uname -r)
reboot_needed=0
reboot_reason=""
# Primary: /run/reboot-required (set by unattended-upgrades / update-notifier)
if [ -f /run/reboot-required ]; then
reboot_needed=1
if [ "$VERBOSE" -eq 1 ]; then
pkg_list=$(_debian_pkg_list)
reboot_reason="Reboot required. Triggering packages: ${pkg_list}"
else
reboot_reason="Reboot required."
fi
fi
# Fallback: compare running kernel with latest installed kernel
if [ "$reboot_needed" -eq 0 ]; then
if ! command -v dpkg >/dev/null 2>&1; then
echo "UNKNOWN: 'dpkg' not found. Cannot determine reboot status."
exit $STATE_UNKNOWN
fi
# Try Debian/Ubuntu kernel package name
if command -v dpkg >/dev/null 2>&1; then
installed_kernel=$(dpkg -l "linux-image-*" 2>/dev/null \ installed_kernel=$(dpkg -l "linux-image-*" 2>/dev/null \
| awk '/^ii/{print $2}' \ | awk '/^ii/{print $2}' \
| sed 's/linux-image-//' \ | sed 's/linux-image-//' \
@@ -93,14 +98,32 @@ if command -v dpkg >/dev/null 2>&1; then
| sort -V \ | sort -V \
| tail -1) | tail -1)
if [ -n "$installed_kernel" ] && [ "$installed_kernel" != "$running_kernel" ]; then if [ -z "$installed_kernel" ]; then
echo "CRITICAL: Reboot required. Running kernel: ${running_kernel}, latest installed: ${installed_kernel}." echo "UNKNOWN: No versioned kernel package found via dpkg."
exit $STATE_CRITICAL exit $STATE_UNKNOWN
elif [ -n "$installed_kernel" ]; then fi
echo "OK: No reboot required. Running kernel: ${running_kernel}."
exit $STATE_OK if [ "$installed_kernel" != "$running_kernel" ]; then
reboot_needed=1
reboot_reason="Reboot required. Running kernel: ${running_kernel}, latest installed: ${installed_kernel}."
fi fi
fi fi
echo "UNKNOWN: Unable to determine if a reboot is required on this system." # -----------------------------------------------------------------------
exit $STATE_UNKNOWN # Evaluate result
# -----------------------------------------------------------------------
if [ "$reboot_needed" -eq 0 ]; then
# Auto-clear the ack file once the system no longer needs a reboot
rm -f "$ACK_FILE" 2>/dev/null
echo "OK: No reboot required. Running kernel: ${running_kernel}."
exit $STATE_OK
fi
# Reboot is needed: check if it has been acknowledged
if [ -f "$ACK_FILE" ]; then
echo "OK: ${reboot_reason} (acknowledged - waiting for reboot)"
exit $STATE_OK
fi
echo "CRITICAL: ${reboot_reason}"
exit $STATE_CRITICAL