[devices] Celeatica Silverstone add IPMI platform sensor read. (#3591)
* [platform/broadcom] Celeatica Silverstone add IPMI platform sensor read. * [platform_sensors] Silverstone update temperature sensor description
This commit is contained in:
parent
ac2908ef03
commit
2e61e14bb3
@ -1,3 +1,5 @@
|
|||||||
|
silverstone/scripts/sensors usr/bin
|
||||||
|
silverstone/scripts/platform_sensors.py usr/local/bin
|
||||||
silverstone/cfg/silverstone-modules.conf etc/modules-load.d
|
silverstone/cfg/silverstone-modules.conf etc/modules-load.d
|
||||||
silverstone/systemd/platform-modules-silverstone.service lib/systemd/system
|
silverstone/systemd/platform-modules-silverstone.service lib/systemd/system
|
||||||
silverstone/modules/sonic_platform-1.0-py2-none-any.whl usr/share/sonic/device/x86_64-cel_silverstone-r0
|
silverstone/modules/sonic_platform-1.0-py2-none-any.whl usr/share/sonic/device/x86_64-cel_silverstone-r0
|
||||||
|
@ -0,0 +1,173 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
#
|
||||||
|
# Silverstone platform sensors. This script get the sensor data from BMC
|
||||||
|
# using ipmitool and display them in lm-sensor alike format.
|
||||||
|
#
|
||||||
|
# The following data is support:
|
||||||
|
# 1. Temperature sensors
|
||||||
|
# 2. PSUs
|
||||||
|
# 3. Fan trays
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
IPMI_SDR_CMD = "ipmitool sdr elist"
|
||||||
|
MAX_NUM_FANS = 7
|
||||||
|
MAX_NUM_PSUS = 2
|
||||||
|
|
||||||
|
|
||||||
|
def ipmi_sensor_dump(cmd):
|
||||||
|
''' Execute ipmitool command return dump output
|
||||||
|
exit if any error occur.
|
||||||
|
'''
|
||||||
|
sensor_dump = ''
|
||||||
|
try:
|
||||||
|
sensor_dump = subprocess.check_output(cmd, shell=True)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
logging.error('Error! Failed to execute: {}'.format(cmd))
|
||||||
|
sys.exit(1)
|
||||||
|
return sensor_dump
|
||||||
|
|
||||||
|
def get_reading_by_name(sensor_name, sdr_elist_dump):
|
||||||
|
'''
|
||||||
|
Search for the match sensor name, return sensor
|
||||||
|
reading value and unit, return object epmtry string
|
||||||
|
if search not match.
|
||||||
|
|
||||||
|
The output of sensor dump:
|
||||||
|
TEMP_FAN_U52 | 00h | ok | 7.1 | 31 degrees C
|
||||||
|
TEMP_FAN_U17 | 01h | ok | 7.1 | 27 degrees C
|
||||||
|
TEMP_SW_U52 | 02h | ok | 7.1 | 30 degrees C
|
||||||
|
Fan2_Status | 07h | ok | 29.2 | Present
|
||||||
|
Fan2_Front | 0Eh | ok | 29.2 | 12000 RPM
|
||||||
|
Fan2_Rear | 46h | ok | 29.2 | 14700 RPM
|
||||||
|
PSU2_Status | 39h | ok | 10.2 | Presence detected
|
||||||
|
PSU2_Fan | 3Dh | ok | 10.2 | 16000 RPM
|
||||||
|
PSU2_VIn | 3Ah | ok | 10.2 | 234.30 Volts
|
||||||
|
PSU2_CIn | 3Bh | ok | 10.2 | 0.80 Amps
|
||||||
|
'''
|
||||||
|
found = ''
|
||||||
|
|
||||||
|
for line in sdr_elist_dump.split("\n"):
|
||||||
|
if sensor_name in line:
|
||||||
|
found = line.strip()
|
||||||
|
break
|
||||||
|
|
||||||
|
if not found:
|
||||||
|
logging.error('Cannot find sensor name:' + sensor_name)
|
||||||
|
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
found = found.split('|')[4]
|
||||||
|
except IndexError:
|
||||||
|
logging.error('Cannot get sensor data of:' + sensor_name)
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
return found
|
||||||
|
|
||||||
|
|
||||||
|
def read_temperature_sensors(ipmi_sdr_elist):
|
||||||
|
|
||||||
|
sensor_list = [
|
||||||
|
('TEMP_FAN_U52', 'Fan Tray Middle Temp'),
|
||||||
|
('TEMP_FAN_U17', 'Fan Tray Right Temp'),
|
||||||
|
('TEMP_SW_U52', 'Switchboard Left Inlet Temp'),
|
||||||
|
('TEMP_SW_U16', 'Switchboard Right Inlet Temp'),
|
||||||
|
('TEMP_BB_U3', 'Baseboard Temp'),
|
||||||
|
('TEMP_CPU', 'CPU Internal Temp'),
|
||||||
|
('TEMP_SW_Internal', 'ASIC Internal Temp'),
|
||||||
|
('SW_U04_Temp', 'IR3595 Chip Left Temp'),
|
||||||
|
('SW_U14_Temp', 'IR3595 Chip Right Temp'),
|
||||||
|
('SW_U4403_Temp', 'IR3584 Chip Temp'),
|
||||||
|
]
|
||||||
|
|
||||||
|
output = ''
|
||||||
|
sensor_format = '{0:{width}}{1}\n'
|
||||||
|
# Find max length of sensor calling name
|
||||||
|
max_name_width = max(len(sensor[1]) for sensor in sensor_list)
|
||||||
|
|
||||||
|
output += "Temperature Sensors\n"
|
||||||
|
output += "Adapter: IPMI adapter\n"
|
||||||
|
for sensor in sensor_list:
|
||||||
|
reading = get_reading_by_name(sensor[0],ipmi_sdr_elist)
|
||||||
|
output += sensor_format.format('{}:'.format(sensor[1]),
|
||||||
|
reading,
|
||||||
|
width=str(max_name_width+1))
|
||||||
|
output += '\n'
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def read_fan_sensors(num_fans, ipmi_sdr_elist):
|
||||||
|
|
||||||
|
sensor_list = [
|
||||||
|
('Fan{}_Status', 'Status'),
|
||||||
|
('Fan{}_Front', 'Fan {} front'),
|
||||||
|
('Fan{}_Rear', 'Fan {} rear'),
|
||||||
|
]
|
||||||
|
|
||||||
|
output = ''
|
||||||
|
sensor_format = '{0:{width}}{1}\n'
|
||||||
|
# Find max length of sensor calling name
|
||||||
|
max_name_width = max(len(sensor[1]) for sensor in sensor_list)
|
||||||
|
|
||||||
|
output += "Fan Trays\n"
|
||||||
|
output += "Adapter: IPMI adapter\n"
|
||||||
|
for fan_num in range(1, num_fans+1):
|
||||||
|
for sensor in sensor_list:
|
||||||
|
ipmi_sensor_name = sensor[0].format(fan_num)
|
||||||
|
display_sensor_name = sensor[1].format(fan_num)
|
||||||
|
reading = get_reading_by_name(ipmi_sensor_name, ipmi_sdr_elist)
|
||||||
|
output += sensor_format.format('{}:'.format(display_sensor_name),
|
||||||
|
reading,
|
||||||
|
width=str(max_name_width+1))
|
||||||
|
output += '\n'
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def read_psu_sensors(num_psus, ipmi_sdr_elist):
|
||||||
|
|
||||||
|
sensor_list = [
|
||||||
|
('PSU{}_Status', 'PSU {} Status'),
|
||||||
|
('PSU{}_Fan', 'PSU {} Fan'),
|
||||||
|
('PSU{}_VIn', 'PSU {} Input Voltag'),
|
||||||
|
('PSU{}_CIn', 'PSU {} Input Current'),
|
||||||
|
('PSU{}_PIn', 'PSU {} Input Power'),
|
||||||
|
('PSU{}_Temp1', 'PSU {} Temp1'),
|
||||||
|
('PSU{}_Temp2', 'PSU {} Temp2'),
|
||||||
|
('PSU{}_VOut', 'PSU {} Output Voltag'),
|
||||||
|
('PSU{}_COut', 'PSU {} Output Current'),
|
||||||
|
('PSU{}_POut', 'PSU {} Output Power'),
|
||||||
|
]
|
||||||
|
|
||||||
|
output = ''
|
||||||
|
sensor_format = '{0:{width}}{1}\n'
|
||||||
|
# Find max length of sensor calling name
|
||||||
|
max_name_width = max(len(sensor[1]) for sensor in sensor_list)
|
||||||
|
|
||||||
|
output += "PSU\n"
|
||||||
|
output += "Adapter: IPMI adapter\n"
|
||||||
|
for psu_num in range(1, num_psus+1):
|
||||||
|
for sensor in sensor_list:
|
||||||
|
ipmi_sensor_name = sensor[0].format(psu_num)
|
||||||
|
display_sensor_name = sensor[1].format(psu_num)
|
||||||
|
reading = get_reading_by_name(ipmi_sensor_name, ipmi_sdr_elist)
|
||||||
|
output += sensor_format.format('{}:'.format(display_sensor_name),
|
||||||
|
reading,
|
||||||
|
width=str(max_name_width+1))
|
||||||
|
output += '\n'
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
output_string = ''
|
||||||
|
|
||||||
|
ipmi_sdr_elist = ipmi_sensor_dump(IPMI_SDR_CMD)
|
||||||
|
output_string += read_temperature_sensors(ipmi_sdr_elist)
|
||||||
|
output_string += read_psu_sensors(MAX_NUM_PSUS, ipmi_sdr_elist)
|
||||||
|
output_string += read_fan_sensors(MAX_NUM_FANS, ipmi_sdr_elist)
|
||||||
|
print(output_string)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
11
platform/broadcom/sonic-platform-modules-cel/silverstone/scripts/sensors
Executable file
11
platform/broadcom/sonic-platform-modules-cel/silverstone/scripts/sensors
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
DOCKER_EXEC_FLAGS="i"
|
||||||
|
|
||||||
|
# Determine whether stdout is on a terminal
|
||||||
|
if [ -t 1 ] ; then
|
||||||
|
DOCKER_EXEC_FLAGS+="t"
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker exec -$DOCKER_EXEC_FLAGS pmon sensors "$@"
|
||||||
|
docker exec -$DOCKER_EXEC_FLAGS pmon platform_sensors.py "$@"
|
Reference in New Issue
Block a user