#!/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.


master=$MASTER
setup=0
sitemaster=$SITEMASTER
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_ubuntu exit status indicates whether system appears to be Ubuntu.
# Using required /etc/lsb-release file, instead of optional lsb_release command.

is_lsb_ubuntu ()
{
    awk '
        (match($0, "^[ \t]*DISTRIB_ID=") == 1) {    # A DISTRIB_ID line
            id = substr($0, RLENGTH + 1)            # Save its value
        }

        END {
            # Examine last DISTRIB_ID value to see if Ubuntu indicated

            if (match(id, "^(Ubuntu|\"Ubuntu\")[ \t]*$") == 1) {
                exit 0    # Ubuntu
            }
            exit 1        # Not Ubuntu
        }

    ' /etc/lsb-release >/dev/null 2>&1

    # Routine exit status is exit status of the last command -- the awk script.
    #
    #   Note: if /etc/lsb-release does not exist, the exit status indicates
    #         failure (not Ubuntu), which is the correct outcome.
}

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" = "&lt;xcatmaster&gt;" ] || [ "$NTPSERVERS" = "<xcatmaster>" ]; then
        echo "server $master" >>$conf_file
    else
        for i in $(echo $NTPSERVERS | tr ',' ' ')
        do
         	echo "server $i" >>$conf_file
        	master=$i
        done 
    fi
else
	echo "server $master" >$conf_file
fi

OS_TYPE=`uname`
if [ $OS_TYPE = Linux ]; then
    mkdir -p /var/lib/ntp
    chown ntp /var/lib/ntp
    echo "driftfile /var/lib/ntp/drift
disable auth
restrict 127.0.0.1" >>$conf_file

    #ntpdate/sntp conflict with ntpd, stop the service first
    checkservicestatus ntpserver
    if [ $? -eq 0 ];then
         stopservice ntpserver
    fi
    #ntpdate program is deprecated on SuSE
    if ( pmatch $OSVER "sles*" ) || ( pmatch $OSVER "suse*" ) || [ -f /etc/SuSE-release ]; then
        if [ -f /usr/sbin/rcntpd ]; then
            cmd="/usr/sbin/rcntpd ntptimeset"
        elif [ -f /usr/sbin/rcntp ]; then
            cmd="/usr/sbin/rcntp ntptimeset"
        else
            cmd="sntp -P no -r $ntp_master"
        fi
        echo "$cmd"
        logger -t xcat "$cmd"
        output=`eval $cmd 2>&1`
        rc=$?
        if [ "$rc" != "0" ] || (pmatch "$output" "Time could not*");then
            echo "$cmd failed, NTP maynot be synchronized, please wait for NTP synchronized then run updatenode nodename -P setupntp"
            logger -t xcat "$cmd failed"
            exit 1
        fi
    else
        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
    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
        sed -i 's/.*HWCLOCK.*/HWCLOCK="-u"/' /etc/sysconfig/clock
    elif [ -f "/etc/debian_version" ];then
        sed -i 's/.*UTC.*/UTC=yes/' /etc/default/rcS
    else
        if [ -f "/etc/sysconfig/clock" ];then
           grep -i "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 "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
    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 $? 
