diff --git a/pyghmi/ipmi/oem/lenovo/imm.py b/pyghmi/ipmi/oem/lenovo/imm.py index 5dc3afe2..f60a97ae 100644 --- a/pyghmi/ipmi/oem/lenovo/imm.py +++ b/pyghmi/ipmi/oem/lenovo/imm.py @@ -80,6 +80,8 @@ class IMMClient(object): self._wc = None # The webclient shall be initiated on demand self._energymanager = None self.datacache = {} + self.webkeepalive = None + self._keepalivesession = None @staticmethod def _parse_builddate(strval): @@ -798,7 +800,14 @@ class XCCClient(IMMClient): '{}') if 'return' not in rt or rt['return'] != 0: raise Exception('Unhandled return: ' + repr(rt)) - self.weblogout() + if not self.webkeepalive: + self._keepalivesession = self._wc + self.webkeepalive = self.ipmicmd.ipmi_session.register_keepalive( + self.keepalive, None) + self._wc = None + + def keepalive(self): + self._refresh_token_wc(self._keepalivesession) def get_firmware_inventory(self, bmcver): # First we fetch the system firmware found in imm properties @@ -881,6 +890,9 @@ class XCCClient(IMMClient): yield firm def detach_remote_media(self): + if self.webkeepalive: + self.ipmicmd.ipmi_session.unregister_keepalive(self.webkeepalive) + self._keepalivesession = None rt = self.wc.grab_json_response('/api/providers/rp_vm_remote_getdisk') if 'items' in rt: slots = [] @@ -966,9 +978,12 @@ class XCCClient(IMMClient): return result def _refresh_token(self): - self.wc.grab_json_response('/api/providers/identity') - if '_csrf_token' in self.wc.cookies: - self.wc.set_header('X-XSRF-TOKEN', self.wc.cookies['_csrf_token']) + self._refresh_token(self.wc) + + def _refresh_token_wc(self, wc): + wc.grab_json_response('/api/providers/identity') + if '_csrf_token' in wc.cookies: + wc.set_header('X-XSRF-TOKEN', self.wc.cookies['_csrf_token']) def update_firmware_backend(self, filename, data=None, progress=None, bank=None): diff --git a/pyghmi/ipmi/private/session.py b/pyghmi/ipmi/private/session.py index 6f5b039f..aab744ec 100644 --- a/pyghmi/ipmi/private/session.py +++ b/pyghmi/ipmi/private/session.py @@ -1211,13 +1211,8 @@ class Session(object): """Performs a keepalive to avoid idle disconnect """ try: - if not self._customkeepalives: - if self.incommand: - # if currently in command, no cause to keepalive - return - self.raw_command(netfn=6, command=1, - callback=self._keepalive_wrapper(None)) - else: + keptalive = False + if self._customkeepalives: kaids = list(self._customkeepalives.keys()) for keepalive in kaids: try: @@ -1229,8 +1224,18 @@ class Session(object): # raw command ultimately caused a keepalive to # deregister continue + if callable(cmd): + cmd() + continue + keptalive = True cmd['callback'] = self._keepalive_wrapper(callback) self.raw_command(**cmd) + if not keptalive: + if self.incommand: + # if currently in command, no cause to keepalive + return + self.raw_command(netfn=6, command=1, + callback=self._keepalive_wrapper(None)) except exc.IpmiException: self._mark_broken()