blob: 40b3b8cbc679fc6c04c3bddd223d55d1a7f7d583 [file] [log] [blame]
Naveen Mosesc8d90aa2021-10-07 18:20:33 +05301#!/bin/bash
2#BMC set time from host
3set -e
4
5echo "set-bmc-time-from-host is started"
6# Sync BMC's date with one of the four servers
7
8HOST_INSTANCES="HOST_INSTANCES_SED_REPLACEMENT_VALUE"
9MAX_RETRY_LIMIT=6
10
11check_NTP_status()
12{
13 timedatectl show --property=NTPSynchronized --value
14}
15
16get_single_host_time()
17{
18 for (( retry=1; retry<=5; retry++ ))
19 do
20 #request the single host time via ipmb command
21 # which will be set as bmc time
22 # 0x01 - me channel | 0x0a - storage net fn | 0x00 - lun
23 # 0x48 - get SEL time
24 ipmi_cmd_output=$(busctl call xyz.openbmc_project.Ipmi.Channel.Ipmb \
25 "/xyz/openbmc_project/Ipmi/Channel/Ipmb" org.openbmc.Ipmb sendRequest \
26 yyyyay 0x01 0x0a 0x00 0x48 0)
27 ipmb_result=$?
28 if [ "$ipmb_result" == "0" ];then
29 sleep 1
30 break
31 fi
32 done
33
34 if [ "$retry" == "$MAX_RETRY_LIMIT" ];then
35 exit 1
36 fi
37
38 echo "$ipmi_cmd_output"
39
40}
41
42get_multi_host_datetime()
43{
44 ipmbAddr=$1
45 for (( retry=1; retry<=5; retry++ ))
46 do
47 #request the multihost host time via ipmb command
48 # which will be set as bmc time
49 # 0x38 - oem net fn | 0x00 - lun | 0x02 - request to bridge ic cmd
50 # 0x6 - length | IANA id 0x15 0xA0 0x0 |0x48 - get SEL time
51
52 ipmi_cmd_output=$(busctl call xyz.openbmc_project.Ipmi.Channel.Ipmb \
53 /xyz/openbmc_project/Ipmi/Channel/Ipmb org.openbmc.Ipmb sendRequest \
54 yyyyay "$ipmbAddr" 0x38 0 0x2 6 0x15 0xA0 0x0 0x1 0x28 0x48)
55 ipmb_result=$?
56 if [ $ipmb_result == 0 ];then
57 break
58 fi
59 sleep 1
60 done
61
62 echo "$ipmi_cmd_output"
63}
64sync_multi_host_datetime()
65{
66 for index in $HOST_INSTANCES
67 do
68 ipmb_addr=$(((index-1)*4))
69 # Use standard IPMI command 'SendRequest method' to read RTC time
70 echo "chosen ipmb addr : "$ipmb_addr
71 multi_host_time_result=$(get_multi_host_datetime $ipmb_addr)
72
73 if [[ $(echo "$multi_host_time_result" | awk '{ print NF }') -eq 18 ]];
74 then
75 echo "syncing up host " $index " date time with bmc..."
76 date -s @$((0x$(echo "$multi_host_time_result" | \
77 awk '{printf "%02x%02x%02x%02x",$18,$17,$16,$15}')))
78 sync
79 break
80 fi
81 done
82
83}
84sync_single_host_datetime()
85{
86 single_host_time_result=$(get_single_host_time)
87
88 if [[ $(echo "$single_host_time_result" | awk '{ print NF }') -eq 11 ]];
89 then
90 echo "Syncing up host date time with bmc..."
91 date -s @$((0x$(echo "$single_host_time_result" | \
92 awk '{printf "%02x%02x%02x%02x",$11,$10,$9,$8}')))
93 sync
94 fi
95
96}
97
98#wait for the NTP server start if available.
99sleep 60
100
101NTP_STATUS=$(check_NTP_status)
102
103echo "NTP status :""$NTP_STATUS"
104
105if [ "$NTP_STATUS" == "yes" ]; then
106 echo "NTP is running and system clock is in sync.skiping host time sync..."
107 exit 0
108fi
109
110if [ "$HOST_INSTANCES" == "0" ]; then
111 echo "single host instance"
112 sync_single_host_datetime
113else
114 echo "multiple host instance"
115 sync_multi_host_datetime
116fi