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