Add check_clamav_signatures
[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
19 #
20 # Output version.
21 #
22
23 version() {
24   echo "check_clamav_signatures $VERSION"
25 }
26
27 #
28 # Output usage information.
29 #
30
31 usage() {
32   echo 'Usage: ./check_clamav_signatures [options]'
33 }
34
35 #
36 # Output help information.
37 #
38
39 help() {
40   usage
41   cat <<-EOF
42
43   Examples:
44     ./check_clamav_signatures
45
46   Options:
47     -p, --path <path>           path to ClamAV lib directory, if not $CLAM_LIB_DIR
48     -V, --version               output version
49     -h, --help                  output help information
50
51   For more information, see https://github.com/tommarshall/nagios-check-clamav-signatures
52
53 EOF
54 }
55
56 #
57 # Parse argv.
58 #
59
60 while test $# -ne 0; do
61   ARG=$1; shift
62   case $ARG in
63     -p|--path) CLAM_LIB_DIR=$1; shift ;;
64     -V|--version) version; exit ;;
65     -h|--help) help; exit ;;
66     *)
67       echo "UNKNOWN: Unrecognised argument: $ARG"
68       usage >&2
69       exit $UNKNOWN
70       ;;
71   esac
72 done
73
74 #
75 # Showtime.
76 #
77
78 # ensure we have executable dependencies
79 for dependency in cut host grep sigtool sed; do
80   if ! hash $dependency >/dev/null 2>&1; then
81     echo "UNKNOWN: Missing dependency: ${dependency}"
82     exit $UNKNOWN
83   fi
84 done
85
86 # ensure the clam lib dir exists
87 if [ ! -d "$CLAM_LIB_DIR" ]; then
88   echo "UNKNOWN: Unable to locate ClamAV lib directory"
89   exit $UNKNOWN
90 fi
91
92 # ensure we have a daily signatures file
93 if [ -e ${CLAM_LIB_DIR}/daily.cld ]; then
94   DAILY_SIGNATURES_PATH="${CLAM_LIB_DIR}/daily.cld"
95 elif [ -e ${CLAM_LIB_DIR}/daily.cvd ]; then
96   DAILY_SIGNATURES_PATH="${CLAM_LIB_DIR}/daily.cvd"
97 else
98   echo "UNKNOWN: Unable to locate installed daily signatures"
99   exit $UNKNOWN
100 fi
101
102 # ensure we have a main signatures file
103 if [ -e ${CLAM_LIB_DIR}/main.cvd ]; then
104   MAIN_SIGNATURES_PATH="${CLAM_LIB_DIR}/main.cvd"
105 elif [ -e ${CLAM_LIB_DIR}/main.cld ]; then
106   MAIN_SIGNATURES_PATH="${CLAM_LIB_DIR}/main.cld"
107 else
108   echo "UNKNOWN: Unable to locate installed main signatures"
109   exit $UNKNOWN
110 fi
111
112 # extract the daily signatures version
113 INSTALLED_DAILY_VERSION=$(sigtool -i ${DAILY_SIGNATURES_PATH} 2>/dev/null | grep Version | sed -e 's/Version: //')
114 if ! [[ $INSTALLED_DAILY_VERSION =~ $NUMERICAL_REGEX ]]; then
115   echo "UNKNOWN: Unable to establish installed daily signatures version"
116   exit $UNKNOWN
117 fi
118
119 # extract the main signatures version
120 INSTALLED_MAIN_VERSION=$(sigtool -i ${MAIN_SIGNATURES_PATH} 2>/dev/null | grep Version | sed -e 's/Version: //')
121 if ! [[ $INSTALLED_MAIN_VERSION =~ $NUMERICAL_REGEX ]]; then
122   echo "UNKNOWN: Unable to establish installed main signatures version"
123   exit $UNKNOWN
124 fi
125
126 # query the DNS record
127 DNS_TXT_RECORD=$(host -t txt current.cvd.clamav.net)
128 if [ $? -ne 0 ]; then
129   echo "UNKNOWN: DNS query to current.cvd.clamav.net failed"
130   exit $UNKNOWN
131 fi
132
133 # extract the current daily signatures version from the DNS TXT record
134 CURRENT_DAILY_VERSION=$(echo $DNS_TXT_RECORD | cut -d : -f 3)
135 if ! [[ $CURRENT_DAILY_VERSION =~ $NUMERICAL_REGEX ]]; then
136   echo "UNKNOWN: Unable to establish current daily signatures version from DNS query"
137   exit $UNKNOWN
138 fi
139
140 # extract the current main signatures version from the DNS TXT record
141 CURRENT_MAIN_VERSION=$(echo $DNS_TXT_RECORD | cut -d : -f 2)
142 if ! [[ $CURRENT_MAIN_VERSION =~ $NUMERICAL_REGEX ]]; then
143   echo "UNKNOWN: Unable to establish current main signatures version from DNS query"
144   exit $UNKNOWN
145 fi
146
147 # determine the difference between the current and installed versions
148 DAILY_VERSION_DELTA=$((CURRENT_DAILY_VERSION-INSTALLED_DAILY_VERSION))
149 MAIN_VERSION_DELTA=$((CURRENT_MAIN_VERSION-INSTALLED_MAIN_VERSION))
150
151 if [ $DAILY_VERSION_DELTA -gt 0 -o $MAIN_VERSION_DELTA -gt 0 ]; then
152   echo "CRITICAL: Signatures expired;" \
153     "daily version: ${INSTALLED_DAILY_VERSION} (${DAILY_VERSION_DELTA} behind)," \
154     "main version: ${INSTALLED_MAIN_VERSION} (${MAIN_VERSION_DELTA} behind)"
155   exit $CRITICAL
156 fi
157
158 echo "OK: Signatures up to date;"\
159   "daily version: ${INSTALLED_DAILY_VERSION}," \
160   "main version: ${INSTALLED_MAIN_VERSION}"
161 exit $OK