Skip to content

Commit e43b107

Browse files
pphucharWirut Getbamrung
authored and
Wirut Getbamrung
committed
[devices] Celeatica Silverstone add IPMI platform sensor read. (sonic-net#3591)
* [platform/broadcom] Celeatica Silverstone add IPMI platform sensor read. * [platform_sensors] Silverstone update temperature sensor description
1 parent f017c78 commit e43b107

File tree

3 files changed

+186
-0
lines changed

3 files changed

+186
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1+
silverstone/scripts/sensors usr/bin
2+
silverstone/scripts/platform_sensors.py usr/local/bin
13
silverstone/cfg/silverstone-modules.conf etc/modules-load.d
24
silverstone/systemd/platform-modules-silverstone.service lib/systemd/system
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
#!/usr/bin/python
2+
#
3+
# Silverstone platform sensors. This script get the sensor data from BMC
4+
# using ipmitool and display them in lm-sensor alike format.
5+
#
6+
# The following data is support:
7+
# 1. Temperature sensors
8+
# 2. PSUs
9+
# 3. Fan trays
10+
11+
import sys
12+
import logging
13+
import subprocess
14+
15+
IPMI_SDR_CMD = "ipmitool sdr elist"
16+
MAX_NUM_FANS = 7
17+
MAX_NUM_PSUS = 2
18+
19+
20+
def ipmi_sensor_dump(cmd):
21+
''' Execute ipmitool command return dump output
22+
exit if any error occur.
23+
'''
24+
sensor_dump = ''
25+
try:
26+
sensor_dump = subprocess.check_output(cmd, shell=True)
27+
except subprocess.CalledProcessError as e:
28+
logging.error('Error! Failed to execute: {}'.format(cmd))
29+
sys.exit(1)
30+
return sensor_dump
31+
32+
def get_reading_by_name(sensor_name, sdr_elist_dump):
33+
'''
34+
Search for the match sensor name, return sensor
35+
reading value and unit, return object epmtry string
36+
if search not match.
37+
38+
The output of sensor dump:
39+
TEMP_FAN_U52 | 00h | ok | 7.1 | 31 degrees C
40+
TEMP_FAN_U17 | 01h | ok | 7.1 | 27 degrees C
41+
TEMP_SW_U52 | 02h | ok | 7.1 | 30 degrees C
42+
Fan2_Status | 07h | ok | 29.2 | Present
43+
Fan2_Front | 0Eh | ok | 29.2 | 12000 RPM
44+
Fan2_Rear | 46h | ok | 29.2 | 14700 RPM
45+
PSU2_Status | 39h | ok | 10.2 | Presence detected
46+
PSU2_Fan | 3Dh | ok | 10.2 | 16000 RPM
47+
PSU2_VIn | 3Ah | ok | 10.2 | 234.30 Volts
48+
PSU2_CIn | 3Bh | ok | 10.2 | 0.80 Amps
49+
'''
50+
found = ''
51+
52+
for line in sdr_elist_dump.split("\n"):
53+
if sensor_name in line:
54+
found = line.strip()
55+
break
56+
57+
if not found:
58+
logging.error('Cannot find sensor name:' + sensor_name)
59+
60+
else:
61+
try:
62+
found = found.split('|')[4]
63+
except IndexError:
64+
logging.error('Cannot get sensor data of:' + sensor_name)
65+
66+
logging.basicConfig(level=logging.DEBUG)
67+
return found
68+
69+
70+
def read_temperature_sensors(ipmi_sdr_elist):
71+
72+
sensor_list = [
73+
('TEMP_FAN_U52', 'Fan Tray Middle Temp'),
74+
('TEMP_FAN_U17', 'Fan Tray Right Temp'),
75+
('TEMP_SW_U52', 'Switchboard Left Inlet Temp'),
76+
('TEMP_SW_U16', 'Switchboard Right Inlet Temp'),
77+
('TEMP_BB_U3', 'Baseboard Temp'),
78+
('TEMP_CPU', 'CPU Internal Temp'),
79+
('TEMP_SW_Internal', 'ASIC Internal Temp'),
80+
('SW_U04_Temp', 'IR3595 Chip Left Temp'),
81+
('SW_U14_Temp', 'IR3595 Chip Right Temp'),
82+
('SW_U4403_Temp', 'IR3584 Chip Temp'),
83+
]
84+
85+
output = ''
86+
sensor_format = '{0:{width}}{1}\n'
87+
# Find max length of sensor calling name
88+
max_name_width = max(len(sensor[1]) for sensor in sensor_list)
89+
90+
output += "Temperature Sensors\n"
91+
output += "Adapter: IPMI adapter\n"
92+
for sensor in sensor_list:
93+
reading = get_reading_by_name(sensor[0],ipmi_sdr_elist)
94+
output += sensor_format.format('{}:'.format(sensor[1]),
95+
reading,
96+
width=str(max_name_width+1))
97+
output += '\n'
98+
return output
99+
100+
101+
def read_fan_sensors(num_fans, ipmi_sdr_elist):
102+
103+
sensor_list = [
104+
('Fan{}_Status', 'Status'),
105+
('Fan{}_Front', 'Fan {} front'),
106+
('Fan{}_Rear', 'Fan {} rear'),
107+
]
108+
109+
output = ''
110+
sensor_format = '{0:{width}}{1}\n'
111+
# Find max length of sensor calling name
112+
max_name_width = max(len(sensor[1]) for sensor in sensor_list)
113+
114+
output += "Fan Trays\n"
115+
output += "Adapter: IPMI adapter\n"
116+
for fan_num in range(1, num_fans+1):
117+
for sensor in sensor_list:
118+
ipmi_sensor_name = sensor[0].format(fan_num)
119+
display_sensor_name = sensor[1].format(fan_num)
120+
reading = get_reading_by_name(ipmi_sensor_name, ipmi_sdr_elist)
121+
output += sensor_format.format('{}:'.format(display_sensor_name),
122+
reading,
123+
width=str(max_name_width+1))
124+
output += '\n'
125+
return output
126+
127+
128+
def read_psu_sensors(num_psus, ipmi_sdr_elist):
129+
130+
sensor_list = [
131+
('PSU{}_Status', 'PSU {} Status'),
132+
('PSU{}_Fan', 'PSU {} Fan'),
133+
('PSU{}_VIn', 'PSU {} Input Voltag'),
134+
('PSU{}_CIn', 'PSU {} Input Current'),
135+
('PSU{}_PIn', 'PSU {} Input Power'),
136+
('PSU{}_Temp1', 'PSU {} Temp1'),
137+
('PSU{}_Temp2', 'PSU {} Temp2'),
138+
('PSU{}_VOut', 'PSU {} Output Voltag'),
139+
('PSU{}_COut', 'PSU {} Output Current'),
140+
('PSU{}_POut', 'PSU {} Output Power'),
141+
]
142+
143+
output = ''
144+
sensor_format = '{0:{width}}{1}\n'
145+
# Find max length of sensor calling name
146+
max_name_width = max(len(sensor[1]) for sensor in sensor_list)
147+
148+
output += "PSU\n"
149+
output += "Adapter: IPMI adapter\n"
150+
for psu_num in range(1, num_psus+1):
151+
for sensor in sensor_list:
152+
ipmi_sensor_name = sensor[0].format(psu_num)
153+
display_sensor_name = sensor[1].format(psu_num)
154+
reading = get_reading_by_name(ipmi_sensor_name, ipmi_sdr_elist)
155+
output += sensor_format.format('{}:'.format(display_sensor_name),
156+
reading,
157+
width=str(max_name_width+1))
158+
output += '\n'
159+
return output
160+
161+
162+
def main():
163+
output_string = ''
164+
165+
ipmi_sdr_elist = ipmi_sensor_dump(IPMI_SDR_CMD)
166+
output_string += read_temperature_sensors(ipmi_sdr_elist)
167+
output_string += read_psu_sensors(MAX_NUM_PSUS, ipmi_sdr_elist)
168+
output_string += read_fan_sensors(MAX_NUM_FANS, ipmi_sdr_elist)
169+
print(output_string)
170+
171+
172+
if __name__ == '__main__':
173+
main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
3+
DOCKER_EXEC_FLAGS="i"
4+
5+
# Determine whether stdout is on a terminal
6+
if [ -t 1 ] ; then
7+
DOCKER_EXEC_FLAGS+="t"
8+
fi
9+
10+
docker exec -$DOCKER_EXEC_FLAGS pmon sensors "$@"
11+
docker exec -$DOCKER_EXEC_FLAGS pmon platform_sensors.py "$@"

0 commit comments

Comments
 (0)