From 76f5c69e723fe50ff00f791f626ffbf99498fa4c Mon Sep 17 00:00:00 2001 From: Juliana Motira Date: Wed, 19 Aug 2015 09:33:51 -0300 Subject: [PATCH] Add custom OEM firmware info parsing for Lenovo ThinkServers Parse Version Info and add a command to retrieve it. Change-Id: I7c321efb4861392fb4a9151ffd2a64ae2b5b7a42 --- pyghmi/ipmi/command.py | 6 ++++ pyghmi/ipmi/oem/generic.py | 5 +++ pyghmi/ipmi/oem/lenovo/firmware.py | 57 ++++++++++++++++++++++++++++++ pyghmi/ipmi/oem/lenovo/handler.py | 7 ++++ 4 files changed, 75 insertions(+) create mode 100644 pyghmi/ipmi/oem/lenovo/firmware.py diff --git a/pyghmi/ipmi/command.py b/pyghmi/ipmi/command.py index 167d2f5f..5562524e 100644 --- a/pyghmi/ipmi/command.py +++ b/pyghmi/ipmi/command.py @@ -1502,3 +1502,9 @@ class Command(object): """ self.set_user_password(uid, mode) return True + + def get_firmware(self): + """Retrieve OEM Firmware information + """ + self.oem_init() + return self._oem.get_oem_firmware() diff --git a/pyghmi/ipmi/oem/generic.py b/pyghmi/ipmi/oem/generic.py index 154bbaa0..86fbc9d3 100644 --- a/pyghmi/ipmi/oem/generic.py +++ b/pyghmi/ipmi/oem/generic.py @@ -122,3 +122,8 @@ class OEMHandler(object): return fru fru['oem_parser'] = None return fru + + def get_oem_firmware(self): + """Get Firmware information. + """ + return () diff --git a/pyghmi/ipmi/oem/lenovo/firmware.py b/pyghmi/ipmi/oem/lenovo/firmware.py new file mode 100644 index 00000000..2feb4263 --- /dev/null +++ b/pyghmi/ipmi/oem/lenovo/firmware.py @@ -0,0 +1,57 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2015 Lenovo +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from pyghmi.ipmi.oem.lenovo.inventory import EntryField, \ + parse_inventory_category_entry + +firmware_fields = ( + EntryField("Revision", "B"), + EntryField("Bios", "16s"), + EntryField("Operational ME", "10s"), + EntryField("Recovery ME", "10s"), + EntryField("RAID 1", "16s"), + EntryField("RAID 2", "16s"), + EntryField("Mezz 1", "16s"), + EntryField("Mezz 2", "16s"), + EntryField("BMC", "16s"), + EntryField("LEPT", "16s"), + EntryField("PSU 1", "16s"), + EntryField("PSU 2", "16s"), + EntryField("CPLD", "16s"), + EntryField("LIND", "16s"), + EntryField("WIND", "16s"), + EntryField("DIAG", "16s")) + + +def parse_firmware_info(raw): + bytes_read, data = parse_inventory_category_entry(raw, firmware_fields) + del data['Revision'] + for key in data: + yield(key, {'version': data[key]}) + + +def get_categories(): + return { + "firmware": { + "idstr": "FW Version", + "parser": parse_firmware_info, + "command": { + "netfn": 0x06, + "command": 0x59, + "data": (0x00, 0xc7, 0x00, 0x00) + } + } + } diff --git a/pyghmi/ipmi/oem/lenovo/handler.py b/pyghmi/ipmi/oem/lenovo/handler.py index 56e8b02a..44233ab7 100755 --- a/pyghmi/ipmi/oem/lenovo/handler.py +++ b/pyghmi/ipmi/oem/lenovo/handler.py @@ -25,6 +25,7 @@ import pyghmi.ipmi.private.util as util from pyghmi.ipmi.oem.lenovo import cpu from pyghmi.ipmi.oem.lenovo import dimm from pyghmi.ipmi.oem.lenovo import drive +from pyghmi.ipmi.oem.lenovo import firmware from pyghmi.ipmi.oem.lenovo import inventory from pyghmi.ipmi.oem.lenovo import pci from pyghmi.ipmi.oem.lenovo import psu @@ -280,3 +281,9 @@ class OEMHandler(generic.OEMHandler): else: fru['oem_parser'] = None return fru + + def get_oem_firmware(self): + if self.has_tsm: + command = firmware.get_categories()["firmware"] + rsp = self.ipmicmd.xraw_command(**command["command"]) + return command["parser"](rsp["data"])