summaryrefslogtreecommitdiff
path: root/usr-lib-nagios-plugins/check_needs-rebooting.sh
diff options
context:
space:
mode:
Diffstat (limited to 'usr-lib-nagios-plugins/check_needs-rebooting.sh')
-rwxr-xr-xusr-lib-nagios-plugins/check_needs-rebooting.sh260
1 files changed, 260 insertions, 0 deletions
diff --git a/usr-lib-nagios-plugins/check_needs-rebooting.sh b/usr-lib-nagios-plugins/check_needs-rebooting.sh
new file mode 100755
index 0000000..48c25ba
--- /dev/null
+++ b/usr-lib-nagios-plugins/check_needs-rebooting.sh
@@ -0,0 +1,260 @@
+#!/bin/bash
+
+#set -x
+
+# License: The BSD 3-Clause License
+#
+# Copyright (c) 2014, Johan Ryberg
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its contributors
+# may be used to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# check_reboot-required
+# Plugin for NRPE (Nagios Remote Plugin Executor) for
+# Debian/Ubuntu/RedHat/CentOS to check if a reboot are required and
+# also list packages that requires reboot
+# Web: https://github.com/jryberg/nagios-plugins/
+
+APPNAME=`basename $0`
+VERSION="1.0"
+
+# Defining standard messages and exit error levels
+# https://nagios-plugins.org/doc/guidelines.html
+OK_EXIT_CODE=0
+WARNING_EXIT_CODE=1
+CRITICAL_EXIT_CODE=2
+UNKNOWN_EXIT_CODE=3
+OK_MSG="OK"
+WARNING_MSG="Warning"
+CRITICAL_MSG="Critical"
+UNKNOWN_MSG="Unknown"
+
+# Using Unknown as default
+EXIT_CODE=$UNKNOWN_EXIT_CODE
+EXIT_MSG=$UNKNOWN_MSG
+
+# Stupid warning and critical levels, this cannot be determined by numbers
+# some may want to have this anyway. Default will be a warning if a reboot
+# are required and never critical
+# -1 = disable service status
+WARNING_LEVEL=1
+CRITICAL_LEVEL=-1
+
+# Path to reboot-required
+REBOOT_REQUIRED_PATH="/var/run/reboot-required"
+REBOOT_REQUIRED_PKGS_PATH="/var/run/reboot-required.pkgs"
+
+# Function to explain how to use the program
+function_usage () {
+cat - <<EOF
+Usage: ${appname} [--help]
+Usage: ${appname} -d status [-w warn] [-c crit]
+
+This check command checks if a reboot are required after an upgrade. It will
+also list packages that requires a reboot to ease the decision for the
+sysadmin if/when a reboot needs to be carried out.
+
+WARNING: It's impossible by numbers to decide if a reboot are required by
+raising a "warning" or "critical" event. A patch for 0-day vulnerability
+will probably required immediate attention and less important updates can
+wait until next scheduled maintenance window. Please read documentation
+for each update.
+
+Default without any options will be Warning for 1 or more packages
+that requires reboot. Critical event will not be raised.
+
+ --help
+ Show this help
+ -V, --version
+ Show version
+ -s
+ Default service status when reboot are needed but package information
+ are missing. w=Warning, c=Critical
+ -w
+ Warning: Number of packages needing reboot as integer. Default: 1
+ -c
+ Critical: Number of packages needing reboot as integer. Disabled as default
+
+Example:
+${APPNAME} -s w
+
+EOF
+}
+
+function distro_name() {
+ if [[ -e /etc/redhat-release ]]; then
+ REDHAT_RELEASE=`cat /etc/redhat-release`
+ if [[ `cat /etc/redhat-release | grep CentOS` != "" ]]; then
+ echo "CentOS"
+ elif [[ `cat /etc/redhat-release | grep "Red Hat"` != "" ]]; then
+ echo "Red Hat"
+ else
+ echo "$REDHAT_RELEASE"
+ fi
+ elif [[ -e /etc/lsb-release ]]; then
+ . /etc/lsb-release
+ echo $DISTRIB_ID
+ elif [[ -e /etc/debian_version ]]; then
+ DEBIAN_VER=`cat /etc/debian_version`
+ echo "Debian"
+ else
+ echo "OS not recognized"
+ fi
+}
+
+function CheckDebianRebootRequired() {
+ if [ ! -f ${REBOOT_REQUIRED_PATH} ]; then
+ # Reboot not required
+ EXIT_MSG=$OK_MSG
+ EXIT_MSG_BODY="No reboot required|Packages=0;${WARNING_LEVEL//-1/};${CRITICAL_LEVEL//-1/};0"
+ EXIT_MSG_NR_PACKAGES=0
+ EXIT_CODE=$OK_EXIT_CODE
+ else
+ # Reboot required
+ NR_OF_PACKAGES=0
+ if [ -f ${REBOOT_REQUIRED_PKGS_PATH} ]; then
+ NR_OF_PACKAGES=`wc -l ${REBOOT_REQUIRED_PKGS_PATH} | awk '{ print $1 }'`
+ fi
+ if [ ${NR_OF_PACKAGES} -gt 0 ]; then
+ if [ ${NR_OF_PACKAGES} -ge ${CRITICAL_LEVEL} ] && [ ${CRITICAL_LEVEL} -ne "-1" ];then
+ EXIT_MSG=$CRITICAL_MSG
+ EXIT_CODE=$CRITICAL_EXIT_CODE
+ elif [ ${NR_OF_PACKAGES} -ge ${WARNING_LEVEL} ] && [ ${WARNING_LEVEL} -ne "-1" ];then
+ EXIT_MSG=$WARNING_MSG
+ EXIT_CODE=$WARNING_EXIT_CODE
+ else
+ EXIT_MSG=$OK_MSG
+ EXIT_CODE=$OK_EXIT_CODE
+ fi
+ EXIT_MSG_BODY="`cat ${REBOOT_REQUIRED_PATH}`<br/>Packages:<br/>`cat ${REBOOT_REQUIRED_PKGS_PATH} | sed ':a;N;$!ba;s/\n/<br\/>/g'`|Packages=${NR_OF_PACKAGES};${WARNING_LEVEL//-1/};${CRITICAL_LEVEL//-1/};0"
+ else
+ if [[ ${STATUS} = "w" ]]; then
+ EXIT_MSG=$WARNING_MSG
+ EXIT_CODE=$WARNING_EXIT_CODE
+ else
+ EXIT_MSG=$CRITICAL_MSG
+ EXIT_CODE=$CRITICAL_EXIT_CODE
+ fi
+ EXIT_MSG_BODY="`cat ${REBOOT_REQUIRED_PATH}`|Packages=U;${WARNING_LEVEL//-1/};${CRITICAL_LEVEL//-1/};0"
+ fi
+ fi
+}
+
+function CheckRedHatRebootRequired() {
+ LAST_KERNEL=`/bin/rpm -q --last kernel | /usr/bin/head -1 | /usr/bin/perl -pe 's/^kernel-(\S+).*/$1/'`
+ RUNNING_KERNEL=`uname -r`
+
+ if [[ $LAST_KERNEL != $RUNNING_KERNEL ]]; then
+ EXIT_MSG=$CRITICAL_MSG
+ EXIT_MSG_BODY="Reboot required, the running kernel ($RUNNING_KERNEL) is different from the last kernel installed ($LAST_KERNEL)."
+ EXIT_MSG_NR_PACKAGES=1
+ EXIT_CODE=$CRITICAL_EXIT_CODE
+ else
+ EXIT_MSG=$OK_MSG
+ EXIT_MSG_BODY="No reboot required|Packages=0;${WARNING_LEVEL//-1/};${CRITICAL_LEVEL//-1/};0"
+ EXIT_MSG_NR_PACKAGES=0
+ EXIT_CODE=$OK_EXIT_CODE
+ fi
+}
+# Process arguments
+while [ $# -gt 0 ]; do
+ OPT="$1"
+ case "${OPT}" in
+ --help)
+ function_usage
+ exit $OK_EXIT_CODE
+ ;;
+ -s)
+ shift
+ case $1 in
+ w|c)
+ STATUS="${1}"
+ ;;
+ *)
+ echo "${APPNAME}: Service status must be w (Warning) or c (Critical)"
+ exit $UNKNOWN_EXIT_CODE
+ ;;
+ esac
+ shift
+ ;;
+ -w)
+ shift
+ if [[ ${1} =~ ^[0-9]+$ ]]; then
+ WARNING_LEVEL="${1}"
+ else
+ echo "${APPNAME}: Warning level must be positive integer"
+ exit $UNKNOWN_EXIT_CODE
+ fi
+ shift
+ ;;
+ -c)
+ shift
+ if [[ ${1} =~ ^[0-9]+$ ]]; then
+ CRITICAL_LEVEL="${1}"
+ else
+ echo "${APPNAME}: Critical level must be positive integer"
+ exit $UNKNOWN_EXIT_CODE
+ fi
+ shift
+ ;;
+ --version|-V)
+ echo "${APPNAME} ${VERSION}"
+ exit $OK_EXIT_CODE
+ ;;
+ *)
+ echo "${APPNAME}: invalid option '${1}'"
+ echo "Try '${APPNAME} --help' for more information."
+ exit $UNKNOWN_EXIT_CODE
+ ;;
+ esac
+done
+
+if [ -z ${STATUS} ]; then
+ echo "${APPNAME}: -s Status argument are missing"
+ exit $UNKNOWN_EXIT_CODE
+fi
+
+case `distro_name` in
+ "OS not recognized")
+ echo "OS wasn't recognized, please report to maintainer of this script."
+ exit $UNKNOWN_EXIT_CODE
+ ;;
+ "Debian"|"Ubuntu")
+ CheckDebianRebootRequired
+ ;;
+ "Red Hat"|"CentOS")
+ CheckRedHatRebootRequired
+ ;;
+ *)
+ echo "OS wasn't recognized, please report to maintainer of this script."
+ exit $UNKNOWN_EXIT_CODE
+ ;;
+esac
+
+# Echo message and exit
+echo "${EXIT_MSG}: ${EXIT_MSG_BODY}"
+exit $EXIT_CODE