From 9b16aba8a8ce48fa7685c53b2a0b2547e188881b Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Tue, 8 Sep 2015 14:28:51 -0400 Subject: [PATCH] Implement NTP support for Lenovo Thinkserver Provide a framework for augmenting configuration with NTP data and implement it for Lenovo thinkservers Change-Id: I87dc79549619b8d912425a26d56d73f515630981 --- pyghmi/ipmi/command.py | 16 ++++++++++++++ pyghmi/ipmi/oem/generic.py | 31 ++++++++++++++++++++++++++ pyghmi/ipmi/oem/lenovo/handler.py | 36 +++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) diff --git a/pyghmi/ipmi/command.py b/pyghmi/ipmi/command.py index 558881d4..cde7782d 100644 --- a/pyghmi/ipmi/command.py +++ b/pyghmi/ipmi/command.py @@ -547,6 +547,22 @@ class Command(object): self.oem_init() return self._oem.get_leds() + def get_ntp_enabled(self): + self.oem_init() + return self._oem.get_ntp_enabled() + + def set_ntp_enabled(self, enable): + self.oem_init() + return self._oem.set_ntp_enabled(enable) + + def get_ntp_servers(self): + self.oem_init() + return self._oem.get_ntp_servers() + + def set_ntp_server(self, server, index=0): + self.oem_init() + return self._oem.set_ntp_server(server, index) + def get_health(self): """Summarize health of managed system diff --git a/pyghmi/ipmi/oem/generic.py b/pyghmi/ipmi/oem/generic.py index 56e5082e..315b1355 100644 --- a/pyghmi/ipmi/oem/generic.py +++ b/pyghmi/ipmi/oem/generic.py @@ -105,6 +105,37 @@ class OEMHandler(object): """ return () + def get_ntp_enabled(self): + """Get whether ntp is enabled or not + + :returns: True if enabled, False if disabled, None if unsupported + """ + return None + + def set_ntp_enabled(self, enabled): + """Set whether NTP should be enabled + + :returns: True on success + """ + return None + + def get_ntp_servers(self): + """Get current set of configured NTP servers + + :returns iterable of configured NTP servers: + """ + return () + + def set_ntp_server(self, server, index=0): + """Set an ntp server + + :param server: Destination address of server to reach + :param index: Index of server to configure, primary assumed if not + specified + :returns: True if success + """ + return None + def process_fru(self, fru): """Modify a fru entry with OEM understanding. diff --git a/pyghmi/ipmi/oem/lenovo/handler.py b/pyghmi/ipmi/oem/lenovo/handler.py index 2b06c389..3ea5129f 100755 --- a/pyghmi/ipmi/oem/lenovo/handler.py +++ b/pyghmi/ipmi/oem/lenovo/handler.py @@ -189,6 +189,42 @@ class OEMHandler(generic.OEMHandler): event['component_type_id'] == 13): event['component'] += ' {0}'.format(evdata[1] & 0b11111) + def get_ntp_enabled(self): + if self.has_tsm: + ntpres = self.ipmicmd.xraw_command(netfn=0x32, command=0xa7) + return ntpres['data'][0] == '\x01' + return None + + def get_ntp_servers(self): + if self.has_tsm: + srvs = [] + ntpres = self.ipmicmd.xraw_command(netfn=0x32, command=0xa7) + srvs.append(ntpres['data'][1:129].rstrip('\x00')) + srvs.append(ntpres['data'][129:257].rstrip('\x00')) + return srvs + return None + + def set_ntp_enabled(self, enabled): + if self.has_tsm: + if enabled: + self.ipmicmd.xraw_command( + netfn=0x32, command=0xa8, data=(3, 1)) + else: + self.ipmicmd.xraw_command( + netfn=0x32, command=0xa8, data=(3, 0)) + return True + return None + + def set_ntp_server(self, server, index=0): + if self.has_tsm: + if not (0 <= index <= 1): + raise pygexc.InvalidParameterValue("Index must be 0 or 1") + cmddata = bytearray((1 + index, )) + cmddata += server.ljust(128, '\x00') + self.ipmicmd.xraw_command(netfn=0x32, command=0xa8, data=cmddata) + return True + return None + @property def has_tsm(self): """True if this particular server have a TSM based service processor