check_clamav_signatures: make warning thresholds configurable
[mirror/dsa-nagios.git] / dsa-nagios-checks / checks / check_clamav_signatures
1 #!/usr/bin/env bash
2
3 #
4 # check_clamav_signatures - Nagios plugin to monitor ClamAV signatures are up to date.
5 #
6 # Released under the MIT License.
7 #
8 # https://github.com/tommarshall/nagios-check-clamav-signatures
9 #
10
11 VERSION=0.1.0
12 OK=0
13 WARNING=1
14 CRITICAL=2
15 UNKNOWN=3
16 CLAM_LIB_DIR=/var/lib/clamav
17 NUMERICAL_REGEX='^[0-9]+$'
18 WARN_THRESHOLD=1
19 CRIT_THRESHOLD=2
20
21 #
22 # Output version.
23 #
24
25 version() {
26   echo "check_clamav_signatures $VERSION"
27 }
28
29 #
30 # Output usage information.
31 #
32
33 usage() {
34   echo 'Usage: ./check_clamav_signatures [options]'
35 }
36
37 #
38 # Output help information.
39 #
40
41 help() {
42   usage
43   cat <<-EOF
44
45   Examples:
46     ./check_clamav_signatures
47
48   Options:
49     -p, --path <path>           path to ClamAV lib directory, if not $CLAM_LIB_DIR
50     -w, --warning <number>      number of revisions sigs can be out of date (warning)
51     -c, --critical <number>     number of revisions sigs can be out of date (critical)
52     -V, --version               output version
53     -h, --help                  output help information
54
55   For more information, see https://github.com/tommarshall/nagios-check-clamav-signatures
56
57 EOF
58 }
59
60 #
61 # Parse argv.
62 #
63
64 while test $# -ne 0; do
65   ARG=$1; shift
66   case $ARG in
67     -p|--path) CLAM_LIB_DIR=$1; shift ;;
68     -V|--version) version; exit ;;
69     -h|--help) help; exit ;;
70     -w|--warning) WARN_THRESHOLD=$1; shift ;;
71     -c|--critical) CRIT_THRESHOLD=$1; shift ;;
72     *)
73       echo "UNKNOWN: Unrecognised argument: $ARG"
74       usage >&2
75       exit $UNKNOWN
76       ;;
77   esac
78 done
79
80 if ! [[ $WARN_THRESHOLD =~ $NUMERICAL_REGEX ]]; then
81   echo "UNKNOWN: Warning threshold must be numeric!"
82   exit $UNKNOWN
83 fi
84 if ! [[ $CRIT_THRESHOLD =~ $NUMERICAL_REGEX ]]; then
85   echo "UNKNOWN: Critical threshold must be numeric!"
86   exit $UNKNOWN
87 fi
88
89 #
90 # Showtime.
91 #
92
93 # ensure we have executable dependencies
94 for dependency in cut host grep sigtool sed; do
95   if ! hash $dependency >/dev/null 2>&1; then
96     echo "UNKNOWN: Missing dependency: ${dependency}"
97     exit $UNKNOWN
98   fi
99 done
100
101 # ensure the clam lib dir exists
102 if [ ! -d "$CLAM_LIB_DIR" ]; then
103   echo "UNKNOWN: Unable to locate ClamAV lib directory"
104   exit $UNKNOWN
105 fi
106
107 # ensure we have a daily signatures file
108 if [ -e ${CLAM_LIB_DIR}/daily.cld ]; then
109   DAILY_SIGNATURES_PATH="${CLAM_LIB_DIR}/daily.cld"
110 elif [ -e ${CLAM_LIB_DIR}/daily.cvd ]; then
111   DAILY_SIGNATURES_PATH="${CLAM_LIB_DIR}/daily.cvd"
112 else
113   echo "UNKNOWN: Unable to locate installed daily signatures"
114   exit $UNKNOWN
115 fi
116
117 # ensure we have a main signatures file
118 if [ -e ${CLAM_LIB_DIR}/main.cvd ]; then
119   MAIN_SIGNATURES_PATH="${CLAM_LIB_DIR}/main.cvd"
120 elif [ -e ${CLAM_LIB_DIR}/main.cld ]; then
121   MAIN_SIGNATURES_PATH="${CLAM_LIB_DIR}/main.cld"
122 else
123   echo "UNKNOWN: Unable to locate installed main signatures"
124   exit $UNKNOWN
125 fi
126
127 # extract the daily signatures version
128 INSTALLED_DAILY_VERSION=$(sigtool -i ${DAILY_SIGNATURES_PATH} 2>/dev/null | grep Version | sed -e 's/Version: //')
129 if ! [[ $INSTALLED_DAILY_VERSION =~ $NUMERICAL_REGEX ]]; then
130   echo "UNKNOWN: Unable to establish installed daily signatures version"
131   exit $UNKNOWN
132 fi
133
134 # extract the main signatures version
135 INSTALLED_MAIN_VERSION=$(sigtool -i ${MAIN_SIGNATURES_PATH} 2>/dev/null | grep Version | sed -e 's/Version: //')
136 if ! [[ $INSTALLED_MAIN_VERSION =~ $NUMERICAL_REGEX ]]; then
137   echo "UNKNOWN: Unable to establish installed main signatures version"
138   exit $UNKNOWN
139 fi
140
141 # query the DNS record
142 DNS_TXT_RECORD=$(host -t txt current.cvd.clamav.net)
143 if [ $? -ne 0 ]; then
144   echo "UNKNOWN: DNS query to current.cvd.clamav.net failed"
145   exit $UNKNOWN
146 fi
147
148 # extract the current daily signatures version from the DNS TXT record
149 CURRENT_DAILY_VERSION=$(echo $DNS_TXT_RECORD | cut -d : -f 3)
150 if ! [[ $CURRENT_DAILY_VERSION =~ $NUMERICAL_REGEX ]]; then
151   echo "UNKNOWN: Unable to establish current daily signatures version from DNS query"
152   exit $UNKNOWN
153 fi
154
155 # extract the current main signatures version from the DNS TXT record
156 CURRENT_MAIN_VERSION=$(echo $DNS_TXT_RECORD | cut -d : -f 2)
157 if ! [[ $CURRENT_MAIN_VERSION =~ $NUMERICAL_REGEX ]]; then
158   echo "UNKNOWN: Unable to establish current main signatures version from DNS query"
159   exit $UNKNOWN
160 fi
161
162 # determine the difference between the current and installed versions
163 DAILY_VERSION_DELTA=$((CURRENT_DAILY_VERSION-INSTALLED_DAILY_VERSION))
164 MAIN_VERSION_DELTA=$((CURRENT_MAIN_VERSION-INSTALLED_MAIN_VERSION))
165
166 if [ $DAILY_VERSION_DELTA -gt $CRIT_THRESHOLD -o $MAIN_VERSION_DELTA -gt $CRIT_THRESHOLD ]; then
167   echo "CRITICAL: Signatures expired;" \
168     "daily version: ${INSTALLED_DAILY_VERSION} (${DAILY_VERSION_DELTA} behind)," \
169     "main version: ${INSTALLED_MAIN_VERSION} (${MAIN_VERSION_DELTA} behind)"
170   exit $CRITICAL
171 elif [ $DAILY_VERSION_DELTA -gt $WARN_THRESHOLD -o $MAIN_VERSION_DELTA -gt $WARN_THRESHOLD ]; then
172   echo "WARNING: Signatures expired;" \
173     "daily version: ${INSTALLED_DAILY_VERSION} (${DAILY_VERSION_DELTA} behind)," \
174     "main version: ${INSTALLED_MAIN_VERSION} (${MAIN_VERSION_DELTA} behind)"
175   exit $WARNING
176 fi
177
178 echo "OK: Signatures up to date;"\
179   "daily version: ${INSTALLED_DAILY_VERSION}," \
180   "main version: ${INSTALLED_MAIN_VERSION}"
181 exit $OK