#!/bin/bash #BMC set time from host set -e echo "set-bmc-time-from-host is started" # Sync BMC's date with one of the four servers HOST_INSTANCES="HOST_INSTANCES_SED_REPLACEMENT_VALUE" MAX_RETRY_LIMIT=6 check_NTP_status() { timedatectl show --property=NTPSynchronized --value } get_single_host_time() { for (( retry=1; retry<=5; retry++ )) do #request the single host time via ipmb command # which will be set as bmc time # 0x01 - me channel | 0x0a - storage net fn | 0x00 - lun # 0x48 - get SEL time ipmi_cmd_output=$(busctl call xyz.openbmc_project.Ipmi.Channel.Ipmb \ "/xyz/openbmc_project/Ipmi/Channel/Ipmb" org.openbmc.Ipmb sendRequest \ yyyyay 0x01 0x0a 0x00 0x48 0) ipmb_result=$? if [ "$ipmb_result" == "0" ];then sleep 1 break fi done if [ "$retry" == "$MAX_RETRY_LIMIT" ];then exit 1 fi echo "$ipmi_cmd_output" } get_multi_host_datetime() { ipmbAddr=$1 for (( retry=1; retry<=5; retry++ )) do #request the multihost host time via ipmb command # which will be set as bmc time # 0x38 - oem net fn | 0x00 - lun | 0x02 - request to bridge ic cmd # 0x6 - length | IANA id 0x15 0xA0 0x0 |0x48 - get SEL time ipmi_cmd_output=$(busctl call xyz.openbmc_project.Ipmi.Channel.Ipmb \ /xyz/openbmc_project/Ipmi/Channel/Ipmb org.openbmc.Ipmb sendRequest \ yyyyay "$ipmbAddr" 0x38 0 0x2 6 0x15 0xA0 0x0 0x1 0x28 0x48) ipmb_result=$? if [ $ipmb_result == 0 ];then break fi sleep 1 done echo "$ipmi_cmd_output" } sync_multi_host_datetime() { for index in $HOST_INSTANCES do ipmb_addr=$(((index-1)*4)) # Use standard IPMI command 'SendRequest method' to read RTC time echo "chosen ipmb addr : "$ipmb_addr multi_host_time_result=$(get_multi_host_datetime $ipmb_addr) if [[ $(echo "$multi_host_time_result" | awk '{ print NF }') -eq 18 ]]; then echo "syncing up host " $index " date time with bmc..." date -s @$((0x$(echo "$multi_host_time_result" | \ awk '{printf "%02x%02x%02x%02x",$18,$17,$16,$15}'))) sync break fi done } sync_single_host_datetime() { single_host_time_result=$(get_single_host_time) if [[ $(echo "$single_host_time_result" | awk '{ print NF }') -eq 11 ]]; then echo "Syncing up host date time with bmc..." date -s @$((0x$(echo "$single_host_time_result" | \ awk '{printf "%02x%02x%02x%02x",$11,$10,$9,$8}'))) sync fi } #wait for the NTP server start if available. sleep 60 NTP_STATUS=$(check_NTP_status) echo "NTP status :""$NTP_STATUS" if [ "$NTP_STATUS" == "yes" ]; then echo "NTP is running and system clock is in sync.skiping host time sync..." exit 0 fi if [ "$HOST_INSTANCES" == "0" ]; then echo "single host instance" sync_single_host_datetime else echo "multiple host instance" sync_multi_host_datetime fi