From cbc1445d7c6e10166fdd4c7115ff744b5a7cf5b3 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Thu, 17 Aug 2017 11:04:11 -0400 Subject: [PATCH] Manage NTP configuration of ThinkSystem D2 SMM This provides access to the NTP configuration of SMMs so that API and CLI can manipulate it. Change-Id: I896df6b254b2838d8ec89c56d07245ae4dd03bff --- pyghmi/ipmi/oem/lenovo/handler.py | 13 +++++++++ pyghmi/ipmi/oem/lenovo/nextscale.py | 44 ++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/pyghmi/ipmi/oem/lenovo/handler.py b/pyghmi/ipmi/oem/lenovo/handler.py index e0db8d77..fefede6d 100755 --- a/pyghmi/ipmi/oem/lenovo/handler.py +++ b/pyghmi/ipmi/oem/lenovo/handler.py @@ -251,6 +251,8 @@ class OEMHandler(generic.OEMHandler): if self.has_tsm: ntpres = self.ipmicmd.xraw_command(netfn=0x32, command=0xa7) return ntpres['data'][0] == '\x01' + elif self.is_fpc: + return self.smmhandler.get_ntp_enabled(self._fpc_variant) return None def get_ntp_servers(self): @@ -260,6 +262,8 @@ class OEMHandler(generic.OEMHandler): srvs.append(ntpres['data'][1:129].rstrip('\x00')) srvs.append(ntpres['data'][129:257].rstrip('\x00')) return srvs + if self.is_fpc: + return self.smmhandler.get_ntp_servers() return None def set_ntp_enabled(self, enabled): @@ -271,6 +275,9 @@ class OEMHandler(generic.OEMHandler): self.ipmicmd.xraw_command( netfn=0x32, command=0xa8, data=(3, 0), timeout=15) return True + if self.is_fpc: + self.smmhandler.set_ntp_enabled(enabled) + return True return None def set_ntp_server(self, server, index=0): @@ -281,6 +288,12 @@ class OEMHandler(generic.OEMHandler): cmddata += server.ljust(128, '\x00') self.ipmicmd.xraw_command(netfn=0x32, command=0xa8, data=cmddata) return True + elif self.is_fpc: + if not 0 <= index <= 2: + raise pygexc.InvalidParameterValue( + 'SMM supports indexes 0 through 2') + self.smmhandler.set_ntp_server(server, index) + return True return None @property diff --git a/pyghmi/ipmi/oem/lenovo/nextscale.py b/pyghmi/ipmi/oem/lenovo/nextscale.py index 6e7a0157..d382457f 100644 --- a/pyghmi/ipmi/oem/lenovo/nextscale.py +++ b/pyghmi/ipmi/oem/lenovo/nextscale.py @@ -274,6 +274,48 @@ class SMMClient(object): wc.set_header('ST2', self.st2) return wc + def get_ntp_enabled(self, variant): + self.wc.request('POST', '/data', 'get=ntpOpMode') + rsp = self.wc.getresponse() + info = fromstring(rsp.read()) + self.logout() + for data in info.findall('ntpOpMode'): + return data.text == '1' + + def set_ntp_enabled(self, enabled): + self.wc.request('POST', '/data', 'set=ntpOpMode:{0}'.format( + 1 if enabled else 0)) + rsp = self.wc.getresponse() + result = rsp.read() + self.logout() + if 'ok' not in result: + raise Exception("Unrecognized result: " + result) + + def set_ntp_server(self, server, index): + self.wc.request('POST', '/data', 'set=ntpServer{0}:{1}'.format( + index + 1, server)) + rsp = self.wc.getresponse() + result = rsp.read() + if 'ok' not in result: + raise Exception("Unrecognized result: " + result) + self.logout() + return True + + def get_ntp_servers(self): + self.wc.request( + 'POST', '/data', 'get=ntpServer1,ntpServer2,ntpServer3') + rsp = self.wc.getresponse() + result = fromstring(rsp.read()) + srvs = [] + for data in result.findall('ntpServer1'): + srvs.append(data.text) + for data in result.findall('ntpServer2'): + srvs.append(data.text) + for data in result.findall('ntpServer3'): + srvs.append(data.text) + self.logout() + return srvs + def update_firmware(self, filename, data=None, progress=None, bank=None): if progress is None: progress = lambda x: True @@ -285,7 +327,7 @@ class SMMClient(object): data = z.open(filename) break progress({'phase': 'upload', 'progress': 0.0}) - url = self.wc + url = self.wc # this is just to get self.st1 initted url = '/fwupload/fwupload.esp?ST1={0}'.format(self.st1) self.wc.upload(url, filename, data, formname='fileUpload', otherfields={'preConfig': 'on'})