amt-wsman-0.2.0.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /**
  2. * @description Intel(r) AMT WSMAN Stack
  3. * @author Ylian Saint-Hilaire
  4. * @version v0.2.0
  5. */
  6. // Construct a MeshServer object
  7. var WsmanStackCreateService = function (host, port, user, pass, tls, extra) {
  8. var obj = {};
  9. //obj.onDebugMessage = null; // Set to a function if you want to get debug messages.
  10. obj.NextMessageId = 1; // Next message number, used to label WSMAN calls.
  11. obj.Address = '/wsman';
  12. obj.comm = CreateWsmanComm(host, port, user, pass, tls, extra);
  13. obj.PerformAjax = function (postdata, callback, tag, pri, namespaces) {
  14. if (namespaces == undefined) namespaces = '';
  15. obj.comm.PerformAjax('<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns=\"http://www.w3.org/2003/05/soap-envelope\" ' + namespaces + '><Header><a:Action>' + postdata, function (data, status, tag) {
  16. if (status != 200) { callback(obj, null, { Header: { HttpError: status } }, status, tag); return; }
  17. var wsresponse = obj.ParseWsman(data);
  18. if (!wsresponse || wsresponse == null) { callback(obj, null, { Header: { HttpError: status } }, 601, tag); } else { callback(obj, wsresponse.Header["ResourceURI"], wsresponse, 200, tag); }
  19. }, tag, pri);
  20. }
  21. // Private method
  22. //obj.Debug = function (msg) { /*console.log(msg);*/ }
  23. // Cancel all pending queries with given status
  24. obj.CancelAllQueries = function (s) { obj.comm.CancelAllQueries(s); }
  25. // Get the last element of a URI string
  26. obj.GetNameFromUrl = function (resuri) {
  27. var x = resuri.lastIndexOf("/");
  28. return (x == -1)?resuri:resuri.substring(x + 1);
  29. }
  30. // Perform a WSMAN Subscribe operation
  31. obj.ExecSubscribe = function (resuri, delivery, url, callback, tag, pri, selectors, opaque, user, pass) {
  32. var digest = "", digest2 = "";
  33. if (user != undefined && pass != undefined) { digest = '<t:IssuedTokens><t:RequestSecurityTokenResponse><t:TokenType>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken</t:TokenType><t:RequestedSecurityToken><se:UsernameToken><se:Username>' + user + '</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">' + pass + '</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>'; digest2 = '<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'; }
  34. if (opaque != undefined && opaque != null) { opaque = '<a:ReferenceParameters>' + opaque + '</a:ReferenceParameters>'; } else { opaque = ""; }
  35. var data = "http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>" + _PutObjToSelectorsXml(selectors) + digest + '</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/' + delivery + '"><e:NotifyTo><a:Address>' + url + '</a:Address></e:NotifyTo>' + digest2 + '</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>';
  36. obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri, 'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:se="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:m="http://x.com"');
  37. }
  38. // Perform a WSMAN UnSubscribe operation
  39. obj.ExecUnSubscribe = function (resuri, callback, tag, pri, selectors) {
  40. var data = "http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>" + _PutObjToSelectorsXml(selectors) + '</Header><Body><e:Unsubscribe/>';
  41. obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri, 'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"');
  42. }
  43. // Perform a WSMAN PUT operation
  44. obj.ExecPut = function (resuri, putobj, callback, tag, pri, selectors) {
  45. var data = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout>" + _PutObjToSelectorsXml(selectors) + '</Header><Body>' + _PutObjToBodyXml(resuri, putobj);
  46. obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri);
  47. }
  48. // Perform a WSMAN CREATE operation
  49. obj.ExecCreate = function (resuri, putobj, callback, tag, pri, selectors) {
  50. var objname = obj.GetNameFromUrl(resuri);
  51. var data = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>" + _PutObjToSelectorsXml(selectors) + "</Header><Body><g:" + objname + " xmlns:g=\"" + resuri + "\">";
  52. for (var n in putobj) { data += "<g:" + n + ">" + putobj[n] + "</g:" + n + ">" }
  53. obj.PerformAjax(data + "</g:" + objname + "></Body></Envelope>", callback, tag, pri);
  54. }
  55. // Perform a WSMAN CREATE operation
  56. obj.ExecCreateXml = function (resuri, argsxml, callback, tag, pri) {
  57. var objname = obj.GetNameFromUrl(resuri), selector = "";
  58. obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout></Header><Body><r:" + objname + " xmlns:r=\"" + resuri + "\">" + argsxml + "</r:" + objname + "></Body></Envelope>", callback, tag, pri);
  59. }
  60. // Perform a WSMAN DELETE operation
  61. obj.ExecDelete = function (resuri, putobj, callback, tag, pri) {
  62. var data = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>" + _PutObjToSelectorsXml(putobj) + "</Header><Body /></Envelope>";
  63. obj.PerformAjax(data, callback, tag, pri);
  64. }
  65. // Perform a WSMAN GET operation
  66. obj.ExecGet = function (resuri, callback, tag, pri) {
  67. obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body /></Envelope>", callback, tag, pri);
  68. }
  69. // Perform a WSMAN method call operation
  70. obj.ExecMethod = function (resuri, method, args, callback, tag, pri, selectors) {
  71. var argsxml = "";
  72. for (var i in args) { if (args[i] != null) { if (Array.isArray(args[i])) { for (var x in args[i]) { argsxml += "<r:" + i + ">" + args[i][x] + "</r:" + i + ">"; } } else { argsxml += "<r:" + i + ">" + args[i] + "</r:" + i + ">"; } } }
  73. obj.ExecMethodXml(resuri, method, argsxml, callback, tag, pri, selectors);
  74. }
  75. // Perform a WSMAN method call operation. The arguments are already formatted in XML.
  76. obj.ExecMethodXml = function (resuri, method, argsxml, callback, tag, pri, selectors) {
  77. obj.PerformAjax(resuri + "/" + method + "</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>" + _PutObjToSelectorsXml(selectors) + "</Header><Body><r:" + method + '_INPUT' + " xmlns:r=\"" + resuri + "\">" + argsxml + "</r:" + method + "_INPUT></Body></Envelope>", callback, tag, pri);
  78. }
  79. // Perform a WSMAN ENUM operation
  80. obj.ExecEnum = function (resuri, callback, tag, pri) {
  81. obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Enumerate xmlns=\"http://schemas.xmlsoap.org/ws/2004/09/enumeration\" /></Body></Envelope>", callback, tag, pri);
  82. }
  83. // Perform a WSMAN PULL operation
  84. obj.ExecPull = function (resuri, enumctx, callback, tag, pri) {
  85. obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns=\"http://schemas.xmlsoap.org/ws/2004/09/enumeration\"><EnumerationContext>" + enumctx + "</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>", callback, tag, pri);
  86. }
  87. // Private method
  88. obj.ParseWsman = function (xml) {
  89. try {
  90. if (!xml.childNodes) xml = _turnToXml(xml);
  91. var r = { Header:{} }, header = xml.getElementsByTagName("Header")[0], t;
  92. if (!header) header = xml.getElementsByTagName("a:Header")[0];
  93. if (!header) return null;
  94. for (var i = 0; i < header.childNodes.length; i++) {
  95. var child = header.childNodes[i];
  96. r.Header[child.localName] = child.textContent;
  97. }
  98. var body = xml.getElementsByTagName("Body")[0];
  99. if (!body) body = xml.getElementsByTagName("a:Body")[0];
  100. if (!body) return null;
  101. if (body.childNodes.length > 0) {
  102. t = body.childNodes[0].localName;
  103. var x = t.indexOf('_OUTPUT');
  104. if ((x != -1) && (x == (t.length - 7))) { t = t.substring(0, t.length - 7); }
  105. r.Header['Method'] = t;
  106. r.Body = _ParseWsmanRec(body.childNodes[0]);
  107. }
  108. return r;
  109. } catch (e) {
  110. console.log("Unable to parse XML: " + xml);
  111. return null;
  112. }
  113. }
  114. // Private method
  115. function _ParseWsmanRec(node) {
  116. var data, r = {};
  117. for (var i = 0; i < node.childNodes.length; i++) {
  118. var child = node.childNodes[i];
  119. if (child.childElementCount == 0) { data = child.textContent; } else { data = _ParseWsmanRec(child); }
  120. if (data == 'true') data = true; // Convert 'true' into true
  121. if (data == 'false') data = false; // Convert 'false' into false
  122. var childObj = data;
  123. if (child.attributes.length > 0) {
  124. childObj = {'Value': data };
  125. for(var j = 0; j < child.attributes.length; j++) {
  126. childObj['@' + child.attributes[j].name] = child.attributes[j].value;
  127. }
  128. }
  129. if (r[child.localName] instanceof Array) { r[child.localName].push(childObj); }
  130. else if (r[child.localName] == undefined) { r[child.localName] = childObj; }
  131. else { r[child.localName] = [r[child.localName], childObj]; }
  132. }
  133. return r;
  134. }
  135. function _PutObjToBodyXml(resuri, putObj) {
  136. if(!resuri || putObj === undefined || putObj === null) return '';
  137. var objname = obj.GetNameFromUrl(resuri);
  138. var result = '<r:' + objname + ' xmlns:r="' + resuri + '">';
  139. for (var prop in putObj) {
  140. if (!putObj.hasOwnProperty(prop) || prop.indexOf('__') === 0 || prop.indexOf('@') === 0) continue;
  141. if (putObj[prop] === undefined || putObj[prop] === null || typeof putObj[prop] === 'function') continue;
  142. if (typeof putObj[prop] === 'object' && putObj[prop]['ReferenceParameters']) {
  143. result += '<r:' + prop + '><a:Address>' + putObj[prop].Address + '</a:Address><a:ReferenceParameters><w:ResourceURI>' + putObj[prop]['ReferenceParameters']["ResourceURI"] + '</w:ResourceURI><w:SelectorSet>';
  144. var selectorArray = putObj[prop]['ReferenceParameters']['SelectorSet']['Selector'];
  145. if (Array.isArray(selectorArray)) {
  146. for (var i=0; i< selectorArray.length; i++) {
  147. result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray[i]) + '>' + selectorArray[i]['Value'] + '</w:Selector>';
  148. }
  149. }
  150. else {
  151. result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray) + '>' + selectorArray['Value'] + '</w:Selector>';
  152. }
  153. result += '</w:SelectorSet></a:ReferenceParameters></r:' + prop + '>';
  154. }
  155. else {
  156. if (Array.isArray(putObj[prop])) {
  157. for (var i = 0; i < putObj[prop].length; i++) {
  158. result += '<r:' + prop + '>' + putObj[prop][i].toString() + '</r:' + prop + '>';
  159. }
  160. } else {
  161. result += '<r:' + prop + '>' + putObj[prop].toString() + '</r:' + prop + '>';
  162. }
  163. }
  164. }
  165. result += '</r:' + objname + '>';
  166. return result;
  167. }
  168. /*
  169. convert
  170. { @Name: 'InstanceID', @AttrName: 'Attribute Value'}
  171. into
  172. ' Name="InstanceID" AttrName="Attribute Value" '
  173. */
  174. function _ObjectToXmlAttributes(objWithAttributes) {
  175. if(!objWithAttributes) return '';
  176. var result = ' ';
  177. for (var propName in objWithAttributes) {
  178. if (!objWithAttributes.hasOwnProperty(propName) || propName.indexOf('@') !== 0) continue;
  179. result += propName.substring(1) + '="' + objWithAttributes[propName] + '" ';
  180. }
  181. return result;
  182. }
  183. function _PutObjToSelectorsXml(selectorSet) {
  184. if (!selectorSet) return '';
  185. if (typeof selectorSet == 'string') return selectorSet;
  186. if (selectorSet['InstanceID']) return "<w:SelectorSet><w:Selector Name=\"InstanceID\">" + selectorSet['InstanceID'] + "</w:Selector></w:SelectorSet>";
  187. var result = '<w:SelectorSet>';
  188. for(var propName in selectorSet) {
  189. if (!selectorSet.hasOwnProperty(propName)) continue;
  190. result += '<w:Selector Name="' + propName + '">';
  191. if (selectorSet[propName]['ReferenceParameters']) {
  192. result += '<a:EndpointReference>';
  193. result += '<a:Address>' + selectorSet[propName]['Address'] + '</a:Address><a:ReferenceParameters><w:ResourceURI>' + selectorSet[propName]['ReferenceParameters']['ResourceURI'] + '</w:ResourceURI><w:SelectorSet>';
  194. var selectorArray = selectorSet[propName]['ReferenceParameters']['SelectorSet']['Selector'];
  195. if (Array.isArray(selectorArray)) {
  196. for (var i = 0; i < selectorArray.length; i++) {
  197. result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray[i]) + '>' + selectorArray[i]['Value'] + '</w:Selector>';
  198. }
  199. }
  200. else {
  201. result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray) + '>' + selectorArray['Value'] + '</w:Selector>';
  202. }
  203. result += '</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>';
  204. } else {
  205. result += selectorSet[propName];
  206. }
  207. result += '</w:Selector>';
  208. }
  209. result += '</w:SelectorSet>';
  210. return result;
  211. }
  212. function _turnToXml(text) {
  213. if (window.DOMParser) {
  214. return new DOMParser().parseFromString(text, "text/xml");
  215. }
  216. else // Internet Explorer
  217. {
  218. var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  219. xmlDoc.async = false;
  220. xmlDoc.loadXML(text);
  221. return xmlDoc;
  222. }
  223. }
  224. return obj;
  225. }