bundles/sshmon: import from work repository
This commit is contained in:
parent
eaf268aea9
commit
c7362df6c4
12 changed files with 773 additions and 0 deletions
184
bundles/sshmon/files/check_cpu_stats
Normal file
184
bundles/sshmon/files/check_cpu_stats
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ========================================================================================
|
||||||
|
# CPU Utilization Statistics plugin for Nagios
|
||||||
|
#
|
||||||
|
# Written by : Steve Bosek
|
||||||
|
# Patched by : Bas van der Doorn
|
||||||
|
# Release : 2.2
|
||||||
|
# Creation date : 8 September 2007
|
||||||
|
# Revision date : 23 November 2008
|
||||||
|
# Package : DTB Nagios Plugin
|
||||||
|
# Description : Nagios plugin (script) to check cpu utilization statistics.
|
||||||
|
# This script has been designed and written on Unix plateform (Linux, Aix, Solaris),
|
||||||
|
# requiring iostat as external program. The locations of these can easily
|
||||||
|
# be changed by editing the variables $IOSTAT at the top of the script.
|
||||||
|
# The script is used to query 4 of the key cpu statistics (user,system,iowait,idle)
|
||||||
|
# at the same time. Note though that there is only one set of warning
|
||||||
|
# and critical values for iowait percent.
|
||||||
|
#
|
||||||
|
# Usage : ./check_cpu_stats.sh [-w <warn>] [-c <crit] ( [ -i <intervals in second> ] [ -n <report number> ])
|
||||||
|
# ----------------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# TODO: Support for HP-UX
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# ========================================================================================
|
||||||
|
#
|
||||||
|
# HISTORY :
|
||||||
|
# Release | Date | Authors | Description
|
||||||
|
# --------------+---------------+---------------+------------------------------------------
|
||||||
|
# 2.0 | 16.02.08 | Steve Bosek | Solaris support and new parameters
|
||||||
|
# | | | New Parameters : - iostat seconds intervals
|
||||||
|
# | | | - iostat report number
|
||||||
|
# 2.1 | 08.06.08 | Steve Bosek | Bug perfdata and convert comma in point for Linux result
|
||||||
|
# 2.1.1 | 20.11.08 | Bas van der Doorn | Fixed improperly terminated string
|
||||||
|
# 2.1.2 | 23.11.08 | Bas van der Doorn | Fixed linux steal reported as idle, comparisons
|
||||||
|
# 2.2 | 23.11.08 | Bas van der Doorn | Capable systems will output nice and steal data
|
||||||
|
# -----------------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# =========================================================================================
|
||||||
|
|
||||||
|
# Paths to commands used in this script. These may have to be modified to match your system setup.
|
||||||
|
|
||||||
|
IOSTAT=/usr/bin/iostat
|
||||||
|
|
||||||
|
# Nagios return codes
|
||||||
|
STATE_OK=0
|
||||||
|
STATE_WARNING=1
|
||||||
|
STATE_CRITICAL=2
|
||||||
|
STATE_UNKNOWN=3
|
||||||
|
|
||||||
|
# Plugin parameters value if not define
|
||||||
|
WARNING_THRESHOLD=${WARNING_THRESHOLD:="30"}
|
||||||
|
CRITICAL_THRESHOLD=${CRITICAL_THRESHOLD:="100"}
|
||||||
|
INTERVAL_SEC=${INTERVAL_SEC:="1"}
|
||||||
|
NUM_REPORT=${NUM_REPORT:="3"}
|
||||||
|
|
||||||
|
# Plugin variable description
|
||||||
|
PROGNAME=$(basename $0)
|
||||||
|
RELEASE="Revision 2.1.1"
|
||||||
|
AUTHOR="(c) 2008 Steve Bosek (steve.bosek@gmail.com)"
|
||||||
|
|
||||||
|
if [ ! -x $IOSTAT ]; then
|
||||||
|
echo "UNKNOWN: iostat not found or is not executable by the nagios user."
|
||||||
|
exit $STATE_UNKNOWN
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Functions plugin usage
|
||||||
|
print_release() {
|
||||||
|
echo "$RELEASE $AUTHOR"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_usage() {
|
||||||
|
echo ""
|
||||||
|
echo "$PROGNAME $RELEASE - CPU Utilization check script for Nagios"
|
||||||
|
echo ""
|
||||||
|
echo "Usage: check_cpu_stats.sh -w -c (-i -n)"
|
||||||
|
echo ""
|
||||||
|
echo " -w Warning level in % for cpu iowait"
|
||||||
|
echo " -c Crical level in % for cpu iowait"
|
||||||
|
echo " -i Interval in seconds for iostat (default : 1)"
|
||||||
|
echo " -n Number report for iostat (default : 3)"
|
||||||
|
echo " -h Show this page"
|
||||||
|
echo ""
|
||||||
|
echo "Usage: $PROGNAME"
|
||||||
|
echo "Usage: $PROGNAME --help"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
print_help() {
|
||||||
|
print_usage
|
||||||
|
echo ""
|
||||||
|
echo "This plugin will check cpu utilization (user,system,iowait,idle in %)"
|
||||||
|
echo ""
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse parameters
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
-h | --help)
|
||||||
|
print_help
|
||||||
|
exit $STATE_OK
|
||||||
|
;;
|
||||||
|
-v | --version)
|
||||||
|
print_release
|
||||||
|
exit $STATE_OK
|
||||||
|
;;
|
||||||
|
-w | --warning)
|
||||||
|
shift
|
||||||
|
WARNING_THRESHOLD=$1
|
||||||
|
;;
|
||||||
|
-c | --critical)
|
||||||
|
shift
|
||||||
|
CRITICAL_THRESHOLD=$1
|
||||||
|
;;
|
||||||
|
-i | --interval)
|
||||||
|
shift
|
||||||
|
INTERVAL_SEC=$1
|
||||||
|
;;
|
||||||
|
-n | --number)
|
||||||
|
shift
|
||||||
|
NUM_REPORT=$1
|
||||||
|
;;
|
||||||
|
*) echo "Unknown argument: $1"
|
||||||
|
print_usage
|
||||||
|
exit $STATE_UNKNOWN
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# CPU Utilization Statistics Unix Plateform ( Linux,AIX,Solaris are supported )
|
||||||
|
case `uname` in
|
||||||
|
Linux ) CPU_REPORT=`iostat -c $INTERVAL_SEC $NUM_REPORT | sed -e 's/,/./g' | tr -s ' ' ';' | sed '/^$/d' | tail -1`
|
||||||
|
CPU_REPORT_SECTIONS=`echo ${CPU_REPORT} | grep ';' -o | wc -l`
|
||||||
|
CPU_USER=`echo $CPU_REPORT | cut -d ";" -f 2`
|
||||||
|
CPU_NICE=`echo $CPU_REPORT | cut -d ";" -f 3`
|
||||||
|
CPU_SYSTEM=`echo $CPU_REPORT | cut -d ";" -f 4`
|
||||||
|
CPU_IOWAIT=`echo $CPU_REPORT | cut -d ";" -f 5`
|
||||||
|
CPU_IOWAIT_MAJOR=`echo $CPU_IOWAIT | cut -d "." -f 1`
|
||||||
|
if [ ${CPU_REPORT_SECTIONS} -ge 6 ]; then
|
||||||
|
CPU_STEAL=`echo $CPU_REPORT | cut -d ";" -f 6`
|
||||||
|
CPU_IDLE=`echo $CPU_REPORT | cut -d ";" -f 7`
|
||||||
|
NAGIOS_DATA="user=${CPU_USER}% system=${CPU_SYSTEM}% iowait=${CPU_IOWAIT}% idle=${CPU_IDLE}% nice=${CPU_NICE}% steal=${CPU_STEAL}% | CpuUser=${CPU_USER};CpuSystem=${CPU_SYSTEM};CpuIoWait=${CPU_IOWAIT};CpuIdle=${CPU_IDLE};CpuNice=${CPU_NICE};CpuSteal=${CPU_STEAL};$WARNING_THRESHOLD;$CRITICAL_THRESHOLD"
|
||||||
|
else
|
||||||
|
CPU_IDLE=`echo $CPU_REPORT | cut -d ";" -f 6`
|
||||||
|
NAGIOS_DATA="user=${CPU_USER}% system=${CPU_SYSTEM}% iowait=${CPU_IOWAIT}% idle=${CPU_IDLE}% nice=${CPU_NICE}% | CpuUser=${CPU_USER};CpuSystem=${CPU_SYSTEM};CpuIoWait=${CPU_IOWAIT};CpuIdle=${CPU_IDLE};CpuNice=${CPU_NICE};$WARNING_THRESHOLD;$CRITICAL_THRESHOLD"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
AIX ) CPU_REPORT=`iostat -t $INTERVAL_SEC $NUM_REPORT | sed -e 's/,/./g'|tr -s ' ' ';' | tail -1`
|
||||||
|
CPU_USER=`echo $CPU_REPORT | cut -d ";" -f 4`
|
||||||
|
CPU_SYSTEM=`echo $CPU_REPORT | cut -d ";" -f 5`
|
||||||
|
CPU_IOWAIT=`echo $CPU_REPORT | cut -d ";" -f 7`
|
||||||
|
CPU_IOWAIT_MAJOR=`echo $CPU_IOWAIT | cut -d "." -f 1`
|
||||||
|
CPU_IDLE=`echo $CPU_REPORT | cut -d ";" -f 6`
|
||||||
|
NAGIOS_DATA="user=${CPU_USER}% system=${CPU_SYSTEM}% iowait=${CPU_IOWAIT}% idle=${CPU_IDLE}% | CpuUser=${CPU_USER};CpuSystem=${CPU_SYSTEM};CpuIoWait=${CPU_IOWAIT};CpuIdle=${CPU_IDLE};$WARNING_THRESHOLD;$CRITICAL_THRESHOLD"
|
||||||
|
;;
|
||||||
|
SunOS ) CPU_REPORT=`iostat -c $INTERVAL_SEC $NUM_REPORT | tail -1`
|
||||||
|
CPU_USER=`echo $CPU_REPORT | awk '{ print $1 }'`
|
||||||
|
CPU_SYSTEM=`echo $CPU_REPORT | awk '{ print $2 }'`
|
||||||
|
CPU_IOWAIT=`echo $CPU_REPORT | awk '{ print $3 }'`
|
||||||
|
CPU_IOWAIT_MAJOR=`echo $CPU_IOWAIT | cut -d "." -f 1`
|
||||||
|
CPU_IDLE=`echo $CPU_REPORT | awk '{ print $4 }'`
|
||||||
|
NAGIOS_DATA="user=${CPU_USER}% system=${CPU_SYSTEM}% iowait=${CPU_IOWAIT}% idle=${CPU_IDLE}% | CpuUser=${CPU_USER};CpuSystem=${CPU_SYSTEM};CpuIoWait=${CPU_IOWAIT};CpuIdle=${CPU_IDLE};$WARNING_THRESHOLD;$CRITICAL_THRESHOLD"
|
||||||
|
;;
|
||||||
|
*) echo "UNKNOWN: `uname` not yet supported by this plugin. Coming soon !"
|
||||||
|
exit $STATE_UNKNOWN
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Return
|
||||||
|
if [ ${CPU_IOWAIT_MAJOR} -ge $WARNING_THRESHOLD ] && [ ${CPU_IOWAIT_MAJOR} -lt $CRITICAL_THRESHOLD ]; then
|
||||||
|
echo "CPU STATISTICS WARNING : ${NAGIOS_DATA}"
|
||||||
|
exit $STATE_WARNING
|
||||||
|
elif [ ${CPU_IOWAIT_MAJOR} -ge $CRITICAL_THRESHOLD ]; then
|
||||||
|
echo "CPU STATISTICS CRITICAL : ${NAGIOS_DATA}"
|
||||||
|
exit $STATE_CRITICAL
|
||||||
|
else
|
||||||
|
echo "CPU STATISTICS OK : ${NAGIOS_DATA}"
|
||||||
|
exit $STATE_OK
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
13
bundles/sshmon/files/check_http_url_for_string
Normal file
13
bundles/sshmon/files/check_http_url_for_string
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
url=$1
|
||||||
|
string=$2
|
||||||
|
|
||||||
|
if curl -m 30 -sLk "$url" | grep -F "$string" > /dev/null
|
||||||
|
then
|
||||||
|
echo OK
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "CRITICAL - String '$string' not found in '$url'"
|
||||||
|
exit 2
|
||||||
|
fi
|
80
bundles/sshmon/files/check_http_wget
Normal file
80
bundles/sshmon/files/check_http_wget
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
#this is actually a python https requests query, its called check_http_wget cause it got replaced
|
||||||
|
|
||||||
|
from sys import exit
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
OK = 0
|
||||||
|
CRITICAL = 2
|
||||||
|
|
||||||
|
parser = ArgumentParser()
|
||||||
|
parser.add_argument(
|
||||||
|
'--url',
|
||||||
|
required=True,
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--check-string',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--no-follow-redirects',
|
||||||
|
action='store_true',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--timeout',
|
||||||
|
default=15,
|
||||||
|
type=int,
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--useragent',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--proxy_url',
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument('--no-verify-ssl', dest='verify_ssl', action='store_false')
|
||||||
|
parser.set_defaults(verify_ssl=True)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parsed_args = parser.parse_args()
|
||||||
|
requests_kwargs = {
|
||||||
|
'timeout': parsed_args.timeout,
|
||||||
|
}
|
||||||
|
|
||||||
|
if parsed_args.useragent:
|
||||||
|
requests_kwargs['headers'] = {
|
||||||
|
'User-Agent': parsed_args.useragent,
|
||||||
|
}
|
||||||
|
if parsed_args.proxy_url:
|
||||||
|
requests_kwargs['proxies'] = {
|
||||||
|
'http': parsed_args.proxy_url,
|
||||||
|
'https': parsed_args.proxy_url,
|
||||||
|
}
|
||||||
|
|
||||||
|
if not parsed_args.verify_ssl:
|
||||||
|
requests_kwargs['verify'] = False
|
||||||
|
requests.packages.urllib3.disable_warnings()
|
||||||
|
|
||||||
|
if parsed_args.no_follow_redirects:
|
||||||
|
requests_kwargs['allow_redirects'] = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
r = requests.get(parsed_args.url, **requests_kwargs)
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
exit(CRITICAL)
|
||||||
|
|
||||||
|
if parsed_args.check_string:
|
||||||
|
if not parsed_args.check_string in r.text:
|
||||||
|
print("String '{}' not found on URL '{}'".format(parsed_args.check_string, parsed_args.url))
|
||||||
|
exit(CRITICAL)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
r.raise_for_status()
|
||||||
|
except Exception as e:
|
||||||
|
print("Error: {}".format(repr(e)))
|
||||||
|
exit(CRITICAL)
|
||||||
|
print('OK')
|
||||||
|
exit(OK)
|
42
bundles/sshmon/files/check_https_certificate_at_url
Normal file
42
bundles/sshmon/files/check_https_certificate_at_url
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
host=$1
|
||||||
|
port=$2
|
||||||
|
|
||||||
|
cert=$(echo | openssl s_client -connect "$host":"$port" -servername "$host" 2>/dev/null | openssl x509)
|
||||||
|
issuer_hash=$(echo "$cert" | openssl x509 -noout -issuer_hash)
|
||||||
|
not_after=$(echo "$cert" | openssl x509 -noout -dates | grep '^notAfter=')
|
||||||
|
|
||||||
|
if [[ -z "$cert" ]] || [[ -z "$issuer_hash" ]] || [[ -z "$not_after" ]]
|
||||||
|
then
|
||||||
|
echo "UNKNOWN - Could not retrieve certificate! [$host:$port]"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
warn_days=60
|
||||||
|
crit_days=30
|
||||||
|
|
||||||
|
case "$issuer_hash" in
|
||||||
|
# issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
|
||||||
|
4f06f81d)
|
||||||
|
warn_days=10
|
||||||
|
crit_days=3
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if ! echo "$cert" | openssl x509 -noout -checkend 0 >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
echo "CRITICAL - Certificate has expired! [$host:$port] [$not_after]"
|
||||||
|
exit 2
|
||||||
|
elif ! echo "$cert" | openssl x509 -noout -checkend $((86400 * crit_days)) >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
echo "CRITICAL - Certificate will expire really soon: [$host:$port] [$not_after]"
|
||||||
|
exit 2
|
||||||
|
elif ! echo "$cert" | openssl x509 -noout -checkend $((86400 * warn_days)) >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
echo "WARNING - Certificate will expire soon: [$host:$port] [$not_after]"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "OK - [$host:$port] [$not_after]"
|
||||||
|
exit 0
|
153
bundles/sshmon/files/check_mounts
Normal file
153
bundles/sshmon/files/check_mounts
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
from subprocess import check_output
|
||||||
|
from tempfile import TemporaryFile
|
||||||
|
|
||||||
|
|
||||||
|
check_filesystem_types = {
|
||||||
|
'ext2',
|
||||||
|
'ext3',
|
||||||
|
'ext4',
|
||||||
|
'vfat',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def read_systemd():
|
||||||
|
"""
|
||||||
|
Read configured mount units from systemd.
|
||||||
|
"""
|
||||||
|
|
||||||
|
lines = check_output(
|
||||||
|
'systemctl list-unit-files -at mount --no-legend --no-pager',
|
||||||
|
shell=True,
|
||||||
|
).decode('UTF-8').splitlines()
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
frag_path = None
|
||||||
|
fstype = None
|
||||||
|
options = None
|
||||||
|
source_path = None
|
||||||
|
state = None
|
||||||
|
where = None
|
||||||
|
|
||||||
|
mountunit = line.split()[0]
|
||||||
|
props = check_output(
|
||||||
|
'systemctl show -p FragmentPath,Options,SourcePath,Type,UnitFileState,Where -- ' + mountunit,
|
||||||
|
shell=True,
|
||||||
|
).decode('UTF-8')
|
||||||
|
for pline in props.splitlines():
|
||||||
|
if pline.startswith('FragmentPath='):
|
||||||
|
frag_path = pline[len('FragmentPath='):]
|
||||||
|
elif pline.startswith('Options='):
|
||||||
|
options = pline[len('Options='):]
|
||||||
|
elif pline.startswith('SourcePath='):
|
||||||
|
source_path = pline[len('SourcePath='):]
|
||||||
|
elif pline.startswith('Type='):
|
||||||
|
fstype = pline[len('Type='):]
|
||||||
|
elif pline.startswith('UnitFileState='):
|
||||||
|
state = pline[len('UnitFileState='):]
|
||||||
|
elif pline.startswith('Where='):
|
||||||
|
where = pline[len('Where='):]
|
||||||
|
|
||||||
|
if state not in ('enabled', 'generated', 'static'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# The properties of mount units change once they are mounted.
|
||||||
|
# For example, "options" and "type" change from "bind"/"none" to
|
||||||
|
# something like "ext4"/"rw,relatime" once a bind-mount is
|
||||||
|
# mounted.
|
||||||
|
#
|
||||||
|
# fstype can be an empty string if an admin decides to simply
|
||||||
|
# not specify the type in its mount unit. (Only good old fstab
|
||||||
|
# forced setting fstype.)
|
||||||
|
if (
|
||||||
|
options != 'bind' and
|
||||||
|
fstype != '' and
|
||||||
|
fstype not in check_filesystem_types
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Traditional mountpoints, those are represented by systemd
|
||||||
|
# units which are auto-generated.
|
||||||
|
if source_path == '/etc/fstab':
|
||||||
|
yield where
|
||||||
|
# Okay, this is a real systemd mount unit. Has it been
|
||||||
|
# configured by an admin or is it noise?
|
||||||
|
elif frag_path.startswith('/etc/systemd/system'):
|
||||||
|
yield where
|
||||||
|
|
||||||
|
|
||||||
|
def read_unix(path):
|
||||||
|
"""
|
||||||
|
Read /etc/fstab or /proc/self/mounts.
|
||||||
|
"""
|
||||||
|
|
||||||
|
with open(path, 'r') as fp:
|
||||||
|
lines = fp.read().splitlines()
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
line = line.strip()
|
||||||
|
if line.startswith('#'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
fields = line.split()
|
||||||
|
if len(fields) < 3 or fields[2] not in check_filesystem_types:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Only the mountpoint.
|
||||||
|
yield fields[1]
|
||||||
|
|
||||||
|
|
||||||
|
def rwtest(path):
|
||||||
|
try:
|
||||||
|
with TemporaryFile(dir=path) as fp:
|
||||||
|
pass
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser()
|
||||||
|
parser.add_argument('--ignore', nargs='*')
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# read_systemd() does not return everything on systems older than 18.04.
|
||||||
|
configured = set(read_systemd()) | set(read_unix('/etc/fstab'))
|
||||||
|
mounted = set(read_unix('/proc/self/mounts'))
|
||||||
|
|
||||||
|
configured -= set(args.ignore or [])
|
||||||
|
mounted -= set(args.ignore or [])
|
||||||
|
|
||||||
|
missing_mounted = configured - mounted
|
||||||
|
missing_configured = mounted - configured
|
||||||
|
mounted_as_configured = mounted & configured
|
||||||
|
|
||||||
|
all_mounts = configured | mounted
|
||||||
|
not_okay = {}
|
||||||
|
|
||||||
|
for i in missing_mounted:
|
||||||
|
not_okay[i] = 'not mounted'
|
||||||
|
|
||||||
|
for i in missing_configured:
|
||||||
|
not_okay[i] = 'not in fstab nor systemd unit'
|
||||||
|
|
||||||
|
for i in mounted_as_configured:
|
||||||
|
if not rwtest(i):
|
||||||
|
not_okay[i] = 'mounted read-only'
|
||||||
|
|
||||||
|
exitcode = 0
|
||||||
|
|
||||||
|
# Two loops to have CRITICAL printed before OK without having to create
|
||||||
|
# a new data structure.
|
||||||
|
for i in sorted(all_mounts):
|
||||||
|
if i in not_okay:
|
||||||
|
print('CRITICAL - {}: {}'.format(i, not_okay[i]))
|
||||||
|
exitcode = 2
|
||||||
|
|
||||||
|
for i in sorted(all_mounts):
|
||||||
|
if i not in not_okay:
|
||||||
|
print('OK - {}'.format(i))
|
||||||
|
|
||||||
|
exit(exitcode)
|
86
bundles/sshmon/files/check_ram
Normal file
86
bundles/sshmon/files/check_ram
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Plugin to check free ram space
|
||||||
|
# using check_by_ssh
|
||||||
|
# by Markus Walther (voltshock@gmx.de)
|
||||||
|
# The script needs a working check_by_ssh connection and needs to run on the client to check it
|
||||||
|
#
|
||||||
|
# Command-Line for check_by_ssh
|
||||||
|
# command_line $USER1$/check_by_ssh -H $HOSTNAME$ -p $ARG1$ -C "$ARG2$ $ARG3$ $ARG4$ $ARG5$ $ARG6$"
|
||||||
|
#
|
||||||
|
# Command-Line for service (example)
|
||||||
|
# check_by_ssh!82!/nagios/check_ram.sh!20!10
|
||||||
|
#
|
||||||
|
##########################################################
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
--help | -h )
|
||||||
|
echo "Usage: check_ram [warn] [crit]"
|
||||||
|
echo " [warn] and [crit] as int"
|
||||||
|
echo " Example: check_ram 20 10"
|
||||||
|
exit 3
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
warn=$1
|
||||||
|
crit=$2
|
||||||
|
|
||||||
|
if [[ "$1" == disabled ]]
|
||||||
|
then
|
||||||
|
echo "OK: Check disabled"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! "$1" -o ! "$2" ]; then
|
||||||
|
echo "Usage: check_ram [warn] [crit]"
|
||||||
|
echo " [warn] and [crit] as int"
|
||||||
|
echo " Example: check_ram 20 10"
|
||||||
|
echo "Unknown: Options missing: using default (warn=20, crit=10)"
|
||||||
|
warn=`echo $((20))`
|
||||||
|
crit=`echo $((10))`
|
||||||
|
fi
|
||||||
|
|
||||||
|
full=`free | grep Mem | sed -r 's/\ +/\ /g' | cut -d \ -f 2`
|
||||||
|
free=`free | grep "buffers/cache" | sed -r 's/\ +/\ /g' | cut -d \ -f 4`
|
||||||
|
if [ "x$free" = "x" ]; then
|
||||||
|
# The output of "free" has changed in winter 2014: It removed the
|
||||||
|
# "buffers/cache" line, but added an "available" column. We're going
|
||||||
|
# to use that new one.
|
||||||
|
free=`free | grep Mem | sed -r 's/\ +/\ /g' | cut -d \ -f 7`
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -r /proc/spl/kstat/zfs/arcstats ]
|
||||||
|
then
|
||||||
|
# This system is using ZFS. ZFS does not use the standard I/O
|
||||||
|
# caching mechanism of Linux. As a result, ZFS caches appear as "in
|
||||||
|
# use by an application", which is not entirely true, since they
|
||||||
|
# will be freed when actual applications need memory.
|
||||||
|
#
|
||||||
|
# Add the current size of the ZFS ARC to the amount of free memory.
|
||||||
|
free=$(gawk -vfree="$free" '/^size / { printf "%d\n", free + $3 / 1024 }' \
|
||||||
|
/proc/spl/kstat/zfs/arcstats)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$warn" -lt "$crit" -o "$warn" -eq "$crit" ]; then
|
||||||
|
echo "Unknown: [warn] must be larger than [crit]"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
use=`echo $(( ($free * 100) / $full ))`
|
||||||
|
|
||||||
|
if [ "$use" -gt "$warn" -o "$use" -eq "$warn" ]; then
|
||||||
|
echo "OK: $use% free memory"
|
||||||
|
exit 0
|
||||||
|
elif [ "$use" -lt "$warn" -a "$use" -gt "$crit" ]; then
|
||||||
|
echo "Warning: $use% free memory"
|
||||||
|
exit 1
|
||||||
|
elif [ "$use" -eq "$crit" -o "$use" -lt "$crit" ]; then
|
||||||
|
echo "Critical: $use% free memory"
|
||||||
|
exit 2
|
||||||
|
else
|
||||||
|
echo "Unknown"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
10
bundles/sshmon/files/check_systemd_unit
Normal file
10
bundles/sshmon/files/check_systemd_unit
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! systemctl --quiet is-active "$1"
|
||||||
|
then
|
||||||
|
echo "CRITICAL - systemd unit $1 not active"
|
||||||
|
exit 2
|
||||||
|
else
|
||||||
|
echo OK
|
||||||
|
exit 0
|
||||||
|
fi
|
25
bundles/sshmon/files/sshmon
Normal file
25
bundles/sshmon/files/sshmon
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ^^^^ Because we need Bash arrays.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
UNKNOWN=3
|
||||||
|
|
||||||
|
unset command
|
||||||
|
declare -A command
|
||||||
|
. /etc/sshmon.cfg
|
||||||
|
|
||||||
|
if [[ -z "$SSH_ORIGINAL_COMMAND" ]]
|
||||||
|
then
|
||||||
|
echo "No command given" >&2
|
||||||
|
exit $UNKNOWN
|
||||||
|
fi
|
||||||
|
|
||||||
|
execute=${command["$SSH_ORIGINAL_COMMAND"]}
|
||||||
|
if [[ -z "$execute" ]]
|
||||||
|
then
|
||||||
|
echo "Unknown command" >&2
|
||||||
|
exit $UNKNOWN
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec sh -c "$execute"
|
3
bundles/sshmon/files/sshmon.cfg
Normal file
3
bundles/sshmon/files/sshmon.cfg
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
% for name, command in sorted(check_commands.items()):
|
||||||
|
command[${name}]='${command}'
|
||||||
|
% endfor
|
10
bundles/sshmon/files/sudoers
Normal file
10
bundles/sshmon/files/sudoers
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<%
|
||||||
|
commands = set()
|
||||||
|
for maybe_fault in check_commands.values():
|
||||||
|
commands.add(str(maybe_fault))
|
||||||
|
%>\
|
||||||
|
% for command in sorted(commands):
|
||||||
|
% if command.startswith('sudo '):
|
||||||
|
sshmon ALL=NOPASSWD: ${command[len('sudo '):]}
|
||||||
|
% endif
|
||||||
|
% endfor
|
57
bundles/sshmon/items.py
Normal file
57
bundles/sshmon/items.py
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
def collect_commands():
|
||||||
|
check_commands = {}
|
||||||
|
|
||||||
|
for bundle, bundle_config in node.metadata.get('icinga2_api', {}).items():
|
||||||
|
for service, service_config in bundle_config.get('services', {}).items():
|
||||||
|
# The default for check_command is also set in metadata.py
|
||||||
|
# and in icinga2 bundle
|
||||||
|
if (
|
||||||
|
service_config.get('check_command', 'sshmon') == 'sshmon' and
|
||||||
|
'vars.sshmon_command' in service_config and
|
||||||
|
'command_on_monitored_host' in service_config
|
||||||
|
):
|
||||||
|
check_commands[service_config['vars.sshmon_command']] = service_config['command_on_monitored_host']
|
||||||
|
|
||||||
|
return check_commands
|
||||||
|
|
||||||
|
|
||||||
|
pkg_apt = {
|
||||||
|
'gawk': {}, # needed by check_ram
|
||||||
|
'libwww-perl': {}, # needed by check_nginx_status
|
||||||
|
'sysstat': {}, # needed by check_cpu_stats
|
||||||
|
'monitoring-plugins': {},
|
||||||
|
}
|
||||||
|
|
||||||
|
check_commands = collect_commands()
|
||||||
|
|
||||||
|
files = {
|
||||||
|
'/etc/sshmon.cfg': {
|
||||||
|
'content_type': 'mako',
|
||||||
|
'context': {
|
||||||
|
'check_commands': check_commands,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'/etc/sudoers.d/sshmon': {
|
||||||
|
'source': 'sudoers',
|
||||||
|
'content_type': 'mako',
|
||||||
|
'context': {
|
||||||
|
'check_commands': check_commands,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'/usr/local/sbin/sshmon': {
|
||||||
|
'mode': '0755',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for check in {
|
||||||
|
'cpu_stats',
|
||||||
|
'mounts',
|
||||||
|
'ram',
|
||||||
|
'http_url_for_string',
|
||||||
|
'https_certificate_at_url',
|
||||||
|
'http_wget',
|
||||||
|
'systemd_unit',
|
||||||
|
}:
|
||||||
|
files["/usr/local/share/icinga/plugins/check_{}".format(check)] = {
|
||||||
|
'mode': "0755",
|
||||||
|
}
|
110
bundles/sshmon/metadata.py
Normal file
110
bundles/sshmon/metadata.py
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
from bundlewrap.utils import Fault
|
||||||
|
|
||||||
|
from os.path import join
|
||||||
|
from re import sub
|
||||||
|
|
||||||
|
|
||||||
|
with open(join(repo.path, 'data', 'sshmon', 'sshmon.pub'), 'r') as fp:
|
||||||
|
pubkey = fp.read().strip()
|
||||||
|
|
||||||
|
defaults = {
|
||||||
|
'icinga2_api': {
|
||||||
|
'basic': {
|
||||||
|
'services': {
|
||||||
|
'CPU': {
|
||||||
|
'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_cpu_stats',
|
||||||
|
},
|
||||||
|
'LOAD': {
|
||||||
|
'command_on_monitored_host': '/usr/lib/nagios/plugins/check_load -r -w 4,2,1 -c 8,4,2',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'users': {
|
||||||
|
'sshmon': {
|
||||||
|
'password_hash': 'x',
|
||||||
|
'ssh_pubkey': {
|
||||||
|
'command="/usr/local/sbin/sshmon" {}'.format(pubkey),
|
||||||
|
},
|
||||||
|
'sudo_commands': [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@metadata_reactor
|
||||||
|
def autogenerate_sshmon_command(metadata):
|
||||||
|
result = {
|
||||||
|
'icinga2_api': {},
|
||||||
|
}
|
||||||
|
|
||||||
|
for bundle, bundle_config in metadata.get('icinga2_api', {}).items():
|
||||||
|
for service, service_config in bundle_config.get('services', {}).items():
|
||||||
|
# The default for check_command is also set in items.py and
|
||||||
|
# in icinga2 bundle
|
||||||
|
if (
|
||||||
|
service_config.get('check_command', 'sshmon') == 'sshmon' and
|
||||||
|
'command_on_monitored_host' in service_config
|
||||||
|
):
|
||||||
|
service_normalized = sub('[^a-zA-Z0-9]', '_', service)
|
||||||
|
|
||||||
|
result['icinga2_api'].setdefault(bundle, {}).setdefault('services', {}).setdefault(service, {})
|
||||||
|
result['icinga2_api'][bundle]['services'][service]['vars.sshmon_command'] = service_normalized
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
@metadata_reactor
|
||||||
|
def default_checks(metadata):
|
||||||
|
disk_space_warning = metadata.get('sshmon/disk_space/warning', 15)
|
||||||
|
disk_space_critical = metadata.get('sshmon/disk_space/critical', 5)
|
||||||
|
disk_space_warning_inodes = metadata.get('sshmon/disk_space/warning_inodes', 15)
|
||||||
|
disk_space_critical_inodes = metadata.get('sshmon/disk_space/critical_inodes', 5)
|
||||||
|
disk_space_ignore_patterns = metadata.get('sshmon/disk_space/ignore_patterns', set())
|
||||||
|
|
||||||
|
ram_warning = metadata.get('sshmon/ram_usage/warning', 9)
|
||||||
|
ram_critical = metadata.get('sshmon/ram_usage/critical', 8)
|
||||||
|
|
||||||
|
mounts_options = metadata.get('sshmon/check_mounts_options', '')
|
||||||
|
|
||||||
|
check_internet_http_url = metadata.get('sshmon/check_internet_http_url', 'https://ftp-stud.hs-esslingen.de')
|
||||||
|
|
||||||
|
disk_space_extra_args = set()
|
||||||
|
|
||||||
|
for pattern in disk_space_ignore_patterns:
|
||||||
|
disk_space_extra_args.add(f'-I {pattern}')
|
||||||
|
|
||||||
|
for pool in metadata.get('zfs/pools', {}).keys():
|
||||||
|
disk_space_extra_args.add(f'--ignore-ereg-partition={pool}')
|
||||||
|
|
||||||
|
disk_space_ignore_patterns_string = ' '.join(sorted(disk_space_extra_args))
|
||||||
|
|
||||||
|
return {
|
||||||
|
'icinga2_api': {
|
||||||
|
'basic': {
|
||||||
|
'services': {
|
||||||
|
'DISK SPACE': {
|
||||||
|
'command_on_monitored_host': str(
|
||||||
|
'/usr/lib/nagios/plugins/check_disk -X nfs -X nfs4 -X squashfs '
|
||||||
|
f'-w {disk_space_warning} -c {disk_space_critical} '
|
||||||
|
f'-W {disk_space_warning_inodes} -K {disk_space_critical_inodes} '
|
||||||
|
'-A -I "^/dev$" -I "^/run" -I "^/sys" -i "/sys/kernel/debug/tracing" '
|
||||||
|
f'{disk_space_ignore_patterns_string}',
|
||||||
|
),
|
||||||
|
},
|
||||||
|
'MOUNTS': {
|
||||||
|
'command_on_monitored_host': f'sudo /usr/local/share/icinga/plugins/check_mounts {mounts_options}',
|
||||||
|
},
|
||||||
|
'RAM': {
|
||||||
|
'command_on_monitored_host': f'/usr/local/share/icinga/plugins/check_ram {ram_warning} {ram_critical}',
|
||||||
|
'max_check_attempts': '12',
|
||||||
|
'retry_interval': '30m',
|
||||||
|
},
|
||||||
|
'INTERNET': {
|
||||||
|
'command_on_monitored_host': f'/usr/local/share/icinga/plugins/check_http_wget --url {check_internet_http_url}',
|
||||||
|
'vars.sshmon_timeout': 20,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
Loading…
Reference in a new issue