#!/bin/bash # # Resource script for ntp daemon with namespace support # # Description: Manages ntp daemon as an OCF resource in # an High Availability setup inside a namespace # # HAProxy OCF script's Author: Mirantis # License: GNU General Public License (GPL) # # usage: $0 {start|stop|restart|status|monitor|validate-all|meta-data} # # The "start" arg starts ntp. # # The "stop" arg stops it. # # OCF parameters: # OCF_RESKEY_ns # OCF_RESKEY_conffile # OCF_RESKEY_pidfile # OCF_RESKEY_binpath # OCF_RESKEY_extraconf # # Note: This RA requires that the ntp config files has a "pidfile" # entry so that it is able to act on the correct process ########################################################################## # Initialization: OCF_ROOT_default="/usr/lib/ocf" OCF_RESKEY_ns_default="vrouter" OCF_RESKEY_conffile_default="/etc/ntp.conf" OCF_RESKEY_pidfile_default="/var/run/ntpd.pid" OCF_RESKEY_binpath_default="/usr/sbin/ntpd" OCF_RESKEY_extraconf_default="" : ${OCF_ROOT=${OCF_ROOT_default}} : ${HA_LOGTAG="ocf-ns_ntp"} : ${HA_LOGFACILITY="daemon"} : ${OCF_RESKEY_ns=${OCF_RESKEY_ns_default}} : ${OCF_RESKEY_conffile=${OCF_RESKEY_conffile_default}} : ${OCF_RESKEY_pidfile=${OCF_RESKEY_pidfile_default}} : ${OCF_RESKEY_binpath=${OCF_RESKEY_binpath_default}} : ${OCF_RESKEY_extraconf=${OCF_RESKEY_extraconf_default}} : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat} . ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs USAGE="Usage: $0 {start|stop|restart|status|monitor|validate-all|meta-data}"; if [ -n "${OCF_RESKEY_ns}" ]; then RUN="ip netns exec ${OCF_RESKEY_ns} " else RUN='' fi ########################################################################## usage() { echo $USAGE >&2 } meta_data() { cat < 1.0 This script manages ntp daemon with namespace support Manages an ntp daemon inside a namespace Name of network namespace. Should be present. Name of network namespace. The ntp daemon configuration file name with full path. For example, "/etc/ntp/ntp.cfg" Configuration file name with full path The ntp pid file path. For example, "/var/run/ntp.pid" Full path to the ntp pid file The ntp binary path. For example, "/usr/sbin/ntp" Full path to the ntp binary Extra command line arguments to pass to ntp. For example, "-f /etc/ntp/shared.cfg" Extra command line arguments for ntp END exit $OCF_SUCCESS } get_variables() { CONF_FILE="${OCF_RESKEY_conffile}" COMMAND="${RUN} ${OCF_RESKEY_binpath}" PIDFILE="${OCF_RESKEY_pidfile}" } ntp_status() { get_variables if [ -n "${PIDFILE}" -a -f "${PIDFILE}" ]; then # ntp is probably running # get pid from pidfile PID="`cat ${PIDFILE}`" if [ -n "${PID}" ]; then # check if process exists if ps -p "${PID}" | grep -q ntp; then if [ -n "${OCF_RESKEY_ns}" ]; then NS=`ip netns identify "${PID}"` if [ "${NS}" != "${OCF_RESKEY_ns}" ]; then # ntp is running with the correct pid # but not in the right network namespace ocf_log info "ntp daemon is running in a wrong namespace." return "${OCF_ERR_GENERIC}" fi fi ocf_log info "ntp daemon running" return "${OCF_SUCCESS}" else ocf_log info "ntp daemon is not running but pid file exists" return "${OCF_NOT_RUNNING}" fi else ocf_log err "PID file empty!" return "${OCF_ERR_GENERIC}" fi fi # ntp is not running ocf_log info "ntp daemon is not running" return "${OCF_NOT_RUNNING}" } ntp_start() { get_variables # if ntp is running return success ntp_status rc="${?}" if [ "${rc}" -eq "${OCF_SUCCESS}" ]; then return "${OCF_SUCCESS}" elif [ "${rc}" -ne "${OCF_NOT_RUNNING}" ]; then ocf_log err "Error. Unknown status." return "${OCF_ERR_GENERIC}" fi # run the ntp binary ocf_run ${COMMAND} ${OCF_RESKEY_extraconf} -u ntp:ntp -p "${PIDFILE}" -4 -g -c "${CONF_FILE}" if [ "${?}" -ne "0" ]; then ocf_log err "Error. ntp daemon returned error $?." return "${OCF_ERR_GENERIC}" fi ocf_log info "Started ntp daemon." return "${OCF_SUCCESS}" } ntp_stop() { get_variables ntp_status rc="${?}" if [ "${rc}" -eq "${OCF_SUCCESS}" -o "${rc}" -eq "${OCF_ERR_GENERIC}" ]; then PID="`cat ${PIDFILE}`" if [ -n "${PID}" ] ; then kill "${PID}" if [ "${?}" -ne "0" ]; then kill -SIGKILL "${PID}" if [ "${?}" -ne "0" ]; then ocf_log err "Error. Could not stop ntp daemon." return "${OCF_ERR_GENERIC}" fi fi rm -f "${PIDFILE}" fi fi ocf_log info "Stopped ntp daemon." return "${OCF_SUCCESS}" } ntp_monitor() { ntp_status } ntp_validate_all() { get_variables if [ -n "${OCF_RESKEY_binpath}" -a ! -x "${OCF_RESKEY_binpath}" ]; then ocf_log err "Binary path $OCF_RESKEY_binpath does not exist." return "${OCF_ERR_ARGS}" fi if [ -n "${OCF_RESKEY_conffile}" -a ! -f "${OCF_RESKEY_conffile}" ]; then ocf_log err "Config file $OCF_RESKEY_conffile does not exist." return "${OCF_ERR_ARGS}" fi if grep -v '^#' "${CONF_FILE}" | grep 'pidfile' > /dev/null ; then : else ocf_log err "Error. 'pidfile' entry required in the ntp config file by ntp OCF RA." return "${OCF_ERR_GENERIC}" fi return "${OCF_SUCCESS}" } ntp_restart() { ntp_stop ntp_start } # # Main # if [ $# -ne 1 ]; then usage exit "${OCF_ERR_ARGS}" fi case $1 in start) ntp_start ;; stop) ntp_stop ;; restart) ntp_restart ;; status) ntp_status ;; monitor) ntp_monitor ;; validate-all) ntp_validate_all ;; meta-data) meta_data ;; usage) usage; exit "${OCF_SUCCESS}" ;; *) usage; exit "${OCF_ERR_UNIMPLEMENTED}" ;; esac