dsa-check-soas: fix error when 0 (or more than 1) records returned
[mirror/dsa-nagios.git] / dsa-nagios-checks / checks / dsa-check-timedatectl
1 #!/bin/bash
2
3 # Copyright 2016 Peter Palfrader
4 #
5 # Permission is hereby granted, free of charge, to any person obtaining
6 # a copy of this software and associated documentation files (the
7 # "Software"), to deal in the Software without restriction, including
8 # without limitation the rights to use, copy, modify, merge, publish,
9 # distribute, sublicense, and/or sell copies of the Software, and to
10 # permit persons to whom the Software is furnished to do so, subject to
11 # the following conditions:
12 #
13 # The above copyright notice and this permission notice shall be
14 # included in all copies or substantial portions of the Software.
15 #
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
24
25 set -e
26 set -u
27
28 MAX=2
29 SYNSTATUSONLY="0"
30
31 usage(){
32         ret=$1
33
34         cat <<EOF
35 $0: usage:
36         $0 <options>
37
38         Check NTP sync status (per timedatectl's output) and offset to RTC clock.
39         The latter is particularly interesting for VMs.
40
41         -o <secs>   Maximum offset to tolerate (Default: $MAX)
42         -s          Check sync status only, do not diff against RTC.
43 EOF
44
45         exit $ret
46 }
47
48 while getopts o:sh opt ; do
49         case "$opt" in
50                 o) MAX="$OPTARG" ;;
51                 s) SYNSTATUSONLY="1";;
52                 h) usage 0
53         esac
54 done
55 shift $(($OPTIND - 1))
56 if [ "$#" -gt 0 ]; then
57         usage 1 >&2
58 fi
59
60
61 temp="$(mktemp)"
62 trap "rm -f '$temp'" EXIT
63
64 LC_ALL=C timedatectl > "$temp"
65 ut=$(sed '/Universal time:/ { s/^[^:]*: *//; p}; d' "$temp")
66 rtc=$(sed '/RTC time:/ { s/^[^:]*: *//; p}; d' "$temp")
67 ntpenabled=$(sed '/\(NTP enabled\|Network time on\):/ { s/^[^:]*: *//; p}; d' "$temp")
68 ntpsynced=$(sed '/NTP synchronized:/ { s/^[^:]*: *//; p}; d' "$temp")
69
70 uts=$(TZ=UTC date -d "$ut" +%s)
71 rtcs=$(TZ=UTC date -d "$rtc" +%s 2>/dev/null || echo "N/A")
72 if [ "$rtcs" != "N/A" ]; then
73         delta=$((uts - rtcs))
74 fi
75
76 if [ "$SYNSTATUSONLY" -ge 1 ]; then
77         if [ "$ntpsynced" != "yes" ]; then
78                 echo "Warning: not synced with NTP."
79                 exit 1
80         fi
81 else
82         if [ "$rtcs" = "N/A" ]; then
83                 echo "Warning: Cannot parse RTC $rtc."
84                 exit 1
85         fi
86
87         if [ "$delta" -lt "-$MAX" ] ||
88            [ "$delta" -gt "$MAX" ]; then
89                 echo "Warning: time desync $delta: RTC vs. system time: $rtc vs. $ut"
90                 exit 1
91         fi
92
93         if [ "$ntpenabled" != "yes" ]; then
94                 echo "Warning: NTP not enabled!"
95                 exit 1
96         fi
97
98         if [ "$ntpsynced" != "yes" ]; then
99                 echo "Warning: not synced with NTP (but clock is OK for now)."
100                 exit 1
101         fi
102 fi
103
104 echo "OK: synced at $ut."