added support for systemd-timesyncd, new force_systemd configuration parameter
This commit is contained in:
parent
f2e52dc4ff
commit
45225e7799
@ -19,6 +19,11 @@ force_chrony="no"
|
|||||||
# [default: no]
|
# [default: no]
|
||||||
force_ntp="no"
|
force_ntp="no"
|
||||||
|
|
||||||
|
# whether to force the use of systemd-timesyncd?
|
||||||
|
# [default: no]
|
||||||
|
# [release >20220129]
|
||||||
|
force_systemd="no"
|
||||||
|
|
||||||
# maximum allowed offset (in milliseconds (positive integers only)
|
# maximum allowed offset (in milliseconds (positive integers only)
|
||||||
# [default: 500]
|
# [default: 500]
|
||||||
max_offset=500
|
max_offset=500
|
||||||
|
@ -36,6 +36,8 @@
|
|||||||
# @(#) 2019-01-24: arguments fix [Patrick Van der Veken]
|
# @(#) 2019-01-24: arguments fix [Patrick Van der Veken]
|
||||||
# @(#) 2019-03-24: set dynamic path to client tools [Patrick Van der Veken]
|
# @(#) 2019-03-24: set dynamic path to client tools [Patrick Van der Veken]
|
||||||
# @(#) 2020-12-21: fixes for --log-healthy [Patrick Van der Veken]
|
# @(#) 2020-12-21: fixes for --log-healthy [Patrick Van der Veken]
|
||||||
|
# @(#) 2022-01-30: added support for systemd-timesyncd, new force_systemd
|
||||||
|
# @(#) configuration parameter [Patrick Van der Veken]
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
# DO NOT CHANGE THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING!
|
# DO NOT CHANGE THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING!
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
@ -51,7 +53,7 @@ typeset _CHRONYD_SYSTEMD_SERVICE="chronyd.service"
|
|||||||
typeset _NTPD_SYSTEMD_SERVICE="ntpd.service"
|
typeset _NTPD_SYSTEMD_SERVICE="ntpd.service"
|
||||||
typeset _CHRONYD_USER="chrony"
|
typeset _CHRONYD_USER="chrony"
|
||||||
typeset _NTPD_USER="ntp"
|
typeset _NTPD_USER="ntp"
|
||||||
typeset _VERSION="2020-12-21" # YYYY-MM-DD
|
typeset _VERSION="2022-01-30" # YYYY-MM-DD
|
||||||
typeset _SUPPORTED_PLATFORMS="Linux" # uname -s match
|
typeset _SUPPORTED_PLATFORMS="Linux" # uname -s match
|
||||||
typeset _NTPQ_OPTS="-pn"
|
typeset _NTPQ_OPTS="-pn"
|
||||||
# ------------------------- CONFIGURATION ends here ---------------------------
|
# ------------------------- CONFIGURATION ends here ---------------------------
|
||||||
@ -75,8 +77,11 @@ typeset _NTP_PEER=""
|
|||||||
typeset _CHECK_OFFSET=0
|
typeset _CHECK_OFFSET=0
|
||||||
typeset _USE_CHRONYD=0
|
typeset _USE_CHRONYD=0
|
||||||
typeset _USE_NTPD=0
|
typeset _USE_NTPD=0
|
||||||
|
typeset _USE_SYSTEMD=0
|
||||||
typeset _CHRONYC_BIN=""
|
typeset _CHRONYC_BIN=""
|
||||||
typeset _NTPQ_BIN=""
|
typeset _NTPQ_BIN=""
|
||||||
|
typeset _TIMEDATECTL_BIN=""
|
||||||
|
typeset _IS_SYNCHRONIZED=0
|
||||||
|
|
||||||
# handle arguments (originally comma-separated)
|
# handle arguments (originally comma-separated)
|
||||||
for _ARG in ${_ARGS}
|
for _ARG in ${_ARGS}
|
||||||
@ -93,6 +98,10 @@ do
|
|||||||
log "forcing ntp since force_ntp was used"
|
log "forcing ntp since force_ntp was used"
|
||||||
_USE_NTPD=1
|
_USE_NTPD=1
|
||||||
;;
|
;;
|
||||||
|
force_systemd)
|
||||||
|
log "forcing systemd-timesyncd since force_systemd was used"
|
||||||
|
_USE_SYSTEMD=1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
@ -141,6 +150,17 @@ case "${_CFG_FORCE_NTP}" in
|
|||||||
: # not set
|
: # not set
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
# force_systemd (optional)
|
||||||
|
_CFG_FORCE_SYSTEMD=$(_CONFIG_FILE="${_CONFIG_FILE}" data_get_lvalue_from_config 'force_systemd')
|
||||||
|
case "${_CFG_FORCE_SYSTEMD}" in
|
||||||
|
yes|YES|Yes)
|
||||||
|
log "forcing systemd-timesyncd since force_systemd was set"
|
||||||
|
_USE_SYSTEMD=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
: # not set
|
||||||
|
;;
|
||||||
|
esac
|
||||||
_CFG_NTPQ_IPV4=$(_CONFIG_FILE="${_CONFIG_FILE}" data_get_lvalue_from_config 'ntpq_use_ipv4')
|
_CFG_NTPQ_IPV4=$(_CONFIG_FILE="${_CONFIG_FILE}" data_get_lvalue_from_config 'ntpq_use_ipv4')
|
||||||
case "${_CFG_NTPQ_IPV4}" in
|
case "${_CFG_NTPQ_IPV4}" in
|
||||||
yes|YES|Yes)
|
yes|YES|Yes)
|
||||||
@ -156,6 +176,16 @@ then
|
|||||||
warn "you cannot force chrony and ntp at the same time"
|
warn "you cannot force chrony and ntp at the same time"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if (( _USE_CHRONYD > 0 && _USE_SYSTEMD > 0 ))
|
||||||
|
then
|
||||||
|
warn "you cannot force chrony and systemd at the same time"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if (( _USE_NTPD > 0 && _USE_SYSTEMD > 0 ))
|
||||||
|
then
|
||||||
|
warn "you cannot force ntp and systemd at the same time"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
# log_healthy
|
# log_healthy
|
||||||
(( ARG_LOG_HEALTHY > 0 )) && _LOG_HEALTHY=1
|
(( ARG_LOG_HEALTHY > 0 )) && _LOG_HEALTHY=1
|
||||||
@ -173,16 +203,17 @@ fi
|
|||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# check for client tools
|
# check for client tools
|
||||||
_CHRONYC_BIN="$(command -v chronyc 2>>${HC_STDERR_LOG})"
|
_CHRONYC_BIN=$(command -v chronyc 2>>"${HC_STDERR_LOG}")
|
||||||
_NTPQ_BIN="$(command -v ntpq 2>>${HC_STDERR_LOG})"
|
_NTPQ_BIN=$(command -v ntpq 2>>"${HC_STDERR_LOG}")
|
||||||
|
_TIMEDATECTL_BIN=$(command -v timedatectl 2>>"${HC_STDERR_LOG}")
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# chronyd (prefer) or ntpd (fallback)
|
# chronyd (prefer) or ntpd (fallback)
|
||||||
# but do not check if _USE_CHRONYD or _USE_NTPD is already set
|
# but do not check if _USE_CHRONYD, _USE_NTPD or _USE_SYSTEMD is already set
|
||||||
if (( _USE_CHRONYD == 0 && _USE_NTPD == 0 ))
|
if (( _USE_CHRONYD == 0 && _USE_NTPD == 0 && _USE_SYSTEMD == 0 ))
|
||||||
then
|
then
|
||||||
linux_get_init
|
linux_get_init
|
||||||
_CHRONYC_BIN="$(command -v chronyc 2>>${HC_STDERR_LOG})"
|
_CHRONYC_BIN=$(command -v chronyc 2>>"${HC_STDERR_LOG}")
|
||||||
if [[ -n "${_CHRONYC_BIN}" && -x ${_CHRONYC_BIN} ]]
|
if [[ -n "${_CHRONYC_BIN}" && -x ${_CHRONYC_BIN} ]]
|
||||||
then
|
then
|
||||||
# check that chrony is actually enabled
|
# check that chrony is actually enabled
|
||||||
@ -192,14 +223,14 @@ then
|
|||||||
_CHECK_SYSTEMD_SERVICE=$(linux_has_systemd_service "${_CHRONYD_SYSTEMD_SERVICE}")
|
_CHECK_SYSTEMD_SERVICE=$(linux_has_systemd_service "${_CHRONYD_SYSTEMD_SERVICE}")
|
||||||
if (( _CHECK_SYSTEMD_SERVICE > 0 ))
|
if (( _CHECK_SYSTEMD_SERVICE > 0 ))
|
||||||
then
|
then
|
||||||
systemctl --quiet is-enabled ${_CHRONYD_SYSTEMD_SERVICE} 2>>${HC_STDERR_LOG} && _USE_CHRONYD=1
|
systemctl --quiet is-enabled ${_CHRONYD_SYSTEMD_SERVICE} 2>>"${HC_STDERR_LOG}" && _USE_CHRONYD=1
|
||||||
else
|
else
|
||||||
warn "systemd unit file not found {${_CHRONYD_SYSTEMD_SERVICE}}"
|
warn "systemd unit file not found {${_CHRONYD_SYSTEMD_SERVICE}}"
|
||||||
_USE_CHRONYD=0
|
_USE_CHRONYD=0
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
'sysv')
|
'sysv')
|
||||||
chkconfig chronyd >>${HC_STDOUT_LOG} 2>>${HC_STDERR_LOG}
|
chkconfig chronyd >>"${HC_STDOUT_LOG}" 2>>"${HC_STDERR_LOG}"
|
||||||
# shellcheck disable=SC2181
|
# shellcheck disable=SC2181
|
||||||
if (( $? == 0 ))
|
if (( $? == 0 ))
|
||||||
then
|
then
|
||||||
@ -214,14 +245,14 @@ then
|
|||||||
esac
|
esac
|
||||||
(( ARG_DEBUG > 0 )) && debug "chronyd service state: ${_USE_CHRONYD}"
|
(( ARG_DEBUG > 0 )) && debug "chronyd service state: ${_USE_CHRONYD}"
|
||||||
fi
|
fi
|
||||||
_NTPQ_BIN="$(command -v ntpq 2>>${HC_STDERR_LOG})"
|
_NTPQ_BIN=$(command -v ntpq 2>>"${HC_STDERR_LOG}")
|
||||||
if (( _USE_CHRONYD == 0 )) && [[ -n "${_NTPQ_BIN}" && -x ${_NTPQ_BIN} ]]
|
if (( _USE_CHRONYD == 0 )) && [[ -n "${_NTPQ_BIN}" && -x ${_NTPQ_BIN} ]]
|
||||||
then
|
then
|
||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
_USE_NTPD=1
|
_USE_NTPD=1
|
||||||
(( ARG_DEBUG > 0 )) && debug "ntpd service state: ${_USE_NTPD}"
|
(( ARG_DEBUG > 0 )) && debug "ntpd service state: ${_USE_NTPD}"
|
||||||
fi
|
fi
|
||||||
if (( _USE_CHRONYD == 0 && _USE_NTPD == 0 ))
|
if (( _USE_CHRONYD == 0 && _USE_NTPD == 0 && _USE_SYSTEMD == 0 ))
|
||||||
then
|
then
|
||||||
_MSG="unable to find chronyd or ntpd (or they are not enabled)"
|
_MSG="unable to find chronyd or ntpd (or they are not enabled)"
|
||||||
log_hc "$0" 1 "${_MSG}"
|
log_hc "$0" 1 "${_MSG}"
|
||||||
@ -232,240 +263,288 @@ then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# check ntp service
|
# check ntp service (unless _USE_SYSTEMD is explicitly set)
|
||||||
# 1) try using the init ways
|
if (( _USE_SYSTEMD == 0 ))
|
||||||
linux_get_init
|
|
||||||
case "${LINUX_INIT}" in
|
|
||||||
'systemd')
|
|
||||||
if (( _USE_CHRONYD > 0 ))
|
|
||||||
then
|
|
||||||
_CHECK_SYSTEMD_SERVICE=$(linux_has_systemd_service "${_CHRONYD_SYSTEMD_SERVICE}")
|
|
||||||
if (( _CHECK_SYSTEMD_SERVICE > 0 ))
|
|
||||||
then
|
|
||||||
systemctl --quiet is-active ${_CHRONYD_SYSTEMD_SERVICE} 2>>${HC_STDERR_LOG} || _STC=1
|
|
||||||
else
|
|
||||||
warn "systemd unit file not found {${_CHRONYD_SYSTEMD_SERVICE}}"
|
|
||||||
_RC=1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
_CHECK_SYSTEMD_SERVICE=$(linux_has_systemd_service "${_NTPD_SYSTEMD_SERVICE}")
|
|
||||||
if (( _CHECK_SYSTEMD_SERVICE > 0 ))
|
|
||||||
then
|
|
||||||
systemctl --quiet is-active ${_NTPD_SYSTEMD_SERVICE} 2>>${HC_STDERR_LOG} || _STC=1
|
|
||||||
else
|
|
||||||
warn "systemd unit file not found {${_NTPD_SYSTEMD_SERVICE}}"
|
|
||||||
_RC=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
'upstart')
|
|
||||||
warn "code for upstart managed systems not implemented, NOOP"
|
|
||||||
_RC=1
|
|
||||||
;;
|
|
||||||
'sysv')
|
|
||||||
# check running SysV
|
|
||||||
if (( _USE_CHRONYD > 0 ))
|
|
||||||
then
|
|
||||||
if [[ -x ${_CHRONY_INIT_SCRIPT} ]]
|
|
||||||
then
|
|
||||||
if (( $(${_CHRONY_INIT_SCRIPT} status 2>>${HC_STDERR_LOG} | grep -c -i 'is running' 2>/dev/null) == 0 ))
|
|
||||||
then
|
|
||||||
_STC=1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
warn "sysv init script not found {${_NTPD_INIT_SCRIPT}}"
|
|
||||||
_RC=1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [[ -x ${_NTPD_INIT_SCRIPT} ]]
|
|
||||||
then
|
|
||||||
if (( $(${_NTPD_INIT_SCRIPT} status 2>>${HC_STDERR_LOG} | grep -c -i 'is running' 2>/dev/null) == 0 ))
|
|
||||||
then
|
|
||||||
_STC=1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
warn "sysv init script not found {${_NTPD_INIT_SCRIPT}}"
|
|
||||||
_RC=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
_RC=1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# 2) try the pgrep way (note: old pgreps do not support '-c')
|
|
||||||
if (( _RC > 0 ))
|
|
||||||
then
|
then
|
||||||
|
# 1) try using the init ways
|
||||||
|
linux_get_init
|
||||||
|
case "${LINUX_INIT}" in
|
||||||
|
'systemd')
|
||||||
|
if (( _USE_CHRONYD > 0 ))
|
||||||
|
then
|
||||||
|
_CHECK_SYSTEMD_SERVICE=$(linux_has_systemd_service "${_CHRONYD_SYSTEMD_SERVICE}")
|
||||||
|
if (( _CHECK_SYSTEMD_SERVICE > 0 ))
|
||||||
|
then
|
||||||
|
systemctl --quiet is-active ${_CHRONYD_SYSTEMD_SERVICE} 2>>${HC_STDERR_LOG} || _STC=1
|
||||||
|
else
|
||||||
|
warn "systemd unit file not found {${_CHRONYD_SYSTEMD_SERVICE}}"
|
||||||
|
_RC=1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
_CHECK_SYSTEMD_SERVICE=$(linux_has_systemd_service "${_NTPD_SYSTEMD_SERVICE}")
|
||||||
|
if (( _CHECK_SYSTEMD_SERVICE > 0 ))
|
||||||
|
then
|
||||||
|
systemctl --quiet is-active ${_NTPD_SYSTEMD_SERVICE} 2>>${HC_STDERR_LOG} || _STC=1
|
||||||
|
else
|
||||||
|
warn "systemd unit file not found {${_NTPD_SYSTEMD_SERVICE}}"
|
||||||
|
_RC=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
'upstart')
|
||||||
|
warn "code for upstart managed systems not implemented, NOOP"
|
||||||
|
_RC=1
|
||||||
|
;;
|
||||||
|
'sysv')
|
||||||
|
# check running SysV
|
||||||
|
if (( _USE_CHRONYD > 0 ))
|
||||||
|
then
|
||||||
|
if [[ -x ${_CHRONY_INIT_SCRIPT} ]]
|
||||||
|
then
|
||||||
|
if (( $(${_CHRONY_INIT_SCRIPT} status 2>>"${HC_STDERR_LOG}" | grep -c -i 'is running' 2>/dev/null) == 0 ))
|
||||||
|
then
|
||||||
|
_STC=1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "sysv init script not found {${_NTPD_INIT_SCRIPT}}"
|
||||||
|
_RC=1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ -x ${_NTPD_INIT_SCRIPT} ]]
|
||||||
|
then
|
||||||
|
if (( $(${_NTPD_INIT_SCRIPT} status 2>>"${HC_STDERR_LOG}" | grep -c -i 'is running' 2>/dev/null) == 0 ))
|
||||||
|
then
|
||||||
|
_STC=1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "sysv init script not found {${_NTPD_INIT_SCRIPT}}"
|
||||||
|
_RC=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
_RC=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# 2) try the pgrep way (note: old pgreps do not support '-c')
|
||||||
|
if (( _RC > 0 ))
|
||||||
|
then
|
||||||
|
if (( _USE_CHRONYD > 0 ))
|
||||||
|
then
|
||||||
|
(( $(pgrep -u "${_CHRONYD_USER}" 'chronyd' 2>>"${HC_STDERR_LOG}" | wc -l 2>/dev/null) == 0 )) && _STC=1
|
||||||
|
else
|
||||||
|
(( $(pgrep -u "${_NTPD_USER}" 'ntpd' 2>>"${HC_STDERR_LOG}" | wc -l 2>/dev/null) == 0 )) && _STC=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# evaluate results
|
||||||
|
case ${_STC} in
|
||||||
|
0)
|
||||||
|
if (( _USE_CHRONYD > 0 ))
|
||||||
|
then
|
||||||
|
_MSG="chronyd is running"
|
||||||
|
else
|
||||||
|
_MSG="ntpd is running"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
1)
|
||||||
|
if (( _USE_CHRONYD > 0 ))
|
||||||
|
then
|
||||||
|
_MSG="chronyd is not running"
|
||||||
|
else
|
||||||
|
_MSG="ntpd is not running"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if (( _USE_CHRONYD > 0 ))
|
||||||
|
then
|
||||||
|
_MSG="could not determine status of chronyd"
|
||||||
|
else
|
||||||
|
_MSG="could not determine status of ntpd"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
||||||
|
then
|
||||||
|
log_hc "$0" ${_STC} "${_MSG}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check chronyc/ntpq results
|
||||||
|
_STC=0
|
||||||
if (( _USE_CHRONYD > 0 ))
|
if (( _USE_CHRONYD > 0 ))
|
||||||
then
|
then
|
||||||
(( $(pgrep -u "${_CHRONYD_USER}" 'chronyd' 2>>${HC_STDERR_LOG} | wc -l 2>/dev/null) == 0 )) && _STC=1
|
${_CHRONYC_BIN} -nc sources 2>>"${HC_STDERR_LOG}" >>"${HC_STDOUT_LOG}"
|
||||||
|
# shellcheck disable=SC2181
|
||||||
|
if (( $? > 0 ))
|
||||||
|
then
|
||||||
|
_MSG="unable to execute {${_CHRONYC_BIN}}"
|
||||||
|
log_hc "$0" 1 "${_MSG}"
|
||||||
|
# dump debug info
|
||||||
|
(( ARG_DEBUG > 0 && ARG_DEBUG_LEVEL > 0 )) && dump_logs
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 1) active server
|
||||||
|
_CHRONY_PEER="$(grep -E -e '^\^,\*' 2>/dev/null ${HC_STDOUT_LOG} | cut -f3 -d',' 2>/dev/null)"
|
||||||
|
if [[ -z "${_CHRONY_PEER}" ]]
|
||||||
|
then
|
||||||
|
_MSG="chrony is not synchronizing"
|
||||||
|
log_hc "$0" 1 "${_MSG}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
case ${_CHRONY_PEER} in
|
||||||
|
\*127.127.1.0*)
|
||||||
|
_MSG="chrony is synchronizing against its internal clock"
|
||||||
|
_STC=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# some valid server
|
||||||
|
_MSG="chrony is synchronizing against ${_CHRONY_PEER}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
||||||
|
then
|
||||||
|
log_hc "$0" ${_STC} "${_MSG}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2) offset value
|
||||||
|
if (( _STC == 0 ))
|
||||||
|
then
|
||||||
|
_CURR_OFFSET="$(grep -E -e '^\^,\*' 2>/dev/null ${HC_STDOUT_LOG} | cut -f9 -d',' 2>/dev/null)"
|
||||||
|
# convert from us to ms
|
||||||
|
case ${_CURR_OFFSET} in
|
||||||
|
+([-0-9])*(.)*([0-9]))
|
||||||
|
# numeric, OK (negatives are OK too!)
|
||||||
|
# convert from us to ms
|
||||||
|
_CURR_OFFSET=$(print -R "${_CURR_OFFSET} * 1000" | bc 2>/dev/null)
|
||||||
|
# shellcheck disable=SC2181
|
||||||
|
if (( $? > 0 )) || [[ -z "${_CURR_OFFSET}" ]]
|
||||||
|
then
|
||||||
|
:
|
||||||
|
fi
|
||||||
|
# force awk into casting c as a float
|
||||||
|
_CHECK_OFFSET=$(awk -v c="${_CURR_OFFSET}" -v m="${_MAX_OFFSET}" 'BEGIN { sub (/^-/, "", c); print ((c+0.0)>m) }' 2>/dev/null)
|
||||||
|
if (( _CHECK_OFFSET > 0 ))
|
||||||
|
then
|
||||||
|
_MSG="NTP offset of ${_CURR_OFFSET} is bigger than the configured maximum of ${_MAX_OFFSET}"
|
||||||
|
_STC=1
|
||||||
|
else
|
||||||
|
_MSG="NTP offset of ${_CURR_OFFSET} is within the acceptable range"
|
||||||
|
fi
|
||||||
|
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
||||||
|
then
|
||||||
|
log_hc "$0" ${_STC} "${_MSG}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# not numeric
|
||||||
|
warn "invalid offset value of ${_CURR_OFFSET} found for ${_NTP_PEER}?"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
(( $(pgrep -u "${_NTPD_USER}" 'ntpd' 2>>${HC_STDERR_LOG} | wc -l 2>/dev/null) == 0 )) && _STC=1
|
${_NTPQ_BIN} ${_NTPQ_OPTS} 2>>"${HC_STDERR_LOG}" >>"${HC_STDOUT_LOG}"
|
||||||
|
# RC is always 0
|
||||||
|
|
||||||
|
# 1) active server
|
||||||
|
_NTP_PEER="$(grep -E -e '^\*' 2>/dev/null ${HC_STDOUT_LOG} | awk '{ print $1 }' 2>/dev/null)"
|
||||||
|
if [[ -z "${_NTP_PEER}" ]]
|
||||||
|
then
|
||||||
|
_MSG="NTP is not synchronizing"
|
||||||
|
log_hc "$0" 1 "${_MSG}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
case ${_NTP_PEER} in
|
||||||
|
\*127.127.1.0*)
|
||||||
|
_MSG="NTP is synchronizing against its internal clock"
|
||||||
|
_STC=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# some valid server
|
||||||
|
_MSG="NTP is synchronizing against ${_NTP_PEER##*\*}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
||||||
|
then
|
||||||
|
log_hc "$0" ${_STC} "${_MSG}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2) offset value
|
||||||
|
if (( _STC == 0 ))
|
||||||
|
then
|
||||||
|
_CURR_OFFSET="$(grep -E -e '^\*' 2>/dev/null ${HC_STDOUT_LOG} | awk '{ print $9 }' 2>/dev/null)"
|
||||||
|
case ${_CURR_OFFSET} in
|
||||||
|
+([-0-9])*(.)*([0-9]))
|
||||||
|
# numeric, OK (negatives are OK, force awk into casting c as a float)
|
||||||
|
_CHECK_OFFSET=$(awk -v c="${_CURR_OFFSET}" -v m="${_MAX_OFFSET}" 'BEGIN { sub (/^-/, "", c); print ((c+0.0)>m) }' 2>/dev/null)
|
||||||
|
if (( _CHECK_OFFSET > 0 ))
|
||||||
|
then
|
||||||
|
_MSG="NTP offset of ${_CURR_OFFSET} is bigger than the configured maximum of ${_MAX_OFFSET}"
|
||||||
|
_STC=1
|
||||||
|
else
|
||||||
|
_MSG="NTP offset of ${_CURR_OFFSET} is within the acceptable range"
|
||||||
|
fi
|
||||||
|
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
||||||
|
then
|
||||||
|
log_hc "$0" ${_STC} "${_MSG}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# not numeric
|
||||||
|
warn "invalid offset value of ${_CURR_OFFSET} found for ${_NTP_PEER}?"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# evaluate results
|
|
||||||
case ${_STC} in
|
|
||||||
0)
|
|
||||||
if (( _USE_CHRONYD > 0 ))
|
|
||||||
then
|
|
||||||
_MSG="chronyd is running"
|
|
||||||
else
|
|
||||||
_MSG="ntpd is running"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
1)
|
|
||||||
if (( _USE_CHRONYD > 0 ))
|
|
||||||
then
|
|
||||||
_MSG="chronyd is not running"
|
|
||||||
else
|
|
||||||
_MSG="ntpd is not running"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if (( _USE_CHRONYD > 0 ))
|
|
||||||
then
|
|
||||||
_MSG="could not determine status of chronyd"
|
|
||||||
else
|
|
||||||
_MSG="could not determine status of ntpd"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
|
||||||
then
|
|
||||||
log_hc "$0" ${_STC} "${_MSG}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# check chronyc/ntpq results
|
# check systemd-timesyncd results
|
||||||
_STC=0
|
_STC=0
|
||||||
if (( _USE_CHRONYD > 0 ))
|
if (( _USE_SYSTEMD > 0 ))
|
||||||
then
|
then
|
||||||
${_CHRONYC_BIN} -nc sources 2>>${HC_STDERR_LOG} >>${HC_STDOUT_LOG}
|
${_TIMEDATECTL_BIN} show 2>"${HC_STDERR_LOG}" >"${HC_STDOUT_LOG}"
|
||||||
# shellcheck disable=SC2181
|
# shellcheck disable=SC2181
|
||||||
if (( $? > 0 ))
|
if (( $? > 0 ))
|
||||||
then
|
then
|
||||||
_MSG="unable to execute {${_CHRONYC_BIN}}"
|
_MSG="unable to execute {${_TIMEDATECTL_BIN}}"
|
||||||
log_hc "$0" 1 "${_MSG}"
|
log_hc "$0" 1 "${_MSG}"
|
||||||
# dump debug info
|
# dump debug info
|
||||||
(( ARG_DEBUG > 0 && ARG_DEBUG_LEVEL > 0 )) && dump_logs
|
(( ARG_DEBUG > 0 && ARG_DEBUG_LEVEL > 0 )) && dump_logs
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 1) active server
|
# check if NTP is active
|
||||||
_CHRONY_PEER="$(grep -E -e '^\^,\*' 2>/dev/null ${HC_STDOUT_LOG} | cut -f3 -d',' 2>/dev/null)"
|
_STC=0
|
||||||
if [[ -z "${_CHRONY_PEER}" ]]
|
_IS_ACTIVE=$(grep -c "^NTP=yes" "${HC_STDOUT_LOG}" 2>/dev/null)
|
||||||
then
|
if (( _IS_ACTIVE == 0 ))
|
||||||
_MSG="chrony is not synchronizing"
|
|
||||||
log_hc "$0" 1 "${_MSG}"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
case ${_CHRONY_PEER} in
|
|
||||||
\*127.127.1.0*)
|
|
||||||
_MSG="chrony is synchronizing against its internal clock"
|
|
||||||
_STC=1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# some valid server
|
|
||||||
_MSG="chrony is synchronizing against ${_CHRONY_PEER}"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
|
||||||
then
|
|
||||||
log_hc "$0" ${_STC} "${_MSG}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 2) offset value
|
|
||||||
if (( _STC == 0 ))
|
|
||||||
then
|
|
||||||
_CURR_OFFSET="$(grep -E -e '^\^,\*' 2>/dev/null ${HC_STDOUT_LOG} | cut -f9 -d',' 2>/dev/null)"
|
|
||||||
# convert from us to ms
|
|
||||||
case ${_CURR_OFFSET} in
|
|
||||||
+([-0-9])*(.)*([0-9]))
|
|
||||||
# numeric, OK (negatives are OK too!)
|
|
||||||
# convert from us to ms
|
|
||||||
_CURR_OFFSET=$(print -R "${_CURR_OFFSET} * 1000" | bc 2>/dev/null)
|
|
||||||
# shellcheck disable=SC2181
|
|
||||||
if (( $? > 0 )) || [[ -z "${_CURR_OFFSET}" ]]
|
|
||||||
then
|
|
||||||
:
|
|
||||||
fi
|
|
||||||
# force awk into casting c as a float
|
|
||||||
_CHECK_OFFSET=$(awk -v c="${_CURR_OFFSET}" -v m="${_MAX_OFFSET}" 'BEGIN { sub (/^-/, "", c); print ((c+0.0)>m) }' 2>/dev/null)
|
|
||||||
if (( _CHECK_OFFSET > 0 ))
|
|
||||||
then
|
|
||||||
_MSG="NTP offset of ${_CURR_OFFSET} is bigger than the configured maximum of ${_MAX_OFFSET}"
|
|
||||||
_STC=1
|
|
||||||
else
|
|
||||||
_MSG="NTP offset of ${_CURR_OFFSET} is within the acceptable range"
|
|
||||||
fi
|
|
||||||
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
|
||||||
then
|
|
||||||
log_hc "$0" ${_STC} "${_MSG}"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# not numeric
|
|
||||||
warn "invalid offset value of ${_CURR_OFFSET} found for ${_NTP_PEER}?"
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
else
|
|
||||||
${_NTPQ_BIN} ${_NTPQ_OPTS} 2>>${HC_STDERR_LOG} >>${HC_STDOUT_LOG}
|
|
||||||
# RC is always 0
|
|
||||||
|
|
||||||
# 1) active server
|
|
||||||
_NTP_PEER="$(grep -E -e '^\*' 2>/dev/null ${HC_STDOUT_LOG} | awk '{ print $1 }' 2>/dev/null)"
|
|
||||||
if [[ -z "${_NTP_PEER}" ]]
|
|
||||||
then
|
then
|
||||||
_MSG="NTP is not synchronizing"
|
_MSG="NTP is not synchronizing"
|
||||||
log_hc "$0" 1 "${_MSG}"
|
_STC=1
|
||||||
return 0
|
else
|
||||||
|
_MSG="NTP is synchronizing"
|
||||||
fi
|
fi
|
||||||
case ${_NTP_PEER} in
|
|
||||||
\*127.127.1.0*)
|
|
||||||
_MSG="NTP is synchronizing against its internal clock"
|
|
||||||
_STC=1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# some valid server
|
|
||||||
_MSG="NTP is synchronizing against ${_NTP_PEER##*\*}"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
||||||
then
|
then
|
||||||
log_hc "$0" ${_STC} "${_MSG}"
|
log_hc "$0" ${_STC} "${_MSG}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2) offset value
|
# check if clock is synchronized
|
||||||
if (( _STC == 0 ))
|
_STC=0
|
||||||
|
_IS_SYNCHRONIZED=$(grep -c "^NTPSynchronized=yes" "${HC_STDOUT_LOG}" 2>/dev/null)
|
||||||
|
if (( _IS_SYNCHRONIZED == 0 ))
|
||||||
then
|
then
|
||||||
_CURR_OFFSET="$(grep -E -e '^\*' 2>/dev/null ${HC_STDOUT_LOG} | awk '{ print $9 }' 2>/dev/null)"
|
_MSG="NTP is not synchronizing"
|
||||||
case ${_CURR_OFFSET} in
|
_STC=1
|
||||||
+([-0-9])*(.)*([0-9]))
|
else
|
||||||
# numeric, OK (negatives are OK, force awk into casting c as a float)
|
_MSG="NTP is synchronizing"
|
||||||
_CHECK_OFFSET=$(awk -v c="${_CURR_OFFSET}" -v m="${_MAX_OFFSET}" 'BEGIN { sub (/^-/, "", c); print ((c+0.0)>m) }' 2>/dev/null)
|
fi
|
||||||
if (( _CHECK_OFFSET > 0 ))
|
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
||||||
then
|
then
|
||||||
_MSG="NTP offset of ${_CURR_OFFSET} is bigger than the configured maximum of ${_MAX_OFFSET}"
|
log_hc "$0" ${_STC} "${_MSG}"
|
||||||
_STC=1
|
|
||||||
else
|
|
||||||
_MSG="NTP offset of ${_CURR_OFFSET} is within the acceptable range"
|
|
||||||
fi
|
|
||||||
if (( _LOG_HEALTHY > 0 || _STC > 0 ))
|
|
||||||
then
|
|
||||||
log_hc "$0" ${_STC} "${_MSG}"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# not numeric
|
|
||||||
warn "invalid offset value of ${_CURR_OFFSET} found for ${_NTP_PEER}?"
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -483,10 +562,11 @@ CONFIG : $3 with:
|
|||||||
max_offset=<max_offset (ms)>
|
max_offset=<max_offset (ms)>
|
||||||
force_chrony=<yes|no>
|
force_chrony=<yes|no>
|
||||||
force_ntp=<yes|no>
|
force_ntp=<yes|no>
|
||||||
|
force_systemd=<yes|no>
|
||||||
ntpq_use_ipv4=<yes|no>
|
ntpq_use_ipv4=<yes|no>
|
||||||
EXTRA OPTS : --hc-args=force_chrony, --hc-args=force_ntp
|
EXTRA OPTS : --hc-args=force_chrony, --hc-args=force_ntp, --hc-args=force_systemd
|
||||||
PURPOSE : Checks the status of NTP service & synchronization.
|
PURPOSE : Checks the status of NTP service & synchronization.
|
||||||
Supports chronyd & ntpd.
|
Supports chronyd, ntpd & systemd-timesyncd
|
||||||
Assumes chronyd is the preferred time synchronization.
|
Assumes chronyd is the preferred time synchronization.
|
||||||
LOG HEALTHY : Supported
|
LOG HEALTHY : Supported
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user