aboutsummaryrefslogtreecommitdiffstats
path: root/roles/nagios_client/files/usr/lib64/nagios/plugins/check_zpools
blob: 30e11e58d4c1fe69713adb2caef0ef2030d5dc47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/bin/bash

set -Eeu -o pipefail
shopt -s lastpipe

trap 'exit 3' ERR

usage() {
  echo 'usage: check_zpool -w WARN_THRESHOLD -c CRIT_THRESHOLD' 1>&2
  exit 3
}

while getopts ':w:c:' opt; do
  case $opt in
    w)  WARN_THRESHOLD=${OPTARG//%/} ;;
    c)  CRIT_THRESHOLD=${OPTARG//%/} ;;
    *)  usage ;;
  esac
done
shift $((OPTIND-1))

if [ -z "${WARN_THRESHOLD:-}" -o -z "${CRIT_THRESHOLD:-}" ]; then
  usage
fi

if (( WARN_THRESHOLD < CRIT_THRESHOLD )); then
  echo 'WARN must be greater than CRIT' 1>&2
  exit 3
fi

CRIT=()
WARN=()
OK=()

zpool list -Ho name,free,capacity,health | while read -r name free capacity health; do 
  capacity=${capacity//%/}
  percent_free=$(( 100 - capacity ))
  output="${name} $health: $free free (${percent_free}%)"

  if [ "$health" != ONLINE ]; then
    output="$output"$'\n'"$(zpool status "$name")"
  fi

  if (( percent_free < CRIT_THRESHOLD )) || [ "$health" != ONLINE ]; then
    CRIT+=("$output")
  elif (( percent_free < WARN_THRESHOLD )); then
    WARN+=("$output")
  else
    OK+=("$output")
  fi
done

if [ -z "${CRIT[*]}${WARN[*]}${OK[*]}" ]; then
  echo 'OK - no zpools present'
  exit 0
fi

rc=0

for line in "${CRIT[@]}"; do
  echo "CRIT - ${line}"
  rc=3
done

for line in "${WARN[@]}"; do
  echo "WARN - ${line}"
  (( rc )) || rc=2
done

for line in "${OK[@]}"; do
  echo "OK - ${line}"
done

exit $rc