#!/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}} : ${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}"; RUN_IN_NS="ip netns exec $OCF_RESKEY_ns " if [[ -z $OCF_RESKEY_ns ]] ; then RUN='' else RUN="$RUN_IN_NS " 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 $RUN ps -p "${PID}" | grep -q ntp; then 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 retVal=$? if [ $retVal -eq $OCF_SUCCESS ]; then return $OCF_SUCCESS elif [ $retVal -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}" -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 if ntp_status ; then PID="`${RUN} 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