File conf.start-ntpd of Package ntp.500

#! /bin/sh
# Copyright (c) 1995-2014 SuSE Linux AG, Nuernberg, Germany.
# All rights reserved.
#
# Author: Peter Varkoly

# set default options
NTP_CONF="/etc/ntp.conf"
if [ ! -f ${NTP_CONF} ]; then
  echo -n "Time server configuration file, ${NTP_CONF} does not exist."
  exit 6
fi

NTPD_BIN="/usr/sbin/ntpd"
if [ ! -x ${NTPD_BIN} ]; then
  echo -n "Time server, ${NTPD_BIN} not installed!"
  exit 5
fi

NTPD_OPTIONS="-g -u ntp:ntp"
NTPD_RUN_CHROOTED="yes"

NTPDC_BIN="/usr/sbin/ntpdc"

NTP_KEYS=$(awk '/^keys/ { print $2 }' $NTP_CONF)
NTP_KEYID=$(awk '/^requestkey[[:blank:]]/ { print $2 }' $NTP_CONF)
NTP_PASSWD=$(test -n "$NTP_KEYS" -a -n "$NTP_KEYID" -a -r "$NTP_KEYS" && awk '$0 ~ key { print $3 }' key="^[[:blank:]]*$NTP_KEYID[[:blank:]]" $NTP_KEYS)

if [ -n "$NTP_KEYS" ]; then
  if test -z "$NTP_KEYID"; then
    echo -n "NTP key id not defined"
      exit 5
  fi
  if test -z "$NTP_PASSWD"; then
    echo -n "No password for requestkey set"
    exit 1
  fi
fi

# Override defaults, if we have the sysconfig file
test -f /etc/sysconfig/ntp && . /etc/sysconfig/ntp

function update_cmos() { return 0; }
# Now see if we have to fix the CMOS clock
if [ "$NTPD_FORCE_SYNC_ON_STARTUP" = yes -a "$1" = ntptimeset ] ; then
  test -f /etc/sysconfig/clock && . /etc/sysconfig/clock
  if test -r /proc/xen/capabilities ; then
    read -t1 caps < /proc/xen/capabilities
    test "$caps" = "${caps%control_d*}" && NTPD_FORCE_SYNC_HWCLOCK_ON_STARTUP=no
  fi
  case "$(uname -i)" in
  s390*) NTPD_FORCE_SYNC_HWCLOCK_ON_STARTUP=no
  esac
  if [ "$NTPD_FORCE_SYNC_HWCLOCK_ON_STARTUP" = yes ] ; then
    function update_cmos() {
      if test -e /dev/rtc ; then
	/sbin/hwclock --systohc $HWCLOCK
	return $?
      fi
      if test -z "$(/sbin/modprobe -l rtc_cmos)" ; then
	/sbin/hwclock --systohc $HWCLOCK
	return $?
      fi
      local temprules=/dev/.udev/rules.d
      local uevseqnum=/sys/kernel/uevent_seqnum
      local rule=$temprules/95-rtc-cmos.rules
      local -i start=0 end=0
      /bin/mkdir -m 0755 -p $temprules
      echo ACTION==\"add\", KERNEL==\"rtc0\", RUN=\"/sbin/hwclock --systohc $HWCLOCK --rtc=\$env{DEVNAME}\" > $rule
      test -e $uevseqnum && read -t 1 start < $uevseqnum
      if /sbin/modprobe -q rtc_cmos ; then
	test -e $uevseqnum && read -t 1 end < $uevseqnum
	if test $start -lt $end ; then
	  /sbin/udevadm settle --quiet --seq-start=$start --seq-end=$end
	else
	  /sbin/udevadm settle --quiet
	fi
      else
	rm -f $rule
        /sbin/hwclock --systohc $HWCLOCK
      fi
    }
  fi
fi

# set Default CHROOT path if not set but wanted
test "${NTPD_RUN_CHROOTED}" = "yes" && \
  CHROOT_PREFIX="/var/lib/ntp" || \
  CHROOT_PREFIX=""

# set default PID variables
NTPD_PID="${CHROOT_PREFIX}/var/run/ntp/ntpd.pid"

# Create if /var/run is on tmpfs
test -e /var/run/ntp || ln -s /var/lib/ntp/var/run/ntp /var/run

function ntpd_is_running() {
  service ntpd status >/dev/null
}

function parse_symlink() {
  if [ -c "$NTP_PARSE_DEVICE" ]; then
    if [ -n "$NTP_PARSE_LINK" ]; then
    ln -sf $NTP_PARSE_DEVICE $NTP_PARSE_LINK
    fi
  fi
}

function prepare_chroot() {
  for configfile in /etc/{localtime,ntp.keys} $NTP_CONF $NTPD_CHROOT_FILES; do
    test -d ${CHROOT_PREFIX}${configfile%/*} || mkdir -p ${CHROOT_PREFIX}${configfile%/*}
    if [ -r ${configfile} ]
    then
    	cp -aL ${configfile} ${CHROOT_PREFIX}${configfile%/*}
    else
        echo
	echo "Warning: ${configfile} not found or not readable"
    fi
  done
  mkdir -p ${CHROOT_PREFIX}/var/log
  mkdir -p ${CHROOT_PREFIX}/proc
  mount -t proc none -o ro,nosuid,nodev "${CHROOT_PREFIX}/proc" 2>/dev/null
  NTPD_OPTIONS="${NTPD_OPTIONS} -i ${CHROOT_PREFIX}"
}

function runtime_configuration() {
  for f in /var/run/ntp/servers*; do
    if [ -r ${f} ]; then
      . ${f}
      ntp_server="${ntp_server} ${RUNTIME_SERVERS}"
    fi
  done
  if [ -n "${ntp_server}" ]; then
    for s in ${ntp_server}; do
      add_runtime_server ${s}
    done
  fi
}

function add_runtime_server() {
  /usr/sbin/sntp -s $@
  NTPC_CMD="keyid $NTP_KEYID\npasswd $NTP_PASSWD\naddserver $@\n"
  NTPDC_LOG=$(echo -e "${NTPC_CMD}quit" | $NTPDC_BIN)
  logger -t $0 "runtime configuration: $NTPDC_LOG"
}

function reloaddevices {
  NTPC_CMD="keyid $NTP_KEYID\npasswd $NTP_PASSWD\nifreload\n"
  NTPDC_LOG=$(echo -e "${NTPC_CMD}quit" | $NTPDC_BIN)
  logger -t $0 "runtime configuration: $NTPDC_LOG"
}

function get_ntpd_ip_proto() {
  local -a OPTS
  read -ra OPTS <<< "$NTPD_OPTIONS"
  for i in "${OPTS[@]}"; do
    if [ "$i" = "-4" ] || [ "$i" = "-6" ]; then
      # first occurrence wins safely because ntpd couldn't handle more anyway
      echo "$i"
      return
    fi
  done
  echo ""
  return
}

case "$1" in
  start)
    if [ "$NTPD_FORCE_SYNC_ON_STARTUP" = "yes" ]; then
        # get the initial date from the timeservers configured in ntp.conf
        ntpd_is_running || $0 ntptimeset
    fi
    echo -n "Starting network time protocol daemon (NTPD)"
    # do we need a refclock symlink?
    parse_symlink
    # do we run chrooted?
    test "${NTPD_RUN_CHROOTED}" = "yes" && prepare_chroot

    $NTPD_BIN -p ${NTPD_PID#${CHROOT_PREFIX}} $NTPD_OPTIONS -c $NTP_CONF

    if [ -n "${NTP_KEYS}" ]; then
      runtime_configuration
    fi

  ;;
  addserver)
    if [ -z "${NTP_KEYS}" ]; then
      echo "Runtime configuration disabled, no key file specified."
      exit 1
    fi

    if test $# -lt 2; then
      echo "No servers to add specified"
      exit 1
    fi
    shift

    service ntpd status 2>&1 >/dev/null
    if test $? = 0;
    then
      add_runtime_server "$@"
    fi
  ;;
  ntptimeset)
    NTPD_PROTO="$( get_ntpd_ip_proto )"
    for i in $(gawk '/^server/ { if( $2 !~ "^127.127." ) print $2","$3 }' $NTP_CONF)
    do 
        IFS=',' read -ra SERVER <<< "$i"
        if [ ${SERVER[0]} = "-4" ] || [ ${SERVER[0]} = "-6" ]
        then
            if [ -z "${NTPD_PROTO}" ] || [ "${NTPD_PROTO}" = "${SERVER[0]}" ]
            then
                SNTP_OPT="${SERVER[0]} ${SERVER[1]}"
            else
                # ignore servers with conflicting proto
                continue
            fi
        else
            # here the usual case with empty NTPD_PROTO (default/yast config)
            SNTP_OPT="$NTPD_PROTO ${SERVER[0]}"
        fi
        sntp -t 2 -l /dev/null -s $SNTP_OPT 2> /dev/null && { SYNCHRONISED=$SNTP_OPT; break; };
    done
    if [ "$SYNCHRONISED" ]
    then
	    echo "Time synchronized with $SYNCHRONISED"
	    update_cmos
    else
	    echo "Time could not be synchronized"
    fi
  ;;
  *)
    echo "Usage: $0 {start|addserver|ntptimeset}"
    exit 1
  ;;
esac
openSUSE Build Service is sponsored by