def _communicate(self, wsm, name=None): try: self._proto_connect() self._logger.debug("Sending: " + wsm.get_text()) result = self._proto_ship_payload(wsm.get_text()) self._logger.debug("Received: " + str(result)) en = WsManResponse().execute_str(result) out = self._parse_output(en, name) return out except Exception as ex: self._logger.debug(str(ex)) # fake as if the error came from the WsMan subsystem sx = WsManRequest() sx.add_error(ex) self._logger.debug(sx.get_text()) en = WsManResponse().execute_str(sx.get_text()) out = self._parse_output(en) return out
def _parse_output(self, en, name=None): retval = {} if "Header" in en: rgsp = "http://schemas.xmlsoap.org/ws/2004/09/transfer/GetResponse" if "Action" in en["Header"] and en["Header"]["Action"] == rgsp: retval['Status'] = 'Success' retval['Data'] = en['Body'] rfault = "http://schemas.xmlsoap.org/ws/2004/08/addressing/fault" if "Action" in en["Header"] and en["Header"]["Action"] == rfault: retval['Status'] = 'Failed' if not "Body" in en: retval['Status'] = 'Invalid JSON. Does not have Body!' elif "ClientFault" in en["Body"]: retval['Status'] = 'Found Client (SDK) Side Fault' retval['Fault.Data'] = en["Body"]["ClientFault"] if "Reason" in en["Body"]["ClientFault"] and \ "Text" in en["Body"]["ClientFault"]["Reason"]: retval['Message'] = WsManResponse().get_message( en["Body"]["ClientFault"]["Reason"]) elif "Fault" in en["Body"]: retval['Status'] = 'Found Fault' retval['Fault.Data'] = en["Body"]["Fault"] if "Reason" in en["Body"]["Fault"]: retval['Message'] = WsManResponse().get_message( en["Body"]["Fault"]["Reason"]) if retval['Message'] == "" and "Detail" in en["Body"]["Fault"]: retval['Message'] = WsManResponse().get_message( en["Body"]["Fault"]["Detail"]) elif "EnumerateResponse" in en["Body"]: retval['Status'] = 'Success' retval['Data'] = en["Body"]["EnumerateResponse"]["Items"] elif "IdentifyResponse" in en["Body"]: retval['Status'] = 'Success' retval['Data'] = en["Body"] else: for entry in en["Body"]: if not entry.endswith("_OUTPUT"): continue retval['Data'] = en["Body"] retval['Status'] = 'Not understood the message. Sorry!' if "Message" in en["Body"][entry]: retval['Status'] = en["Body"][entry]["Message"] retval['Message'] = en["Body"][entry]["Message"] if "MessageID" in en["Body"][entry]: retval['MessageID'] = en["Body"][entry]["MessageID"] if "ReturnValue" in en["Body"][entry]: ret = int(en["Body"][entry]["ReturnValue"]) retval['Return'] = TypeHelper.get_name(ret, ReturnValueMap) retval['Status'] = retval['Return'] if ret == TypeHelper.resolve(ReturnValue.JobCreated): retval['Job'] = {"ResourceURI": "", "JobId": ""} ss = en["Body"][entry] if "Job" in ss: ss = ss["Job"] if 'RebootJobID' in ss: ss = ss['RebootJobID'] if "EndpointReference" in ss: ss = ss["EndpointReference"] if "ReferenceParameters" in ss: ss = ss["ReferenceParameters"] if "ResourceURI" in ss: retval['Job']['ResourceURI'] = ss["ResourceURI"] if "SelectorSet" in ss: ss = ss["SelectorSet"] if "Selector" in ss: ss = ss["Selector"] if len(ss) >= 1: retval['Job']['JobId'] = ss[0] retval['Job']['JobIdRest'] = [ ss[i] for i in range(1, len(ss)) ] else: retval['Job']['JobId'] = 'Unknown' retval['Job']['JobIdRest'] = ss retval['Status'] = 'Success' if not 'Status' in retval: retval['Status'] = 'Dont understand the message' retval['Data'] = en["Body"] return retval