mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +00:00 
			
		
		
		
	@@ -1,205 +1,308 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
			
		||||
#
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# setup NTP configuration on the compute nodes
 | 
			
		||||
# setupchrony - Set up chrony
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2018 International Business Machines
 | 
			
		||||
# Eclipse Public License, Version 1.0 (EPL-1.0)
 | 
			
		||||
#     <http://www.eclipse.org/legal/epl-v10.html>
 | 
			
		||||
#
 | 
			
		||||
# 2018-07-11 GONG Jie <gongjie@linux.vnet.ibm.com>
 | 
			
		||||
#     - Draft
 | 
			
		||||
# 2018-07-13 GONG Jie <gongjie@linux.vnet.ibm.com>
 | 
			
		||||
#     - Release to field
 | 
			
		||||
#
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
if [ "$(uname -s|tr 'A-Z' 'a-z')" = "linux" ];then
 | 
			
		||||
   str_dir_name=`dirname $0`
 | 
			
		||||
   . $str_dir_name/xcatlib.sh
 | 
			
		||||
fi
 | 
			
		||||
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
 | 
			
		||||
export PATH
 | 
			
		||||
 | 
			
		||||
# if on the Management Node
 | 
			
		||||
if [ -e /etc/xCATMN ]; then
 | 
			
		||||
   logger -t xcat -p local4.info "setupntp: This postscript does not support running on the management node. Please run makentp command. exiting"
 | 
			
		||||
   exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
#for service node, the makentp -a command will call this postscript
 | 
			
		||||
#so do not diable service node.
 | 
			
		||||
 | 
			
		||||
exit_code=0;
 | 
			
		||||
master=$MASTER
 | 
			
		||||
setup=0
 | 
			
		||||
conf_file="/etc/ntp.conf"
 | 
			
		||||
conf_file_org="/etc/ntp.conf.org"
 | 
			
		||||
conf_file_backup="/etc/ntp.conf.postbackup"
 | 
			
		||||
 | 
			
		||||
# pmatch determines if 1st argument string is matched by 2nd argument pattern
 | 
			
		||||
pmatch ()
 | 
			
		||||
#
 | 
			
		||||
# warn_if_bad           Put out warning message(s) if $1 has bad RC.
 | 
			
		||||
#
 | 
			
		||||
#       $1      0 (pass) or non-zero (fail).
 | 
			
		||||
#       $2+     Remaining arguments printed only if the $1 is non-zero.
 | 
			
		||||
#
 | 
			
		||||
#       Incoming $1 is returned unless it is 0
 | 
			
		||||
#
 | 
			
		||||
function warn_if_bad()
 | 
			
		||||
{
 | 
			
		||||
  case $1 in
 | 
			
		||||
    $2) return 0;;  # zero return code means string matched by pattern
 | 
			
		||||
  esac
 | 
			
		||||
	local -i rc="$1"
 | 
			
		||||
	local script="${0##*/}"
 | 
			
		||||
 | 
			
		||||
  return 1          # non-zero return code means string not matched by pattern
 | 
			
		||||
	# Ignore if no problems
 | 
			
		||||
	[ "${rc}" -eq "0" ] && return 0
 | 
			
		||||
 | 
			
		||||
	# Broken
 | 
			
		||||
	shift
 | 
			
		||||
	logger -t xcat -p local4.info "${script}: $@" >/dev/null 2>&1
 | 
			
		||||
	echo "${script}: $@" >&2
 | 
			
		||||
	return "${rc}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
is_lsb_cumulus ()
 | 
			
		||||
#
 | 
			
		||||
# exit_if_bad           Put out error message(s) if $1 has bad RC.
 | 
			
		||||
#
 | 
			
		||||
#       $1      0 (pass) or non-zero (fail).
 | 
			
		||||
#       $2+     Remaining arguments printed only if the $1 is non-zero.
 | 
			
		||||
#
 | 
			
		||||
#               Exits with 1 unless $1 is 0
 | 
			
		||||
#
 | 
			
		||||
function exit_if_bad()
 | 
			
		||||
{
 | 
			
		||||
  grep -qs Cumulus /etc/lsb-release
 | 
			
		||||
  return $?
 | 
			
		||||
	warn_if_bad "$@" || exit 1
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
logger -t xcat "Install: Setup NTP"
 | 
			
		||||
# Use the ntpservers defined in the site table, if they exist. 
 | 
			
		||||
# If the value of ntpservers is <xcatmaster> use the service node or
 | 
			
		||||
# the management node as the ntp server.
 | 
			
		||||
if [ $NTPSERVERS ]; then
 | 
			
		||||
    if [ "$NODESETSTATE" = "statelite" ]; then
 | 
			
		||||
        cp -a $conf_file $conf_file_org
 | 
			
		||||
        echo  "" > $conf_file
 | 
			
		||||
    else
 | 
			
		||||
        if [ !  -f $conf_file_org ]; then
 | 
			
		||||
            mv -f $conf_file $conf_file_org
 | 
			
		||||
        else
 | 
			
		||||
            mv -f $conf_file $conf_file_backup
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
    if [ "$NTPSERVERS" = "<xcatmaster>" ] || [ "$NTPSERVERS" = "<xcatmaster>" ]; then
 | 
			
		||||
        echo "server $master" >>$conf_file
 | 
			
		||||
    else
 | 
			
		||||
        for i in $(echo $NTPSERVERS | tr ',' ' ')
 | 
			
		||||
        do
 | 
			
		||||
            if ping $i -c 1 > /dev/null 2>&1 ; then
 | 
			
		||||
         	echo "server $i" >>$conf_file
 | 
			
		||||
        	master=$i
 | 
			
		||||
                setup=1
 | 
			
		||||
            fi
 | 
			
		||||
        done 
 | 
			
		||||
        if [ $setup -eq 0 ]; then
 | 
			
		||||
	    echo "server $master" >$conf_file
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
else
 | 
			
		||||
	echo "server $master" >$conf_file
 | 
			
		||||
#
 | 
			
		||||
# check_executes        Check for executable(s)
 | 
			
		||||
#
 | 
			
		||||
#       Returns 0 if true.
 | 
			
		||||
#       Returns 1 if not.
 | 
			
		||||
#
 | 
			
		||||
function check_executes()
 | 
			
		||||
{
 | 
			
		||||
	local cmd
 | 
			
		||||
	local all_ok="yes"
 | 
			
		||||
	for cmd in "$@"
 | 
			
		||||
	do
 | 
			
		||||
		if ! type "${cmd}" &>/dev/null
 | 
			
		||||
		then
 | 
			
		||||
			echo "Command \"${cmd}\" not found." >&2
 | 
			
		||||
			all_ok="no"
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
	[ "${all_ok}" = "yes" ]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# check_exec_or_exit    Check for required executables.
 | 
			
		||||
#
 | 
			
		||||
#       Exits (not returns) if commands listed on command line do not exist.
 | 
			
		||||
#
 | 
			
		||||
#       Returns 0 if true.
 | 
			
		||||
#       Exits with 1 if not.
 | 
			
		||||
#
 | 
			
		||||
function check_exec_or_exit()
 | 
			
		||||
{
 | 
			
		||||
	check_executes "$@"
 | 
			
		||||
	exit_if_bad "$?" "Above listed required command(s) not found."
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[ "${UID}" -eq "0" ]
 | 
			
		||||
exit_if_bad "$?" "Must be run by UID=0. Actual UID=${UID}."
 | 
			
		||||
 | 
			
		||||
declare -a NTP_SERVERS=()
 | 
			
		||||
 | 
			
		||||
# Handle command line arguments
 | 
			
		||||
while [ "$#" -gt "0" ]
 | 
			
		||||
do
 | 
			
		||||
        case "$1" in
 | 
			
		||||
	"--use-ntpd")
 | 
			
		||||
		# Use traditional ntpd
 | 
			
		||||
		USE_NTPD="yes"
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		NTP_SERVERS+=($1)
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
	shift
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
if [ "${#NTP_SERVERS[@]}" -eq "0" ]
 | 
			
		||||
then
 | 
			
		||||
	# Handle xCAT passed environment variables
 | 
			
		||||
	case "${NTPSERVERS}" in
 | 
			
		||||
	"<xcatmaster>"|"<xcatmaster>"|"")
 | 
			
		||||
		NTP_SERVERS=(${MASTER})
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		OLD_IFS="${IFS}"
 | 
			
		||||
		IFS=","
 | 
			
		||||
		NTP_SERVERS=(${NTPSERVERS})
 | 
			
		||||
		IFS="${OLD_IFS}"
 | 
			
		||||
		unset OLD_IFS
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Unset xCAT passed environment variables
 | 
			
		||||
unset MASTER
 | 
			
		||||
unset NTPSERVERS
 | 
			
		||||
 | 
			
		||||
OS_TYPE=`uname`
 | 
			
		||||
if [ $OS_TYPE = Linux ]; then
 | 
			
		||||
    # Set the timezone
 | 
			
		||||
    if [ -n $TIMEZONE ]; then
 | 
			
		||||
        echo $TIMEZONE > /etc/timezone
 | 
			
		||||
        if type timedatectl > /dev/null; then
 | 
			
		||||
            timedatectl set-timezone $(cat /etc/timezone)
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
check_executes chronyd || USE_NTPD="yes"
 | 
			
		||||
 | 
			
		||||
    mkdir -p /var/lib/ntp
 | 
			
		||||
    chown ntp /var/lib/ntp
 | 
			
		||||
    if ( pmatch $OSVER "sles*" ) || ( pmatch $OSVER "suse*" ) || [ -f /etc/SuSE-release ];then
 | 
			
		||||
        echo "driftfile /var/lib/ntp/drift/ntp.drift" >>$conf_file
 | 
			
		||||
    else 
 | 
			
		||||
        echo "driftfile /var/lib/ntp/drift" >>$conf_file
 | 
			
		||||
    fi 
 | 
			
		||||
    echo "disable auth" >>$conf_file
 | 
			
		||||
    echo "restrict 127.0.0.1" >>$conf_file
 | 
			
		||||
 | 
			
		||||
    if ( pmatch $OSVER "Cumulus*" ) || is_lsb_cumulus; then
 | 
			
		||||
        # Do not listen on Cumulus switch ports
 | 
			
		||||
        echo "interface listen eth0" >>$conf_file
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # will not exit here, let all the ntp configuration finish
 | 
			
		||||
    # ntpd will timeout if ntp service is not reachable
 | 
			
		||||
    if ! ping $master -c 1 > /dev/null 2>&1 ; then
 | 
			
		||||
        echo "Error: ntpserver $master is not reachable, will not setup NTP"
 | 
			
		||||
        exit_code=1
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    #ntpd/ntpdate/sntp conflict with ntpd, stop the service first
 | 
			
		||||
    checkservicestatus ntpserver
 | 
			
		||||
    if [ $? -eq 0 ];then
 | 
			
		||||
         stopservice ntpserver
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    msg='syncing the clock ...'
 | 
			
		||||
    logger -t xcat $msg 
 | 
			
		||||
    echo $msg
 | 
			
		||||
    if ! timeout 120 ntpd -gq  > /dev/null 2>&1 ; then
 | 
			
		||||
        if ! ntpdate -t5 $master > /dev/null 2>&1; then
 | 
			
		||||
            msg='WARNING: NTP Sync Failed before timeout. ntp server will try to sync...'
 | 
			
		||||
            logger -t xcat $msg
 | 
			
		||||
            echo $msg
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    #setup the hardware clock
 | 
			
		||||
    hwclock --systohc --utc
 | 
			
		||||
 | 
			
		||||
    #setup the RTC is UTC format, which will be used by os
 | 
			
		||||
    if ( pmatch $OSVER "sles*" ) || ( pmatch $OSVER "suse*" ) || [ -f /etc/SuSE-release ];then
 | 
			
		||||
        grep -i -q "HWCLOCK" /etc/sysconfig/clock
 | 
			
		||||
        if [ $? -eq 0 ];then
 | 
			
		||||
            sed -i 's/.*HWCLOCK.*/HWCLOCK=\"-u\"/' /etc/sysconfig/clock
 | 
			
		||||
        else
 | 
			
		||||
            echo HWCLOCK=\"-u\" >> /etc/sysconfig/clock
 | 
			
		||||
        fi
 | 
			
		||||
    elif [ -f "/etc/debian_version" ];then
 | 
			
		||||
        sed -i 's/.*UTC.*/UTC=\"yes\"/' /etc/default/rcS
 | 
			
		||||
    else
 | 
			
		||||
        if [ -f "/etc/sysconfig/clock" ];then
 | 
			
		||||
           grep -i -q "utc" /etc/sysconfig/clock
 | 
			
		||||
           if [ $? -eq 0 ];then
 | 
			
		||||
              sed -i 's/.*UTC.*/UTC=\"yes\"/' /etc/sysconfig/clock
 | 
			
		||||
           else
 | 
			
		||||
              echo UTC=\"yes\" >> /etc/sysconfig/clock
 | 
			
		||||
           fi
 | 
			
		||||
        elif type -P timedatectl >/dev/null 2>&1 ;then
 | 
			
		||||
           timedatectl set-local-rtc 0
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    #update the hardware clock automaticly
 | 
			
		||||
    if [ -f "/etc/sysconfig/ntpd" ];then
 | 
			
		||||
        grep -i -q "SYNC_HWCLOCK" /etc/sysconfig/ntpd
 | 
			
		||||
        if [ $? -eq 0 ];then
 | 
			
		||||
            sed -i 's/.*SYNC_HWCLOCK.*/SYNC_HWCLOCK=\"yes\"/' /etc/sysconfig/ntpd
 | 
			
		||||
        else
 | 
			
		||||
            echo "SYNC_HWCLOCK=\"yes\"" >> /etc/sysconfig/ntpd
 | 
			
		||||
        fi
 | 
			
		||||
    elif [ -f /etc/sysconfig/ntp ];then
 | 
			
		||||
        grep -i -q "NTPD_FORCE_SYNC_ON_STARTUP" /etc/sysconfig/ntp
 | 
			
		||||
        if [ $? -eq 0 ];then
 | 
			
		||||
	    sed -i 's/NTPD_FORCE_SYNC_ON_STARTUP=\"no\"/NTPD_FORCE_SYNC_ON_STARTUP=\"yes\"/' /etc/sysconfig/ntp
 | 
			
		||||
        fi
 | 
			
		||||
        grep -i -q "NTPD_FORCE_SYNC_HWCLOCK_ON_STARTUP" /etc/sysconfig/ntp
 | 
			
		||||
        if [ $? -eq 0 ];then
 | 
			
		||||
	    sed -i 's/NTPD_FORCE_SYNC_HWCLOCK_ON_STARTUP=\"no\"/NTPD_FORCE_SYNC_HWCLOCK_ON_STARTUP=\"yes\"/' /etc/sysconfig/ntp
 | 
			
		||||
        fi
 | 
			
		||||
    else
 | 
			
		||||
        cron_file="/etc/cron.daily/xcatsethwclock"
 | 
			
		||||
        if [ ! -f "$cron_file" ];then
 | 
			
		||||
            echo "#!/bin/sh" > $cron_file
 | 
			
		||||
            echo "/sbin/hwclock --systohc --utc" >> $cron_file
 | 
			
		||||
            chmod a+x $cron_file
 | 
			
		||||
            #service cron restart
 | 
			
		||||
            restartservice cron
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
    startservice ntpserver
 | 
			
		||||
 | 
			
		||||
    enableservice cron
 | 
			
		||||
    enableservice ntpserver
 | 
			
		||||
else
 | 
			
		||||
# stop and start AIX ntp
 | 
			
		||||
  echo "driftfile /etc/ntp.drift
 | 
			
		||||
tracefile /etc/ntp.trace
 | 
			
		||||
disable auth
 | 
			
		||||
broadcastclient
 | 
			
		||||
restrict 127.0.0.1" >>$conf_file
 | 
			
		||||
 | 
			
		||||
    stopsrc -s xntpd 
 | 
			
		||||
    logger -t xcat "ntpdate -t5 $master "
 | 
			
		||||
    ntpdate -t5 $master 
 | 
			
		||||
    if [ "$?" != "0" ]
 | 
			
		||||
    then
 | 
			
		||||
        echo "  ntpdate -t5 $master  failed "
 | 
			
		||||
        logger -t xcat "ntpdate -t5 $master failed"
 | 
			
		||||
    fi
 | 
			
		||||
    /usr/sbin/chrctcp -S -a xntpd 
 | 
			
		||||
if [ -n "${USE_NTPD}" ]
 | 
			
		||||
then
 | 
			
		||||
	# Call setupntp.traditional, and pass the parsed ntp servers
 | 
			
		||||
	logger -t xcat -p local4.info "Will call setupntp.traditional"
 | 
			
		||||
	export NTPSERVERS="$(IFS=','; echo "${NTP_SERVERS[*]:-pool.ntp.org}")"
 | 
			
		||||
	exec "${0%/*}/setupntp.traditional"
 | 
			
		||||
	exit 255
 | 
			
		||||
fi
 | 
			
		||||
exit $exit_code 
 | 
			
		||||
 | 
			
		||||
check_exec_or_exit cp cat logger
 | 
			
		||||
check_exec_or_exit systemctl timedatectl hwclock
 | 
			
		||||
 | 
			
		||||
systemctl stop ntp.service 2>/dev/null
 | 
			
		||||
systemctl disable ntp.service 2>/dev/null
 | 
			
		||||
systemctl stop ntpd.service 2>/dev/null
 | 
			
		||||
systemctl disable ntpd.service 2>/dev/null
 | 
			
		||||
 | 
			
		||||
systemctl disable ntp-wait.service 2>/dev/null
 | 
			
		||||
systemctl disable ntpdate.service 2>/dev/null
 | 
			
		||||
 | 
			
		||||
systemctl stop chronyd.service
 | 
			
		||||
 | 
			
		||||
# The system is configured to maintain the RTC in universal time.
 | 
			
		||||
timedatectl set-local-rtc 0
 | 
			
		||||
warn_if_bad "$?" "Failed to configure the system to maintain the RTC in universal time"
 | 
			
		||||
 | 
			
		||||
# Synchronize and set the system clock once
 | 
			
		||||
logger -t xcat -p local4.info "Syncing the clock ..."
 | 
			
		||||
chronyd -f /dev/null -q "$(
 | 
			
		||||
	if [ "${#NTP_SERVERS[@]}" -gt "0" ]
 | 
			
		||||
	then
 | 
			
		||||
		echo "server ${NTP_SERVERS[0]} iburst"
 | 
			
		||||
	else
 | 
			
		||||
		echo "pool pool.ntp.org iburst"
 | 
			
		||||
	fi
 | 
			
		||||
)" "pidfile /dev/null"
 | 
			
		||||
 | 
			
		||||
rm -f /etc/adjtime
 | 
			
		||||
# Set the hardware clock from the system clock
 | 
			
		||||
hwclock --systohc --utc
 | 
			
		||||
warn_if_bad "$?" "Failed to set the hardware clock"
 | 
			
		||||
 | 
			
		||||
## On RHEL 8
 | 
			
		||||
#CHRONY_USER="chrony"
 | 
			
		||||
#CHRONY_GROUP="chrony"
 | 
			
		||||
## On Ubuntu 18.04
 | 
			
		||||
#CHRONY_USER="_chrony"
 | 
			
		||||
#CHRONY_GROUP="_chrony"
 | 
			
		||||
 | 
			
		||||
CHRONY_CONF="/etc/chrony.conf"
 | 
			
		||||
KEY_FILE="/etc/chrony.keys"
 | 
			
		||||
 | 
			
		||||
if [ -d "/etc/chrony" ]
 | 
			
		||||
then
 | 
			
		||||
	# Ubuntu 18.04 default
 | 
			
		||||
	CHRONY_CONF="/etc/chrony/chrony.conf"
 | 
			
		||||
	KEY_FILE="/etc/chrony/chrony.keys"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Take the best educated guess for the pathname of the chrony drift file
 | 
			
		||||
DRIFT_FILE="$(
 | 
			
		||||
	for file in /var/lib/chrony/drift /var/lib/chrony/chrony.drift
 | 
			
		||||
	do
 | 
			
		||||
		if [ -f "${file}" ]
 | 
			
		||||
		then
 | 
			
		||||
			echo "${file}"
 | 
			
		||||
			exit
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	if [ "chrony" = \
 | 
			
		||||
		"$(rpm -qf /var/lib/chrony/drift --qf '%{name}' 2>/dev/null)" ]
 | 
			
		||||
	then
 | 
			
		||||
		echo /var/lib/chrony/drift
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	for file in /usr/share/chrony/chrony.conf \
 | 
			
		||||
		/etc/chrony.conf /etc/chrony/chrony.conf \
 | 
			
		||||
		$(grep -a -m 1 -o -P '/([^\x00]+/)*[^\x00]+\.conf' \
 | 
			
		||||
			"$(type -p chronyd)" 2>/dev/null)
 | 
			
		||||
	do
 | 
			
		||||
		if [ -f "${file}" ]
 | 
			
		||||
		then
 | 
			
		||||
			while read -r key val blah
 | 
			
		||||
			do
 | 
			
		||||
				if [ "${key}" = "driftfile" -a -n "${val}" ]
 | 
			
		||||
				then
 | 
			
		||||
					echo "${val}"
 | 
			
		||||
					exit
 | 
			
		||||
				fi
 | 
			
		||||
			done <"${file}"
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	# The default value
 | 
			
		||||
	echo /var/lib/chrony/drift
 | 
			
		||||
)"
 | 
			
		||||
 | 
			
		||||
LOG_DIR="/var/log/chrony"
 | 
			
		||||
 | 
			
		||||
logger -t xcat -p local4.info "Install: Setup NTP - chrony"
 | 
			
		||||
cp "${CHRONY_CONF}" "${CHRONY_CONF}.xcatsave"
 | 
			
		||||
cat >"${CHRONY_CONF}" <<EOF
 | 
			
		||||
# This chrony configuration file is generated by xCAT
 | 
			
		||||
 | 
			
		||||
# Use public servers from the pool.ntp.org project.
 | 
			
		||||
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
 | 
			
		||||
$(
 | 
			
		||||
	if [ "${#NTP_SERVERS[@]}" -gt "0" ]
 | 
			
		||||
	then
 | 
			
		||||
		for n in "${NTP_SERVERS[@]}"
 | 
			
		||||
		do
 | 
			
		||||
			echo "server ${n} iburst"
 | 
			
		||||
		done
 | 
			
		||||
	else
 | 
			
		||||
		echo "pool pool.ntp.org   iburst maxsources 4"
 | 
			
		||||
		echo "pool 0.pool.ntp.org iburst maxsources 4"
 | 
			
		||||
		echo "pool 1.pool.ntp.org iburst maxsources 4"
 | 
			
		||||
		echo "pool 2.pool.ntp.org iburst maxsources 8"
 | 
			
		||||
	fi
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# Record the rate at which the system clock gains/losses time.
 | 
			
		||||
driftfile ${DRIFT_FILE}
 | 
			
		||||
 | 
			
		||||
# Allow the system clock to be stepped in the first three updates
 | 
			
		||||
# if its offset is larger than 1 second.
 | 
			
		||||
makestep 1.0 3
 | 
			
		||||
 | 
			
		||||
# Enable kernel synchronization of the real-time clock (RTC).
 | 
			
		||||
rtcsync
 | 
			
		||||
 | 
			
		||||
# Enable hardware timestamping on all interfaces that support it.
 | 
			
		||||
#hwtimestamp *
 | 
			
		||||
 | 
			
		||||
# Increase the minimum number of selectable sources required to adjust
 | 
			
		||||
# the system clock.
 | 
			
		||||
#minsources 2
 | 
			
		||||
 | 
			
		||||
# Allows access by any node (IPv4 or IPv6).
 | 
			
		||||
allow
 | 
			
		||||
 | 
			
		||||
# Serve time even if not synchronized to a time source.
 | 
			
		||||
local stratum 10
 | 
			
		||||
 | 
			
		||||
# Specify file containing keys for NTP authentication.
 | 
			
		||||
keyfile ${KEY_FILE}
 | 
			
		||||
 | 
			
		||||
# Get TAI-UTC offset and leap seconds from the system tz database.
 | 
			
		||||
leapsectz right/UTC
 | 
			
		||||
 | 
			
		||||
# Specify directory for log files.
 | 
			
		||||
logdir ${LOG_DIR}
 | 
			
		||||
 | 
			
		||||
# Select which information is logged.
 | 
			
		||||
log measurements statistics tracking
 | 
			
		||||
EOF
 | 
			
		||||
exit_if_bad "$?" "Failed to create configuration file for chrony"
 | 
			
		||||
 | 
			
		||||
systemctl reenable chronyd.service
 | 
			
		||||
exit_if_bad "$?" "Failed to enable chronyd.service"
 | 
			
		||||
 | 
			
		||||
systemctl reload-or-restart chronyd.service
 | 
			
		||||
exit_if_bad "$?" "Failed to start chronyd.service"
 | 
			
		||||
 | 
			
		||||
logger -t xcat -p local4.info "NTP setup accomplished!"
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
 | 
			
		||||
# vim: filetype=sh
 | 
			
		||||
# vim: noautoindent
 | 
			
		||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 | 
			
		||||
 | 
			
		||||
# End of file
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										205
									
								
								xCAT/postscripts/setupntp.traditional
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										205
									
								
								xCAT/postscripts/setupntp.traditional
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,205 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
			
		||||
#
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# setup NTP configuration on the compute nodes
 | 
			
		||||
#
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
if [ "$(uname -s|tr 'A-Z' 'a-z')" = "linux" ];then
 | 
			
		||||
   str_dir_name=`dirname $0`
 | 
			
		||||
   . $str_dir_name/xcatlib.sh
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# if on the Management Node
 | 
			
		||||
if [ -e /etc/xCATMN ]; then
 | 
			
		||||
   logger -t xcat -p local4.info "setupntp: This postscript does not support running on the management node. Please run makentp command. exiting"
 | 
			
		||||
   exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
#for service node, the makentp -a command will call this postscript
 | 
			
		||||
#so do not diable service node.
 | 
			
		||||
 | 
			
		||||
exit_code=0;
 | 
			
		||||
master=$MASTER
 | 
			
		||||
setup=0
 | 
			
		||||
conf_file="/etc/ntp.conf"
 | 
			
		||||
conf_file_org="/etc/ntp.conf.org"
 | 
			
		||||
conf_file_backup="/etc/ntp.conf.postbackup"
 | 
			
		||||
 | 
			
		||||
# pmatch determines if 1st argument string is matched by 2nd argument pattern
 | 
			
		||||
pmatch ()
 | 
			
		||||
{
 | 
			
		||||
  case $1 in
 | 
			
		||||
    $2) return 0;;  # zero return code means string matched by pattern
 | 
			
		||||
  esac
 | 
			
		||||
 | 
			
		||||
  return 1          # non-zero return code means string not matched by pattern
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
is_lsb_cumulus ()
 | 
			
		||||
{
 | 
			
		||||
  grep -qs Cumulus /etc/lsb-release
 | 
			
		||||
  return $?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
logger -t xcat "Install: Setup NTP"
 | 
			
		||||
# Use the ntpservers defined in the site table, if they exist. 
 | 
			
		||||
# If the value of ntpservers is <xcatmaster> use the service node or
 | 
			
		||||
# the management node as the ntp server.
 | 
			
		||||
if [ $NTPSERVERS ]; then
 | 
			
		||||
    if [ "$NODESETSTATE" = "statelite" ]; then
 | 
			
		||||
        cp -a $conf_file $conf_file_org
 | 
			
		||||
        echo  "" > $conf_file
 | 
			
		||||
    else
 | 
			
		||||
        if [ !  -f $conf_file_org ]; then
 | 
			
		||||
            mv -f $conf_file $conf_file_org
 | 
			
		||||
        else
 | 
			
		||||
            mv -f $conf_file $conf_file_backup
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
    if [ "$NTPSERVERS" = "<xcatmaster>" ] || [ "$NTPSERVERS" = "<xcatmaster>" ]; then
 | 
			
		||||
        echo "server $master" >>$conf_file
 | 
			
		||||
    else
 | 
			
		||||
        for i in $(echo $NTPSERVERS | tr ',' ' ')
 | 
			
		||||
        do
 | 
			
		||||
            if ping $i -c 1 > /dev/null 2>&1 ; then
 | 
			
		||||
         	echo "server $i" >>$conf_file
 | 
			
		||||
        	master=$i
 | 
			
		||||
                setup=1
 | 
			
		||||
            fi
 | 
			
		||||
        done 
 | 
			
		||||
        if [ $setup -eq 0 ]; then
 | 
			
		||||
	    echo "server $master" >$conf_file
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
else
 | 
			
		||||
	echo "server $master" >$conf_file
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OS_TYPE=`uname`
 | 
			
		||||
if [ $OS_TYPE = Linux ]; then
 | 
			
		||||
    # Set the timezone
 | 
			
		||||
    if [ -n $TIMEZONE ]; then
 | 
			
		||||
        echo $TIMEZONE > /etc/timezone
 | 
			
		||||
        if type timedatectl > /dev/null; then
 | 
			
		||||
            timedatectl set-timezone $(cat /etc/timezone)
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    mkdir -p /var/lib/ntp
 | 
			
		||||
    chown ntp /var/lib/ntp
 | 
			
		||||
    if ( pmatch $OSVER "sles*" ) || ( pmatch $OSVER "suse*" ) || [ -f /etc/SuSE-release ];then
 | 
			
		||||
        echo "driftfile /var/lib/ntp/drift/ntp.drift" >>$conf_file
 | 
			
		||||
    else 
 | 
			
		||||
        echo "driftfile /var/lib/ntp/drift" >>$conf_file
 | 
			
		||||
    fi 
 | 
			
		||||
    echo "disable auth" >>$conf_file
 | 
			
		||||
    echo "restrict 127.0.0.1" >>$conf_file
 | 
			
		||||
 | 
			
		||||
    if ( pmatch $OSVER "Cumulus*" ) || is_lsb_cumulus; then
 | 
			
		||||
        # Do not listen on Cumulus switch ports
 | 
			
		||||
        echo "interface listen eth0" >>$conf_file
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # will not exit here, let all the ntp configuration finish
 | 
			
		||||
    # ntpd will timeout if ntp service is not reachable
 | 
			
		||||
    if ! ping $master -c 1 > /dev/null 2>&1 ; then
 | 
			
		||||
        echo "Error: ntpserver $master is not reachable, will not setup NTP"
 | 
			
		||||
        exit_code=1
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    #ntpd/ntpdate/sntp conflict with ntpd, stop the service first
 | 
			
		||||
    checkservicestatus ntpserver
 | 
			
		||||
    if [ $? -eq 0 ];then
 | 
			
		||||
         stopservice ntpserver
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    msg='syncing the clock ...'
 | 
			
		||||
    logger -t xcat $msg 
 | 
			
		||||
    echo $msg
 | 
			
		||||
    if ! timeout 120 ntpd -gq  > /dev/null 2>&1 ; then
 | 
			
		||||
        if ! ntpdate -t5 $master > /dev/null 2>&1; then
 | 
			
		||||
            msg='WARNING: NTP Sync Failed before timeout. ntp server will try to sync...'
 | 
			
		||||
            logger -t xcat $msg
 | 
			
		||||
            echo $msg
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    #setup the hardware clock
 | 
			
		||||
    hwclock --systohc --utc
 | 
			
		||||
 | 
			
		||||
    #setup the RTC is UTC format, which will be used by os
 | 
			
		||||
    if ( pmatch $OSVER "sles*" ) || ( pmatch $OSVER "suse*" ) || [ -f /etc/SuSE-release ];then
 | 
			
		||||
        grep -i -q "HWCLOCK" /etc/sysconfig/clock
 | 
			
		||||
        if [ $? -eq 0 ];then
 | 
			
		||||
            sed -i 's/.*HWCLOCK.*/HWCLOCK=\"-u\"/' /etc/sysconfig/clock
 | 
			
		||||
        else
 | 
			
		||||
            echo HWCLOCK=\"-u\" >> /etc/sysconfig/clock
 | 
			
		||||
        fi
 | 
			
		||||
    elif [ -f "/etc/debian_version" ];then
 | 
			
		||||
        sed -i 's/.*UTC.*/UTC=\"yes\"/' /etc/default/rcS
 | 
			
		||||
    else
 | 
			
		||||
        if [ -f "/etc/sysconfig/clock" ];then
 | 
			
		||||
           grep -i -q "utc" /etc/sysconfig/clock
 | 
			
		||||
           if [ $? -eq 0 ];then
 | 
			
		||||
              sed -i 's/.*UTC.*/UTC=\"yes\"/' /etc/sysconfig/clock
 | 
			
		||||
           else
 | 
			
		||||
              echo UTC=\"yes\" >> /etc/sysconfig/clock
 | 
			
		||||
           fi
 | 
			
		||||
        elif type -P timedatectl >/dev/null 2>&1 ;then
 | 
			
		||||
           timedatectl set-local-rtc 0
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    #update the hardware clock automaticly
 | 
			
		||||
    if [ -f "/etc/sysconfig/ntpd" ];then
 | 
			
		||||
        grep -i -q "SYNC_HWCLOCK" /etc/sysconfig/ntpd
 | 
			
		||||
        if [ $? -eq 0 ];then
 | 
			
		||||
            sed -i 's/.*SYNC_HWCLOCK.*/SYNC_HWCLOCK=\"yes\"/' /etc/sysconfig/ntpd
 | 
			
		||||
        else
 | 
			
		||||
            echo "SYNC_HWCLOCK=\"yes\"" >> /etc/sysconfig/ntpd
 | 
			
		||||
        fi
 | 
			
		||||
    elif [ -f /etc/sysconfig/ntp ];then
 | 
			
		||||
        grep -i -q "NTPD_FORCE_SYNC_ON_STARTUP" /etc/sysconfig/ntp
 | 
			
		||||
        if [ $? -eq 0 ];then
 | 
			
		||||
	    sed -i 's/NTPD_FORCE_SYNC_ON_STARTUP=\"no\"/NTPD_FORCE_SYNC_ON_STARTUP=\"yes\"/' /etc/sysconfig/ntp
 | 
			
		||||
        fi
 | 
			
		||||
        grep -i -q "NTPD_FORCE_SYNC_HWCLOCK_ON_STARTUP" /etc/sysconfig/ntp
 | 
			
		||||
        if [ $? -eq 0 ];then
 | 
			
		||||
	    sed -i 's/NTPD_FORCE_SYNC_HWCLOCK_ON_STARTUP=\"no\"/NTPD_FORCE_SYNC_HWCLOCK_ON_STARTUP=\"yes\"/' /etc/sysconfig/ntp
 | 
			
		||||
        fi
 | 
			
		||||
    else
 | 
			
		||||
        cron_file="/etc/cron.daily/xcatsethwclock"
 | 
			
		||||
        if [ ! -f "$cron_file" ];then
 | 
			
		||||
            echo "#!/bin/sh" > $cron_file
 | 
			
		||||
            echo "/sbin/hwclock --systohc --utc" >> $cron_file
 | 
			
		||||
            chmod a+x $cron_file
 | 
			
		||||
            #service cron restart
 | 
			
		||||
            restartservice cron
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
    startservice ntpserver
 | 
			
		||||
 | 
			
		||||
    enableservice cron
 | 
			
		||||
    enableservice ntpserver
 | 
			
		||||
else
 | 
			
		||||
# stop and start AIX ntp
 | 
			
		||||
  echo "driftfile /etc/ntp.drift
 | 
			
		||||
tracefile /etc/ntp.trace
 | 
			
		||||
disable auth
 | 
			
		||||
broadcastclient
 | 
			
		||||
restrict 127.0.0.1" >>$conf_file
 | 
			
		||||
 | 
			
		||||
    stopsrc -s xntpd 
 | 
			
		||||
    logger -t xcat "ntpdate -t5 $master "
 | 
			
		||||
    ntpdate -t5 $master 
 | 
			
		||||
    if [ "$?" != "0" ]
 | 
			
		||||
    then
 | 
			
		||||
        echo "  ntpdate -t5 $master  failed "
 | 
			
		||||
        logger -t xcat "ntpdate -t5 $master failed"
 | 
			
		||||
    fi
 | 
			
		||||
    /usr/sbin/chrctcp -S -a xntpd 
 | 
			
		||||
fi
 | 
			
		||||
exit $exit_code 
 | 
			
		||||
		Reference in New Issue
	
	Block a user