mirror of
https://github.com/Ylianst/MeshCommander
synced 2025-12-06 06:03:20 +00:00
13995 lines
863 KiB
HTML
13995 lines
863 KiB
HTML
<!DOCTYPE html><!-- ###BEGIN###{EventSubscriptions} --><!-- ###END###{EventSubscriptions} --><!-- ###BEGIN###{Desktop-Settings} --><!-- ###END###{Desktop-Settings} --><!-- ###BEGIN###{Desktop-Multi} --><!-- ###END###{Desktop-Multi} --><!-- ###BEGIN###{ComputerSelectorNoImages} --><!-- ###END###{ComputerSelectorNoImages} --><!-- ###BEGIN###{ComputerSelector-Local-ScriptOnly} --><!-- ###END###{ComputerSelector-Local-ScriptOnly} --><html lang="es" style="height:100%"><head>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
|
|
<meta name="format-detection" content="telephone=no">
|
|
<link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo="> <!-- Stop favicon.ico from loading -->
|
|
<!-- ###BEGIN###{Look-Commander} -->
|
|
<!-- ###BEGIN###{ComputerSelector} -->
|
|
<link type="text/css" href="styles-commander-node.css" media="screen" rel="stylesheet" title="CSS">
|
|
<!-- ###END###{ComputerSelector} -->
|
|
<!-- ###BEGIN###{!ComputerSelector} -->
|
|
<link type="text/css" href="styles-commander.css" media="screen" rel="stylesheet" title="CSS">
|
|
<!-- ###END###{!ComputerSelector} -->
|
|
<!-- ###END###{Look-Commander} -->
|
|
<!-- ###BEGIN###{Look-Branded} -->
|
|
<link type="text/css" href="styles-branded.css" media="screen" rel="stylesheet" title="CSS">
|
|
<!-- ###END###{Look-Branded} -->
|
|
<!-- ###BEGIN###{Look-ISDU} -->
|
|
<link type="text/css" href="styles-isdu.css" media="screen" rel="stylesheet" title="CSS">
|
|
<!-- ###END###{Look-ISDU} -->
|
|
<!-- ###BEGIN###{Look-BrandedCommander} -->
|
|
<link type="text/css" href="styles-brandedcommander.css" media="screen" rel="stylesheet" title="CSS">
|
|
<!-- ###END###{Look-BrandedCommander} -->
|
|
<!-- ###BEGIN###{Look-Unite} -->
|
|
<link type="text/css" href="styles-unite.css" media="screen" rel="stylesheet" title="CSS">
|
|
<!-- ###END###{Look-Unite} -->
|
|
<!-- ###BEGIN###{Look-MeshCentral} -->
|
|
<link type="text/css" href="styles-mesh.css" media="screen" rel="stylesheet" title="CSS">
|
|
<!-- ###END###{Look-MeshCentral} -->
|
|
<script type="text/javascript" src="common-0.0.1.js"></script>
|
|
<!-- ###BEGIN###{Mode-LMS} -->
|
|
<script type="text/javascript" src="amt-lms-0.0.1.js"></script>
|
|
<script type="text/javascript" src="amt-wsman-ws-0.2.0.js"></script>
|
|
<!-- ###END###{Mode-LMS} -->
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<script type="text/javascript" src="amt-wsman-node-0.2.0.js"></script>
|
|
<script type="text/javascript" src="amt-redir-node-0.1.0.js"></script>
|
|
<script type="text/javascript" src="amt-scanner-0.1.0.js"></script>
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{Mode-WebSite} -->
|
|
<script type="text/javascript" src="amt-wsman-ws-0.2.0.js"></script>
|
|
<script type="text/javascript" src="amt-redir-ws-0.1.0.js"></script>
|
|
<!-- ###END###{Mode-WebSite} -->
|
|
<!-- ###BEGIN###{Mode-Firmware} -->
|
|
<script type="text/javascript" src="amt-wsman-ajax-0.2.0.js"></script>
|
|
<script type="text/javascript" src="amt-redir-ws-0.1.0.js"></script>
|
|
<!-- ###END###{Mode-Firmware} -->
|
|
<!-- ###BEGIN###{IDER} -->
|
|
<script type="text/javascript" src="amt-ider-ws-0.0.1.js"></script>
|
|
<!-- ###BEGIN###{IDER-IMRSDK} -->
|
|
<script type="text/javascript" src="amt-ider-node-0.0.1.js"></script>
|
|
<!-- ###END###{IDER-IMRSDK} -->
|
|
<!-- ###BEGIN###{Mode-MeshCentral2} -->
|
|
<script type="text/javascript" src="amt-ider-server-ws-0.0.1.js"></script>
|
|
<!-- ###END###{Mode-MeshCentral2} -->
|
|
<!-- ###END###{IDER} -->
|
|
<!-- ###BEGIN###{Mode-MeshCentral2} -->
|
|
<script type="text/javascript" src="amt-wsman-ws-0.2.0.js"></script>
|
|
<script type="text/javascript" src="amt-redir-ws-0.1.0.js"></script>
|
|
<!-- ###END###{Mode-MeshCentral2} -->
|
|
<script type="text/javascript" src="amt-wsman-0.2.0.js"></script>
|
|
<script type="text/javascript" src="amt-0.2.0.js"></script>
|
|
<!-- ###BEGIN###{Certificates} -->
|
|
<script type="text/javascript" src="forge.js/forge.bundle.js"></script>
|
|
<script type="text/javascript" src="amt-certificates-0.0.1.js"></script>
|
|
<!-- ###END###{Certificates} -->
|
|
<!-- ###BEGIN###{Scripting} -->
|
|
<script type="text/javascript" src="amt-script-0.2.0.js"></script>
|
|
<!-- ###END###{Scripting} -->
|
|
<!-- ###BEGIN###{Desktop} -->
|
|
<script type="text/javascript" src="amt-desktop-0.0.2.js"></script>
|
|
<style type="text/css">
|
|
.rb { cursor: pointer; border: none; float: right; font-size: 130%; margin-right: 4px; }
|
|
</style>
|
|
<!-- ###END###{Desktop} -->
|
|
<!-- ###BEGIN###{DesktopInband} -->
|
|
<script type="text/javascript" src="agent-desktop-0.0.2.js"></script>
|
|
<script type="text/javascript" src="agent-redir-rtc-0.1.0.js"></script>
|
|
<!-- ###END###{DesktopInband} -->
|
|
<!-- ###BEGIN###{Terminal} -->
|
|
<script type="text/javascript" src="amt-terminal-0.0.2.js"></script>
|
|
<!-- ###END###{Terminal} -->
|
|
<!-- ###BEGIN###{PowerControl-Advanced} -->
|
|
<!-- ###BEGIN###{PowerControl-OneClick} -->
|
|
<script type="text/javascript" src="webserver-0.0.1.js"></script>
|
|
<!-- ###END###{PowerControl-Advanced} -->
|
|
<!-- ###END###{PowerControl-OneClick} -->
|
|
<!-- ###BEGIN###{Inflate} -->
|
|
<script type="text/javascript" src="zlib.js"></script>
|
|
<script type="text/javascript" src="zlib-inflate.js"></script>
|
|
<script type="text/javascript" src="zlib-adler32.js"></script>
|
|
<script type="text/javascript" src="zlib-crc32.js"></script>
|
|
<!-- ###END###{Inflate} -->
|
|
<!-- ###BEGIN###{USBSetup} -->
|
|
<script type="text/javascript" src="amt-setupbin-0.1.0.js"></script>
|
|
<!-- ###END###{USBSetup} -->
|
|
<!-- ###BEGIN###{FileSaver} -->
|
|
<script type="text/javascript" src="filesaver.1.1.20151003.js"></script>
|
|
<!-- ###END###{FileSaver} -->
|
|
<!-- ###BEGIN###{MeshServerConnect} -->
|
|
<script type="text/javascript" src="meshcentral-server-0.2.0.js"></script>
|
|
<script type="text/javascript" src="websocket-wrapper-0.2.0.js"></script>
|
|
<!-- ###END###{MeshServerConnect} -->
|
|
<!-- ###BEGIN###{Mode-LMS} -->
|
|
<style type="text/css">
|
|
.menuitem { cursor: pointer; border: none; padding:5px; }
|
|
.menuitem:hover { background-color: #6b9dc7; }
|
|
</style>
|
|
<!-- ###END###{Mode-LMS} -->
|
|
<!-- ###BEGIN###{ComputerSelector} -->
|
|
<style type="text/css">
|
|
.menuitem { cursor: pointer; border: none; padding:5px; }
|
|
.menuitem:hover { background-color: #6b9dc7; }
|
|
</style>
|
|
<!-- ###END###{ComputerSelector} -->
|
|
<!-- ###BEGIN###{ContextMenus} -->
|
|
<style>
|
|
.contextMenu {
|
|
background: #F9F9F9;
|
|
box-shadow: 0 0 12px rgba( 0, 0, 0, .3 );
|
|
border: 1px solid #ccc;
|
|
/*border-radius: 4px;*/
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
list-style: none;
|
|
margin: 0;
|
|
padding: 5px;
|
|
min-width: 100px;
|
|
max-width: 150px;
|
|
z-index: 500;
|
|
}
|
|
|
|
.cmtext {
|
|
color: #444;
|
|
display: inline-block;
|
|
padding-left: 8px;
|
|
padding-right: 8px;
|
|
padding-top: 5px;
|
|
padding-bottom: 5px;
|
|
text-decoration: none;
|
|
width: 85%;
|
|
cursor: default;
|
|
overflow: hidden;
|
|
position: relative;
|
|
}
|
|
|
|
.cmtext:hover {
|
|
color: #f9f9f9;
|
|
background: #999;
|
|
}
|
|
</style>
|
|
<!-- ###END###{ContextMenus} -->
|
|
<!-- ###BEGIN###{DesktopInbandFiles} -->
|
|
<style>
|
|
.fileIcon1 {
|
|
background: url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb49Y2Sj9LT2f///yH5BAEAAAMALAAAAAAQABAAAAImnI+py+1vhJwyUYAzHTL4D3qdlJWaIFJqmKod607sDKIiDUP63hQAOw==);
|
|
height: 16px;
|
|
width: 16px;
|
|
cursor: pointer;
|
|
border: none;
|
|
float: left;
|
|
margin-top: 1px;
|
|
}
|
|
|
|
.fileIcon2 {
|
|
background: url(data:image/gif;base64,R0lGODlhEAAQAJEDAM2xV/Xur+XPgP///yH5BAEAAAMALAAAAAAQABAAAAJD3ISZIGHWUGihznesYDYATFVM+D2hJ4lgN1olxALAtAlmPCJvuMmJd6PJckDYwicrHhTD5o7plJmg0Uc0asNMkphHAQA7);
|
|
height: 16px;
|
|
width: 16px;
|
|
cursor: pointer;
|
|
border: none;
|
|
float: left;
|
|
margin-top: 1px;
|
|
}
|
|
|
|
.fileIcon3 {
|
|
background: url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb19IGBgbq6uv///yH5BAEAAAMALAAAAAAQABAAAAIy3ISpxgcPH2ouQgFEw1YmxnUXKEaaEZZnVWZk66JwzKpvuwZzwOgwb/C1gIOA8Yg8DgoAOw==);
|
|
height: 16px;
|
|
width: 16px;
|
|
cursor: pointer;
|
|
border: none;
|
|
float: left;
|
|
margin-top: 1px;
|
|
}
|
|
|
|
.filelist {
|
|
-moz-user-select: none;
|
|
-khtml-user-select: none;
|
|
-webkit-user-select: none;
|
|
-o-user-select: none;
|
|
cursor: default;
|
|
-khtml-user-drag: element;
|
|
background-color: white;
|
|
clear: both;
|
|
}
|
|
|
|
.fsize {
|
|
float: right;
|
|
text-align: right;
|
|
width: 180px;
|
|
}
|
|
</style>
|
|
<!-- ###END###{DesktopInbandFiles} -->
|
|
<!-- ###BEGIN###{SessionRecording} -->
|
|
<style>
|
|
.cameraIcon {
|
|
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHdSURBVDhPxZLPTxpREMe/+yKgxF13xbJKBHvBBBuLRkvkCqTBXrhAbz0CiR41oX9AL7019doDSf+OEuFI1CgkShN6IhHwQBrCFlsCr++tTxB/nP0kk/fmOzO7k3mDZ0cS5xgLLleme939MBgMTJ+wNELI91ar9dkU7iBFt6NKpVL51O/3ZyORyJfm1dV0Lpf7wYqJyDEhkkTD4fBbp9P5m/uUWafT+SVpmvbT6P5ZNkVKIUmPNjVElmUoioJ6vQ673X5JLFbrstvths/nGyv2eDxIJZNIp9J4ubQkVODg6wGq1SpCoRB6vZ6LUFbj9XoRCAREChCLxZDP57G6+hqvVlZweJhHIp4wY5mPGQSDQRQKBd4y4JzXafTdNk2mU9Q6aaOOF3O00WzSzcAb0+e2tr5O640G1Rfmhxo3WZEp4cO4y+bGBsrlMkqlklCA84tznJ6djnV5C7k/MsMwMKtpN2MWqKoKdUblUxfKiAlxDjk+OcGExYKd3R2Uz0rw+/1wOBxQZhQUi0WRNeLBB9g+IPE+gWw2i/29fVC2TPzJ4vE4n7rIGiHpuk6v//2Fhf213W4LmQXYk7oXF/kFtVrN3JH72Gw28EX61jGMrcfW57bkqdjU1OTRjfd8AP8BU66nHfOXwycAAAAASUVORK5CYII=);
|
|
height: 16px;
|
|
width: 16px;
|
|
cursor: pointer;
|
|
border: none;
|
|
margin-top:2px;
|
|
margin-right:4px;
|
|
cursor:pointer;
|
|
float:right;
|
|
}
|
|
|
|
.videoIcon {
|
|
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADaSURBVDhPxdKrEgFRAMbxRWMUJBIZRSRIqiBIXkHwBqLmAcx4Bt2MzowsoAiCQHdZ/2/tcZsda1bwzfz27J5z9uy5rPVrIm6pFNFFATOcoTTRgfouVOGVGHawXT0oNZi6C8p4SdgtM0jdbp1oNs+lEoJm5xk1jqEvndCAkoWZ2RZpvEQvKmqIo4INVjBJoIQpDlD7Eff0Ydb5jSXMcnO6aDSvjp+0UMcenh38zKFTsbUHqggcc4yB87cBBtBxOlnjfZP8VJHESJuYRxtR+EU7P8HQeXr8iEFjWVe3r1ZV/X1h0wAAAABJRU5ErkJggg==);
|
|
height: 16px;
|
|
width: 16px;
|
|
cursor: pointer;
|
|
border: none;
|
|
margin-top:2px;
|
|
margin-right:4px;
|
|
cursor:pointer;
|
|
float:right;
|
|
}
|
|
|
|
.videoIconRed {
|
|
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAEPSURBVDhPxZOxTsJQFIZvDZPGhTjhQpzBYFwccOUV2HgABxl9BwfCA5jAwkhMCIsDYXJx8QGIsYSFgcG4EQL4/ff0ApsUB//ky3/uac/f9rZ1f1WUuFvn85fYHYyhEcXxPOlXsQr06T2rtysfwEknWAxnWqNHTn6gr8EXa7k13NJ/taXpKPFzCMOS7mbXJV2saOVWIWAEAyvdEp6sdF2YWemm0LNyq/AIOewUyjCBDwjKwjW8wRdMeIwF7hUx3MTrttxLCr8hZMbshQKUlvGH9lcNvqGtAO1uWr1DCaKwiWl1BX7/Dg3Y6N8C9J3odfuATxUp1QHtQ09voUBxD8fwm1Yw5BtoacHs5mc8UM79ANr0QFg91nqAAAAAAElFTkSuQmCC);
|
|
height: 16px;
|
|
width: 16px;
|
|
cursor: pointer;
|
|
border: none;
|
|
margin-top:2px;
|
|
margin-right:4px;
|
|
cursor:pointer;
|
|
float:right;
|
|
}
|
|
</style>
|
|
<!-- ###END###{SessionRecording} -->
|
|
<!-- ###BEGIN###{Look-Commander} -->
|
|
<!-- ###BEGIN###{!ComputerSelector-Local-ScriptOnly} -->
|
|
<!-- ###BEGIN###{!Mode-LMS} -->
|
|
<title>MeshCommander</title>
|
|
<!-- ###END###{!Mode-LMS} -->
|
|
<!-- ###BEGIN###{Mode-LMS} -->
|
|
<title>LMS MeshCommander</title>
|
|
<!-- ###END###{Mode-LMS} -->
|
|
<!-- ###END###{!ComputerSelector-Local-ScriptOnly} -->
|
|
<!-- ###BEGIN###{ComputerSelector-Local-ScriptOnly} -->
|
|
<title>ScriptCommander</title>
|
|
<!-- ###END###{ComputerSelector-Local-ScriptOnly} -->
|
|
<!-- ###END###{Look-Commander} -->
|
|
<!-- ###BEGIN###{Look-Branded} -->
|
|
<title>Intel® Active Management Technology</title>
|
|
<!-- ###END###{Look-Branded} -->
|
|
<!-- ###BEGIN###{Look-ISDU} -->
|
|
<title>Intel® System Defense Utility</title>
|
|
<!-- ###END###{Look-ISDU} -->
|
|
<!-- ###BEGIN###{Look-BrandedCommander} -->
|
|
<title>Intel® Manageability Commander</title>
|
|
<!-- ###END###{Look-BrandedCommander} -->
|
|
<!-- ###BEGIN###{Look-Unite} -->
|
|
<title>Intel® Unite - Hardware Management</title>
|
|
<!-- ###END###{Look-Unite} -->
|
|
</head>
|
|
<!-- ###BEGIN###{!ContextMenus} -->
|
|
<body onunload="cleanup()" oncontextmenu="handleContextMenu(event)">
|
|
<!-- ###END###{!ContextMenus} -->
|
|
<!-- ###BEGIN###{ContextMenus} -->
|
|
|
|
<!-- ###END###{ContextMenus} -->
|
|
<div id="id_topheader" class="header">
|
|
<!-- ###BEGIN###{!Look-MeshCentral} -->
|
|
<!-- ###BEGIN###{Look-Unite} -->
|
|
<table style="width:100%;height:55px">
|
|
<tbody><tr>
|
|
<td valign="top" nowrap="nowrap">
|
|
<p class="top1">Intel<sup style="font-size:10px">®</sup> Active Management Technology</p>
|
|
<p class="top2" id="id_computername"></p>
|
|
</td>
|
|
<td valign="top">
|
|
<img width="165" height="42" align="right" style="border:0;margin-top:10px;margin-right:12px" src="images-unite/title.png">
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<!-- ###END###{Look-Unite} -->
|
|
<!-- ###BEGIN###{Look-ISDU} -->
|
|
<div>
|
|
<div style="background-image:url(images-isdu/LogoWhite42.png);width:63px;height:42px;float:right;margin-top:14px;margin-right:20px;padding:0"></div>
|
|
<div style="width:425px;height:69px"><div style="background-image:url(images-isdu/ISDUTitle.png);position:relative;top:26px;left:20px;width:282px;height:20px"></div></div>
|
|
<p id="id_computername" style="display:none"></p>
|
|
</div>
|
|
<!-- ###END###{Look-ISDU} -->
|
|
<!-- ###BEGIN###{Look-BrandedCommander} -->
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<div>
|
|
<div style="background-image:url(images-brandedcommander/LogoWhite42.png);width:63px;height:42px;float:right;margin-top:14px;margin-right:20px;padding:0"></div>
|
|
<div style="width:425px;height:69px"><div style="background-image:url(images-brandedcommander/CommanderTitle.png);position:relative;top:21px;left:20px;width:443px;height:33px"></div></div>
|
|
<p id="id_computername" style="display:none"></p>
|
|
</div>
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<table style="width:100%;height:55px">
|
|
<tbody><tr>
|
|
<td valign="top" nowrap="nowrap">
|
|
<p class="top1">Intel<sup style="font-size:10px">®</sup> Manageability Commander</p>
|
|
<p class="top2" id="id_computername"></p>
|
|
</td>
|
|
<td valign="top">
|
|
<img width="73" height="53" align="right" style="border:0" src="images-branded/logo.gif">
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
<!-- ###END###{Look-BrandedCommander} -->
|
|
<!-- ###BEGIN###{!Look-ISDU} -->
|
|
<!-- ###BEGIN###{!Look-BrandedCommander} -->
|
|
<table class="topCell" style="width:100%;height:55px">
|
|
<tbody><tr>
|
|
<td valign="top" nowrap="nowrap">
|
|
<!-- ###BEGIN###{Look-Commander} -->
|
|
<!-- ###BEGIN###{Switchbox} -->
|
|
<p class="top1">Manageability Switchbox</p>
|
|
<!-- ###END###{Switchbox} -->
|
|
<!-- ###BEGIN###{!Switchbox} -->
|
|
<!-- ###BEGIN###{!ComputerSelector-Local-ScriptOnly} -->
|
|
|
|
<!-- ###BEGIN###{!Mode-LMS} -->
|
|
<p class="top1">MeshCommander</p>
|
|
<!-- ###END###{!Mode-LMS} -->
|
|
<!-- ###BEGIN###{Mode-LMS} -->
|
|
<p class="top1">LMS MeshCommander</p>
|
|
<!-- ###END###{Mode-LMS} -->
|
|
<!-- ###END###{!ComputerSelector-Local-ScriptOnly} -->
|
|
<!-- ###BEGIN###{ComputerSelector-Local-ScriptOnly} -->
|
|
<p class="top1">ScriptCommander</p>
|
|
<!-- ###END###{ComputerSelector-Local-ScriptOnly} -->
|
|
<!-- ###END###{!Switchbox} -->
|
|
<!-- ###END###{Look-Commander} -->
|
|
<!-- ###BEGIN###{Look-Intel-AMT} -->
|
|
<p class="top1">Intel<sup style="font-size:10px">®</sup> Active Management Technology</p>
|
|
<!-- ###END###{Look-Intel-AMT} -->
|
|
<!-- ###BEGIN###{Look-Intel-SM} -->
|
|
<p class="top1">Intel<sup style="font-size:10px">®</sup> Standard Manageability</p>
|
|
<!-- ###END###{Look-Intel-SM} -->
|
|
<!-- ###BEGIN###{Look-Intel-SBT} -->
|
|
<p class="top1">Intel<sup style="font-size:10px">®</sup> Small Buisness Technology</p>
|
|
<!-- ###END###{Look-Intel-SBT} -->
|
|
<p class="top2" id="id_computername"></p>
|
|
</td>
|
|
<td valign="top">
|
|
<!-- ###BEGIN###{!Mode-LMS} -->
|
|
<!-- ###BEGIN###{!Mode-Firmware} -->
|
|
<!-- ###BEGIN###{Look-Commander} -->
|
|
<img width="166" height="64" align="right" style="border:0" src="images-commander/logo.png">
|
|
<!-- ###END###{Look-Commander} -->
|
|
<!-- ###END###{!Mode-Firmware} -->
|
|
<!-- ###END###{!Mode-LMS} -->
|
|
<!-- ###BEGIN###{Look-Branded} -->
|
|
<img width="73" height="53" align="right" style="border:0" src="images-branded/logo.gif">
|
|
<!-- ###END###{Look-Branded} -->
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<!-- ###END###{!Look-BrandedCommander} -->
|
|
<!-- ###END###{!Look-ISDU} -->
|
|
<!-- ###END###{!Look-MeshCentral} -->
|
|
<!-- ###BEGIN###{Mode-MeshCentral2} -->
|
|
<table id="id_KVMTable" cellpadding="0" cellspacing="0" style="width: 100%; padding: 0px; padding: 0px; margin-top: 0px">
|
|
<tbody><tr>
|
|
<td id="id_normalScreenToolbar" class="style6">
|
|
<div>
|
|
<input type="button" class="connectbutton" id="xconnectbutton1" value="Conectar" onclick="connectButtonfunction(event, false)" onkeypress="return false" onkeydown="return false">
|
|
<span id="constatus"></span>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<!-- ###END###{Mode-MeshCentral2} -->
|
|
<div class="progressbar">
|
|
<!-- ###BEGIN###{Look-MeshCentral} -->
|
|
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
|
|
<!-- ###END###{Look-MeshCentral} -->
|
|
<!-- ###BEGIN###{Look-Commander} -->
|
|
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
|
|
<!-- ###END###{Look-Commander} -->
|
|
<!-- ###BEGIN###{Look-Branded} -->
|
|
<div id="id_progressbar" style="height:2px;width:0%;background-color:orange"></div>
|
|
<!-- ###END###{Look-Branded} -->
|
|
<!-- ###BEGIN###{Look-ISDU} -->
|
|
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
|
|
<!-- ###END###{Look-ISDU} -->
|
|
<!-- ###BEGIN###{Look-BrandedCommander} -->
|
|
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
|
|
<!-- ###END###{Look-BrandedCommander} -->
|
|
<!-- ###BEGIN###{Look-Unite} -->
|
|
<div id="id_progressbar" style="height:2px;width:0%;background-color:red"></div>
|
|
<!-- ###END###{Look-Unite} -->
|
|
</div>
|
|
</div>
|
|
<div id="id_messageview" class="fullcell" style="text-align:center;padding-top:100px;font-size:20px">
|
|
<!-- ###BEGIN###{Look-MeshCentral} -->
|
|
<span id="id_messageviewstr">Desconectado</span>
|
|
<!-- ###END###{Look-MeshCentral} -->
|
|
<!-- ###BEGIN###{!Look-MeshCentral} -->
|
|
<span id="id_messageviewstr">Cargando...</span>
|
|
<!-- ###END###{!Look-MeshCentral} -->
|
|
<!-- ###BEGIN###{ComputerSelector} -->
|
|
<br><br><input id="id_messageviewbutton" type="button" value="Cerca" onclick="disconnect()">
|
|
<!-- ###END###{ComputerSelector} -->
|
|
<!-- ###BEGIN###{Mode-LMS} -->
|
|
<br><br><input type="button" value="Cerca" onclick="disconnect()">
|
|
<!-- ###END###{Mode-LMS} -->
|
|
</div>
|
|
<!-- ###BEGIN###{Mode-LMS} -->
|
|
<div id="id_lmsMainPanel" class="fullcell" style="display:none">
|
|
<div style="background-color:lightgray;height:24px;margin-bottom:6px;padding-top:2px">
|
|
<div id="id_lmsToolBarContent" style="display:none">
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<div style="float:left;height:26px;width:26px;cursor:pointer" onclick="toolmenuclick(0)">
|
|
<span style="font-size:16px"> ☰</span>
|
|
</div>
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
<div>
|
|
<input type="button" value="Actualizar" onclick="lmsRefresh()">
|
|
<input id="id_lmsActivateButton" type="button" value="Activate..." style="display:none" onclick="lmsActivate()">
|
|
<input id="id_lmsDeactivateButton" type="button" value="Deactivate..." style="display:none" onclick="lmsDeactivate()">
|
|
<input id="id_lmsLoginButton" type="button" value="Login..." style="display:none" onclick="lmsLogin()">
|
|
<input id="id_lmsConfigureButton" type="button" value="Intel® AMT Login..." style="display:none" onclick="lmsConfigure()">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="id_lmsData" style="margin:10px"></div>
|
|
<div id="id_lmsData2" style="margin:10px"></div>
|
|
</div>
|
|
<!-- ###END###{Mode-LMS} -->
|
|
<!-- ###BEGIN###{PowerControl-OneClick} -->
|
|
<div id="TransferNotification" style="display:none;background-color:lightgrey;position:absolute;left:10px;bottom:10px;border-radius:5px;padding:4px;z-index:1000;box-shadow:0px 0px 10px #333"></div>
|
|
<!-- ###END###{PowerControl-OneClick} -->
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<div id="LeftSideToolBar" style="position:absolute;left:0px;bottom:0px;width:52px;top:69px;background:#113962;background:linear-gradient(to bottom, #104893 0%,#113962 100%);color:white;display:none">
|
|
<div style="height:23px"></div>
|
|
<div id="LeftMenuMyDevices" class="lbbutton lbbuttonsel2" title="Gestión informática" onclick="go(101)">
|
|
<div class="lb1" style="position:absolute;top:6px;left:6px"></div>
|
|
</div>
|
|
<div id="LeftMenuMyCerts" class="lbbutton" title="Gerente de certificados" onclick="go(103)">
|
|
<div class="lb2" style="position:absolute;top:6px;left:6px"></div>
|
|
</div>
|
|
<div id="LeftMenuMyUsb" class="lbbutton" title="Setup.bin Manager" onclick="go(102)">
|
|
<div class="lb3" style="position:absolute;top:6px;left:6px"></div>
|
|
</div>
|
|
<!-- ###BEGIN###{SessionRecording} -->
|
|
<div id="LeftMenuPlayer" class="lbbutton" title="Jugador de sesión" onclick="go(104)">
|
|
<div class="lb4" style="position:absolute;top:6px;left:6px"></div>
|
|
</div>
|
|
<!-- ###END###{SessionRecording} -->
|
|
</div>
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{ComputerSelector} -->
|
|
<div id="id_computerSelector" class="fullcell" style="display:none">
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<div id="UpdateNotification" style="display:none;background-color:lightgrey;position:absolute;left:10px;bottom:10px;border-radius:5px;padding:10px;z-index:1000;box-shadow: 0px 0px 20px #888888">
|
|
<a style="cursor:pointer;color:blue" onclick="NW_PerformUpdate()"><u id="UpdateNotificationText"></u></a> <span onclick="NW_HideUpdateNotification()" style="cursor:pointer;font-size:15px">✖</span>
|
|
</div>
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{ComputerSelectorToolbar} -->
|
|
<table style="background-color:#808080;width:100%">
|
|
<tbody><tr>
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<td id="toolmenuicondiv" style="width:26px;cursor:pointer" onclick="toolmenuclick(0)">
|
|
<span style="font-size:16px"> ☰</span>
|
|
</td>
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{MeshServerConnect} -->
|
|
<td id="idx_disconnectMeshCentralButton" style="display:none">
|
|
<input type="button" value="Desconectar" onclick="meshCentralDisconnect()">
|
|
</td>
|
|
<!-- ###END###{MeshServerConnect} -->
|
|
<td>
|
|
<span id="id_noScriptButtons">
|
|
<!-- ###BEGIN###{ComputerSelector-Remote} -->
|
|
<input type="button" value="Actualizar" onclick="loadServerComputerList()">
|
|
<!-- ###END###{ComputerSelector-Remote} -->
|
|
<!-- ###BEGIN###{ComputerSelector-Local} -->
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<input type="button" value="Nuevo..." onclick="newComputerList()">
|
|
<input type="button" value="Abierto..." onclick="openComputerList()">
|
|
<!-- ###BEGIN###{FileSaver} -->
|
|
<input id="saveComputersButton" type="button" value="Salvar..." onclick="saveComputerList()">
|
|
<!-- ###END###{FileSaver} -->
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
<input type="button" value="Agregar computadora ..." onclick="addComputer()">
|
|
<!-- ###END###{ComputerSelector-Local} -->
|
|
<!-- ###BEGIN###{ComputerSelectorScanner} -->
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<input type="button" value="Escanear..." onclick="showScanDialog()">
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
<!-- ###END###{ComputerSelectorScanner} -->
|
|
</span>
|
|
<!-- ###BEGIN###{Scripting} -->
|
|
<!-- ###BEGIN###{!Look-BrandedCommander} -->
|
|
<input id="idx_runScriptOnComputersButton" type="button" value="Ejecutar guión..." onclick="mscript_runScriptDlg()">
|
|
<!-- ###END###{!Look-BrandedCommander} -->
|
|
<!-- ###BEGIN###{Look-BrandedCommander} -->
|
|
<input id="idx_runScriptOnComputersButton" type="button" value="Ejecutar guión..." onclick="mscript_runScriptDlg()" style="display:none">
|
|
<!-- ###END###{Look-BrandedCommander} -->
|
|
<!-- ###END###{Scripting} -->
|
|
</td>
|
|
<td style="text-align:right">
|
|
<!-- ###BEGIN###{!Look-BrandedCommander} -->
|
|
<input id="computerFilter" placeholder="Filtrar" onkeyup="computerFilterFunc()" autocomplete="off" onfocus="onFilterFocus(true)" onblur="onFilterFocus(false)">
|
|
<!-- ###END###{!Look-BrandedCommander} -->
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<!-- ###BEGIN###{ComputerSelector-Local} -->
|
|
<div id="id_computerListParent" style="position:fixed;top:96px;left:0;right:300px;bottom:0;overflow-y:scroll" cm="Add Computer...#addComputer()">
|
|
<!-- ###END###{ComputerSelector-Local} -->
|
|
<!-- ###BEGIN###{!ComputerSelector-Local} -->
|
|
<div id="id_computerListParent" style="position:fixed;top:96px;left:0;right:300px;bottom:0;overflow-y:scroll">
|
|
<!-- ###END###{!ComputerSelector-Local} -->
|
|
<div id="id_noKnownComputers" style="text-align:center;margin-top:36px;color:gray">
|
|
<span style="font-size:20px">No hay computadoras conocidas</span>
|
|
<!-- ###BEGIN###{ComputerSelector-Local} -->
|
|
<div style="margin:4px">Comience por <a onclick="addComputer()" style="cursor:pointer"><u>agregando</u></a> computadoras o arrastrar y soltar<br>un archivo de lista de computadora en esta ventana.</div>
|
|
<!-- ###END###{ComputerSelector-Local} -->
|
|
</div>
|
|
<div id="id_computerList" style="font-size:20px"></div>
|
|
</div>
|
|
<div id="id_computerDetailsParent" style="position:fixed;top:96px;width:300px;right:0;bottom:0">
|
|
<div id="id_computerDetails" style="font-size:16px;margin:4px"></div>
|
|
</div>
|
|
<!-- ###END###{ComputerSelectorToolbar} -->
|
|
<!-- ###BEGIN###{!ComputerSelectorToolbar} -->
|
|
<div id="id_computerListParent" style="position:fixed;top:69px;left:0;right:300px;bottom:0;overflow-y:scroll" cm="Add Computer...#addComputer()">
|
|
<div id="id_noKnownComputers" style="text-align:center;margin-top:36px;color:gray">
|
|
<span style="font-size:20px">No hay computadoras conocidas</span>
|
|
<!-- ###BEGIN###{ComputerSelector-Local} -->
|
|
<div style="margin:4px">Comience por <a onclick="addComputer()" style="cursor:pointer"><u>agregando</u></a> computadoras o arrastrar y soltar<br>un archivo de lista de computadora en esta ventana.</div>
|
|
<!-- ###END###{ComputerSelector-Local} -->
|
|
</div>
|
|
<div id="id_computerList" style="font-size:20px"></div>
|
|
</div>
|
|
<div id="id_computerDetailsParent" style="position:fixed;top:69px;width:300px;right:0;bottom:0;background-color:white">
|
|
<div id="id_computerDetails" style="font-size:16px;margin:8px"></div>
|
|
</div>
|
|
<!-- ###END###{!ComputerSelectorToolbar} -->
|
|
</div>
|
|
<div id="id_computerSelectorMenu" style="background-color:#EEEEEE;display:none;position:absolute;left:0;top:94px;width:200px;padding:3px;z-index:1000;box-shadow:5px 5px 5px #888888;border:1px solid gray">
|
|
<div class="menuitem" onclick="toolmenuclick(101)"><span id="id_menuitem1">• </span>Gestión informática</div>
|
|
<!-- ###BEGIN###{CertificateManager} -->
|
|
<div class="menuitem" onclick="toolmenuclick(103)"><span id="id_menuitem3" style="display:none">• </span>Gerente de certificados</div>
|
|
<!-- ###END###{CertificateManager} -->
|
|
<!-- ###BEGIN###{USBSetup} -->
|
|
<div class="menuitem" onclick="toolmenuclick(102)"><span id="id_menuitem2" style="display:none">• </span>USB Setup.bin Editor</div>
|
|
<!-- ###END###{USBSetup} -->
|
|
<!-- ###BEGIN###{SessionRecording} -->
|
|
<div class="menuitem" onclick="toolmenuclick(104)"><span id="id_menuitem4" style="display:none">• </span>Jugador de sesión</div>
|
|
<!-- ###END###{SessionRecording} -->
|
|
</div>
|
|
<!-- ###END###{ComputerSelector} -->
|
|
<!-- ###BEGIN###{Mode-LMS} -->
|
|
<div id="id_computerSelectorMenu" style="background-color:#EEEEEE;display:none;position:absolute;left:0;top:94px;width:200px;padding:3px;z-index:1000;box-shadow:5px 5px 5px #888888;border:1px solid gray">
|
|
<div class="menuitem" onclick="toolmenuclick(101)"><span id="id_menuitem1">• </span>Computer Configuration</div>
|
|
<!-- ###BEGIN###{USBSetup} -->
|
|
<div class="menuitem" onclick="toolmenuclick(102)"><span id="id_menuitem2" style="display:none">• </span>USB Setup.bin Editor</div>
|
|
<!-- ###END###{USBSetup} -->
|
|
</div>
|
|
<!-- ###END###{Mode-LMS} -->
|
|
<!-- ###BEGIN###{USBSetup} -->
|
|
<div id="id_usbSetupPanel" class="fullcell" style="display:none">
|
|
<!-- ###BEGIN###{ComputerSelectorToolbar} -->
|
|
<table style="background-color:#808080;width:100%">
|
|
<tbody><tr>
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<td style="width:26px;cursor:pointer" onclick="toolmenuclick(0)">
|
|
<span style="font-size:16px"> ☰</span>
|
|
</td>
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
<td>
|
|
<input type="button" value="Nuevo..." onclick="usb_newSetupBin()">
|
|
<input type="button" value="Abierto..." onclick="usb_openSetupBin()">
|
|
<!-- ###BEGIN###{FileSaver} -->
|
|
<input id="id_saveSetupBin" type="button" value="Salvar..." onclick="usb_saveSetupBin()">
|
|
<!-- ###END###{FileSaver} -->
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<div id="id_usbSetupPanel2" style="position:fixed;overflow-y:scroll;left:0;right:0;bottom:0;top:96px">
|
|
<div id="id_StartupScreen" style="width:100%;text-align:center;color:gray;margin-top:36px">
|
|
<span style="font-size:20px">Intel<sup style="font-size:10px">®</sup> AMT USB Setup.bin Manager</span>
|
|
<div style="margin:4px">Comience por <a onclick="usb_newSetupBin()" style="cursor:pointer"><u>creando</u></a> un nuevo archivo <a onclick="usb_openSetupBin()" style="cursor:pointer"><u>apertura</u></a> uno existente<br>o arrastre y suelte un archivo setup.bin en esta ventana.</div>
|
|
</div>
|
|
<div id="id_SetupBinArea" style="margin:10px"></div>
|
|
</div>
|
|
<!-- ###END###{ComputerSelectorToolbar} -->
|
|
<!-- ###BEGIN###{!ComputerSelectorToolbar} -->
|
|
<div style="position:fixed;overflow-y:scroll;left:0;right:0;bottom:0;top:69px">
|
|
<div id="id_StartupScreen" style="width:100%;text-align:center;color:gray;margin-top:36px">
|
|
<span style="font-size:20px">Intel<sup style="font-size:10px">®</sup> AMT USB Setup.bin Manager</span>
|
|
<div style="margin:4px">Comience por <a onclick="usb_newSetupBin()" style="cursor:pointer"><u>creando</u></a> un nuevo archivo <a onclick="usb_openSetupBin()" style="cursor:pointer"><u>apertura</u></a> uno existente<br>o arrastre y suelte un archivo setup.bin en esta ventana.</div>
|
|
</div>
|
|
<div id="id_SetupBinArea" style="margin:10px"></div>
|
|
</div>
|
|
<!-- ###END###{!ComputerSelectorToolbar} -->
|
|
</div>
|
|
<!-- ###END###{USBSetup} -->
|
|
<!-- ###BEGIN###{CertificateManager} -->
|
|
<div id="id_certManagerPanel" class="fullcell" style="display:none">
|
|
<!-- ###BEGIN###{ComputerSelectorToolbar} -->
|
|
<table style="background-color:#808080;width:100%">
|
|
<tbody><tr>
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<td style="width:26px;cursor:pointer" onclick="toolmenuclick(0)">
|
|
<span style="font-size:16px"> ☰</span>
|
|
</td>
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
<td>
|
|
<input type="button" value="Crear certificado raíz ..." onclick="cert_createNew()">
|
|
<input id="IssueCertButton" type="button" value="Emitir certificado ..." onclick="cert_issueNew()">
|
|
<input type="button" value="Certificado de importación ..." onclick="cert_importCert()">
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<div id="id_certManagerPanel2" style="position:fixed;overflow-y:scroll;left:0;right:0;bottom:0;top:96px">
|
|
<div id="id_certStartScreen" style="width:100%;text-align:center;color:gray;margin-top:36px">
|
|
<span style="font-size:20px">Gerente de certificados</span>
|
|
<div style="margin:4px">Los certificados desempeñan un papel importante en todo tipo de tareas de seguridad de Intel® AMT: autenticación de red TLS,<br>Configuración CIRA, firma de registro de auditoría y más. Use este panel para crear y administrar su certificado de consola.</div>
|
|
</div>
|
|
<div id="id_certManagerMainArea" style="font-size:20px"></div>
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<input id="certOpenFile" type="file" style="display:none" accept=".cer;*.pfx;*.p12;*.pem;*.crt">
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
</div>
|
|
<!-- ###END###{ComputerSelectorToolbar} -->
|
|
<!-- ###BEGIN###{!ComputerSelectorToolbar} -->
|
|
<div style="position:fixed;overflow-y:scroll;left:0;right:0;bottom:0;top:95px">
|
|
<div id="id_certStartScreen" style="width:100%;text-align:center;color:gray;margin-top:36px">
|
|
<span style="font-size:20px">Gerente de certificados</span>
|
|
<div style="margin:4px">Los certificados desempeñan un papel importante en todo tipo de tareas de seguridad de Intel® AMT: autenticación de red TLS,<br>Configuración CIRA, firma de registro de auditoría y más. Use este panel para crear y administrar su certificado de consola.</div>
|
|
</div>
|
|
<div id="id_certManagerMainArea" style="margin:10px"></div>
|
|
</div>
|
|
<!-- ###END###{!ComputerSelectorToolbar} -->
|
|
</div>
|
|
<!-- ###END###{CertificateManager} -->
|
|
<!-- ###BEGIN###{SessionRecording} -->
|
|
<div id="id_sessionPlayerPanel" class="fullcell" style="display:none">
|
|
<table style="background-color:#808080;width:100%">
|
|
<tbody><tr>
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<td style="width:26px;cursor:pointer" onclick="toolmenuclick(0)">
|
|
<span style="font-size:16px"> ☰</span>
|
|
</td>
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
<td>
|
|
<div style="float:right">
|
|
<input id="srec_toggleviewmode" type="button" value="Alternar modo de vista" style="display:none" onclick="srec_toggleAspectRatio(1)">
|
|
</div>
|
|
<input type="button" id="srec_OpenFileButton" value="Abrir documento..." onclick="srec_openfile()">
|
|
<span id="srec_deskstatus" style="margin-left:4px"></span>
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<div style="overflow:hidden">
|
|
<div id="srec_deskarea0">
|
|
<div id="srec_deskarea2" style="height:2px">
|
|
<div style="background-color:gray"><div id="srec_progressbar" style="height:2px;width:0%;background-color:red"></div></div>
|
|
</div>
|
|
<div id="srec_deskarea3x" style="position:relative;max-height:calc(100vh - 123px);height:calc(100vh - 123px)" onclick="srec_togglePause()">
|
|
<div id="srec_metadatadiv" style="padding:20px;color:lightgrey;text-align:left;display:none"></div>
|
|
<div id="srec_DeskParent" style="width:100%;height:100%;background-color:black;display:none">
|
|
<canvas id="srec_Desk" width="640" height="480"></canvas>
|
|
</div>
|
|
<div id="srec_TermParent" style="position:absolute;top:0;height:100%;width:100%;background-color:black;display:none">
|
|
<div><pre id="srec_Term"></pre></div>
|
|
</div>
|
|
<!--<div id=srec_p11DeskConsoleMsg style="display:none;cursor:pointer;position:absolute;left:30px;top:17px;color:yellow;background-color:rgba(0,0,0,0.6);padding:10px;border-radius:5px" onclick=clearConsoleMsg()></div>-->
|
|
</div>
|
|
<div id="srec_deskarea4" style="padding-top:2px;padding-bottom:2px;background:#C0C0C0">
|
|
<div style="float:right;text-align:right;padding-right:4px">
|
|
<div id="srec_timespan" style="padding-top:4px;padding-right:4px">00:00:00</div>
|
|
</div>
|
|
<div>
|
|
|
|
<input id="srec_PlayButton" type="button" value="Jugar" disabled="disabled" onclick="srec_play()">
|
|
<input id="srec_PauseButton" type="button" value="Pausa" disabled="disabled" onclick="srec_pause()">
|
|
<input id="srec_RestartButton" type="button" value="Reiniciar" disabled="disabled" onclick="srec_restart()">
|
|
<select id="srec_PlaySpeed" onchange="this.blur();">
|
|
<option value="4">1/4 de velocidad</option>
|
|
<option value="2">1/2 velocidad</option>
|
|
<option value="1" selected="">Velocidad normal</option>
|
|
<option value="0.5">2x velocidad</option>
|
|
<option value="0.25">4x velocidad</option>
|
|
<option value="0.1">10x velocidad</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- ###END###{SessionRecording} -->
|
|
<div id="id_mainview" style="height:100%;display:none">
|
|
<div id="id_leftbar" class="navbar">
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<div id="tlsNotification1" style="text-align:center;padding-top:8px;color:darkblue;cursor:pointer;display:none" onclick="showTlsCert(1)"><img src="images/lock.gif"> TLS asegurado</div>
|
|
<div id="tlsNotification2" style="text-align:center;padding-top:8px;color:darkblue;cursor:pointer;display:none" onclick="showTlsCert(1)"><img src="images/lock.gif"> TLS asegurado (fijado)</div>
|
|
<div id="tlsNotification3" style="text-align:center;padding-top:8px;color:darkblue;cursor:pointer;display:none" onclick="showTlsCert(1)"><img src="images/lock.gif"> TLS (no confiable)</div>
|
|
<div id="tlsNotification4" style="text-align:center;padding-top:8px;color:darkblue;cursor:pointer;display:none;color:red" onclick="switchToTls()"><img src="images/unlock.gif"> Cambiar a TLS</div>
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{ComputerSelector} -->
|
|
<div style="padding:8px">
|
|
<input type="button" id="disconnectButton" value="Desconectar" onkeypress="return false" onkeydown="return false" onclick="disconnect()" style="width:138px">
|
|
</div>
|
|
<!-- ###END###{ComputerSelector} -->
|
|
<!-- ###BEGIN###{Mode-LMS} -->
|
|
<div style="padding:8px">
|
|
<input type="button" id="disconnectButton" value="Desconectar" onkeypress="return false" onkeydown="return false" onclick="disconnect()" style="width:138px">
|
|
</div>
|
|
<!-- ###END###{Mode-LMS} -->
|
|
<!-- ###BEGIN###{Mode-Firmware} -->
|
|
<br>
|
|
<!-- ###END###{Mode-Firmware} -->
|
|
<!-- ###BEGIN###{Mode-MeshCentral2} -->
|
|
<br>
|
|
<!-- ###END###{Mode-MeshCentral2} -->
|
|
<p id="go1" class="nav1" onclick="go(1)"><a>Estado del sistema</a></p>
|
|
<!-- ###BEGIN###{Desktop} -->
|
|
<p id="go14" class="nav1" onclick="go(14)"><a>Escritorio remoto</a></p>
|
|
<!-- ###BEGIN###{DesktopInbandFiles} -->
|
|
<p id="go24" class="nav1" onclick="go(24)"> <a>Archivos</a></p>
|
|
<!-- ###END###{DesktopInbandFiles} -->
|
|
<!-- ###END###{Desktop} -->
|
|
<!-- ###BEGIN###{Terminal} -->
|
|
<p id="go13" class="nav1" onclick="go(13)"><a>Serie sobre LAN</a></p>
|
|
<!-- ###END###{Terminal} -->
|
|
<!-- ###BEGIN###{HardwareInfo} -->
|
|
<p id="go2" class="nav1" onclick="go(2)"><a>Información de hardware</a></p>
|
|
<!-- ###END###{HardwareInfo} -->
|
|
<!-- ###BEGIN###{EventLog} -->
|
|
<p id="go6" class="nav1" onclick="go(6)"><a>Registro de eventos</a></p>
|
|
<!-- ###END###{EventLog} -->
|
|
<!-- ###BEGIN###{AuditLog} -->
|
|
<p id="go15" class="nav1" onclick="go(15)"><a>Registro de auditoría</a></p>
|
|
<!-- ###END###{AuditLog} -->
|
|
<!-- ###BEGIN###{Storage} -->
|
|
<p id="go21" class="nav1" onclick="go(21)"><a>Almacenamiento</a></p>
|
|
<!-- ###END###{Storage} -->
|
|
<!-- ###BEGIN###{NetworkSettings} -->
|
|
<p id="go8" class="nav1" onclick="go(8)"><a>Configuración de red</a></p>
|
|
<!-- ###END###{NetworkSettings} -->
|
|
<!-- ###BEGIN###{RemoteAccess} -->
|
|
<p id="go17" class="nav1" onclick="go(17)"><a>Configuraciones de internet</a></p>
|
|
<!-- ###END###{RemoteAccess} -->
|
|
<!-- ###BEGIN###{Certificates} -->
|
|
<p id="go16" class="nav1" onclick="go(16)"><a>Configuracion seguridad</a></p>
|
|
<!-- ###END###{Certificates} -->
|
|
<!-- ###BEGIN###{AgentPresence} -->
|
|
<p id="go19" class="nav1" onclick="go(19)"><a>Presencia de agente</a></p>
|
|
<!-- ###END###{AgentPresence} -->
|
|
<!-- ###BEGIN###{SystemDefense} -->
|
|
<p id="go18" class="nav1" onclick="go(18)"><a>Defensa del sistema</a></p>
|
|
<!-- ###END###{SystemDefense} -->
|
|
<p id="go11" class="nav1" onclick="go(11)"><a>Cuentas de usuario</a></p>
|
|
<!-- ###BEGIN###{EventSubscriptions} -->
|
|
<p id="go22" class="nav1" onclick="go(22)"><a>Suscripciones</a></p>
|
|
<!-- ###END###{EventSubscriptions} -->
|
|
<!-- ###BEGIN###{Alarms} -->
|
|
<p id="go23" class="nav1" onclick="go(23)"><a>Wake Alarms</a></p>
|
|
<!-- ###END###{Alarms} -->
|
|
<!-- ###BEGIN###{Scripting-Editor} -->
|
|
<p id="go20" class="nav1" onclick="go(20)"><a>Editor de guiones</a></p>
|
|
<!-- ###END###{Scripting-Editor} -->
|
|
<!-- ###BEGIN###{WsmanBrowser} -->
|
|
<p id="go12" class="nav1" onclick="go(12)"><a>Navegador WSMAN</a></p>
|
|
<!-- ###END###{WsmanBrowser} -->
|
|
<!-- ###BEGIN###{Storage} -->
|
|
<!-- ###BEGIN###{Mode-Firmware} -->
|
|
<!-- <div id=storagelinks style=margin-top:4px></div> -->
|
|
<!-- ###END###{Mode-Firmware} -->
|
|
<!-- ###END###{Storage} -->
|
|
<!-- ###BEGIN###{Look-ISDU} -->
|
|
<img id="id_isdu-image1" src="images-isdu/TabConfig.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image2" src="images-isdu/TabConnection.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image3" src="images-isdu/TabDesktop.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image4" src="images-isdu/TabDiscovery.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image5" src="images-isdu/TabEvents.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image6" src="images-isdu/TabNetwork.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image7" src="images-isdu/TabPolicies.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image8" src="images-isdu/TabRemote.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<!-- ###END###{Look-ISDU} -->
|
|
<!-- ###BEGIN###{Look-BrandedCommander} -->
|
|
<!-- ###BEGIN###{!Mode-Firmware} -->
|
|
<img id="id_isdu-image1" src="images-BrandedCommander/TabConfig.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image2" src="images-BrandedCommander/TabConnection.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image3" src="images-BrandedCommander/TabDesktop.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image4" src="images-BrandedCommander/TabDiscovery.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image5" src="images-BrandedCommander/TabEvents.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image6" src="images-BrandedCommander/TabNetwork.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image7" src="images-BrandedCommander/TabPolicies.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<img id="id_isdu-image8" src="images-BrandedCommander/TabRemote.png" style="position:fixed;bottom:16px;left:32px;display:none">
|
|
<!-- ###END###{!Mode-Firmware} -->
|
|
<!-- ###END###{Look-BrandedCommander} -->
|
|
</div>
|
|
<div id="id_mainarea" class="maincell">
|
|
<!-- ###BEGIN###{IDER} -->
|
|
<div id="id_iderstatus" style="position:relative;height:21px;background:#8fac8d;padding:5px;margin-bottom:1px;display:none;z-index:1000">
|
|
<div style="float:right">
|
|
<input id="IDERDiskMapButton" type="button" value="Mapa de disco" onclick="iderToggleDiskMap()">
|
|
<input type="button" value="Detener sesión IDE-R" onclick="iderStop()">
|
|
</div>
|
|
<div style="font-size:16px;padding-top:2px"> <span id="id_iderstatusstr"></span></div>
|
|
<div id="iderHeatmap" style="z-index:1000;position:absolute;top:31px;right:8px;border:1px solid black;box-shadow: 0px 0px 10px;border-radius:5px;padding:8px;width:600px;background-color:#99CC99;display:none">
|
|
<div id="floppyHeatMap" style="display:none">
|
|
<div id="floppyHeatMapText" style="margin:2px">Disquete, los bloques son 512 bytes.</div>
|
|
<canvas id="floppyHeatMapCanvas" width="600" height="0"></canvas>
|
|
</div>
|
|
<div id="cdromHeatMap" style="display:none">
|
|
<div id="cdromHeatMapText" style="margin:2px">CDROM, los bloques son 2048 bytes.</div>
|
|
<canvas id="cdromHeatMapCanvas" width="600" height="0"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- ###END###{IDER} -->
|
|
<!-- ###BEGIN###{Scripting} -->
|
|
<div id="id_scriptstatus" style="height:21px;background:#8fac8d;padding:5px;margin-bottom:1px;display:none;overflow:hidden">
|
|
<div style="float:right"><input type="button" value="Stop Script" onclick="script_Stop()"></div>
|
|
<div style="font-size:16px;padding-top:2px;overflow:hidden"> <b>Running Script</b><span style="overflow:hidden" id="id_scriptstatusstr"></span></div>
|
|
</div>
|
|
<!-- ###END###{Scripting} -->
|
|
<!-- ###BEGIN###{VersionWarning} -->
|
|
<div id="id_versionWarning" style="height:21px;background:#8fac8d;padding:5px;margin-bottom:1px;display:none">
|
|
<div style="font-size:16px;float:right;cursor:pointer;padding-right:5px;padding-left:5px;padding-top:2px;font-size:15px" onclick="QV('id_versionWarning', false)">✖</div>
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<div style="font-size:14px;padding-top:2px"> <b>El firmware de esta computadora debe actualizarse, <a style="cursor:pointer" onclick="require('nw.gui').Shell.openExternal('https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00075&languageid=en-fr')"><u>por favor verifique aquí</u></a>.</b></div>
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<div style="font-size:14px;padding-top:2px"> <b>El firmware de esta computadora debe actualizarse, <a style="cursor:pointer" href="https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00075&languageid=en-fr" rel="noreferrer noopener" target="_blank"><u>por favor verifique aquí</u></a>.</b></div>
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
</div>
|
|
<!-- ###END###{VersionWarning} -->
|
|
<!-- ###BEGIN###{Storage} -->
|
|
<div id="id_mainarea_frame" style="width:100%;height:100%">
|
|
<iframe id="id_StorageIFrame" style="width:100%;height:100%;border:0"></iframe>
|
|
</div>
|
|
<!-- ###END###{Storage} -->
|
|
<div id="id_mainarea_pad" style="padding:8px;overflow-x:hidden">
|
|
<div id="p0">
|
|
<h1>Cargando...</h1>
|
|
</div>
|
|
<div id="p1" style="display:none">
|
|
<h1>Estado del sistema</h1>
|
|
<span id="id_TableSysStatus"></span>
|
|
</div>
|
|
<!-- ###BEGIN###{HardwareInfo} -->
|
|
<div id="p2" style="display:none">
|
|
<h1 style="margin-bottom:16px">Información de hardware</h1>
|
|
<span id="id_TableSysInfo"></span>
|
|
</div>
|
|
<!-- ###END###{HardwareInfo} -->
|
|
<!-- ###BEGIN###{EventLog} -->
|
|
<div id="p6" style="display:none">
|
|
<h1>Registro de eventos</h1>
|
|
<span id="id_TableEventLog"></span>
|
|
<span id="id_TableEventLog2"></span>
|
|
</div>
|
|
<!-- ###END###{EventLog} -->
|
|
<!-- ###BEGIN###{NetworkSettings} -->
|
|
<div id="p8" style="display:none">
|
|
<h1>Configuración de red</h1>
|
|
<span id="id_TableNetworkSettingsSpan"></span>
|
|
<!-- ###BEGIN###{Wireless} -->
|
|
<span id="id_TableWifi2"></span>
|
|
<!-- ###END###{Wireless} -->
|
|
</div>
|
|
<!-- ###END###{NetworkSettings} -->
|
|
<div id="p11" style="display:none">
|
|
<h1>Cuentas de usuario</h1>
|
|
<span id="id_TableUserAccounts"></span>
|
|
</div>
|
|
<!-- ###BEGIN###{WsmanBrowser} -->
|
|
<div id="p12" style="display:none">
|
|
<h1>Navegador WSMAN</h1>
|
|
<div>
|
|
<table class="log1" cellpadding="0" cellspacing="0" style="width:100%;border-radius:8px">
|
|
<tbody><tr>
|
|
<td>
|
|
<div style="padding:4px">
|
|
<select id="id_QuerySelect" multiple="multiple" style="width:100%;height:120px"></select>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<input id="id_p12querybutton" type="button" value="Consulta" style="margin: 4px" onclick="wsmanQuery()">
|
|
<input type="button" value="Claro" style="margin: 4px" onclick="QH('id_wsresults', '')">
|
|
<input id="idx_browserFilter" placeholder="Filtrar" style="margin: 4px" onkeyup="wsmanFilter()">
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
</div>
|
|
<br>
|
|
<div class="us" id="id_wsresults"></div>
|
|
</div>
|
|
<!-- ###END###{WsmanBrowser} -->
|
|
<!-- ###BEGIN###{Terminal} -->
|
|
<div id="p13" style="display:none;min-width:780px">
|
|
<h1>Terminal de serie sobre LAN</h1>
|
|
<br>
|
|
<div id="id_p13warning1" style="max-width:100%;display:none;cursor:pointer;margin-bottom:5px" onclick="showFeaturesDlg()">
|
|
<div class="icon2" style="float:left;margin:7px"></div><div style="width:auto;border-radius:8px;padding:8px;background-color:lightsalmon">El puerto Intel® AMT Redirection o la función Serial-over-LAN está deshabilitada<span id="id_p13warninga">, haga clic aquí para habilitarlo.</span></div>
|
|
</div>
|
|
<!-- ###BEGIN###{PowerControl} -->
|
|
<div id="id_p13warning2" style="max-width:100%;display:none;cursor:pointer;margin-bottom:5px" onclick="showPowerActionDlg()">
|
|
<div class="icon2" style="float:left;margin:7px"></div><div style="width:auto;border-radius:8px;padding:8px;background-color:lightsalmon">La computadora remota no está encendida, haga clic aquí para emitir un comando de encendido.</div>
|
|
</div>
|
|
<!-- ###END###{PowerControl} -->
|
|
<table cellpadding="0" cellspacing="0" style="width:100%;padding:0px;padding:0px;margin-top:0px">
|
|
<tbody><tr>
|
|
<td style="padding-top:2px;padding-bottom:2px;background:#CCC">
|
|
<div style="float:right; text-align:right">
|
|
<input onkeyup="sendTermInputKeys(event)" autocorrect="off" autocapitalize="off" style="opacity:0;width:0;height:0;font-size:1px" onblur="keyInputBlur()">
|
|
<span id="id_p13power"></span>
|
|
<!-- ###BEGIN###{Mode-MeshCentral2} -->
|
|
<div id="termRecordIcon" title="Server is recording this session" style="display:none;float:right;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px;margin-right:4px"></div>
|
|
<!-- ###END###{Mode-MeshCentral2} -->
|
|
<!-- ###BEGIN###{PowerControl} -->
|
|
<input type="button" onkeypress="return false" onkeydown="return false" class="cadbutton" value="Acciones de poder ..." onclick="showPowerActionDlg()" style="margin-right:3px">
|
|
<!-- ###END###{PowerControl} -->
|
|
<!-- ###BEGIN###{IDER} -->
|
|
<!-- ###BEGIN###{Mode-MeshCentral2} -->
|
|
<input type="button" id="idx_SIDER1" value="SIDER" title="Start server-side remote disk mount operation" onkeypress="return false" onkeydown="return false" onclick="iderServerStart()" style="margin-right:3px">
|
|
<!-- ###END###{Mode-MeshCentral2} -->
|
|
<input type="button" id="idx_IDER1" value="IDER" title="Iniciar la operación remota de montaje en disco" onkeypress="return false" onkeydown="return false" onclick="iderStart(event)" style="margin-right:3px">
|
|
<!-- ###END###{IDER} -->
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{FileSaver} -->
|
|
<input id="idx_terminalCaptureButton" type="button" onkeypress="return false" onkeydown="return false" class="cadbutton" value="Iniciar captura" title="Toggle start/stop of terminal capture, when stopping the content of the capture buffer will be saved to a file." onclick="terminalCaptureToggle(event)" style="margin-right:3px">
|
|
<!-- ###END###{FileSaver} -->
|
|
<!-- ###BEGIN###{TerminalReplay} -->
|
|
<!-- <input id="idx_terminalReplayButton" type="button" onkeypress="return false" onkeydown="return false" class="cadbutton" value="Replay Capture" onclick="terminalReplay()" style="margin-right:3px"> -->
|
|
<!-- ###END###{TerminalReplay} -->
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
</div>
|
|
<div>
|
|
<input type="button" id="idx_connectbutton2" value="Conectar" onclick="connectTerminal(event)" disabled="disabled">
|
|
<span id="id_termstatus">Desconectado.</span>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background:#000;text-align:center"><pre id="Term"></pre></td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding-top:2px;padding-bottom:2px;background:#CCC">
|
|
<div style="float:right;text-align:right">
|
|
<input id="id_tcrbutton" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event);return false" class="bottombutton" value="CR + LF" title="Alternar lo que enviará la tecla de retorno" onclick="termToggleCr();Q('id_tcrbutton').blur()">
|
|
<!-- ###BEGIN###{TerminalSize} -->
|
|
<input id="id_tsizebutton" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="80x25" title="Cambiar tamaño de terminal" onclick="termToggleSize();Q('id_tsizebutton').blur()">
|
|
<!-- ###END###{TerminalSize} -->
|
|
<input id="id_tfxkeysbutton" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event);return false" class="bottombutton" value="Intel (F10 = ESC + [OM)" title="Cambiar el tipo de emulación de teclas F1 a F10" onclick="termToggleFx();Q('id_tfxkeysbutton').blur()">
|
|
<!-- ###BEGIN###{Terminal-Enumation-All} -->
|
|
<input id="id_ttypebutton" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event);return false" class="bottombutton" value="Ascii extendido" title="Cambiar el tipo de emulación de terminal" onclick="termToggleType();Q('id_ttypebutton').blur()">
|
|
<!-- ###END###{Terminal-Enumation-All} -->
|
|
</div>
|
|
<div>
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<input id="id_toolbtncc" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="Ctl-C" onclick="termSendKey(3);Q('id_toolbtncc').blur()">
|
|
<input id="id_toolbtncx" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="Ctl-X" onclick="termSendKey(24);Q('id_toolbtncx').blur()">
|
|
<input id="id_toolbtnes" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="ESC" onclick="termSendKey(27);Q('id_toolbtnes').blur()">
|
|
<input id="id_toolbtnbs" type="button" onkeypress="return false" onkeydown="if (event.keyCode == 13) handleKeyPress(event); return false" class="bottombutton" value="Retroceso" onclick="termSendKey(8);Q('id_toolbtnbs').blur()">
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<span id="termkeysspan">
|
|
<select style="margin-left:6px" id="termkeys">
|
|
<option value="3">Ctrl-C</option>
|
|
<option value="24">Ctrl-X</option>
|
|
<option value="27">ESC</option>
|
|
<option value="8">Retroceso</option>
|
|
<option value="1001">F1</option>
|
|
<option value="1002">F2</option>
|
|
<option value="1003">F3</option>
|
|
<option value="1004">F4</option>
|
|
<option value="1005">F5</option>
|
|
<option value="1006">F6</option>
|
|
<option value="1007">F7</option>
|
|
<option value="1008">F8</option>
|
|
<option value="1009">F9</option>
|
|
<option value="1010">F10</option>
|
|
<option value="1011">F11</option>
|
|
<option value="1012">F12</option>
|
|
</select>
|
|
<input id="TermWD" type="button" value="Enviar" onkeypress="return false" onkeydown="return false" onclick="termSendKeys()">
|
|
|
|
</span>
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
<input id="id_tpastebutton" type="button" onkeypress="return false" onkeydown="return false" class="cadbutton" value="Pegar" disabled="disabled" onclick="setDialogMode(3,'Paste',3,termPaste)">
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
</div>
|
|
<!-- ###END###{Terminal} -->
|
|
<!-- ###BEGIN###{Desktop} -->
|
|
<div id="p14" style="display:none;min-width:780px">
|
|
<div id="id_rdheader"><h1>Escritorio remoto</h1><br></div>
|
|
<div id="id_p14warning1" style="max-width:100%;display:none;cursor:pointer;margin-bottom:5px" onclick="showFeaturesDlg()">
|
|
<div class="icon2" style="float:left;margin:7px"></div><div style="width:auto;border-radius:8px;padding:8px;background-color:lightsalmon">El puerto Intel® AMT Redirection o la función KVM están deshabilitados<span id="id_p14warninga">, haga clic aquí para habilitarlo.</span></div>
|
|
</div>
|
|
<!-- ###BEGIN###{PowerControl} -->
|
|
<div id="id_p14warning2" style="max-width:100%;display:none;cursor:pointer;margin-bottom:5px" onclick="showPowerActionDlg()">
|
|
<div class="icon2" style="float:left;margin:7px"></div><div style="width:auto;border-radius:8px;padding:8px;background-color:lightsalmon">La computadora remota no está encendida, haga clic aquí para emitir un comando de encendido.</div>
|
|
</div>
|
|
<!-- ###END###{PowerControl} -->
|
|
<table cellpadding="0" cellspacing="0" style="width: 100%; padding: 0px; padding: 0px; margin-top: 0px">
|
|
<tbody><tr>
|
|
<td style="padding-top: 2px;padding-bottom:2px;background: #CCC">
|
|
<div style="float:right; text-align:right">
|
|
<span id="id_p14power"></span>
|
|
<div class="rb" title="Girar a la izquierda" onclick="drotate(-1)">↺</div>
|
|
<div class="rb" title="Gira a la derecha" onclick="drotate(1)">↻</div>
|
|
<!-- ###BEGIN###{Mode-MeshCentral2} -->
|
|
<div id="deskRecordIcon" title="Server is recording this session" style="display:none;float:right;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px;margin-right:4px"></div>
|
|
<!-- ###END###{Mode-MeshCentral2} -->
|
|
<input id="idx_deskFullBtn" type="button" title="Alternar el modo de pantalla completa" onkeypress="return false" onkeydown="return false" value="Completo" onclick="deskToggleFull()" style="margin-right:3px">
|
|
<!-- ###BEGIN###{DesktopFocus} -->
|
|
<input id="idx_deskFocusBtn" type="button" title="Alternar el modo de enfoque, cuando está activo solo se actualiza la región alrededor del mouse" onkeypress="return false" onkeydown="return false" value="Enfocar todo" onclick="deskToggleFocus()" style="margin-right:3px">
|
|
<!-- ###END###{DesktopFocus} -->
|
|
<!-- ###BEGIN###{FileSaver} -->
|
|
<!-- ###BEGIN###{!DesktopRecorder} -->
|
|
<input id="idx_deskSaveBtn" type="button" title="Guardar una captura de pantalla del escritorio remoto" onkeypress="return false" onkeydown="return false" value="Salvar..." onclick="deskSaveImage()" style="margin-right:3px">
|
|
<!-- ###END###{!DesktopRecorder} -->
|
|
<!-- ###END###{FileSaver} -->
|
|
<input type="button" value="Configuraciones ..." title="Editar configuraciones de escritorio remoto" onkeypress="return false" onkeydown="return false" onclick="showDesktopSettings()" style="margin-right:3px">
|
|
<!-- ###BEGIN###{IDER} -->
|
|
<!-- ###BEGIN###{Mode-MeshCentral2} -->
|
|
<input type="button" id="idx_SIDER2" value="SIDER" title="Start server-side remote disk mount operation" onkeypress="return false" onkeydown="return false" onclick="iderServerStart()" style="margin-right:3px">
|
|
<!-- ###END###{Mode-MeshCentral2} -->
|
|
<input type="button" id="idx_IDER2" value="IDER" title="Iniciar la operación remota de montaje en disco" onkeypress="return false" onkeydown="return false" onclick="iderStart(event)" style="margin-right:3px">
|
|
<!-- ###END###{IDER} -->
|
|
<!-- ###BEGIN###{PowerControl} -->
|
|
<input type="button" title="Cambiar el estado de energía de la máquina remota" onkeypress="return false" onkeydown="return false" value="Acciones de poder ..." onclick="showPowerActionDlg()" style="margin-right:3px">
|
|
<!-- ###END###{PowerControl} -->
|
|
</div>
|
|
<div>
|
|
<div id="idx_deskFullBtn2" onclick="deskToggleFull()" style="float:left;cursor:pointer;font-size:15px;display:none"> ✖</div>
|
|
<input type="button" id="idx_connectbutton1" value="Conectar" onclick="connectDesktopButton(event)" onkeypress="return false" onkeydown="return false" disabled="disabled">
|
|
<span id="id_deskstatus">Desconectado.</span>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="id_DeskParent" style="background:black;text-align:center;position:relative">
|
|
<!-- ###BEGIN###{DesktopFocus} -->
|
|
<div id="DeskFocus" style="color:transparent;border:3px dotted rgba(255,0,0,.2);position:absolute;border-radius:5px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)"></div>
|
|
<!-- ###END###{DesktopFocus} -->
|
|
<!-- ###BEGIN###{DesktopInband} -->
|
|
<canvas id="Desk" width="640" height="400" style="-ms-touch-action:none;margin-left:0px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)" onmousewheel="dmousewheel(event)" moz-opaque=""></canvas>
|
|
<!-- ###END###{DesktopInband} -->
|
|
<!-- ###BEGIN###{!DesktopInband} -->
|
|
<canvas id="Desk" width="640" height="400" style="-ms-touch-action:none;margin-left:0px" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)" moz-opaque=""></canvas>
|
|
<!-- ###END###{!DesktopInband} -->
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding-top:2px;padding-bottom:2px;background:#CCC">
|
|
<!--
|
|
<div style="float:right; text-align:right">
|
|
<select id="specialkeylist" onkeypress="return false"></select>
|
|
<input id="specialkeylistinput" type="button" onkeypress="return false" class="bottombutton" value="Send" onclick="sendSpecialKey()">
|
|
</div>
|
|
-->
|
|
<!-- ###BEGIN###{DesktopClipboard} -->
|
|
<input id="id_DeskKvmClipButton" value="Portapapeles" type="button" style="float:right;display:none" onclick="deskClipboard()">
|
|
<!-- ###END###{DesktopClipboard} -->
|
|
<!-- ###BEGIN###{FileSaver} -->
|
|
<!-- ###BEGIN###{DesktopRecorder} -->
|
|
<div id="id_DeskRecorderTools" style="float:right">
|
|
<div id="DeskRecordButton" class="videoIcon" title="Grabar sesión de escritorio remoto en archivo" onclick="deskRecordSession()"></div>
|
|
<div id="DeskSaveImageButton" class="cameraIcon" title="Guardar una captura de pantalla del escritorio remoto" onclick="deskSaveImage()"></div>
|
|
</div>
|
|
<!-- ###END###{DesktopRecorder} -->
|
|
<!-- ###END###{FileSaver} -->
|
|
<!-- ###BEGIN###{Desktop-Multi} -->
|
|
<div id="id_DeskScreenSelector" style="float:right"></div>
|
|
<!-- ###END###{Desktop-Multi} -->
|
|
<div>
|
|
|
|
<span id="deskkeysspan">
|
|
<select style="margin-left:6px" id="deskkeys">
|
|
<option value="0">Ganar</option>
|
|
<option value="1">Win + Down</option>
|
|
<option value="2">Win + Up</option>
|
|
<option value="3">Win + L</option>
|
|
<option value="4">Win + M</option>
|
|
<option value="20">Win + R</option>
|
|
<option value="23">Win + Izquierda</option>
|
|
<option value="24">Win + Right</option>
|
|
<option value="5">Shift + Win + M</option>
|
|
<option value="19">Alt-Tab</option>
|
|
<option value="21">Alt-F4</option>
|
|
<option value="22">Ctrl-W</option>
|
|
<option value="6">F1</option>
|
|
<option value="7">F2</option>
|
|
<option value="8">F3</option>
|
|
<option value="9">F4</option>
|
|
<option value="10">F5</option>
|
|
<option value="11">F6</option>
|
|
<option value="12">F7</option>
|
|
<option value="13">F8</option>
|
|
<option value="14">F9</option>
|
|
<option value="15">F10</option>
|
|
<option value="16">F11</option>
|
|
<option value="17">F12</option>
|
|
<!-- <option value=18>LS+LA+PrtSc</option> -->
|
|
</select>
|
|
<input id="DeskWD" type="button" value="Enviar" onkeypress="return false" onkeydown="return false" onclick="deskSendKeys()">
|
|
|
|
</span>
|
|
<input id="id_DeskCAD" type="button" value="Ctrl-Alt-Del" onkeypress="return false" onkeydown="return false" onclick="sendCAD()">
|
|
<!-- ###BEGIN###{DesktopType} -->
|
|
<input id="id_DeskType" type="button" value="Tipo" onkeypress="return false" onkeydown="return false" onclick="deskShowTypeDialog()">
|
|
<!-- ###END###{DesktopType} -->
|
|
<span id="id_DeskSBspan"><input id="id_DeskSB" type="checkbox"> Pantalla en blanco </span>
|
|
<span id="id_DeskVOspan"><input id="id_DeskVO" type="checkbox"> Sólo vista </span>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
</div>
|
|
<!-- ###END###{Desktop} -->
|
|
<!-- ###BEGIN###{AuditLog} -->
|
|
<div id="p15" style="display:none">
|
|
<span id="id_TableAuditLog1"></span>
|
|
<h1>Registro de auditoría</h1>
|
|
<span id="id_TableAuditLog2"></span>
|
|
</div>
|
|
<!-- ###END###{AuditLog} -->
|
|
<!-- ###BEGIN###{Certificates} -->
|
|
<div id="p16" style="display:none">
|
|
<h1>Configuracion seguridad</h1>
|
|
<span id="id_TableCerts"></span>
|
|
</div>
|
|
<!-- ###END###{Certificates} -->
|
|
<!-- ###BEGIN###{RemoteAccess} -->
|
|
<div id="p17" style="display:none">
|
|
<h1>Configuraciones de internet</h1>
|
|
<span id="id_TableRemoteAccess"></span>
|
|
</div>
|
|
<!-- ###END###{RemoteAccess} -->
|
|
<!-- ###BEGIN###{SystemDefense} -->
|
|
<div id="p18" style="display:none">
|
|
<h1>Defensa del sistema</h1>
|
|
<span id="id_TableSystemDefense"></span>
|
|
</div>
|
|
<!-- ###END###{SystemDefense} -->
|
|
<!-- ###BEGIN###{AgentPresence} -->
|
|
<div id="p19" style="display:none">
|
|
<h1>Presencia de agente</h1>
|
|
<span id="id_TableSystemAgentPresence"></span>
|
|
</div>
|
|
<!-- ###END###{AgentPresence} -->
|
|
<!-- ###BEGIN###{Scripting-Editor} -->
|
|
<div id="p20" style="display:none">
|
|
<h1>Editor de guiones</h1>
|
|
<div class="log1" style="padding:5px;border-radius:5px">
|
|
<div id="EditScriptStatus" style="float:right;font-weight:bold;padding:5px">Detenido</div>
|
|
<div>
|
|
<input type="button" value="Ver editor" title="Cambiar a la vista del editor de línea de script" id="viewEditorButton" onclick="scriptViewButton(0)">
|
|
<input type="button" value="View Builder" title="Cambiar a bloquear la vista del editor" id="viewBuilderButton" onclick="scriptViewButton(1)">
|
|
<input type="button" value="Nuevo..." title="Borrar el editor de guiones" onclick="script_newScriptDlg()">
|
|
<input type="button" value="Carga..." title="Cargar un script desde el archivo" onclick="script_runScriptDlg()">
|
|
<!-- ###BEGIN###{FileSaver} -->
|
|
<input type="button" value="Salvar..." title="Guardar un script en un archivo" onclick="script_saveScript(event)">
|
|
<!-- ###END###{FileSaver} -->
|
|
<input type="button" value="Reiniciar" title="Compila el script y prepárate para ejecutarlo desde el principio" onclick="resetScriptButton()">
|
|
<input type="button" value="Seguir" title="Ejecute el script desde el punto de ejecución actual" onclick="runScriptButton()">
|
|
<input type="button" value="Rotura" title="Pausa la ejecución del script." onclick="breakScriptButton()">
|
|
<input type="button" value="Paso" title="Ejecute un paso del guión" onclick="stepScriptButton()">
|
|
</div>
|
|
</div>
|
|
<div id="scriptbuilder" style="display:none">
|
|
<h2>Script Builder</h2>
|
|
<div style="padding:0;margin:0">
|
|
<div style="width:250px;height:400px;float:left;padding:0;margin:0;padding-right:3px">
|
|
<input id="blockfilter" style="width:inherit;height:24px;padding:0;margin:0;border:1px solid gray;margin-bottom:1px" placeholder="Filtrar bloques ..." onkeyup="script_fonfilterchanged()">
|
|
<div id="blocks" style="width:inherit;height:373px;border:1px solid gray;overflow-y:scroll;padding:0;margin:0"></div>
|
|
</div>
|
|
<div id="scriptblocks" style="width:auto;height:400px;padding:0;margin:0;border:1px solid gray;overflow-y:scroll" ondrop="script_fondrop(event, this)" onclick="script_fonclick(event)"></div>
|
|
</div>
|
|
</div>
|
|
<div id="scripteditor">
|
|
<h2>Guión</h2>
|
|
<textarea id="scriptarea" style="width:100%;height:176px;resize:vertical;margin:0;padding:0;font-family:Arial,Helvetica,sans-serif" spellcheck="false"></textarea>
|
|
<div style="display:none">
|
|
<br><h2>Script compilado</h2>
|
|
<textarea id="compiledarea" style="width:100%;height:16px;resize:vertical;margin:0;padding:0" spellcheck="false"></textarea>
|
|
<br>
|
|
</div>
|
|
<h2>Variables</h2>
|
|
<div id="variables" style="width:100%;height:200px;resize:vertical;border:1px solid gray;overflow:scroll;margin:0;padding:0;user-select:text;-webkit-user-select:text;-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text"></div>
|
|
</div>
|
|
<h2>Consola</h2>
|
|
<textarea id="console" style="width:100%;height:80px;resize:vertical;margin:0;padding:0;user-select:text;-webkit-user-select:text;-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text" readonly=""></textarea>
|
|
</div>
|
|
<!-- ###END###{Scripting-Editor} -->
|
|
<!-- ###BEGIN###{Storage} -->
|
|
<div id="p21" style="display:none">
|
|
<h1>Almacenamiento</h1>
|
|
<span id="id_TableSystemStorage"></span>
|
|
</div>
|
|
<!-- ###END###{Storage} -->
|
|
<!-- ###BEGIN###{EventSubscriptions} -->
|
|
<div id="p22" style="display:none">
|
|
<h1>Suscripciones a eventos</h1>
|
|
<span id="id_TableEventSubscriptions"></span>
|
|
</div>
|
|
<!-- ###END###{EventSubscriptions} -->
|
|
<!-- ###BEGIN###{Alarms} -->
|
|
<div id="p23" style="display:none">
|
|
<h1>Wake Alarms</h1>
|
|
<span id="id_TableAlarm"></span>
|
|
</div>
|
|
<!-- ###END###{Alarms} -->
|
|
<!-- ###BEGIN###{DesktopInbandFiles} -->
|
|
<div id="p24" style="display:none;position:absolute;top:0px;bottom:0px;left:8px;right:24px">
|
|
<h1>Archivos</h1><br>
|
|
<table id="p24toolbar" style="width:100%;position:absolute;top:35px" cellpadding="0" cellspacing="0">
|
|
<tbody><tr>
|
|
<td style="width:100%;background-color:#d3d9d6;text-align:left;padding:4px" valign="bottom">
|
|
<div id="p24rightOfButtons" style="float:right;margin-top:3px"></div>
|
|
<div>
|
|
<input type="button" id="p24FolderUp" disabled="disabled" onclick="p24folderup()" value="Arriba">
|
|
<input type="button" id="p24SelectAllButton" disabled="disabled" onclick="p24selectallfile()" value="Seleccionar todo" onkeypress="return false" onkeydown="return false">
|
|
<input type="button" id="p24RenameFileButton" disabled="disabled" value="Rebautizar" onclick="p24renamefile()" onkeypress="return false" onkeydown="return false">
|
|
<input type="button" id="p24DeleteFileButton" disabled="disabled" value="Eliminar" onclick="p24deletefile()" onkeypress="return false" onkeydown="return false">
|
|
<input type="button" id="p24NewFolderButton" disabled="disabled" value="Nueva carpeta" onclick="p24createfolder()" onkeypress="return false" onkeydown="return false">
|
|
<input type="button" id="p24UploadButton" disabled="disabled" value="Subir" onclick="p24uploadFile()" onkeypress="return false" onkeydown="return false">
|
|
<input type="button" id="p24CutButton" disabled="disabled" value="Cortar" onclick="p24copyFile(1)" onkeypress="return false" onkeydown="return false">
|
|
<input type="button" id="p24CopyButton" disabled="disabled" value="Copiar" onclick="p24copyFile(0)" onkeypress="return false" onkeydown="return false">
|
|
<input type="button" id="p24PasteButton" disabled="disabled" value="Pegar" onclick="p24pasteFile()" onkeypress="return false" onkeydown="return false">
|
|
<input type="button" id="p24RefreshButton" disabled="disabled" value="Actualizar" onclick="p24folderup(9999)" onkeypress="return false" onkeydown="return false">
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="background-color:#E4E9E7;height:28px">
|
|
<div style="float:right;margin-right:4px">
|
|
<select id="p24sortdropdown" onchange="p24updateFiles()">
|
|
<option value="1" selected="selected">Ordenar por nombre</option>
|
|
<option value="2">Ordenado por tamaño</option>
|
|
<option value="3">Ordenar por fecha</option>
|
|
<option value="4">Desciende por nombre</option>
|
|
<option value="5">Descender por tamaño</option>
|
|
<option value="6">Descender por fecha</option>
|
|
</select>
|
|
</div>
|
|
<div> <span id="p24currentpath"></span></div>
|
|
</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<div id="p24filetable" style="width:100%;overflow:auto;-webkit-user-select:none;position:absolute;top:92px;bottom:30px">
|
|
<div id="p24bigok" style="width:256px;overflow:hidden;position:absolute;top:80px;width:100%;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>✓</b></div>
|
|
<div id="p24bigfail" style="width:256px;overflow:hidden;position:absolute;top:80px;width:100%;text-align:center;font-size:1600%;color:#AAAAAA;display:none"><b>✗</b></div>
|
|
<span id="p24files"></span>
|
|
</div>
|
|
<table id="p24toolbarBottom" style="width:100%;position:absolute;bottom:10px" cellpadding="0" cellspacing="0">
|
|
<tbody><tr><td style="text-align:left;padding:3px;text-align:center;background-color:#D3D9D6"> <span id="p24bottomstatus"></span></td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<!-- ###END###{DesktopInbandFiles} -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- ###BEGIN###{Mode-MeshCentral2} -->
|
|
<div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial, Helvetica, sans-serif;border-radius:5px;position:fixed;overflow:hidden;top:75px;width:400px;max-height:550px;display:none">
|
|
<!-- ###END###{Mode-MeshCentral2} -->
|
|
<!-- ###BEGIN###{!Mode-MeshCentral2} -->
|
|
<div id="dialog" style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial, Helvetica, sans-serif;border-radius:5px;position:fixed;top:160px;width:400px;display:none">
|
|
<!-- ###END###{!Mode-MeshCentral2} -->
|
|
<div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0">
|
|
<div id="id_dialogclose" style="float:right;padding:1px;margin-right:5px;cursor:pointer;font-size:15px" onclick="setDialogMode()">✖</div>
|
|
<div id="id_dialogtitle" style="padding:5px"></div>
|
|
<div style="width:100%;margin:6px"></div>
|
|
</div>
|
|
<div style="margin-right:16px;margin-left:8px">
|
|
<div id="dialog1" style="margin:auto;text-align:center;margin:3px">
|
|
<div id="id_dialogMessage" style="padding:10px"></div>
|
|
</div>
|
|
<div id="dialog2" style="margin:auto;margin:3px">
|
|
<br>
|
|
<div style="height:26px"><input id="d2username" style="float:right;width:200px" onkeyup="updateAccountDialog()"><div>Nombre de usuario</div></div>
|
|
<div style="height:26px"><input id="d2password1" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="updateAccountDialog()"><div>Contraseña*</div></div>
|
|
<div style="height:26px"><input id="d2password2" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="updateAccountDialog()"><div>Confirmar contraseña</div></div>
|
|
<div id="id_d2permissions">
|
|
<div style="height:26px"><select id="d2permission" style="float:right;width:200px"><option value="0">Local</option><option value="1">Red</option><option value="2">Ninguna</option></select><div>Permiso</div></div>
|
|
<div>Permisos concedidos</div>
|
|
<ul id="id_d2realms" style="list-style-type:none;height:100px;overflow:auto;width:100%;border: 1px solid #000;background-color:white;overflow-x:hidden;margin:0;padding:0"></ul>
|
|
</div>
|
|
<div style="font-size:10px"><br>* Mínimo 8 caracteres con mayúsculas, minúsculas, 0-9 y uno de! @ # $% ^ & * () + -</div>
|
|
</div>
|
|
<!-- ###BEGIN###{Terminal} -->
|
|
<div id="dialog3" style="margin:auto;text-align:center;margin:3px">
|
|
<textarea id="d3pastetextarea" maxlength="4096" style="width:100%;height:200px;resize:none"></textarea>
|
|
</div>
|
|
<!-- ###END###{Terminal} -->
|
|
<!-- ###BEGIN###{Mode-LMS} -->
|
|
<div id="dialog4" style="margin:auto;margin:3px">
|
|
<br>
|
|
<div style="height:26px"><input id="d4username" placeholder="administración" style="float:right;width:200px" onkeyup="lmsUpdateLoginDialog(event, 1)"><div>Nombre de usuario</div></div>
|
|
<div style="height:26px"><input id="d4password" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="lmsUpdateLoginDialog(event, 2)"><div>Contraseña*</div></div>
|
|
<div style="font-size:10px"><br>* Mínimo 8 caracteres con mayúsculas, minúsculas, 0-9 y uno de! @ # $% ^ & * () + -</div>
|
|
</div>
|
|
<!-- ###END###{Mode-LMS} -->
|
|
<!-- ###BEGIN###{ComputerSelector} -->
|
|
<div id="dialog4" style="margin:auto;margin:3px">
|
|
<br>
|
|
<div style="height:26px"><input id="d4name" style="float:right;width:200px" onkeyup="updateComputerDialog()"><div>Nombre amigable</div></div>
|
|
<div style="height:26px"><input id="d4tags" list="d4devGroups" style="float:right;width:200px" placeholder="Mi grupo"><div>Nombre del grupo</div></div>
|
|
<div style="height:26px"><input id="d4hostname" style="float:right;width:200px" onkeyup="updateComputerDialog()"><div>Nombre de host</div></div>
|
|
<div style="height:26px"><select id="d4security" style="float:right;width:200px" onchange="updateComputerDialog()"><option value="0">Resumen / Ninguno</option><option value="1">Resumen / TLS</option><option value="2">Kerberos / Ninguno</option><option value="3">Kerberos / TLS</option></select><div>Autenticación / seguridad</div></div>
|
|
<div id="d4digest">
|
|
<div style="height:26px"><input id="d4username" value="administración" style="float:right;width:200px" onkeyup="updateComputerDialog()"><div>Nombre de usuario</div></div>
|
|
<div style="height:26px"><input id="d4password" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="updateComputerDialog()"><div>Contraseña*</div></div>
|
|
<div style="font-size:10px"><br>* Mínimo 8 caracteres con mayúsculas, minúsculas, 0-9 y uno de! @ # $% ^ & * () + -</div>
|
|
</div>
|
|
<div id="d4kerb">
|
|
<div style="height:26px"><input id="d4kerberos" style="float:right;width:200px" onkeyup="updateComputerDialog()" placeholder="computer.domain.com:16992" title="Si este campo está lleno, este valor se utilizará para solicitar el token Kerberos en lugar de host: puerto."><div>Solicitud de token opcional *</div></div>
|
|
<div style="font-size:10px"><br>* Nombre de host alternativo para solicitud de token Kerberos</div>
|
|
</div>
|
|
<datalist id="d4devGroups"></datalist>
|
|
</div>
|
|
<!-- ###END###{ComputerSelector} -->
|
|
<div id="dialog5" style="margin:auto;margin:3px">
|
|
<br>
|
|
<div style="height:26px">
|
|
<select id="d5actionSelect" style="float:right;width:200px"></select>
|
|
<div>Acción de poder</div>
|
|
</div>
|
|
<div>
|
|
<span style="color:red">Advertencia:</span> Algunas acciones de energía pueden provocar la pérdida de datos y pueden desconectar las sesiones de redirección de escritorio, terminal o disco.
|
|
</div>
|
|
</div>
|
|
<div id="dialog6" style="margin:auto;margin:3px">
|
|
<br>
|
|
<div style="height:26px"><input id="d6ConsentText" style="float:right;width:200px" maxlength="6" onkeyup="consentChanged()" onkeypress="if (event.keyCode == 13) return dialogclose(1); else return numbersOnly(event)"><div>Código de consentimiento</div></div>
|
|
<div style="height:26px"><select id="d6Display" onchange="changeConsentDisplay()" style="float:right;width:200px"><option value="0">Pantalla principal</option><option value="1">Pantalla secundaria</option><option id="d6ThirdDisplay" value="2" style="display:none">Tercera pantalla</option></select><div>Visualización de consentimiento</div></div>
|
|
</div>
|
|
<!-- ###BEGIN###{Desktop} -->
|
|
<div id="dialog7" style="margin:auto;margin:3px">
|
|
<br>
|
|
<div style="height:26px">
|
|
<select id="idx_d7desktopmode" style="float:right;width:200px"></select>
|
|
<div>Codificación de imagen</div>
|
|
</div>
|
|
<div id="d7decimationspan" style="height:26px">
|
|
<select id="d7decimation" style="float:right;width:200px"><option value="0">Don't set</option><option value="1">Discapacitado</option><option value="2">Automatic</option><option value="3">Habilitado</option></select>
|
|
<div>Downscaling</div>
|
|
</div>
|
|
<div style="height:80px">
|
|
<div style="float:right;border:1px solid #666;width:200px;height:80px;overflow-y:scroll;background-color:white">
|
|
<!-- ###BEGIN###{DesktopFocus} -->
|
|
<label><input type="checkbox" id="d7showfocus">Mostrar herramienta de enfoque</label><br>
|
|
<!-- ###END###{DesktopFocus} -->
|
|
<label><input type="checkbox" id="d7showcursor">Mostrar cursor del mouse local</label><br>
|
|
<label><input type="checkbox" id="d7showcad">Mostrar Ctrl-Alt-Supr</label><br>
|
|
<label><input type="checkbox" id="d7limitFrameRate">Límite de velocidad de fotogramas</label><br>
|
|
<label><input type="checkbox" id="d7noMouseRotate">No gire el mouse</label><br>
|
|
</div>
|
|
<div>Otros ajustes</div>
|
|
</div>
|
|
<!-- ###BEGIN###{DesktopInband} -->
|
|
<div id="d7softkvmsettings" style="display:none">
|
|
<h4 style="width:100%;border-bottom:1px solid gray">Software KVM</h4>
|
|
<div style="margin:3px 0 3px 0">
|
|
<select id="d7bitmapquality" style="float:right;width:200px;height:20px" dir="rtl">
|
|
<option value="50">50%</option>
|
|
<option value="40">40%</option>
|
|
<option selected="selected" value="30">30%</option>
|
|
<option value="20">20%</option>
|
|
<option value="10">10%</option>
|
|
<option value="5">5%</option>
|
|
<option value="1">1%</option>
|
|
</select>
|
|
<div style="height:20px">Calidad</div>
|
|
</div>
|
|
<div style="margin:3px 0 3px 0">
|
|
<select id="d7bitmapscaling" style="float:right;width:200px;height:20px" dir="rtl">
|
|
<option selected="selected" value="1024">100%</option>
|
|
<option value="896">87,5%</option>
|
|
<option value="768">75%</option>
|
|
<option value="640">62,5%</option>
|
|
<option value="512">50%</option>
|
|
<option value="384">37,5%</option>
|
|
<option value="256">25%</option>
|
|
<option value="128">12,5%</option>
|
|
</select>
|
|
<div style="height:20px">Escalada</div>
|
|
</div>
|
|
</div>
|
|
<!-- ###END###{DesktopInband} -->
|
|
</div>
|
|
<!-- ###END###{Desktop} -->
|
|
<!-- ###BEGIN###{!Mode-Firmware} -->
|
|
<div id="dialog8" style="display:table;margin:3px">
|
|
<div style="margin:3px 0 3px 0;padding-top:5px">
|
|
<input id="idx_d8username" value="administración" style="float:right;width:220px">
|
|
<div style="height:20px">Nombre de usuario</div>
|
|
</div>
|
|
<div style="margin:3px 0 3px 0">
|
|
<input id="idx_d8password" type="password" autocomplete="off" style="float:right;width:220px">
|
|
<div style="height:20px">Contraseña</div>
|
|
</div>
|
|
</div>
|
|
<!-- ###END###{!Mode-Firmware} -->
|
|
<div id="dialog9" style="margin:auto;margin:3px">
|
|
<label style="display:block"><input type="checkbox" id="idx_d9redir">Puerto de redireccionamiento</label>
|
|
<label id="idx_d9kvm_div" style="display:block"><input type="checkbox" id="idx_d9kvm">Escritorio remoto KVM</label>
|
|
<label style="display:block"><input type="checkbox" id="idx_d9ider">Redirección IDE<br></label>
|
|
<label style="display:block"><input type="checkbox" id="idx_d9sol">Serie sobre LAN<br></label>
|
|
</div>
|
|
<div id="dialog10" style="margin:auto;margin:3px">
|
|
<label><input type="radio" name="d10" id="idx_d10none" value="0">No requerido<br></label>
|
|
<label><input type="radio" name="d10" id="idx_d10kvm" value="1">Requerido solo para KVM<br></label>
|
|
<label><input type="radio" name="d10" id="idx_d10all" value="4294967295">Siempre requerido<br></label>
|
|
</div>
|
|
<div id="dialog11" style="margin:auto;margin:3px">
|
|
<div id="id_dialogOptions"></div>
|
|
</div>
|
|
<!-- ###BEGIN###{Wireless} -->
|
|
<div id="dialog12" style="margin:auto;margin:3px">
|
|
<br>
|
|
<div style="height:26px"><input id="idx_d12name" style="float:right;width:200px" maxlength="32" onkeyup="updateWifiDialog()" title="Máximo 32 caracteres"><div title="Máximo 32 caracteres">Nombre de perfil</div></div>
|
|
<div style="height:26px"><input id="idx_d12ssid" style="float:right;width:200px" maxlength="32" onkeyup="updateWifiDialog()" title="Máximo 32 caracteres"><div title="Máximo 32 caracteres">SSID</div></div>
|
|
<div style="height:26px">
|
|
<select id="idx_d12pri" style="float:right;width:200px" onclick="updateWifiDialog()"></select>
|
|
<div>Prioridad</div>
|
|
</div>
|
|
<div style="height:26px">
|
|
<select id="idx_d12auth" style="float:right;width:200px" onclick="updateWifiDialog()">
|
|
<option id="idx_d12auth_wpa3" value="32768">WPA3 SAE</option>
|
|
<!--<option value="7">WPA2 IEEE 802.1x</option>-->
|
|
<option value="6">WPA2 PSK</option>
|
|
<!--<option value="5">WPA IEEE 802.1x</option>-->
|
|
<option value="4">PSK WPA</option>
|
|
<!--<option value="3">Shared Key</option>-->
|
|
<!--<option value="2">Open</option>-->
|
|
</select>
|
|
<div>Autenticación</div>
|
|
</div>
|
|
<div style="height:26px">
|
|
<select id="idx_d12enc" style="float:right;width:200px" onclick="updateWifiDialog()">
|
|
<option id="id_d12e4" value="4">CCMP-AES</option>
|
|
<option id="id_d12e3" value="3">TKIP-RC4</option>
|
|
<option id="id_d12e2" value="2">WEP</option>
|
|
<option id="id_d12e5" value="5">Ninguna</option>
|
|
</select>
|
|
<div>Cifrado</div>
|
|
</div>
|
|
<div style="height:26px"><input id="idx_d12password1" type="password" style="float:right;width:200px" maxlength="63" onkeyup="updateWifiDialog()" title="Longitud entre 8 y 63 caracteres."><div title="Longitud entre 8 y 63 caracteres.">Contraseña*</div></div>
|
|
<div style="height:26px"><input id="idx_d12password2" type="password" style="float:right;width:200px" maxlength="63" onkeyup="updateWifiDialog()" title="Longitud entre 8 y 63 caracteres."><div title="Longitud entre 8 y 63 caracteres.">Confirmar contraseña</div></div>
|
|
</div>
|
|
<!-- ###END###{Wireless} -->
|
|
<!-- ###BEGIN###{USBSetup} -->
|
|
<div id="dialog13" style="margin:auto;margin:3px">
|
|
<label><input type="checkbox" id="d13valid">Registro válido<br></label>
|
|
<span id="d13ScrambledRecordSpan"><label><input type="checkbox" id="d13scramble">Revuelto</label><br></span>
|
|
</div>
|
|
<div id="dialog14" style="margin:auto;margin:3px">
|
|
<div style="height:26px">
|
|
<select id="idx_d14version" style="float:right;width:200px">
|
|
<option value="1">Versión 1</option>
|
|
<option value="2">Versión 2</option>
|
|
<option value="3">Versión 3</option>
|
|
<option value="4">Versión 4</option>
|
|
</select>
|
|
<div>Versión Setup.bin</div>
|
|
</div>
|
|
<div style="height:26px">
|
|
<select id="idx_d14consume" style="float:right;width:200px">
|
|
<option value="1">Los registros no serán consumidos</option>
|
|
<option value="0">Los registros serán consumidos</option>
|
|
</select>
|
|
<div>Consumo récord</div>
|
|
</div>
|
|
</div>
|
|
<div id="dialog15" style="margin:auto;margin:3px">
|
|
<input id="d15setupbinfile" type="file" style="width:100%" accept=".bin">
|
|
</div>
|
|
<div id="dialog16" style="margin:auto;margin:3px">
|
|
<div style="height:26px">
|
|
<select id="d16type" style="float:right;width:260px" onchange="usb_ond16typechange()" onclick="usb_ond16typechange()" onscroll="usb_ond16typechange()" onkeydown="usb_ond16typechange()"></select>
|
|
<div>Tipo variable</div>
|
|
</div>
|
|
<div id="d16genericvalue" style="height:26px">
|
|
<select id="idx_d16value1" style="float:right;width:260px"></select>
|
|
<input id="idx_d16value2" style="float:right;width:260px;display:none">
|
|
<div>Valor variable</div>
|
|
</div>
|
|
<div id="d16customvalue"></div>
|
|
</div>
|
|
<!-- ###END###{USBSetup} -->
|
|
<!-- ###BEGIN###{ComputerSelector} -->
|
|
<div id="dialog17" style="margin:auto;margin:3px">
|
|
<input id="idx_d17computerlistfile" type="file" style="width:100%" accept=".json, .csv">
|
|
</div>
|
|
<div id="dialog18" style="margin:auto;margin:3px">
|
|
<!-- ###BEGIN###{!Mode-NodeWebkit} -->
|
|
<input id="idx_d18computerfilename" style="width:100%" value="computerlist.json">
|
|
<!-- ###END###{!Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<!-- <input id="idx_d18computersavefile" type="file" nwsaveas="computerlist.json" accept=".json"> -->
|
|
<div style="text-align:left;height:26px;padding-top:6px">
|
|
<label><input id="d18usepassword" type="checkbox" style="float:left" onchange="saveComputerListUpdate()"><div>Utiliza encriptación. El archivo contendrá las credenciales Intel® AMT, guardar con una contraseña puede ayudar a proteger estos datos.</div></label>
|
|
</div>
|
|
<div id="d18showpassword" style="display:none;padding-top:16px">
|
|
<div style="height:26px"><input id="d18password1" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="saveComputerListUpdate()"><div>Contraseña*</div></div>
|
|
<div style="height:26px"><input id="d18password2" type="password" autocomplete="off" style="float:right;width:200px" onkeyup="saveComputerListUpdate()"><div>Confirmar contraseña</div></div>
|
|
<div style="font-size:10px"><br>* Mínimo 8 caracteres con mayúsculas, minúsculas, 0-9 y uno de! @ # $% ^ & * () + -</div>
|
|
</div>
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
</div>
|
|
<!-- ###END###{ComputerSelector} -->
|
|
<!-- ###BEGIN###{FileSaver} -->
|
|
<div id="dialog19" style="margin:auto;margin:3px">
|
|
Esto guardará todo el estado de Intel® AMT para esta máquina en un archivo. Las contraseñas no se guardarán, pero se pueden incluir algunos datos confidenciales.<br><br>
|
|
<input id="idx_d19savestatefilename" style="width:100%" value="amtstate.json">
|
|
</div>
|
|
<!-- ###END###{FileSaver} -->
|
|
<!-- ###BEGIN###{NetworkSettings} -->
|
|
<div id="dialog20" style="margin:auto;margin:3px">
|
|
<input type="radio" name="d20" id="d20a" value="0">Discapacitado<br>
|
|
<input type="radio" name="d20" id="d20b" value="1">Respuesta ICMP<br>
|
|
<input type="radio" name="d20" id="d20c" value="2">Respuesta RMCP<br>
|
|
<input type="radio" name="d20" id="d20d" value="3">Respuesta ICMP y RMCP<br><br>
|
|
</div>
|
|
<div id="dialog21" style="margin:auto;margin:3px">
|
|
<div id="id_d21ipaddrsync">
|
|
<label><input type="checkbox" name="d21" id="d21ipsync" onclick="updateIPSetupDlg()">Sincronización de dirección IP del sistema operativo</label><br>
|
|
</div>
|
|
<label><input type="radio" name="d21" id="d21o0" onclick="updateIPSetupDlg()"><span id="d21l0"></span></label><br>
|
|
<label><input type="radio" name="d21" id="d21o1" onclick="updateIPSetupDlg()"><span id="d21l1"></span></label><br>
|
|
<div id="id_d21manualdiv">
|
|
<label><input type="radio" name="d21" id="d21o2" onclick="updateIPSetupDlg()"><span id="d21l2"></span></label><br><br>
|
|
<div style="margin-left:20px">
|
|
<div style="height:26px"><input id="idx_d21address" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>dirección IP</div></div>
|
|
<div style="height:26px" id="id_d21subnetdiv"><input id="idx_d21subnet" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>Marca de subred</div></div>
|
|
<div style="height:26px"><input id="idx_d21gateway" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>Puerta</div></div>
|
|
<div style="height:26px"><input id="idx_d21dns1" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>DNS primario</div></div>
|
|
<div style="height:26px"><input id="idx_d21dns2" onkeyup="updateIPSetupDlg()" style="float:right;width:230px"><div>DNS alternativo</div></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="dialog23" style="margin:auto;margin:3px">
|
|
<br>
|
|
<div style="height:26px">
|
|
<select id="idx_d23ddns" style="float:right;width:200px" onchange="showEditDnsDlgChange()">
|
|
<option value="0">Discapacitado</option>
|
|
<option value="1">Desactivado, actualización de DHCP</option>
|
|
<option value="2">Habilitado</option>
|
|
</select>
|
|
<div>Cliente DNS dinámico</div>
|
|
</div>
|
|
<div style="height:26px"><input id="idx_d23interval" style="float:right;width:200px"><div>Intervalo de actualización (minutos)</div></div>
|
|
<div style="height:26px"><input id="idx_d23ttl" style="float:right;width:200px"><div>TTL (segundos)</div></div>
|
|
<div style="font-size:10px"><br>El intervalo predeterminado es de 1440 minutos, el TTL predeterminado es de 900 segundos.</div>
|
|
</div>
|
|
<!-- ###END###{NetworkSettings} -->
|
|
<!-- ###BEGIN###{PowerControl-Advanced} -->
|
|
<div id="dialog24" style="margin:auto;margin:3px">
|
|
<br>
|
|
<div style="height:26px">
|
|
<select id="idx_d24Command" style="float:right;width:200px" onchange="showAdvPowerDlgChange()">
|
|
<option value="2">Encender</option>
|
|
<option value="10">Reiniciar</option>
|
|
<option value="5">Ciclo de poder</option>
|
|
<option value="8">Corriente cortada</option>
|
|
<option id="d24p500" value="500">OS Wake desde Standby</option>
|
|
<option id="d24p501" value="501">Ahorro de energía del sistema operativo</option>
|
|
<option value="999">Establecer opciones de arranque</option>
|
|
</select>
|
|
<div>Comando remoto</div>
|
|
</div>
|
|
<div style="height:80px">
|
|
<div id="idx_d24bootoptions" style="float:right;border:1px solid #666;width:200px;height:72px;overflow-y:scroll;background-color:white">
|
|
<div id="d24dBiosPause"><label><input type="checkbox" id="d24BiosPause" onchange="showAdvPowerDlgChange()">Pausa del BIOS</label><br></div>
|
|
<div id="d24dBiosSecureBoot"><label><input type="checkbox" id="d24BiosSecureBoot" onchange="showAdvPowerDlgChange()">Hacer cumplir el arranque seguro</label><br></div>
|
|
<div id="d24dBiosSetup"><label><input type="checkbox" id="d24BiosSetup" onchange="showAdvPowerDlgChange()">Configuración del BIOS</label><br></div>
|
|
<div id="d24dForceProgressEvents"><label><input type="checkbox" id="d24ForceProgressEvents" onchange="showAdvPowerDlgChange()">Forzar eventos de progreso</label><br></div>
|
|
<div id="d24dLockPowerButton"><label><input type="checkbox" id="d24LockPowerButton" onchange="showAdvPowerDlgChange()">Botón de encendido de bloqueo</label><br></div>
|
|
<div id="d24dLockResetButton"><label><input type="checkbox" id="d24LockResetButton" onchange="showAdvPowerDlgChange()">Botón de reinicio de bloqueo</label><br></div>
|
|
<div id="d24dLockSleepButton"><label><input type="checkbox" id="d24LockSleepButton" onchange="showAdvPowerDlgChange()">Botón de bloqueo</label><br></div>
|
|
<div id="d24dLockKeyboard"><label><input type="checkbox" id="d24LockKeyboard" onchange="showAdvPowerDlgChange()">Bloqueo de teclado</label><br></div>
|
|
<div id="d24dUserPasswordBypass"><label><input type="checkbox" id="d24UserPasswordBypass" onchange="showAdvPowerDlgChange()">BIOS bypass de contraseña</label><br></div>
|
|
<div id="d24dReflashBios"><label><input type="checkbox" id="d24ReflashBios" onchange="showAdvPowerDlgChange()">Reflash BIOS</label><br></div>
|
|
<div id="d24dSafeMode"><label><input type="checkbox" id="d24SafeMode" onchange="showAdvPowerDlgChange()">Modo seguro</label><br></div>
|
|
<div id="d24dUseIDER"><label><input type="checkbox" id="d24UseIDER" onchange="showAdvPowerDlgChange()">Use IDER</label><br></div>
|
|
<div id="d24dSerialOverLan"><label><input type="checkbox" id="d24SerialOverLan" onchange="showAdvPowerDlgChange()">Serie sobre LAN</label><br></div>
|
|
<div id="d24dSecureErase"><label><input type="checkbox" id="d24SecureErase" onchange="showAdvPowerDlgChange()">Borrado seguro remoto Intel®</label><br></div>
|
|
<div id="d24dPlatformErase"><label><input type="checkbox" id="d24PlatformErase" onchange="showAdvPowerDlgChange()">Remote Platform Erase</label><br></div>
|
|
<div id="d24dFirmwareReset"><label><input type="checkbox" id="d24FirmwareReset" onchange="showAdvPowerDlgChange()">Clear Intel® ME Settings</label><br></div>
|
|
</div>
|
|
<div>Configuración de arranque</div>
|
|
</div>
|
|
<div style="height:26px">
|
|
<select id="idx_d24ForceBootDevice" style="float:right;width:200px" onchange="showAdvPowerDlgChange()">
|
|
<option value="0">Ninguna</option>
|
|
<option id="ForceDVDBootOption" value="1">Forzar arranque de CD / DVD</option>
|
|
<option id="ForcePXEBootOption" value="2">Arranque Force PXE</option>
|
|
<option id="ForceHDBootOption" value="3">Forzar arranque de disco duro</option>
|
|
<option id="ForceDiagBootOption" value="4">Arranque de diagnóstico de fuerza</option>
|
|
<!-- ###BEGIN###{PowerControl-OneClick} -->
|
|
<option id="ForceUEFIBootOption" value="5">Force OCR UEFI Boot Option</option>
|
|
<option id="ForceHttpBootOption" value="6">Force OCR UEFI HTTPS Boot (.iso)</option>
|
|
<option id="ForceHttpUrlBootOption" value="7">Force OCR UEFI HTTPS Boot (url)</option>
|
|
<!-- ###END###{PowerControl-OneClick} -->
|
|
</select>
|
|
<div>Fuente de arranque</div>
|
|
</div>
|
|
<div id="idx_d24bootSource" style="height:26px">
|
|
<select id="idx_d24BootMediaIndex" style="float:right;width:200px" onchange="showAdvPowerDlgChange()">
|
|
<option value="0">Ninguna</option>
|
|
<option value="1">Índice 1</option>
|
|
<option value="2">Índice 2</option>
|
|
<option value="3">Índice 3</option>
|
|
<option value="3">Índice 4</option>
|
|
</select>
|
|
<div>Boot Media</div>
|
|
</div>
|
|
<!-- ###BEGIN###{PowerControl-OneClick} -->
|
|
<div id="idx_d24customBootSource" style="height:26px;display:none">
|
|
<select id="idx_d24customBootMediaIndex" onchange="showAdvPowerDlgChange()" style="float:right;width:200px"></select>
|
|
<div>Boot Media</div>
|
|
</div>
|
|
<div id="idx_d24diskImage" style="height:26px">
|
|
<input id="idx_d24ocrBootFile" type="file" onchange="showAdvPowerDlgChange()" style="float:right;width:200px" accept=".iso">
|
|
<div>Boot Image</div>
|
|
</div>
|
|
<div id="idx_d24diskImageUrl" style="height:26px">
|
|
<input id="idx_d24ocrBootUrl" type="text" onchange="showAdvPowerDlgChange()" onkeyup="showAdvPowerDlgChange()" placeholder="https://" style="float:right;width:200px">
|
|
<div>Boot URL</div>
|
|
</div>
|
|
<!-- ###END###{PowerControl-OneClick} -->
|
|
<div style="height:26px" id="idd_d24IDERBootDevice">
|
|
<select id="idx_d24IDERBootDevice" style="float:right;width:200px" onchange="showAdvPowerDlgChange()">
|
|
<option value="0">Arrancar en disquete</option>
|
|
<option value="1">Arrancar en CDROM</option>
|
|
</select>
|
|
<div>Dispositivo de arranque IDER</div>
|
|
</div>
|
|
<div style="height:26px">
|
|
<select id="idx_d24Verbocity" style="float:right;width:200px" onchange="showAdvPowerDlgChange()">
|
|
<option value="0">Sistema por defecto</option>
|
|
<option id="idx_d24Verbocity1" value="1">Tranquilo</option>
|
|
<option id="idx_d24Verbocity2" value="2">Verboso</option>
|
|
<option id="idx_d24Verbocity3" value="3">Pantalla en blanco</option>
|
|
</select>
|
|
<div>Verbocidad</div>
|
|
</div>
|
|
<div style="height:26px" id="idd_d24RSEPass">
|
|
<div style="float:right;width:200px"><input type="password" id="d24rsepass" maxlength="32" style="float:right;width:100%"></div>
|
|
<div>Contraseña RSE</div>
|
|
</div>
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<div id="idd_d24RSEPassTlsWarn"><div style="color:red"><b>ADVERTENCIA:</b> TLS no se utiliza, la contraseña se enviará en claro.</div></div>
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
</div>
|
|
<!-- ###END###{PowerControl-Advanced} -->
|
|
<!-- ###BEGIN###{Alarms} -->
|
|
<div id="dialog25" style="margin:auto;margin:3px">
|
|
<div style="text-align:left">
|
|
<div style="height:26px;margin-top:4px"><input id="d25alarm_name" style="float:right;width:180px" maxlength="32" onkeyup="alertDialogUpdate()"><div style="padding-top:4px">Nombre de alarma</div></div>
|
|
<div style="height:26px;margin-top:4px">
|
|
<div style="float:right">
|
|
<input id="d25alarm_sdate" style="width:180px" maxlength="10" onkeyup="alertDialogUpdate()" onkeypress="return numbersOnly(event,45)">
|
|
</div>
|
|
<div style="padding-top:4px">Fecha de activación (año-mes-día)</div>
|
|
</div>
|
|
<div style="height:26px;margin-top:4px">
|
|
<div style="float:right">
|
|
<input id="d25alarm_stime" style="width:180px" maxlength="10" onkeyup="alertDialogUpdate()" onkeypress="return numbersOnly(event,58)">
|
|
</div>
|
|
<div style="padding-top:4px">Tiempo de activación (hora: min: seg)</div>
|
|
</div>
|
|
<div style="height:26px;margin-top:4px">
|
|
<div style="float:right">
|
|
<input id="d25alarm_interval" style="width:180px" maxlength="10" onkeyup="alertDialogUpdate()" onkeypress="return numbersOnly(event,45)">
|
|
</div>
|
|
<div style="padding-top:4px">Intervalo (días-horas-min)</div>
|
|
</div>
|
|
<div style="height:26px;margin-top:4px">
|
|
<div style="float:right;width:180px">
|
|
<select id="d25alarm_doc" style="width:100%" onchange="showAdvPowerDlgChange()">
|
|
<option value="0">Mantener alarma</option>
|
|
<option value="1">Eliminar al finalizar</option>
|
|
</select>
|
|
</div>
|
|
<div style="padding-top:4px">Despues de despertar</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- ###END###{Alarms} -->
|
|
<div id="dialog26" style="margin:auto;margin:3px">
|
|
<div id="d26rpediv">
|
|
<div>Remote Platform Erase (RPE)</div>
|
|
<label><input type="radio" name="d26b" id="idx_d26rpe1" value="2">Habilitado<br></label>
|
|
<label><input type="radio" name="d26b" id="idx_d26rpe0" value="0">Discapacitado<br></label>
|
|
<hr>
|
|
</div>
|
|
<div>One One Click Recovery (OCR)</div>
|
|
<label><input type="radio" name="d26a" id="idx_d26ocr1" value="1">Habilitado<br></label>
|
|
<label><input type="radio" name="d26a" id="idx_d26ocr0" value="0">Discapacitado<br></label>
|
|
</div>
|
|
</div>
|
|
<div style="padding:10px;margin-bottom:4px">
|
|
<input id="idx_dlgCancelButton" type="button" value="Cancelar" style="float:right;width:80px;margin-left:5px" onclick="dialogclose(0)">
|
|
<input id="idx_dlgOkButton" type="button" value="Okay" style="float:right;width:80px" onclick="dialogclose(1)">
|
|
<div style="height:25px"><input id="idx_dlgDeleteButton" type="button" value="Eliminar" style="width:80px;display:none" onclick="dialogclose(2)"></div>
|
|
</div>
|
|
</div>
|
|
<!-- ###BEGIN###{ContextMenus} -->
|
|
<div id="contextMenu" class="contextMenu" style="display:none"></div>
|
|
<!-- ###END###{ContextMenus} -->
|
|
<!-- ###BEGIN###{Mode-NodeWebkit} -->
|
|
<!-- ###END###{Mode-NodeWebkit} -->
|
|
<!-- ###BEGIN###{PowerControl} -->
|
|
<!-- ###END###{PowerControl} -->
|
|
<script type="text/javascript">
|
|
// ###BEGIN###{!Look-BrandedCommander}
|
|
var version = '0.9.3';
|
|
// ###END###{!Look-BrandedCommander}
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
var version = '1.2.0';
|
|
// ###END###{Look-BrandedCommander}
|
|
var urlvars = {};
|
|
var amtstack;
|
|
var wsstack = null;
|
|
// ###BEGIN###{WsmanBrowser}
|
|
var AllWsman = 'AMT_8021xCredentialContext,AMT_8021XProfile,AMT_ActiveFilterStatistics,AMT_AgentPresenceCapabilities,AMT_AgentPresenceInterfacePolicy,AMT_AgentPresenceService,AMT_AgentPresenceWatchdog,AMT_AgentPresenceWatchdogAction,AMT_AlarmClockService,IPS_AlarmClockOccurrence,AMT_AssetTable,AMT_AssetTableService,AMT_AuditLog,AMT_AuditPolicyRule,AMT_AuthorizationService,AMT_BootCapabilities,AMT_BootSettingData,AMT_ComplexFilterEntryBase,AMT_CRL,AMT_CryptographicCapabilities,AMT_EACCredentialContext,AMT_EndpointAccessControlService,AMT_EnvironmentDetectionInterfacePolicy,AMT_EnvironmentDetectionSettingData,AMT_EthernetPortSettings,AMT_EventLogEntry,AMT_EventManagerService,AMT_EventSubscriber,AMT_FilterEntryBase,AMT_FilterInSystemDefensePolicy,AMT_GeneralSettings,AMT_GeneralSystemDefenseCapabilities,AMT_Hdr8021Filter,AMT_HeuristicPacketFilterInterfacePolicy,AMT_HeuristicPacketFilterSettings,AMT_HeuristicPacketFilterStatistics,AMT_InterfacePolicy,AMT_IPHeadersFilter,AMT_KerberosSettingData,AMT_ManagementPresenceRemoteSAP,AMT_MessageLog,AMT_MPSUsernamePassword,AMT_NetworkFilter,AMT_NetworkPortDefaultSystemDefensePolicy,AMT_NetworkPortSystemDefenseCapabilities,AMT_NetworkPortSystemDefensePolicy,AMT_PCIDevice,AMT_PETCapabilities,AMT_PETFilterForTarget,AMT_PETFilterSetting,AMT_ProvisioningCertificateHash,AMT_PublicKeyCertificate,AMT_PublicKeyManagementCapabilities,AMT_PublicKeyManagementService,AMT_PublicPrivateKeyPair,AMT_RedirectionService,AMT_RemoteAccessCapabilities,AMT_RemoteAccessCredentialContext,AMT_RemoteAccessPolicyAppliesToMPS,AMT_RemoteAccessPolicyRule,AMT_RemoteAccessService,AMT_SetupAndConfigurationService,AMT_SNMPEventSubscriber,AMT_StateTransitionCondition,AMT_SystemDefensePolicy,AMT_SystemDefensePolicyInService,AMT_SystemDefenseService,AMT_SystemPowerScheme,AMT_ThirdPartyDataStorageAdministrationService,AMT_ThirdPartyDataStorageService,AMT_TimeSynchronizationService,AMT_TLSCredentialContext,AMT_TLSProtocolEndpoint,AMT_TLSProtocolEndpointCollection,AMT_TLSSettingData,AMT_TrapTargetForService,AMT_UserInitiatedConnectionService,AMT_WebUIService,AMT_WiFiPortConfigurationService,CIM_AbstractIndicationSubscription,CIM_Account,CIM_AccountManagementCapabilities,CIM_AccountManagementService,CIM_AccountOnSystem,CIM_AdminDomain,CIM_AlertIndication,CIM_AssignedIdentity,CIM_AssociatedPowerManagementService,CIM_AuthenticationService,CIM_AuthorizationService,CIM_Battery,CIM_BIOSElement,CIM_BIOSFeature,CIM_BIOSFeatureBIOSElements,CIM_BootConfigSetting,CIM_BootService,CIM_BootSettingData,CIM_BootSourceSetting,CIM_Capabilities,CIM_Card,CIM_Chassis,CIM_Chip,CIM_Collection,CIM_Component,CIM_ComputerSystem,CIM_ComputerSystemPackage,CIM_ConcreteComponent,CIM_ConcreteDependency,CIM_Controller,CIM_CoolingDevice,CIM_Credential,CIM_CredentialContext,CIM_CredentialManagementService,CIM_Dependency,CIM_DeviceSAPImplementation,CIM_ElementCapabilities,CIM_ElementConformsToProfile,CIM_ElementLocation,CIM_ElementSettingData,CIM_ElementSoftwareIdentity,CIM_ElementStatisticalData,CIM_EnabledLogicalElement,CIM_EnabledLogicalElementCapabilities,CIM_EthernetPort,CIM_Fan,CIM_FilterCollection,CIM_FilterCollectionSubscription,CIM_HostedAccessPoint,CIM_HostedDependency,CIM_HostedService,CIM_Identity,CIM_IEEE8021xCapabilities,CIM_IEEE8021xSettings,CIM_Indication,CIM_IndicationService,CIM_InstalledSoftwareIdentity,CIM_KVMRedirectionSAP,CIM_LANEndpoint,CIM_ListenerDestination,CIM_ListenerDestinationWSManagement,CIM_Location,CIM_Log,CIM_LogEntry,CIM_LogicalDevice,CIM_LogicalElement,CIM_LogicalPort,CIM_LogicalPortCapabilities,CIM_LogManagesRecord,CIM_ManagedCredential,CIM_ManagedElement,CIM_ManagedSystemElement,CIM_MediaAccessDevice,CIM_MemberOfCollection,CIM_Memory,CIM_MessageLog,CIM_NetworkPort,CIM_NetworkPortCapabilities,CIM_NetworkPortConfigurationService,CIM_OrderedComponent,CIM_OwningCollectionElement,CIM_OwningJobElement,CIM_PCIController,CIM_PhysicalComponent,CIM_PhysicalElement,CIM_PhysicalElementLocation,CIM_PhysicalFrame,CIM_PhysicalMemory,CIM_PhysicalPackage,CIM_Policy,CIM_PolicyAction,CIM_PolicyCondition,CIM_PolicyInSystem,CIM_PolicyRule,CIM_PolicyRuleInSystem,CIM_PolicySet,CIM_PolicySetAppliesToElement,CIM_PolicySetInSystem,CIM_PowerManagementCapabilities,CIM_PowerManagementService,CIM_PowerSupply,CIM_Privilege,CIM_PrivilegeManagementCapabilities,CIM_PrivilegeManagementService,CIM_ProcessIndication,CIM_Processor,CIM_ProtocolEndpoint,CIM_ProvidesServiceToElement,CIM_Realizes,CIM_RecordForLog,CIM_RecordLog,CIM_RedirectionService,CIM_ReferencedProfile,CIM_RegisteredProfile,CIM_RemoteAccessAvailableToElement,CIM_RemoteIdentity,CIM_RemotePort,CIM_RemoteServiceAccessPoint,CIM_Role,CIM_RoleBasedAuthorizationService,CIM_RoleBasedManagementCapabilities,CIM_RoleLimitedToTarget,CIM_SAPAvailableForElement,CIM_SecurityService,CIM_Sensor,CIM_Service,CIM_ServiceAccessBySAP,CIM_ServiceAccessPoint,CIM_ServiceAffectsElement,CIM_ServiceAvailableToElement,CIM_ServiceSAPDependency,CIM_ServiceServiceDependency,CIM_SettingData,CIM_SharedCredential,CIM_SoftwareElement,CIM_SoftwareFeature,CIM_SoftwareFeatureSoftwareElements,CIM_SoftwareIdentity,CIM_StatisticalData,CIM_StorageExtent,CIM_System,CIM_SystemBIOS,CIM_SystemComponent,CIM_SystemDevice,CIM_SystemPackaging,CIM_UseOfLog,CIM_Watchdog,CIM_WiFiEndpoint,CIM_WiFiEndpointCapabilities,CIM_WiFiEndpointSettings,CIM_WiFiPort,CIM_WiFiPortCapabilities,IPS_AdminProvisioningRecord,IPS_ClientProvisioningRecord,IPS_HostBasedSetupService,IPS_HostIPSettings,IPS_HTTPProxyService,IPS_HTTPProxyAccessPoint,IPS_IderSessionUsingPort,IPS_IPv6PortSettings,IPS_KVMRedirectionSettingData,IPS_KvmSessionUsingPort,IPS_ManualProvisioningRecord,IPS_OptInService,IPS_PowerManagementService,IPS_ProvisioningAuditRecord,IPS_ProvisioningRecordLog,IPS_RasSessionUsingPort,IPS_ScreenConfigurationService,IPS_ScreenSettingData,IPS_SecIOService,IPS_SessionUsingPort,IPS_SolSessionUsingPort,IPS_TLSProvisioningRecord,IPS_WatchDogAction'.split(',');
|
|
// ###END###{WsmanBrowser}
|
|
var disconnecturl = null;
|
|
// ###BEGIN###{Terminal}
|
|
var terminal;
|
|
// ###END###{Terminal}
|
|
var currentView = 0;
|
|
var LoadingHtml = '<div style=text-align:center;padding-top:20px>' + "Cargando..." + '<div>';
|
|
var amtversion = 0;
|
|
var amtversionmin = 0;
|
|
var amtFirstPull = 0; // Bitmask, Set this when the first pull request is made on a device: 1 = HardwareInfo, 2 = WirelessInfo, 4 = SystemDefense, 8 = Storage, 16 = EventLog, 32 = AuditLog
|
|
// ###BEGIN###{NetworkSettings}
|
|
var amtwirelessif = -1; // Set to the interface index for the wireless interface, -1 if no wireless.
|
|
// ###END###{NetworkSettings}
|
|
// ###BEGIN###{Desktop}
|
|
var desktop;
|
|
var desktopsettings = { encflags: 1, showfocus: false, showmouse: true, showcad: true, limitFrameRate: false, noMouseRotate: false, decimationMode: 2 };
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
var currentMeshNode = null;
|
|
// ###END###{Mode-MeshCentral2}
|
|
var webcompilerfeatures = [/*###WEBCOMPILERFEATURES###*/];
|
|
var StatusStrs = ["Desconectado", "Conectando ...", "Preparar...", "Conectado"];
|
|
// ###BEGIN###{Scripting}
|
|
var scriptstate;
|
|
// ###END###{Scripting}
|
|
// ###BEGIN###{USBSetup}
|
|
var setupbin;
|
|
var selectedRecord = 0;
|
|
var selectedVariable = 0;
|
|
// ###END###{USBSetup}
|
|
// ###BEGIN###{!Mode-MeshCentral2}
|
|
var amtPowerPollTimer = null;
|
|
// ###END###{!Mode-MeshCentral2}
|
|
// ###BEGIN###{Mode-LMS}
|
|
var lms = null;
|
|
// ###END###{Mode-LMS}
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var kerberos;
|
|
try { kerberos = require('krb-ticket'); } catch (e) { console.log("No se puede configurar kerberos"); }
|
|
if (!kerberos || kerberos.initialize() != 0) { kerberos = null; }
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
var kerberos = null;
|
|
// ###END###{!Mode-NodeWebkit}
|
|
var filterFocus = false;
|
|
// ###END###{ComputerSelector-Local}
|
|
var t, t2, rsepass = null; // Global temporary variable
|
|
// ###BEGIN###{MeshServerConnect}
|
|
var meshCentralServer = null;
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
var webserver = null;
|
|
// ###END###{PowerControl-OneClick}
|
|
// ###END###{PowerControl-Advanced}
|
|
// ###BEGIN###{DesktopClipboard}
|
|
var xxKvmClipEnc = null;
|
|
var xxKvmClipVal = null;
|
|
// ###END###{DesktopClipboard}
|
|
|
|
function startup() {
|
|
// This is a bit freeky, but all HTML input elements are just going to be accessible directly.
|
|
var allelements = document.getElementsByTagName('input');
|
|
for (t = 0; t < allelements.length; t++) { if (allelements[t].id) { window[allelements[t].id] = allelements[t]; } }
|
|
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
urlvars = getUrlVars();
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
|
|
// Move things around to make space for the left-side toolbar
|
|
QS('id_computerSelector').left = '52px';
|
|
QS('id_computerListParent').left = '52px';
|
|
QS('id_certManagerPanel').left = '52px';
|
|
QS('id_certManagerPanel2').left = '52px';
|
|
QS('id_usbSetupPanel').left = '52px';
|
|
QS('id_usbSetupPanel2').left = '52px';
|
|
// ###BEGIN###{SessionRecording}
|
|
QS('id_sessionPlayerPanel').left = '52px';
|
|
// ###END###{SessionRecording}
|
|
|
|
// Parse the runtime arguments
|
|
urlvars = getUrlVars();
|
|
var argv = require('nw.gui').App.argv;
|
|
for (var i in argv) {
|
|
if (argv[i].substring(0,1) == '-') {
|
|
var j = argv[i].indexOf(':');
|
|
if (j == -1) {
|
|
urlvars[argv[i].substring(1)] = 1;
|
|
} else {
|
|
urlvars[argv[i].substring(1, j)] = argv[i].substring(j + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
// If we are in NodeWebkit, check if we need to start a output log.
|
|
if (urlvars.logfile && (typeof urlvars.logfile == 'string')) {
|
|
g_logFile = require('fs').createWriteStream(urlvars.logfile, { flags: 'a' }); // Or 'w' to truncate the file every time the process starts.
|
|
g_logStdout = process.stdout;
|
|
console.logEx = console.log;
|
|
console.log = function () {
|
|
if (arguments.length == 1) console.logEx(arguments[0]);
|
|
if (arguments.length == 2) console.logEx(arguments[0], arguments[1]);
|
|
if (arguments.length == 3) console.logEx(arguments[0], arguments[1], arguments[2]);
|
|
if (arguments.length == 4) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3]);
|
|
if (arguments.length == 5) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
|
|
if (arguments.length == 6) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
|
|
if (arguments.length == 7) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]);
|
|
if (arguments.length == 8) console.logEx(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7]);
|
|
g_logFile.write(require('util').format.apply(null, arguments) + '\r\n');
|
|
//g_logStdout.write(require('util').format.apply(null, arguments) + '\r\n'); //console.errorEx(arguments);
|
|
}
|
|
console.errorEx = console.error;
|
|
console.error = console.log;
|
|
console.log('--- LOG START: ' + new Date() + ' ---');
|
|
}
|
|
|
|
// If we are in NodeWebkit, check if we need to display the console window
|
|
if (urlvars['debug'] == 1) { require('nw.gui').Window.get().showDevTools(); }
|
|
|
|
// Prepend 'script' and 'list' with working directory if set and ':' is not in the string. This covers the case where self-extracting Commander has working directory set incorrectly.
|
|
if (urlvars['script'] && (urlvars['script'].indexOf(':') < 0)) { urlvars['script'] = require('path').dirname(process.execPath) + '\\' + urlvars['script']; }
|
|
if (urlvars['list'] && (urlvars['list'].indexOf(':') < 0)) { urlvars['list'] = require('path').dirname(process.execPath) + '\\' + urlvars['list']; }
|
|
|
|
// Setup the TLS security mode
|
|
try {
|
|
NW_TlsSecurityMode = parseInt(localStorage.getItem('TlsSecurityMode') ? localStorage.getItem('TlsSecurityMode') : '1');
|
|
NW_SkipTlsHostnameCheck = parseInt(localStorage.getItem('SkipTlsHostnameCheck') ? localStorage.getItem('SkipTlsHostnameCheck') : '0');
|
|
} catch (ex) {
|
|
NW_TlsSecurityMode = '1';
|
|
NW_SkipTlsHostnameCheck = '0';
|
|
}
|
|
if (urlvars['tlssecurity']) { NW_TlsSecurityMode = parseInt(urlvars['tlssecurity']); }
|
|
if (urlvars['ignoretls']) { NW_TlsSecurityMode = 0; }
|
|
if (urlvars['skiptlshostcheck']) { NW_SkipTlsHostnameCheck = parseInt(urlvars['skiptlshostcheck']); }
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{DesktopClipboard}
|
|
if (urlvars['kvmclip']) { QV('id_DeskKvmClipButton', true); }
|
|
// ###END###{DesktopClipboard}
|
|
|
|
// ###BEGIN###{ContextMenus}
|
|
document.onclick = function (e) { hideContextMenu(); }
|
|
// ###END###{ContextMenus}
|
|
|
|
// ###BEGIN###{SessionRecording}
|
|
srec_cleanup();
|
|
Q('srec_PlaySpeed').value = 1;
|
|
// ###END###{SessionRecording}
|
|
|
|
// ###BEGIN###{Mode-LMS}
|
|
// Setup LMS
|
|
lms = CreateLmsControl();
|
|
lms.onStateChanged = lmsChangedState;
|
|
lms.onData = lmsOnData;
|
|
lms.Start();
|
|
QH('id_lmsData', LoadingHtml);
|
|
QH('id_lmsData', '');
|
|
QH('id_computername', 'Configuration Console v' + version);
|
|
go(101);
|
|
lmsRefresh();
|
|
// ###END###{Mode-LMS}
|
|
|
|
// ###BEGIN###{WsmanBrowser}
|
|
// Add all WSMAN objects to WSMAN browser
|
|
for (var w in AllWsman) { var option = document.createElement('option'); option.text = AllWsman[w]; option.id = 'WSB-' + AllWsman[w]; Q('id_QuerySelect').add(option); }
|
|
// ###END###{WsmanBrowser}
|
|
|
|
// ###BEGIN###{Desktop}
|
|
// Setup the remote desktop
|
|
desktop = CreateAmtRedirect(CreateAmtRemoteDesktop('Desk', Q('id_mainarea')));
|
|
desktop.onStateChanged = onDesktopStateChange;
|
|
QE('idx_connectbutton1', true);
|
|
try { t = localStorage.getItem('desktopsettings'); } catch (ex) {}
|
|
if (t) { desktopsettings = JSON.parse(t); }
|
|
applyDesktopSettings();
|
|
var s = '';
|
|
//for (var c = 1; c < 13; c++) s += '<option value="' + (0xffbd + c) + '">F' + c +;
|
|
//QH('specialkeylist', s);
|
|
// ###END###{Desktop}
|
|
|
|
// ###BEGIN###{Terminal}
|
|
// Setup the terminal
|
|
terminal = CreateAmtRedirect(CreateAmtRemoteTerminal('Term'));
|
|
terminal.onStateChanged = onTerminalStateChange;
|
|
// ###BEGIN###{Terminal-Enumation-All}
|
|
Q('id_ttypebutton').value = terminalEmulations[terminal.m.terminalEmulation];
|
|
// ###END###{Terminal-Enumation-All}
|
|
Q('id_tcrbutton').value = (terminal.m.lineFeed == '\r\n')?"CR + LF":"LF";
|
|
|
|
QE('idx_connectbutton2', true);
|
|
|
|
// Setup Terminal drag & drop
|
|
Q('p13').addEventListener('dragover', haltEvent, false);
|
|
Q('p13').addEventListener('dragleave', haltEvent, false);
|
|
Q('p13').addEventListener('drop', terminal_FileSelectHandler, false);
|
|
// ###END###{Terminal}
|
|
|
|
// Main drag & drop
|
|
document.addEventListener('dragover', haltEvent, false);
|
|
document.addEventListener('dragleave', haltEvent, false);
|
|
document.addEventListener('drop', documentFileSelectHandler, false);
|
|
|
|
// ###BEGIN###{Certificates}
|
|
// Setup Terminal drag & drop
|
|
Q('p16').addEventListener('dragover', haltEvent, false);
|
|
Q('p16').addEventListener('dragleave', haltEvent, false);
|
|
Q('p16').addEventListener('drop', cert_FileSelectHandler, false);
|
|
// ###END###{Certificates}
|
|
|
|
// ###BEGIN###{CertificateManager}
|
|
// Setup Certificate Manager drag & drop
|
|
Q('id_certManagerPanel').addEventListener('dragover', haltEvent, false);
|
|
Q('id_certManagerPanel').addEventListener('dragleave', haltEvent, false);
|
|
Q('id_certManagerPanel').addEventListener('drop', cert_importCertOk2, false);
|
|
// ###END###{CertificateManager}
|
|
|
|
// ###BEGIN###{CertificateManager}
|
|
cert_loadCertificates();
|
|
cert_updateCertificateList();
|
|
// ###END###{CertificateManager}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
// ###BEGIN###{Desktop}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
if (!Q('Desk')['toBlob']) { QV('idx_deskSaveBtn', false); }// On some browsers like IE, we can't save screen shots. Hide the sceeenshot/capture buttons.
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###END###{Desktop}
|
|
// ###END###{FileSaver}
|
|
|
|
// ###BEGIN###{ComputerSelector}
|
|
|
|
if (!urlvars['host']) { go(101); }
|
|
QH('id_computername', format("Consola de administración remota v{0}", version));
|
|
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
if (urlvars['host']) {
|
|
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
|
|
// If host is set to a hostname, connect directly to that computer
|
|
var xuser = urlvars['user'];
|
|
if (!xuser) xuser = '*'; // If user not set, default to * and use Kerberos
|
|
var xpass = urlvars['pass'];
|
|
if (!xpass) xpass = ''; // If password not set, default to blank.
|
|
var xtls = 0;
|
|
if (urlvars['tls'] == 1) { xtls = 1; }
|
|
|
|
currentcomputer = { 'host': urlvars['host'], 'host': urlvars['host'], 'user': xuser, 'pass': xpass, 'tls': xtls, 'h': Math.random() };
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
currentcomputer['tlscerthash'] = getCertPinning(urlvars['host']); // If we have a pinned TLS cert, add it here.
|
|
// ###END###{Mode-NodeWebkit}
|
|
disconnecturl = urlvars['disconnecturl'];
|
|
if (!disconnecturl) disconnecturl = 'none';
|
|
if (disconnecturl == 'none') QV('disconnectButton', false);
|
|
if (disconnecturl == 'close') Q('disconnectButton').value = 'Close';
|
|
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
|
|
if ((currentcomputer['user'] == '*') || (currentcomputer['pass'] != '')) {
|
|
// Don't prompt the user for password, just connect. This is Kerberos or password already provided.
|
|
connect(ports.host, ports.http, currentcomputer['user'], currentcomputer['pass'], currentcomputer['tls']);
|
|
} else {
|
|
// Prompt the user for digest password.
|
|
computerlist = [currentcomputer];
|
|
updateComputerList();
|
|
computerConnect(null, currentcomputer.h);
|
|
}
|
|
|
|
// ###END###{!ComputerSelector-Local-ScriptOnly}
|
|
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
|
|
updateComputerList();
|
|
// ###END###{ComputerSelector-Local-ScriptOnly}
|
|
}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
else if (urlvars['connect']) { loadServerComputer(); }
|
|
// ###END###{!Mode-NodeWebkit}
|
|
else {
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (urlvars['list']) {
|
|
// Read the computers from a file list
|
|
var listok = 0;
|
|
try {
|
|
var ctext = require('fs').readFileSync(urlvars['list'], 'utf8');
|
|
if ((ctext.length > 2) && (ctext.charCodeAt(0) == 65533) && (ctext.charCodeAt(1) == 65533)) { // This is unicode detection
|
|
ctext = require('fs').readFileSync(urlvars['list'], 'utf16le');
|
|
if ((ctext.length > 1) && (ctext.charCodeAt(0) == 65279)) { ctext = ctext.substring(1); }
|
|
}
|
|
if (ctext) {
|
|
computerlist = JSON.parse(ctext);
|
|
if (computerlist.computers) { computerlist = computerlist.computers; }
|
|
var pins = getCertPinnings();
|
|
for (var i in computerlist) {
|
|
computerlist[i].checked = false;
|
|
if (!computerlist[i]['h']) computerlist[i]['h'] = Math.random(); // If 'h' handle is not present, create one.
|
|
if (!computerlist[i]['tls']) computerlist[i]['tls'] = 0; // If TLS is not present, assume 0.
|
|
if (!computerlist[i]['host'] && computerlist[i]['fqdn']) computerlist[i]['host'] = computerlist[i]['fqdn'];
|
|
if (!computerlist[i]['pass'] == null) computerlist[i]['pass'] = '';
|
|
if (computerlist[i]['fqdn']) delete computerlist[i]['fqdn'];
|
|
|
|
// Add stored certificate pinning.
|
|
if ((computerlist[i]['tlscerthash'] == null) && (pins[computerlist[i]['host']] != null)) { computerlist[i]['tlscerthash'] = pins[computerlist[i]['host']]; }
|
|
delete computerlist[i]['tlscert2'];
|
|
delete computerlist[i]['tlscerthash2'];
|
|
}
|
|
listok = computerlist.length;
|
|
if (listok > 0) updateComputerList();
|
|
}
|
|
} catch (e) { messagebox("Lista de computadoras", "Archivo de lista inválido: " + e) }
|
|
// Run a script on all computers
|
|
if (urlvars['script'] && listok > 0) {
|
|
// Select all computers
|
|
for (var i in computerlist) { Q('SJ-' + computerlist[i]['h']).checked = true; }
|
|
// Run the script
|
|
try {
|
|
var data = require('fs').readFileSync(urlvars['script'], 'utf8');
|
|
if (data) { mscript_onScriptRead( { target: { result: data }}, 1 ); }
|
|
} catch (e) { messagebox("Ejecutar guión", "Archivo de script no válido") }
|
|
}
|
|
} else {
|
|
// Setup the computer selector
|
|
loadComputers();
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
// Setup the computer selector
|
|
loadComputers();
|
|
// ###END###{!Mode-NodeWebkit}
|
|
}
|
|
// ###END###{ComputerSelector-Local}
|
|
|
|
// ###BEGIN###{ComputerSelector-Remote}
|
|
// Load the list of computers from the server
|
|
loadServerComputerList();
|
|
// ###END###{ComputerSelector-Remote}
|
|
|
|
// ###END###{ComputerSelector}
|
|
|
|
// ###BEGIN###{Mode-Firmware}
|
|
connect('/wsman');
|
|
// ###END###{Mode-Firmware}
|
|
|
|
// ###BEGIN###{USBSetup}
|
|
usb_displaySetupBin();
|
|
|
|
// Add all possible variable types to dialog 16
|
|
var options = '';
|
|
for (var i in AmtSetupBinVarIds) { for (var j in AmtSetupBinVarIds[i]) { options += '<option value="' + i + '-' + j + '">' + AmtSetupBinVarIds[i][j][1] } }
|
|
QH('d16type', options);
|
|
// ###END###{USBSetup}
|
|
|
|
document.onkeyup = handleKeyUp;
|
|
document.onkeydown = handleKeyDown;
|
|
document.onkeypress = handleKeyPress;
|
|
window.onresize = center;
|
|
center();
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_WindowTitle = require('nw.gui').Window.get().title;
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{Scripting-Editor}
|
|
// ###BEGIN###{!Mode-Firmware}
|
|
scriptLoadStartingBlocks();
|
|
// ###END###{!Mode-Firmware}
|
|
// ###END###{Scripting-Editor}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_AutoUpdateCheck();
|
|
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
|
|
if (urlvars['help'] || urlvars['?']) { messagebox("Opciones de línea de comandante", '<div style=text-align:left><b>-host:[hostname]</b>, ' + "Nombre de host o IP de Intel® AMT" + '<br/><b>-user:[username]</b>, ' + "Nombre de usuario de inicio de sesión resumido" + '<br/><b>-pass:[password]</b>, ' + "Contraseña de inicio de sesión resumida" + '<br/><b>-tls</b>, ' + "Conéctese utilizando la seguridad TLS" + '<br/><b>-kvm</b>, ' + "Una vez conectado, vaya al escritorio remoto" + '<br/><b>-kvmfull</b>, ' + "Una vez conectado, vaya al escritorio remoto de pantalla completa" + '<br/><b>-kvmonly</b>, ' + "Realizar solo escritorio remoto de pantalla completa" + '<br/><b>-sol</b>, ' + "Una vez conectado, ve a la terminal" + '<br/><b>-script:[file]</b>, ' + "Ejecuta un script" + '<br/><b>-autoexit</b>, ' + "Salir después de que el script esté hecho" + '<br/><b>-ignoretls</b>, ' + "No verifique el certificado Intel® AMT TLS" + '<br/></div>'); }
|
|
// ###END###{!ComputerSelector-Local-ScriptOnly}
|
|
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
|
|
if (urlvars['help'] || urlvars['?']) { messagebox("Opciones de línea de comandante", '<div style=text-align:left><b>-list:[listfile]</b>, ' + "List of computers to run a script on" + '<br/><b>-script:[file]</b>, ' + "Ejecuta un script" + '<br/><b>-autoexit</b>, ' + "Exit after all scripts are done" + '<br/><b>-ignoretls</b>, ' + "No verifique el certificado Intel® AMT TLS" + '<br/></div>'); }
|
|
// ###END###{ComputerSelector-Local-ScriptOnly}
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{DesktopInbandFiles}
|
|
// Setup upload drag & drop
|
|
Q('p24filetable').addEventListener('drop', p24fileDragDrop, false);
|
|
Q('p24filetable').addEventListener('dragover', p24fileDragOver, false);
|
|
Q('p24filetable').addEventListener('dragleave', p24fileDragLeave, false);
|
|
// ###END###{DesktopInbandFiles}
|
|
|
|
// ###BEGIN###{DesktopRecorder}
|
|
if (urlvars && urlvars['norecord']) { QV('id_DeskRecorderTools', false); }
|
|
// ###END###{DesktopRecorder}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
// Check input arguments
|
|
if (urlvars['webcn'] == 1) { delete urlvars['webcn']; setTimeout(function() { alert('Invalid webcn argument, use -webcn:domain.com.'); }, 100); }
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
function setupWebServer(leafCN) {
|
|
if ((webserver != null) && (webserver.certCommonName == leafCN)) return;
|
|
|
|
// Stop the web server if present
|
|
if (webserver != null) { webserver.stop(); webserver = null; }
|
|
|
|
// Create a web server to serve One Client Recovery (OCR) disk image files.
|
|
webserver = CreateWebServer();
|
|
webserver.generateCertificate(leafCN);
|
|
webserver.start();
|
|
webserver.onTransfers = function (webserver, transfers) {
|
|
var x = '';
|
|
for (var i in transfers) { x += '<div style="width:350px;position:relative;padding:3px"><span style="position:absolute;padding:3px;font-weight:bold">' + transfers[i].xfilename + '</span><div style="height:20px;background-color:#4CAF50;width:' + Math.floor((transfers[i].progress.count * 100) / transfers[i].xsize) + '%;border-radius:4px"></div></div>'; }
|
|
QV('TransferNotification', transfers.length > 0);
|
|
QH('TransferNotification', x);
|
|
}
|
|
|
|
//console.log('WebServer Cert Hash RAW', webserver.certHashRaw);
|
|
//console.log('WebServer Cert Hash HEX', webserver.certHashHex);
|
|
}
|
|
// ###END###{PowerControl-OneClick}
|
|
// ###END###{PowerControl-Advanced}
|
|
|
|
function documentFileSelectHandler(e) {
|
|
haltEvent(e);
|
|
// ###BEGIN###{IDER}
|
|
var diskimages = true;
|
|
for (var i = 0; i < e.dataTransfer.files.length; i++) {
|
|
if ((e.dataTransfer.files[i].name.toLowerCase().endsWith('.img') == false) && (e.dataTransfer.files[i].name.toLowerCase().endsWith('.iso') == false)) { diskimages = false; }
|
|
}
|
|
if ((diskimages == true) && (e.dataTransfer != null) && (currentView > 0) && (currentView < 100) && ((e.dataTransfer.files.length == 1) || (e.dataTransfer.files.length == 2))) {
|
|
var floppyfile = null, cdromfile = null;
|
|
if (e.dataTransfer.files[0].name.toLowerCase().endsWith('.iso')) { cdromfile = e.dataTransfer.files[0]; }
|
|
if (e.dataTransfer.files[0].name.toLowerCase().endsWith('.img')) { floppyfile = e.dataTransfer.files[0]; }
|
|
if (e.dataTransfer.files.length == 2) {
|
|
if (e.dataTransfer.files[1].name.toLowerCase().endsWith('.iso')) { cdromfile = e.dataTransfer.files[1]; }
|
|
if (e.dataTransfer.files[1].name.toLowerCase().endsWith('.img')) { floppyfile = e.dataTransfer.files[1]; }
|
|
}
|
|
if ((floppyfile != null) || (cdromfile != null)) iderStart3(floppyfile, cdromfile, 1);
|
|
return;
|
|
}
|
|
// ###END###{IDER}
|
|
|
|
if (e.dataTransfer == null || e.dataTransfer.files.length != 1) return;
|
|
var f = null, filename = e.dataTransfer.files[0].name.toLowerCase();
|
|
// ###BEGIN###{Storage}
|
|
if (currentView == 21) { UploadToStorage(e.dataTransfer.files[0], filename); return; }
|
|
// ###END###{Storage}
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
if (currentView == 101) {
|
|
if (filename.endsWith('.mescript') || filename.endsWith('.meblocks')) { f = mscript_onScriptRead; }
|
|
if (filename.endsWith('.json') || filename.endsWith('.csv')) { f = function (file) { onComputerListRead(file, filename); } }
|
|
}
|
|
// ###END###{ComputerSelector-Local}
|
|
// ###BEGIN###{USBSetup}
|
|
if (currentView == 102 && filename.endsWith('.bin')) { f = usb_onSetupBinRead; }
|
|
// ###END###{USBSetup}
|
|
// ###BEGIN###{Scripting}
|
|
if (wsstack != null && (filename.endsWith('.mescript') || filename.endsWith('.meblocks'))) { f = script_onScriptRead; }
|
|
// ###END###{Scripting}
|
|
// ###BEGIN###{SessionRecording}
|
|
if (currentView == 104 && filename.endsWith('.mcrec')) { srec_ondrop(e); return; }
|
|
// ###END###{SessionRecording}
|
|
if (f != null) { var reader = new FileReader(); reader.onload = f; reader.readAsBinaryString(e.dataTransfer.files[0]); }
|
|
}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{Look-Commander}
|
|
function NW_CheckForUpdateMenu() {
|
|
if (NW_UpdateMenuItem.checked == true) { NW_AutoUpdateCheck(); }
|
|
try { localStorage.setItem('checkForUpdate', NW_UpdateMenuItem.checked); } catch (ex) { }
|
|
}
|
|
// ###END###{Look-Commander}
|
|
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
function NW_CheckForUpdateMenu() {
|
|
if (NW_UpdateMenuItem.checked == true) { NW_AutoUpdateCheck(); }
|
|
try { localStorage.setItem('checkForUpdate', NW_UpdateMenuItem.checked); } catch (ex) { }
|
|
}
|
|
// ###END###{Look-BrandedCommander}
|
|
|
|
// Check if an update is available
|
|
function NW_AutoUpdateCheck() {
|
|
// ###BEGIN###{Look-Commander}
|
|
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
|
|
try {
|
|
if (localStorage.getItem('checkForUpdate') != 'false') {
|
|
var request = new XMLHttpRequest();
|
|
request.onload = function () {
|
|
if (request.status >= 200 && request.status < 400) {
|
|
var x = request.responseText, i = x.indexOf('##3B356F7A-0854-4EBA-B10D-4CC4FB522695##');
|
|
if (i > 0) {
|
|
x = x.substring(i);
|
|
var newversion = parseInt(x.substring(40, 46));
|
|
var criticalversion = parseInt(x.substring(48, 54));
|
|
var url = x.substring(56);
|
|
var j = url.indexOf('##');
|
|
if (j >= 0) {
|
|
url = url.substring(0, j);
|
|
var currentversion = version.split('.');
|
|
currentversion = parseInt(currentversion[0] * 10000) + parseInt(currentversion[1] * 100) + parseInt(currentversion[2]);
|
|
if (currentversion < newversion) {
|
|
var newversiontext = Math.floor(newversion / 10000) + '.' + (Math.floor(newversion / 100) % 100) + '.' + (newversion % 100);
|
|
var msg = format("MeshCommander v {0} está disponible", newversiontext);
|
|
if (currentversion < criticalversion) {
|
|
msg += ", es una actualización de seguridad crítica";
|
|
QS('UpdateNotification')['background-color'] = 'orange';
|
|
}
|
|
QH('UpdateNotificationText', msg);
|
|
QV('UpdateNotification', true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
request.onerror = function () { console.log('Failed to get script blocks'); };
|
|
request.open('GET', 'https://sites.google.com/site/opensoftwareprojects/mesh/security-1/autoupdate', true);
|
|
request.send();
|
|
}
|
|
} catch (ex) { }
|
|
// ###END###{!ComputerSelector-Local-ScriptOnly}
|
|
// ###END###{Look-Commander}
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
try {
|
|
if (localStorage.getItem('checkForUpdate') != 'false') {
|
|
var request = new XMLHttpRequest();
|
|
request.onload = function () {
|
|
if (request.status >= 200 && request.status < 400) {
|
|
var x = request.responseText, i = x.indexOf('##371cff53-32b7-4278-86c5-3e6906965332##');
|
|
if (i > 0) {
|
|
x = x.substring(i);
|
|
var newversion = parseInt(x.substring(40, 46));
|
|
var criticalversion = parseInt(x.substring(48, 54));
|
|
var url = x.substring(56);
|
|
var j = url.indexOf('##');
|
|
if (j >= 0) {
|
|
url = url.substring(0, j);
|
|
var currentversion = version.split('.');
|
|
currentversion = parseInt(currentversion[0] * 10000) + parseInt(currentversion[1] * 100) + parseInt(currentversion[2]);
|
|
if (currentversion < newversion) {
|
|
var newversiontext = Math.floor(newversion / 10000) + '.' + (Math.floor(newversion / 100) % 100) + '.' + (newversion % 100);
|
|
var msg = format("Intel® Manageability Commander v{0} is available", newversiontext);
|
|
if (currentversion < criticalversion) {
|
|
msg += ", es una actualización de seguridad crítica";
|
|
QS('UpdateNotification')['background-color'] = 'orange';
|
|
}
|
|
QH('UpdateNotificationText', msg);
|
|
QV('UpdateNotification', true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
request.onerror = function () { console.log('Failed to get script blocks'); };
|
|
request.open('GET', 'https://software.intel.com/en-us/articles/intel-manageability-commander', true);
|
|
request.send();
|
|
}
|
|
} catch (ex) { }
|
|
// ###END###{Look-BrandedCommander}
|
|
}
|
|
|
|
function NW_HideUpdateNotification() {
|
|
QV('UpdateNotification', false);
|
|
}
|
|
|
|
function NW_PerformUpdate() {
|
|
require('nw.gui').Shell.openExternal('http://www.meshcommander.com/meshcommander');
|
|
}
|
|
|
|
var NW_WindowTitle = null;
|
|
var NW_UpdateMenuItem = null;
|
|
var NW_AmtScanMenuItem = null;
|
|
var NW_TlsSecurityMode = 1;
|
|
var NW_SkipTlsHostnameCheck = 0;
|
|
|
|
function NW_SetupMainMenu(x) {
|
|
var gui = require('nw.gui');
|
|
var mainmenu = new gui.Menu({ type: 'menubar' });
|
|
|
|
// Add Mac OS X specific menu
|
|
var os = require('os');
|
|
if (os.platform() == 'darwin') { mainmenu.createMacBuiltin('MeshCommander', { hideEdit: true, hideWindow: true }); }
|
|
var filemenu = new gui.MenuItem({ label: "Expediente" });
|
|
var filemenusub = new gui.Menu();
|
|
var seperator = false;
|
|
var toolsmenu = null;
|
|
var scriptmenu = null;
|
|
var securitymenu = null;
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer == null) {
|
|
// ###END###{MeshServerConnect}
|
|
if (x == 101) {
|
|
// Computer selector
|
|
filemenusub.append(new gui.MenuItem({ label: "Agregar computadora Intel AMT ...", click: addComputer }));
|
|
filemenusub.append(new gui.MenuItem({ label: "Cargar equipos ...", click: NW_LoadComputers }));
|
|
filemenusub.append(new gui.MenuItem({ label: "Guardar computadoras ...", click: NW_SaveComputers }));
|
|
// ###BEGIN###{ComputerSelectorScanner}
|
|
filemenusub.append(new gui.MenuItem({ label: "Escanear en busca de computadoras ...", click: showScanDialog }));
|
|
// ###END###{ComputerSelectorScanner}
|
|
// ###BEGIN###{MeshServerConnect}
|
|
filemenusub.append(new gui.MenuItem({ type: 'separator' }));
|
|
filemenusub.append(new gui.MenuItem({ label: "Conéctese a MeshCentral ...", click: showMeshCentralConnectDialog }));
|
|
// ###END###{MeshServerConnect}
|
|
seperator = true;
|
|
}
|
|
// ###BEGIN###{MeshServerConnect}
|
|
} else {
|
|
filemenusub.append(new gui.MenuItem({ label: "Desconectarse de MeshCentral", click: meshCentralDisconnect }));
|
|
seperator = true;
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{USBSetup}
|
|
if (x == 102) {
|
|
// Setup.bin Editor
|
|
filemenusub.append(new gui.MenuItem({ label: "Nuevo...", click: usb_newSetupBin }));
|
|
filemenusub.append(new gui.MenuItem({ label: "Cargar Setup.bin ...", click: NW_LoadSetupBin }));
|
|
filemenusub.append(new gui.MenuItem({ label: "Guardar Setup.bin ...", click: usb_saveSetupBin }));
|
|
seperator = true;
|
|
}
|
|
// ###END###{USBSetup}
|
|
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer == null) {
|
|
// ###END###{MeshServerConnect}
|
|
if (x >= 101 && x <= 104) {
|
|
// Tools
|
|
toolsmenu = new gui.MenuItem({ label: "Herramientas" });
|
|
var toolsmenusub = new gui.Menu();
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Gestión informática", click: NW_ComputerManagement, type: 'checkbox', checked: (x == 101) }));
|
|
// ###BEGIN###{CertificateManager}
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Gerente de certificados", click: NW_CertificateManager, type: 'checkbox', checked: (x == 103) }));
|
|
// ###END###{CertificateManager}
|
|
// ###BEGIN###{USBSetup}
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Setup.bin Manager", click: NW_SetupBinEditor, type: 'checkbox', checked: (x == 102) }));
|
|
// ###END###{USBSetup}
|
|
// ###BEGIN###{SessionRecording}
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Jugador de sesión", click: NW_SessionPlayer, type: 'checkbox', checked: (x == 104) }));
|
|
// ###END###{SessionRecording}
|
|
toolsmenu.submenu = toolsmenusub;
|
|
}
|
|
// ###BEGIN###{Scripting}
|
|
// ###BEGIN###{!Look-BrandedCommander}
|
|
if (x == 101) {
|
|
// Batch Scripting
|
|
scriptmenu = new gui.MenuItem({ label: "Guión" });
|
|
var scriptmenusub = new gui.Menu();
|
|
if (computersRunningScripts > 0) {
|
|
scriptmenusub.append(new gui.MenuItem({ label: "Detener todas las secuencias de comandos", click: mscript_runScriptDlg }));
|
|
} else {
|
|
scriptmenusub.append(new gui.MenuItem({ label: "Iniciar secuencia de comandos ...", click: mscript_runScriptDlg }));
|
|
}
|
|
scriptmenu.submenu = scriptmenusub;
|
|
}
|
|
if (x >= 0 && x < 100) {
|
|
// Computer Scripting
|
|
scriptmenu = new gui.MenuItem({ label: "Guión" });
|
|
var scriptmenusub = new gui.Menu();
|
|
if (scriptstate) {
|
|
scriptmenusub.append(new gui.MenuItem({ label: "Stop Script", click: script_Stop }));
|
|
} else {
|
|
scriptmenusub.append(new gui.MenuItem({ label: "Iniciar secuencia de comandos ...", click: script_runScriptDlg }));
|
|
}
|
|
scriptmenu.submenu = scriptmenusub;
|
|
}
|
|
// ###END###{!Look-BrandedCommander}
|
|
// ###END###{Scripting}
|
|
|
|
if (x == 101) {
|
|
// Security
|
|
securitymenu = new gui.MenuItem({ label: "Seguridad" });
|
|
var securitymenusub = new gui.Menu();
|
|
securitymenusub.append(new gui.MenuItem({ label: "Ignorar certificado TLS", click: NW_ChangeTlsSecurityMode0, type: 'checkbox', checked: (NW_TlsSecurityMode == 0) }));
|
|
securitymenusub.append(new gui.MenuItem({ label: "Ver certificado TLS && pin", click: NW_ChangeTlsSecurityMode1, type: 'checkbox', checked: (NW_TlsSecurityMode == 1) }));
|
|
securitymenusub.append(new gui.MenuItem({ type: 'separator' }));
|
|
NW_SkipTlsHostnameMenuItem = new gui.MenuItem({ label: "Omitir verificación de nombre de host TLS", click: NW_SkipTlsHostnameCheck0, type: 'checkbox', checked: (NW_SkipTlsHostnameCheck == 1) })
|
|
securitymenusub.append(NW_SkipTlsHostnameMenuItem);
|
|
securitymenu.submenu = securitymenusub;
|
|
}
|
|
// ###BEGIN###{MeshServerConnect}
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
if (x >= 0 && x < 100 && disconnecturl != 'none' && disconnecturl != 'close') {
|
|
// Computer screen
|
|
filemenusub.append(new gui.MenuItem({ label: "Desconectar", click: disconnect }));
|
|
seperator = true;
|
|
}
|
|
|
|
// Explicit exit action not required on Mac. The MacBuiltin menu includes native option to quit application (Quit)
|
|
if (os.platform() != 'darwin') {
|
|
if (seperator == true) filemenusub.append(new gui.MenuItem({ type: 'separator' }));
|
|
filemenusub.append(new gui.MenuItem({ label: "Salida", click: NW_Exit }));
|
|
}
|
|
|
|
filemenu.submenu = filemenusub;
|
|
if (x == 13) {
|
|
// Terminal
|
|
toolsmenu = new gui.MenuItem({ label: "Terminal" });
|
|
var toolsmenusub = new gui.Menu();
|
|
if (terminal.State == 0) {
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Conectar", click: connectTerminal }));
|
|
} else {
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Desconectar", click: connectTerminal }));
|
|
}
|
|
// ###BEGIN###{FileSaver}
|
|
toolsmenusub.append(new gui.MenuItem({ type: 'separator' }));
|
|
if (terminal.m.capture == null) {
|
|
// ###BEGIN###{!TerminalReplay}
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Iniciar captura", click: terminalCaptureToggle }));
|
|
// ###END###{!TerminalReplay}
|
|
// ###BEGIN###{TerminalReplay}
|
|
if (terminalReplayTimer == null) {
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Iniciar captura", click: terminalCaptureToggle }));
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Repetir captura", click: terminalReplay }));
|
|
} else {
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Stop Replay", click: terminalReplay }));
|
|
}
|
|
// ###END###{TerminalReplay}
|
|
} else {
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Detener captura", click: terminalCaptureToggle }));
|
|
}
|
|
// ###END###{FileSaver}
|
|
toolsmenu.submenu = toolsmenusub;
|
|
}
|
|
if (x == 14) {
|
|
// Desktop
|
|
toolsmenu = new gui.MenuItem({ label: "Escritorio" });
|
|
var toolsmenusub = new gui.Menu();
|
|
if (desktop.State == 0) {
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Conectar", click: connectDesktop }));
|
|
} else {
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Desconectar", click: connectDesktop }));
|
|
}
|
|
toolsmenusub.append(new gui.MenuItem({ type: 'separator' }));
|
|
toolsmenusub.append(new gui.MenuItem({ label: "Configuraciones", click: showDesktopSettings }));
|
|
toolsmenu.submenu = toolsmenusub;
|
|
}
|
|
|
|
// Language menu
|
|
var languagemenu = new gui.MenuItem({ label: "Idioma" });
|
|
var languagesubmenu = new gui.Menu();
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'en'), label: "Inglés", click: function () { window.location.href = 'commander.htm'; } }));
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'zh-chs'), label: "Chino (simplificado)", click: function () { window.location.href = 'commander_zh-chs.htm'; } }));
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'nl'), label: "holandés", click: function () { window.location.href = 'commander_nl.htm'; } }));
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'fr'), label: "francés", click: function () { window.location.href = 'commander_fr.htm'; } }));
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'de'), label: "alemán", click: function () { window.location.href = 'commander_de.htm'; } }));
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'it'), label: "italiano", click: function () { window.location.href = 'commander_it.htm'; } }));
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'ja'), label: "japonés", click: function () { window.location.href = 'commander_ja.htm'; } }));
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'pt'), label: "portugués", click: function () { window.location.href = 'commander_pt.htm'; } }));
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'ru'), label: "ruso", click: function () { window.location.href = 'commander_ru.htm'; } }));
|
|
languagesubmenu.append(new gui.MenuItem({ type: 'checkbox', checked: (document.documentElement.lang == 'es'), label: "Español", click: function () { window.location.href = 'commander_es.htm'; } }));
|
|
languagemenu.submenu = languagesubmenu;
|
|
|
|
var helpmenu = new gui.MenuItem({ label: "Ayuda" });
|
|
var helpmenusub = new gui.Menu();
|
|
// ###BEGIN###{Look-Commander}
|
|
var checkForUpdateCheck = false;
|
|
try { checkForUpdateCheck = (localStorage.getItem('checkForUpdate') == 'false') ? false : true; } catch (ex) {}
|
|
NW_UpdateMenuItem = new gui.MenuItem({ type: 'checkbox', checked: checkForUpdateCheck, label: "Buscar actualizaciones", click: NW_CheckForUpdateMenu })
|
|
helpmenusub.append(NW_UpdateMenuItem);
|
|
// ###END###{Look-Commander}
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
var checkForUpdateCheck = false;
|
|
try { checkForUpdateCheck = (localStorage.getItem('checkForUpdate') == 'false') ? false : true; } catch (ex) { }
|
|
NW_UpdateMenuItem = new gui.MenuItem({ type: 'checkbox', checked: checkForUpdateCheck, label: "Buscar actualizaciones", click: NW_CheckForUpdateMenu })
|
|
helpmenusub.append(NW_UpdateMenuItem);
|
|
// ###END###{Look-BrandedCommander}
|
|
// ###BEGIN###{ComputerSelectorScanner}
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer == null) {
|
|
// ###END###{MeshServerConnect}
|
|
var amtPresenceScan = true;
|
|
try { amtPresenceScan = (localStorage.getItem('scanForComputers') == 'false') ? false : true; } catch (ex) { }
|
|
NW_AmtScanMenuItem = new gui.MenuItem({ type: 'checkbox', checked: amtPresenceScan, label: "Escanear en busca de presencia", click: NW_AmtScanMenu })
|
|
helpmenusub.append(NW_AmtScanMenuItem);
|
|
if (amtPresenceScan == true) { globalAmtScanner.start(); }
|
|
// ###BEGIN###{MeshServerConnect}
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
// ###END###{ComputerSelectorScanner}
|
|
helpmenusub.append(new gui.MenuItem({ label: "Reiniciar", click: NW_Reload }));
|
|
if (urlvars['debug']) { helpmenusub.append(new gui.MenuItem({ label: "Mostrar depuración ...", click: NW_Debug })); }
|
|
// ###BEGIN###{Look-ISDU}
|
|
helpmenusub.append(new gui.MenuItem({ type: 'separator' }));
|
|
helpmenusub.append(new gui.MenuItem({ label: "About...", click: WM_About }));
|
|
// ###END###{Look-ISDU}
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
helpmenusub.append(new gui.MenuItem({ type: 'separator' }));
|
|
helpmenusub.append(new gui.MenuItem({ label: "About...", click: WM_About }));
|
|
// ###END###{Look-BrandedCommander}
|
|
helpmenu.submenu = helpmenusub;
|
|
mainmenu.append(filemenu);
|
|
if (toolsmenu != null) mainmenu.append(toolsmenu);
|
|
if (scriptmenu != null) mainmenu.append(scriptmenu);
|
|
if (securitymenu != null) mainmenu.append(securitymenu);
|
|
mainmenu.append(languagemenu);
|
|
mainmenu.append(helpmenu);
|
|
gui.Window.get().menu = mainmenu;
|
|
}
|
|
|
|
function NW_Exit() {
|
|
require('nw.gui').Window.get().close(); // Closes only the current window.
|
|
//require('nw.gui').App.quit(); // Closes all instances of the app.
|
|
}
|
|
function NW_Reload() { require('nw.gui').Window.get().reloadIgnoringCache(); }
|
|
function NW_Debug() { require('nw.gui').Window.get().showDevTools(); }
|
|
|
|
function NW_ChangeTlsSecurityMode0() { NW_TlsSecurityMode = 0; try { localStorage.setItem('TlsSecurityMode', NW_TlsSecurityMode); } catch (ex) { } NW_SetupMainMenu(currentView); }
|
|
function NW_ChangeTlsSecurityMode1() { NW_TlsSecurityMode = 1; try { localStorage.setItem('TlsSecurityMode', NW_TlsSecurityMode); } catch (ex) { } NW_SetupMainMenu(currentView); }
|
|
function NW_SkipTlsHostnameCheck0() { NW_SkipTlsHostnameCheck = NW_SkipTlsHostnameMenuItem.checked ? 1 : 0; try { localStorage.setItem('SkipTlsHostnameCheck', NW_SkipTlsHostnameCheck); } catch (ex) { } NW_SetupMainMenu(currentView); }
|
|
function NW_LoadComputers() {
|
|
var chooser = Q('idx_d17computerlistfile');
|
|
if (chooser.getAttribute('eventset') != 1) {
|
|
chooser.setAttribute('eventset', '1');
|
|
chooser.addEventListener('change', NW_LoadComputersEx, false);
|
|
}
|
|
chooser.value = null;
|
|
chooser.click();
|
|
}
|
|
function NW_LoadComputersEx(evt) {
|
|
var reader = new FileReader();
|
|
reader.onload = function(file) { onComputerListRead(file, Q('idx_d17computerlistfile').files[0].name); }
|
|
reader.readAsBinaryString(this.files[0]);
|
|
}
|
|
|
|
function NW_SaveComputers() { saveComputerList(); }
|
|
function NW_ComputerManagement() { toolmenuclick(-1); go(101); }
|
|
// ###BEGIN###{CertificateManager}
|
|
function NW_CertificateManager() { toolmenuclick(-1); go(103); }
|
|
// ###END###{CertificateManager}
|
|
function NW_SetupBinEditor() { toolmenuclick(-1); go(102); }
|
|
// ###BEGIN###{SessionRecording}
|
|
function NW_SessionPlayer() { toolmenuclick(-1); go(104); }
|
|
// ###END###{SessionRecording}
|
|
|
|
function NW_LoadSetupBin() {
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file');
|
|
chooser.setAttribute('accept', '.bin');
|
|
chooser.addEventListener('change', NW_LoadSetupBinEx, false);
|
|
chooser.value = null;
|
|
chooser.click();
|
|
}
|
|
function NW_LoadSetupBinEx() {
|
|
var reader = new FileReader();
|
|
reader.onload = function(file) { usb_onSetupBinRead(file); }
|
|
reader.readAsBinaryString(this.files[0]);
|
|
}
|
|
|
|
// ###BEGIN###{Look-ISDU}
|
|
function WM_About() {
|
|
var x = { 'position': 'center', 'focus': true, 'frame': true, 'icon': 'favicon.png', 'width': 520, 'height': 320 };
|
|
if (process.version == 'v1.2.0') x['toolbar'] = false;
|
|
require('nw.gui').Window.open('about.htm', x);
|
|
}
|
|
// ###END###{Look-ISDU}
|
|
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
function WM_About() {
|
|
var x = { 'position': 'center', 'focus': true, 'frame': true, 'icon': 'favicon.png', 'width': 520, 'height': 320 };
|
|
if (process.version == 'v1.2.0') x['toolbar'] = false;
|
|
require('nw.gui').Window.open('about.htm', x);
|
|
}
|
|
// ###END###{Look-BrandedCommander}
|
|
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{ComputerSelector}
|
|
// Load the list of computers from the server
|
|
function loadServerComputerList() {
|
|
var request = new XMLHttpRequest();
|
|
request.onload = function() {
|
|
if (request.status >= 200 && request.status < 400) {
|
|
// Success
|
|
var serverComputerList = JSON.parse(request.responseText);
|
|
if (serverComputerList && serverComputerList != null && serverComputerList instanceof Array) {
|
|
currentcomputer = null;
|
|
computerlist = [];
|
|
for (var i in serverComputerList) {
|
|
var computer = serverComputerList[i];
|
|
if (computer['host']) {
|
|
computer.checked = false;
|
|
if (!computer['h']) computer['h'] = Math.random(); // If 'h' handle is not present, create one.
|
|
if (!computer['tls']) computer['tls'] = 0; // If TLS is not present, assume 0.
|
|
computerlist.push(computer);
|
|
}
|
|
}
|
|
updateComputerList();
|
|
}
|
|
} else {
|
|
console.log('Failed to get server computer list');
|
|
}
|
|
};
|
|
|
|
request.onerror = function() {
|
|
console.log('Failed to get server computer list');
|
|
};
|
|
|
|
// ###BEGIN###{ComputerSelector-Remote}
|
|
request.open('GET', 'webrelay.ashx?action=getcomputerlist', true);
|
|
// ###END###{ComputerSelector-Remote}
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
request.open('GET', urlvars['connect'], true);
|
|
// ###END###{ComputerSelector-Local}
|
|
request.send();
|
|
}
|
|
// ###END###{ComputerSelector}
|
|
|
|
// ###BEGIN###{Mode-LMS}
|
|
// Called when the LMS control channel changes state
|
|
function lmsChangedState(sender, state)
|
|
{
|
|
//console.log("LMS Control Channel State: " + state);
|
|
if (state == 0) {
|
|
setDialogMode();
|
|
QV('id_lmsToolBarContent', false);
|
|
QH('id_lmsData', '<div style=text-align:center;padding-top:20px>' + "MicroLMS disconnected." + '<div>');
|
|
QH('id_lmsData2', '');
|
|
} else if (state == 2) { QV('id_lmsToolBarContent', true); lmsRefresh(); }
|
|
}
|
|
|
|
function lmsLogin() { window.location.href = '/authindex.html'; }
|
|
|
|
var lmsProvisioningStates = ["Pre-Provisioning", "In-Provisioning", "Post-Provisioning"];
|
|
var lmsProvisioningModes = ["Ninguna", "Enterprise Mode", "Small Buisness Mode", "Remote Assistance Mode"];
|
|
var lmsMeInfo = null;
|
|
var lmsTemp = null;
|
|
var lmsNotifications = null;
|
|
|
|
// Called when data is received on the LMS control channel
|
|
function lmsOnData(sender, data)
|
|
{
|
|
var cmdid = ReadShortX(data, 0);
|
|
//console.log("LMS Control Channel Data: " + data + ", cmdid:" + cmdid);
|
|
|
|
switch (+cmdid) {
|
|
case 1: { // ME Information
|
|
//console.log(data.substring(2));
|
|
var meinfo = JSON.parse(data.substring(2));
|
|
QV('id_lmsLoginButton', meinfo['LoginMode'] == 1);
|
|
|
|
// If Intel AMT is in-between states, reload data in a few seconds.
|
|
if ((meinfo['TrustedHashes'] != null) && (meinfo['ProvisioningMode'] == -858993460)) {
|
|
QV('id_lmsConfigureButton', false);
|
|
QV('id_lmsActivateButton', false);
|
|
QV('id_lmsDeactivateButton', false);
|
|
setTimeout(lmsRefresh, 1000);
|
|
return;
|
|
}
|
|
|
|
lmsMeInfo = meinfo;
|
|
if (meinfo['ProvisioningState'] == null) {
|
|
QH('id_lmsData', '<div style=text-align:center;padding-top:20px>' + "Intel® AMT not found" + '<div>');
|
|
QH('id_lmsData2', '');
|
|
} else {
|
|
meinfo['Flags'] = +meinfo['Flags'];
|
|
|
|
var x = '<h2>' + "Current Status" + '</h2>';
|
|
x += TableStart();
|
|
if (meinfo['ProvisioningState'] != 2) {
|
|
x += TableEntry("Activation state", lmsProvisioningStates[meinfo['ProvisioningState']]);
|
|
} else {
|
|
if (meinfo['Flags'] & 2) { x += TableEntry("Activation state", "Activated in Client Control Mode"); }
|
|
else if (meinfo['Flags'] & 4) { x += TableEntry("Activation state", "Activated in Admin Control Mode"); }
|
|
else { x += TableEntry("Activation state", "Activated, " + lmsProvisioningModes[meinfo['ProvisioningMode']]); }
|
|
}
|
|
x += TableEntry("Intel® AMT version", addLink(meinfo['Versions']['AMT'], 'lmsShowVersionsDlg()'));
|
|
if (meinfo['MeiVersion'] != null) { x += TableEntry("Intel® MEI driver version", meinfo['MeiVersion']); }
|
|
x += TableEnd();
|
|
|
|
if (meinfo['ProvisioningState'] != 2) {
|
|
x += '<h2>' + "Activation Information" + '</h2>';
|
|
x += TableStart();
|
|
if (meinfo['DnsSuffix']) {
|
|
x += TableEntry("Trusted DNS suffix", meinfo['DnsSuffix']);
|
|
} else {
|
|
x += TableEntry("Trusted DNS suffix", '<i>' + "Not Set" + '</i>');
|
|
}
|
|
if (meinfo['TrustedHashes'] != null) {
|
|
if (meinfo['TrustedHashes'].length == 1) {
|
|
x += TableEntry("Trusted hashes", addLink(meinfo['TrustedHashes'].length + ' hash', 'lmsShowTrustedHashesDlg()'));
|
|
} else {
|
|
x += TableEntry("Trusted hashes", addLink(meinfo['TrustedHashes'].length + ' hashes', 'lmsShowTrustedHashesDlg()'));
|
|
}
|
|
}
|
|
x += TableEnd();
|
|
}
|
|
|
|
QH('id_lmsData', x);
|
|
QV('id_lmsData2', true);
|
|
lmsNotifications = meinfo['Notifications'].reverse();
|
|
lmsRefreshNotifications();
|
|
QV('id_lmsConfigureButton', (meinfo['ProvisioningState'] == 2)); // Only display the "Login..." button if Intel AMT is in post-provisioning state.
|
|
QV('id_lmsActivateButton', (meinfo['ProvisioningState'] == 0) && (meinfo['LoginMode'] >= 2)); // Only display the "Activate..." button if Intel AMT is in pre-provisioning state and we are adrministrator.
|
|
QV('id_lmsDeactivateButton', (meinfo['ProvisioningState'] == 2) && (meinfo['Flags'] & 2) && (meinfo['LoginMode'] >= 2)); // Only display the "Deactivate..." button if Intel AMT is in port-provisioning state & in client control mode & we are adrministrator.
|
|
}
|
|
break;
|
|
}
|
|
case 2: { // Intel ME Un-Provisioning
|
|
lmsDeactivateX2(ReadIntX(data, 2));
|
|
break;
|
|
}
|
|
case 3: { // Intel ME System Account Information
|
|
var status = ReadIntX(data, 2);
|
|
if (status != 0) {
|
|
messagebox("Activación Intel® AMT", format("Failed to get account information, status {0}", status));
|
|
} else {
|
|
var meuser = data.substring(6, data.indexOf('\0', 6));
|
|
var mepass = data.substring(39, data.indexOf('\0', 39));
|
|
QH('id_dialogMessage', "Fetching activation status...");
|
|
wsstack = WsmanStackCreateService("localhost", 16992, meuser, mepass, false);
|
|
amtstack = AmtStackCreateService(wsstack);
|
|
amtstack.onProcessChanged = onProcessChanged;
|
|
amtstack.BatchEnum(null, ['*AMT_GeneralSettings', '*IPS_HostBasedSetupService'], lmsActivationX1);
|
|
}
|
|
break;
|
|
}
|
|
case 9: { // New notification
|
|
var notification = JSON.parse(data.substring(2));
|
|
if (lmsNotifications == null) { lmsNotifications = []; }
|
|
lmsNotifications.unshift(notification);
|
|
lmsRefreshNotifications();
|
|
if ((notification.code == 'iAMT0055-0') || (notification.code == 'iAMT0055-1') || (notification.code == 'iAMT0055-2')) { setDialogMode(); lmsRefresh(); }
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function lmsRefreshNotifications() {
|
|
var x = '<h2>' + "Notifications" + '</h2>' + TableStart();
|
|
if (lmsNotifications && lmsNotifications.length > 0) {
|
|
for (var i in lmsNotifications) {
|
|
var n = lmsNotifications[i], v = n.str;
|
|
if (n.code != 'iAMT0050-32') {
|
|
if (v.indexOf('User Notification Alert - ') == 0) { v = v.substring(26); }
|
|
x += TableEntry(new Date(n.date).toLocaleString(), v);
|
|
}
|
|
}
|
|
} else {
|
|
x += '<tr><td style=padding:8px><i>' + "No notifications found." + '</i><td>';
|
|
}
|
|
x += TableEnd();
|
|
QH('id_lmsData2', x);
|
|
}
|
|
|
|
function lmsActivationX1(stack, name, responses, status) {
|
|
if (status != 200) {
|
|
messagebox("Activación Intel® AMT", format("Failed to fetch activation status, status {0}", status));
|
|
} else if (responses['IPS_HostBasedSetupService'].response['AllowedControlModes'].length != 2) {
|
|
messagebox("Activación Intel® AMT", "Client control mode activation not allowed");
|
|
} else {
|
|
lmsTemp = responses['AMT_GeneralSettings'].response;
|
|
amtstack.IPS_HostBasedSetupService_Setup(2, rstr2hex(rstr_md5('admin:' + responses['AMT_GeneralSettings'].response['DigestRealm'] + ':' + d4password.value)), null, null, null, null, lmsActivationX2);
|
|
}
|
|
}
|
|
|
|
function lmsActivationX2(stack, name, response, status) {
|
|
if (status != 200 || response.Body['ReturnValue'] != 0) {
|
|
messagebox("Activación Intel® AMT", format("Failed activation, status {0}", status));
|
|
} else {
|
|
setDialogMode();
|
|
lmsRefresh();
|
|
lmsTemp['HostName'] = lmsMeInfo['OsHostname']; // Set the OS hostname
|
|
// TODO: Also set the local FQDN if we can get it from LMS
|
|
wsstack = WsmanStackCreateService('localhost', 16992, 'admin', d4password.value, false);
|
|
amtstack = AmtStackCreateService(wsstack);
|
|
amtstack.onProcessChanged = onProcessChanged;
|
|
amtstack.Put('AMT_GeneralSettings', lmsTemp, function() { }, 0, 1);
|
|
}
|
|
}
|
|
|
|
function lmsDeactivate() {
|
|
if (xxdialogMode || lms.State != 2) return;
|
|
QH('id_dialogMessage', "Confirm Intel® AMT deactivation?");
|
|
setDialogMode(1, "Intel® AMT Deactivation", 3, lmsDeactivateX1);
|
|
}
|
|
|
|
function lmsDeactivateX1() {
|
|
statusbox("Intel® AMT Deactivation", "Deactivating Intel® AMT...");
|
|
lms.SendCmd(2, IntToStrX(1)); // Send request for deactivation
|
|
}
|
|
|
|
function lmsDeactivateX2(status) {
|
|
if (status != 0) {
|
|
messagebox("Intel® AMT Deactivation", format("Failed deactivation, status ", status));
|
|
} else {
|
|
QH('id_lmsData', "Please wait for deactivation...");
|
|
QV('id_lmsData2', false);
|
|
setDialogMode();
|
|
lmsRefresh();
|
|
}
|
|
}
|
|
|
|
// Refresh button on the UI
|
|
function lmsRefresh() {
|
|
if (lms.State != 2) return;
|
|
lms.SendCmd(1, ''); // Send the request basic information command
|
|
}
|
|
|
|
// Configure button on the UI
|
|
function lmsConfigure() {
|
|
if (xxdialogMode) return;
|
|
setDialogMode(4, "Intel® AMT Login", 3, function () { lmsConfigureLogin(); });
|
|
//d4username.readOnly = false;
|
|
d4username.disabled = false;
|
|
if (d4username.value == 'admin') d4username.value = '';
|
|
inputBoxFocus('d4username');
|
|
lmsUpdateLoginDialog();
|
|
}
|
|
|
|
// Called when the user hits OK on the login dialog
|
|
function lmsConfigureLogin() {
|
|
var user = d4username.value;
|
|
if (user == '') user = 'admin';
|
|
connect('localhost', 16992, user, d4password.value, 0);
|
|
}
|
|
|
|
// Activate button on the UI
|
|
function lmsActivate() {
|
|
if (xxdialogMode|| lms.State != 2) return;
|
|
setDialogMode(4, "Activación Intel® AMT", 3, function () { lmsActivateEx(); });
|
|
//d4username.readOnly = true;
|
|
d4username.disabled = true;
|
|
d4username.value = 'admin';
|
|
inputBoxFocus('d4password');
|
|
lmsUpdateLoginDialog();
|
|
}
|
|
|
|
// Go head with Intel AMT client control mode activation
|
|
function lmsActivateEx()
|
|
{
|
|
lms.SendCmd(3); // Send request for account information
|
|
statusbox("Activación Intel® AMT", "Fetching Account Information...");
|
|
}
|
|
|
|
// Called each time something changes in the login dialog
|
|
function lmsUpdateLoginDialog(e, d) {
|
|
var ok = passwordcheck(d4password.value);
|
|
QE('idx_dlgOkButton', ok);
|
|
if (e != null && e.keyCode == 13 && d == 1) inputBoxFocus('d4password');
|
|
if (ok == true && e != null && e.keyCode == 13 && d == 2) dialogclose(1);
|
|
}
|
|
|
|
var lmsHashArgStrings = ["MD5", "SHA1", "SHA256", "SHA512"];
|
|
function lmsShowTrustedHashesDlg() {
|
|
// {\"AC\":%d,\"DF\":%d,\"AL\":%d,\"NA\":\"%s\",\"HA\":\"%s\"}"
|
|
|
|
var x = '<div style=max-height:240px;overflow-y:scroll>' + TableStart();
|
|
for (var i in lmsMeInfo['TrustedHashes'])
|
|
{
|
|
//x += '<b>' + lmsMeInfo['TrustedHashes'][i]['Name'] + '</b><br><span style=font-size:10px>' + lmsHashArgStrings[lmsMeInfo['TrustedHashes'][i]['HashAlgorithm']] + (lmsMeInfo['TrustedHashes'][i]['Active'] == 1?", Active":'') + (lmsMeInfo['TrustedHashes'][i]['Default'] == 1?", Default":'') + '</span><br><span style=font-size:10px>' + lmsMeInfo['TrustedHashes'][i]['Hash'] + '</span><br><br>';
|
|
x += TableEntry('<b>' + lmsMeInfo['TrustedHashes'][i]['Name'] + '</b><br><span style=font-size:10px>' + lmsHashArgStrings[lmsMeInfo['TrustedHashes'][i]['HashAlgorithm']] + (lmsMeInfo['TrustedHashes'][i]['Active'] == 1?", Active":'') + (lmsMeInfo['TrustedHashes'][i]['Default'] == 1?", Default":'') + '</span><br><span style=font-size:8px>' + lmsMeInfo['TrustedHashes'][i]['Hash'] + '</span>', '');
|
|
}
|
|
x += TableEnd() + '</div>';
|
|
messagebox("Intel® AMT Trusted Hashes", x);
|
|
}
|
|
|
|
function lmsShowVersionsDlg() {
|
|
var x = TableStart();
|
|
x += TableEntry("Intel® AMT", lmsMeInfo['Versions']['AMT']);
|
|
if (lmsMeInfo['MeiVersion'] != null) { x += TableEntry("Intel® MEI driver", lmsMeInfo['MeiVersion']); }
|
|
for (var i in lmsMeInfo['Versions']) { if (i != 'AMT') x += TableEntry(i, lmsMeInfo['Versions'][i]); }
|
|
x += TableEnd();
|
|
messagebox("Intel® AMT Versions", x);
|
|
}
|
|
|
|
// ###END###{Mode-LMS}
|
|
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
function connectButtonfunction() {
|
|
if (!wsstack || wsstack.socketState == 0) { meshcentral2credCallback(); } else { disconnect(); }
|
|
}
|
|
|
|
function connectButtonfunctionEx() {
|
|
currentMeshNode = parent.getCurrentNode();
|
|
connect(currentMeshNode._id, 16992, null, null, 0);
|
|
Q('xconnectbutton1').value = "Desconectar";
|
|
}
|
|
|
|
function getCurrentMeshNode() { return currentMeshNode; }
|
|
function setConnectionState(isConnectable) { QE('xconnectbutton1', isConnectable); if (isConnectable == false) { disconnect(); } }
|
|
function setFrameHeight(height) {
|
|
//console.log('setFrameHeight', height);
|
|
//QS('entireBody').height = height;
|
|
}
|
|
function setAuthCallback(updateAmtCredentials) { meshcentral2credCallback = updateAmtCredentials; }
|
|
function setUrlVar(name, value) { if (!urlvars) { urlvars = {}; } urlvars[name] = value; }
|
|
// ###END###{Mode-MeshCentral2}
|
|
|
|
function cleanup() {
|
|
// ###BEGIN###{Terminal}
|
|
// ###BEGIN###{FileSaver}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
idx_terminalCaptureButton.value = "Iniciar captura";
|
|
// ###END###{!Mode-NodeWebkit}
|
|
if (terminal.m.capture) delete terminal.m.capture;
|
|
// ###END###{FileSaver}
|
|
terminal.Stop();
|
|
// ###END###{Terminal}
|
|
// ###BEGIN###{Desktop}
|
|
desktop.disconnectCode = 0;
|
|
desktop.Stop();
|
|
// ###END###{Desktop}
|
|
}
|
|
|
|
function handleKeyUp(e) {
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{ComputerSelector}
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
if (currentView == 101) {
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer == null) {
|
|
// ###END###{MeshServerConnect}
|
|
if (e.keyCode == 45) { addComputer(); } // Insert key
|
|
if (e.keyCode == 46) { deleteComputers(); } // Delete key
|
|
// ###BEGIN###{MeshServerConnect}
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
if ((e.keyCode == 65) && (e.ctrlKey == true)) { selectAllComputers(); } // Select all
|
|
if (e.keyCode == 13) { if (computersRunningScripts == 0) { computerConnect(event, currentcomputer.h); } } // Enter key
|
|
if ((e.keyCode == 8) && !filterFocus) { var x = Q('computerFilter').value; Q('computerFilter').value = (x.substring(0, x.length - 1)); computerFilterFunc(); }
|
|
if (e.keyCode == 27) { Q('computerFilter').value = ''; computerFilterFunc(); }
|
|
}
|
|
// ###END###{ComputerSelector-Local}
|
|
// ###BEGIN###{ComputerSelector-Remote}
|
|
if (currentView == 101) {
|
|
if ((e.keyCode == 65) && (e.ctrlKey == true)) { selectAllComputers(); } // Select all
|
|
}
|
|
// ###END###{ComputerSelector-Remote}
|
|
// ###END###{ComputerSelector}
|
|
// ###BEGIN###{CertificateManager}
|
|
if (currentView == 103) {
|
|
//if (e.keyCode == 45) { addComputer(); } // Insert key
|
|
if (e.keyCode == 46) { cert_deleteCertificates(); } // Delete key
|
|
//if ((e.keyCode == 65) && (e.ctrlKey == true)) { selectAllCertificates(); } // Select all
|
|
}
|
|
// ###END###{CertificateManager}
|
|
// ###BEGIN###{Desktop}
|
|
// ###BEGIN###{!DesktopInband}
|
|
if (currentView == 14 && desktop.State == 3) { if (!Q('id_DeskVO').checked) { return desktop.m.handleKeyUp(e); } }
|
|
// ###END###{!DesktopInband}
|
|
// ###BEGIN###{DesktopInband}
|
|
if (currentView == 14 && desktop.State == 3) { if (Q('id_DeskVO').checked) return; if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.handleKeyUp(e); desktop.m.sendKeepAlive(); } else { return desktop.m.handleKeyUp(e); } }
|
|
// ###END###{DesktopInband}
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Terminal}
|
|
if (currentView == 13 && terminal.State == 3) return terminal.m.TermHandleKeyUp(e);
|
|
// ###END###{Terminal}
|
|
}
|
|
|
|
function handleKeyDown(e) {
|
|
//console.log('handleKeyDown', e);
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{Desktop}
|
|
// ###BEGIN###{!DesktopInband}
|
|
if (currentView == 14 && desktop.State == 3) { if (!Q('id_DeskVO').checked) { return desktop.m.handleKeyDown(e); } }
|
|
// ###END###{!DesktopInband}
|
|
// ###BEGIN###{DesktopInband}
|
|
if (currentView == 14 && desktop.State == 3) { if (Q('id_DeskVO').checked) return; if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.handleKeyDown(e); desktop.m.sendKeepAlive(); } else { return desktop.m.handleKeyDown(e); } }
|
|
// ###END###{DesktopInband}
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Terminal}
|
|
if (currentView == 13 && terminal.State == 3) return terminal.m.TermHandleKeyDown(e);
|
|
// ###END###{Terminal}
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
if (currentView == 101) {
|
|
if (e.keyCode == 38) { var selectprev = null; for (var y in computerlist) { if (currentcomputer.h == computerlist[y].h) { if (selectprev != null) { computerSelect(null, selectprev); } } else { selectprev = computerlist[y].h; } } } // Up key
|
|
if (e.keyCode == 40) { var selectnext = 0; for (var y in computerlist) { if (selectnext == 1) { selectnext = 2; computerSelect(null, computerlist[y].h); } else { if (currentcomputer.h == computerlist[y].h) { selectnext = 1; } } } } // Down key
|
|
}
|
|
// ###END###{ComputerSelector-Local}
|
|
}
|
|
|
|
function handleKeyPress(e) {
|
|
//console.log('handleKeyPress', e);
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
if (currentView == 101) {
|
|
if ((!filterFocus) && (e.keyCode != 0)) { Q('computerFilter').value = ((Q('computerFilter').value + String.fromCharCode(e.keyCode))); computerFilterFunc(); }
|
|
}
|
|
// ###END###{ComputerSelector-Local}
|
|
// ###BEGIN###{Desktop}
|
|
// ###BEGIN###{!DesktopInband}
|
|
if (currentView == 14 && desktop.State == 3) { if (!Q('id_DeskVO').checked) { return desktop.m.handleKeys(e); } }
|
|
// ###END###{!DesktopInband}
|
|
// ###BEGIN###{DesktopInband}
|
|
if (currentView == 14 && desktop.State == 3) { if (Q('id_DeskVO').checked) return; if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.handleKeys(e); desktop.m.sendKeepAlive(); } else { return desktop.m.handleKeys(e); } }
|
|
// ###END###{DesktopInband}
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Terminal}
|
|
if (currentView == 13 && terminal.State == 3) return terminal.m.TermHandleKeys(e);
|
|
// ###END###{Terminal}
|
|
// ###BEGIN###{SessionRecording}
|
|
if (currentView == 104) {
|
|
if (e.keyCode == 32) { srec_togglePause(); haltEvent(e); }
|
|
if (e.keyCode == 49) { Q('srec_PlaySpeed').value = 4; haltEvent(e); }
|
|
if (e.keyCode == 50) { Q('srec_PlaySpeed').value = 2; haltEvent(e); }
|
|
if (e.keyCode == 51) { Q('srec_PlaySpeed').value = 1; haltEvent(e); }
|
|
if (e.keyCode == 52) { Q('srec_PlaySpeed').value = 0.5; haltEvent(e); }
|
|
if (e.keyCode == 53) { Q('srec_PlaySpeed').value = 0.25; haltEvent(e); }
|
|
if (e.keyCode == 54) { Q('srec_PlaySpeed').value = 0.1; haltEvent(e); }
|
|
if (e.keyCode == 48) { srec_pause(); srec_restart(); haltEvent(e); }
|
|
}
|
|
// ###END###{SessionRecording}
|
|
}
|
|
|
|
var connectFunc = null;
|
|
var connectFuncTag = null;
|
|
function connect(host, port, user, pass, tls, func, functag) {
|
|
go(0);
|
|
fullscreenonly = false;
|
|
connectFunc = func;
|
|
connectFuncTag = functag;
|
|
|
|
// ###BEGIN###{Desktop}
|
|
if (urlvars['kvm'] == 1) { go(14); }
|
|
if ((urlvars['kvmfull'] == 1) || (urlvars['kvmonly'] == 1)) { go(14); deskToggleFull(urlvars['kvmonly'] == 1); }
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Terminal}
|
|
if (urlvars['sol'] == 1) { go(13); }
|
|
// ###END###{Terminal}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var tlsoptions = {};
|
|
// ###BEGIN###{CertificateManager}
|
|
|
|
// Create a list of trusted certificates in PEM format
|
|
var trustedCertStringsPem = [];
|
|
for (var y in certificateStore) {
|
|
var certificate = certificateStore[y];
|
|
if (certificate['trusted'] == true) { trustedCertStringsPem.push('-----BEGIN CERTIFICATE-----\n' + certificate['certbin'] + '\n-----END CERTIFICATE-----\n'); }
|
|
}
|
|
tlsoptions.ca = trustedCertStringsPem;
|
|
|
|
// Setup out console TLS authentication certificate
|
|
var authcert = getTlsAuthCertificate();
|
|
if (authcert != null) {
|
|
tlsoptions.cert = forge.pki.certificateToPem(authcert['cert']);
|
|
tlsoptions.key = forge.pki.privateKeyToPem(authcert['privateKey']);
|
|
}
|
|
|
|
// ###END###{CertificateManager}
|
|
|
|
// ###BEGIN###{!MeshServerConnect}
|
|
wsstack = WsmanStackCreateService(host, port, user, pass, tls, tlsoptions);
|
|
// ###END###{!MeshServerConnect}
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) {
|
|
wsstack = WsmanStackCreateService(currentcomputer._id, null, null, null, 0, meshCentralServer);
|
|
} else {
|
|
wsstack = WsmanStackCreateService(host, port, user, pass, tls, tlsoptions);
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
wsstack = WsmanStackCreateService(host, port, user, pass, tls);
|
|
// ###END###{!Mode-NodeWebkit}
|
|
amtstack = AmtStackCreateService(wsstack);
|
|
amtstack.onProcessChanged = onProcessChanged;
|
|
|
|
// Setup TLS checking
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
wsstack.comm.xtlsSkipHostCheck = NW_SkipTlsHostnameCheck;
|
|
if (NW_TlsSecurityMode == 0) { wsstack.comm.xtlsFingerprint = 0; }
|
|
else { wsstack.comm.xtlsFingerprint = currentcomputer['tlscerthash'] ? currentcomputer['tlscerthash'] : currentcomputer['tlscerthash2']; }
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// Hide TLS indicator
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
QV('tlsNotification1', false);
|
|
QV('tlsNotification2', false);
|
|
QV('tlsNotification3', false);
|
|
QV('tlsNotification4', false);
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// Setup Digest Realm checking
|
|
// ###BEGIN###{ComputerSelector}
|
|
if (currentcomputer['digestrealm']) { wsstack.comm.digestRealmMatch = currentcomputer['digestrealm']; }
|
|
// ###END###{ComputerSelector}
|
|
|
|
// Hide most of the left menu options, we will see them as we load data
|
|
for (var i = 2; i < 25; i++) { QV('go' + i, false); }
|
|
QV('go8', true); // Network Settings
|
|
// ###BEGIN###{Terminal}
|
|
QV('go13', false); // Terminal
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
QE('TermWD', false);
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###END###{Terminal}
|
|
// ###BEGIN###{Desktop}
|
|
//QV('go14', false); // Desktop
|
|
// ###END###{Desktop}
|
|
//QV('go15', false); // Audit Log
|
|
// ###BEGIN###{WsmanBrowser}
|
|
QV('go12', true); // WSMAN Browser
|
|
// ###END###{WsmanBrowser}
|
|
// ###BEGIN###{Certificates}
|
|
//QV('go16', false); // Security Settings
|
|
// ###END###{Certificates}
|
|
// ###BEGIN###{RemoteAccess}
|
|
//QV('go17', false); // Remote Access
|
|
// ###END###{RemoteAccess}
|
|
// ###BEGIN###{Scripting-Editor}
|
|
QV('go20', true); // Scripting Editor
|
|
// ###END###{Scripting-Editor}
|
|
|
|
// ###BEGIN###{Storage}
|
|
// ###BEGIN###{Mode-Firmware}
|
|
//QH('storagelinks', '');
|
|
// ###END###{Mode-Firmware}
|
|
// ###END###{Storage}
|
|
|
|
// Clear the displayed power state
|
|
// ###BEGIN###{Terminal}
|
|
QH('id_p13power', ''); // Terminal
|
|
// ###END###{Terminal}
|
|
// ###BEGIN###{Desktop}
|
|
QH('id_p14power', ''); // Desktop
|
|
// ###END###{Desktop}
|
|
|
|
// Clear everything, make sure all connection state is reset.
|
|
amtversion = amtversionmin = amtFirstPull = 0;
|
|
amtsysstate = amtdeltatime = amtlogicalelements = HardwareInventory = undefined;
|
|
amtPowerBootCapabilities = null;
|
|
xxAccountFetch = 999;
|
|
// ###BEGIN###{PowerControl}
|
|
// ###BEGIN###{!Mode-MeshCentral2}
|
|
|
|
if (!urlvars['norefresh']) { amtPowerPollTimer = setInterval(PullPowerState, 5000); }
|
|
|
|
// ###END###{!Mode-MeshCentral2}
|
|
// ###END###{PowerControl}
|
|
|
|
// Show loading on all panels
|
|
QH('id_TableSysStatus', LoadingHtml);
|
|
// ###BEGIN###{NetworkSettings}
|
|
QH('id_TableNetworkSettingsSpan', LoadingHtml);
|
|
amtwirelessif = -1;
|
|
// ###BEGIN###{Wireless}
|
|
xxWireless = undefined;
|
|
QH('id_TableWifi2', '');
|
|
// ###END###{Wireless}
|
|
// ###END###{NetworkSettings}
|
|
// ###BEGIN###{HardwareInfo}
|
|
QH('id_TableSysInfo', LoadingHtml);
|
|
// ###END###{HardwareInfo}
|
|
|
|
xxAccountAdminName = null;
|
|
xxAccountRealmInfo = {};
|
|
QH('id_TableUserAccounts', LoadingHtml);
|
|
// ###BEGIN###{EventLog}
|
|
eventmessages = null;
|
|
QH('id_TableEventLog','');
|
|
QH('id_TableEventLog2',LoadingHtml);
|
|
// ###END###{EventLog}
|
|
// ###BEGIN###{AuditLog}
|
|
auditLog = null;
|
|
QH('id_TableAuditLog1', '');
|
|
QH('id_TableAuditLog2', LoadingHtml);
|
|
// ###END###{AuditLog}
|
|
// ###BEGIN###{Certificates}
|
|
xxCertificates = null;
|
|
QH('id_TableCerts', LoadingHtml);
|
|
// ###END###{Certificates}
|
|
// ###BEGIN###{WsmanBrowser}
|
|
QH('id_wsresults', '');
|
|
// ###END###{WsmanBrowser}
|
|
// ###BEGIN###{IDER}
|
|
iderStop();
|
|
// ###END###{IDER}
|
|
// ###BEGIN###{RemoteAccess}
|
|
xxRemoteAccess = null;
|
|
xxEnvironementDetection = null;
|
|
xxCiraServers = null;
|
|
xxUserInitiatedCira = null;
|
|
xxRemoteAccessCredentiaLinks = null;
|
|
xxMPSUserPass = null;
|
|
xxPolicies = null;
|
|
QH('id_TableRemoteAccess', LoadingHtml);
|
|
// ###END###{RemoteAccess}
|
|
// ###BEGIN###{AgentPresence}
|
|
QH('id_TableSystemAgentPresence', LoadingHtml);
|
|
// ###END###{AgentPresence}
|
|
// ###BEGIN###{SystemDefense}
|
|
xxSystemDefense = null;
|
|
xxSystemDefenceLinkedPolicy = {};
|
|
xxUpdatingDefenseStats = false;
|
|
xxFilterStatistics = [{}, {}]; // Wired and wireless interface stats
|
|
xxFilterStatisticsTimer = null;
|
|
xxFilterStatisticsTimerActive = false;
|
|
QH('id_TableSystemDefense', LoadingHtml);
|
|
// ###END###{SystemDefense}
|
|
// ###BEGIN###{Desktop}
|
|
QE('id_DeskCAD', false);
|
|
// ###BEGIN###{DesktopClipboard}
|
|
QE('id_DeskKvmClipButton', false);
|
|
// ###END###{DesktopClipboard}
|
|
QE('DeskWD', false);
|
|
QE('deskkeys', false);
|
|
if (urlvars['kvmviewonly']) { QE('id_DeskVO', false); Q('id_DeskVO').checked = true; }
|
|
// ###BEGIN###{DesktopType}
|
|
QE('id_DeskType', false);
|
|
// ###END###{DesktopType}
|
|
// ###END###{Desktop}
|
|
|
|
// ###BEGIN###{Desktop-Multi}
|
|
desktopScreenInfo = null;
|
|
// ###END###{Desktop-Multi}
|
|
|
|
// Start pulling Intel AMT information
|
|
amtstack.BatchEnum('', ['CIM_SoftwareIdentity', '*AMT_SetupAndConfigurationService'], processSystemVersion); // Get Intel AMT version information and plenty more
|
|
//amtstack.Enum('CIM_LogicalElement', processSystemVersion); // Get Intel AMT version information and plenty more
|
|
|
|
// ###BEGIN###{VersionWarning}
|
|
QV('id_versionWarning', false);
|
|
// ###END###{VersionWarning}
|
|
|
|
// ###BEGIN###{Scripting-Editor}
|
|
fupdatescript();
|
|
// ###END###{Scripting-Editor}
|
|
}
|
|
|
|
function disconnect() {
|
|
// ###BEGIN###{Desktop-Multi}
|
|
if (desktopPollTimer != null) {clearInterval(desktopPollTimer); desktopPollTimer = null; }
|
|
// ###END###{Desktop-Multi}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (urlvars['host']) {
|
|
require('nw.gui').Window.get().close();
|
|
//require('nw.gui').App.quit();
|
|
return;
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{Desktop}
|
|
if (fullscreen) deskToggleFull();
|
|
// ###END###{Desktop}
|
|
|
|
// ###BEGIN###{IDER}
|
|
iderStop();
|
|
// ###END###{IDER}
|
|
|
|
// ###BEGIN###{PowerControl}
|
|
// ###BEGIN###{!Mode-MeshCentral2}
|
|
if (amtPowerPollTimer != null) { clearInterval(amtPowerPollTimer); amtPowerPollTimer = null; }
|
|
// ###END###{!Mode-MeshCentral2}
|
|
// ###END###{PowerControl}
|
|
|
|
// ###BEGIN###{SystemDefense}
|
|
StopDefenseStatsTimer();
|
|
// ###END###{SystemDefense}
|
|
|
|
// ###BEGIN###{Scripting}
|
|
script_Stop();
|
|
// ###END###{Scripting}
|
|
// ###BEGIN###{Scripting-Editor}
|
|
breakScriptButton();
|
|
// ###END###{Scripting-Editor}
|
|
|
|
dialogclose(0);
|
|
// ###BEGIN###{!Mode-MeshCentral2}
|
|
QH('id_computername', '');
|
|
// ###END###{!Mode-MeshCentral2}
|
|
if (amtstack) {
|
|
amtstack.onProcessChanged = null; // Un-hook progress indicator
|
|
amtstack.CancelAllQueries(999); // Fail all pending WSMAN calls. Set to 999 to indicate not to call back any of the pending calls with errors.
|
|
amtstack = null;
|
|
}
|
|
cleanup();
|
|
wsstack = null;
|
|
delete amtstack;
|
|
onProcessChanged(0, 1);
|
|
go(101);
|
|
// ###BEGIN###{!Mode-MeshCentral2}
|
|
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) {
|
|
QH('id_computername', format("Consola de administración remota v{0}, servidor: {1}", version, meshCentralServer.host));
|
|
} else {
|
|
QH('id_computername', format("Consola de administración remota v{0}", version));
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{!MeshServerConnect}
|
|
QH('id_computername', format("Consola de administración remota v{0}", version));
|
|
// ###END###{!MeshServerConnect}
|
|
|
|
// ###END###{!Mode-MeshCentral2}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
require('nw.gui').Window.get().title = NW_WindowTitle;
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
Q('xconnectbutton1').value = "Conectar";
|
|
QH('id_messageviewstr', "Desconectado");
|
|
go(100);
|
|
// ###END###{Mode-MeshCentral2}
|
|
}
|
|
|
|
function onProcessChanged(a, b) {
|
|
QS('id_progressbar').width = ((a * 100) / b) + '%';
|
|
if (a == 0) refreshButtons(true); // If nothing is being done, re-enable refresh buttons
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
// Don't do any WSMAN if we don't need to do it.
|
|
if ((urlvars['kvmonly'] == 1) || (fullscreenonly == true)) return;
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// If there is nothing being done now, see if we can pull more information
|
|
if (a != 0 || !amtstack) return;
|
|
if ((amtversion > 0) && ((amtFirstPull & 64) == 0)) {
|
|
amtFirstPull |= 64;
|
|
PullPowerPolicy();
|
|
// ###BEGIN###{EventSubscriptions}
|
|
subscriptionsFilters = null;
|
|
PullEventSubscriptions();
|
|
// ###END###{EventSubscriptions}
|
|
// ###BEGIN###{AgentPresence}
|
|
PullWatchdog();
|
|
// ###END###{AgentPresence}
|
|
|
|
// ###BEGIN###{Scripting-Editor}
|
|
scriptViewButton(script_BuildingBlocks?1:0);
|
|
// ###END###{Scripting-Editor}
|
|
|
|
if (amtversion > 5) {
|
|
// ###BEGIN###{Certificates}
|
|
PullCertificates();
|
|
// ###END###{Certificates}
|
|
// ###BEGIN###{RemoteAccess}
|
|
PullRemoteAccess();
|
|
// ###END###{RemoteAccess}
|
|
}
|
|
return;
|
|
}
|
|
// ###BEGIN###{HardwareInfo}
|
|
if ((amtFirstPull & 1) == 0) { PullHardware(); return; }
|
|
// ###END###{HardwareInfo}
|
|
// ###BEGIN###{EventLog}
|
|
if ((amtFirstPull & 16) == 0) { PullEventLog(); return; }
|
|
// ###END###{EventLog}
|
|
// ###BEGIN###{AuditLog}
|
|
if ((amtFirstPull & 32) == 0) { PullAuditLog(); return; }
|
|
// ###END###{AuditLog}
|
|
}
|
|
|
|
// ###BEGIN###{Mode-LMS}
|
|
function toolmenuclick(x) {
|
|
QV('id_menuitem1', currentView == 101);
|
|
// ###BEGIN###{USBSetup}
|
|
QV('id_menuitem2', currentView == 102);
|
|
// ###END###{USBSetup}
|
|
// ###BEGIN###{CertificateManager}
|
|
QV('id_menuitem3', currentView == 103);
|
|
// ###END###{CertificateManager}
|
|
// ###BEGIN###{SessionRecording}
|
|
QV('id_menuitem4', currentView == 104);
|
|
// ###END###{SessionRecording}
|
|
|
|
var d = (QS('id_computerSelectorMenu').display == 'none');
|
|
if (d == true && xxdialogMode) return;
|
|
xxdialogMode = (d == true)?999:undefined;
|
|
QV('id_computerSelectorMenu', d);
|
|
if (x == 0) return;
|
|
go(x);
|
|
}
|
|
// ###END###{Mode-LMS}
|
|
|
|
// ###BEGIN###{ComputerSelector}
|
|
|
|
var computerlist = [];
|
|
var currentcomputer = null;
|
|
var computersRunningScripts = 0;
|
|
|
|
function toolmenuclick(x) {
|
|
QV('id_menuitem1', currentView == 101);
|
|
// ###BEGIN###{USBSetup}
|
|
QV('id_menuitem2', currentView == 102);
|
|
// ###END###{USBSetup}
|
|
// ###BEGIN###{CertificateManager}
|
|
QV('id_menuitem3', currentView == 103);
|
|
// ###END###{CertificateManager}
|
|
// ###BEGIN###{SessionRecording}
|
|
QV('id_menuitem4', currentView == 104);
|
|
// ###END###{SessionRecording}
|
|
|
|
var d = (QS('id_computerSelectorMenu').display == 'none');
|
|
if (x == -1) { QV('id_computerSelectorMenu', false); xxdialogMode = undefined; return; }
|
|
if (d == true && xxdialogMode) return;
|
|
xxdialogMode = (d == true)?999:undefined;
|
|
QV('id_computerSelectorMenu', d);
|
|
if (x <= 0) return;
|
|
go(x);
|
|
}
|
|
|
|
function computerFilterFunc() {
|
|
var filter = computerFilter.value.toLowerCase();
|
|
for (var w in computerlist) { QV('CX-' + computerlist[w].h, filter == '' || computerlist[w].checked == true || computerlist[w]['host'].toLowerCase().indexOf(filter) >= 0 || computerlist[w]['name'].toLowerCase().indexOf(filter) >= 0); }
|
|
}
|
|
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
function addComputer() {
|
|
if (xxdialogMode) return;
|
|
|
|
// Build the list of groups
|
|
var groups = [], x = '';
|
|
for (var y in computerlist) { var computer = computerlist[y]; if ((computer.tags != null) && (computer.tags != '') && (groups.indexOf(computer.tags) == -1) && (computer.tags.indexOf('"') == -1)) { groups.push(computer.tags); } }
|
|
groups.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); });
|
|
for (var y in groups) { x += '<option value="' + groups[y] + '">'; }
|
|
QH('d4devGroups', x);
|
|
|
|
// Display the dialog box
|
|
d4name.value = d4tags.value = d4hostname.value = d4password.value = '';
|
|
d4username.value = "administración";
|
|
if (kerberos != null) {
|
|
QH('d4security', '<option value=0>' + "Resumen / Ninguno" + '</option><option value=1>' + "Resumen / TLS" + '</option><option value=2>' + "Kerberos / Ninguno" + '</option><option value=3>' + "Kerberos / TLS" + '</option>');
|
|
} else {
|
|
QH('d4security', '<option value=0>' + "Resumen / Ninguno" + '</option><option value=1>' + "Resumen / TLS" + '</option>');
|
|
}
|
|
d4security.value = 0;
|
|
setDialogMode(4, "Agregar computadora", 3, function () { addComputerButton(); });
|
|
updateComputerDialog();
|
|
d4name.focus();
|
|
}
|
|
|
|
// Toggle the select of all computers
|
|
// TODO: Fix problem with this combined with filter box
|
|
function selectAllComputers() {
|
|
var x = false;
|
|
for (var y in computerlist) { if (computerlist[y].checked == false) { x = true; } }
|
|
for (var y in computerlist) { computerlist[y].checked = x; Q('SJ-' + computerlist[y]['h']).checked = x; } // TODO: Only select or un-select when element is visible
|
|
}
|
|
|
|
function deleteComputers() {
|
|
if (xxdialogMode) return;
|
|
// Figure out how many computers are selected.
|
|
var clist = [];
|
|
for (var y in computerlist) { if (computerlist[y].checked == true) { clist.push(computerlist[y]); } }
|
|
if (clist.length == 0) { clist.push(currentcomputer); }
|
|
if (clist.length == 1) {
|
|
setDialogMode(11, "Eliminar computadoras", 3, deleteComputersEx, '<br>' + "¿Eliminar computadora?", clist);
|
|
} else {
|
|
setDialogMode(11, "Eliminar computadoras", 3, deleteComputersEx, '<br>' + format("¿Eliminar {0} computadoras?", clist.length), clist);
|
|
}
|
|
}
|
|
|
|
function deleteComputersEx(button, clist) {
|
|
for (var i in clist) {
|
|
var handleToDelete = clist[i]['h'];
|
|
if ((currentcomputer != null) && (currentcomputer['h'] == handleToDelete)) { currentcomputer = null; }
|
|
for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == handleToDelete) { computerlist.splice(x, 1); } }
|
|
}
|
|
saveComputers();
|
|
updateComputerList();
|
|
updateComputerDetails();
|
|
}
|
|
|
|
function newComputerList() {
|
|
if (xxdialogMode) return;
|
|
QH('id_dialogMessage', "Clear list of known Intel® AMT computers?");
|
|
setDialogMode(1, "Nueva lista de computadoras", 3, newComputerListOk);
|
|
}
|
|
|
|
function newComputerListOk(r) {
|
|
computerlist = [];
|
|
currentcomputer = null;
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
idx_d18computerfilename.value = 'computerlist.json';
|
|
// ###END###{!Mode-NodeWebkit}
|
|
saveComputers();
|
|
updateComputerList();
|
|
}
|
|
|
|
function openComputerList() {
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
setDialogMode(17, "Open Computer List", 3, openComputerListOk);
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = Q('idx_d17computerlistfile');
|
|
if (chooser.getAttribute('eventset') != 1) {
|
|
chooser.setAttribute('eventset', '1');
|
|
chooser.addEventListener('change', NW_LoadComputersEx, false);
|
|
}
|
|
chooser.value = null;
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
function openComputerListOk(r) {
|
|
if (r != 1) return;
|
|
var x = Q('idx_d17computerlistfile');
|
|
if (x.files.length != 1) return;
|
|
var reader = new FileReader();
|
|
reader.onload = function(file) { onComputerListRead(file, Q('idx_d17computerlistfile').files[0].name); }
|
|
reader.readAsBinaryString(x.files[0]);
|
|
}
|
|
|
|
function onComputerListRead(file, name, pass) {
|
|
var x;
|
|
if (name.toLowerCase().endsWith('.csv')) {
|
|
// Load from a CSV file
|
|
x = { computers: [] };
|
|
var lines = file.target.result.split('\r\n').join('\n').split('\n'), headers = {}, count = 0;
|
|
for (var i in lines) {
|
|
var values = lines[i].split(',');
|
|
if (i == 0) {
|
|
// Fill the headers
|
|
for (var j in values) {
|
|
if (values[j] == 'Intel AMT FQDN') { headers[j] = 'name'; }
|
|
if (values[j] == 'Intel AMT IPv4') { headers[j] = 'host'; }
|
|
if (values[j] == 'Intel AMT Version') { headers[j] = 'ver'; }
|
|
//if (values[j] == 'Last Connection Time') { headers[j] = 'date'; }
|
|
}
|
|
} else {
|
|
// Fill data
|
|
var computerEntry = {};
|
|
for (var j in values) {
|
|
if (headers[j] && (values[j].length > 0)) { computerEntry[headers[j]] = values[j]; }
|
|
}
|
|
if (computerEntry.host || computerEntry.name) {
|
|
if (computerEntry.host == null) { computerEntry.host = computerEntry.name; }
|
|
if (computerEntry.user == null) { computerEntry.user = 'admin'; }
|
|
if (computerEntry.pass == null) { computerEntry.pass = ''; }
|
|
if (computerEntry.tls == null) { computerEntry.tls = 1; }
|
|
x.computers.push(computerEntry);
|
|
count++;
|
|
}
|
|
}
|
|
}
|
|
if (count == 0) { x = {}; }
|
|
} else {
|
|
try { x = JSON.parse(file.target.result); } catch (ex) { }
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (x && x['magic'] == '3209ruwpcoinaT4r9w347t0e4ug') {
|
|
if (pass) {
|
|
// Decrypt the file
|
|
x = getDecryptedData(x, pass);
|
|
if (x && (x != null)) { x = JSON.parse(x); }
|
|
} else {
|
|
// Prompt to the password
|
|
var x = "El archivo seleccionado requiere una contraseña." + '<br/><br/><div style=height:26px><input id=idx_filepass type=password style=float:right;width:200px onkeyup=filePasswordDialogUpdate()><div>' + "Contraseña" + '</div></div>';
|
|
setDialogMode(11, "Contraseña de archivo", 3, onComputerListReadEx, x, [file, name]);
|
|
filePasswordDialogUpdate();
|
|
return;
|
|
}
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
if (!x || !x['computers']) {
|
|
messagebox("Abrir documento", "Archivo de lista de computadora no válido o dañado. No se puede abrir.");
|
|
} else {
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
idx_d18computerfilename.value = name;
|
|
// ###END###{!Mode-NodeWebkit}
|
|
currentcomputer = null;
|
|
computerlist = x['computers'];
|
|
for (var i in computerlist) { computerlist[i]['h'] = Math.random(); computerlist[i].checked = false; }
|
|
updateComputerList();
|
|
saveComputers();
|
|
}
|
|
}
|
|
|
|
function onComputerListReadEx(button, tag) { onComputerListRead(tag[0], tag[1], Q('idx_filepass').value); }
|
|
function filePasswordDialogUpdate() { QE('idx_dlgOkButton', passwordcheck(Q('idx_filepass').value)); }
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
|
|
function saveComputerListUpdate() {
|
|
var ok = true;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
QV('d18showpassword', d18usepassword.checked);
|
|
if (d18usepassword.checked == true) { ok = (passwordcheck(d18password1.value) && (d18password1.value == d18password2.value)) };
|
|
// ###END###{Mode-NodeWebkit}
|
|
QE('idx_dlgOkButton', ok);
|
|
}
|
|
|
|
function saveComputerList() {
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
d18usepassword.checked = false;
|
|
d18password1.value = '';
|
|
d18password2.value = '';
|
|
// ###END###{Mode-NodeWebkit}
|
|
setDialogMode(18, "Guardar lista de computadoras", 3, saveComputerListOk);
|
|
saveComputerListUpdate();
|
|
}
|
|
|
|
function saveComputerListOk() {
|
|
var computerlist2 = Clone(computerlist);
|
|
for (var i in computerlist2) { delete computerlist2[i]['h']; delete computerlist2[i].checked; delete computerlist2[i]['consolemsg']; }
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
saveAs(data2blob(JSON.stringify({ 'webappversion':version, 'computers':computerlist2 }, null, ' ').replace(/\n/g, '\r\n')), idx_d18computerfilename.value);
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file');
|
|
chooser.setAttribute('nwsaveas', 'computerlist.json');
|
|
chooser.addEventListener('change', function() {
|
|
if (this.value == '') return;
|
|
if (d18usepassword.checked == false) {
|
|
require('fs').writeFile(this.value, JSON.stringify({ 'webappversion': version, 'computers': computerlist2 }, null, ' ').replace(/\n/g, '\r\n'), function () { });
|
|
} else {
|
|
require('fs').writeFile(this.value, JSON.stringify(getEncryptedData(JSON.stringify({ 'webappversion': version, 'computers': computerlist2 }, null, ' '), d18password1.value), null, ' ').replace(/\n/g, '\r\n'), function () { });
|
|
}
|
|
this.value = '';
|
|
}, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
function getEncryptedData(dataStr, password) {
|
|
var crypto = require('crypto');
|
|
var salt = crypto.randomBytes(16);
|
|
var key = crypto.pbkdf2Sync(password, salt, 128000, 16, 'sha512');
|
|
var iv = Math.round((Math.pow(36, 13) - Math.random() * Math.pow(36, 12))).toString(36).slice(1);
|
|
var cipher = crypto.createCipheriv('aes-256-gcm', key.toString('hex'), iv);
|
|
var encrypted = cipher.update(dataStr, 'utf8', 'hex') + cipher.final('hex');
|
|
return { 'magic': '3209ruwpcoinaT4r9w347t0e4ug', 'version': 1, 'salt': salt.toString('hex'), 'iv': iv, 'tag': cipher.getAuthTag().toString('hex'), 'data': encrypted };
|
|
}
|
|
|
|
function getDecryptedData(encryptedData, password) {
|
|
var crypto = require('crypto');
|
|
var salt = new require('buffer').Buffer(encryptedData['salt'], 'hex');
|
|
var iv = encryptedData['iv'];
|
|
var tag = new require('buffer').Buffer(encryptedData['tag'], 'hex');
|
|
var data = encryptedData['data'];
|
|
var key = crypto.pbkdf2Sync(password, salt, 128000, 16, 'sha512');
|
|
var decipher = crypto.createDecipheriv('aes-256-gcm', key.toString('hex'), iv);
|
|
decipher.setAuthTag(tag);
|
|
var decrypted = decipher.update(data, 'hex', 'utf8') + decipher.final('utf8');
|
|
return decrypted;
|
|
}
|
|
|
|
// ###END###{FileSaver}
|
|
|
|
function updateComputerDialog() {
|
|
var k = Q('d4security').value >= 2;
|
|
QV('d4digest', !k);
|
|
QV('d4kerb', k);
|
|
var hostSplit = d4hostname.value.split(':');
|
|
var hostnameok = (d4hostname.value.length > 0) && (hostSplit.length < 3);
|
|
if (hostnameok && (hostSplit.length == 2)) { var hostport = parseInt(hostSplit[1]); hostnameok = (hostport > 0) && (hostport < 65536) && (hostport == hostSplit[1]); }
|
|
QS('d4hostname')['background-color'] = (hostnameok ? 'white' : 'LightYellow');
|
|
if (k && hostnameok) {
|
|
QE('idx_dlgOkButton', d4hostname.value.length > 0);
|
|
} else {
|
|
QS('d4username')['background-color'] = (((d4username.value.length > 0) && (d4username.value != '*')) ? 'white' : 'LightYellow');
|
|
QS('d4password')['background-color'] = (((d4username.value == '$$OsAdmin') || passwordcheck(d4password.value) || d4password.value == '') ? 'white' : 'LightYellow');
|
|
QE('idx_dlgOkButton', d4hostname.value.length > 0 && d4username.value.length > 0 && d4username.value != '*' && ((d4username.value == '$$OsAdmin') || passwordcheck(d4password.value) || d4password.value == ''));
|
|
}
|
|
}
|
|
|
|
function addComputerButton() {
|
|
var k = Q('d4security').value >= 2;
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
if (k) {
|
|
computerlist.push({ 'h': Math.random(), 'name': encodeURIComponent(d4name.value), 'host': encodeURIComponent(d4hostname.value), 'tags': encodeURIComponent(d4tags.value), 'user': '*', 'pass': encodeURIComponent(Q('d4kerberos').value), 'tls': d4security.value % 2 });
|
|
} else {
|
|
computerlist.push({ 'h': Math.random(), 'name': encodeURIComponent(d4name.value), 'host': encodeURIComponent(d4hostname.value), 'tags': encodeURIComponent(d4tags.value), 'user': encodeURIComponent(d4username.value), 'pass': encodeURIComponent(d4password.value), 'tls': d4security.value % 2 });
|
|
}
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (k) {
|
|
computerlist.push({ 'h': Math.random(), 'name': encodeURIComponent(d4name.value), 'host': encodeURIComponent(d4hostname.value), 'tags': encodeURIComponent(d4tags.value), 'user': '*', 'pass': encodeURIComponent(Q('d4kerberos').value), 'tls': d4security.value % 2, 'tlscerthash': getCertPinning(d4hostname.value) });
|
|
} else {
|
|
computerlist.push({ 'h': Math.random(), 'name': encodeURIComponent(d4name.value), 'host': encodeURIComponent(d4hostname.value), 'tags': encodeURIComponent(d4tags.value), 'user': encodeURIComponent(d4username.value), 'pass': encodeURIComponent(d4password.value), 'tls': d4security.value % 2, 'tlscerthash': getCertPinning(d4hostname.value) });
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
saveComputers();
|
|
updateComputerList();
|
|
}
|
|
|
|
function computerSelector_FileSelectHandler(e) {
|
|
haltEvent(e);
|
|
if (e.dataTransfer == null || e.dataTransfer.files.length != 1) return;
|
|
var reader = new FileReader();
|
|
reader.onload = function(file) { onComputerListRead(file, e.dataTransfer.files[0].name); }
|
|
reader.readAsText(e.dataTransfer.files[0]);
|
|
}
|
|
|
|
function computerEdit(h) {
|
|
if (xxdialogMode) return;
|
|
var c = null;
|
|
for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
|
|
|
|
// Build the list of groups
|
|
var groups = [], x = '';
|
|
for (var y in computerlist) { var computer = computerlist[y]; if ((computer.tags != null) && (computer.tags != '') && (groups.indexOf(computer.tags) == -1) && (computer.tags.indexOf('"') == -1)) { groups.push(computer.tags); } }
|
|
groups.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); });
|
|
for (var y in groups) { x += '<option value="' + groups[y] + '">'; }
|
|
QH('d4devGroups', x);
|
|
|
|
// If connected to a MeshCentral server, only edit the device name
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) {
|
|
var x = '<div style=height:26px><input id=d11deviceName style=float:right;width:200px value="' + decodeURIComponent(c['name'] ? c['name'] : '') + '"><div>' + "Nombre amigable" + '</div></div>';
|
|
setDialogMode(11, "Editar dispositivo", 3, computerEditMeshOk, x, c);
|
|
return;
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
if (kerberos != null || c['user'] == '*') {
|
|
QH('d4security', '<option value=0>' + "Resumen / Ninguno" + '</option><option value=1>' + "Resumen / TLS" + '</option><option value=2>' + "Kerberos / Ninguno" + '</option><option value=3>' + "Kerberos / TLS" + '</option>');
|
|
} else {
|
|
QH('d4security', '<option value=0>' + "Resumen / Ninguno" + '</option><option value=1>' + "Resumen / TLS" + '</option>');
|
|
}
|
|
d4name.value = decodeURIComponent(c['name']?c['name']:'');
|
|
d4tags.value = decodeURIComponent(c['tags']?c['tags']:'');
|
|
d4hostname.value = decodeURIComponent(c['host']);
|
|
d4security.value = c['tls'] + ((c['user'] == '*')?2:0);
|
|
if (c['user'] == '*') {
|
|
d4kerberos.value = decodeURIComponent(c['pass']?c['pass']:'');
|
|
} else {
|
|
d4username.value = decodeURIComponent(c['user']?c['user']:'');
|
|
d4password.value = decodeURIComponent(c['pass']?c['pass']:'');
|
|
}
|
|
setDialogMode(4, "Editar dispositivo", 7, function (r) { computerEditOk(r, h); });
|
|
updateComputerDialog();
|
|
Q('d4name').focus();
|
|
}
|
|
|
|
// ###BEGIN###{MeshServerConnect}
|
|
function computerEditMeshOk(button, c) {
|
|
if (Q('d11deviceName').value != c.name) { meshCentralServer.send({ action: 'changedevice', nodeid: c._id, name: Q('d11deviceName').value }); }
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
function computerEditOk(r, h) {
|
|
if (r == 2) { computerRemoveEx(h); return; }
|
|
var c = null;
|
|
for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
|
|
c['name'] = decodeURIComponent(d4name.value);
|
|
c['tags'] = decodeURIComponent(d4tags.value);
|
|
c['host'] = decodeURIComponent(d4hostname.value);
|
|
if (d4security.value < 2) {
|
|
// Digest authentication
|
|
c['user'] = decodeURIComponent(d4username.value);
|
|
c['pass'] = decodeURIComponent(d4password.value);
|
|
} else {
|
|
// Kerberos authentication
|
|
c['user'] = '*';
|
|
c['pass'] = decodeURIComponent(d4kerberos.value);
|
|
}
|
|
c['tls'] = d4security.value % 2;
|
|
|
|
//for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { computerlist.splice(x, 1); } }
|
|
//var c = { 'h': h, "name": d4name.value, "host": d4hostname.value, "user": d4username.value, "pass": d4password.value, "tls": d4security.value };
|
|
//computerlist.push(c);
|
|
//if (currentcomputer['h'] == c['h']) { currentcomputer = c; }
|
|
saveComputers();
|
|
//computerSelect();
|
|
updateComputerList();
|
|
updateComputerDetails();
|
|
}
|
|
|
|
function computerRemoveEx(h) {
|
|
if (currentcomputer['h'] == h) currentcomputer = null;
|
|
for (x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { computerlist.splice(x, 1); } }
|
|
saveComputers();
|
|
updateComputerList();
|
|
updateComputerDetails();
|
|
}
|
|
|
|
function onFilterFocus(x) { filterFocus = x; }
|
|
|
|
// ###END###{ComputerSelector-Local}
|
|
|
|
function updateComputerList() {
|
|
QH('id_computerList', '');
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if ((meshCentralServer != null) && (computerlist.length == 0)) {
|
|
QV('id_noKnownComputers', false);
|
|
if (meshCentralServer.socketState < 3) {
|
|
QH('id_computerList', '<div style=width:99%;text-align:center;margin-top:36px;color:gray>' + "Conectando ..." + '</div>');
|
|
} else {
|
|
QH('id_computerList', '<div style=width:99%;text-align:center;margin-top:36px;color:gray>' + "No se encontraron computadoras Intel® AMT en esta cuenta." + '</div>');
|
|
}
|
|
QV('id_noKnownComputers', false);
|
|
} else {
|
|
QV('id_noKnownComputers', computerlist.length == 0);
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{!MeshServerConnect}
|
|
QV('id_noKnownComputers', computerlist.length == 0);
|
|
// ###END###{!MeshServerConnect}
|
|
QV('computerFilter', computerlist.length != 0);
|
|
// ###BEGIN###{FileSaver}
|
|
QE('saveComputersButton', computerlist.length != 0);
|
|
// ###END###{FileSaver}
|
|
// ###BEGIN###{Scripting}
|
|
computersRunningScripts = 0;
|
|
var computersWithScriptsMsgs = 0;
|
|
|
|
for (var y in computerlist) { if (computerlist[y].scriptstate) computersRunningScripts++; if (computerlist[y]['consolemsgs']) computersWithScriptsMsgs++; }
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (urlvars['autoexit'] && computersRunningScripts == 0 && computersWithScriptsMsgs > 0) {
|
|
require('nw.gui').Window.get().close();
|
|
//require('nw.gui').App.quit();
|
|
return;
|
|
} // Exit if no scripts are running
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{ComputerSelectorToolbar}
|
|
QE('idx_runScriptOnComputersButton', computerlist.length != 0);
|
|
// ###BEGIN###{MeshServerConnect}
|
|
QV('id_noScriptButtons', (computersRunningScripts == 0) && (meshCentralServer == null));
|
|
QV('idx_disconnectMeshCentralButton', meshCentralServer != null);
|
|
QV('idx_runScriptOnComputersButton', meshCentralServer == null);
|
|
QV('toolmenuicondiv', meshCentralServer == null);
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
QV('LeftMenuMyCerts', meshCentralServer == null);
|
|
QV('LeftMenuMyUsb', meshCentralServer == null);
|
|
QV('LeftMenuPlayer', meshCentralServer == null);
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{!MeshServerConnect}
|
|
QV('id_noScriptButtons', computersRunningScripts == 0);
|
|
// ###END###{!MeshServerConnect}
|
|
idx_runScriptOnComputersButton.value = (computersRunningScripts > 0 ? "Detener todas las secuencias de comandos" : "Ejecutar guión...")
|
|
// ###END###{ComputerSelectorToolbar}
|
|
// ###END###{Scripting}
|
|
QV('id_computerDetailsParent', computerlist.length != 0);
|
|
QS('id_computerListParent').right = (computerlist.length == 0 ? 0 : '300px');
|
|
computerlist.sort(function (a, b) { var aa = a['name'] ? a['name'].toLowerCase() : a['host'].toLowerCase(); var bb = b['name'] ? b['name'].toLowerCase() : b['host'].toLowerCase(); if (aa > bb) { return 1; } if (aa < bb) { return -1; } return 0; });
|
|
if (currentcomputer == null && computerlist.length > 0) { currentcomputer = computerlist[0]; }
|
|
|
|
// Built a sorted list of groups
|
|
var groups = [''], groupHtml = {};
|
|
for (var y in computerlist) { var computer = computerlist[y]; if ((computer.tags != null) && (groups.indexOf(computer.tags) == -1)) { groups.push(computer.tags); } }
|
|
groups.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); });
|
|
for (var y in groups) { groupHtml[groups[y]] = ''; }
|
|
|
|
// Go thru each computer and create the HTML entry
|
|
for (var y in computerlist) {
|
|
var computer = computerlist[y], extra = [], group = '', disabled = false;
|
|
if (computer.tags != null) { group = computer.tags; }
|
|
if (computer['user'] == '*') { extra.push("Kerberos"); } else { if (computer['user']) { extra.push(EscapeHtml(decodeURIComponent(computer['user']))); } }
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) {
|
|
var securityok = false;
|
|
if (computer['conn']) {
|
|
if ((computer['conn'] & 2) != 0) { extra.push("CIRA"); securityok = true; } else {
|
|
if ((computer['conn'] & 4) != 0) { extra.push("Directo"); }
|
|
else if ((computer['conn'] & 8) != 0) { extra.push("Relé"); }
|
|
}
|
|
}
|
|
if (securityok == true) {
|
|
if (computer['tls'] != 0) { extra.push("TLS"); }
|
|
} else {
|
|
extra.push((computer['tls'] == 0) ? NoBreak("Sin seguridad") : "TLS");
|
|
}
|
|
} else {
|
|
extra.push((computer['tls'] == 0) ? NoBreak("Sin seguridad") : "TLS");
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{!MeshServerConnect}
|
|
extra.push((computer['tls'] == 0) ? NoBreak("Sin seguridad") : "TLS");
|
|
// ###END###{!MeshServerConnect}
|
|
var name = decodeURIComponent(computer['host']);
|
|
if (computer['name'] && computer['name'] != '') name = decodeURIComponent(computer['name']);
|
|
|
|
var x = '<div id=CX-' + computer['h'] + ' ondblclick=computerEdit(' + computer['h'] + ')>';
|
|
// ###BEGIN###{Look-Commander}
|
|
// ###BEGIN###{ComputerSelectorScanner}
|
|
var gray = false;
|
|
if (NW_AmtScanMenuItem && (NW_AmtScanMenuItem.checked == true)) { gray = ((!globalAmtScanner.scanTable[computer['h']]) || (globalAmtScanner.scanTable[computer['h']].scanstate != 1)); }
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) { disabled = gray = ((computer.conn & 14) == 0); }
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{!ComputerSelectorNoImages}
|
|
x += '<div id=SI-' + computer['h'] + ' class=\"j' + (computer['icon'] ? computer['icon'] : 1) + (gray ? ' gray' : '') + '\" style=float:left;margin-left:4px;margin-right:4px></div>';
|
|
// ###END###{!ComputerSelectorNoImages}
|
|
// ###END###{ComputerSelectorScanner}
|
|
// ###BEGIN###{!ComputerSelectorScanner}
|
|
// ###BEGIN###{!ComputerSelectorNoImages}
|
|
x += '<div id=SI-' + computer['h'] + ' class=\"j' + (computer['icon'] ? computer['icon'] : 1) + '\" style=float:left;margin-left:4px;margin-right:4px></div>';
|
|
// ###END###{!ComputerSelectorNoImages}
|
|
// ###END###{!ComputerSelectorScanner}
|
|
// ###END###{Look-Commander}
|
|
|
|
// ###BEGIN###{ComputerSelectorNoImages}
|
|
x += '<div><table style="height:24px;width:calc(100%);margin:3px;cursor:pointer;border:none" cellspacing=0 cellpadding=0';
|
|
// ###END###{ComputerSelectorNoImages}
|
|
// ###BEGIN###{!ComputerSelectorNoImages}
|
|
x += '<div><table style="height:24px;width:calc(100% - 38px);margin:3px;cursor:pointer;border:none" cellspacing=0 cellpadding=0';
|
|
// ###END###{!ComputerSelectorNoImages}
|
|
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
// ###BEGIN###{ContextMenus}
|
|
var cmenus = [];
|
|
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
|
|
if ((computer.scriptstate == undefined) && (disabled == false)) {
|
|
cmenus.push("Conectar" + '#computerConnect(event,' + computer['h'] + ')');
|
|
cmenus.push("Conexión en ventana" + '#computerConnect(event,' + computer['h'] + ',100)');
|
|
cmenus.push('-');
|
|
cmenus.push("Escritorio" + '#computerConnect(event,' + computer['h'] + ',1)');
|
|
cmenus.push("Solo escritorio" + '#computerConnect(event,' + computer['h'] + ',3)');
|
|
cmenus.push("Terminal" + '#computerConnect(event,' + computer['h'] + ',4)');
|
|
}
|
|
// ###END###{!ComputerSelector-Local-ScriptOnly}
|
|
// ###BEGIN###{Scripting}
|
|
if (computer.scriptstate != null) cmenus.push("Stop Script" + '#computerStopScript(event,' + computer['h'] + ')');
|
|
if (computer['consolemsgs'] != null) cmenus.push("Salida de script ..." + '#mscript_showComputerScriptOutput(' + computer['h'] + ')');
|
|
// ###END###{Scripting}
|
|
if (computer.scriptstate == null) cmenus.push("Editar..." + '#computerEdit(' + computer['h'] + ')');
|
|
x += ' cm=\'' + cmenus.join('|') + '\'';
|
|
// ###END###{ContextMenus}
|
|
// ###END###{ComputerSelector-Local}
|
|
x += ' onclick="computerSelect(event, ' + computer['h'] + ')" id=CI-' + computer['h'] + '>';
|
|
x += '<td id=LCX-' + computer['h'] + ' class=g1 style=float:none> </td>' // Left side gray scale
|
|
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer == null) {
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{ComputerSelectorScanner}
|
|
if (NW_AmtScanMenuItem && (NW_AmtScanMenuItem.checked == true)) {
|
|
var scanstate = globalAmtScanner.scanTable[computer['h']], scancolor = '';
|
|
if (scanstate) { if (scanstate.scanstate == 1) scancolor = ';background-color:green'; if (scanstate.scanstate == 0) scancolor = ';background-color:red'; }
|
|
x += '<td style=width:12px title="' + "Respuesta de Intel® AMT RMCP" + '"><div id=SS-' + computer['h'] + ' class=computeritemcir style=' + scancolor + '></div>';
|
|
}
|
|
// ###END###{ComputerSelectorScanner}
|
|
// ###BEGIN###{MeshServerConnect}
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
// ###BEGIN###{Look-ISDU}
|
|
x += '<td style=width:24px><img src=images-isdu/ComputerIcon.png style=padding-top:2px /></td>';
|
|
// ###END###{Look-ISDU}
|
|
// ###BEGIN###{Look-Commander}
|
|
//x += '<td class=j' + (computer['icon'] ? computer['icon'] : 1) + '></td>';
|
|
// ###END###{Look-Commander}
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
x += '<td><img src=images-BrandedCommander/ComputerIcon.png style=vertical-align:text-top /></td>';
|
|
// ###END###{Look-BrandedCommander}
|
|
// ###BEGIN###{Scripting}
|
|
x += '<td style=width:10px><input id=SJ-' + computer['h'] + ' type=checkbox onclick=onComputerChecked()' + (computer.checked?' checked':'') + (computersRunningScripts>0?' disabled':'') + ' /></td>';
|
|
// ###END###{Scripting}
|
|
|
|
x += '<td align=left><b style=font-size:16px>' + EscapeHtml(name) + '</b></td>';
|
|
|
|
// ###BEGIN###{!Scripting}
|
|
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
|
|
x += '<td align=right style=padding-right:5px>' + extra.join(', ') + '</td>';
|
|
// ###END###{ComputerSelector-Local-ScriptOnly}
|
|
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
|
|
x += '<td align=right style=padding-right:5px>' + extra.join(', ') + '</td><td style=width:1px;padding-right:5px>' + AddButton2("Conectar", 'computerConnect(event,' + computer['h'] + ')', disabled ? 'disabled=disabled' : '') + '</td>';
|
|
// ###END###{!ComputerSelector-Local-ScriptOnly}
|
|
// ###END###{!Scripting}
|
|
// ###BEGIN###{Scripting}
|
|
if (computersRunningScripts == 0) {
|
|
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
|
|
x += '<td align=right style=padding-right:5px>' + extra.join(', ') + '</td>';
|
|
// ###END###{ComputerSelector-Local-ScriptOnly}
|
|
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
|
|
x += '<td align=right style=padding-right:5px>' + extra.join(', ') + '</td><td style=width:1px;padding-right:5px>' + AddButton2("Conectar", 'computerConnect(event,' + computer['h'] + ')', disabled?'disabled=disabled':'') + '</td>';
|
|
// ###END###{!ComputerSelector-Local-ScriptOnly}
|
|
} else {
|
|
if (computer.scriptstate) { x += '<td align=right style=padding-right:5px id=XI-' + computer['h'] + '>' + EscapeHtml(computer['consolemsg']) + '</td><td style=width:1px>' + AddButton2("Detener", 'computerStopScript(event,' + computer['h'] + ')') + '</td>'; }
|
|
}
|
|
// ###END###{Scripting}
|
|
|
|
x += '<td id=RCX-' + computer['h'] + ' class=g2 style=float:none> </td>' // Right side gray scale
|
|
x += '</table></div></div>';
|
|
|
|
groupHtml[group] += x; // Add this device to the proper group
|
|
}
|
|
|
|
// Append all the groups into the final HTML
|
|
if (computerlist.length > 0) {
|
|
var x = '';
|
|
for (var y in groups) {
|
|
if (groups[y] != '') { x += '<div style="font-size:14px;border-bottom:1px solid lightgray;margin-left:4px;margin-top:6px"><b>' + EscapeHtml(groups[y]) + '</b></div>'; }
|
|
x += groupHtml[groups[y]];
|
|
}
|
|
QH('id_computerList', '<div style=width:99%>' + x + '</div>');
|
|
}
|
|
updateComputerDetails();
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_SetupMainMenu(currentView);
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
function onComputerChecked() {
|
|
for (var y in computerlist) { computerlist[y].checked = Q('SJ-' + computerlist[y]['h']).checked; }
|
|
}
|
|
|
|
function addComputerDetailsEntry(x, y) {
|
|
//return '<div class=log style=border-radius:4px;padding:3px;margin-bottom:3px><div style=width:100%;font-size:9px>' + x + '</div><div style=width:100%> ' + y + '</div></div>';
|
|
return '<div style=border-radius:4px;padding:3px;margin-bottom:3px;background-color:#ddd><div style=width:100%;font-size:9px>' + x + '</div><div style=width:100%> ' + y + '</div></div>';
|
|
}
|
|
|
|
function updateComputerDetails() {
|
|
var x = '<div style=position:absolute;top:0;right:0;left:0;bottom:0>', disabled = false;
|
|
if (currentcomputer != null) {
|
|
// ###BEGIN###{Look-Commander}
|
|
// Put the big computer logo
|
|
// ###BEGIN###{!ComputerSelectorNoImages}
|
|
x += '<div style=position:absolute;top:4px;left:4px;right:4px;bottom:80px>';
|
|
if (currentcomputer['name']) x += '<div style=width:100%;text-align:center><b>' + EscapeHtml(decodeURIComponent(currentcomputer['name'])) + '</b></div>';
|
|
// ###BEGIN###{ComputerSelectorScanner}
|
|
var icon = 1, gray = false;
|
|
if ((NW_AmtScanMenuItem) && (NW_AmtScanMenuItem.checked == true)) { gray = (!globalAmtScanner.scanTable[currentcomputer['h']]) || (globalAmtScanner.scanTable[currentcomputer['h']].scanstate != 1); }
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) { disabled = gray = ((currentcomputer.conn & 14) == 0); }
|
|
// ###END###{MeshServerConnect}
|
|
if (currentcomputer['icon']) { icon = parseInt(currentcomputer['icon']); }
|
|
x += '<img ' + (gray ? 'class=gray ' : '') + 'src="images-commander/icons200-' + icon + '-1.png" onclick=showIconSelector() height=200 width=200 style=margin-left:50px;cursor:pointer></img>';
|
|
// ###END###{ComputerSelectorScanner}
|
|
// ###BEGIN###{!ComputerSelectorScanner}
|
|
var icon = 1;
|
|
if (currentcomputer['icon']) { icon = parseInt(currentcomputer['icon']); }
|
|
x += '<img src="images-commander/icons200-' + icon + '-1.png" onclick=showIconSelector() height=200 width=200 style=margin-left:50px;cursor:pointer></img>';
|
|
// ###END###{!ComputerSelectorScanner}
|
|
// ###END###{!ComputerSelectorNoImages}
|
|
|
|
x += '</div>';
|
|
// ###END###{Look-Commander}
|
|
|
|
var bottomButtons = '';
|
|
var bottomButtonsHeight = 0;
|
|
if (computersRunningScripts == 0) {
|
|
//bottomButtons += '<div style=position:fixed;bottom:8px;right:5px>';
|
|
bottomButtonsHeight = 14 + 20;
|
|
bottomButtons += '<div style=position:absolute;bottom:8px;left:4px;right:4px>';
|
|
// ###BEGIN###{Scripting}
|
|
if (currentcomputer['consolemsgs']) { bottomButtonsHeight += 20; bottomButtons += '<input type=Button value="' + "Mostrar salida de script ..." + '" style=width:292px onclick=mscript_showComputerScriptOutput(' + currentcomputer['h'] + ')><br>'; }
|
|
// ###END###{Scripting}
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
|
|
bottomButtons += '<input type=Button value="' + "Editar..." + '" style=width:146px onclick=computerEdit(' + currentcomputer['h'] + ')>';
|
|
bottomButtons += '<input type=Button value="' + "Conectar" + '" style=width:146px onclick=computerConnect(event,' + currentcomputer['h'] + ') ' + (disabled ? 'disabled=disabled' : '') + '>';
|
|
// ###END###{!ComputerSelector-Local-ScriptOnly}
|
|
// ###BEGIN###{ComputerSelector-Local-ScriptOnly}
|
|
bottomButtons += '<input type=Button value="' + "Editar..." + '" style=width:292px onclick=computerEdit(' + currentcomputer['h'] + ')>';
|
|
// ###END###{ComputerSelector-Local-ScriptOnly}
|
|
// ###END###{ComputerSelector-Local}
|
|
// ###BEGIN###{!ComputerSelector-Local}
|
|
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
|
|
bottomButtons += '<input type=Button value="' + "Conectar" + '" style=width:292px onclick=computerConnect(event,' + currentcomputer['h'] + ' ' + (disabled ? 'disabled=disabled' : '') + ')>';
|
|
// ###END###{!ComputerSelector-Local-ScriptOnly}
|
|
// ###END###{!ComputerSelector-Local}
|
|
bottomButtons += '</div>';
|
|
} else {
|
|
// ###BEGIN###{Scripting}
|
|
if (currentcomputer.scriptstate || currentcomputer['consolemsgs']) {
|
|
//bottomButtons += '<div style=position:fixed;bottom:8px;right:5px>';
|
|
bottomButtonsHeight = 14;
|
|
bottomButtons += '<div style=position:absolute;bottom:8px;left:4px;right:4px>';
|
|
if (currentcomputer['consolemsgs'] != null) { bottomButtonsHeight += 20; bottomButtons += '<input type=Button value="' + "Mostrar salida de script ..." + '" style=width:292px onclick=mscript_showComputerScriptOutput(' + currentcomputer['h'] + ')><br>'; }
|
|
if (currentcomputer.scriptstate != null) { bottomButtonsHeight += 20; bottomButtons += '<input type=Button value="' + "Stop Script" + '" style=width:292px onclick=computerStopScript(event,' + currentcomputer['h'] + ')>'; }
|
|
bottomButtons += '</div>';
|
|
}
|
|
// ###END###{Scripting}
|
|
}
|
|
|
|
// ###BEGIN###{Look-Commander}
|
|
// ###BEGIN###{!ComputerSelectorNoImages}
|
|
x += '<div style="overflow-y:auto;position:absolute;top:216px;left:4px;right:4px;bottom:' + bottomButtonsHeight + 'px">';
|
|
// ###END###{!ComputerSelectorNoImages}
|
|
// ###BEGIN###{ComputerSelectorNoImages}
|
|
x += '<div style="overflow-y:auto;position:absolute;top:4px;left:4px;right:4px;bottom:' + bottomButtonsHeight + 'px">';
|
|
// ###END###{ComputerSelectorNoImages}
|
|
// ###END###{Look-Commander}
|
|
// ###BEGIN###{!Look-Commander}
|
|
x += '<div style="overflow-y:auto;position:absolute;top:4px;left:4px;right:4px;bottom:' + bottomButtonsHeight + 'px">';
|
|
if (currentcomputer['name']) x += addComputerDetailsEntry("Nombre amigable", EscapeHtml(decodeURIComponent(currentcomputer['name'])));
|
|
// ###END###{!Look-Commander}
|
|
x += addComputerDetailsEntry("Nombre de host", decodeURIComponent(currentcomputer['host']));
|
|
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer == null) {
|
|
// ###END###{MeshServerConnect}
|
|
if (currentcomputer['user'] != '*') {
|
|
x += addComputerDetailsEntry("Autenticación", "Digest /" + EscapeHtml(decodeURIComponent(currentcomputer['user'])));
|
|
} else {
|
|
if (currentcomputer['pass'] == '') {
|
|
x += addComputerDetailsEntry("Autenticación", "Kerberos");
|
|
} else {
|
|
x += addComputerDetailsEntry("Autenticación", "Kerberos /" + EscapeHtml(decodeURIComponent(currentcomputer['pass'])));
|
|
}
|
|
}
|
|
x += addComputerDetailsEntry("Seguridad", ((currentcomputer['tls'] == 0)?"Ninguna":"Seguridad TLS"));
|
|
if (currentcomputer['tags']) { x += addComputerDetailsEntry("Nombre del grupo", EscapeHtml(decodeURIComponent(currentcomputer['tags']))); }
|
|
// ###BEGIN###{MeshServerConnect}
|
|
} else {
|
|
if (currentcomputer['tags']) { x += addComputerDetailsEntry("Grupo de dispositivos", EscapeHtml(decodeURIComponent(currentcomputer['tags']))); }
|
|
if (currentcomputer['conn']) {
|
|
var cn = [];
|
|
if ((currentcomputer['conn'] & 1) != 0) cn.push('Agent');
|
|
if ((currentcomputer['conn'] & 2) != 0) cn.push('CIRA');
|
|
else if ((currentcomputer['conn'] & 4) != 0) cn.push('Direct');
|
|
else if ((currentcomputer['conn'] & 8) != 0) cn.push('Relay');
|
|
x += addComputerDetailsEntry("Conectividad", cn.join(', '));
|
|
}
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
if (currentcomputer['ver']) {
|
|
var mode = '';
|
|
if (currentcomputer['pstate'] == 2) { mode = "ACM"; if (currentcomputer['pmode'] == 2) mode = "CCM"; }
|
|
if (mode != '') mode = ' / ' + mode;
|
|
x += addComputerDetailsEntry("Intel® AMT", "v" + currentcomputer['ver'] + mode);
|
|
}
|
|
if (currentcomputer['date']) { x += addComputerDetailsEntry("Última conexión", new Date(currentcomputer['date']).toDateString()); }
|
|
if (currentcomputer['digestrealm']) {
|
|
// ###BEGIN###{ContextMenus}
|
|
x += '<div cm="' + NoBreak("Eliminar Reino ...") + '#removeCurrentRealm(' + currentcomputer['h'] + ')">';
|
|
// ###END###{ContextMenus}
|
|
x += addComputerDetailsEntry("Reino Digest", '<span style=font-size:x-small>' + currentcomputer['digestrealm'] + '</span><br /><span style=margin-left:5px><a style=cursor:pointer;font-size:10px;color:blue onclick=removeCurrentRealm(' + currentcomputer['h'] + ')><u>' + "Eliminar reino" + '</u></a></span>');
|
|
// ###BEGIN###{ContextMenus}
|
|
x += '</div>';
|
|
// ###END###{ContextMenus}
|
|
}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
// ###BEGIN###{Certificates}
|
|
if (currentcomputer['tlscerthash']) {
|
|
if (currentcomputer['tlscert']) {
|
|
// ###BEGIN###{ContextMenus}
|
|
x += '<div cm="' + NoBreak("Ver Certificado...") + '#viewCurrentPinCertificate(' + currentcomputer['h'] + ')|' + NoBreak("Eliminar fijación ...") + '#removeCurrentPinCertificate(' + currentcomputer['h'] + ')">';
|
|
// ###END###{ContextMenus}
|
|
x += addComputerDetailsEntry("Certificado TLS", '<span title="Cert hash: ' + currentcomputer['tlscerthash'] + '">' + "Anclado a un certificado específico" + '</span><br /><span style=margin-left:5px><a style=cursor:pointer;font-size:10px;color:blue onclick=viewCurrentPinCertificate(' + currentcomputer['h'] + ')><u>' + "Mostrar certificado" + '</u></a> <a style=cursor:pointer;font-size:10px;color:blue onclick=removeCurrentPinCertificate(' + currentcomputer['h'] + ')><u>' + "Eliminar fijación" + '</u></a></span>');
|
|
// ###BEGIN###{ContextMenus}
|
|
x += '</div>';
|
|
// ###END###{ContextMenus}
|
|
} else {
|
|
// ###BEGIN###{ContextMenus}
|
|
x += '<div cm="' + NoBreak("Eliminar fijación ...") + '#removeCurrentPinCertificate(' + currentcomputer['h'] + ')">';
|
|
// ###END###{ContextMenus}
|
|
x += addComputerDetailsEntry("Certificado TLS", '<span title="Cert hash: ' + currentcomputer['tlscerthash'] + '">' + "Anclado a un certificado específico" + '</span><br /><span style=margin-left:5px><a style=cursor:pointer;font-size:10px;color:blue onclick=removeCurrentPinCertificate(' + currentcomputer['h'] + ')><u>' + "Eliminar fijación" + '</u></a></span>');
|
|
// ###BEGIN###{ContextMenus}
|
|
x += '</div>';
|
|
// ###END###{ContextMenus}
|
|
}
|
|
}
|
|
// ###END###{Certificates}
|
|
// ###END###{Mode-NodeWebkit}
|
|
x += '</div>';
|
|
|
|
}
|
|
QH('id_computerDetails', x + bottomButtons + '</div>');
|
|
computerSelect();
|
|
}
|
|
|
|
// ###BEGIN###{Look-Commander}
|
|
// ###BEGIN###{!ComputerSelectorNoImages}
|
|
function showIconSelector() {
|
|
if (xxdialogMode) return;
|
|
var x = '<br><div style=display:inline-block;width:40px></div>';
|
|
x += '<div style=display:inline-block class=i1 onclick=setIcon(1)></div>';
|
|
x += '<div style=display:inline-block class=i2 onclick=setIcon(2)></div>';
|
|
x += '<div style=display:inline-block class=i3 onclick=setIcon(3)></div>';
|
|
x += '<div style=display:inline-block class=i4 onclick=setIcon(4)></div>';
|
|
x += '<div style=display:inline-block class=i5 onclick=setIcon(5)></div>';
|
|
x += '<div style=display:inline-block class=i6 onclick=setIcon(6)></div>';
|
|
setDialogMode(11, "Selección de icono", 0, null, x);
|
|
QV('id_dialogclose', true);
|
|
}
|
|
|
|
function setIcon(icon) {
|
|
setDialogMode(0);
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) { meshCentralServer.send({ action: 'changedevice', nodeid: currentcomputer._id, icon: icon }); return; }
|
|
// ###END###{MeshServerConnect}
|
|
currentcomputer['icon'] = icon;
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
saveComputers();
|
|
// ###END###{ComputerSelector-Local}
|
|
updateComputerList();
|
|
}
|
|
// ###END###{!ComputerSelectorNoImages}
|
|
// ###END###{Look-Commander}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
// ###BEGIN###{ContextMenus}
|
|
// ###BEGIN###{Certificates}
|
|
function viewCurrentPinCertificate(h) {
|
|
if (xxdialogMode) return;
|
|
var c = null;
|
|
for (var x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
|
|
var cert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(hex2rstr(c['tlscert'])));
|
|
var commonName = cert.subject.getField('CN').value;
|
|
var fingerprint = '', fingerprint2 = forge.md.sha1.create().update(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()).digest().toHex().toUpperCase();
|
|
for (i = 0; i < fingerprint2.length; i++) { if ((i != 0) && (i % 2 == 0)) { fingerprint += ':'; } fingerprint += fingerprint2.substring(i, i + 1); }
|
|
var x = '<img src=images-commander/cert1.png style=float:right height=32 width=32 />';
|
|
x += 'This certificate is pinned to computer ' + c['name'] + '. When connecting, if this certificate is received the connection will allowed. Hit delete button to un-pin.<br>';
|
|
// ###BEGIN###{FileSaver}
|
|
//x += addHtmlValue("Certificate", c.X509Certificate.length + " bytes, " + '<a style=cursor:pointer;color:blue onclick=downloadCert(' + h + ')>' + "Download" + '</a>');
|
|
// ###END###{FileSaver}
|
|
// ###BEGIN###{!FileSaver}
|
|
//x += addHtmlValue("Certificate", c.X509Certificate.length + " bytes");
|
|
// ###END###{!FileSaver}
|
|
x += '<br><div style="border-bottom:1px solid gray"><i>' + "Asunto del certificado" + '</i></div><br>';
|
|
for (var i in xxCertSubjectNames) { var a = cert.subject.getField(i); if (a) { x += addHtmlValue(xxCertSubjectNames[i], EscapeHtml(a.value)); } }
|
|
x += addHtmlValueNoTitle("Huella dactilar", fingerprint.substring(0,29) + '<br />' + fingerprint.substring(30));
|
|
x += '<br><div style="border-bottom:1px solid gray"><i>' + "Certificado de emisor" + '</i></div><br>';
|
|
for (var i in xxCertSubjectNames) { var a = cert.issuer.getField(i); if (a) { x += addHtmlValue(xxCertSubjectNames[i], EscapeHtml(a.value)); } }
|
|
setDialogMode(11, "Certificado -" + EscapeHtml(commonName), 5, function (b) { if (b == 2) { removeCurrentPinCertificateEx(2, h); } }, x);
|
|
}
|
|
|
|
function removeCurrentPinCertificate(h) {
|
|
if (xxdialogMode) return;
|
|
setDialogMode(11, "Fijación de certificado", 3, removeCurrentPinCertificateEx, "¿Eliminar el anclaje del certificado para la computadora seleccionada?", h);
|
|
}
|
|
|
|
function removeCurrentPinCertificateEx(button, h) {
|
|
var c = null;
|
|
for (var x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
|
|
if (c['tlscert']) delete c['tlscert'];
|
|
if (c['tlscerthash']) delete c['tlscerthash'];
|
|
storeCertPinning(c['host'], null);
|
|
saveComputers();
|
|
updateComputerList();
|
|
}
|
|
// ###END###{Certificates}
|
|
// ###END###{ContextMenus}
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
function removeCurrentRealm(h) {
|
|
if (xxdialogMode) return;
|
|
setDialogMode(11, "Reino Digest", 3, removeCurrentRealmEx, "¿Eliminar la fijación de Digest Realm para la computadora seleccionada?", h);
|
|
}
|
|
|
|
function removeCurrentRealmEx(button, h) {
|
|
var c = null;
|
|
for (var x = 0; x < computerlist.length; x++) { if (computerlist[x]['h'] == h) { c = computerlist[x]; } }
|
|
if (c['digestrealm']) delete c['digestrealm'];
|
|
saveComputers();
|
|
updateComputerList();
|
|
}
|
|
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
function saveComputers() {
|
|
if (urlvars['host']) return;
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) return;
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
const crypto = require('crypto');
|
|
crypto.randomBytes(256, function(err, buf) {
|
|
if (err) throw err; // Add trivial security, not intended to be real security. This just avoids storing data in plain text, but it's almost the same.
|
|
var computerlist2 = JSON.parse(JSON.stringify(computerlist));
|
|
for (var i in computerlist2) { delete computerlist2[i]['tlscert2']; delete computerlist2[i]['tlscerthash2']; } // Clean up the list
|
|
var k = buf.toString('hex'), cipher = crypto.createCipher('aes-256-ctr', k), crypted = cipher.update(JSON.stringify(computerlist2), 'utf8', 'hex');
|
|
crypted += cipher.final('hex');
|
|
try { localStorage.setItem('computers', k + crypted); } catch (ex) { }
|
|
});
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
try { localStorage.setItem('computers', JSON.stringify(computerlist)); } catch (ex) { }
|
|
// ###END###{!Mode-NodeWebkit}
|
|
}
|
|
|
|
function loadComputers() {
|
|
if (urlvars['host']) return;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var ctext = null;
|
|
try { ctext = localStorage.getItem('computers'); } catch (ex) { }
|
|
if (ctext) {
|
|
try { computerlist = JSON.parse(ctext); } catch (e) {
|
|
if (ctext.length > 512) { // Add trivial security, not intended to be real security. This just avoids storing data in plain text, but it's almost the same.
|
|
var crypto = require('crypto'), k = ctext.substring(0, 512), crypted = ctext.substring(512), decipher = crypto.createDecipher('aes-256-ctr', k), dec = decipher.update(crypted, 'hex', 'utf8');
|
|
dec += decipher.final('utf8');
|
|
try { computerlist = JSON.parse(dec); } catch (e) { computerlist = []; }
|
|
var pins = getCertPinnings();
|
|
for (var i in computerlist) {
|
|
computerlist[i].checked = false;
|
|
// Add stored certificate pinning.
|
|
if ((computerlist[i]['tlscerthash'] == null) && (pins[computerlist[i]['host']] != null)) { computerlist[i]['tlscerthash'] = pins[computerlist[i]['host']]; }
|
|
delete computerlist[i]['tlscert2'];
|
|
delete computerlist[i]['tlscerthash2'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
var ctext = null;
|
|
try { ctext = localStorage.getItem('computers'); } catch (ex) { }
|
|
if (ctext) { try { computerlist = JSON.parse(ctext); } catch (e) { computerlist = []; } }
|
|
// ###END###{!Mode-NodeWebkit}
|
|
updateComputerList();
|
|
// ###BEGIN###{ComputerSelectorScanner}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
globalAmtScanner.performScan();
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###END###{ComputerSelectorScanner}
|
|
}
|
|
// ###END###{ComputerSelector-Local}
|
|
|
|
function computerConnect(e, h, m, skipPass) {
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if ((m == 100) || (e && (e.shiftKey == true))) {
|
|
// Launch a new instance of MeshCommander
|
|
var adder = '';
|
|
// ###BEGIN###{Desktop}
|
|
if (m == 1) { adder = '&kvm=1'; }
|
|
if (m == 2) { adder = '&kvmfull=1'; }
|
|
if (m == 3) { adder = '&kvmonly=1'; }
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Terminal}
|
|
if (m == 4) { adder = '&sol=1'; }
|
|
// ###END###{Terminal}
|
|
var username = currentcomputer['user'];
|
|
if (username == '') { username = 'admin'; }
|
|
require('nw.gui').Window.open(window.location.href + '?host=' + currentcomputer['host'] + '&user=' + username + '&pass=' + currentcomputer['pass'] + '&tls=' + currentcomputer['tls'] + adder, { 'icon': 'favicon.png', 'toolbar': false, 'frame': true, 'width': 970, 'min_width': 970, 'height': 760, 'min_height': 640 });
|
|
//require('child_process').exec('nw.exe -host:' + decodeURIComponent(currentcomputer['host']) + ' -user:' + decodeURIComponent(currentcomputer['user']) + ' -pass:' + decodeURIComponent(currentcomputer['pass']) + ((currentcomputer['tls']==1)?' -tls':''), function (error, stdout, stderr) { });
|
|
return;
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
if (e) haltEvent(e);
|
|
computerSelect(null, h);
|
|
if (currentcomputer == null) return;
|
|
if ((currentcomputer['user'] != '*') && (currentcomputer['pass'] == '')) {
|
|
if (skipPass === true) { computerConnectLogin(9, m); return; }
|
|
// Query for the login password
|
|
var x = '<br>Enter the login password for ' + EscapeHtml(currentcomputer['name'] ? currentcomputer['name'] : currentcomputer['host']) + '.<br><br>';
|
|
x += '<div style=height:26px><input id=d11connectUser onkeyup=computerConnectUpdateLogin() style=float:right;width:200px value="' + currentcomputer['user'] + '"><div>' + "Nombre de usuario" + '</div></div>';
|
|
x += '<div style=height:26px><input id=d11connectPass onkeyup=computerConnectUpdateLogin(event) type=password style=float:right;width:200px><div>' + "Contraseña" + '</div></div>';
|
|
setDialogMode(11, "Credenciales de acceso", 3, computerConnectLogin, x);
|
|
Q('d11connectPass').focus();
|
|
computerConnectUpdateLogin();
|
|
} else {
|
|
// Go ahead and connect
|
|
computerConnectLogin(0, m);
|
|
}
|
|
}
|
|
|
|
function computerConnectUpdateLogin(e) {
|
|
var ok = (Q('d11connectUser').value.length > 0) && (passwordcheck(Q('d11connectPass').value));
|
|
QE('idx_dlgOkButton', ok);
|
|
if ((e != undefined) && (e.keyCode == 13) && (ok == true)) { setDialogMode(0); computerConnectLogin(1, xxdialogTag); }
|
|
}
|
|
|
|
// If the user is prompted for a user/pass, we should not re-prompt after a certificate validation prompt.
|
|
var skipPassUser = null;
|
|
var skipPassPass = null;
|
|
function computerConnectLogin(button, m) {
|
|
var user = decodeURIComponent(currentcomputer['user']);
|
|
var pass = decodeURIComponent(currentcomputer['pass']);
|
|
if (button == 1) { user = Q('d11connectUser').value; pass = Q('d11connectPass').value; }
|
|
if (button == 9) { user = skipPassUser; pass = skipPassPass; }
|
|
skipPassUser = user;
|
|
skipPassPass = pass;
|
|
|
|
// Go ahead and connect
|
|
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
|
|
if (user == '') { user = 'admin'; } // Default to admin if not specified.
|
|
connect(ports.host, ports.http, user, pass, currentcomputer['tls'], function (mtag) {
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
// If the fingerprint is set but not the certificate, set the cert.
|
|
if (wsstack.comm.xtlsCertificate && (currentcomputer['tlscert'] == null) && (wsstack.comm.xtlsFingerprint == currentcomputer['tlscerthash'])) {
|
|
currentcomputer['tlscert'] = wsstack.comm.xtlsCertificate.raw.toString('hex');
|
|
updateComputerDetails();
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{Desktop}
|
|
if (mtag == 1) { go(14); connectDesktop(); } // Go directly to remote desktop (1)
|
|
if ((mtag == 2) || (mtag == 3)) { connectDesktop(); } // Go remote desktop fullscreen (2) and only remote desktop (3)
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Terminal}
|
|
if (mtag == 4) { go(13); connectTerminal(); } // Go directly to terminal (4)
|
|
// ###END###{Terminal}
|
|
}, m);
|
|
if (m == 1) { go(14); }
|
|
if ((m == 2) || (m == 3)) { go(14); deskToggleFull(m == 3); }
|
|
if (m == 4) { go(13); }
|
|
}
|
|
|
|
function computerSelect(e, h) {
|
|
if (h && ((currentcomputer == null) || (currentcomputer.h !== h))) { currentcomputer = getComputer(h); updateComputerDetails(); }
|
|
for (var y in computerlist) {
|
|
var computer = computerlist[y], sel = (currentcomputer != null && computer['h'] == currentcomputer['h']);
|
|
QS('CI-' + computer['h'])['background-color'] = sel ? '#a0a0a0' : '#c9c9c9';
|
|
Q('LCX-' + computer['h']).classList.remove('g1');
|
|
Q('LCX-' + computer['h']).classList.remove('g1s');
|
|
Q('RCX-' + computer['h']).classList.remove('g2');
|
|
Q('RCX-' + computer['h']).classList.remove('g2s');
|
|
Q('LCX-' + computer['h']).classList.add(sel?'g1s':'g1');
|
|
Q('RCX-' + computer['h']).classList.add(sel?'g2s':'g2');
|
|
}
|
|
}
|
|
|
|
function getComputer(h) { for (var i in computerlist) { if (computerlist[i]['h'] == h) return computerlist[i]; } return null; }
|
|
|
|
// ###BEGIN###{Scripting}
|
|
function mscript_showComputerScriptOutput(h) {
|
|
if (xxdialogMode) return;
|
|
var computer = getComputer(h);
|
|
computer.consoledialog = 'scriptOutputArea';
|
|
var name = computer['name'];
|
|
if (!name) name = computer['host'];
|
|
var v = '<textarea id=scriptOutputArea style=width:100%;height:150px;resize:vertical spellcheck=false readonly></textarea>';
|
|
setDialogMode(11, "Salida de script" + name, 5, mscript_showComputerScriptOutputOk, v, computer);
|
|
Q('scriptOutputArea').value = EscapeHtml(computer['consolemsgs']);
|
|
}
|
|
|
|
function mscript_showComputerScriptOutputOk(button, computer) {
|
|
computer.consoledialog = undefined;
|
|
if (button == 2) {
|
|
if (computer.scriptstate) {
|
|
computer['consolemsgs'] = '';
|
|
} else {
|
|
delete computer['consolemsgs'];
|
|
delete computer['consolemsg'];
|
|
}
|
|
saveComputers();
|
|
updateComputerDetails();
|
|
}
|
|
}
|
|
|
|
function mscript_runScriptDlg() {
|
|
if (computersRunningScripts > 0) {
|
|
// Stop all scripts
|
|
for (var y in computerlist) {
|
|
var computer = computerlist[y];
|
|
if (computer.scriptstate) { computer.scriptstate.stop(); computer.scriptstate = undefined; }
|
|
}
|
|
updateComputerList();
|
|
} else {
|
|
// Start a new script dialog box
|
|
if (xxdialogMode || scriptstate) return;
|
|
var clist = [];
|
|
for (var y in computerlist) { if (computerlist[y].checked == true) { clist.push(computerlist[y]); } }
|
|
if (clist.length == 0) { clist.push(currentcomputer); }
|
|
setDialogMode(11, "Ejecutar guión", 3, mscript_runScriptDlgOk, '<br>' + format("Ejecute un script seleccionado en {0} computadora (s)", clist.length) + '.<br><br><input id=mscriptopen type=file style=width:100% accept=".mescript">');
|
|
}
|
|
}
|
|
|
|
function mscript_runScriptDlgOk(r) {
|
|
if (r != 1) return;
|
|
var x = Q('mscriptopen');
|
|
if (x.files.length != 1) return;
|
|
var reader = new FileReader();
|
|
reader.onload = mscript_onScriptReadNoPrompt;
|
|
reader.readAsBinaryString(x.files[0]);
|
|
}
|
|
|
|
function mscript_onScriptReadNoPrompt(file) { mscript_onScriptRead(file, 1); }
|
|
function mscript_onScriptRead(file, noprompt) {
|
|
if (computersRunningScripts > 0) return;
|
|
var x, clist = [];
|
|
try { x = JSON.parse(file.target.result); } catch (e) {}
|
|
if (x && x['mescript']) {
|
|
onComputerChecked();
|
|
for (var y in computerlist) { if (computerlist[y].checked == true) { clist.push(computerlist[y]); } }
|
|
if (clist.length == 0) { clist.push(currentcomputer); }
|
|
x.clist = clist;
|
|
if (noprompt == 1) {
|
|
mscript_onScriptReadOk(0, x);
|
|
} else {
|
|
setDialogMode(11, "Ejecutar guión", 3, mscript_onScriptReadOk, format("¿Ejecutar este script en {0} computadora (s)?", clist.length), x);
|
|
}
|
|
}
|
|
}
|
|
|
|
function mscript_onScriptReadOk(button, tag) {
|
|
var x = tag;
|
|
|
|
// ###BEGIN###{CertificateManager}
|
|
var tlsoptions = {};
|
|
|
|
// Create a list of trusted certificates in PEM format
|
|
var trustedCertStringsPem = [];
|
|
for (var y in certificateStore) {
|
|
var certificate = certificateStore[y];
|
|
if (certificate['trusted'] == true) { trustedCertStringsPem.push('-----BEGIN CERTIFICATE-----\n' + certificate['certbin'] + '\n-----END CERTIFICATE-----\n'); }
|
|
}
|
|
tlsoptions.ca = trustedCertStringsPem;
|
|
|
|
// Setup out console TLS authentication certificate
|
|
var authcert = getTlsAuthCertificate();
|
|
if (authcert != null) {
|
|
tlsoptions.cert = forge.pki.certificateToPem(authcert['cert']);
|
|
tlsoptions.key = forge.pki.privateKeyToPem(authcert['privateKey']);
|
|
}
|
|
// ###END###{CertificateManager}
|
|
|
|
for (var y in x.clist) {
|
|
var mscriptstate, computer = x.clist[y], startvars = { '_interactive':0 };
|
|
// ###BEGIN###{Certificates}
|
|
startvars['_certificates'] = 1;
|
|
// ###END###{Certificates}
|
|
// ###BEGIN###{Mode-Firmware}
|
|
startvars['_mode'] = 'Firmware';
|
|
// ###END###{Mode-Firmware}
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
startvars['_mode'] = 'MeshCentral2';
|
|
// ###END###{Mode-MeshCentral2}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
startvars['_mode'] = 'NodeWebkit';
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-LMS}
|
|
startvars['_mode'] = 'LMS';
|
|
// ###END###{Mode-LMS}
|
|
// ###BEGIN###{Mode-WebSite}
|
|
startvars['_mode'] = 'WebSite';
|
|
// ###END###{Mode-WebSite}
|
|
if (x && x['mescript']) mscriptstate = script_setup(atob(x['mescript']), startvars);
|
|
if (mscriptstate) {
|
|
mscriptstate.computer = computer;
|
|
var ports = portsFromHost(computer['host'], computer['tls']);
|
|
// ###BEGIN###{CertificateManager}
|
|
mscriptstate.wsstack = WsmanStackCreateService(ports.host, ports.http, decodeURIComponent(computer['user']), decodeURIComponent(computer['pass']), computer['tls'], tlsoptions);
|
|
// ###END###{CertificateManager}
|
|
// ###BEGIN###{!CertificateManager}
|
|
mscriptstate.wsstack = WsmanStackCreateService(ports.host, ports.http, decodeURIComponent(computer['user']), decodeURIComponent(computer['pass']), computer['tls']);
|
|
// ###END###{!CertificateManager}
|
|
mscriptstate.amtstack = AmtStackCreateService(mscriptstate.wsstack);
|
|
mscriptstate.onStep = mscript_updateScriptState;
|
|
mscriptstate.onConsole = mscript_console;
|
|
|
|
// Setup TLS checking
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (NW_TlsSecurityMode == 0) { mscriptstate.wsstack.comm.xtlsFingerprint = 0; }
|
|
else { mscriptstate.wsstack.comm.xtlsFingerprint = computer['tlscerthash'] ? computer['tlscerthash'] : computer['tlscerthash2']; }
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
computer['consolemsg'] = '';
|
|
computer['consolemsgs'] = '';
|
|
computer.scriptstate = mscriptstate;
|
|
computer.scriptstate.start(100);
|
|
} else {
|
|
messagebox("Ejecutar guión", "Archivo de script no válido")
|
|
return;
|
|
}
|
|
}
|
|
updateComputerList();
|
|
}
|
|
|
|
function mscript_updateScriptState(scriptstate) {
|
|
if (scriptstate.state == 0) { scriptstate.computer.scriptstate = undefined; updateComputerList(); }
|
|
}
|
|
|
|
function mscript_console(msg, scriptstate) {
|
|
scriptstate.computer['consolemsg'] = msg;
|
|
scriptstate.computer['consolemsgs'] += (msg + '\r\n');
|
|
if (scriptstate.computer.consoledialog) { Q(scriptstate.computer.consoledialog).value = scriptstate.computer['consolemsgs']; }
|
|
QH('XI-' + scriptstate.computer['h'], msg);
|
|
}
|
|
|
|
function computerStopScript(e, h) {
|
|
var computer = getComputer(h);
|
|
if (computer.scriptstate) { computer.scriptstate.stop(); computer.scriptstate = undefined; }
|
|
updateComputerList();
|
|
}
|
|
|
|
// ###END###{Scripting}
|
|
|
|
//
|
|
// MeshCentral Connection
|
|
//
|
|
// ###BEGIN###{MeshServerConnect}
|
|
function showMeshCentralConnectDialog(showtoken) {
|
|
if (xxdialogMode || meshCentralServer) return;
|
|
var x = '<img src=\'images-commander/meshcentral50.png\' style=width:50px;height:50px;float:right></img><div>' + "Connect to a MeshCentral server and manage Intel® AMT computers on that account." + '<div><br style=clear:both />';
|
|
x += '<div style=height:26px><input id=meshserverurl value="" placeholder="sample.server.com:443" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "Nombre del servidor" + '</div></div>';
|
|
x += '<div style=height:26px><input id=meshserverhash value="" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "Hash de certificado" + '</div></div>';
|
|
x += '<div style=height:26px><input id=meshserveruser value="" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "Nombre de usuario" + '</div></div>';
|
|
x += '<div style=height:26px><input id=meshserverpass value="" type=password style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "Contraseña" + '</div></div>';
|
|
if (showtoken) { x += '<div style=height:26px><input id=meshservertoken value="" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "Token de inicio de sesión" + '</div></div>'; }
|
|
//x += '<div style=height:26px><input id=meshserverproxy value="" placeholder="proxy.com:123" style=float:right;width:250px onkeyup=showMeshCentralConnectDialogUpdate()><div>' + "Proxy" + '</div></div>';
|
|
setDialogMode(11, "MeshCentral Connect", 3, showMeshCentralConnectDialogOk, x);
|
|
try {
|
|
if (localStorage.getItem('meshserverurl')) { Q('meshserverurl').value = localStorage.getItem('meshserverurl'); }
|
|
if (localStorage.getItem('meshserverhash')) { Q('meshserverhash').value = localStorage.getItem('meshserverhash'); }
|
|
if (localStorage.getItem('meshserveruser')) { Q('meshserveruser').value = localStorage.getItem('meshserveruser'); }
|
|
//if (localStorage.getItem('meshserverproxy')) { Q('meshserverproxy').value = localStorage.getItem('meshserverproxy'); }
|
|
} catch (ex) { }
|
|
showMeshCentralConnectDialogUpdate();
|
|
}
|
|
|
|
function showMeshCentralConnectDialogUpdate() {
|
|
QS('meshserverurl')['background-color'] = ((Q('meshserverurl').value.length > 0) ? 'white' : 'LightYellow');
|
|
QS('meshserveruser')['background-color'] = ((Q('meshserveruser').value.length > 0) ? 'white' : 'LightYellow');
|
|
QS('meshserverpass')['background-color'] = ((Q('meshserverpass').value.length > 0) ? 'white' : 'LightYellow');
|
|
var token = true;
|
|
try { token = (Q('meshservertoken').value.length > 0); } catch (ex) { }
|
|
QE('idx_dlgOkButton', token && (Q('meshserverurl').value.length > 0) && (Q('meshserveruser').value.length > 0) && (Q('meshserverpass').value.length > 0));
|
|
}
|
|
|
|
function showMeshCentralConnectDialogOk() {
|
|
try {
|
|
localStorage.setItem('meshserverurl', Q('meshserverurl').value);
|
|
localStorage.setItem('meshserverhash', Q('meshserverhash').value);
|
|
localStorage.setItem('meshserveruser', Q('meshserveruser').value);
|
|
} catch (ex) { }
|
|
var pass = Q('meshserverpass').value;
|
|
var token = null;
|
|
try { token = Q('meshservertoken').value; } catch (ex) { }
|
|
//try { localStorage.setItem('meshserverproxy', Q('meshserverproxy').value); } catch (ex) { }
|
|
var serverUrl = Q('meshserverurl').value;
|
|
if (serverUrl.indexOf('://') < 0) { serverUrl = ('wss://' + serverUrl); }
|
|
serverUrl = new URL(serverUrl);
|
|
var serverPort = parseInt(serverUrl.port);
|
|
if (isNaN(serverPort) || serverPort == 0) { serverPort = 443; }
|
|
meshCentralServer = CreateMeshCentralServer(serverUrl.hostname, serverPort, '/control.ashx', Q('meshserveruser').value, Q('meshserverpass').value, token, Q('meshserverhash').value);
|
|
meshCentralServer.onStateChange = function (sender, state, cause, msg) {
|
|
var askForToken = false;
|
|
if (state == 0) {
|
|
// Disconnected
|
|
loadComputers();
|
|
// If the connection failed due to hash mismatch, prompt the user.
|
|
disconnect();
|
|
QH('id_computername', format("Consola de administración remota v{0}", version));
|
|
if (cause == 'HashMatchFail') { showTlsCert(3, "Conectado al servidor MeshCentral con certificado no reconocido. Haga clic en Aceptar para aceptar y conectarse.", meshCentralServer.xtlsCertificate, meshCentralServer.password, meshCentralHashRetry); }
|
|
else if ((cause == 'noauth') && (msg == 'tokenrequired')) { askForToken = true; }
|
|
else if (cause == 'noauth') { setDialogMode(11, "Conexión central de malla", 1, null, "Usuario o contraseña invalido."); }
|
|
meshCentralServer = null;
|
|
} else if (state == 1) {
|
|
// Connecting
|
|
currentcomputer = null;
|
|
computerlist = [];
|
|
QH('id_computername', 'Remote Management Console v' + version + ', Connecting to ' + meshCentralServer.host + '...');
|
|
} else if (state == 3) {
|
|
// Connected
|
|
currentcomputer = null;
|
|
computerlist = meshCentralServer.computerlist;
|
|
meshCentralServer.xconnected = true;
|
|
QH('id_computername', 'Remote Management Console v' + version + ', Server: ' + meshCentralServer.host);
|
|
}
|
|
updateComputerList();
|
|
NW_SetupMainMenu(currentView);
|
|
|
|
if (askForToken) {
|
|
// Ask for 2-factor token and try again
|
|
showMeshCentralConnectDialog(true);
|
|
Q('meshserverpass').value = pass;
|
|
Q('meshservertoken').focus();
|
|
showMeshCentralConnectDialogUpdate();
|
|
}
|
|
}
|
|
meshCentralServer.onNodeChange = function (sender, node) {
|
|
//computerlist = meshCentralServer.computerlist;
|
|
updateComputerList();
|
|
}
|
|
setDialogMode(0);
|
|
meshCentralServer.connect();
|
|
}
|
|
|
|
// The user accepted the MeshCentral server hash, set it and try to connect again.
|
|
function meshCentralHashRetry(b, args) {
|
|
try { localStorage.setItem('meshserverhash', args.c.fingerprint.split(':').join('').toLowerCase()); } catch (ex) { }
|
|
showMeshCentralConnectDialog();
|
|
Q('meshserverpass').value = args.m; // Set the retry password
|
|
showMeshCentralConnectDialogOk();
|
|
}
|
|
|
|
function meshCentralDisconnect() {
|
|
if (meshCentralServer == null) return;
|
|
meshCentralServer.disconnect();
|
|
meshCentralServer = null;
|
|
currentcomputer = null;
|
|
updateComputerList();
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
// ###BEGIN###{ComputerSelectorScanner}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
|
|
//
|
|
// Network scan
|
|
//
|
|
|
|
var globalAmtScanner = CreateAmtScanner(amtScanChangePresence);
|
|
var globalAmtScannerResults = null;
|
|
|
|
function showScanDialog() {
|
|
if (xxdialogMode) return;
|
|
var x = "Ingrese un rango de direcciones IP para buscar dispositivos Intel AMT." + '<br /><br />';
|
|
x += '<div style=height:20px><div style=float:right;width:260px;overflow:hidden><input id=idx_iprange style=width:204px placeholder="192.168.0.0/16" onkeyup=showScanDialogUpdate()></input><input id=idx_iprangebutton type=button value=Scan onclick=amtScanStartScan()></input></b></div><div>' + "Rango de IP" + '</div></div>';
|
|
x += '<br /><div id=idx_results style="width:100%;height:200px;background-color:white;border:1px gray solid;overflow-y:scroll"></div>';
|
|
setDialogMode(11, "Busque dispositivos Intel® AMT", 3, showScanDialogOk, x);
|
|
QH('idx_results', '<div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>' + "Muestra de valores de rango de IP" + '<br />192.168.0.100<br />192.168.0.0/16<br />192.168.0.1-192.168.0.100</div>');
|
|
try { Q('idx_iprange').value = localStorage.getItem('scanrange'); } catch (ex) { }
|
|
showScanDialogUpdate();
|
|
}
|
|
|
|
function showScanDialogUpdate() {
|
|
QS('idx_iprange')['background-color'] = ((Q('idx_iprange').value.length > 0) ? 'white' : 'LightYellow');
|
|
QE('idx_iprangebutton', Q('idx_iprange').value.length > 0);
|
|
amtScanCheckbox();
|
|
}
|
|
|
|
// Populate the Intel AMT scan dialog box with the result of the RMCP scan
|
|
function amtScanResult(scanner, result) {
|
|
if ((xxdialogMode == undefined) || (!Q('idx_iprange'))) return;
|
|
if (result == null) {
|
|
// If no results where found, display a nice message
|
|
QH('idx_results', '<div style=width:100%;text-align:center;margin-top:12px>Scan returned no results.</div><div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>Sample IP range values<br />192.168.0.100<br />192.168.0.0/16<br />192.167.0.1-192.168.0.100</div>');
|
|
} else {
|
|
// Add the new result to the scan results dialog box
|
|
var x = '', str = '<b>' + result.rinfo.address + '</b> - v' + result.ver;
|
|
if (globalAmtScannerResults == null) { globalAmtScannerResults = {}; QH('idx_results', ''); }
|
|
globalAmtScannerResults[result.rinfo.address] = result;
|
|
if (result.state == 2) { if (result.tls == 1) { str += ' with TLS.'; } else { str += ' without TLS.'; } } else { str += ' not activated.'; }
|
|
x += '<div style=margin-bottom:2px>';
|
|
x += '<div class=j1 style=height:24px;float:left;background-color:white></div>';
|
|
x += '<div class=g1 style=height:24px;float:left></div><div class=g2 style=height:24px;float:right></div><div style=height:24px;width:100%;background-color:#c9c9c9><div><div style=display:inline-block;margin-right:5px><input class=DevScanCheckbox tag="' + result.rinfo.address + '" type=checkbox onclick=amtScanCheckbox() /></div><div style=display:inline-block;margin-left:5px>' + str + '</div></div></div></div>';
|
|
QA('idx_results', x);
|
|
}
|
|
}
|
|
|
|
function amtScanStartScan() {
|
|
var ip_range = Q('idx_iprange').value;
|
|
try { localStorage.setItem('scanrange', ip_range); } catch (ex) { }
|
|
globalAmtScannerResults = null;
|
|
if (globalAmtScanner.performRangeScan('1', ip_range, amtScanResult) == false) {
|
|
// The scan could not occur because of an error. Likely the user range was invalid.
|
|
x = '<div style=width:100%;text-align:center;margin-top:12px>' + "No se puede escanear este rango de direcciones." + '</div><div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>' + "Muestra de valores de rango de IP" + '<br />192.168.0.100<br />192.168.0.0/16<br />192.167.0.1-192.168.0.100</div>';
|
|
} else {
|
|
// Show scanning...
|
|
QH('idx_results', '<div style=width:100%;text-align:center;margin-top:12px>' + "Exploración..." + '</div>');
|
|
}
|
|
}
|
|
|
|
// Called when a scanned computer is checked or unchecked.
|
|
function amtScanCheckbox() {
|
|
var elements = document.getElementsByClassName('DevScanCheckbox'), checkcount = 0;
|
|
for (var i in elements) { if (elements[i].checked) checkcount++; }
|
|
QE('idx_dlgOkButton', checkcount > 0);
|
|
}
|
|
|
|
// Called when the OK button is pressed on the scan dialog
|
|
function showScanDialogOk() {
|
|
var elements = document.getElementsByClassName('DevScanCheckbox');
|
|
for (var i in elements) {
|
|
if (elements[i].checked) {
|
|
var ipaddr = elements[i].getAttribute('tag');
|
|
var result = globalAmtScannerResults[ipaddr];
|
|
computerlist.push({ 'h': Math.random(), 'name': ipaddr, 'host': ipaddr, 'tags': '', 'user': 'admin', 'pass': '', 'tls': result.tls, 'ver': result.ver });
|
|
}
|
|
saveComputers();
|
|
updateComputerList();
|
|
}
|
|
}
|
|
|
|
// Called by the scanner to change Intel AMT presense state
|
|
function amtScanChangePresence(h, presence) {
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) return;
|
|
// ###END###{MeshServerConnect}
|
|
var element = Q('SS-' + h);
|
|
if (element) { element.style['background-color'] = presence ? 'green' : 'red'; }
|
|
|
|
// ###BEGIN###{Look-Commander}
|
|
if (presence) { Q('SI-' + h).classList.remove('gray'); } else { Q('SI-' + h).classList.add('gray'); }
|
|
// ###END###{Look-Commander}
|
|
|
|
// If the computer that was updated is the current computer, update the details.
|
|
if (currentcomputer && (currentcomputer.h == h)) { updateComputerDetails(); }
|
|
}
|
|
|
|
// Called when used clicks the "Scan for presense" menu option
|
|
function NW_AmtScanMenu() {
|
|
try { localStorage.setItem('scanForComputers', NW_AmtScanMenuItem.checked); } catch (ex) { }
|
|
if (NW_AmtScanMenuItem.checked == true) { globalAmtScanner.start(); } else { globalAmtScanner.stop(); }
|
|
updateComputerList();
|
|
}
|
|
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###END###{ComputerSelectorScanner}
|
|
|
|
// ###END###{ComputerSelector}
|
|
|
|
// ###BEGIN###{ContextMenus}
|
|
function handleContextMenu(e) {
|
|
hideContextMenu();
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{ComputerSelector}
|
|
toolmenuclick(-1);
|
|
// ###END###{ComputerSelector}
|
|
var cm = document.elementFromPoint(e.pageX, e.pageY);
|
|
while (cm && cm != null && cm.getAttribute('cm') == null) { cm = cm.parentElement; }
|
|
if (cm && cm != null && cm.getAttribute('cm') != null) {
|
|
var x = '', menus = cm.getAttribute('cm').split('|');
|
|
if (cm.getAttribute('class') == 'computeritem') cm.click();
|
|
for (var i in menus) {
|
|
if (menus[i] == '-') {
|
|
x += '<hr style="border:1px solid lightgray" />';
|
|
} else {
|
|
var menus2 = menus[i].split('#');
|
|
x += '<div class=cmtext onclick=\"hideContextMenu();' + menus2[1] + '\"><b>' + menus2[0] + '</b></div>';
|
|
}
|
|
}
|
|
QS('contextMenu').top = e.pageY + 'px';
|
|
QS('contextMenu').left = e.pageX + 'px';
|
|
QH('contextMenu', x);
|
|
QV('contextMenu', true);
|
|
haltEvent(e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function hideContextMenu() { QV('contextMenu', false); }
|
|
// ###END###{ContextMenus}
|
|
|
|
//
|
|
// BOTTOM INFORMATION STRING
|
|
//
|
|
|
|
// ###BEGIN###{VersionWarning}
|
|
// Returns true if Intel AMT needs to be updated
|
|
function checkAmtVersion(version) {
|
|
var vSplit = version.split('.');
|
|
var v1 = parseInt(vSplit[0]);
|
|
var v2 = parseInt(vSplit[1]);
|
|
var v3 = parseInt(vSplit[2]);
|
|
var vx = ((v2 * 1000) + v3);
|
|
var ok = 0;
|
|
|
|
if ((v1 <= 5) || (v1 >= 12)) { ok = 1; } // Intel AMT less then v5 and v12 and beyond, all ok.
|
|
else if ((v1 == 6) && (vx >= 2061)) { ok = 1; } // 1st Gen Core
|
|
else if ((v1 == 7) && (vx >= 1091)) { ok = 1; } // 2st Gen Core
|
|
else if ((v1 == 8) && (vx >= 1071)) { ok = 1; } // 3st Gen Core
|
|
else if ((v1 == 9)) { if ((v2 < 5) && (vx >= 1041)) { ok = 1; } else if (vx >= 5061) { ok = 1; } } // 4st Gen Core
|
|
else if ((v1 == 10) && (vx >= 55)) { ok = 1; } // 5st Gen Core
|
|
else if (v1 == 11) {
|
|
if ((v2 < 5) && (vx >= 25)) { ok = 1; } // 6st Gen Core
|
|
else if (vx >= 6027) { ok = 1; } // 7st Gen Core
|
|
}
|
|
return (ok == 0);
|
|
}
|
|
// ###END###{VersionWarning}
|
|
|
|
function processSystemVersion(stack, name, responses, status) {
|
|
if (status == 200 || status == 400) {
|
|
var v;
|
|
if (status == 200) {
|
|
//amtlogicalelements = responses;
|
|
amtlogicalelements = [];
|
|
if (responses != null) {
|
|
if (responses['CIM_SoftwareIdentity'] != null && responses['CIM_SoftwareIdentity'].responses != null) {
|
|
amtlogicalelements = responses['CIM_SoftwareIdentity'].responses;
|
|
if (responses['AMT_SetupAndConfigurationService'] != null && responses['AMT_SetupAndConfigurationService'].response != null) {
|
|
amtlogicalelements.push(responses['AMT_SetupAndConfigurationService'].response);
|
|
}
|
|
}
|
|
}
|
|
if (amtlogicalelements.length == 0) { console.error('ERROR: Could not get Intel AMT version.'); disconnect(); return; } // Could not get Intel AMT version, disconnect();
|
|
v = getInstance(amtlogicalelements, 'AMT')['VersionString'];
|
|
} else {
|
|
v = stack.wsman.comm.amtVersion;
|
|
if (!v) { errcheck(400, stack); return; }
|
|
}
|
|
amtversion = parseInt(v.split('.')[0]);
|
|
amtversionmin = parseInt(v.split('.')[1]);
|
|
|
|
// If this is Intel AMT 16 or higher, boost the stack speed by allowing HTTP pipelining.
|
|
//if (amtversion > 15) {
|
|
//stack.MaxActiveEnumsCount = 2;
|
|
//stack.wsman.comm.MaxActiveAjaxCount = 2;
|
|
//}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
// Perform Intel ME authentication if available.
|
|
if ((amtversion >= 15) && (wsstack.comm.xtlsCertificate != null)) {
|
|
stack.amtauthnonce = require('crypto').randomBytes(20).toString('base64');
|
|
stack.AMT_GeneralSettings_AMTAuthenticate(stack.amtauthnonce, function (stack, name, response, status) {
|
|
//console.log('AMTAuthenticate', status, response);
|
|
//status = 200;
|
|
//response = JSON.parse('{"Header":{"To":"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous","RelatesTo":"15","Action":"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_GeneralSettings/AMTAuthenticateResponse","MessageID":"uuid:00000000-8086-8086-8086-00000000008E","ResourceURI":"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_GeneralSettings","Method":"AMTAuthenticate"},"Body":{"Nonce":"s5PzXOyJqlPwnE/FJ1Imk2tLc2s=","UUID":"465A544C39335830B0304A51465A544C","FQDN":"","FWVersion":"15.0.10.7000","AMTSVN":1,"Signature":"cT4DpT2VpDi0jq+3tIswntXIIitCQV6QxMbXMZryob7RYRyazW9YFKrX5nfu0tPpTqLEP9P+C8pVT4ZngU1TIrn2ptVw/xCKmOn56Y62U0Gv+fQSG1+AJFRej+W7Clv4","LengthOfCertificates":[602,638,631,708],"Certificates":"MIICVjCCAd2gAwIBAgIQSsxzEcw7W5elVuRWfkbN1zAKBggqhkjOPQQDAzAeMRwwGgYDVQQDDBNDU01FIFRHTCBBTVQgIDAxU0RFMB4XDTIwMDcyMzAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowFTETMBEGA1UEAwwKQU1UIFdTLU1BTjB2MBAGByqGSM49AgEGBSuBBAAiA2IABOiUImnj9foD828QWknCF47SuIhwKn+AzhcgPz7IaUb/Z9KTPn57VfxahHBObijKRodtcxao0Jip/0sM3wbXkHvF03BLdxP6/ab5uMYLH+ZDjdlwC69qkjQtXciIzml8u6OB6DCB5TAfBgNVHSMEGDAWgBS4jxQZFu/qvArLmfxFoa+HO3ZPhjAPBgNVHRMBAf8EBTADAQEAMA4GA1UdDwEB/wQEAwIGgDCBoAYDVR0fBIGYMIGVMIGSoEqgSIZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY3Jscy9PbkRpZV9DQV9DU01FX0luZGlyZWN0LmNybKJEpEIwQDEmMCQGA1UECwwdT25EaWUgQ0EgQ1NNRSBJbnRlcm1lZGlhdGUgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wCgYIKoZIzj0EAwMDZwAwZAIwMlkcpHt5ydDt2hmnF+pJxLzH6oF3K2XPviuudyQ8DtHfuziWXgI7t2KS/Y5tOFEAAjBxLW0MkEcpDlsKNS0ASNxOhi6neEEQaxT93EJh3J/Z0SU8qYdE2/qtfe087XhCvlowggJ6MIICAaADAgECAgUBBBwAIDAKBggqhkjOPQQDAzAjMSEwHwYDVQQDDBhDU01FIFRHTCBTVk4wMSBLZXJuZWwgREUwHhcNMjAwNzIzMDAwMDAwWhcNNDkxMjMxMjM1OTU5WjAeMRwwGgYDVQQDDBNDU01FIFRHTCBBTVQgIDAxU0RFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAES/XBgK8rDlDycUzCocI1TrrrcQzD2Okq2BJhfqSg6MKxRMyei903Ewl94yl+tFsWoLuPiZDVE/bfxJghTynuGxk38YI8Qn8L3mPL+ahh3tSxWxC3kdszrU9dgObLF+2Io4IBCDCCAQQwHwYDVR0jBBgwFoAUzxraD/dMy5Zf2FiUKGctnPWwk30wHQYDVR0OBBYEFLiPFBkW7+q8CsuZ/EWhr4c7dk+GMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMIGgBgNVHR8EgZgwgZUwgZKgSqBIhkZodHRwczovL3RzREUuaW50ZWwuY29tL2NvbnRlbnQvT25EaWVDQS9jcmxzL09uRGllX0NBX0NTTUVfSW5kaXJlY3QuY3JsokSkQjBAMSYwJAYDVQQLDB1PbkRpZSBDQSBDU01FIEludGVybWVkaWF0ZSBDQTEWMBQGA1UEAwwNd3d3LmludGVsLmNvbTAKBggqhkjOPQQDAwNnADBkAjBiU4sHamrnSkvkwpTbVJah30CSGycVSwlUCUnXxFBFcCmXQeuXdElJiXhZyO5CQf8CMBxnQghoKlmUCKhzEYHjDMdXAKJcIapz6ksRDuYycxOlEpyBjei5tU5Nq16qDdt0njCCAnMwggH5oAMCAQICAQEwCgYIKoZIzj0EAwMwGjEYMBYGA1UEAwwPQ1NNRSBUR0wgUk9NIERFMB4XDTIwMDcyMzAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowIzEhMB8GA1UEAwwYQ1NNRSBUR0wgU1ZOMDEgS2VybmVsIERFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEtfPOoxER7WKkOQQFPnDBikHOrIkNZA1si7sFV1Y1tSBF4HCCl0BfXo5GqsOxzwJ2JcJLiP16ZP3rMcOOpufVLwPwN/0jmP1/KDeANgmwGLLvjAuHfx/KRU3MqkDdSLbfo4IBCDCCAQQwHwYDVR0jBBgwFoAUsd+j/J4YMaOrY0I0x9dKYND8mMQwHQYDVR0OBBYEFM8a2g/3TMuWX9hYlChnLZz1sJN9MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgKsMIGgBgNVHR8EgZgwgZUwgZKgSqBIhkZodHRwczovL3RzREUuaW50ZWwuY29tL2NvbnRlbnQvT25EaWVDQS9jcmxzL09uRGllX0NBX0NTTUVfSW5kaXJlY3QuY3JsokSkQjBAMSYwJAYDVQQLDB1PbkRpZSBDQSBDU01FIEludGVybWVkaWF0ZSBDQTEWMBQGA1UEAwwNd3d3LmludGVsLmNvbTAKBggqhkjOPQQDAwNoADBlAjB0WjT9RuE7v+dm2EM2uf7uZ3Pv3KAKZzBkpvokIbuO1qE3FS36mf3kKfl58hMhfosCMQD4NyxKd28cm9ZfW7eOEetEwXXDgCtq+rfzCXbJWDQvkYpnS4LPxIXxEsiN6/scTH0wggLAMIICRqADAgECAhBAAAAAAAAAAAAAAAAAAAAAMAoGCCqGSM49BAMDMEgxLjAsBgNVBAsMJU9uIERpZSBDU01FIERfVEdMIERFQlVHMDAwIElzc3VpbmcgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wHhcNMTkwMTAxMDAwMDAwWhcNNDkxMjMxMjM1OTU5WjAaMRgwFgYDVQQDDA9DU01FIFRHTCBST00gREUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQ4g65/2ziA9osYJXOdQ81/PobyJmcTqSU8CMcVk3OyWhGjaczREvl+DvZpd5+2CYAxSr3ItlK5Jn3z1xG4mwHRzH0FFdu7Ooxf7kSH5dXnSO7hv6q/y97+KTy6odfzRuqjggEhMIIBHTAfBgNVHSMEGDAWgBQ7McrVw0uS10jI/ZKqda6dMkoGQjAdBgNVHQ4EFgQUsd+j/J4YMaOrY0I0x9dKYND8mMQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAa4wYgYIKwYBBQUHAQEEVjBUMFIGCCsGAQUFBzAChkZodHRwczovL3RzREUuaW50ZWwuY29tL2NvbnRlbnQvT25EaWVDQS9jZXJ0cy9UR0xfREVCVUcwMDBfT25EaWVfQ0EuY2VyMFYGA1UdHwRPME0wS6BJoEeGRWh0dHBzOi8vdHNERS5pbnRlbC5jb20vY29udGVudC9PbkRpZUNBL2NybHMvVEdMX0RFQlVHMDAwX09uRGllX0NBLmNybDAKBggqhkjOPQQDAwNoADBlAjAjX8BHXjQGsr1uqkCDdqRRzT2yQNLU4i85H+mJboRaAB2h09mISKagGU0m3DXywmICMQDmTjjpPjCJye9m2u/csfkUAn7rP1FLmdJHtT9qN968CACWQQ356e8s3XgNpNtexJU=","ReturnValue":0,"ReturnValueStr":"SUCCESS"}}'); // Sample Response 1
|
|
//response = JSON.parse('{"Header":{"To":"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous","RelatesTo":"15","Action":"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_GeneralSettings/AMTAuthenticateResponse","MessageID":"uuid:00000000-8086-8086-8086-0000000000F8","ResourceURI":"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_GeneralSettings","Method":"AMTAuthenticate"},"Body":{"Nonce":"NlfyHfo322EtefP1q5s92K+szBw=","UUID":"465A544C39335830B0304A51465A544C","FQDN":"","FWVersion":"15.0.10.7000","AMTSVN":1,"Signature":"9jBx0HfvNECPrMrg16px2RGDu/qdgrUyguOamlJ5hpiYgt9ZPrMz6/WgYY5nbnT6zBxSTUP+AqEzcmA6oWunYHZQJprY9iDdew4PPIHWqGZGgqh/10m3aYHwy+TKk/Ab","LengthOfCertificates":[603,638,631,708],"Certificates":"MIICVzCCAd2gAwIBAgIQSsxzEcw7W5elVuRWfkbN1zAKBggqhkjOPQQDAzAeMRwwGgYDVQQDDBNDU01FIFRHTCBBTVQgIDAxU0RFMB4XDTIwMDcyMzAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowFTETMBEGA1UEAwwKQU1UIFdTLU1BTjB2MBAGByqGSM49AgEGBSuBBAAiA2IABOiUImnj9foD828QWknCF47SuIhwKn+AzhcgPz7IaUb/Z9KTPn57VfxahHBObijKRodtcxao0Jip/0sM3wbXkHvF03BLdxP6/ab5uMYLH+ZDjdlwC69qkjQtXciIzml8u6OB6DCB5TAfBgNVHSMEGDAWgBS4jxQZFu/qvArLmfxFoa+HO3ZPhjAPBgNVHRMBAf8EBTADAQEAMA4GA1UdDwEB/wQEAwIGgDCBoAYDVR0fBIGYMIGVMIGSoEqgSIZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY3Jscy9PbkRpZV9DQV9DU01FX0luZGlyZWN0LmNybKJEpEIwQDEmMCQGA1UECwwdT25EaWUgQ0EgQ1NNRSBJbnRlcm1lZGlhdGUgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wCgYIKoZIzj0EAwMDaAAwZQIwYCfw7GuUi9XxfBfhO/LYUbSb3pd65tkpRSLjIhsj9uMG9DFbMVUy9aicvZt7NYwXAjEAtAdHvcmoI/fZfw2Mo7TooojLe+xfHzZ5NyZyVlPaVyya25K/3kE05gvQO1jvk/ZcMIICejCCAgGgAwIBAgIFAQQcACAwCgYIKoZIzj0EAwMwIzEhMB8GA1UEAwwYQ1NNRSBUR0wgU1ZOMDEgS2VybmVsIERFMB4XDTIwMDcyMzAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowHjEcMBoGA1UEAwwTQ1NNRSBUR0wgQU1UICAwMVNERTB2MBAGByqGSM49AgEGBSuBBAAiA2IABEv1wYCvKw5Q8nFMwqHCNU6663EMw9jpKtgSYX6koOjCsUTMnovdNxMJfeMpfrRbFqC7j4mQ1RP238SYIU8p7hsZN/GCPEJ/C95jy/moYd7UsVsQt5HbM61PXYDmyxftiKOCAQgwggEEMB8GA1UdIwQYMBaAFM8a2g/3TMuWX9hYlChnLZz1sJN9MB0GA1UdDgQWBBS4jxQZFu/qvArLmfxFoa+HO3ZPhjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwICBDCBoAYDVR0fBIGYMIGVMIGSoEqgSIZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY3Jscy9PbkRpZV9DQV9DU01FX0luZGlyZWN0LmNybKJEpEIwQDEmMCQGA1UECwwdT25EaWUgQ0EgQ1NNRSBJbnRlcm1lZGlhdGUgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wCgYIKoZIzj0EAwMDZwAwZAIwYlOLB2pq50pL5MKU21SWod9AkhsnFUsJVAlJ18RQRXApl0Hrl3RJSYl4WcjuQkH/AjAcZ0IIaCpZlAiocxGB4wzHVwCiXCGqc+pLEQ7mMnMTpRKcgY3oubVOTateqg3bdJ4wggJzMIIB+aADAgECAgEBMAoGCCqGSM49BAMDMBoxGDAWBgNVBAMMD0NTTUUgVEdMIFJPTSBERTAeFw0yMDA3MjMwMDAwMDBaFw00OTEyMzEyMzU5NTlaMCMxITAfBgNVBAMMGENTTUUgVEdMIFNWTjAxIEtlcm5lbCBERTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLXzzqMREe1ipDkEBT5wwYpBzqyJDWQNbIu7BVdWNbUgReBwgpdAX16ORqrDsc8CdiXCS4j9emT96zHDjqbn1S8D8Df9I5j9fyg3gDYJsBiy74wLh38fykVNzKpA3Ui236OCAQgwggEEMB8GA1UdIwQYMBaAFLHfo/yeGDGjq2NCNMfXSmDQ/JjEMB0GA1UdDgQWBBTPGtoP90zLll/YWJQoZy2c9bCTfTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwICrDCBoAYDVR0fBIGYMIGVMIGSoEqgSIZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY3Jscy9PbkRpZV9DQV9DU01FX0luZGlyZWN0LmNybKJEpEIwQDEmMCQGA1UECwwdT25EaWUgQ0EgQ1NNRSBJbnRlcm1lZGlhdGUgQ0ExFjAUBgNVBAMMDXd3dy5pbnRlbC5jb20wCgYIKoZIzj0EAwMDaAAwZQIwdFo0/UbhO7/nZthDNrn+7mdz79ygCmcwZKb6JCG7jtahNxUt+pn95Cn5efITIX6LAjEA+DcsSndvHJvWX1u3jhHrRMF1w4Aravq38wl2yVg0L5GKZ0uCz8SF8RLIjev7HEx9MIICwDCCAkagAwIBAgIQQAAAAAAAAAAAAAAAAAAAADAKBggqhkjOPQQDAzBIMS4wLAYDVQQLDCVPbiBEaWUgQ1NNRSBEX1RHTCBERUJVRzAwMCBJc3N1aW5nIENBMRYwFAYDVQQDDA13d3cuaW50ZWwuY29tMB4XDTE5MDEwMTAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowGjEYMBYGA1UEAwwPQ1NNRSBUR0wgUk9NIERFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEOIOuf9s4gPaLGCVznUPNfz6G8iZnE6klPAjHFZNzsloRo2nM0RL5fg72aXeftgmAMUq9yLZSuSZ989cRuJsB0cx9BRXbuzqMX+5Eh+XV50ju4b+qv8ve/ik8uqHX80bqo4IBITCCAR0wHwYDVR0jBBgwFoAUOzHK1cNLktdIyP2SqnWunTJKBkIwHQYDVR0OBBYEFLHfo/yeGDGjq2NCNMfXSmDQ/JjEMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGuMGIGCCsGAQUFBwEBBFYwVDBSBggrBgEFBQcwAoZGaHR0cHM6Ly90c0RFLmludGVsLmNvbS9jb250ZW50L09uRGllQ0EvY2VydHMvVEdMX0RFQlVHMDAwX09uRGllX0NBLmNlcjBWBgNVHR8ETzBNMEugSaBHhkVodHRwczovL3RzREUuaW50ZWwuY29tL2NvbnRlbnQvT25EaWVDQS9jcmxzL1RHTF9ERUJVRzAwMF9PbkRpZV9DQS5jcmwwCgYIKoZIzj0EAwMDaAAwZQIwI1/AR140BrK9bqpAg3akUc09skDS1OIvOR/piW6EWgAdodPZiEimoBlNJtw18sJiAjEA5k446T4wicnvZtrv3LH5FAJ+6z9RS5nSR7U/ajfevAgAlkEN+envLN14DaTbXsSV","ReturnValue":0,"ReturnValueStr":"SUCCESS"}}'); // Sample Response 2
|
|
|
|
if (status == 200) {
|
|
stack.amtauth = response.Body;
|
|
stack.amtauth.CertificatesDer = [];
|
|
var certs = [], urlList = [], certsbin = atob(stack.amtauth.Certificates), cptr = 0;
|
|
for (var i = 0; i < stack.amtauth.LengthOfCertificates.length; i++) {
|
|
var bin = certsbin.substring(cptr, cptr + stack.amtauth.LengthOfCertificates[i]);
|
|
stack.amtauth.CertificatesDer.push(bin);
|
|
var cert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(bin)); // Node-forge does not support ECC, but we are using a modified Node-forge that can still parse the cert.
|
|
cert.xCrlUrls = getExtensionUrls(cert, 'cRLDistributionPoints');
|
|
cert.xParentUrls = getExtensionUrls(cert, { id: '1.3.6.1.5.5.7.1.1' });
|
|
cert.xFingerprint = forge.md.sha256.create().update(bin).digest().toHex().toUpperCase();
|
|
cptr += stack.amtauth.LengthOfCertificates[i];
|
|
certs.push(cert);
|
|
if ((cert.xCrlUrls.length > 0) && (urlList.indexOf(cert.xCrlUrls[0]) == -1)) { urlList.push(cert.xCrlUrls[0]); }
|
|
}
|
|
|
|
// If the top certificate has a parent URL, add it to the list of URL's to fetch.
|
|
if ((certs.length > 0) && (certs[certs.length - 1].xParentUrls.length > 0) && (urlList.indexOf(certs[certs.length - 1].xParentUrls[0]) == -1)) {
|
|
urlList.push(certs[certs.length - 1].xParentUrls[0]);
|
|
}
|
|
|
|
stack.amtauth.Certificates = certs;
|
|
stack.amtauth.ClientNonce = stack.amtauthnonce;
|
|
delete stack.amtauth.LengthOfCertificates;
|
|
stack.amtauth.uuidStr = guidToStr(stack.amtauth.UUID).toLowerCase();
|
|
|
|
var trustedCsmeRoots = [
|
|
'3BA13766B1889DCB1E2D55BACCC9EC087452F78783E2EBAFD918FF4ED6ACC840', // www.intel.com / OnDie CA DEBUG Root Cert Signing CA
|
|
'C001DF02B31A60A2B37130365956400A2AFCFD147E8552FD7EA3F17F2AB0D457', // www.intel.com / ODCA CA2 CSME Intermediate CA
|
|
'5E3EEE5748AC13E0B3D1227FCDC4751AA1402DDE8031D21F63CB4ECF43F02440' // www.intel.com / OnDie CA CSME Intermediate CA
|
|
];
|
|
|
|
// Load the entire certificate chain and CRL's
|
|
var urlLoad = function (url, data) {
|
|
if (data == null) return;
|
|
for (var j in certs) {
|
|
if ((certs[j].xCrlUrls.length > 0) && (certs[j].xCrlUrls[0] == url)) { certs[j].xCrl = data; }
|
|
if ((j == (certs.length - 1)) && (certs[j].xParentUrls.length > 0) && (certs[j].xParentUrls[0] == url)) {
|
|
var xcert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(data)); // Node-forge does not support ECC, but we are using a modified Node-forge that can still parse the cert.
|
|
xcert.xCrlUrls = getExtensionUrls(xcert, 'cRLDistributionPoints');
|
|
xcert.xParentUrls = getExtensionUrls(xcert, { id: '1.3.6.1.5.5.7.1.1' });
|
|
xcert.xFingerprint = forge.md.sha256.create().update(data).digest().toHex().toUpperCase();
|
|
if (trustedCsmeRoots.indexOf(xcert.xFingerprint) >= 0) { xcert.xTrusted = true; }
|
|
certs.push(xcert);
|
|
stack.amtauth.CertificatesDer.push(data);
|
|
if ((xcert.xCrlUrls.length > 0) && (urlList.indexOf(xcert.xCrlUrls[0]) == -1)) { getCertUrl(xcert.xCrlUrls[0], urlLoad); }
|
|
if ((xcert.xParentUrls.length > 0) && (urlList.indexOf(xcert.xParentUrls[0]) == -1)) { urlList.push(xcert.xParentUrls[0]); getCertUrl(xcert.xParentUrls[0], urlLoad); }
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
for (var i in urlList) { getCertUrl(urlList[i], urlLoad); }
|
|
} else {
|
|
console.log('AMTAuthenticate', status, response);
|
|
}
|
|
delete stack.amtauthnonce;
|
|
});
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{ComputerSelector}
|
|
if (stack.wsman.comm.digestRealm && (currentcomputer['digestrealm'] != stack.wsman.comm.digestRealm)) {
|
|
currentcomputer['digestrealm'] = stack.wsman.comm.digestRealm;
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
saveComputers();
|
|
// ###END###{ComputerSelector-Local}
|
|
updateComputerDetails();
|
|
}
|
|
// ###END###{ComputerSelector}
|
|
|
|
// ###BEGIN###{VersionWarning}
|
|
QV('id_versionWarning', checkAmtVersion(v));
|
|
// ###END###{VersionWarning}
|
|
// ###BEGIN###{!Mode-Firmware}
|
|
//if (amtversion > 10) { wsstack.comm.MaxActiveAjaxCount = 4; amtstack.MaxActiveEnumsCount = 1; console.log('HTTP Pipelining activated'); } // With Intel AMT 11 and higher, use HTTP pipelining.
|
|
// ###END###{!Mode-Firmware}
|
|
|
|
PullSystemStatus();
|
|
updateSystemStatus();
|
|
|
|
// Perform loads more WSMAN only if needed
|
|
if ((urlvars['kvmonly'] != 1) && (fullscreenonly == false)) {
|
|
PullUserInfo();
|
|
|
|
// ###BEGIN###{Alarms}
|
|
if (amtversion >= 8) PullAlarms();
|
|
// ###END###{Alarms}
|
|
}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (wsstack.comm.getPeerCertificate() != null) {
|
|
QV('tlsNotification1', wsstack.comm.xtlsCheck == 1);
|
|
QV('tlsNotification2', wsstack.comm.xtlsCheck == 2);
|
|
QV('tlsNotification3', wsstack.comm.xtlsCheck == 3);
|
|
}
|
|
if (currentcomputer['tlscerthash2']) delete currentcomputer['tlscerthash2'];
|
|
if (currentcomputer['tlscert2']) delete currentcomputer['tlscert2'];
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// Connection callback
|
|
if (connectFunc) { connectFunc(connectFuncTag); connectFunc = null; connectFuncTag = null; }
|
|
|
|
// ###BEGIN###{Desktop}
|
|
if (urlvars['kvm'] == 1) { go(14); connectDesktop(); }
|
|
if ((urlvars['kvmfull'] == 1) || (urlvars['kvmonly'] == 1)) { go(14); connectDesktop(); }
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Terminal}
|
|
if (urlvars['sol'] == 1) { go(13); connectTerminal(); }
|
|
// ###END###{Terminal}
|
|
|
|
// ###BEGIN###{Scripting}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!ComputerSelector-Local-ScriptOnly}
|
|
if (urlvars['host'] && urlvars['script']) {
|
|
try {
|
|
var data = require('fs').readFileSync(urlvars['script'], 'utf8');
|
|
if (data) { script_onScriptRead( { target: { result: data }} ); }
|
|
} catch (e) { messagebox("Ejecutar guión", "Archivo de script no válido") }
|
|
}
|
|
// ###END###{!ComputerSelector-Local-ScriptOnly}
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###END###{Scripting}
|
|
} else {
|
|
errcheck(status, stack);
|
|
}
|
|
}
|
|
|
|
// Control the state of all refresh buttons
|
|
var refreshButtonsState = true;
|
|
function refreshButtons(x) {
|
|
if (refreshButtonsState == x) return;
|
|
refreshButtonsState = x;
|
|
var i = 0, e = document.getElementsByTagName('input');
|
|
for (; i < e.length; i++) { if (e[i].name == 'refreshbtn') { e[i].disabled = !x; } }
|
|
}
|
|
|
|
// Store certificate pinning
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
function storeCertPinning(host, hash) {
|
|
var pins = {};
|
|
try { pins = JSON.parse(localStorage.getItem('amtcertpins')); } catch (e) { }
|
|
if ((pins == null) || (typeof pins != 'object')) { pins = {}; }
|
|
if (hash) { pins[host] = hash; } else { delete pins[host]; }
|
|
try { localStorage.setItem('amtcertpins', JSON.stringify(pins)); } catch (ex) { }
|
|
}
|
|
|
|
function getCertPinnings() { try { var x = JSON.parse(localStorage.getItem('amtcertpins')); if ((x == null) || (typeof x != 'object')) return {}; return x; } catch (e) { return {} } }
|
|
function getCertPinning(host) { return getCertPinnings()[host]; }
|
|
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// Display TLS certificate
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var showTlsCertTempCert;
|
|
function showTlsCert(buttons, msg, cert, tag, func) {
|
|
if (xxdialogMode) return;
|
|
var c = showTlsCertTempCert = cert?cert:wsstack.comm.getPeerCertificate(), x = '<br>';
|
|
if (msg) x = '<div>' + msg + '</div><br />';
|
|
// ###BEGIN###{FileSaver}
|
|
x += addHtmlValue("Certificado", c.raw.length + " bytes," + '<a style=cursor:pointer;color:blue onclick=downloadTlsCert()>' + "Descargar" + '</a>');
|
|
// ###END###{FileSaver}
|
|
// ###BEGIN###{!FileSaver}
|
|
x += addHtmlValue("Certificado", c.raw.length + " bytes");
|
|
// ###END###{!FileSaver}
|
|
|
|
// Display certificate key usages
|
|
var y = [];
|
|
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.2') >= 0) { y.push(NoBreak("Cliente TLS")); }
|
|
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.3') >= 0) { y.push(NoBreak("Firma de código")); }
|
|
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.4') >= 0) { y.push("Correo electrónico"); }
|
|
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.1') >= 0) { y.push(NoBreak("Servidor TLS")); }
|
|
if (c.ext_key_usage.indexOf('2.16.840.1.113741.1.2.1') >= 0) { y.push(NoBreak("Consola Intel® AMT")); }
|
|
if (c.ext_key_usage.indexOf('2.16.840.1.113741.1.2.2') >= 0) { y.push(NoBreak("Agente Intel® AMT")); }
|
|
if (c.ext_key_usage.indexOf('2.16.840.1.113741.1.2.3') >= 0) { y.push(NoBreak("Activación Intel® AMT")); }
|
|
if (c.ext_key_usage.indexOf('1.3.6.1.5.5.7.3.8') >= 0) { y.push(NoBreak("Marcando la hora")); }
|
|
if (y.length > 0) { x += addHtmlValueNoTitle("Uso de certificado", y.join(', ') + '.') + '<br clear=all />'; }
|
|
|
|
x += '<br><div style="border-bottom:1px solid gray"><i>' + "Asunto del certificado" + '</i></div><br>';
|
|
for (var i in c.subject) { if (c.subject[i]) { x += addHtmlValue(xxCertSubjectNames[i] ? xxCertSubjectNames[i] : i, EscapeHtml(MakeToArray(c.subject[i]).join(', '))); } }
|
|
x += addHtmlValueNoTitle("Huella dactilar", c.fingerprint.substring(0,29) + '<br />' + c.fingerprint.substring(30));
|
|
x += '<br><div style="border-bottom:1px solid gray"><i>' + "Certificado de emisor" + '</i></div><br>';
|
|
for (var i in c.issuer) { if (c.issuer[i]) { x += addHtmlValue(xxCertSubjectNames[i] ? xxCertSubjectNames[i] : i, EscapeHtml(MakeToArray(c.issuer[i]).join(', '))); } }
|
|
if (func == null) { func = showTlsCertDefault; }
|
|
setDialogMode(11, "Certificado TLS -" + EscapeHtml(c.subject['CN']), buttons, func, x, { c: c, m: tag });
|
|
}
|
|
|
|
function showTlsCertDefault(b, args) {
|
|
var cert = args.c, mode = args.m;
|
|
if (b == 0) { disconnect(); }
|
|
if (b == 1) {
|
|
currentcomputer['tlscerthash'] = cert.fingerprint.split(':').join('').toLowerCase();
|
|
currentcomputer['tlscert'] = cert.raw.toString('hex');
|
|
currentcomputer['tlscerthash2'] = cert.fingerprint.split(':').join('').toLowerCase();
|
|
currentcomputer['tlscert2'] = cert.raw.toString('hex');
|
|
storeCertPinning(currentcomputer.host, cert.fingerprint.split(':').join('').toLowerCase());
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
saveComputers();
|
|
// ###END###{ComputerSelector-Local}
|
|
updateComputerDetails();
|
|
if (mode == 1) {
|
|
// Reconnect immidiatly
|
|
computerConnect(undefined, currentcomputer['h'], 0, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
function downloadTlsCert() {
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file')
|
|
chooser.setAttribute('nwsaveas', showTlsCertTempCert.subject['CN'] + '.cer');
|
|
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, showTlsCertTempCert.raw, 'binary', function () { }); }, false);
|
|
chooser.click();
|
|
}
|
|
|
|
function switchToTls() {
|
|
if (xxTlsCurrentCert == null) {
|
|
setDialogMode(11, "Cambiar a TLS", 3, switchToTls1, "La conexión no está asegurada actualmente. Haga clic en Aceptar para configurar Intel AMT con TLS y cambiar a una conexión segura.");
|
|
} else {
|
|
setDialogMode(11, "Cambiar a TLS", 3, switchToTls1, "La conexión no está asegurada actualmente e Intel AMT ya está configurado con TLS. Haga clic en Aceptar para cambiar a una conexión segura.");
|
|
}
|
|
}
|
|
|
|
function switchToTls1() {
|
|
// Check if Intel AMT is already setup with TLS.
|
|
if (xxTlsCurrentCert == null) {
|
|
// TLS is not setup, start by asking Intel AMT to generate a key pair
|
|
messagebox("Configuración TLS", "Generando clave de certificado ...");
|
|
amtstack.AMT_PublicKeyManagementService_GenerateKeyPair(0, 2048, switchToTls2);
|
|
} else {
|
|
// Setup the certificate pinning and reconnect
|
|
var cert = null;
|
|
try { cert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(xxCertificates[xxTlsCurrentCert].X509Certificate)); } catch (ex) { messagebox("Certificado TLS", "Error al leer el certificado TLS: " + ex); return; }
|
|
currentcomputer['tlscert'] = forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).toHex();
|
|
currentcomputer['tlscerthash'] = forge.md.sha1.create().update(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()).digest().toHex();
|
|
currentcomputer['tls'] = 1;
|
|
updateComputerDetails();
|
|
saveComputers();
|
|
|
|
// Disconnect and reconnect immidiatly
|
|
disconnect();
|
|
computerConnect(undefined, currentcomputer['h'], 0, true);
|
|
}
|
|
}
|
|
|
|
function switchToTls2(stack, serviceName, response, status) {
|
|
if (status != 200) { messagebox("Emitir certificado", "Error al generar par de claves. Estado: " + status); return; }
|
|
if (response.Body['ReturnValue'] != 0) { messagebox("Emitir certificado", "Error al generar par de claves," + response.Body['ReturnValueStr']); return; }
|
|
|
|
// Get the new key pair
|
|
messagebox("Configuración TLS", "Obteniendo clave de certificado ...");
|
|
amtstack.Enum('AMT_PublicPrivateKeyPair', switchToTls3, response.Body['KeyPair']['ReferenceParameters']['SelectorSet']['Selector']['Value']);
|
|
}
|
|
|
|
function switchToTls3(stack, serviceName, response, status, tag) {
|
|
if (status != 200) { messagebox("Emitir certificado", "Error al generar par de claves. Estado: " + status); return; }
|
|
var DERKey = null;
|
|
for (var i in response) { if (response[i]['InstanceID'] == tag) DERKey = response[i]['DERKey']; }
|
|
|
|
// Sign the key pair using the CA certifiate
|
|
messagebox("Configuración TLS", "Creando certificado TLS ...");
|
|
|
|
var name = ''
|
|
try { name = amtsysstate['AMT_GeneralSettings'].response['HostName']; } catch (ex) { }
|
|
if ((name == null) || (name == '')) { name = currentcomputer['name']; }
|
|
if ((name == null) || (name == '')) { name = currentcomputer['host']; }
|
|
var cert = amtcert_signWithCaKey(DERKey, null, { 'CN': name, 'O': "Ninguna", 'ST': "Ninguna", 'C': "Ninguna" }, { 'CN': "Certificado raíz no confiable" }, { name: 'extKeyUsage', serverAuth: true });
|
|
if (cert == null) { messagebox("Emitir certificado", "No se puede firmar el certificado."); return; }
|
|
|
|
// Save cert and cert hash in computer list
|
|
messagebox("Configuración TLS", "Subiendo certificado TLS ...");
|
|
currentcomputer['tlscert'] = forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).toHex();
|
|
currentcomputer['tlscerthash'] = forge.md.sha1.create().update(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()).digest().toHex();
|
|
updateComputerDetails();
|
|
saveComputers();
|
|
|
|
// Place the resulting signed certificate back into AMT
|
|
var pem = forge.pki.certificateToPem(cert).replace(/(\r\n|\n|\r)/gm, '');
|
|
amtstack.AMT_PublicKeyManagementService_AddCertificate(pem.substring(27, pem.length - 25), switchToTls4);
|
|
}
|
|
|
|
function switchToTls4(stack, serviceName, response, status) {
|
|
if (status != 200) { messagebox("Emitir certificado", "Error al generar par de claves. Estado: " + status); return; }
|
|
|
|
messagebox("Configuración TLS", "Configuración del certificado TLS ...");
|
|
var certInstanceId = response.Body['CreatedCertificate']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
|
|
|
|
// Set the TLS certificate
|
|
setTlsSecurityPendingCalls = 3;
|
|
if (xxTLSCredentialContext.length > 0) {
|
|
// Modify the current context
|
|
var newTLSCredentialContext = Clone(xxTLSCredentialContext[0]);
|
|
newTLSCredentialContext['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'] = certInstanceId;
|
|
amtstack.Put('AMT_TLSCredentialContext', newTLSCredentialContext, switchToTls5, 0, 1);
|
|
} else {
|
|
// Add a new security context
|
|
amtstack.Create('AMT_TLSCredentialContext', {
|
|
'ElementInContext': '<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_PublicKeyCertificate') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + certInstanceId + '</w:Selector></w:SelectorSet></a:ReferenceParameters>',
|
|
'ElementProvidingContext': '<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_TLSProtocolEndpointCollection') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="ElementName">TLSProtocolEndpointInstances Collection</w:Selector></w:SelectorSet></a:ReferenceParameters>'
|
|
}, switchToTls5);
|
|
}
|
|
|
|
// Figure out what index is local & remote
|
|
var localNdx = ((xxTlsSettings[0]['InstanceID'] == 'Intel(r) AMT LMS TLS Settings')) ? 0 : 1, remoteNdx = (1 - localNdx);
|
|
|
|
// Remote TLS settings
|
|
var xxTlsSettings2 = Clone(xxTlsSettings);
|
|
xxTlsSettings2[remoteNdx]['Enabled'] = true;
|
|
xxTlsSettings2[remoteNdx]['MutualAuthentication'] = false;
|
|
xxTlsSettings2[remoteNdx]['AcceptNonSecureConnections'] = true;
|
|
delete xxTlsSettings2[remoteNdx]['TrustedCN'];
|
|
|
|
// Local TLS settings
|
|
xxTlsSettings2[localNdx]['Enabled'] = true;
|
|
delete xxTlsSettings2[localNdx]['TrustedCN'];
|
|
|
|
// Update TLS settings
|
|
amtstack.Put('AMT_TLSSettingData', xxTlsSettings2[0], switchToTls5, 0, 1, xxTlsSettings2[0]);
|
|
amtstack.Put('AMT_TLSSettingData', xxTlsSettings2[1], switchToTls5, 0, 1, xxTlsSettings2[1]);
|
|
}
|
|
|
|
function switchToTls5(stack, name, response, status) {
|
|
if (stack) {
|
|
if (status != 200) { messagebox('', "Error al establecer el certificado TLS, estado =" + status); return; }
|
|
if (response.Body['ReturnValueStr'] && !methodcheck(response)) return;
|
|
}
|
|
|
|
// Check if all the calls are done & perform a commit
|
|
if ((--setTlsSecurityPendingCalls) == 0) {
|
|
messagebox("Configuración TLS", "Realizando commit ...");
|
|
amtstack.AMT_SetupAndConfigurationService_CommitChanges(null, switchToTls6);
|
|
}
|
|
}
|
|
|
|
function switchToTls6(stack, name, response, status) {
|
|
if (status != 200) { messagebox('', "Error al establecer la seguridad de TLS, estado =" + status); return; }
|
|
if (response.Body['ReturnValue'] != 0) { messagebox('', "Error al establecer la seguridad de TLS, error: " + response.Body['ReturnValueStr']); return; }
|
|
|
|
// Switch current computer to TLS
|
|
messagebox("Configuración TLS", "Configuración de TLS completada.");
|
|
currentcomputer['tls'] = 1;
|
|
updateComputerDetails();
|
|
saveComputers();
|
|
|
|
setTimeout(function () {
|
|
setDialogMode();
|
|
|
|
// Disconnect and reconnect immidiatly
|
|
disconnect();
|
|
computerConnect(undefined, currentcomputer['h'], 0, true);
|
|
}, 2000);
|
|
}
|
|
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
//
|
|
// SYSTEM STATUS PANEL
|
|
//
|
|
|
|
// ###BEGIN###{PowerControl}
|
|
function PullPowerState() {
|
|
if (amtstack && amtstack.GetPendingActions() == 0 && amtsysstate && amtsysstate['CIM_ServiceAvailableToElement']) {
|
|
amtstack.Enum('CIM_ServiceAvailableToElement', function (stack, name, responses, status) {
|
|
if (status != 200) return; // If the polling fails, just skip it.
|
|
amtsysstate['CIM_ServiceAvailableToElement'].responses = responses;
|
|
if ((amtversion > 9) && (amtsysstate['CIM_ServiceAvailableToElement'] != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses.length > 0) && (amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] == 2)) {
|
|
// If Intel AMT 10+ and powered on, poll the OS power state.
|
|
amtstack.Get('IPS_PowerManagementService', function (stack, name, response, status) {
|
|
if (status == 200) { amtsysstate['IPS_PowerManagementService'].response = response.Body; updateSystemStatus(); }
|
|
});
|
|
} else {
|
|
updateSystemStatus();
|
|
}
|
|
});
|
|
|
|
}
|
|
}
|
|
// ###END###{PowerControl}
|
|
|
|
function PullSystemStatus(x) {
|
|
refreshButtons(false);
|
|
amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(processSystemTime);
|
|
// ###BEGIN###{Look-Intel-SBT}
|
|
amtstack.BatchEnum('', ['*AMT_GeneralSettings'], processSystemStatus);
|
|
// ###END###{Look-Intel-SBT}
|
|
// ###BEGIN###{!Look-Intel-SBT}
|
|
var query = ['CIM_ServiceAvailableToElement', '*AMT_GeneralSettings', 'AMT_EthernetPortSettings', '*AMT_RedirectionService', 'CIM_ElementSettingData'];
|
|
if (amtversion > 5) query.push('IPS_IPv6PortSettings', '*CIM_KVMRedirectionSAP', '*IPS_OptInService','*IPS_KVMRedirectionSettingData');
|
|
if (amtversion > 9) query.push('*IPS_ScreenConfigurationService', '*IPS_PowerManagementService');
|
|
if ((amtversion > 15) && (amtstack.wsman.comm.xtls == 1)) query.push('*CIM_BootService');
|
|
amtstack.BatchEnum('', query, processSystemStatus, true);
|
|
// ###END###{!Look-Intel-SBT}
|
|
// ###BEGIN###{Wireless}
|
|
if (x == 1) PullWireless();
|
|
// ###END###{Wireless}
|
|
}
|
|
|
|
function processSystemTime(stack, name, responses, status) {
|
|
if (errcheck(status, stack)) return;
|
|
if (status == 200) {
|
|
// Convert ms to time and adjust for the timezone
|
|
var t = new Date(), t2 = new Date();
|
|
//t.setTime(responses.Body['Ta0'] * 1000 + (t.getTimezoneOffset() * 60 * 1000));
|
|
t.setTime(responses.Body['Ta0'] * 1000);
|
|
amtdeltatime = t - t2;
|
|
updateSystemStatus();
|
|
}
|
|
}
|
|
|
|
var amtdeltatime;
|
|
var amtsysstate;
|
|
var amtlogicalelements; // processSystemVersion
|
|
var amtfeatures = {};
|
|
function processSystemStatus(stack, name, responses, status) {
|
|
// ###BEGIN###{ComputerSelector}
|
|
if (wsstack == null || amtstack != stack) return;
|
|
// ###END###{ComputerSelector}
|
|
// If this computer has no KVM, ignore and continue (Standard Manageability)
|
|
if ((responses['IPS_ScreenConfigurationService'] == undefined) || (responses['IPS_ScreenConfigurationService'].status == 400)) { responses['IPS_ScreenConfigurationService'] = null; }
|
|
if ((responses['IPS_KVMRedirectionSettingData'] == undefined) || (responses['IPS_KVMRedirectionSettingData'].status == 400)) { responses['IPS_KVMRedirectionSettingData'] = null; }
|
|
if ((responses['CIM_KVMRedirectionSAP'] == undefined) || (responses['CIM_KVMRedirectionSAP'].status == 400)) { responses['CIM_KVMRedirectionSAP'] = null; }
|
|
if ((responses['IPS_OptInService'] == undefined) || (responses['IPS_OptInService'].status == 400)) { responses['IPS_OptInService'] = null; }
|
|
if ((responses['AMT_RedirectionService'] != undefined) && (responses['AMT_RedirectionService'].status == 200)) { QV('go13', true); } // Show the terminal
|
|
|
|
// Reset the status after possible KVM removal
|
|
status = 0;
|
|
for (var i in responses) { if ((responses[i] != null) && (responses[i].status > status)) { status = responses[i].status; } }
|
|
|
|
if ((status != 400) && errcheck(status, stack)) return;
|
|
amtsysstate = responses;
|
|
applyDesktopSettings();
|
|
updateSystemStatus();
|
|
}
|
|
|
|
// Ask to synchronize the Intel AMT clock
|
|
function syncClock() {
|
|
if (xxdialogMode) return;
|
|
setDialogMode(11, "Sincronizar reloj", 3, syncClockEx, "¿Sincronizar el reloj Intel AMT con esta computadora?");
|
|
}
|
|
|
|
// Synchronize the Intel AMT clock
|
|
function syncClockEx() {
|
|
amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(function (stack, name, response, status) {
|
|
if (status != 200) { messagebox('', "Error al establecer la hora, estado =" + status); return; }
|
|
if (response.Body['ReturnValue'] != 0) { messagebox('', "Error al establecer la hora, error: " + response.Body['ReturnValueStr']); return; }
|
|
//var now = new Date(), Tm1 = Math.round((now.getTime() - (now.getTimezoneOffset() * 60000)) / 1000);
|
|
var now = new Date(), Tm1 = Math.round(now.getTime() / 1000);
|
|
amtstack.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch(response.Body['Ta0'], Tm1, Tm1, function () { amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(processSystemTime); });
|
|
});
|
|
}
|
|
|
|
// ###BEGIN###{PowerControl}
|
|
var DMTFPowerStates = ['', '', "Encendido", "Sueño ligero", "Sueño profundo", "Ciclo de encendido (apagado suave)", "Apagado: duro", "Hibernar (apagado suave)", "Suave apagado", "Ciclo de encendido (apagado)", "Reinicio del bus principal", "Interrupción de diagnóstico (NMI)", "No aplica", "Apagado: suave y elegante", "Apagado: duro y elegante", "Reinicio del bus maestro agraciado", "Ciclo de encendido (apagado - suave y elegante)", "Ciclo de encendido (Apagado - Gracioso duro)", "Interrupción de diagnóstico (INIT)"];
|
|
// ###END###{PowerControl}
|
|
function updateSystemStatus() {
|
|
if ((!amtsysstate) || (currentView > 99)) return;
|
|
|
|
// System Status Table
|
|
var systemdefense = 0, host, y, x = TableStart(), features = '', gs = amtsysstate['AMT_GeneralSettings'].response;
|
|
// ###BEGIN###{PowerControl}
|
|
var t = '<i>' + "Desconocido" + '</i>';
|
|
if ((amtsysstate['CIM_ServiceAvailableToElement'] != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses.length > 0)) {
|
|
t = DMTFPowerStates[amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState']];
|
|
// If Intel AMT 10+, check OS power saving state.
|
|
if ((amtversion > 9) && (t == "Encendido") && (amtsysstate['IPS_PowerManagementService']) && (amtsysstate['IPS_PowerManagementService'].response) && (amtsysstate['IPS_PowerManagementService'].response['OSPowerSavingState'] == 3)) { t = 'Standby (Connected)'; }
|
|
// ###BEGIN###{Terminal}
|
|
QH('id_p13power', t); // Display the power state on the terminal form
|
|
// ###END###{Terminal}
|
|
// ###BEGIN###{Desktop}
|
|
//if ((desktop.State != 0) && (Q('id_p14power').innerHTML.length > 0) && (Q('id_p14power').innerHTML != t)) { desktop.Stop(); setTimeout(connectDesktop, 150); }
|
|
QH('id_p14power', t); // Display the power state on the desktop form
|
|
// ###END###{Desktop}
|
|
}
|
|
if (gs['PowerSource']) t += [", Conectado", ", En la batería"][gs['PowerSource']];
|
|
x += TableEntry("Poder", addLink(t, 'showPowerActionDlg()'));
|
|
// ###END###{PowerControl}
|
|
|
|
host = gs['HostName'];
|
|
y = gs['DomainName'];
|
|
if (y != null && y.length > 0) host += '.' + y;
|
|
if (host.length == 0) { host = ('<i>' + "Ninguna" + '</i>'); } else { host = EscapeHtml(host); }
|
|
x += TableEntry("Nombre y dominio", addLinkConditional(host, 'showEditNameDlg()', xxAccountAdminName));
|
|
if (amtstack.amtauth && amtstack.amtauth.uuidStr) {
|
|
x += TableEntry("ID del sistema", amtstack.amtauth.uuidStr);
|
|
} else if (HardwareInventory) {
|
|
x += TableEntry("ID del sistema", guidToStr(HardwareInventory['CIM_ComputerSystemPackage'].response['PlatformGUID'].toLowerCase()));
|
|
}
|
|
if (amtlogicalelements) {
|
|
var mode = '', scs = getItem(amtlogicalelements, 'CreationClassName', 'AMT_SetupAndConfigurationService');
|
|
// ###BEGIN###{!Look-Intel-SBT}
|
|
if ((scs['ProvisioningState'] == 2) && (amtversion > 5)) {
|
|
mode = " activado en modo de control de administrador (ACM)";
|
|
if (scs['ProvisioningMode'] == 4) { mode = " activado en modo de control de cliente (CCM)"; systemdefense = 9; }
|
|
}
|
|
// ###END###{!Look-Intel-SBT}
|
|
|
|
// ###BEGIN###{Look-Intel-SBT}
|
|
x += TableEntry("Intel® SBT", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
|
|
// ###END###{Look-Intel-SBT}
|
|
// ###BEGIN###{Look-Intel-SM}
|
|
x += TableEntry("Intel® SM", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
|
|
// ###END###{Look-Intel-SM}
|
|
// ###BEGIN###{Look-Intel-AMT}
|
|
x += TableEntry("Intel® AMT", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
|
|
// ###END###{Look-Intel-AMT}
|
|
// ###BEGIN###{Look-Commander}
|
|
x += TableEntry("Intel® ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
|
|
// ###END###{Look-Commander}
|
|
// ###BEGIN###{Look-ISDU}
|
|
x += TableEntry("Intel® ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
|
|
// ###END###{Look-ISDU}
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
x += TableEntry("Intel® ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
|
|
// ###END###{Look-BrandedCommander}
|
|
// ###BEGIN###{Look-Unite}
|
|
x += TableEntry("Intel® ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
|
|
// ###END###{Look-Unite}
|
|
// ###BEGIN###{Look-MeshCentral}
|
|
x += TableEntry("Intel® ME", 'v' + getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'] + mode);
|
|
// ###END###{Look-MeshCentral}
|
|
|
|
// ###BEGIN###{ComputerSelector}
|
|
currentcomputer['ver'] = getItem(amtlogicalelements, 'InstanceID', 'AMT')['VersionString'];
|
|
currentcomputer['pstate'] = scs['ProvisioningState'];
|
|
currentcomputer['pmode'] = scs['ProvisioningMode'];
|
|
currentcomputer['date'] = new Date().toISOString();
|
|
updateComputerDetails();
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
saveComputers();
|
|
// ###END###{ComputerSelector-Local}
|
|
// ###END###{ComputerSelector}
|
|
}
|
|
|
|
// ###BEGIN###{!Mode-MeshCentral2}
|
|
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) {
|
|
QH('id_computername', "Computadora: " + ((gs['HostName'] == '') ? ('<i>' + "Ninguna" + '</i>') : gs['HostName']) + "Servidor: " + meshCentralServer.host);
|
|
} else {
|
|
QH('id_computername', "Computadora: " + ((gs['HostName'] == '') ? ('<i>' + "Ninguna" + '</i>') : gs['HostName']));
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
// ###BEGIN###{!MeshServerConnect}
|
|
QH('id_computername', "Computadora: " + ((gs['HostName'] == '') ? ('<i>' + "Ninguna" + '</i>') : gs['HostName']));
|
|
// ###END###{!MeshServerConnect}
|
|
|
|
// ###END###{!Mode-MeshCentral2}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (gs['HostName'] != '') { require('nw.gui').Window.get().title = NW_WindowTitle + ' - ' + gs['HostName']; } else { require('nw.gui').Window.get().title = NW_WindowTitle; }
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{PowerControl}
|
|
if ((amtsysstate['CIM_ServiceAvailableToElement'] != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses.length > 0)) {
|
|
// Intel AMT power state warning. If computer is not powered on, display a warning in terminal and desktop panels.
|
|
// ###BEGIN###{Terminal}
|
|
QV('id_p13warning2', amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] != 2);
|
|
// ###END###{Terminal}
|
|
// ###BEGIN###{Desktop}
|
|
QV('id_p14warning2', amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] != 2);
|
|
// ###END###{Desktop}
|
|
}
|
|
// ###END###{PowerControl}
|
|
|
|
// ###BEGIN###{!Look-Intel-SBT}
|
|
// Intel AMT Features
|
|
if (amtsysstate['AMT_RedirectionService'].status == 200) {
|
|
var redir = amtfeatures[0] = (amtsysstate['AMT_RedirectionService'].response['ListenerEnabled'] == true);
|
|
var sol = amtfeatures[1] = ((amtsysstate['AMT_RedirectionService'].response['EnabledState'] & 2) != 0);
|
|
var ider = amtfeatures[2] = ((amtsysstate['AMT_RedirectionService'].response['EnabledState'] & 1) != 0);
|
|
var kvm = amtfeatures[3] = undefined;
|
|
if ((amtversion > 5) && (amtsysstate['CIM_KVMRedirectionSAP'] != null)) {
|
|
// ###BEGIN###{Desktop}
|
|
QV('go14', true); // Desktop
|
|
// ###END###{Desktop}
|
|
kvm = amtfeatures[3] = ((amtsysstate['CIM_KVMRedirectionSAP'].response['EnabledState'] == 6 && amtsysstate['CIM_KVMRedirectionSAP'].response['RequestedState'] == 2) || amtsysstate['CIM_KVMRedirectionSAP'].response['EnabledState'] == 2 || amtsysstate['CIM_KVMRedirectionSAP'].response['EnabledState'] == 6);
|
|
}
|
|
if (redir) features += ", Puerto de redireccionamiento";
|
|
if (sol) features += ", Serie sobre LAN";
|
|
if (ider) features += ", IDE-Redirect";
|
|
if (kvm) features += ", KVM";
|
|
if (features == '') features = ' ' + "Ninguna";
|
|
x += TableEntry("Características activas", addLinkConditional(features.substring(2), 'showFeaturesDlg()', xxAccountAdminName));
|
|
}
|
|
|
|
if ((amtsysstate['IPS_KVMRedirectionSettingData'] != null) && (amtsysstate['IPS_KVMRedirectionSettingData'].response)) {
|
|
var desktopSettings = amtsysstate['IPS_KVMRedirectionSettingData'].response;
|
|
var screenname = "Pantalla principal";
|
|
if ((amtversion > 7) && (desktopSettings['DefaultScreen'] !== undefined) && (desktopSettings['DefaultScreen'] < 255)) { screenname = ["Pantalla principal", "Pantalla secundaria", "Tercera pantalla"][desktopSettings['DefaultScreen']]; }
|
|
features = '<span title="' + format("La pantalla remota predeterminada es {0}", screenname.toLowerCase()) + '">' + screenname + '</span>';
|
|
if (desktopSettings['Is5900PortEnabled'] == true) { features += ", Puerto 5900 habilitado"; }
|
|
if (desktopSettings['OptInPolicy'] == true) { features += "," + desktopSettings['OptInPolicyTimeout'] + ' ' + ((desktopSettings['OptInPolicyTimeout'] > 0)?"segundos de suscripción":"segundo opt-in"); }
|
|
features += "," + desktopSettings['SessionTimeout'] + " minuto" + ((desktopSettings['SessionTimeout'] > 0) ? 's' : '') + " hora de término de la sesión";
|
|
|
|
// Screen blanking on AMT 10 and higher
|
|
if ((amtversion > 9) && (amtsysstate['IPS_ScreenConfigurationService'] != null)) {
|
|
var screenBlanking = ((amtsysstate['IPS_ScreenConfigurationService'].response['EnabledState'] & 1) != 0);
|
|
if (screenBlanking) features += ", Blanking permitido";
|
|
// ###BEGIN###{Desktop}
|
|
QV('id_DeskSBspan', screenBlanking);
|
|
Q('id_DeskSB').checked = false;
|
|
// ###END###{Desktop}
|
|
} else {
|
|
// ###BEGIN###{Desktop}
|
|
QV('id_DeskSBspan', false);
|
|
// ###END###{Desktop}
|
|
}
|
|
|
|
// ###BEGIN###{Desktop-Settings}
|
|
x += TableEntry("Escritorio remoto", addLinkConditional(features, 'showDesktopSettingsDlg()', xxAccountAdminName));
|
|
// ###END###{Desktop-Settings}
|
|
// ###BEGIN###{!Desktop-Settings}
|
|
x += TableEntry("Escritorio remoto", features);
|
|
// ###END###{!Desktop-Settings}
|
|
}
|
|
// ###BEGIN###{Terminal}
|
|
QV('id_p13warning1', !redir || !sol); // Show the warning box on top of the terminal if redirection or sol is disabled.
|
|
QV('id_p13warninga', xxAccountAdminName); // If we are not administrator, we can't activate SOL.
|
|
// ###END###{Terminal}
|
|
// ###BEGIN###{Desktop}
|
|
QV('id_p14warning1', !redir || !kvm); // Show the warning box on top of the remote desktop viewer if redirection or kvm is disabled.
|
|
QV('id_p14warninga', xxAccountAdminName); // If we are not administrator, we can't activate KVM.
|
|
// ###END###{Desktop}
|
|
|
|
// Intel AMT user Consent
|
|
if ((amtversion > 5) && (amtsysstate != null && amtsysstate['IPS_OptInService'] != null) && (amtsysstate['IPS_OptInService'].response != undefined)) {
|
|
features = "Estado desconocido";
|
|
var optinrequired = amtsysstate['IPS_OptInService'].response['OptInRequired'];
|
|
if (optinrequired == 0) { features = "No requerido"; }
|
|
if (optinrequired == 1) { features = "Requerido solo para KVM"; }
|
|
if (optinrequired == 0xFFFFFFFF) { features = "Siempre requerido"; }
|
|
if (amtsysstate['IPS_OptInService'].response['CanModifyOptInPolicy'] == true) features = addLinkConditional(features, 'showConsentDlg()', xxAccountAdminName); // If we can modify user consent settings, add the link to do it.
|
|
x += TableEntry("Consentimiento del usuario", features);
|
|
}
|
|
|
|
// Power Options
|
|
if ((amtstack.wsman.comm.xtls == 1) && (amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] != null)) {
|
|
var enabledBootStateStr = { 0: "Desconocido", 1: "Otro", 2: "Habilitado", 3: "Discapacitado", 4: "Apagando", 5: "No aplica", 6: "Habilitado pero sin conexión", 7: "En prueba", 8: "Diferido", 9: "Quietud", 10: "Comenzando", 32768: "OCR Disabled", 32769: "OCR Enabled", 32770: "OCR Disabled, RPE Enabled", 32771: "RPE & OCR Enabled" };
|
|
if (amtversion > 15) { enabledBootStateStr[32768] = "OCR & RPE Disabled"; enabledBootStateStr[32769] = "OCR Enabled, RPE Disabled"; }
|
|
var t = enabledBootStateStr[amtsysstate['CIM_BootService'].response['EnabledState']]?enabledBootStateStr[amtsysstate['CIM_BootService'].response['EnabledState']]:"Desconocido";
|
|
x += TableEntry("Boot Features", addLinkConditional(t, 'showEnableBootServiceDlg()', xxAccountAdminName));
|
|
}
|
|
|
|
// Intel AMT Power policy
|
|
if (AmtSystemPowerSchemes != null) {
|
|
var elementSettings = amtsysstate['CIM_ElementSettingData'].responses;
|
|
for (var i = 0; i < elementSettings.length; i++) {
|
|
if (elementSettings[i]['SettingData'] && elementSettings[i]['IsCurrent'] == 1 && elementSettings[i]['SettingData']['ReferenceParameters']['ResourceURI'] == 'http://intel.com/wbem/wscim/1/amt-schema/1/AMT_SystemPowerScheme') {
|
|
// Found the active Intel AMT power scheme
|
|
var powerguid = elementSettings[i]['SettingData']['ReferenceParameters']['SelectorSet']['Selector'][1]['Value'];
|
|
// Now find the name of the power schema in the AMT_SystemPowerScheme table
|
|
for (var j = 0; j < AmtSystemPowerSchemes.length; j++) {
|
|
if (AmtSystemPowerSchemes[j]['SchemeGUID'] == powerguid) {
|
|
// Found the power scheme name
|
|
x += TableEntry("Política de energía", addLinkConditional(AmtSystemPowerSchemes[j]['Description'].split(':' )[1], 'showPowerPolicyDlg(\"' + powerguid + '\")', xxAccountAdminName));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// ###END###{!Look-Intel-SBT}
|
|
|
|
if (amtdeltatime) { x += TableEntry("Fecha y hora", addLinkConditional(new Date(new Date().getTime() + amtdeltatime).toLocaleString(), 'syncClock()', xxAccountAdminName)); }
|
|
var buttons = AddRefreshButton('PullSystemStatus()') + ' ';
|
|
// ###BEGIN###{PowerControl}
|
|
buttons += AddButton("Acciones de poder ...", 'showPowerActionDlg()') + ' ';
|
|
// ###END###{PowerControl}
|
|
// ###BEGIN###{WsmanBrowser}
|
|
// ###BEGIN###{FileSaver}
|
|
buttons += AddButton("Guardar Estado...", 'saveEntireAmtState()') + ' ';
|
|
// ###END###{FileSaver}
|
|
// ###END###{WsmanBrowser}
|
|
// ###BEGIN###{Scripting}
|
|
buttons += AddButton("Ejecutar guión...", 'script_runScriptDlg()') + ' ';
|
|
// ###END###{Scripting}
|
|
x += TableEnd(buttons);
|
|
|
|
// Show authentic CSME if present
|
|
if (amtstack.amtauth) { x += '<div style=position:absolute;top:10px;right:20px;cursor:pointer onclick=showAuthCsme()><img src=authcsme.png width=100 height=100 /></div>'; }
|
|
|
|
QH('id_TableSysStatus', x);
|
|
|
|
// ###BEGIN###{NetworkSettings}
|
|
var x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px>';
|
|
x += TableEnd('<div> ' + AddRefreshButton('PullSystemStatus(1)')
|
|
// ###BEGIN###{!Mode-LMS}
|
|
+ " Cambiar la configuración de red puede hacer que esta página no esté disponible."
|
|
// ###END###{!Mode-LMS}
|
|
// ###BEGIN###{Mode-LMS}
|
|
+ " Changing network settings may cause this page to be unavailable for a few seconds."
|
|
// ###END###{Mode-LMS}
|
|
);
|
|
|
|
// General settings
|
|
x += '<br><h2>' + "Configuración general" + '</h2>';
|
|
x += TableStart();
|
|
|
|
// Network state
|
|
// if (gs['AMTNetworkEnabled']) { x += TableEntry("Network state", (gs['AMTNetworkEnabled']==1)?"Enabled":"Disabled"); }
|
|
|
|
// Shared FQDN
|
|
var fqdnshare = '';
|
|
if (host != '<i>' + "Ninguna" + '</i>') {
|
|
if (gs['SharedFQDN'] == true) fqdnshare = ", compartido con el sistema operativo";
|
|
if (gs['SharedFQDN'] == false) fqdnshare = ", diferente del sistema operativo";
|
|
}
|
|
x += TableEntry("Nombre y dominio", addLinkConditional(host + fqdnshare, 'showEditNameDlg(1)', xxAccountAdminName));
|
|
|
|
// Dynamic DNS
|
|
var ddns = "Discapacitado";
|
|
if (gs['DDNSUpdateEnabled'] == true) {
|
|
ddns = "Habilitado cada" + gs['DDNSPeriodicUpdateInterval'] + " minutos, TTL es" + gs['DDNSTTL'] + " minutos";
|
|
} else if (gs['DDNSUpdateByDHCPServerEnabled'] == true) {
|
|
ddns = "Actualización por servidor DHCP";
|
|
}
|
|
x += TableEntry("DNS Dinámico", addLinkConditional(ddns, 'showEditDnsDlg()', xxAccountAdminName));
|
|
x += TableEnd();
|
|
|
|
for (var y in amtsysstate['AMT_EthernetPortSettings'].responses) {
|
|
var z = amtsysstate['AMT_EthernetPortSettings'].responses[y];
|
|
if (z['WLANLinkProtectionLevel'] || (y == 1)) { amtwirelessif = y; } // Set the wireless interface, this seems to cover new wireless only computers and older computers with dual interfaces.
|
|
if ((y == 0) && (amtwirelessif != y) && (z['MACAddress'] == '00-00-00-00-00-00')) { continue; } // On computers with only wireless, the wired interface will have a null MAC, skip it.
|
|
if (y == 0) systemdefense++;
|
|
x += '<br><h2>' + ((amtwirelessif == y)?"Interfaz inalámbrica":"Interfaz cableada") + '</h2>';
|
|
x += TableStart();
|
|
|
|
/*
|
|
var lp = [], linkpolicy = MakeToArray(z['LinkPolicy']);
|
|
for (var p in linkpolicy) {
|
|
var ap = linkpolicy[p];
|
|
if (ap == 1) lp.push("S0/AC");
|
|
if (ap == 14) lp.push("Sx/AC");
|
|
if (ap == 16) lp.push("S0/DC");
|
|
if (ap == 224) lp.push("Sx/DC");
|
|
}
|
|
x += TableEntry("Link state", (z['LinkIsUp'] == true?"Link is up":"Link is down") + ", available in " + lp.join(', '));
|
|
*/
|
|
x += TableEntry("Estado de enlace", (z['LinkIsUp'] == true?"Enlace está arriba":"El enlace está caído"));
|
|
if (z['LinkPolicy']) {
|
|
z['LinkPolicy'] = MakeToArray(z['LinkPolicy']);
|
|
var linkPolicyStr = [];
|
|
for (var i in z['LinkPolicy']) {
|
|
if (z['LinkPolicy'][i] == 1) { linkPolicyStr.push("S0 / AC"); }
|
|
if (z['LinkPolicy'][i] == 14) { linkPolicyStr.push("Sx / AC"); }
|
|
if (z['LinkPolicy'][i] == 16) { linkPolicyStr.push("S0 / DC"); }
|
|
if (z['LinkPolicy'][i] == 224) { linkPolicyStr.push("Sx / DC"); }
|
|
}
|
|
if (linkPolicyStr.length == 0) { linkPolicyStr.push(''); }
|
|
x += TableEntry("Política de enlaces", addLinkConditional((linkPolicyStr.length == 0) ? "No disponible" : "Disponible en: " + linkPolicyStr.join(', '), 'showLinkPolicyDlg(' + y + ')', xxAccountAdminName));
|
|
}
|
|
if (z['MACAddress'] != '00-00-00-00-00-00') { x += TableEntry("Dirección MAC", z['MACAddress']); }
|
|
|
|
// ###BEGIN###{Wireless}
|
|
if ((amtwirelessif == y) && xxWireless && xxWireless['CIM_WiFiPortCapabilities'].response) {
|
|
// Start and state
|
|
x += TableEntry("Estado", addLinkConditional(xxWifiState[xxWireless['CIM_WiFiPort'].response['EnabledState']], 'showWifiStateDlg()', xxAccountAdminName));
|
|
|
|
/* This is not that useful
|
|
// Capabilities
|
|
var s = '', sc = xxWireless['CIM_WiFiPortCapabilities'].response, supportedTypes = sc['SupportedPortTypes'];
|
|
for (i in supportedTypes) { s += ", 802.11" + "abgn"[supportedTypes[i] - 70]; }
|
|
x += TableEntry("Capabilites", s.substring(2));
|
|
*/
|
|
|
|
// Current radio state
|
|
s = xxWireless['CIM_WiFiEndpoint'].response['LANID'];
|
|
x += TableEntry("Radio State", xxRadioState[xxWireless['CIM_WiFiEndpoint'].response['EnabledState']] + ", SSID: " + (s ? s : ('<i>' + "Ninguna" + '</i>')));
|
|
|
|
// Current local profile synchronization
|
|
if (xxWireless['AMT_WiFiPortConfigurationService'] && xxWireless['AMT_WiFiPortConfigurationService'].response && (typeof xxWireless['AMT_WiFiPortConfigurationService'].response['localProfileSynchronizationEnabled'] == 'number')) {
|
|
x += TableEntry("Local WIFI Profile Sync", addLinkConditional(((xxWireless['AMT_WiFiPortConfigurationService'].response['localProfileSynchronizationEnabled'] == 1) ? "Habilitado" : "Discapacitado"), 'showWifiSyncDlg(' + y + ')', xxAccountAdminName));
|
|
}
|
|
// CSME UEFI Wifi profile sharing, check if it is enabled in boot setting and it is not null at AMT_WiFiPortConfigrationService
|
|
if (xxWireless['AMT_BootCapabilities'].response['UEFIWiFiCoExistenceAndProfileShare']!=null && xxWireless['AMT_BootCapabilities'].response['UEFIWiFiCoExistenceAndProfileShare']==true
|
|
&& xxWireless['AMT_WiFiPortConfigurationService'].response['UEFIWiFiProfileShareEnabled']!=null) {
|
|
x += TableEntry("UEFI WiFi CoEx Profile sharing", addLinkConditional(xxWireless['AMT_WiFiPortConfigurationService'].response['UEFIWiFiProfileShareEnabled']==1? "Habilitado":"Discapacitado", 'showUefiWifiCoExDlg()', xxAccountAdminName));
|
|
} else {
|
|
x += TableEntry("UEFI WiFi CoEx Profile sharing", "Unavailable");
|
|
}
|
|
}
|
|
// ###END###{Wireless}
|
|
|
|
if (amtwirelessif != y) {
|
|
// Things that are specific to the wired interface
|
|
x += TableEntry("Responder al ping", addLinkConditional(["Discapacitado", "Respuesta ICMP", "Respuesta RMCP", "Respuesta ICMP y RMCP"][gs['PingResponseEnabled'] + (gs['RmcpPingResponseEnabled'] << 1)], 'showPingActionDlg()', xxAccountAdminName));
|
|
var ipStateString = z['DHCPEnabled'] == true ? "Automático usando el servidor DHCP" : "Dirección IP estática";
|
|
if (z['IpSyncEnabled'] == true) { ipStateString += ', IP sync with OS'; }
|
|
x += TableEntry("Estado IPv4", addLinkConditional(ipStateString, 'showIPSetupDlg()', xxAccountAdminName));
|
|
}
|
|
|
|
// Display IPv4 current settings
|
|
x += TableEntry("Dirección IPv4", isIpAddress(z['IPAddress'],"Ninguna"));
|
|
if (isIpAddress(z['DefaultGateway'])) { x += TableEntry("Puerta de enlace IPv4 / Máscara", z['DefaultGateway'] + ' / ' + isIpAddress(z['SubnetMask'],"Ninguna")); }
|
|
|
|
var dns = z['PrimaryDNS'];
|
|
if (isIpAddress(dns)) {
|
|
if (z['SecondaryDNS']) dns += ' / ' + z['SecondaryDNS'];
|
|
x += TableEntry("Servidor de nombres de dominio IPv4", dns);
|
|
}
|
|
|
|
if ((amtsysstate['IPS_IPv6PortSettings'].status == 200) && (amtversion > 5)) {
|
|
// Check if IPv6 is enabled for this interface
|
|
var zz = amtsysstate['IPS_IPv6PortSettings'].responses[y];
|
|
var ipv6state = "Discapacitado", ipv6, ipv6manual, elementSettings = amtsysstate['CIM_ElementSettingData'].responses;
|
|
for (var i = 0; i < elementSettings.length; i++) {
|
|
if (elementSettings[i]['SettingData'] && elementSettings[i]['SettingData']['ReferenceParameters']['SelectorSet']['Selector']['Value'] == 'Intel(r) IPS IPv6 Settings ' + y) {
|
|
ipv6 = (elementSettings[i]['IsCurrent'] == 1);
|
|
}
|
|
}
|
|
|
|
// Check if manual addresses have been added
|
|
if (ipv6 == true) {
|
|
ipv6manual = isIpAddress(zz['IPv6Address']) || isIpAddress(zz['DefaultRouter']) || isIpAddress(zz['PrimaryDNS']) || isIpAddress(zz['SecondaryDNS']);
|
|
ipv6state = (ipv6manual ? "Direcciones habilitadas, automáticas y manuales" : "Habilitado, direcciones automáticas");
|
|
}
|
|
|
|
// Display IPv6 current settings
|
|
x += TableEntry("Estado IPv6", addLinkConditional(ipv6state, 'showIPv6StateDlg(' + y + ',' + ipv6 + ')', xxAccountAdminName));
|
|
if (ipv6 == true) {
|
|
if (zz['CurrentAddressInfo'] && zz['CurrentAddressInfo'].length > 0) {
|
|
zz['CurrentAddressInfo'] = MakeToArray(zz['CurrentAddressInfo']); // Because our WSMAN stack does not know if this is a array, we need to make it an array if it contains 1 element.
|
|
ipv6addr = '';
|
|
for (var i = 0; i < zz['CurrentAddressInfo'].length; i++) { if (ipv6addr.length > 0) ipv6addr += ","; ipv6addr += zz['CurrentAddressInfo'][i].split(',')[0]; }
|
|
x += TableEntry("Dirección IPv6", addLink(ipv6addr, 'showIPv6AddrDlg(' + y + ',\"' + zz['CurrentAddressInfo'] + '\")'));
|
|
} else {
|
|
x += TableEntry("Dirección IPv6", "Ninguna");
|
|
}
|
|
if (isIpAddress(zz['CurrentDefaultRouter'])) { x += TableEntry("Enrutador predeterminado IPv6", zz['CurrentDefaultRouter']); }
|
|
if (isIpAddress(zz['CurrentPrimaryDNS'])) {
|
|
var dns = zz['CurrentPrimaryDNS'];
|
|
if (isIpAddress(zz['CurrentSecondaryDNS'])) dns += ' / ' + zz['CurrentSecondaryDNS'];
|
|
x += TableEntry("Servidor de nombres de dominio IPv6", dns);
|
|
}
|
|
}
|
|
}
|
|
|
|
x += TableEnd();
|
|
}
|
|
|
|
// Only do more WSMAN if we need it
|
|
if ((urlvars['kvmonly'] != 1) && (fullscreenonly == false)) {
|
|
// ###BEGIN###{Wireless}
|
|
// If there is a wireless interface, get the data for it. If not, show that there is not.
|
|
if (amtwirelessif != -1) { if ((amtFirstPull & 2) == 0) PullWireless(); }
|
|
// ###END###{Wireless}
|
|
QH('id_TableNetworkSettingsSpan', x);
|
|
// ###END###{NetworkSettings}
|
|
|
|
// ###BEGIN###{SystemDefense}
|
|
// If in ACM mode and we have a wired interface, pull System Defense information
|
|
if ((systemdefense == 1) && ((amtFirstPull & 4) == 0)) PullSystemDefense();
|
|
// ###END###{SystemDefense}
|
|
|
|
// ###BEGIN###{Storage}
|
|
if (((amtFirstPull & 8) == 0) && (amtversion > 11 || ((amtversion == 11) && (amtversionmin > 5)))) { PullStorage(); }
|
|
// ###END###{Storage}
|
|
}
|
|
|
|
if (currentView == 0) go(1, 1); // If we are at the loading screen, most to System Status screen
|
|
}
|
|
|
|
function isIpAddress(t, x) { return (t && t != null && t.length > 0 && t != '::' && t != '::0')?t:x; }
|
|
|
|
function showLinkPolicyDlg(y) {
|
|
if (xxdialogMode) return;
|
|
var z = amtsysstate['AMT_EthernetPortSettings'].responses[y], s = '';
|
|
s += '<label><input type=checkbox id=d11p1 value=1 ' + ((z['LinkPolicy'].indexOf(1) >= 0) ? 'checked' : '') + '>Available in S0/AC - Powered on & plugged in</label><br>';
|
|
s += '<label><input type=checkbox id=d11p2 value=14 ' + ((z['LinkPolicy'].indexOf(14) >= 0) ? 'checked' : '') + '>Available in Sx/AC - Sleeping & plugged in</label><br>';
|
|
s += '<label><input type=checkbox id=d11p3 value=16 ' + ((z['LinkPolicy'].indexOf(16) >= 0) ? 'checked' : '') + '>Available in S0/DC - Powered on & on battery</label><br>';
|
|
s += '<label><input type=checkbox id=d11p4 value=224 ' + ((z['LinkPolicy'].indexOf(224) >= 0) ? 'checked' : '') + '>Available in Sx/DC - Sleeping & on battery</label><br>';
|
|
setDialogMode(11, "Política de enlaces", 3, showLinkPolicyDlgEx, s, y);
|
|
}
|
|
|
|
function showLinkPolicyDlgEx(b, y) {
|
|
var x = Clone(amtsysstate['AMT_EthernetPortSettings'].responses[y]);
|
|
if (x['DHCPEnabled']) {
|
|
delete x['IPAddress'];
|
|
delete x['SubnetMask'];
|
|
delete x['DefaultGateway'];
|
|
delete x['PrimaryDNS'];
|
|
delete x['SecondaryDNS'];
|
|
}
|
|
x['LinkPolicy'] = [];
|
|
if (Q('d11p1').checked) { x['LinkPolicy'].push(1); }
|
|
if (Q('d11p2').checked) { x['LinkPolicy'].push(14); }
|
|
if (Q('d11p3').checked) { x['LinkPolicy'].push(16); }
|
|
if (Q('d11p4').checked) { x['LinkPolicy'].push(224); }
|
|
amtstack.Put('AMT_EthernetPortSettings', x, showLinkPolicyDlgExDone, 0, 1, x);
|
|
}
|
|
|
|
function showLinkPolicyDlgExDone(stack, name, response, status) {
|
|
if (status == 200) {
|
|
amtsysstate = undefined;
|
|
PullSystemStatus();
|
|
} else {
|
|
messagebox("Política de enlaces", format("No se puede establecer una nueva política de enlaces, error {0}", status));
|
|
}
|
|
}
|
|
|
|
function showAuthCsme() {
|
|
if (xxdialogMode) return;
|
|
var x = '<div style=margin-top:8px>' + "Intel® AMT supports authentic CSME feature, however MeshCommander cannot verify the authenticity yet." + '</div><hr style=margin-top:8px;margin-bottom:8px;height:2px;border-width:0;color:gray;background-color:gray />';
|
|
x += addHtmlValue("FW Version", amtstack.amtauth.FWVersion);
|
|
x += addHtmlValue("FQDN", amtstack.amtauth.FQDN ? amtstack.amtauth.FQDN : ('<i>' + "Ninguna" + '</i>'));
|
|
x += '<hr style=margin-top:8px;margin-bottom:8px;height:2px;border-width:0;color:gray;background-color:gray /><div style=max-height:200px;overflow-y:auto><table>';
|
|
for (var i in amtstack.amtauth.Certificates) {
|
|
var cert = amtstack.amtauth.Certificates[i];
|
|
x += '<tr><td style=width:32px;vertical-align:top><img src=images-commander/cert1.png height=32 width=32 />';
|
|
x += '<td style=padding-bottom:6px><b>' + EscapeHtml(cert.subject.getField('CN').value) + ((cert.xTrusted === true) ? ', <span style=color:#080>' + "Trusted" + '</span>' : '') + '</b><br />';
|
|
if (cert.subject.getField('OU')) { x += EscapeHtml(cert.subject.getField('OU').value) + '<br />'; }
|
|
// ###BEGIN###{FileSaver}
|
|
x += amtstack.amtauth.CertificatesDer[i].length + " bytes," + '<a style=cursor:pointer;color:blue onclick=downloadAuthCert(' + i + ')>' + "Descargar" + '</a>';
|
|
if (cert.xCrl) { x += '<br />' + "CRL " + cert.xCrl.length + " bytes," + '<a style=cursor:pointer;color:blue onclick=downloadCertCrl(' + i + ')>' + "Descargar" + '</a>'; }
|
|
// ###END###{FileSaver}
|
|
// ###BEGIN###{!FileSaver}
|
|
x += amtstack.amtauth.CertificatesDer[i].length + " bytes";
|
|
if (cert.xCrl) { x += '<br />' + "CRL " + cert.xCrl.length + " bytes"; }
|
|
// ###END###{!FileSaver}
|
|
}
|
|
x += '</table><div>';
|
|
setDialogMode(11, "Authentic CSME", 1, null, x);
|
|
}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
function downloadCertCrl(h) {
|
|
h = parseInt(h);
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
saveAs(data2blob(amtstack.amtauth.Certificates[h].xCrl), amtstack.amtauth.Certificates[h].subject.getField('CN').value + '.crl');
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file');
|
|
chooser.setAttribute('nwsaveas', amtstack.amtauth.Certificates[h].subject.getField('CN').value + '.crl');
|
|
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, amtstack.amtauth.Certificates[h].xCrl, 'binary', function () { }); }, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
function downloadAuthCert(h) {
|
|
h = parseInt(h);
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
saveAs(data2blob(amtstack.amtauth.CertificatesDer[h]), amtstack.amtauth.Certificates[h].subject.getField('CN').value + '.cer');
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file');
|
|
chooser.setAttribute('nwsaveas', amtstack.amtauth.Certificates[h].subject.getField('CN').value + '.cer');
|
|
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, amtstack.amtauth.CertificatesDer[h], 'binary', function () { }); }, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
// ###BEGIN###{WsmanBrowser}
|
|
// ###BEGIN###{FileSaver}
|
|
var IntelAmtEntireState;
|
|
var IntelAmtEntireStateCalls;
|
|
function saveEntireAmtState() {
|
|
if (xxdialogMode) return;
|
|
var n = '', d = new Date();
|
|
if (amtsysstate) { n = '-' + amtsysstate['AMT_GeneralSettings'].response['HostName']; }
|
|
n += '-' + d.getFullYear() + '-' + ('0'+(d.getMonth()+1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);;
|
|
idx_d19savestatefilename.value = 'amtstate' + n + '.json';
|
|
setDialogMode(19, "Guardar todo el estado de Intel® AMT", 3, saveEntireAmtStateOk);
|
|
}
|
|
|
|
function saveEntireAmtStateOk() {
|
|
IntelAmtEntireState = { 'webappversion':version,'localtime':Date(),'utctime':new Date().toUTCString(),'isotime':new Date().toISOString() };
|
|
QH('id_dialogMessage', 'Fetching entire state, please wait...');
|
|
setDialogMode(1, "Guardar todo el estado de Intel® AMT", 0, null);
|
|
|
|
// Fetch everything!
|
|
IntelAmtEntireStateCalls = 3;
|
|
amtstack.BatchEnum(null, AllWsman, saveEntireAmtStateOk2, null, true);
|
|
amtstack.GetAuditLog(saveEntireAmtStateOk3);
|
|
amtstack.GetMessageLog(saveEntireAmtStateOk4);
|
|
}
|
|
|
|
function saveEntireAmtStateOk2(stack, name, responses, status) { IntelAmtEntireState['wsmanenums'] = responses; saveEntireAmtStateDone(); }
|
|
function saveEntireAmtStateOk3(stack, messages) { IntelAmtEntireState['auditlog'] = messages; saveEntireAmtStateDone(); }
|
|
function saveEntireAmtStateOk4(stack, messages) { IntelAmtEntireState['eventlog'] = messages; saveEntireAmtStateDone(); }
|
|
|
|
function saveEntireAmtStateDone() {
|
|
if (--IntelAmtEntireStateCalls != 0) return;
|
|
setDialogMode();
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
saveAs(data2blob(JSON.stringify(IntelAmtEntireState, null, ' ').replace(/\n/g, '\r\n')), idx_d19savestatefilename.value);
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file')
|
|
chooser.setAttribute('nwsaveas', idx_d19savestatefilename.value);
|
|
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, JSON.stringify(IntelAmtEntireState, null, ' ').replace(/\n/g, '\r\n'), function () { }); }, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
// ###END###{FileSaver}
|
|
// ###END###{WsmanBrowser}
|
|
|
|
// ###BEGIN###{Desktop-Settings}
|
|
|
|
function showDesktopSettingsDlg() {
|
|
if (xxdialogMode) return;
|
|
var desktopSettings = amtsysstate['IPS_KVMRedirectionSettingData'].response;
|
|
var x = '<div style=text-align:left>';
|
|
x += '<div style=height:26px;margin-top:4px><select id=subddisplay style=float:right;width:200px><option value=0>' + "Pantalla principal" + '</option><option value=1>' + "Pantalla secundaria" + '</option>';
|
|
if (amtversion > 9) { x += '<option value=2>' + "Tercera pantalla" + '</option>'; }
|
|
x += '</select><div style=padding-top:4px>' + "Pantalla predeterminada" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input id=subsessiontimeout style=float:right;width:200px maxlength=5 onkeypress="return numbersOnly(event)"><div style=padding-top:4px>' + "Tiempo de espera de la sesión (minutos)" + '</div></div>';
|
|
if (desktopSettings['OptInPolicy'] == true) { x += '<div style=height:26px;margin-top:4px><input id=suboptintimeout style=float:right;width:200px maxlength=5 onkeypress="return numbersOnly(event)"><div style=padding-top:4px>' + "Opt-in timeout (segundos)" + '</div></div>'; }
|
|
x += '<div style=height:26px;margin-top:4px><select id=subdlegacy style=float:right;width:200px onchange=showDesktopSettingsDlgUpdate()><option value=0>' + "Deshabilitado, Recomendado" + '</option><option value=1>' + "Habilitado, visores KVM heredados" + '</option></select><div style=padding-top:4px>' + "Puerto 5900" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px id=subspassx><input id=subspass type=password autocomplete=off style=float:right;width:200px maxlength=8 onkeyup=showDesktopSettingsDlgUpdate()><div style=padding-top:4px>' + "5900 contraseña (8 caracteres)" + '</div></div>';
|
|
if ((amtversion > 9) && (amtsysstate['IPS_ScreenConfigurationService'] != null)) { x += '<div style=height:26px;margin-top:4px><select id=subsb style=float:right;width:200px onchange=showDesktopSettingsDlgUpdate()><option value=0>' + "Discapacitado" + '</option><option value=1>' + "Habilitado" + '</option></select><div style=padding-top:4px title="' + "Esta característica no suele ser compatible" + '">' + "Pantalla en blanco" + '</div></div>'; }
|
|
x += '</div>';
|
|
setDialogMode(11, "Configuración de escritorio remoto", 3, showDesktopSettingsDlgOk, x);
|
|
Q('subddisplay').value = desktopSettings['DefaultScreen'];
|
|
Q('subsessiontimeout').value = desktopSettings['SessionTimeout'];
|
|
if (desktopSettings['OptInPolicy'] == true) { Q('suboptintimeout').value = desktopSettings['OptInPolicyTimeout']; }
|
|
Q('subdlegacy').value = ((desktopSettings['Is5900PortEnabled'] == true) ? 1 : 0);
|
|
if ((amtversion > 9) && (amtsysstate['IPS_ScreenConfigurationService'] != null)) { Q('subsb').value = amtsysstate['IPS_ScreenConfigurationService'].response['EnabledState']; }
|
|
showDesktopSettingsDlgUpdate();
|
|
}
|
|
|
|
function showDesktopSettingsDlgUpdate() {
|
|
QV('subspassx', (Q('subdlegacy').value == 1));
|
|
var ok = ((Q('subdlegacy').value == 0) || (Q('subspass').value.length == 8) || (Q('subspass').value.length == 0)) && (Q('subsessiontimeout').value.length > 0);
|
|
if ((amtsysstate['IPS_KVMRedirectionSettingData'].response['OptInPolicy'] == true) && (Q('suboptintimeout').value.length == 0)) { ok = false; }
|
|
QE('idx_dlgOkButton', ok);
|
|
}
|
|
|
|
function showDesktopSettingsDlgOk() {
|
|
var x = Clone(amtsysstate['IPS_KVMRedirectionSettingData'].response);
|
|
x['DefaultScreen'] = Q('subddisplay').value
|
|
x['SessionTimeout'] = Q('subsessiontimeout').value;
|
|
x['Is5900PortEnabled'] = (Q('subdlegacy').value == 1);
|
|
if (x['OptInPolicy'] == true) { x['OptInPolicyTimeout'] = Q('suboptintimeout').value; }
|
|
if (x['Is5900PortEnabled'] == true) { x['RFBPassword'] = Q('subspass').value; }
|
|
amtstack.Put('IPS_KVMRedirectionSettingData', x, showDesktopSettingsDlgOk2);
|
|
|
|
// Screen blanking
|
|
var y = Clone(amtsysstate['IPS_ScreenConfigurationService'].response);
|
|
y['EnabledState'] = parseInt(Q('subsb').value);
|
|
amtstack.Put('IPS_ScreenConfigurationService', y, showDesktopSettingsDlgOk3);
|
|
}
|
|
|
|
function showDesktopSettingsDlgOk2(stack, name, responses, status) {
|
|
if (status == 200) PullSystemStatus(); else messagebox("Configuración de escritorio remoto", format("Error {0}, no se pueden establecer valores.", status));
|
|
}
|
|
|
|
function showDesktopSettingsDlgOk3(stack, name, response, status) {
|
|
if (status != 200) { messagebox("Error", format("No se pudo establecer la supresión de pantalla, es posible que la supresión de este sistema no sea compatible ({0})", status)); return; }
|
|
amtstack.Get('IPS_ScreenConfigurationService', function (stack, name, response, status) {
|
|
if (status == 200) { amtsysstate['IPS_ScreenConfigurationService'].response = response.Body; updateSystemStatus(); }
|
|
}, 0, 1);
|
|
}
|
|
|
|
// ###END###{Desktop-Settings}
|
|
|
|
// ###BEGIN###{EventLog}
|
|
|
|
//
|
|
// EVENT LOG PANEL
|
|
//
|
|
|
|
function PullEventLog(button) {
|
|
if (button == 1 && xxdialogMode) return;
|
|
amtFirstPull |= 16;
|
|
amtstack.Enum('AMT_MessageLog', processMessageLog0);
|
|
amtstack.GetMessageLog(processMessageLog1);
|
|
}
|
|
|
|
var processMessageLog0responses = null;
|
|
function processMessageLog0(stack, name, responses, status) {
|
|
if (status != 200) return;
|
|
if (status) QV('go6', true); // Show event log left panel option
|
|
if (responses) processMessageLog0responses = responses;
|
|
var fr = '', x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px>';
|
|
if (processMessageLog0responses != null) { fr = ((processMessageLog0responses[0]['IsFrozen'] == true) ? AddButton("Descongelar registro", 'FreezeLog(0)') : AddButton("Congelar registro", 'FreezeLog(1)')); }
|
|
|
|
// ###BEGIN###{!FileSaver}
|
|
x += TableEnd('<div style=float:right><input id=eventFilter placeholder="' + "Filtrar" + '" style=margin:4px onkeyup=eventFilter()> </div><div> ' + AddRefreshButton('PullEventLog(1)') + AddButton("Borrar registro", 'ClearLog()') + fr);
|
|
// ###END###{!FileSaver}
|
|
// ###BEGIN###{FileSaver}
|
|
x += TableEnd('<div style=float:right><input id=eventFilter placeholder="' + "Filtrar" + '" style=margin:4px onkeyup=eventFilter()> </div><div> ' + AddRefreshButton('PullEventLog(1)') + AddButton("Borrar registro", 'ClearLog()') + AddButton("Salvar...", 'SaveEventLog()') + fr);
|
|
// ###END###{FileSaver}
|
|
QH('id_TableEventLog', x + '<br>');
|
|
}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
function SaveEventLog() {
|
|
if (xxdialogMode || eventmessages == null) return;
|
|
SaveJsonFile('IntelAmtEventlog', 'events', 'Intel AMT Event Log', eventmessages);
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
var eventmessages = null;
|
|
function processMessageLog1(stack, messages) {
|
|
eventmessages = messages;
|
|
var i, y = 0, x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td width=80px><p><td><td><td>';
|
|
x += '<tr><td class=r1 style=width:90px><b> Event</b><td class=r1 style=width:110px><b>Time</b><td class=r1 style=width:160px><b>' + "Fuente" + '</b><td class=r1><b>' + "Descripción" + '</b>';
|
|
for (i in messages) {
|
|
y++;
|
|
var icon = 1, m = messages[i];
|
|
if (m['EventSeverity'] >= 8) { icon = 2; } if (m['EventSeverity'] >= 16) { icon = 3; }
|
|
x += '<tr id=xamtevent' + i + ' class=r3 onclick=showEventDetails(' + i + ')><td class=r1><p><div class=icon' + icon + ' style=display:block;float:left;margin-left:5px;margin-right:5px></div>' + (parseInt(i) + 1) + '<td class=r1 title="' + m['Time'].toLocaleString() + '">' + m['Time'].toLocaleDateString('en', { year: 'numeric', month: '2-digit', day: 'numeric' }) + '<br>' + m['Time'].toLocaleTimeString('en', { hour:'2-digit', minute:'2-digit', second:'2-digit' }) + '<td class=r1>' + m['EntityStr'].replace('(r)', '®') + '<td class=r1>' + m['Desc'];
|
|
}
|
|
x += TableEnd(y == 0 ? ' ' : '');
|
|
QH('id_TableEventLog2', x + '<br>');
|
|
processMessageLog0();
|
|
}
|
|
|
|
function FreezeLog(x) { if (!xxdialogMode) { amtstack.AMT_MessageLog_FreezeLog(x, function () { amtstack.Enum('AMT_MessageLog', processMessageLog0); }) } }
|
|
function ClearLog(x) { if (!xxdialogMode) { QH('id_dialogMessage', "¿Borrar el registro de eventos?"); setDialogMode(1, "Registro de eventos", 3, ClearLogEx); } }
|
|
function ClearLogEx() { amtstack.AMT_MessageLog_ClearLog(function (stack, name, responses, status) { if (status != 200) messagebox("Registro de eventos", "No se puede borrar, error: " + status); else PullEventLog(); }) }
|
|
|
|
function showEventDetails(h) {
|
|
if (xxdialogMode) return;
|
|
var m = eventmessages[h];
|
|
var x = '<div style=text-align:left>';
|
|
x += addHtmlValue("Hora", m['Time'].toLocaleString());
|
|
x += addHtmlValue("Fuente", m['EntityStr'].replace('(r)', '®'));
|
|
x += addHtmlValue("Descripción", m['Desc']);
|
|
x += MoreStart();
|
|
x += addHtmlValue("Dirección del dispositivo", m['DeviceAddress']);
|
|
x += addHtmlValue("Entidad", m['Entity']);
|
|
x += addHtmlValue("Instancia de entidad", m['EntityInstance']);
|
|
var e = '';
|
|
for (var i in m['EventData']) { if (e.length > 0) e +=','; e += m['EventData'][i]; }
|
|
x += addHtmlValue("Datos", e);
|
|
x += addHtmlValue("Compensar", m['EventOffset']);
|
|
x += addHtmlValue("Tipo de sensor", m['EventSensorType']);
|
|
x += addHtmlValue("Gravedad", m['EventSeverity']);
|
|
x += addHtmlValue("tipo de fuente", m['EventSourceType']);
|
|
x += addHtmlValue("Tipo", m['EventType']);
|
|
x += addHtmlValue("Número de sensor", m['SensorNumber']);
|
|
x += MoreEnd();
|
|
x += '</div>';
|
|
messagebox(format("Evento # {0} Detalles", h + 1), x);
|
|
}
|
|
|
|
function eventFilter() {
|
|
var filter = Q('eventFilter').value.toLowerCase();
|
|
for (var w in eventmessages) { QV('xamtevent' + w, filter == '' || eventmessages[w]['Desc'].toLowerCase().indexOf(filter) >= 0 || eventmessages[w]['EntityStr'].toLowerCase().indexOf(filter) >= 0); }
|
|
}
|
|
|
|
// ###END###{EventLog}
|
|
|
|
// ###BEGIN###{EventSubscriptions}
|
|
|
|
//
|
|
// EVENT SUBSCRIPTION PANEL
|
|
//
|
|
|
|
var subscriptionsFilters = null; // List of event filters
|
|
var subscriptionsListeners = null; // List of subscribers
|
|
|
|
function PullEventSubscriptions() {
|
|
if (subscriptionsFilters == null) { amtstack.Enum('CIM_FilterCollection', processEventSubscriptions0); }
|
|
amtstack.BatchEnum(null, ['CIM_ListenerDestination', 'CIM_FilterCollectionSubscription'], processEventSubscriptions1);
|
|
}
|
|
|
|
function processEventSubscriptions0(stack, name, responses, status) {
|
|
if (status == 408 || status == 400) return;
|
|
if (status && errcheck(status, stack)) return;
|
|
subscriptionsFilters = responses;
|
|
}
|
|
|
|
function processEventSubscriptions1(stack, name, responses, status) {
|
|
if (status == 408 || status == 400) return;
|
|
if (status && errcheck(status, stack)) return;
|
|
if (status) QV('go22', true); // Show event subscription left panel option
|
|
if (responses) subscriptionsListeners = responses;
|
|
var c= 0, x = TableStart2() + '<tr><td class=r1 style=padding-left:15px><br>' + "Gestionar suscriptores de eventos." + '<br><br>';
|
|
for (var i in subscriptionsListeners['CIM_ListenerDestination']['responses']) {
|
|
var f = subscriptionsListeners['CIM_FilterCollectionSubscription']['responses'][i]['Filter']['ReferenceParameters']['SelectorSet']['Selector']['Value'].replace('(r)', '®');
|
|
var r = subscriptionsListeners['CIM_ListenerDestination']['responses'][i];
|
|
x += '<div class=itemBar onclick="showSubscriptionDetails(' + i + ')"><div style=float:right></div><div style=padding-top:3px;overflow-x:hidden title="' + f + ' - ' + r['Destination'] + '"><b>' + f + '</b> - ' + r['Destination'] + '</div><div style=padding-top:3px></div></div>';
|
|
c++;
|
|
}
|
|
if (c == 0) x += ('<div style=padding-left:15px><br><i>' + "No se encontraron suscripciones." + '</i></div><br>');
|
|
var y = '<div> ' + AddRefreshButton('PullEventSubscriptions()');
|
|
if (xxAccountAdminName) y += AddButton("Nueva suscripción", 'newSubscriptionButton()');
|
|
x += '<br><td class=r1>' + TableEnd(y + '</div>');
|
|
QH('id_TableEventSubscriptions', x);
|
|
}
|
|
|
|
var subscriptionDeliveryModes = { 2:"empujar", 3:"Empujar con ACK", 4:"Eventos", 5:"Halar" };
|
|
function showSubscriptionDetails(h) {
|
|
if (xxdialogMode) return;
|
|
var f = subscriptionsListeners['CIM_FilterCollectionSubscription']['responses'][h]['Filter']['ReferenceParameters']['SelectorSet']['Selector']['Value'].replace('(r)', '®');
|
|
var r = subscriptionsListeners['CIM_ListenerDestination']['responses'][h];
|
|
var x = '<div style=text-align:left>';
|
|
x += addHtmlValue("Destino", r['Destination']);
|
|
x += addHtmlValue("Filtrar", f);
|
|
x += addHtmlValue("Modo de entrega", subscriptionDeliveryModes[r['DeliveryMode']]);
|
|
x += '</div>';
|
|
setDialogMode(11, "Suscripción" + (h + 1), xxAccountAdminName?5:1, deleteSubscriptionButton, x, h);
|
|
}
|
|
|
|
function deleteSubscriptionButton(button, h) {
|
|
if (button != 2) return;
|
|
var name = subscriptionsListeners['CIM_ListenerDestination']['responses'][h]['Name'];
|
|
var filter = subscriptionsListeners['CIM_FilterCollectionSubscription']['responses'][h]['Filter']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
|
|
amtstack.UnSubscribe('CIM_FilterCollectionSubscription', PullEventSubscriptions, null, 1, {'Filter':'<a:EndpointReference><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_FilterCollection</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + filter + '</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference>', 'Handler':'<a:EndpointReference><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ListenerDestinationWSManagement</w:ResourceURI><w:SelectorSet><w:Selector Name="CreationClassName">CIM_ListenerDestinationWSMAN</w:Selector><w:Selector Name="Name">' + name + '</w:Selector><w:Selector Name="SystemCreationClassName">CIM_ComputerSystem</w:Selector><w:Selector Name="SystemName">Intel(r) AMT</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference>'});
|
|
}
|
|
|
|
function newSubscriptionButton() {
|
|
if (xxdialogMode || (subscriptionsFilters == null)) return;
|
|
var x = '';
|
|
x += '<div style=height:26px;margin-top:4px><select id=subtype style=float:right;width:260px><option value=Push>' + "empujar" + '</option><option value=PushWithAck>' + "Empujar con ACK" + '</option></select><div style=padding-top:4px>' + "Tipo" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><select id=subfilter style=float:right;width:260px>';
|
|
for (var i in subscriptionsFilters) { x += '<option value="' + subscriptionsFilters[i]['InstanceID'] + '">' + subscriptionsFilters[i]['CollectionName'].substring(13) + '</option>'; }
|
|
x += '</select><div style=padding-top:4px>' + "Filtrar" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input id=suburl style=float:right;width:260px maxlength=253 onkeyup=newSubscriptionUpdate() value="http://"><div style=padding-top:4px>' + "URL" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><select id=subauth style=float:right;width:260px onchange=newSubscriptionUpdate()><option value=0>' + "Ninguna" + '</option><option value=1>' + "Digerir" + '</option></select><div style=padding-top:4px>' + "Autenticación" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px id=subxuser><input id=subuser style=float:right;width:260px maxlength=32 onkeyup=newSubscriptionUpdate()><div style=padding-top:4px>' + "Nombre de usuario" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px id=subxpass><input id=subpass style=float:right;width:260px maxlength=32 onkeyup=newSubscriptionUpdate()><div style=padding-top:4px>' + "Contraseña" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input id=subargs style=float:right;width:260px maxlength=128><div style=padding-top:4px>' + "Argumentos" + '</div></div>';
|
|
setDialogMode(11, "Agregar suscripción de evento", 3, newSubscriptionButtonOk, x);
|
|
newSubscriptionUpdate();
|
|
}
|
|
|
|
function newSubscriptionUpdate() {
|
|
QE('idx_dlgOkButton', ((Q('suburl').value.length > 0) && (Q('suburl').value.startsWith('http://')) && ((Q('subauth').value == 0) || ((Q('subuser').value.length > 0) && (Q('subpass').value.length > 0)))));
|
|
QV('subxuser', Q('subauth').value == 1);
|
|
QV('subxpass', Q('subauth').value == 1);
|
|
}
|
|
|
|
function newSubscriptionButtonOk() {
|
|
var user = (Q('subuser').value.length == 0)?undefined:Q('subuser').value, pass = (Q('subpass').value.length == 0)?undefined:Q('subpass').value;
|
|
amtstack.Subscribe('CIM_FilterCollection', Q('subtype').value, Q('suburl').value, newSubscriptionButtonOk2, null, 1, { 'InstanceID' : Q('subfilter').value }, (Q('subargs').value.length > 0)?Q('subargs').value:null, user, pass);
|
|
}
|
|
|
|
function newSubscriptionButtonOk2(stack, name, responses, status) {
|
|
if (status == 200) { PullEventSubscriptions(); }
|
|
}
|
|
|
|
// ###END###{EventSubscriptions}
|
|
|
|
// ###BEGIN###{AuditLog}
|
|
|
|
//
|
|
// AUDIT LOG PANEL
|
|
//
|
|
|
|
function PullAuditLog(button) {
|
|
if (button == 1 && xxdialogMode) return;
|
|
amtFirstPull |= 32;
|
|
amtstack.Enum('AMT_AuditLog', processAuditLog0);
|
|
}
|
|
|
|
var auditLog = null;
|
|
var auditLogEnabledStates = ["Desconocido", "Otro", "Habilitado", "Discapacitado", "Apagando", "No aplica", "Habilitado pero sin conexión", "En prueba", "Diferido", "Quietud", "Comenzando"];
|
|
|
|
function processAuditLog0(stack, name, responses, status) {
|
|
if (status == 200) {
|
|
QV('go15', true); // Show audit log left panel option
|
|
|
|
var r = responses[0]['AuditState'];
|
|
var auditstate = (r & 0x01) ? "Discapacitado" : "Habilitado";
|
|
if (r & 0x02) auditstate += ", Bloqueado";
|
|
if (r & 0x04) auditstate += ", Casi lleno";
|
|
if (r & 0x08) auditstate += ", Completo";
|
|
if (r & 0x10) auditstate += ", No hay llave";
|
|
|
|
var x = '<h1>' + "Configuración del registro de auditoría" + '</h1>' + TableStart();
|
|
x += TableEntry("Estado", auditstate);
|
|
x += TableEntry("Almacenamiento", responses[0]['CurrentNumberOfRecords'] + " registros)," + responses[0]['PercentageFree'] + "% gratis");
|
|
x += TableEntry("Política de sobrescritura", ((responses[0]['OverwritePolicy'] == 2) ? "Se envuelve cuando está lleno" : "Nunca sobrescribe"));
|
|
x += TableEnd();
|
|
QH('id_TableAuditLog1', x);
|
|
|
|
amtstack.GetAuditLog(processAuditLog1);
|
|
}
|
|
}
|
|
|
|
function processAuditLog1(stack, messages) {
|
|
auditLog = messages;
|
|
var i, x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px>';
|
|
// ###BEGIN###{!FileSaver}
|
|
x += TableEnd('<div style=float:right><input id=auditFilter placeholder="' + "Filtrar" + '" style=margin:4px onkeyup=auditFilter()> </div><div> ' + AddRefreshButton('PullAuditLog(1)') + AddButton("Borrar registro", 'ClearAuditLog()') /* + AddButton("Settings...", 'ShowAuditLogSettings()')*/) + '<br>';
|
|
// ###END###{!FileSaver}
|
|
// ###BEGIN###{FileSaver}
|
|
x += TableEnd('<div style=float:right><input id=auditFilter placeholder="' + "Filtrar" + '" style=margin:4px onkeyup=auditFilter()> </div><div> ' + AddRefreshButton('PullAuditLog(1)') + AddButton("Salvar...", 'SaveAuditLog()') + AddButton("Borrar registro", 'ClearAuditLog()') /* + AddButton("Settings...", 'ShowAuditLogSettings()')*/) + '<br>';
|
|
// ###END###{FileSaver}
|
|
if (messages.length == 0) {
|
|
x = "No se encontraron eventos de registro de auditoría.";
|
|
} else {
|
|
var y = 0;
|
|
x += '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td width=80px><p><td><td><td>';
|
|
x += '<tr><td class=r1 style=width:110px> <b>' + "Hora" + '</b><td class=r1 style=width:260px><b>' + "Iniciador" + '</b><td class=r1><b>Action</b>';
|
|
for (i in messages) {
|
|
var m = messages[i], description = m['AuditApp'], initiator = m['Initiator'];
|
|
y++;
|
|
var addr = '';
|
|
if (m['NetAddress'].length > 0) addr = m['NetAddress'].replace('0000:0000:0000:0000:0000:0000:0000:0001','::1');
|
|
if (m['Event']) description += "," + m['Event'];
|
|
if (m['ExStr'] != null) description += "," + m['ExStr'];
|
|
if (initiator != '' && addr != '') initiator += ",";
|
|
x += '<tr id=xamtaudit' + i + ' class=r3 onclick=showAuditDetails(' + i + ')><td class=r1 title="' + m['Time'].toLocaleString() + '"> ' + m['Time'].toLocaleDateString('en', { year: 'numeric', month: '2-digit', day: 'numeric' }) + '<br> ' + m['Time'].toLocaleTimeString('en', { hour:'2-digit', minute:'2-digit', second:'2-digit' }) + '<td class=r1>' + initiator + addr + '<td class=r1>' + description;
|
|
}
|
|
x += TableEnd(y == 0 ? ' ' : '') + '<br>';
|
|
}
|
|
QH('id_TableAuditLog2', x);
|
|
}
|
|
|
|
function auditFilter() {
|
|
var filter = Q('auditFilter').value.toLowerCase();
|
|
for (var w in auditLog) { QV('xamtaudit' + w, filter == '' || JSON.stringify(auditLog[w]).toLowerCase().indexOf(filter) >= 0); }
|
|
}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
function SaveAuditLog() {
|
|
if (xxdialogMode || auditLog == null) return;
|
|
SaveJsonFile('IntelAmtAuditlog', 'auditevents', "Registro de auditoría de Intel AMT", auditLog);
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
function ClearAuditLog(x) { QH('id_dialogMessage', "¿Borrar el registro de auditoría?"); setDialogMode(1, "Registro de auditoría", 3, ClearAuditLogEx); }
|
|
function ClearAuditLogEx() {
|
|
//amtstack.AMT_AuditLog_ClearLog(function () { PullAuditLog(); })
|
|
var handle = amtstack.AMT_AuditLog_SetAuditLock(1,0, handle, function() { amtstack.AMT_AuditLog_ClearLog(function () { amtstack.AMT_AuditLog_SetAuditLock(0, 2, handle, function () { setTimeout(PullAuditLog,1000);}); }); });
|
|
}
|
|
|
|
function ShowAuditLogSettings() {
|
|
if (xxdialogMode) return;
|
|
amtstack.AMT_AuditLog_RequestStateChange(2, 0, AuditLogSettingsCompleted); // Enable
|
|
}
|
|
|
|
function AuditLogSettingsCompleted(stack, name, responses, status) {
|
|
if (status == 200) PullAuditLog(); else messagebox("Registro de auditoría", "Error: " + status);
|
|
}
|
|
|
|
function showAuditDetails(h) {
|
|
if (xxdialogMode) return;
|
|
var i, m = auditLog[h], x = '<div style=text-align:left>';
|
|
x += addHtmlValue("Hora", m['Time'].toLocaleString());
|
|
if (m['Initiator'] != '') x += addHtmlValue("Iniciador", m['Initiator']);
|
|
if (m['NetAddress'] != '') x += addHtmlValue("Habla a", m['NetAddress']);
|
|
x += addHtmlValue("Solicitud", m['AuditApp']);
|
|
x += addHtmlValue("Evento", m['Event']);
|
|
if (m['ExStr'] != null) {
|
|
x += addHtmlValue("Datos extendidos", m['ExStr']);
|
|
} else if (m['Ex'].length > 0) {
|
|
var e = '';
|
|
for (i in m['Ex']) { if (e.length > 0) e += ','; e += m['Ex'].charCodeAt(i); }
|
|
if (e != '') x += addHtmlValue("Valores de datos", e);
|
|
if (m['Ex'].length > 2 && ReadShort(m['Ex'], 0) == (m['Ex'].length - 2)) x += addHtmlValue("Cadena de datos", m['Ex'].substring(2));
|
|
}
|
|
x += '</div>';
|
|
messagebox("Evento de auditoría #" + (h + 1) + " Detalles", x);
|
|
}
|
|
|
|
// ###END###{AuditLog}
|
|
|
|
// ###BEGIN###{Certificates}
|
|
|
|
//
|
|
// Certificates
|
|
//
|
|
|
|
var xxCertificates = null;
|
|
var xxCertPrivateKeys = null;
|
|
var xxTlsSettings = null;
|
|
var xxTlsCurrentCert = null;
|
|
var xxTLSCredentialContext = null;
|
|
var xxCaPrivateKey = null;
|
|
var xxCaSubjectAttributes = null;
|
|
|
|
function PullCertificates() {
|
|
// We only deal with certificates starting with Intel AMT 6 and beyond
|
|
amtstack.BatchEnum(null, ['AMT_PublicKeyCertificate', 'AMT_PublicPrivateKeyPair', 'AMT_TLSSettingData', 'AMT_TLSCredentialContext'], processCerts1);
|
|
}
|
|
|
|
function processCerts1(stack, name, responses, status) {
|
|
if ((status == 400) || errcheck(status, stack)) return;
|
|
QV('go16', true); // Security Settings
|
|
xxCertificates = responses['AMT_PublicKeyCertificate'].responses;
|
|
xxCertPrivateKeys = responses['AMT_PublicPrivateKeyPair'].responses;
|
|
xxTlsSettings = responses['AMT_TLSSettingData'].responses;
|
|
xxTLSCredentialContext = responses['AMT_TLSCredentialContext'].responses;
|
|
|
|
// Select the current TLS certificate in the drop down box
|
|
xxTlsCurrentCert = null;
|
|
if (xxTLSCredentialContext.length > 0) {
|
|
var certInstanceId = xxTLSCredentialContext[0]['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
|
|
for (var i in xxCertificates) { if (xxCertificates[i]['InstanceID'] == certInstanceId) { xxTlsCurrentCert = i; } }
|
|
}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
try { if ((currentcomputer['tls'] == 0) && (xxTlsSettings[0]['MutualAuthentication'] !== true)) { QV('tlsNotification4', true); } } catch (ex) { console.log(ex); }
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// Setup the certificates
|
|
for (var i in xxCertificates) {
|
|
xxCertificates[i].TrustedRootCertficate = (xxCertificates[i]['TrustedRootCertficate'] == true);
|
|
xxCertificates[i].X509Certificate = window.atob(xxCertificates[i]['X509Certificate']);
|
|
xxCertificates[i].XIssuer = parseCertName(xxCertificates[i]['Issuer']);
|
|
xxCertificates[i].XSubject = parseCertName(xxCertificates[i]['Subject']);
|
|
}
|
|
amtcert_linkCertPrivateKey(xxCertificates, xxCertPrivateKeys); // This links all certificates and private keys
|
|
|
|
updateCertificates();
|
|
}
|
|
|
|
function parseCertName(x) {
|
|
var j, r = {}, xx = x.split(',');
|
|
for (var i in xx) { j = xx[i].indexOf('='); r[xx[i].substring(0, j)] = xx[i].substring(j + 1); }
|
|
return r;
|
|
}
|
|
|
|
function getTlsSecurityState(x) {
|
|
if (xxTlsSettings[x]['Enabled'] == false) return "Discapacitado";
|
|
var r = ((xxTlsSettings[x]['MutualAuthentication'] == true) ? "TLS de autenticación mutua" : "TLS de autenticación de servidor") + ((xxTlsSettings[x]['AcceptNonSecureConnections'] == true) ? " y no TLS" : '');
|
|
if ((xxTlsSettings[x]['MutualAuthentication'] == true) && (xxTlsSettings[x]['TrustedCN'])) {
|
|
var trustedCn = MakeToArray(xxTlsSettings[x]['TrustedCN']);
|
|
if (trustedCn.length > 0) { r += ', ' + ((trustedCn.length > 1) ? 'Trusted names' : 'Trusted name') + ': ' + trustedCn.join(', ') + '.'; }
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function updateCertificates() {
|
|
if (xxCertificates == null) return;
|
|
|
|
// Figure out what index is local & remote
|
|
var localNdx = ((xxTlsSettings[0]['InstanceID'] == 'Intel(r) AMT LMS TLS Settings')) ? 0 : 1, remoteNdx = (1 - localNdx);
|
|
|
|
// General settings
|
|
var x = TableStart();
|
|
x += TableEntry("Seguridad remota de TLS", addLinkConditional(getTlsSecurityState(remoteNdx), 'showSetTlsSecurityDlg()', xxAccountAdminName));
|
|
x += TableEntry("Seguridad local de TLS", addLinkConditional(getTlsSecurityState(localNdx), 'showSetTlsSecurityDlg()', xxAccountAdminName));
|
|
x += TableEnd();
|
|
x += '<br>' + TableStart2() + '<tr><td class=r1 style=padding-left:15px><br>' + "Administre los certificados Intel® AMT para esta computadora." + '<br><br>';
|
|
if (xxCertificates.length == 0 && xxCertPrivateKeys.length == 0) {
|
|
x += '<div style=padding-left:15px><br><i>' + "No se encontraron certificados." + '</i></div><br>';
|
|
} else {
|
|
for (var i in xxCertificates) {
|
|
var desc = '';
|
|
if (xxCertificates[i].TrustedRootCertficate) desc = ", Raíz de confianza";
|
|
if (xxCertificates[i].XPrivateKey) desc = ", Llave privada";
|
|
if (i == xxTlsCurrentCert) desc += ", Certificado TLS";
|
|
x += '<div class=itemBar onclick=showCertDetails(' + i + ')><div style=padding-top:3px><b>' + EscapeHtml(xxCertificates[i].XSubject['CN']) + '</b><i>' + desc + '</i></div></div>';
|
|
}
|
|
for (var i in xxCertPrivateKeys) {
|
|
if (!xxCertPrivateKeys[i].XCert) {
|
|
x += '<div class=itemBar onclick=showKeyPairDetails(' + i + ')><div style=padding-top:3px><i>' + "Par de claves privadas sin asignar #" + i + '</i></div></div>';
|
|
}
|
|
}
|
|
}
|
|
var buttons = AddRefreshButton('PullCertificates()');
|
|
if (xxAccountAdminName) { buttons += (AddButton("Agregar certificado ...", 'addCertButton()') + AddButton("Emitir certificado ...", 'issueCertButton()')); }
|
|
x += '<br><td class=r1>' + TableEnd(buttons);
|
|
QH('id_TableCerts', x);
|
|
}
|
|
|
|
function showKeyPairDetails(h) {
|
|
var x = "Este es un par de claves de certificado público / privado que no pertenece a ningún certificado. Esta entrada debe ser temporal.";
|
|
setDialogMode(11, "Par de claves #" + h, 5, function (b) { if (b == 2) { amtstack.Delete('AMT_PublicPrivateKeyPair', { 'InstanceID': xxCertPrivateKeys[h]['InstanceID'] }, PullCertificates, 0, 1); } }, x);
|
|
}
|
|
|
|
var xxCertSubjectNames = { 'CN': "Nombre común", 'O': "Organización", 'OU': "Unidad Org", 'S': "Provincia del estado", 'ST': "Provincia del estado", 'L': "Localidad", 'C': "País", 'SN': "Apellido", 'GN': "Nombre de pila" };
|
|
function showCertDetails(h) {
|
|
if (xxdialogMode) return;
|
|
var c = xxCertificates[h], x = '<br>';
|
|
// ###BEGIN###{FileSaver}
|
|
x += addHtmlValue("Certificado", c.X509Certificate.length + " bytes," + '<a style=cursor:pointer;color:blue onclick=downloadCert(' + h + ')>' + "Descargar" + '</a>');
|
|
// ###END###{FileSaver}
|
|
// ###BEGIN###{!FileSaver}
|
|
x += addHtmlValue("Certificado", c.X509Certificate.length + " bytes");
|
|
// ###END###{!FileSaver}
|
|
x += addHtmlValue("Raíz de confianza", c.TrustedRootCertficate ? "si" : "No");
|
|
if (c.TrustedRootCertficate == false && c.XPrivateKey) { x += addHtmlValue("Llave privada", "Presente"); }
|
|
|
|
// Show certificate usages
|
|
/*
|
|
y = [];
|
|
if (extKeyUsage != null) {
|
|
if (extKeyUsage.clientAuth == true) { y.push("TLS Client"); }
|
|
if (extKeyUsage.codeSigning == true) { y.push("Code Signing"); }
|
|
if (extKeyUsage.emailProtection == true) { y.push("EMail"); }
|
|
if (extKeyUsage.serverAuth == true) { y.push("TLS Server"); }
|
|
if (extKeyUsage["2.16.840.1.113741.1.2.1"] == true) { y.push("Intel® AMT Console"); }
|
|
if (extKeyUsage["2.16.840.1.113741.1.2.2"] == true) { y.push("Intel® AMT Agent"); }
|
|
if (extKeyUsage["2.16.840.1.113741.1.2.3"] == true) { y.push("Intel® AMT Activation"); }
|
|
if (extKeyUsage.timeStamping == true) { y.push("Time Stamping"); }
|
|
if (y.length > 0) { x += addHtmlValueNoTitle("Certificate Usage", y.join(', ') + '.') + '<br clear=all />'; }
|
|
}
|
|
*/
|
|
|
|
x += '<br><div style="border-bottom:1px solid gray"><i>' + "Asunto del certificado" + '</i></div><br>';
|
|
for (var i in c.XSubject) { if (c.XSubject[i]) { x += addHtmlValue(xxCertSubjectNames[i] ? xxCertSubjectNames[i] : i, EscapeHtml(c.XSubject[i])); } }
|
|
// x += addHtmlValueNoTitle("Fingerprint", c.fingerprint.substring(0,29) + '<br />' + c.fingerprint.substring(30)); // TODO: Parse the certificate using Forge and get the fingerprint
|
|
x += '<br><div style="border-bottom:1px solid gray"><i>' + "Certificado de emisor" + '</i></div><br>';
|
|
for (var i in c.XIssuer) { if (c.XIssuer[i]) { x += addHtmlValue(xxCertSubjectNames[i] ? xxCertSubjectNames[i] : i, EscapeHtml(c.XIssuer[i])); } }
|
|
setDialogMode(11, "Certificado -" + EscapeHtml(c.XSubject['CN']), 5, function (b) {
|
|
if (b == 2) {
|
|
// If there is a private key, delete it.
|
|
if (xxCertificates[h].XPrivateKey) amtstack.Delete('AMT_PublicPrivateKeyPair', { 'InstanceID': xxCertificates[h].XPrivateKey['InstanceID'] }, function () { }, 0, 1);
|
|
// Delete the certificate
|
|
amtstack.Delete('AMT_PublicKeyCertificate', xxCertificates[h], certificateRemoved, 0, 1);
|
|
}
|
|
}, x);
|
|
}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
function downloadCert(h) {
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
saveAs(data2blob(xxCertificates[h].X509Certificate), xxCertificates[h].XSubject['CN'] + '.cer');
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file');
|
|
chooser.setAttribute('nwsaveas', xxCertificates[h].XSubject['CN'] + '.cer');
|
|
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, xxCertificates[h].X509Certificate, 'binary', function () { }); }, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
function cert_FileSelectHandler(e) {
|
|
haltEvent(e);
|
|
if (e.dataTransfer.files.length == 1) {
|
|
if (e.dataTransfer.files[0].name.toLowerCase().endsWith('.p12')) {
|
|
issueCertButton(e.dataTransfer.files);
|
|
} else {
|
|
addCertButton(e.dataTransfer.files);
|
|
}
|
|
}
|
|
}
|
|
|
|
var xxDragDropCertFiles = null;
|
|
function addCertButton(files) {
|
|
if (xxdialogMode || !xxAccountAdminName) return;
|
|
var x = '<div style=height:10px></div>', op0 = '', op2 = '';
|
|
xxDragDropCertFiles = files;
|
|
// ###BEGIN###{CertificateManager}
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
if (amtversion > 12) { op2 = '<option value=2>' + "MeshCommander Web Server Root" + '</option>'; }
|
|
// ###END###{PowerControl-OneClick}
|
|
// ###END###{PowerControl-Advanced}
|
|
if (certificateStore.length > 0) { op0 += '<option value=0>' + "Agregar desde el administrador de certificados" + '</option>'; }
|
|
if ((!xxDragDropCertFiles) && ((op0 != '') || (op2 != ''))) { x += '<div style=height:26px;margin-top:4px><select onchange=addCertButtonUpdate() id=certoptype style=float:right;width:260px>' + op0 + '<option value=1>' + "Agregar desde archivo de certificado" + '</option>' + op2 + '</select><div style=padding-top:4px>' + "Operación" + '</div></div>'; }
|
|
x += '<div id=dxcertfileop1>';
|
|
var input = '<input id=certopen onchange=addCertButtonUpdate() type=file style=float:right;width:260px accept=".crt,.cer,.pem">';
|
|
if (xxDragDropCertFiles) { input = '<input style=float:right;width:260px readonly disabled value="' + xxDragDropCertFiles[0].name + '">'; }
|
|
x += '<div style=height:26px;margin-top:4px>' + input + '<div style=padding-top:4px>' + "Archivo de certificado" + '</div></div></div>';
|
|
if (certificateStore.length > 0) {
|
|
x += '<div id=dxcertfileop2><div style=height:26px;margin-top:4px><select id=certhandle style=float:right;width:260px>';
|
|
for (var i in certificateStore) {
|
|
var certificate = certificateStore[i], name = certificate.cert.subject.getField('CN').value;
|
|
x += '<option value=' + certificate['h'] + '>' + name + '</option>';
|
|
}
|
|
x += '</select><div style=padding-top:4px>' + "Certificado" + '</div></div></div>';
|
|
}
|
|
// ###END###{CertificateManager}
|
|
// ###BEGIN###{!CertificateManager}
|
|
var input = '<input id=certopen onchange=addCertButtonUpdate() type=file style=float:right;width:260px accept=".cer,.pem">';
|
|
if (xxDragDropCertFiles) { input = '<input style=float:right;width:260px readonly disabled value="' + xxDragDropCertFiles[0].name + '">'; }
|
|
x += '<div style=height:26px;margin-top:4px>' + input + '<div style=padding-top:4px>' + "Archivo de certificado" + '</div></div>';
|
|
// ###END###{!CertificateManager}
|
|
x += '<div style=height:26px;margin-top:4px><select id=certtype style=float:right;width:260px><option value=1>' + "Certificado raíz de confianza" + '</option><option value=0>' + "Certificado de cadena" + '</option></select><div style=padding-top:4px>' + "Tipo de certificado" + '</div></div>';
|
|
setDialogMode(11, "Agregar certificado", 3, addCertButtonOk, x);
|
|
addCertButtonUpdate();
|
|
}
|
|
|
|
function addCertButtonUpdate() {
|
|
// ###BEGIN###{CertificateManager}
|
|
if ((!xxDragDropCertFiles) && (certificateStore.length > 0)) {
|
|
QV('dxcertfileop2', Q('certoptype').value == 0);
|
|
QV('dxcertfileop1', Q('certoptype').value == 1);
|
|
if (Q('certoptype').value == 0) { QE('idx_dlgOkButton', true); return; }
|
|
}
|
|
// ###END###{CertificateManager}
|
|
var certopen = getInputElement('certopen');
|
|
QE('idx_dlgOkButton', !certopen || (certopen.files.length == 1) || (Q('certoptype').value == 2));
|
|
}
|
|
|
|
function addCertButtonOk() {
|
|
// ###BEGIN###{CertificateManager}
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
if (Q('certoptype').value == 2) {
|
|
var certbin = null;
|
|
if (webserver == null) {
|
|
webserver = CreateWebServer();
|
|
webserver.generateCertificate(0);
|
|
certbin = webserver.rootCert;
|
|
webserver = null;
|
|
} else {
|
|
certbin = webserver.rootCert;
|
|
}
|
|
|
|
// This is a .PEM file, keep everything between BEGIN/END, clean it up and use as-is. It's already Base64.
|
|
var i = certbin.indexOf('-----BEGIN CERTIFICATE-----');
|
|
if (i >= 0) {
|
|
certbin = certbin.substring(i + 27);
|
|
i = certbin.indexOf('-----END CERTIFICATE-----');
|
|
if (i >= 0) certbin = certbin.substring(0, i)
|
|
certbin = certbin.replace(/\r\n/g, '');
|
|
if (getSelectElement('certtype').value == 1) {
|
|
amtstack.AMT_PublicKeyManagementService_AddTrustedRootCertificate(certbin, certificateAdded);
|
|
} else {
|
|
amtstack.AMT_PublicKeyManagementService_AddCertificate(certbin, certificateAdded);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
// ###END###{PowerControl-OneClick}
|
|
// ###END###{PowerControl-Advanced}
|
|
if ((xxDragDropCertFiles) || (certificateStore.length == 0) || (Q('certoptype').value == 1)) {
|
|
var certopen = getInputElement('certopen');
|
|
var files = xxDragDropCertFiles;
|
|
if (certopen) files = certopen.files;
|
|
if (files && files.length == 1) {
|
|
var reader = new FileReader();
|
|
reader.onload = addCertButtonOk2;
|
|
reader.readAsBinaryString(files[0]);
|
|
}
|
|
} else {
|
|
var certificate = getCertificate(Q('certhandle').value)
|
|
if (getSelectElement('certtype').value == 1) {
|
|
amtstack.AMT_PublicKeyManagementService_AddTrustedRootCertificate(certificate['certbin'], certificateAdded);
|
|
} else {
|
|
amtstack.AMT_PublicKeyManagementService_AddCertificate(certificate['certbin'], certificateAdded);
|
|
}
|
|
}
|
|
// ###END###{CertificateManager}
|
|
// ###BEGIN###{!CertificateManager}
|
|
var certopen = getInputElement('certopen');
|
|
var files = xxDragDropCertFiles;
|
|
if (certopen) files = certopen.files;
|
|
if (files && files.length == 1) {
|
|
var reader = new FileReader();
|
|
reader.onload = addCertButtonOk2;
|
|
reader.readAsBinaryString(files[0]);
|
|
}
|
|
// ###END###{!CertificateManager}
|
|
}
|
|
|
|
function addCertButtonOk2(file) {
|
|
var data = file.target.result;
|
|
var i = data.indexOf('-----BEGIN CERTIFICATE-----');
|
|
if (i >= 0) {
|
|
// This is a .PEM file, keep everything between BEGIN/END, clean it up and use as-is. It's already Base64.
|
|
data = data.substring(i + 27);
|
|
i = data.indexOf('-----END CERTIFICATE-----');
|
|
if (i >= 0) data = data.substring(0, i)
|
|
data = data.replace(/\r\n/g, '');
|
|
} else {
|
|
// This is a .CER file, just base64 encode it and we should be ok.
|
|
data = btoa(data);
|
|
}
|
|
if (getSelectElement('certtype').value == 1) {
|
|
amtstack.AMT_PublicKeyManagementService_AddTrustedRootCertificate(data, certificateAdded);
|
|
} else {
|
|
amtstack.AMT_PublicKeyManagementService_AddCertificate(data, certificateAdded);
|
|
}
|
|
}
|
|
|
|
function issueCertButton(files) {
|
|
if (xxdialogMode || !xxAccountAdminName) return;
|
|
xxDragDropCertFiles = files;
|
|
|
|
// ###BEGIN###{CertificateManager}
|
|
var x = '', certCount = getCertificateWithKeyCount();
|
|
if ((!xxDragDropCertFiles) && (certCount > 0)) { x += '<div style=height:26px;margin-top:4px><select onchange=addCertButtonUpdate() id=certoptype style=float:right;width:230px><option value=0>' + "Problema del administrador de certificados" + '</option><option value=1>' + "Emisión del archivo de certificado" + '</option></select><div style=padding-top:4px>Operation</div></div>'; }
|
|
x += '<div id=dxcertfileop1>', input = '<input id=certopen onchange=issueCertButtonUpdate() type=file style=float:right;width:230px accept=".p12">';
|
|
if (xxDragDropCertFiles) { input = '<input style=float:right;width:230px readonly disabled value="' + xxDragDropCertFiles[0].name + '">'; }
|
|
x += '<div style=height:26px;margin-top:4px>' + input + '<div style=padding-top:4px>' + "Archivo de certificado" + '</div></div><div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certopenpass type=password autocomplete=off style=float:right;width:230px><div style=padding-top:4px>' + "Contraseña del certificado" + '</div></div></div>';
|
|
if (certificateStore.length > 0) {
|
|
x += '<div id=dxcertfileop2><div style=height:26px;margin-top:4px><select id=certhandle style=float:right;width:230px>';
|
|
for (var i in certificateStore) {
|
|
var certificate = certificateStore[i], name = certificate.cert.subject.getField('CN').value
|
|
if (certificate['privateKey']) { x += '<option value=' + certificate['h'] + '>' + name + '</option>'; }
|
|
}
|
|
x += '</select><div style=padding-top:4px>' + "Certificado" + '</div></div></div>';
|
|
}
|
|
// ###END###{CertificateManager}
|
|
|
|
// ###BEGIN###{!CertificateManager}
|
|
var x = '', input = '<input id=certopen type=file style=float:right;width:230px onchange=issueCertButtonUpdate() accept=".p12">';
|
|
if (xxDragDropCertFiles) { input = '<input style=float:right;width:230px readonly disabled value="' + xxDragDropCertFiles[0].name + '">'; }
|
|
x += '<div styleheight:26px;margin-top:14px>' + input + '<div style=padding-top:4px>Certificate file</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certopenpass type=password autocomplete=off style=float:right;width:230px><div style=padding-top:4px>' + "Contraseña del certificado" + '</div></div>';
|
|
// ###END###{!CertificateManager}
|
|
|
|
x += '<br><div style="border-bottom:1px solid gray"><i>' + "Certificado Intel® AMT" + '</i></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certcn style=float:right;width:230px><div style=padding-top:4px>' + "Nombre común" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certo style=float:right;width:230px><div style=padding-top:4px>' + "Organización" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certst style=float:right;width:230px><div style=padding-top:4px>' + "Provincia del estado" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=issueCertButtonUpdate() id=certc style=float:right;width:230px><div style=padding-top:4px>' + "País" + '</div></div>';
|
|
x += '<div>' + "Usos de certificado" + '</div><ul style="list-style-type:none;height:100px;overflow:auto;width:100%;border: 1px solid #000;background-color:white;overflow-x:hidden;margin:0;padding:0">';
|
|
//x += '<li><label><input type=checkbox id=d11_cu1>' + "Intel® AMT Console" + '</label></li>';
|
|
//x += '<li><label><input type=checkbox id=d11_cu2>' + "Intel® AMT Agent" + '</label></li>';
|
|
//x += '<li><label><input type=checkbox id=d11_cu3>' + "Intel® AMT Activation" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu4 checked>' + "Servidor TLS (HTTPS)" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu5>' + "Cliente TLS (HTTPS)" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu6>' + "Protección de correo electrónico" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu7>' + "Firma de código" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu8>' + "Sello de tiempo" + '</label></li>';
|
|
x += '</ul>';
|
|
setDialogMode(11, "Emitir certificado", 3, issueCertButtonOk, x);
|
|
issueCertButtonUpdate();
|
|
}
|
|
|
|
function issueCertButtonUpdate() {
|
|
// ###BEGIN###{CertificateManager}
|
|
var certCount = getCertificateWithKeyCount();
|
|
if ((!xxDragDropCertFiles) && (certCount > 0)) {
|
|
QV('dxcertfileop2', Q('certoptype').value == 0);
|
|
QV('dxcertfileop1', Q('certoptype').value == 1);
|
|
QE('idx_dlgOkButton', (getInputElement('certcn').value != '') && (getInputElement('certo').value != '') && (getInputElement('certst').value != '') && (getInputElement('certc').value != ''));
|
|
return;
|
|
}
|
|
// ###END###{CertificateManager}
|
|
var certopen = getInputElement('certopen');
|
|
QE('certopenpass', !certopen || (certopen && certopen.files.length == 1));
|
|
var x = (!certopen || certopen.files.length < 2);
|
|
if ((!certopen || (certopen && certopen.files.length)) == 1 && Q('certopenpass').value == '') x = false;
|
|
if (getInputElement('certcn').value == '' || getInputElement('certo').value == '' || getInputElement('certst').value == '' || getInputElement('certc').value == '') { x = false; }
|
|
QE('idx_dlgOkButton', x);
|
|
}
|
|
|
|
function issueCertButtonOk() {
|
|
// ###BEGIN###{CertificateManager}
|
|
if ((xxDragDropCertFiles) || (certificateStore.length == 0) || (Q('certoptype').value == 1)) {
|
|
var certopen = getInputElement('certopen');
|
|
var files = xxDragDropCertFiles;
|
|
if (certopen) files = certopen.files;
|
|
if (files && files.length == 1) {
|
|
// Issue a certificate using this file
|
|
var reader = new FileReader();
|
|
reader.onload = issueCertButtonOk2;
|
|
reader.readAsBinaryString(files[0]);
|
|
} else {
|
|
// Issue a certificate using a dummy CA
|
|
issueCertButtonOk3(null);
|
|
}
|
|
} else {
|
|
// Save the certificate store certificate as a p12 and load it back up using the regular user flow. This makes the code smaller but slower.
|
|
var certificate = getCertificate(Q('certhandle').value);
|
|
var certBase64 = forge.util.encode64(forge.asn1.toDer(forge.pkcs12.toPkcs12Asn1(certificate['privateKey'], certificate['cert'], 'pass')).getBytes());
|
|
amtcert_loadP12File(atob(certBase64), 'pass', issueCertButtonOk3);
|
|
}
|
|
// ###END###{CertificateManager}
|
|
// ###BEGIN###{!CertificateManager}
|
|
var certopen = getInputElement('certopen');
|
|
var files = xxDragDropCertFiles;
|
|
if (certopen) files = certopen.files;
|
|
if (files && files.length == 1) {
|
|
// Issue a certificate using this file
|
|
var reader = new FileReader();
|
|
reader.onload = issueCertButtonOk2;
|
|
reader.readAsBinaryString(files[0]);
|
|
} else {
|
|
// Issue a certificate using a dummy CA
|
|
issueCertButtonOk3(null);
|
|
}
|
|
// ###END###{!CertificateManager}
|
|
}
|
|
|
|
function issueCertButtonOk2(file) {
|
|
// Load the CA certificate and private key
|
|
var r = amtcert_loadP12File(file.target.result, Q('certopenpass').value, issueCertButtonOk3);
|
|
if (r == false) { messagebox("Emitir certificado", "No se puede descifrar / decodificar el certificado."); return; }
|
|
}
|
|
|
|
function issueCertButtonOk3(privateKey, subjectAttributes, cert) {
|
|
// Ask Intel AMT to generate a key pair
|
|
xxCaPrivateKey = privateKey;
|
|
xxCaSubjectAttributes = subjectAttributes;
|
|
amtstack.AMT_PublicKeyManagementService_GenerateKeyPair(0, 2048, GenerateKeyPairResponse);
|
|
}
|
|
|
|
function GenerateKeyPairResponse(stack, serviceName, response, status) {
|
|
if (status != 200) { messagebox("Emitir certificado", "Error al generar par de claves. Estado: " + status); return; }
|
|
if (response.Body['ReturnValue'] != 0) { messagebox("Emitir certificado", "Error al generar par de claves," + response.Body['ReturnValueStr']); return; }
|
|
|
|
// Get the new key pair
|
|
amtstack.Enum('AMT_PublicPrivateKeyPair', GenerateKeyPairResponse2, response.Body['KeyPair']['ReferenceParameters']['SelectorSet']['Selector']['Value']);
|
|
}
|
|
|
|
function GenerateKeyPairResponse2(stack, serviceName, response, status, tag) {
|
|
if (status != 200) { messagebox("Emitir certificado", "Error al generar par de claves. Estado: " + status); return; }
|
|
var DERKey = null;
|
|
for (var i in response) { if (response[i]['InstanceID'] == tag) DERKey = response[i]['DERKey']; }
|
|
|
|
// Get certificate values
|
|
var certattributes = { 'CN': getInputElement('certcn').value, 'O': getInputElement('certo').value, 'ST': getInputElement('certst').value, 'C': getInputElement('certc').value };
|
|
var issuerattributes = { 'CN': "Certificado raíz no confiable" };
|
|
if (xxCaPrivateKey != null && xxCaSubjectAttributes) {
|
|
issuerattributes = {};
|
|
for (var i in xxCaSubjectAttributes) {
|
|
issuerattributes[xxCaSubjectAttributes[i].shortName] = xxCaSubjectAttributes[i].value; // The issuing CA's subject attributes
|
|
}
|
|
}
|
|
|
|
// Figure out the extended key usages
|
|
var extKeyUsage = { name: 'extKeyUsage' }
|
|
//if (Q('d11_cu1').checked) { extKeyUsage['2.16.840.1.113741.1.2.1'] = true; extKeyUsage.clientAuth = true; }
|
|
//if (Q('d11_cu2').checked) { extKeyUsage['2.16.840.1.113741.1.2.2'] = true; extKeyUsage.clientAuth = true; }
|
|
//if (Q('d11_cu3').checked) { extKeyUsage['2.16.840.1.113741.1.2.3'] = true; extKeyUsage.clientAuth = true; }
|
|
if (Q('d11_cu4').checked) { extKeyUsage.serverAuth = true; }
|
|
if (Q('d11_cu5').checked) { extKeyUsage.clientAuth = true; }
|
|
if (Q('d11_cu6').checked) { extKeyUsage.emailProtection = true; }
|
|
if (Q('d11_cu7').checked) { extKeyUsage.codeSigning = true; }
|
|
if (Q('d11_cu8').checked) { extKeyUsage.timeStamping = true; }
|
|
|
|
// Sign the key pair using the CA certifiate
|
|
var cert = amtcert_signWithCaKey(DERKey, xxCaPrivateKey, certattributes, issuerattributes, extKeyUsage);
|
|
if (cert == null) { messagebox("Emitir certificado", "No se puede firmar el certificado."); return; }
|
|
|
|
// Place the resulting signed certificate back into AMT
|
|
var pem = forge.pki.certificateToPem(cert).replace(/(\r\n|\n|\r)/gm, '');
|
|
amtstack.AMT_PublicKeyManagementService_AddCertificate(pem.substring(27, pem.length - 25), GenerateKeyPairResponse4);
|
|
}
|
|
|
|
function GenerateKeyPairResponse4(stack, serviceName, response, status) {
|
|
if (status != 200) { messagebox("Emitir certificado", "Error al generar par de claves. Estado: " + status); return; }
|
|
PullCertificates();
|
|
}
|
|
|
|
function certificateAdded(stack, serviceName, response, status) { if (status != 200 || response.Body['ReturnValue'] != 0) { messagebox("Agregar certificado", "No se puede agregar el certificado, error" + (status != 200 ? status : response.Body['ReturnValueStr'])); } else PullCertificates(); }
|
|
function certificateRemoved(stack, serviceName, header, status) { if (status != 200) { messagebox("Eliminar certificado", "No se puede eliminar el certificado, error" + status); } else PullCertificates(); }
|
|
|
|
function getInputElement(id) { var allelements = document.getElementsByTagName('input'); for (t = 0; t < allelements.length; t++) { if (allelements[t].id == id) return allelements[t]; } }
|
|
function getSelectElement(id) { var allelements = document.getElementsByTagName('select'); for (t = 0; t < allelements.length; t++) { if (allelements[t].id == id) return allelements[t]; } }
|
|
|
|
function showSetTlsSecurityDlg(x) {
|
|
if (xxdialogMode) return;
|
|
var x = '';
|
|
x += '<div style=height:26px;margin-top:4px><select onchange=showSetTlsSecurityDlgUpdate() id=tlscert style=float:right;width:260px><option value=-1>' + "Sin certificado, TLS deshabilitado" + '</option>';
|
|
for (var i in xxCertificates) { if (xxCertificates[i].TrustedRootCertficate == false && xxCertificates[i].XPrivateKey && (xxTlsCurrentCert == null || xxTlsCurrentCert == i)) { x += '<option value=' + i + '>' + xxCertificates[i].XSubject['CN'] + '</option>'; } }
|
|
x += '</select><div style=padding-top:4px>' + "Certificado" + '</div></div>';
|
|
|
|
x += '<div style=height:26px;margin-top:4px><select id=tlsremote style=float:right;width:260px onchange=showSetTlsSecurityDlgUpdate()><option value=0>Server-auth TLS only</option><option value=1>Server-auth, non-TLS allowed</option>';
|
|
x += '<option value=2>Mutual-auth TLS only</option><option value=3>Mutual-auth, non-TLS allowed</option>'; // Support for mutual-auth TLS seems to have been removed on AMT8 and after ??
|
|
x += '</select><div style=padding-top:4px>Security</div></div><div style=height:26px id=d11rcn title="' + "Lista separada por comas de nombres comunes de certificados que se les permitirá conectarse de forma remota." + '"><input id=d11_rcn style=float:right;width:260px onkeyup=showSetTlsSecurityDlgUpdate() placeholder="' + "nombre1, nombre2" + '"><div style=padding-top:4px>' + "CN remotos" + '</div></div>';
|
|
|
|
setDialogMode(11, "Configuraciones TLS", 3, showSetTlsSecurityDlgOk, x);
|
|
|
|
// Select the current TLS certificate in the drop down box
|
|
if ((xxTLSCredentialContext.length == 0) || (xxTlsSettings[0]['Enabled'] == false) || (xxTlsSettings[1]['Enabled'] == false)) {
|
|
getSelectElement('tlscert').value = -1;
|
|
} else {
|
|
var certInstanceId = xxTLSCredentialContext[0]['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
|
|
for (var i in xxCertificates) { if (xxCertificates[i]['InstanceID'] == certInstanceId) { getSelectElement('tlscert').value = i; } }
|
|
}
|
|
|
|
// Figure out what index is local & remote
|
|
var localNdx = ((xxTlsSettings[0]['InstanceID'] == 'Intel(r) AMT LMS TLS Settings')) ? 0 : 1, remoteNdx = (1 - localNdx);
|
|
|
|
// Select correct TLS options in the drop down boxes
|
|
getSelectElement('tlsremote').value = ((xxTlsSettings[remoteNdx]['MutualAuthentication'] == true) ? 2 : 0) + ((xxTlsSettings[remoteNdx]['AcceptNonSecureConnections'] == true) ? 1 : 0);
|
|
if (xxTlsSettings[remoteNdx]['TrustedCN']) { Q('d11_rcn').value = MakeToArray(xxTlsSettings[remoteNdx]['TrustedCN']).join(', '); }
|
|
|
|
showSetTlsSecurityDlgUpdate();
|
|
}
|
|
|
|
function showSetTlsSecurityDlgUpdate() {
|
|
var h = getSelectElement('tlscert').value;
|
|
QE('tlsremote', h != -1);
|
|
QV('d11rcn', (h != -1) && (getSelectElement('tlsremote').value > 1));
|
|
var ok = true;
|
|
if ((getSelectElement('tlsremote').value > 1) && (!splitDomains(Q('d11_rcn').value))) { ok = false; }
|
|
QE('idx_dlgOkButton', ok);
|
|
}
|
|
|
|
var setTlsSecurityPendingCalls;
|
|
var setTlsSecurityDeleteCredentialContext;
|
|
function showSetTlsSecurityDlgOk() {
|
|
var h = getSelectElement('tlscert').value;
|
|
var r = getSelectElement('tlsremote').value;
|
|
var xxTlsSettings2 = Clone(xxTlsSettings);
|
|
setTlsSecurityPendingCalls = 0;
|
|
setTlsSecurityDeleteCredentialContext = null;
|
|
|
|
if (h != -1) {
|
|
// Set the TLS certificate
|
|
if (xxTLSCredentialContext.length > 0) {
|
|
// Modify the current context
|
|
var newTLSCredentialContext = Clone(xxTLSCredentialContext[0]);
|
|
newTLSCredentialContext['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'] = xxCertificates[h]['InstanceID'];
|
|
amtstack.Put('AMT_TLSCredentialContext', newTLSCredentialContext, setTlsSecurityResponse, 0, 1);
|
|
setTlsSecurityPendingCalls++;
|
|
} else {
|
|
// Add a new security context
|
|
amtstack.Create('AMT_TLSCredentialContext', {
|
|
'ElementInContext':'<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_PublicKeyCertificate') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + xxCertificates[h]['InstanceID'] + '</w:Selector></w:SelectorSet></a:ReferenceParameters>',
|
|
'ElementProvidingContext':'<a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>' + amtstack.CompleteName('AMT_TLSProtocolEndpointCollection') + '</w:ResourceURI><w:SelectorSet><w:Selector Name="ElementName">TLSProtocolEndpointInstances Collection</w:Selector></w:SelectorSet></a:ReferenceParameters>' }, setTlsSecurityResponse);
|
|
setTlsSecurityPendingCalls++;
|
|
}
|
|
} else {
|
|
// Clear the TLS certificate association (MOVE THIS)
|
|
if (xxTLSCredentialContext.length > 0) { setTlsSecurityDeleteCredentialContext = Clone(xxTLSCredentialContext[0]); }
|
|
}
|
|
|
|
// Figure out what index is local & remote
|
|
var localNdx = ((xxTlsSettings[0]['InstanceID'] == 'Intel(r) AMT LMS TLS Settings')) ? 0 : 1, remoteNdx = (1 - localNdx);
|
|
|
|
// Remote TLS settings
|
|
xxTlsSettings2[remoteNdx]['Enabled'] = (h != -1);
|
|
xxTlsSettings2[remoteNdx]['MutualAuthentication'] = (r >= 2);
|
|
xxTlsSettings2[remoteNdx]['AcceptNonSecureConnections'] = ((r % 2) == 1);
|
|
xxTlsSettings2[remoteNdx]['TrustedCN'] = splitDomains(Q('d11_rcn').value);
|
|
|
|
// Local TLS settings
|
|
xxTlsSettings2[localNdx]['Enabled'] = (h != -1);
|
|
xxTlsSettings2[localNdx]['TrustedCN'] = splitDomains(Q('d11_rcn').value); // This is required for old Intel AMT (v7 for sure) because older AMT support local interface mutual-auth and don't well if you don't set this.
|
|
|
|
// Mutual-auth TLS requires time sync
|
|
if (r >= 2) {
|
|
setTlsSecurityPendingCalls++;
|
|
amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(function (stack, name, response, status) {
|
|
if (status != 200) { messagebox('', "Error al establecer la hora, estado =" + status); return; }
|
|
if (response.Body['ReturnValue'] != 0) { messagebox('', "Error al establecer la hora, error: " + response.Body['ReturnValueStr']); return; }
|
|
//var now = new Date(), Tm1 = Math.round((now.getTime() - (now.getTimezoneOffset() * 60000)) / 1000);
|
|
var now = new Date(), Tm1 = Math.round(now.getTime() / 1000);
|
|
amtstack.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch(response.Body['Ta0'], Tm1, Tm1, function () { setTlsSecurityResponse(); });
|
|
});
|
|
}
|
|
|
|
// Update TLS settings
|
|
setTlsSecurityPendingCalls += 2;
|
|
amtstack.Put('AMT_TLSSettingData', xxTlsSettings2[0], setTlsSecurityResponse, 0, 1, xxTlsSettings2[0]);
|
|
amtstack.Put('AMT_TLSSettingData', xxTlsSettings2[1], setTlsSecurityResponse, 0, 1, xxTlsSettings2[1]);
|
|
|
|
statusbox("Configuraciones TLS", "Aplicando nuevas configuraciones de seguridad ...");
|
|
}
|
|
|
|
// Split a string into a array of domains. Return null if not a valid list.
|
|
function splitDomains(str) {
|
|
str = str.split(',');
|
|
if (str.length == 0) return;
|
|
for (var i in str) { str[i] = str[i].trim(); if ((str[i].indexOf(' ') >= 0) || (str[i].length == 0)) return; }
|
|
if (str.length > 4) return;
|
|
return str;
|
|
}
|
|
|
|
function setTlsSecurityResponse(stack, name, response, status) {
|
|
if (stack) {
|
|
if (status != 200) { messagebox('', "Error al establecer la seguridad de TLS, estado =" + status); return; }
|
|
if (response.Body['ReturnValueStr'] && !methodcheck(response)) return;
|
|
}
|
|
|
|
// Check if all the calls are done & perform a commit
|
|
if ((--setTlsSecurityPendingCalls) == 0) { amtstack.AMT_SetupAndConfigurationService_CommitChanges(null, setTlsSecurityResponse2); }
|
|
}
|
|
|
|
function setTlsSecurityResponse2(stack, name, response, status) {
|
|
if (status != 200) { messagebox('', "Error al establecer la seguridad de TLS, estado =" + status); return; }
|
|
if (response.Body['ReturnValue'] != 0) { messagebox('', "Error al establecer la seguridad de TLS, error: " + response.Body['ReturnValueStr']); return; }
|
|
setTimeout(setTlsSecurityResponse3, 2000);
|
|
}
|
|
|
|
function setTlsSecurityResponse3() {
|
|
if (setTlsSecurityDeleteCredentialContext != null) { amtstack.Delete('AMT_TLSCredentialContext', setTlsSecurityDeleteCredentialContext, function () { }); }
|
|
PullCertificates();
|
|
setDialogMode();
|
|
amtstack.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch(processSystemTime);
|
|
}
|
|
|
|
// ###END###{Certificates}
|
|
|
|
// ###BEGIN###{AgentPresence}
|
|
|
|
//
|
|
// AGENT PRESENCE
|
|
//
|
|
|
|
var xxWatchdog = null;
|
|
|
|
function PullWatchdog() {
|
|
amtstack.BatchEnum(null, ['*AMT_AgentPresenceCapabilities', 'AMT_AgentPresenceWatchdog', 'AMT_AgentPresenceWatchdogAction', 'AMT_StateTransitionCondition', 'CIM_ConcreteDependency'], PullWatchdogResponse);
|
|
}
|
|
|
|
function PullWatchdogResponse(stack, name, responses, status) {
|
|
if ((status == 200) && (responses['AMT_AgentPresenceCapabilities'].status == 200)) {
|
|
xxWatchdog = responses;
|
|
|
|
// Place the actions into the watchdogs for easy navigation.
|
|
for (var i in xxWatchdog['CIM_ConcreteDependency'].responses) {
|
|
var link = xxWatchdog['CIM_ConcreteDependency'].responses[i];
|
|
var x1 = getItem(link['Antecedent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'CreationClassName');
|
|
if (x1 && x1['Value'] == 'AMT_AgentPresenceWatchdog') {
|
|
var deviceid = getItem(link['Antecedent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'DeviceID')['Value'];
|
|
var policyConditionName = getItem(link['Dependent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'PolicyConditionName')['Value'];
|
|
var watchdog = getItem(xxWatchdog['AMT_AgentPresenceWatchdog'].responses, 'DeviceID', deviceid);
|
|
var transitionPolicy = getItem(xxWatchdog['AMT_StateTransitionCondition'].responses, 'PolicyConditionName', policyConditionName);
|
|
if (!watchdog.transitions) watchdog.transitions = [];
|
|
watchdog.transitions.push(transitionPolicy);
|
|
}
|
|
if (x1 && x1['Value'] == 'AMT_StateTransitionCondition') {
|
|
var policyConditionName = getItem(link['Antecedent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'PolicyConditionName')['Value'];
|
|
var policyActionName = getItem(link['Dependent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'PolicyActionName')['Value'];
|
|
var transitionPolicy = getItem(xxWatchdog['AMT_StateTransitionCondition'].responses, 'PolicyConditionName', policyConditionName);
|
|
var watchdogAction = getItem(xxWatchdog['AMT_AgentPresenceWatchdogAction'].responses, 'PolicyActionName', policyActionName);
|
|
if (!transitionPolicy.actions) transitionPolicy.actions = [];
|
|
transitionPolicy.actions.push(watchdogAction);
|
|
}
|
|
}
|
|
|
|
updateWatchdog();
|
|
QV('go19', true); // Show Agent Presence panel
|
|
}
|
|
}
|
|
|
|
var watchdogEnabledStates = [ "Desconocido", "Otro", "Habilitado", "Discapacitado", "Apagando", "No aplica", "Habilitado pero sin conexión", "En prueba", "Diferido", "Quietud", "Comenzando" ];
|
|
var watchdogMonitoredEntity = [ "Desconocido", "Otro", "Sistema operativo", "Proceso de arranque del sistema operativo", "Proceso de apagado del sistema operativo", "Proceso de arranque del firmware", "Proceso de arranque del BIOS", "Solicitud", "Procesador de servicio" ];
|
|
function updateWatchdog() {
|
|
if (xxWatchdog == null) return;
|
|
var x = '';
|
|
|
|
// Global Agent Presense Values
|
|
x += TableStart();
|
|
x += TableEntry("Watchdogs máximos", xxWatchdog['AMT_AgentPresenceCapabilities'].response['MaxTotalAgents'] + " perros guardianes");
|
|
x += TableEntry("Máximo total de acciones", xxWatchdog['AMT_AgentPresenceCapabilities'].response['MaxTotalActions'] + " comportamiento");
|
|
// x += TableEntry("Maximum EAC Watchdogs", xxWatchdog['AMT_AgentPresenceCapabilities'].response['MaxEacAgents'] + " watchdogs");
|
|
x += TableEnd() + '<br>';
|
|
|
|
// Watchdogs
|
|
x += TableStart2();
|
|
x += '<tr><td class=r1 style=padding-left:15px><br>' + "Administre los perros guardianes de presencia de agente Intel® AMT." + '<br><br>';
|
|
if ((xxWatchdog['AMT_AgentPresenceWatchdog'].responses == null) || (xxWatchdog['AMT_AgentPresenceWatchdog'].responses.length == 0)) {
|
|
x += '<div style=padding-left:15px><i>' + "No se encontró ningún agente de vigilancia de presencia de agentes." + '</i></div><br>';
|
|
} else {
|
|
for (var i in xxWatchdog['AMT_AgentPresenceWatchdog'].responses) {
|
|
var w = xxWatchdog['AMT_AgentPresenceWatchdog'].responses[i];
|
|
var n = guidToStr(rstr2hex(atob(w['DeviceID'])));
|
|
if (w['MonitoredEntityDescription'] && w['MonitoredEntityDescription'] != '') n = EscapeHtml(w['MonitoredEntityDescription']);
|
|
x += '<div class=itemBar onclick=showWatchdogDetails(' + i + ')><input type=button style=float:right value="' + "Agregar acción ..." + '" onclick=addWatchdogAction(event,' + i + ')>';
|
|
if (w.transitions) { x += '<input type=button style=float:right value="' + "Eliminar acciones ..." + '" onclick=deleteWatchdogActions(event,' + i + ')>'; }
|
|
x += '<div style=padding-top:3px><b>' + n + '</b>, ' + amtstack.WatchdogCurrentStates[w['CurrentState']] + '</div>';
|
|
var xx = '';
|
|
for (var j in w.transitions) {
|
|
var t = w.transitions[j];
|
|
if (xx != '') xx += '<br>';
|
|
xx += getWatchdogTransitionStr(t['OldState']) + ' → ' + getWatchdogTransitionStr(t['NewState']);
|
|
if (t.actions) {
|
|
var action = t.actions[0];
|
|
if (action['EventOnTransition'] == true) { xx += " : Evento para registrar"; }
|
|
}
|
|
}
|
|
if (xx != '') { x += '<div style=padding:12px>' + xx + '</div>'; }
|
|
x += '</div>';
|
|
}
|
|
}
|
|
x += '<br>';
|
|
x += TableEnd(AddRefreshButton('PullWatchdog()') + AddButton("Añadir perro guardián ...", 'AddWatchdog()'));
|
|
x += '<br>';
|
|
|
|
QH('id_TableSystemAgentPresence', x);
|
|
}
|
|
|
|
function getWatchdogTransitionStr(s) {
|
|
if (s == 31) return "Cualquier estado";
|
|
var x = '';
|
|
for (var i in amtstack.WatchdogCurrentStates) { if ((s & i) != 0) { x += ', ' + amtstack.WatchdogCurrentStates[i]; } }
|
|
return x.substring(2);
|
|
}
|
|
|
|
function showWatchdogDetails(i) {
|
|
var w = xxWatchdog['AMT_AgentPresenceWatchdog'].responses[i];
|
|
|
|
var x = '';
|
|
//x += addHtmlValue("DeviceID", guidToStr(rstr2hex(atob(w['DeviceID']))));
|
|
if (w['MonitoredEntityDescription'] && w['MonitoredEntityDescription'] != '') x += addHtmlValue("Descripción", EscapeHtml(w['MonitoredEntityDescription']));
|
|
x += addHtmlValue("Entidad monitoreada", watchdogMonitoredEntity[w['MonitoredEntity']]);
|
|
x += addHtmlValue("Estado actual", amtstack.WatchdogCurrentStates[w['CurrentState']]);
|
|
x += addHtmlValue("Estado habilitado", watchdogEnabledStates[w['EnabledState']]);
|
|
x += addHtmlValue("Intervalo de inicio", w['StartupInterval'] + " segundos)");
|
|
x += addHtmlValue("Intervalo de tiempo de espera", w['TimeoutInterval'] + " segundos)");
|
|
|
|
setDialogMode(11, format("Perro guardián {0}", guidToStr(rstr2hex(atob(w['DeviceID'])))), 5, showWatchdogDetailsOk, x, w);
|
|
}
|
|
|
|
function showWatchdogDetailsOk(x, w) {
|
|
if (x == 2) {
|
|
amtstack.Delete('AMT_AgentPresenceWatchdog', { 'DeviceID': w['DeviceID'] }, PullWatchdog);
|
|
}
|
|
}
|
|
|
|
function AddWatchdog() {
|
|
var x = '';
|
|
x += '<div style=height:26px;margin-top:4px><input id=wgname style=float:right;width:240px maxlength=16 onkeyup=AddWatchdogUpdate()><div style=padding-top:4px>' + "Nombre" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input id=wgguid style=float:right;width:240px maxlength=36 onkeyup=AddWatchdogUpdate()><div style=padding-top:4px title="' + "Generar DeviceID aleatorio" + '">' + addLink("ID del dispositivo", 'GenerateWatchdogGuid()') + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input id=wgstart style=float:right;width:240px maxlength=8 placeholder=3600 onkeyup=AddWatchdogUpdate()><div style=padding-top:4px>' + "Inicio (segundos)" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input id=wgtimeout style=float:right;width:240px maxlength=8 placeholder=60 onkeyup=AddWatchdogUpdate()><div style=padding-top:4px>' + "Tiempo de espera (segundos)" + '</div></div>';
|
|
setDialogMode(11, "Agregar perro guardián", 3, AddWatchdogOk, x);
|
|
AddWatchdogUpdate();
|
|
}
|
|
|
|
function GenerateWatchdogGuid() {
|
|
var i, guid = '';
|
|
for (i = 0; i < 16; i++) { guid += String.fromCharCode(random(255)); }
|
|
Q('wgguid').value = guidToStr(rstr2hex(guid));
|
|
AddWatchdogUpdate();
|
|
}
|
|
|
|
function AddWatchdogUpdate() {
|
|
var ok = (Q('wgstart').value == '' || parseInt(Q('wgstart').value) > 0) && (Q('wgtimeout').value == '' || parseInt(Q('wgtimeout').value) > 0);
|
|
var gc = 0, g = Q('wgguid').value.toLowerCase();
|
|
for (var i = 0; i < g.length; i++) {
|
|
var c = g.charCodeAt(i);
|
|
if (c == 45) continue;
|
|
if ((c >= 48 && c <= 57) || (c >= 97 && c <= 102)) { gc++; } else { ok = false; }
|
|
}
|
|
if (gc != 32) ok = false;
|
|
QE('dlgOkButton', ok);
|
|
}
|
|
|
|
function AddWatchdogOk() {
|
|
var timeout = Q('wgtimeout').value, startup = Q('wgstart').value;
|
|
if (timeout == '') timeout = 60;
|
|
if (startup == '') startup = 3600;
|
|
var guid = btoa(hex2rstr(guidToStr(Q('wgguid').value.replace(/-/g, '')).replace(/-/g, '')));
|
|
var wdog = { 'CreationClassName': 0, 'DeviceID': guid, 'StartupInterval': startup, 'SystemCreationClassName': 0, 'SystemName': 0, 'TimeoutInterval': timeout, 'MonitoredEntityDescription': Q('wgname').value };
|
|
amtstack.Create('AMT_AgentPresenceWatchdog', wdog, AddWatchdogOk2);
|
|
}
|
|
|
|
function AddWatchdogOk2(stack, name, responses, status) {
|
|
if (status != 200) {
|
|
messagebox("Perro guardián", "No se puede agregar el perro guardián, error #" + status);
|
|
} else {
|
|
PullWatchdog();
|
|
}
|
|
}
|
|
|
|
function addWatchdogAction(e, i) {
|
|
var w = xxWatchdog['AMT_AgentPresenceWatchdog'].responses[i];
|
|
var x = '<table>';
|
|
x += '<td style=width:180px>' + "Desde" + '<br>'
|
|
for (var i in amtstack.WatchdogCurrentStates) {
|
|
x += '<input id=wgsa' + i + ' type=checkbox onclick=addWatchdogActionUpdate()> ' + amtstack.WatchdogCurrentStates[i] + '<br />';
|
|
}
|
|
x += '<td>' + "A" + '<br>'
|
|
for (var i in amtstack.WatchdogCurrentStates) {
|
|
x += '<input id=wgsb' + i + ' type=checkbox onclick=addWatchdogActionUpdate()> ' + amtstack.WatchdogCurrentStates[i] + '<br />';
|
|
}
|
|
x += '</table><br>' + "Realizar una acción" + '<br><input id=wgsevent type=checkbox checked onclick=addWatchdogActionUpdate()>' + "Escribir en el registro de eventos" + '<br />';
|
|
setDialogMode(11, "Agregar acción de vigilancia", 3, addWatchdogActionOk, x, w);
|
|
addWatchdogActionUpdate();
|
|
haltEvent(e);
|
|
}
|
|
|
|
function addWatchdogActionUpdate() {
|
|
var tfrom = 0, tto = 0;
|
|
for (var i in amtstack.WatchdogCurrentStates) {
|
|
if (Q('wgsa' + i).checked == true) tfrom += parseInt(i);
|
|
if (Q('wgsb' + i).checked == true) tto += parseInt(i);
|
|
}
|
|
QE('dlgOkButton', tfrom > 0 && tto > 0 && Q('wgsevent').checked == true);
|
|
}
|
|
|
|
function addWatchdogActionOk(b, w) {
|
|
var tfrom = 0, tto = 0;
|
|
for (var i in amtstack.WatchdogCurrentStates) {
|
|
if (Q('wgsa' + i).checked == true) tfrom += parseInt(i);
|
|
if (Q('wgsb' + i).checked == true) tto += parseInt(i);
|
|
}
|
|
amtstack.AMT_AgentPresenceWatchdog_AddAction(tfrom, tto, Q('wgsevent').checked, null, null, AddWatchdogActionResponse, null, 0, { 'DeviceID': w['DeviceID'] });
|
|
}
|
|
|
|
function AddWatchdogActionResponse(stack, name, responses, status) {
|
|
if (status != 200) {
|
|
messagebox("Acción de vigilancia", "No se puede agregar la acción de vigilancia, error #" + status);
|
|
} else {
|
|
PullWatchdog();
|
|
}
|
|
}
|
|
|
|
function deleteWatchdogActions(e, i) {
|
|
var w = xxWatchdog['AMT_AgentPresenceWatchdog'].responses[i];
|
|
setDialogMode(11, "Eliminar acciones de vigilancia", 3, deleteWatchdogActionsOk, "¿Eliminar todas las acciones para este perro guardián?", w);
|
|
haltEvent(e);
|
|
}
|
|
|
|
function deleteWatchdogActionsOk(b, w) {
|
|
amtstack.AMT_AgentPresenceWatchdog_DeleteAllActions(deleteWatchdogActionResponse, null, 0, { 'DeviceID': w['DeviceID'] });
|
|
}
|
|
|
|
function deleteWatchdogActionResponse(stack, name, responses, status) {
|
|
if (status != 200) {
|
|
messagebox("Acción de vigilancia", "No se pueden eliminar las acciones de vigilancia, error #" + status);
|
|
} else {
|
|
PullWatchdog();
|
|
}
|
|
}
|
|
|
|
// ###END###{AgentPresence}
|
|
|
|
// ###BEGIN###{SystemDefense}
|
|
|
|
//
|
|
// SYSTEM DEFENSE PANEL
|
|
//
|
|
|
|
var xxSystemDefense = null;
|
|
var xxSystemDefenceLinkedPolicy = {};
|
|
var xxUpdatingDefenseStats = false;
|
|
var xxFilterStatistics = [{}, {}]; // Wired and wireless interface stats
|
|
var xxFilterStatisticsTimer = null;
|
|
var xxFilterStatisticsTimerActive = false;
|
|
|
|
var xxSystemDefenceFilterEthernetTypes = { 2048: "Todos los paquetes IP", 2054: "Todos los paquetes ARP" };
|
|
var xxSystemDefenceFilterIPTypes = { 4: "IPv4", 6: "IPv6" };
|
|
var xxSystemDefenceFilterDesc = { 0: "Permitir, contar", 1: "Drop, Count", 2: "Límite de tarifa", 3: "Permitir", 4: "soltar" };
|
|
var xxSystemDefenceFilters = { 'HdrProtocolID': 1, 'HdrDestAddress': 2, 'HdrDestMask': 2, 'HdrSrcAddress': 2, 'HdrSrcMask': 2, 'HdrSrcPortStart': 1, 'HdrSrcPortEnd': 1, 'HdrDestPortStart': 1, 'HdrDestPortEnd': 1, 'HdrSrcAddressEndOfRange': 2, 'HdrDestAddressEndOfRange ': 2, 'TCPFlagsOn': 3, 'TCPFlagsOff': 3 };
|
|
|
|
function PullSystemDefense() {
|
|
amtFirstPull |= 4;
|
|
amtstack.BatchEnum(null, ['AMT_SystemDefensePolicy', 'AMT_NetworkPortSystemDefensePolicy', 'AMT_Hdr8021Filter', 'AMT_IPHeadersFilter', 'AMT_NetworkFilter'], PullSystemDefenseResponse);
|
|
}
|
|
|
|
function PullSystemDefenseResponse(stack, name, responses, status) {
|
|
if (status == 200) {
|
|
xxSystemDefense = responses;
|
|
updateSystemDefense();
|
|
QV('go18', true); // Show System Defense Panel
|
|
if (urlvars['norefresh']) { UpdateDefenseStats(); } // If norefresh is set, pull the system defense stats now.
|
|
}
|
|
}
|
|
|
|
function updateSystemDefense() {
|
|
if (xxSystemDefense == null) return;
|
|
var x = '';
|
|
|
|
// Get active policies
|
|
xxSystemDefenceLinkedPolicy = {};
|
|
for (var i in xxSystemDefense['AMT_NetworkPortSystemDefensePolicy'].responses) {
|
|
var link = xxSystemDefense['AMT_NetworkPortSystemDefensePolicy'].responses[i];
|
|
var a = +getItem(link['Antecedent']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'DeviceID')['Value'].substring(27);
|
|
var b = link['Dependent']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
|
|
var p = getItem(xxSystemDefense['AMT_SystemDefensePolicy'].responses, 'InstanceID', b);
|
|
xxSystemDefenceLinkedPolicy[a] = p;
|
|
}
|
|
|
|
// Global System Defense settings
|
|
x += TableStart();
|
|
var policyname = ('<i>' + "Ninguna" + '</i>');
|
|
if (xxSystemDefenceLinkedPolicy[0]) { policyname = xxSystemDefenceLinkedPolicy[0]['PolicyName']; }
|
|
x += TableEntry("Política cableada predeterminada", addLink(policyname, 'changeDefaultPolicy(0)'));
|
|
/*
|
|
policyname = ('<i>' + "None" + '</i>');
|
|
if (xxSystemDefenceLinkedPolicy[1]) { policyname = xxSystemDefenceLinkedPolicy[1]['PolicyName']; }
|
|
x += TableEntry("Default Wireless Policy", addLink(policyname, 'changeDefaultPolicy(1)'));
|
|
*/
|
|
|
|
// Filter Statistics
|
|
for (var i = 0; i < 2; i++) {
|
|
var f = xxFilterStatistics[i];
|
|
for (var j in f) {
|
|
var c = f[j];
|
|
if (c == 1) c += " paquete"; else c += " paquetes";
|
|
var jn = ((i==0)?"Cableado":"Inalámbrico") + j;
|
|
x += TableEntry(jn, c);
|
|
}
|
|
}
|
|
x += TableEnd();
|
|
x += '<br>';
|
|
|
|
x += TableStart2();
|
|
x += '<tr><td class=r1 style=padding-left:15px;border:0><br>' + "Administre las políticas de defensa del sistema Intel® AMT." + '<br><br>';
|
|
if (xxSystemDefense['AMT_SystemDefensePolicy'].responses.length == 0) {
|
|
x += '<div style=padding-left:15px><i>' + "No se encontraron políticas de defensa del sistema." + '</i></div><br>';
|
|
} else {
|
|
for (var i in xxSystemDefense['AMT_SystemDefensePolicy'].responses) {
|
|
var policy = xxSystemDefense['AMT_SystemDefensePolicy'].responses[i];
|
|
var desc = '';
|
|
if (policy['FilterCreationHandles']) {
|
|
policy['FilterCreationHandles'] = MakeToArray(policy['FilterCreationHandles']);
|
|
var c = policy['FilterCreationHandles'].length;
|
|
desc = ', ' + c + ' filter' + (c > 1?'s':'');
|
|
}
|
|
x += '<div class=itemBar onclick=showPolicyDetails(' + i + ')><div style=padding-top:3px><b>' + EscapeHtml(policy['PolicyName']) + '</b>' + desc + '</div></div>';
|
|
}
|
|
}
|
|
|
|
x += '<tr><td class=r1 style=padding-left:15px><br>' + "Administre los filtros de defensa del sistema Intel® AMT." + '<br><br>';
|
|
if (xxSystemDefense['AMT_Hdr8021Filter'].responses.length == 0 && xxSystemDefense['AMT_IPHeadersFilter'].responses.length == 0) {
|
|
x += '<div style=padding-left:15px><i>' + "No se encontraron filtros de defensa del sistema." + '</i></div><br>';
|
|
} else {
|
|
for (var i in xxSystemDefense['AMT_Hdr8021Filter'].responses) {
|
|
var filter = xxSystemDefense['AMT_Hdr8021Filter'].responses[i];
|
|
var desc = xxSystemDefenceFilterEthernetTypes[filter['HdrProtocolID8021']];
|
|
if (!desc) desc = "Todo el protocolo de Ethernet" + filter['HdrProtocolID8021'];
|
|
desc += ', ' + xxSystemDefenceFilterDesc[filter['FilterProfile']];
|
|
if (filter['FilterProfile'] == 2) { desc += " a" + filter['FilterProfileData'] + " paquete / seg"; }
|
|
if (filter['ActionEventOnMatch'] == true) desc += ", Evento en partido";
|
|
x += '<div class=itemBar onclick=showFilterDetails(0,' + i + ')><div style=padding-top:3px><b>' + (filter['FilterDirection'] == 0 ? '← ' : '→ ') + EscapeHtml(filter['Name']) + '</b>, ' + desc + '</div></div>';
|
|
}
|
|
for (var i in xxSystemDefense['AMT_IPHeadersFilter'].responses) {
|
|
var filter = xxSystemDefense['AMT_IPHeadersFilter'].responses[i];
|
|
var desc = xxSystemDefenceFilterIPTypes[filter['HdrIPVersion']];
|
|
if (!desc) desc = "Todo el protocolo de Ethernet" + filter['HdrIPVersion'];
|
|
desc += ', ' + xxSystemDefenceFilterDesc[filter['FilterProfile']];
|
|
if (filter['FilterProfile'] == 2) { desc += " a" + filter['FilterProfileData'] + " paquete / seg"; }
|
|
if (filter['ActionEventOnMatch'] == true) desc += ", Evento en partido";
|
|
var filtercount = 0;
|
|
for (var j in xxSystemDefenceFilters) { if (filter[j]) filtercount++; }
|
|
if (filtercount > 0) desc += ', ' + filtercount + ' filter' + (filtercount>1?'s':'');
|
|
x += '<div class=itemBar onclick=showFilterDetails(1,' + i + ')><div style=padding-top:3px><b>' + (filter['FilterDirection'] == 0 ? '← ' : '→ ') + EscapeHtml(filter['Name']) + '</b>, ' + desc + '</div></div>';
|
|
}
|
|
}
|
|
x += '<br><td class=r1>' + TableEnd(AddRefreshButton('PullSystemDefense()') + /*AddButton("Update Stats", 'UpdateDefenseStats()') +*/ AddButton("Añadir filtro...", 'AddDefenseFilter()') + AddButton("Agregar política ...", 'AddDefensePolicy()'));
|
|
|
|
QH('id_TableSystemDefense', x);
|
|
|
|
if (xxFilterStatisticsTimer == null) {
|
|
xxFilterStatisticsTimerActive = false;
|
|
if (!urlvars['norefresh']) {
|
|
UpdateDefenseStats();
|
|
xxFilterStatisticsTimer = setInterval(UpdateDefenseStats, 5000);
|
|
}
|
|
}
|
|
}
|
|
|
|
function StopDefenseStatsTimer() {
|
|
if (xxFilterStatisticsTimer != null) { clearInterval(xxFilterStatisticsTimer); xxFilterStatisticsTimer = null; }
|
|
xxFilterStatisticsTimerActive = false;
|
|
}
|
|
|
|
function UpdateDefenseStats(n) {
|
|
if (!n && xxFilterStatisticsTimerActive == true) { return; }
|
|
xxFilterStatisticsTimerActive = true;
|
|
var network = n?n:0;
|
|
if (xxSystemDefenceLinkedPolicy[network]) {
|
|
var eref = '<a:Address></a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_EthernetPort</w:ResourceURI><w:SelectorSet><w:Selector Name="DeviceID">Intel(r) AMT Ethernet Port ' + network + '</w:Selector></w:SelectorSet></a:ReferenceParameters>';
|
|
amtstack.AMT_SystemDefensePolicy_UpdateStatistics(eref, false, UpdateDefenseStats2, network, 0, { 'InstanceID': xxSystemDefenceLinkedPolicy[network]['InstanceID'] });
|
|
} else {
|
|
// No active policy, stop the timer
|
|
xxFilterStatistics[network] = {};
|
|
StopDefenseStatsTimer();
|
|
}
|
|
}
|
|
|
|
function UpdateDefenseStats2(stack, name, responses, status, network) {
|
|
if (status == 200) {
|
|
amtstack.Enum('AMT_ActiveFilterStatistics', UpdateDefenseStats3, network);
|
|
} else {
|
|
StopDefenseStatsTimer();
|
|
}
|
|
}
|
|
|
|
function UpdateDefenseStats3(stack, name, responses, status, network) {
|
|
var count = 0;
|
|
if (status == 200) {
|
|
xxFilterStatistics[network] = {};
|
|
for (var i in responses) {
|
|
var readcount = responses[i]['ReadCount'];
|
|
// var matched = responses[i]['FilterMatched'];
|
|
var name = getItem(responses[i]['Dependent']['ReferenceParameters']['SelectorSet']['Selector'][1]['Value']['EndpointReference']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'Name')['Value'];
|
|
xxFilterStatistics[network][name] = readcount;
|
|
count++;
|
|
}
|
|
updateSystemDefense();
|
|
}
|
|
xxFilterStatisticsTimerActive = false;
|
|
// If there is no statistics, stop the timer
|
|
if (count == 0) { StopDefenseStatsTimer(); } // TODO: Change this to allow for wireless
|
|
}
|
|
|
|
function changeDefaultPolicy(network) {
|
|
if (xxdialogMode) return;
|
|
var x = '';
|
|
x += '<div style=height:26px;margin-top:4px><select id=policySelection style=float:right;width:266px><option value=-1>' + "Ninguna";
|
|
for (var i in xxSystemDefense['AMT_SystemDefensePolicy'].responses) { x += '<option value=' + i + ((xxSystemDefenceLinkedPolicy[network] && xxSystemDefense['AMT_SystemDefensePolicy'].responses[i]['InstanceID'] == xxSystemDefenceLinkedPolicy[network]['InstanceID']) ? ' selected' : '') + '>' + xxSystemDefense['AMT_SystemDefensePolicy'].responses[i]['PolicyName']; }
|
|
x += '</select><div style=padding-top:4px>' + "Política predeterminada" + '</div></div>';
|
|
setDialogMode(11, "Política predeterminada de defensa del sistema", 3, changeDefaultPolicyOk, x, network);
|
|
}
|
|
|
|
function changeDefaultPolicyOk(button, network) {
|
|
var i = Q('policySelection').value;
|
|
var oldpolicy = xxSystemDefenceLinkedPolicy[network];
|
|
if (oldpolicy) { amtstack.Delete('AMT_NetworkPortSystemDefensePolicy', '<w:SelectorSet><w:Selector Name="Antecedent"><a:EndpointReference xmlns:b="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:c="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_EthernetPort</w:ResourceURI><w:SelectorSet><w:Selector Name="CreationClassName">CIM_EthernetPort</w:Selector><w:Selector Name="DeviceID">Intel(r) AMT Ethernet Port ' + network + '</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference></w:Selector><w:Selector Name="Dependent"><a:EndpointReference xmlns:b="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:c="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://intel.com/wbem/wscim/1/amt-schema/1/AMT_SystemDefensePolicy</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">' + oldpolicy['InstanceID'] + '</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference></w:Selector></w:SelectorSet>', ((i == -1) ? PullSystemDefense : function () { })); }
|
|
|
|
if (i >= 0) {
|
|
var policy = xxSystemDefense['AMT_SystemDefensePolicy'].responses[i];
|
|
var eref = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_EthernetPort</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="DeviceID">' + "Puerto Ethernet Intel (r) AMT" + ' ' + network + '</Selector></SelectorSet></ReferenceParameters>';
|
|
var pref = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_SystemDefensePolicy</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">' + policy['InstanceID'] + '</Selector></SelectorSet></ReferenceParameters>';
|
|
amtstack.Create('AMT_NetworkPortSystemDefensePolicy', { 'Antecedent': eref, 'Dependent': pref }, changeDefaultPolicyOk2);
|
|
}
|
|
}
|
|
|
|
function changeDefaultPolicyOk2(stack, name, responses, status) {
|
|
if (status != 200) {
|
|
messagebox("Política predeterminada de defensa del sistema", "No se puede establecer la política, error" + status);
|
|
} else {
|
|
PullSystemDefense();
|
|
}
|
|
}
|
|
|
|
function AddDefenseFilter() {
|
|
if (xxdialogMode) return;
|
|
var x = '';
|
|
x += '<div style=height:26px;margin-top:4px><input id=filtername style=float:right;width:260px maxlength=16 onkeyup=AddDefenseFilterUpdate()><div style=padding-top:4px>' + "Nombre" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><select id=filtertype style=float:right;width:266px onchange=AddDefenseFilterUpdate()><option value=0>' + "Filtro de paquete IP Ethernet" + '<option value=1>' + "Filtro de paquetes Ethernet ARP" + '<option value=2>' + "Filtro de paquetes IPv4" + '<option value=3>' + "Filtro de paquetes IPv6" + '</select><div style=padding-top:4px>' + "Tipo" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px id=ipfilterdiv><input id=ipfilter style=float:right;width:260px placeholder=\"' + "Reglas opcionales" + '\" onkeyup=AddDefenseFilterUpdate()><div style=padding-top:4px>' + "Reglas a juego" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><select id=filterdir style=float:right;width:266px onchange=AddDefenseFilterUpdate()><option value=0>' + "Saliente / Transmitir" + '<option value=1>' + "Entrante / Recibir" + '</select><div style=padding-top:4px>' + "Dirección" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><select id=filterprofile style=float:right;width:266px onchange=AddDefenseFilterUpdate()><option value=0>' + "Permitir, contar" + '<option value=1>' + "Drop, Count" + '<option value=2>' + "Límite de tarifa" + '<option value=3>' + "Permitir" + '<option value=4>' + "soltar" + '</select><div style=padding-top:4px>' + "Acción" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px id=filterdatadiv><input id=filterdata style=float:right;width:260px maxlength=8 onkeyup=AddDefenseFilterUpdate()><div style=padding-top:4px>' + "Paquetes / segundo" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><select id=filteraction style=float:right;width:266px onchange=AddDefenseFilterUpdate()><option value=false>' + "Hacer nada" + '<option value=1>' + "Evento en partido" + '</select><div style=padding-top:4px>' + "Registro de eventos" + '</div></div>';
|
|
setDialogMode(11, "Agregar filtro de defensa del sistema", 3, AddDefenseFilterOk, x);
|
|
AddDefenseFilterUpdate();
|
|
}
|
|
|
|
function AddDefenseFilterOk() {
|
|
if (Q('filtertype').value <= 1) {
|
|
// Add Ethernet IP or ARP filter
|
|
var protocol = (Q('filtertype').value == 0) ? 2048 : 2054; // IP : ARP
|
|
var filter = { 'InstanceID ': 0, 'Name': Q('filtername').value, 'CreationClassName': 0, 'SystemName': 0, 'SystemCreationClassName': 0, 'HdrProtocolID8021': protocol, 'FilterProfile': Q('filterprofile').value, 'FilterDirection': Q('filterdir').value, 'ActionEventOnMatch': Q('filteraction').value };
|
|
if (Q('filterprofile').value == 2) filter['FilterProfileData'] = Q('filterdata').value;
|
|
amtstack.Create('AMT_Hdr8021Filter', filter, AddDefenseFilterOk2);
|
|
} else {
|
|
// Add IPv4 or IPv6 Filter
|
|
var protocol = (Q('filtertype').value == 2) ? 4 : 6; // IPv4 : IPv6
|
|
var filter = { 'InstanceID ': 0, 'Name': Q('filtername').value, 'CreationClassName': 0, 'SystemName': 0, 'SystemCreationClassName': 0, 'HdrIPVersion': protocol, 'FilterProfile': Q('filterprofile').value, 'FilterDirection': Q('filterdir').value, 'ActionEventOnMatch': Q('filteraction').value };
|
|
|
|
// Parse the filter string
|
|
// https://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide/default.htm?turl=HTMLDocuments%2FWS-Management_Class_Reference%2FAMT_Hdr8021Filter.htm
|
|
var filterstrs = Q('ipfilter').value.split(',');
|
|
for (var i in filterstrs) {
|
|
var xx = filterstrs[i].indexOf('=');
|
|
var n = filterstrs[i].substring(0, xx);
|
|
var v = filterstrs[i].substring(xx + 1);
|
|
var t = xxSystemDefenceFilters[n];
|
|
if (!t) { n = "Hdr" + n; t = xxSystemDefenceFilters[n]; }
|
|
if (t) {
|
|
// TODO: Parse v (the value) based on the type t.
|
|
if (t == 2 && protocol == 4) {
|
|
// IPv4 address
|
|
var ipsplit = v.split('.');
|
|
if (ipsplit.length == 4) {
|
|
//filter[n] = btoa(String.fromCharCode(parseInt(ipsplit[0]), parseInt(ipsplit[1]), parseInt(ipsplit[2]), parseInt(ipsplit[3])));
|
|
//filter[n] = [ parseInt(ipsplit[0]), parseInt(ipsplit[1]), parseInt(ipsplit[2]), parseInt(ipsplit[3]) ];
|
|
filter[n] = rstr2hex(String.fromCharCode(parseInt(ipsplit[0]), parseInt(ipsplit[1]), parseInt(ipsplit[2]), parseInt(ipsplit[3])));
|
|
}
|
|
} else {
|
|
// Other values
|
|
filter[n] = v;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (Q('filterprofile').value == 2) filter['FilterProfileData'] = Q('filterdata').value;
|
|
amtstack.Create('AMT_IPHeadersFilter', filter, AddDefenseFilterOk2);
|
|
}
|
|
}
|
|
|
|
function AddDefenseFilterUpdate() {
|
|
var ok = Q('filtername').value.length > 0;
|
|
if (ok && Q('filterprofile').value == 2) { var i = parseInt(Q('filterdata').value); ok = (i > 0 && i < 0xFFFFFFFF); }
|
|
QE('idx_dlgOkButton', ok);
|
|
QV('filterdatadiv', Q('filterprofile').value == 2);
|
|
QV('ipfilterdiv', Q('filtertype').value >= 2);
|
|
}
|
|
|
|
function AddDefenseFilterOk2(stack, name, responses, status) {
|
|
if (status != 200) {
|
|
messagebox("Agregar filtro de defensa del sistema", "No se puede agregar el filtro, error #" + status);
|
|
} else {
|
|
PullSystemDefense();
|
|
}
|
|
}
|
|
|
|
function showFilterDetails(t, i) {
|
|
if (xxdialogMode) return;
|
|
var desc, filter, type, tn;
|
|
if (t == 0) {
|
|
tn = 'AMT_Hdr8021Filter';
|
|
type = "Tráfico Ethernet";
|
|
filter = xxSystemDefense[tn].responses[i];
|
|
desc = xxSystemDefenceFilterEthernetTypes[filter['HdrProtocolID8021']];
|
|
if (!desc) desc = "Todo el protocolo de Ethernet" + filter['HdrProtocolID8021'];
|
|
} else {
|
|
tn = 'AMT_IPHeadersFilter';
|
|
type = "Tráfico IP";
|
|
filter = xxSystemDefense[tn].responses[i];
|
|
desc = xxSystemDefenceFilterIPTypes[filter['HdrIPVersion']];
|
|
if (!desc) desc = "Todo el protocolo IP" + filter['HdrIPVersion'];
|
|
}
|
|
var x = '';
|
|
x += addHtmlValue("Nombre", EscapeHtml(filter['Name']));
|
|
x += addHtmlValue("Tipo", type);
|
|
x += addHtmlValue("Tráfico a juego", desc);
|
|
x += addHtmlValue("Dirección", filter['FilterDirection'] == 0 ? 'Outbound / Transmit' : 'Inbound / Receive');
|
|
if (t == 1) {
|
|
for (var j in xxSystemDefenceFilters) {
|
|
if (filter[j]) {
|
|
var n = j, v = filter[j], t = xxSystemDefenceFilters[j];
|
|
if (t == 2 && v.length == 4) { v = hex2rstr(v); v = v.charCodeAt(0) + '.' + v.charCodeAt(1) + '.' + v.charCodeAt(2) + '.' + v.charCodeAt(3); }
|
|
if (n.startsWith('Hdr')) n = n.substring(3);
|
|
x += addHtmlValue("Filtrar" + n, v);
|
|
}
|
|
}
|
|
}
|
|
x += addHtmlValue("Evento en partido", (filter['ActionEventOnMatch'] == true) ? 'Yes' : 'No');
|
|
setDialogMode(11, "Filtro Ethernet #" + filter['InstanceID'], 5, showFilterDetailsOk, x, [tn, filter]);
|
|
}
|
|
|
|
function showFilterDetailsOk(b, tag) {
|
|
if (b == 2) { amtstack.Delete(tag[0], tag[1], deleteDefenseFilter); }
|
|
}
|
|
|
|
function deleteDefenseFilter(stack, name, responses, status) {
|
|
if (status != 200) {
|
|
messagebox("Eliminar filtro", "No se puede quitar el filtro, asegúrese de que no esté en uso.");
|
|
} else {
|
|
PullSystemDefense();
|
|
}
|
|
}
|
|
|
|
var xxAddDefensePolicyFilters;
|
|
function AddDefensePolicy() {
|
|
if (xxdialogMode) return;
|
|
xxAddDefensePolicyFilters = [];
|
|
var x = '';
|
|
x += '<div style=height:26px;margin-top:4px><input id=policyname title="<policy name>:<policy precedence number>" style=float:right;width:260px maxlength=16 onkeyup=AddDefensePolicyUpdate()><div style=padding-top:4px>' + "Nombre" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><select id=policytx title="' + "Acción predeterminada a tomar para el tráfico saliente" + '" style=float:right;width:133px><option value=0>Allow<option value=1>' + "soltar" + '<option value=2>' + "Permitir, contar" +'<option value=3>' + "Drop, Count" + '<option value=4>' + "Permitir, contar, evento" + '<option value=5>' + "Drop, Count, Event" + '</select><select id=policyrx style=float:right;width:133px title="' + "Acción predeterminada a tomar para el tráfico entrante" + '"><option value=0>' + "Permitir" + '<option value=1>' + "soltar" + '<option value=2>' + "Permitir, contar" + '<option value=3>' + "Drop, Count" + '<option value=4>' + "Permitir, contar, evento" + '<option value=5>' + "Drop, Count, Event" + '</select><div style=padding-top:4px>' + "TX / RX predeterminado" + '</div></div>';
|
|
x += '<div id=policyFilters></div>';
|
|
if (xxSystemDefense['AMT_Hdr8021Filter'].responses.length > 0 || xxSystemDefense['AMT_IPHeadersFilter'].responses.length > 0) {
|
|
x += '<div style=height:26px;margin-top:4px><div style=float:right><select id=xfilter style=width:186px>';
|
|
for (var i in xxSystemDefense['AMT_Hdr8021Filter'].responses) {
|
|
var filter = xxSystemDefense['AMT_Hdr8021Filter'].responses[i];
|
|
x += '<option value=' + filter['InstanceID'] + '>' + filter['Name'];
|
|
}
|
|
for (var i in xxSystemDefense['AMT_IPHeadersFilter'].responses) {
|
|
var filter = xxSystemDefense['AMT_IPHeadersFilter'].responses[i];
|
|
x += '<option value=' + filter['InstanceID'] + '>' + filter['Name'];
|
|
}
|
|
x += '</select><input id=addFilterButton type=button value=Add style=width:80px onclick=addFilterButton()></div><div style=padding-top:4px>' + "Añadir filtro" + '</div></div>';
|
|
}
|
|
setDialogMode(11, "Agregar política de defensa del sistema", 3, AddDefensePolicyOk, x);
|
|
AddDefensePolicyUpdate();
|
|
}
|
|
|
|
function addFilterButton() {
|
|
if (xxAddDefensePolicyFilters.indexOf(Q('xfilter').value) >= 0) return;
|
|
xxAddDefensePolicyFilters.push(Q('xfilter').value);
|
|
AddDefensePolicyUpdate();
|
|
}
|
|
|
|
function removeFilterButton(h) {
|
|
xxAddDefensePolicyFilters.splice(h, 1);
|
|
AddDefensePolicyUpdate();
|
|
}
|
|
|
|
function AddDefensePolicyUpdate() {
|
|
var ok = Q('policyname').value.split(':')[0].length > 0;
|
|
QE('idx_dlgOkButton', ok);
|
|
if (xxAddDefensePolicyFilters.length == 0) {
|
|
QH('policyFilters', '<br><i>' + "Esta política no contiene filtros." + '</i><br><br>');
|
|
} else {
|
|
var x = '';
|
|
for (var i in xxAddDefensePolicyFilters) {
|
|
x += '<div class=itemBar style=margin-right:0><div style=float:right>' + AddButton2("Eliminar", 'removeFilterButton(' + i + ')') + '</div><div style=padding-top:3px;max-width:260px;overflow:hidden><b>' + GetFilterById(xxAddDefensePolicyFilters[i])['Name'] + '</b></div></div>';
|
|
}
|
|
QH('policyFilters', x);
|
|
}
|
|
}
|
|
|
|
// TODO: Once loaded, we could make a table of "handle -> filter" where both filter types are mixed-in. Could make things simpler/smaller?
|
|
// We would only have one table to loop instead of two at a few places. This function would be removed completely.
|
|
function GetFilterById(h) {
|
|
for (var i in xxSystemDefense['AMT_Hdr8021Filter'].responses) { var filter = xxSystemDefense['AMT_Hdr8021Filter'].responses[i]; if (filter['InstanceID'] == h) return filter; }
|
|
for (var i in xxSystemDefense['AMT_IPHeadersFilter'].responses) { var filter = xxSystemDefense['AMT_IPHeadersFilter'].responses[i]; if (filter['InstanceID'] == h) return filter; }
|
|
}
|
|
|
|
function AddDefensePolicyOk() {
|
|
var tx = Q('policytx').value;
|
|
var rx = Q('policyrx').value;
|
|
var pri = 0;
|
|
var n = Q('policyname').value.split(':');
|
|
if (n.length == 2) pri = parseInt(n[1]);
|
|
var filter = { 'InstanceID ': 0, 'PolicyName': n[0], 'PolicyPrecedence': pri, 'TxDefaultCount': (tx > 1), 'TxDefaultDrop': (tx % 2 == 1), 'TxDefaultMatchEvent': (tx > 3), 'RxDefaultCount': (rx > 1), 'RxDefaultDrop': (rx % 2 == 1), 'RxDefaultMatchEvent': (rx > 3) };
|
|
if (xxAddDefensePolicyFilters.length > 0) filter['FilterCreationHandles'] = xxAddDefensePolicyFilters;
|
|
amtstack.Create('AMT_SystemDefensePolicy', filter, AddDefensePolicyOk2);
|
|
}
|
|
|
|
function AddDefensePolicyOk2(stack, name, responses, status) {
|
|
if (status != 200) {
|
|
messagebox("Agregar política de defensa del sistema", "No se puede agregar la política, error #" + status);
|
|
} else {
|
|
PullSystemDefense();
|
|
}
|
|
}
|
|
|
|
function showPolicyDetails(i) {
|
|
if (xxdialogMode) return;
|
|
var policy = xxSystemDefense['AMT_SystemDefensePolicy'].responses[i];
|
|
var x = '';
|
|
x += addHtmlValue("Nombre", EscapeHtml(policy['PolicyName']));
|
|
if (policy['PolicyPrecedence'] != 0) x += addHtmlValue("Precedencia", policy['PolicyPrecedence']);
|
|
|
|
var action = (policy['TxDefaultDrop'] == true) ? "soltar" : "Permitir";
|
|
if (policy['TxDefaultCount'] == true) action += ", Cuenta";
|
|
if (policy['TxDefaultMatchEvent'] == true) action += "Evento";
|
|
x += addHtmlValue("Acción TX predeterminada", action);
|
|
|
|
action = (policy['RxDefaultDrop'] == true) ? 'Drop' : 'Allow';
|
|
if (policy['RxDefaultCount'] == true) action += ', Count';
|
|
if (policy['RxDefaultMatchEvent'] == true) action += ', Event';
|
|
x += addHtmlValue("Acción RX predeterminada", action);
|
|
|
|
if (policy['FilterCreationHandles']) { for (var i in policy['FilterCreationHandles']) { x += addHtmlValue("Filtro #" + (+i + 1), GetFilterById(policy['FilterCreationHandles'][i])['Name']); } }
|
|
|
|
setDialogMode(11, format("Política #", policy['InstanceID'].substring(20)), 5, showPolicyDetailsOk, x, policy);
|
|
}
|
|
|
|
function showPolicyDetailsOk(b, tag) {
|
|
if (b == 2) { amtstack.Delete('AMT_SystemDefensePolicy', tag, deleteDefensePolicy); }
|
|
}
|
|
|
|
function deleteDefensePolicy(stack, name, responses, status) {
|
|
if (status != 200) {
|
|
messagebox("Eliminar política", "No se puede eliminar la política, asegúrese de que no esté en uso.");
|
|
} else {
|
|
PullSystemDefense();
|
|
}
|
|
}
|
|
|
|
// ###END###{SystemDefense}
|
|
|
|
// ###BEGIN###{NetworkSettings}
|
|
// ###BEGIN###{Wireless}
|
|
|
|
//
|
|
// WIRELESS SETTINGS PANEL
|
|
//
|
|
|
|
var xxWireless;
|
|
function PullWireless() {
|
|
amtFirstPull |= 2;
|
|
try { if (amtwirelessif == -1) return; } catch (e) {} // If the wireless adapter has no MAC, don't show this.
|
|
amtstack.BatchEnum('', ['*CIM_WiFiPortCapabilities', '*CIM_WiFiPort', '*CIM_WiFiEndpoint', 'CIM_WiFiEndpointSettings', '*AMT_WiFiPortConfigurationService', '*AMT_BootCapabilities'], processWireless);
|
|
}
|
|
|
|
function wifiRefresh() { if (!xxdialogMode) PullWireless(); }
|
|
|
|
var xxWifiState = { 3: "Discapacitado", 32768: "Habilitado en S0", 32769: "Habilitado en S0, Sx / AC" };
|
|
var xxRadioState = { 2: "Encendido, conectado", 3: "Apagado", 6: "Encendido, desconectado" };
|
|
var xxWifiAuthenticationMethod = { 1: "Otro", 2: "Abierto", 3: "Llave compartida", 4: "PSK WPA", 5: "WPA IEEE 802.1x", 6: "WPA2 PSK", 7: "WPA2 IEEE 802.1x", 32768: "WPA3 SAE" };
|
|
var xxWifiEncryptionMethod = { 1: "Otro", 2: "WEP", 3: "TKIP-RC4", 4: "CCMP-AES", 5: "Ninguna" }; // For 2 & 5, AuthenticationMethod must be 2 or 3. For 3 & 4 AuthenticationMethod must be 4,5,6 or 7
|
|
|
|
function processWireless(stack, name, responses, status) {
|
|
if (status == 200) { xxWireless = responses; } else { xxWireless = undefined; }
|
|
updateSystemStatus();
|
|
showWirelessInfo();
|
|
}
|
|
|
|
function showWirelessInfo() {
|
|
if (!xxWireless) return;
|
|
var i, j, s = '', sc, x = '<br><h2>' + "Perfiles inalámbricos" + '</h2>';
|
|
if (!(xxWireless['CIM_WiFiPortCapabilities'].response)) return;
|
|
|
|
// Show WIFI profiles sorted by priority
|
|
x += TableStart2();
|
|
x += '<tr><td class=r2 style=padding-left:15px><br>' + "Perfiles inalámbricos que Intel® AMT usará para la conectividad de red." + '<br><br>';
|
|
s = 0;
|
|
for(i = 0; i < 256; i++) {
|
|
for (j in xxWireless['CIM_WiFiEndpointSettings'].responses) {
|
|
sc = xxWireless['CIM_WiFiEndpointSettings'].responses[j];
|
|
if (sc['AuthenticationMethod'] == 1) continue; // Skip "Endpoint User Settings"
|
|
if (sc['Priority'] == i) {
|
|
x += '<div class=itemBar onclick=showWifiDetails(' + j + ')><div style=float:right>' + EscapeHtml(sc['SSID']) + ', ' + xxWifiAuthenticationMethod[sc['AuthenticationMethod']] + ', ' + xxWifiEncryptionMethod[sc['EncryptionMethod']] + ' ';
|
|
if (xxAccountAdminName) x += AddButton2("Eliminar", 'wifiRemoveButton(\"' + j + '\")');
|
|
x += '</div><div style=padding-top:3px><b>' + EscapeHtml(sc['ElementName']) + '</b></div></div>';
|
|
s++;
|
|
}
|
|
}
|
|
}
|
|
if (s == 0) x += '<i>' + "No hay perfiles inalámbricos presentes" + '</i><br>';
|
|
|
|
// End of table
|
|
x += '<br><td class=r2>';
|
|
if (xxAccountAdminName) x += TableEnd(AddButton("Nuevo perfil", 'showWifiNewProfile()')); else x += TableEnd('');
|
|
QH('id_TableWifi2', x + '<br>');
|
|
}
|
|
|
|
function showWifiStateDlg() {
|
|
if (xxdialogMode) return;
|
|
var s = '';
|
|
for (var i in xxWifiState) { s += '<label><input type=radio name=d11 id=wl' + i + ' value=' + i + ' ' + ((xxWireless['CIM_WiFiPort'].response['EnabledState'] == i)?'checked':'') + '>' + xxWifiState[i] + '</label><br>'; }
|
|
setDialogMode(11, "Estado inalámbrico", 3, wifiStateDlg, s);
|
|
}
|
|
|
|
function wifiStateDlg() { amtstack.CIM_WiFiPort_RequestStateChange( document.querySelector('input[name=d11]:checked').value, null, function() { amtstack.Get('CIM_WiFiPort', function(stack, name, response, status) { if (status == 200) { xxWireless['CIM_WiFiPort'].response = response.Body; showWirelessInfo(); } } ); } ); }
|
|
|
|
function showWifiSyncDlg() {
|
|
if (xxdialogMode) return;
|
|
var s = '';
|
|
s += '<label><input type=radio name=d11 id=wl0 value=0 ' + ((xxWireless['AMT_WiFiPortConfigurationService'].response['localProfileSynchronizationEnabled'] == 0) ? 'checked' : '') + '>' + "Discapacitado" + '</label><br>';
|
|
s += '<label><input type=radio name=d11 id=wl0 value=1 ' + ((xxWireless['AMT_WiFiPortConfigurationService'].response['localProfileSynchronizationEnabled'] == 1) ? 'checked' : '') + '>' + "Habilitado" + '</label><br>';
|
|
setDialogMode(11, "Local Profile Sync", 3, showWifiSyncDlgEx, s);
|
|
}
|
|
|
|
function showWifiSyncDlgEx() {
|
|
var k = Clone(xxWireless['AMT_WiFiPortConfigurationService'].response);
|
|
k['localProfileSynchronizationEnabled'] = document.querySelector('input[name=d11]:checked').value;
|
|
amtstack.Put('AMT_WiFiPortConfigurationService', k, function () { amtstack.Get('AMT_WiFiPortConfigurationService', function (stack, name, response, status) { if (status == 200) { xxWireless['AMT_WiFiPortConfigurationService'].response = response.Body; showWirelessInfo(); } }); });
|
|
}
|
|
|
|
function showUefiWifiCoExDlg() {
|
|
if (xxdialogMode) return;
|
|
var s = '';
|
|
s += '<label><input type=radio name=d12 value=0 ' + ((xxWireless['AMT_WiFiPortConfigurationService'].response['UEFIWiFiProfileShareEnabled'] == false)?'checked':'') + '>Disabled</label><br>';
|
|
s += '<label><input type=radio name=d12 value=1 ' + ((xxWireless['AMT_WiFiPortConfigurationService'].response['UEFIWiFiProfileShareEnabled'] == true)?'checked':'') + '>Enabled</label><br>';
|
|
setDialogMode(11, "UEFI Wifi CoEx Profile Sharing", 3, UefiWifiCoExDlg, s);
|
|
}
|
|
|
|
function UefiWifiCoExDlg() {
|
|
var wifiportcfgsvc = Clone(xxWireless['AMT_WiFiPortConfigurationService'].response);
|
|
wifiportcfgsvc["UEFIWiFiProfileShareEnabled"]=document.querySelector('input[name=d12]:checked').value;
|
|
amtstack.Put('AMT_WiFiPortConfigurationService', wifiportcfgsvc, function(stack, name, responses, status) {if (status == 200) {PullWireless()}})
|
|
}
|
|
|
|
function showWifiDetails(h) {
|
|
if (xxdialogMode) return;
|
|
var i, sc = xxWireless['CIM_WiFiEndpointSettings'].responses[h], x = '<div style=text-align:left>';
|
|
x += addHtmlValue("Nombre de perfil", EscapeHtml(sc['ElementName']));
|
|
x += addHtmlValue("SSID", sc['SSID']);
|
|
x += addHtmlValue("Autenticación", xxWifiAuthenticationMethod[sc['AuthenticationMethod']]);
|
|
x += addHtmlValue("Cifrado", xxWifiEncryptionMethod[sc['EncryptionMethod']]);
|
|
x += addHtmlValue("Prioridad", sc['Priority']);
|
|
x += '</div>';
|
|
messagebox("Perfil inalámbrico", x);
|
|
}
|
|
|
|
function wifiRemoveButton(h) {
|
|
if (xxdialogMode) return;
|
|
var sc = xxWireless['CIM_WiFiEndpointSettings'].responses[h];
|
|
QH('id_dialogMessage', format("¿Eliminar el perfil inalámbrico \"{0}\"?", sc['ElementName']));
|
|
setDialogMode(1, "Perfil inalámbrico", 3, function () { removeWifiButtonEx(h) });
|
|
}
|
|
|
|
function removeWifiButtonEx(h) {
|
|
var sc = xxWireless['CIM_WiFiEndpointSettings'].responses[h];
|
|
amtstack.Delete('CIM_WiFiEndpointSettings', { InstanceID: sc['InstanceID'] }, removeWifiEntryResponse, 0, 1);
|
|
}
|
|
|
|
function removeWifiEntryResponse(stack, name, response, status, tag) {
|
|
if (methodcheck(response)) return;
|
|
amtstack.Enum('CIM_WiFiEndpointSettings', function(stack, name, responses, status) { if (status == 200) { xxWireless['CIM_WiFiEndpointSettings'].responses = responses; showWirelessInfo(); } } );
|
|
}
|
|
|
|
function showWifiNewProfile() {
|
|
if (xxdialogMode) return;
|
|
var x = '';
|
|
for (i = 1; i < 256; i++) {
|
|
var t = 1;
|
|
for (j in xxWireless['CIM_WiFiEndpointSettings'].responses) { if (xxWireless['CIM_WiFiEndpointSettings'].responses[j]['Priority'] == i) t = 0; }
|
|
if (t) { x += '<option value='+ i +'>'+ i; } // Option is a tag that is self closing.
|
|
}
|
|
QH('idx_d12pri', x);
|
|
QV('idx_d12auth_wpa3', amtversion > 13);
|
|
|
|
idx_d12auth.value = 6;
|
|
idx_d12enc.value = 4;
|
|
|
|
idx_d12name.value = idx_d12ssid.value = idx_d12password1.value = idx_d12password2.value = '';
|
|
|
|
setDialogMode(12, "Agregar perfil inalámbrico", 3, function () { addWifiProfile() });
|
|
updateWifiDialog();
|
|
}
|
|
|
|
function addWifiProfile() {
|
|
amtstack.AMT_WiFiPortConfigurationService_AddWiFiSettings(
|
|
{
|
|
'__parameterType': 'reference',
|
|
'__resourceUri': amtstack.CompleteName('CIM_WiFiEndpoint'),
|
|
'Name': 'WiFi Endpoint 0'
|
|
}, {
|
|
'__parameterType': 'instance',
|
|
'__namespace': amtstack.CompleteName('CIM_WiFiEndpointSettings'),
|
|
'ElementName': idx_d12name.value,
|
|
'InstanceID': 'Intel(r) AMT:WiFi Endpoint Settings ' + idx_d12name.value,
|
|
'AuthenticationMethod': idx_d12auth.value,
|
|
'EncryptionMethod': idx_d12enc.value,
|
|
'SSID': idx_d12ssid.value,
|
|
'Priority': idx_d12pri.value,
|
|
'PSKPassPhrase': idx_d12password1.value
|
|
},
|
|
null, null, null, removeWifiEntryResponse
|
|
);
|
|
}
|
|
|
|
function updateWifiDialog() {
|
|
var r = true;
|
|
var a = idx_d12auth.value;
|
|
var e = idx_d12enc.value;
|
|
QV('id_d12e2', a < 4);
|
|
QV('id_d12e3', a > 3);
|
|
QV('id_d12e4', a > 3);
|
|
QV('id_d12e5', a < 4);
|
|
if (a < 4 && (e == 3 || e == 4)) { idx_d12enc.value = 2; }
|
|
if (a > 3 && (e == 2 || e == 5)) { idx_d12enc.value = 3; }
|
|
if (a == 32768) { idx_d12enc.value = 4; }
|
|
|
|
// Check if there is already a profile with this name
|
|
for (var j in xxWireless['CIM_WiFiEndpointSettings'].responses) { if (xxWireless['CIM_WiFiEndpointSettings'].responses[j]['ElementName'] == idx_d12name.value) { r = false; } }
|
|
|
|
QE('idx_dlgOkButton', r == true && (idx_d12name.value.length > 0) && (idx_d12ssid.value.length > 0) && (idx_d12password1.value.length > 7) && (idx_d12password1.value == idx_d12password2.value));
|
|
}
|
|
|
|
// ###END###{Wireless}
|
|
// ###END###{NetworkSettings}
|
|
|
|
// ###BEGIN###{HardwareInfo}
|
|
//
|
|
// HARDWARE INFORMATION PANEL
|
|
//
|
|
|
|
function PullHardware() {
|
|
amtstack.BatchEnum('', ['*CIM_ComputerSystemPackage', 'CIM_SystemPackaging', '*CIM_Chassis', 'CIM_Chip', '*CIM_Card', '*CIM_BIOSElement', 'CIM_Processor', 'CIM_PhysicalMemory', 'CIM_MediaAccessDevice', 'CIM_PhysicalPackage', '*CIM_Battery'], processHardware);
|
|
amtFirstPull |= 1; // Set the hardware info bit on, indicates we are pulling this information.
|
|
}
|
|
|
|
// http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_2.7.1.pdf
|
|
var DMTFCPUStatus = ["Desconocido", "Habilitado", "Deshabilitado por el usuario", "Deshabilitado por BIOS (error POST)", "Ocioso", "Otro"];
|
|
var DMTFMemType = ["Desconocido", "Otro", "DRACMA", "DRAM sincrónico", "DRAM de caché", "EDO", "EDRAM", "VRAM", "SRAM", "RAM", "ROM", "Destello", "EEPROM", "FEPROM", "EPROM", "CDRAM", "3DRAM", "SDRAM", "SGRAM", "RDRAM", "DDR", "DDR-2", "BRAM", "FB-DIMM", "DDR3", "FBD2", "DDR4", "LPDDR", "LPDDR2", "LPDDR3", "LPDDR4"];
|
|
var DMTFMemFormFactor = ['', "Otro","Desconocido","SIMM","sorbo","Chip","INMERSIÓN","ZIP","Tarjeta propietaria","DIMM","TSOP","Fila de papas fritas","RIMM","SODIMM","SRIMM","FB-DIM"];
|
|
var DMTFProcFamilly = { // Page 46 of DMTF document
|
|
191: "Procesador Intel® Core ™ 2 Duo",
|
|
192: "Procesador Intel® Core ™ 2 Solo",
|
|
193: "Procesador Intel® Core ™ 2 Extreme",
|
|
194: "Procesador Intel® Core ™ 2 Quad",
|
|
195: "Procesador móvil Intel® Core ™ 2 Extreme",
|
|
196: "Procesador móvil Intel® Core ™ 2 Duo",
|
|
197: "Procesador móvil Intel® Core ™ 2 Solo",
|
|
198: "Procesador Intel® Core ™ i7",
|
|
199: "Procesador Intel® Celeron® de doble núcleo" };
|
|
|
|
var HardwareInventory;
|
|
function processHardware(stack, name, responses, status) {
|
|
if (status != 200) return;
|
|
|
|
var i, x = '<table class=log1 cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px>';
|
|
HardwareInventory = responses;
|
|
QV('go2', true); // Show "Hardware Information" on left panel
|
|
|
|
// ###BEGIN###{!FileSaver}
|
|
x += TableEnd('<div> ' + AddRefreshButton('PullHardware(1)') + " La información de hardware se recopila en el momento del arranque del sistema.");
|
|
// ###END###{!FileSaver}
|
|
// ###BEGIN###{FileSaver}
|
|
x += TableEnd('<div> ' + AddRefreshButton('PullHardware(1)') + AddButton("Salvar...", 'SaveHardwareLog()') + " La información de hardware se recopila en el momento del arranque del sistema.");
|
|
// ###END###{FileSaver}
|
|
|
|
var ba = responses['CIM_Chassis'].response;
|
|
var bb = responses['CIM_Card'].response;
|
|
var v = responses['CIM_BIOSElement'].response['SoftwareElementID'];
|
|
|
|
x += '<br><h2>' + "Plataforma" + '</h2>';
|
|
x += FullTable({"Modelo de computadora":ba['Model'], "Fabricante":ba['Manufacturer'], "Versión":ba['Version'], "Número de serie":ba['SerialNumber'], "ID del sistema":guidToStr(responses['CIM_SystemPackaging'].responses[0]['PlatformGUID']).toLowerCase()}, '');
|
|
|
|
x += '<br><h2>' + "Zócalo" + '</h2>';
|
|
x += FullTable({"Fabricante":bb['Manufacturer'], "Nombre del producto":bb['Model'], "Versión":bb['Version'], "Número de serie":bb['SerialNumber'], "Etiqueta de propiedad":bb['Tag'], "¿Reemplazable?":(bb['CanBeFRUed']==true)?'Yes':'No' },'');
|
|
|
|
x += '<br><h2>' + "BIOS" + '</h2>';
|
|
x += FullTable({"Vendedor":responses['CIM_BIOSElement'].response['Manufacturer'], "Versión":v, "Fecha de lanzamiento":new Date(responses['CIM_BIOSElement'].response['ReleaseDate']['Datetime']).toLocaleDateString('en', {timeZone:'UTC'})},'');
|
|
|
|
x += '<br>';
|
|
for (i in responses['CIM_Processor'].responses) {
|
|
var p = responses['CIM_Processor'].responses[i];
|
|
var q = responses['CIM_Chip'].responses[i]; // This is a shortcut, we assume that the first entries in CIM_Chip are the processors, in the same order.
|
|
x += '<h2>' + "Procesador" + ' ' + (parseInt(i) + 1) + '</h2>';
|
|
x += FullTable({"Fabricante":trademarks(q['Manufacturer']), "Familia":DMTFProcFamilly[p['Family']], "Versión":trademarks(q['Version']), "Velocidad máxima del zócalo":p['MaxClockSpeed'] + " megahercio", "Estado":DMTFCPUStatus[p['CPUStatus']]},'');
|
|
}
|
|
x += '<br>';
|
|
|
|
for (i in responses['CIM_PhysicalMemory'].responses) {
|
|
var m = responses['CIM_PhysicalMemory'].responses[i];
|
|
x += '<h2>' + "Módulo de memoria" + ' ' + (+i + 1) + '</h2>';
|
|
x += FullTable({"Etiqueta del banco":m['BankLabel'], "Fabricante":m['Manufacturer'], "Número de serie":m['SerialNumber'], "Talla":parseInt(m['Capacity'] / 0x100000) + " MEGABYTE", "Factor de forma":DMTFMemFormFactor[m['FormFactor']], "Tipo":DMTFMemType[m['MemoryType']], "Etiqueta de propiedad":m['Tag'], "Número de pieza":m['PartNumber']},'');
|
|
}
|
|
x += '<br>';
|
|
|
|
for (i in responses['CIM_MediaAccessDevice'].responses) {
|
|
var m = responses['CIM_MediaAccessDevice'].responses[i];
|
|
var n = responses['CIM_PhysicalPackage'].responses[+i + 1]; // This is a shortcut, we assume CIM_PhysicalPackage is the same as CIM_MediaAccessDevice except for the first entry.
|
|
x += '<h2>' + "Medios de almacenamiento" + ' ' + (parseInt(i) + 1) + '</h2>';
|
|
x += FullTable({"Modelo":n['Model'],"Número de serie":(n['SerialNumber']==''?'Unknown':n['SerialNumber']), "Talla":parseInt(Math.round(m['MaxMediaSize'] * 1000 / 0x100000)) + " MEGABYTE"},'');
|
|
}
|
|
x += '<br>';
|
|
|
|
if (responses['CIM_Battery'].response != null) {
|
|
var battInfo = null;
|
|
for (i in responses['CIM_PhysicalPackage'].responses) { if (responses['CIM_PhysicalPackage'].responses[i].PackageType == 11) { battInfo = responses['CIM_PhysicalPackage'].responses[i]; } }
|
|
if (battInfo != null) {
|
|
x += '<h2>' + "Battery" + '</h2>';
|
|
var battdate = new Date(battInfo['ManufactureDate']['Datetime']).toDateString()
|
|
var batttype = ["Otro", "Desconocido", "Lead Acid", "Nickel Cadmium", "Nickel Metal Hydride", "Lithium-ion", "Zinc air", "Lithium Polymer"][responses['CIM_Battery'].response['Chemistry']];
|
|
var batt = { "Device name": responses['CIM_Battery'].response['DeviceID'], "Fabricante": battInfo['Manufacturer'], "Manufacture date": battdate, "Número de serie": battInfo['SerialNumber'], "Tipo": batttype, "Design capacity": responses['CIM_Battery'].response['DesignCapacity'] + ' ' + "mWatt-hours", "Design voltage": responses['CIM_Battery'].response['DesignVoltage'] + ' ' + "mVolts" };
|
|
if (battInfo['OtherIdentifyingInfo']) { batt["Other Info"] = battInfo['OtherIdentifyingInfo']; }
|
|
x += FullTable(batt, '');
|
|
}
|
|
}
|
|
x += '<br>';
|
|
|
|
QH('id_TableSysInfo', x);
|
|
updateSystemStatus();
|
|
}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
function SaveHardwareLog() {
|
|
if (!xxdialogMode && HardwareInventory) SaveJsonFile('IntelAmtHardware', 'hardware', "Información de hardware de Intel AMT", HardwareInventory);
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
// ###END###{HardwareInfo}
|
|
|
|
//
|
|
// POWER POLICY
|
|
//
|
|
|
|
var AmtSystemPowerSchemes = null;
|
|
function PullPowerPolicy() { amtstack.Enum('AMT_SystemPowerScheme', powerPolicyResponse); }
|
|
function powerPolicyResponse(stack, name, response, status) { AmtSystemPowerSchemes = response; updateSystemStatus(); }
|
|
|
|
function showPowerPolicyDlg(currentguid) {
|
|
if (xxdialogMode) return;
|
|
var s = '';
|
|
|
|
// Now find the name of the power schema in the AMT_SystemPowerScheme table
|
|
for (var j = 0; j < AmtSystemPowerSchemes.length; j++) {
|
|
var selected = ((AmtSystemPowerSchemes[j]['SchemeGUID'] == currentguid)?' checked':'');
|
|
s += '<input type=radio name=powerpolicy value=\"' + AmtSystemPowerSchemes[j]['InstanceID'] + '\" ' + selected + '>' + AmtSystemPowerSchemes[j]['Description'] + '<br>';
|
|
}
|
|
|
|
setDialogMode(11, "Política de energía Intel® AMT", 3, showPowerPolicyDlgOk, s);
|
|
}
|
|
|
|
function showPowerPolicyDlgOk() {
|
|
var id = null, i = 0, e = document.getElementsByTagName('input');
|
|
for (; i < e.length; i++) { if (e[i].name == 'powerpolicy' && e[i].checked) { id = e[i].value; } }
|
|
amtstack.AMT_SystemPowerScheme_SetPowerScheme(showPowerPolicyDlgOkDone, id);
|
|
}
|
|
|
|
function showPowerPolicyDlgOkDone(stack, name, response, status) { if (status == 200) PullSystemStatus(); }
|
|
|
|
//
|
|
// USER INFORMATION PANEL
|
|
//
|
|
|
|
var xxAccountAdminName, xxAccountRealmInfo, xxAccountEnabledInfo = {}, xxAccountFetch, showHiddenAccounts = false;
|
|
|
|
function PullUserInfo() {
|
|
xxAccountFetch = 1;
|
|
delete xxAccountAdminName;
|
|
xxAccountRealmInfo = {};
|
|
amtstack.AMT_AuthorizationService_GetAdminAclEntry(getAdminAclEntryResponse);
|
|
amtstack.AMT_AuthorizationService_EnumerateUserAclEntries(1, enumerateUserAclEntriesResponse);
|
|
}
|
|
|
|
function getAdminAclEntryResponse(stack, name, response, status) {
|
|
if (status != 200) return;
|
|
xxAccountRealmInfo[-1] = { 'AccessPermission': 999, 'DigestUsername': response.Body['Username'], 'Realms':null };
|
|
xxAccountAdminName = response.Body['Username'];
|
|
updateAccounts();
|
|
}
|
|
|
|
function enumerateUserAclEntriesResponse(stack, name, response, status) {
|
|
if (status != 200) return;
|
|
//if (errcheck(status, stack)) return;
|
|
methodcheck(response);
|
|
QV('go11', true); // Show "User Accounts" on left panel
|
|
xxAccountFetch = response.Body['Handles'].length;
|
|
for (var i in response.Body['Handles']) {
|
|
var h = response.Body['Handles'][i];
|
|
amtstack.AMT_AuthorizationService_GetAclEnabledState(h, getAclEnabledStateResponse, h);
|
|
amtstack.AMT_AuthorizationService_GetUserAclEntryEx(h, getUserAclEntryExResponse, h);
|
|
}
|
|
updateAccounts();
|
|
}
|
|
|
|
function getUserAclEntryExResponse(stack, name, response, status, tag) {
|
|
xxAccountFetch--;
|
|
//if (errcheck(status, stack)) return;
|
|
//methodcheck(response);
|
|
if (status == 200) { // Sometimes Intel AMT will just freak out on this call, if it's the case, just carry on.
|
|
response.Body['Handle'] = tag;
|
|
if (!response.Body['Realms']) response.Body['Realms'] = [];
|
|
else if (!Array.isArray(response.Body['Realms'])) response.Body['Realms'] = [response.Body['Realms']]; // If "Realms" is not an array, it's because it's just one realm. Fix is so it's an array of one.
|
|
xxAccountRealmInfo[tag] = response.Body;
|
|
updateAccounts();
|
|
}
|
|
}
|
|
|
|
function getAclEnabledStateResponse(stack, name, response, status, tag) {
|
|
//if (errcheck(status, stack)) return;
|
|
if (status == 200) { // Sometimes Intel AMT will just freak out on this call, if it's the case, just carry on.
|
|
xxAccountEnabledInfo[tag] = response.Body;
|
|
updateAccounts();
|
|
}
|
|
}
|
|
|
|
function setAclEnabledStateResponse(stack, name, response, status, tag) {
|
|
if (errcheck(status, stack)) return;
|
|
methodcheck(response);
|
|
amtstack.AMT_AuthorizationService_GetAclEnabledState(tag, getAclEnabledStateResponse, tag);
|
|
}
|
|
|
|
function updateAccounts() {
|
|
if (xxAccountFetch > 0) return;
|
|
var x = TableStart2();
|
|
x += '<tr><td class=r1 style=padding-left:15px><br>' + "Administre las cuentas de usuario Intel® AMT para esta computadora." + '<br><br>';
|
|
for (var i in xxAccountRealmInfo) {
|
|
var r = xxAccountRealmInfo[i], name, hidden = false, state = 0;
|
|
if (r['DigestUsername']) { name = r['DigestUsername']; hidden = (name[0] == '$' && name[1] == '$'); } else { name = GetSidString(atob(r['KerberosUserSid'])); }
|
|
if (xxAccountEnabledInfo[i] && name != '$$OsAdmin') { state = (xxAccountEnabledInfo[i]['Enabled'] == true)?1:2; }
|
|
if (showHiddenAccounts || !hidden) {
|
|
var rb = '';
|
|
if (r['AccessPermission'] != 999) {
|
|
if (state == 2) { rb += "Discapacitado,"; }
|
|
var rc = 0;
|
|
for (i in r['Realms']) { if (amtstack.RealmNames[r["Reinos"][i]] != '') { rc++; } } // Count only realms that have a name, removing reserved realms.
|
|
if (r['Realms'].indexOf(20) >= 0) rb += "Auditor,";
|
|
if (r['Realms'].indexOf(3) >= 0) { rb += "Administrador"; } else { if (rc == 1) { rb += "1 reino"; } else { rb += rc + " reinos"; } }
|
|
} else {
|
|
rb += "Administrador";
|
|
r['Handle'] = -1;
|
|
}
|
|
x += '<div class=itemBar onclick=showUserDetails(' + r['Handle'] + ')><div style=float:right>';
|
|
if (state > 0 && xxAccountAdminName) x += ' ' + AddButton2((state == 1?'Disable':'Enable'), 'changeAccountStateButton(event,' + r['Handle'] + ',' + state + ')');
|
|
if (!hidden && xxAccountAdminName) x += ' ' + AddButton2("Editar...", 'changeAccountButton(event,' + r['Handle'] + ')');
|
|
x += '</div><div style=padding-top:3px;width:330px;float:left;overflow-x:hidden title="' + name + '"><b>' + name + '</b></div><div style=padding-top:3px>' + rb + '</div></div>';
|
|
}
|
|
}
|
|
var y = '<div style=float:right;margin-right:8px><a title="' + "Alternar cuentas ocultas" + '" style=color:gray;cursor:pointer onclick=toggleAccountButton()>' + (showHiddenAccounts?'▲':'▼') + '</a></div><div> ' + AddRefreshButton('xxAccountFetch=999;PullUserInfo()');
|
|
if (xxAccountAdminName) y += AddButton("Nueva cuenta", 'newAccountButton()');
|
|
x += '<br><td class=r1>' + TableEnd(y + '</div>');
|
|
QH('id_TableUserAccounts', x);
|
|
}
|
|
|
|
function toggleAccountButton() {
|
|
showHiddenAccounts = !showHiddenAccounts;
|
|
updateAccounts();
|
|
}
|
|
|
|
function removeUserAclEntryResponse(stack, name, response, status, tag) {
|
|
if (methodcheck(response)) return;
|
|
PullUserInfo();
|
|
}
|
|
|
|
function changeAccountStateButton(e, h, s) {
|
|
haltEvent(e);
|
|
if (xxdialogMode) return;
|
|
amtstack.AMT_AuthorizationService_SetAclEnabledState(h, (s==1?false:true), setAclEnabledStateResponse, h);
|
|
}
|
|
|
|
function changeAccountButton(e, h) {
|
|
haltEvent(e);
|
|
if (xxdialogMode) return;
|
|
updateRealms(xxAccountRealmInfo[h]['Realms']);
|
|
d2username.value = xxAccountRealmInfo[h]['DigestUsername'] ? xxAccountRealmInfo[h]['DigestUsername'] : GetSidString(atob(xxAccountRealmInfo[h]['KerberosUserSid']));
|
|
d2password1.value = d2password2.value = '';
|
|
d2permission.value = xxAccountRealmInfo[h]['AccessPermission'];
|
|
setDialogMode(2, "Editar cuenta", ((h==-1)?3:7), function (button) { changeAccountButtonEx(h, button); }); // If handle is -1, only display OK/Cancel buttons, if not, also display delete button.
|
|
updateAccountDialog();
|
|
}
|
|
|
|
function newAccountButton() {
|
|
if (xxdialogMode) return;
|
|
updateRealms([]);
|
|
d2username.value = d2password1.value = d2password2.value = '';
|
|
d2permission.value = 2;
|
|
setDialogMode(2, "Nueva cuenta", 3, function () { changeAccountButtonEx(null, 1); });
|
|
updateAccountDialog();
|
|
}
|
|
|
|
function changeAccountButtonEx(h, button) {
|
|
if (button == 1) { // OK Button
|
|
var realms = [], username = d2username.value, permission = d2permission.value, password = d2password1.value, sid = GetSidByteArray(Q('d2username').value), d = null;
|
|
if (username.length == 0 || password != d2password2.value) { messagebox("Error de cuenta", "Parámetros inválidos"); return; }
|
|
if (sid == null) { d = window.btoa(rstr_md5(username + ":" + amtsysstate['AMT_GeneralSettings'].response['DigestRealm'] + ":" + password)); } else { username = null; sid = btoa(sid); }
|
|
if (h != -1) { for (var y in amtstack.RealmNames) { if (((amtstack.RealmNames[y]) || (y == 3)) && Q('rx' + y).checked) { realms.push(y); } } }
|
|
if (h == null) { amtstack.AMT_AuthorizationService_AddUserAclEntryEx(username, d, sid, permission, realms, userAclEntryExResponse); }
|
|
else if (h == -1) { amtstack.AMT_AuthorizationService_SetAdminAclEntryEx(username, d, userAclEntryExResponse); }
|
|
else { amtstack.AMT_AuthorizationService_UpdateUserAclEntryEx(h, username, d, sid, permission, realms, userAclEntryExResponse); }
|
|
}
|
|
if (button == 2) { // Delete Button
|
|
amtstack.AMT_AuthorizationService_RemoveUserAclEntry(h, removeUserAclEntryResponse);
|
|
}
|
|
}
|
|
|
|
function userAclEntryExResponse(stack, name, response, status, tag) { if (methodcheck(response)) return; PullUserInfo(); }
|
|
function updateRealms(r) {
|
|
QV('id_d2permissions', r != null);
|
|
if (r != null) {
|
|
var x = '<li><label><input type=checkbox onchange=updateAccountDialog() id=rx3' + ((r.indexOf(3) >= 0)?' checked':'') + '>' + "Administrador" + '</label></li><hr />';
|
|
for (var y in amtstack.RealmNames) { var c = ''; if (r.indexOf(parseInt(y)) >= 0) c = ' checked'; if (amtstack.RealmNames[y]) x += '<li><label><input type=checkbox onchange=updateAccountDialog() id=rx' + y + c + '>' + amtstack.RealmNames[y] + '</label></li>'; }
|
|
QH('id_d2realms', x);
|
|
}
|
|
}
|
|
|
|
function updateAccountDialog() {
|
|
var ok = true;
|
|
if (Q('id_d2permissions').style.display != 'none') { ok = false; for (var y in amtstack.RealmNames) { if (((amtstack.RealmNames[y]) || (y == 3)) && Q('rx' + y).checked) { ok = true; } } }
|
|
if (ok) { ok = ((d2username.value.length > 0) && (passwordcheck(d2password1.value)) && (d2password1.value == d2password2.value)); }
|
|
QE('idx_dlgOkButton', ok);
|
|
}
|
|
|
|
var xxUserPermissions = ["Solo locales" , "Solo red", "Todo (local y de red)"];
|
|
function showUserDetails(h) {
|
|
if (xxdialogMode) return;
|
|
var a = xxAccountRealmInfo[h], x = '<div style=text-align:left>';
|
|
var i, n = a['DigestUsername'];
|
|
if (!n) n = GetSidString(atob(a['KerberosUserSid']));
|
|
x += addHtmlValue("Nombre", n);
|
|
if (xxAccountEnabledInfo[h]) { x += addHtmlValue("Estado", ((xxAccountEnabledInfo[h]['Enabled'] == true)?"Habilitado":"Discapacitado")); }
|
|
if (n == xxAccountAdminName) {
|
|
x += addHtmlValue("Permiso", "Administrador");
|
|
} else {
|
|
x += addHtmlValue("Permiso", xxUserPermissions[a['AccessPermission']]);
|
|
var y = '';
|
|
if (a['Realms'].indexOf(3) >= 0) {
|
|
y = "Administrador";
|
|
if (a['Realms'].indexOf(20) >= 0) y += "Auditor";
|
|
} else {
|
|
for (i in xxAccountRealmInfo[h]['Realms']) {
|
|
if (amtstack.RealmNames[a['Realms'][i]] != '') { // Remove blank reserved realms
|
|
if (y.length > 0) y += ",";
|
|
y += amtstack.RealmNames[a['Realms'][i]];
|
|
}
|
|
}
|
|
}
|
|
if (y.length == 0) y = "Ninguna";
|
|
x += addHtmlValue("Reinos", '') + '<b>' + y + '</b>';
|
|
}
|
|
x += '</div>';
|
|
messagebox("Cuenta" + n, x);
|
|
}
|
|
|
|
//
|
|
// WSMAN BROWSER PANEL
|
|
//
|
|
|
|
// ###BEGIN###{WsmanBrowser}
|
|
function wsmanQuery() {
|
|
QH('id_wsresults', '');
|
|
var selections = getSelectedOptions(Q('id_QuerySelect')), selections2 = [];
|
|
for (var x in selections) { if (QS('WSB-' + selections[x]).display == '') selections2.push(selections[x]); }
|
|
if (selections2.length == 0) return;
|
|
QE('id_p12querybutton', false);
|
|
if (selections2 && selections2.length > 0) { amtstack.BatchEnum("Navegador", selections2, browserResponse, null, true); } // This is the only BatchEnum where we want to continue and get an answer even if one of the calls fails.
|
|
}
|
|
|
|
function browserResponse(stack, name, responses, status) {
|
|
QE('id_p12querybutton', true);
|
|
var h = '';
|
|
for (var r in responses) {
|
|
var response = responses[r];
|
|
h += '<h2>' + r + '</h2><div style=margin-left:20px>';
|
|
if (response.status == 200) { if (response.responses.length == 0) { h += ('<br>' + "(Vacío)"); } else { h += ObjectToString(response.responses).replace(/Intel\(r\)/g, 'Intel®'); } } else { h += '<br><div style=color:red>' + "Error #" + response.status + '</div>'; }
|
|
h += '</div><br>';
|
|
}
|
|
QH('id_wsresults', h);
|
|
}
|
|
|
|
function wsmanFilter() {
|
|
var filter = idx_browserFilter.value.toLowerCase();
|
|
for (var w in AllWsman) { QV('WSB-' + AllWsman[w], filter == '' || AllWsman[w].toLowerCase().indexOf(filter) >= 0); }
|
|
}
|
|
// ###END###{WsmanBrowser}
|
|
|
|
//
|
|
// Remote Terminal
|
|
//
|
|
|
|
// ###BEGIN###{Terminal}
|
|
function connectTerminal() {
|
|
if (!terminal) return;
|
|
if (terminal.State == 0) {
|
|
// ###BEGIN###{ComputerSelector}
|
|
terminal.digestRealmMatch = amtstack.wsman.comm.digestRealm;
|
|
// ###END###{ComputerSelector}
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
terminal.tlsv1only = amtstack.wsman.comm.tlsv1only;
|
|
terminal.Start(currentMeshNode._id, 16994, '*', '*', 0);
|
|
// ###END###{Mode-MeshCentral2}
|
|
// ###BEGIN###{ComputerSelector}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) {
|
|
terminal.Start(currentcomputer._id, 0, 'x', 'x', 0, wsstack.comm, meshCentralServer);
|
|
} else {
|
|
// ###END###{MeshServerConnect}
|
|
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls'])
|
|
terminal.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], wsstack.comm.getPeerCertificateFingerprint(), wsstack.comm.xtlsoptions);
|
|
// ###BEGIN###{MeshServerConnect}
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
terminal.tlsv1only = amtstack.wsman.comm.tlsv1only;
|
|
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls'])
|
|
terminal.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls']);
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###END###{ComputerSelector}
|
|
// ###BEGIN###{Mode-Firmware}
|
|
terminal.Start();
|
|
// ###END###{Mode-Firmware}
|
|
} else {
|
|
terminal.Stop();
|
|
}
|
|
}
|
|
|
|
function onTerminalStateChange(terminal, state) {
|
|
// console.log("onTerminalStateChange: " + state);
|
|
idx_connectbutton2.value = (state == 0) ? "Conectar" : "Desconectar";
|
|
Q('id_termstatus').textContent = StatusStrs[state];
|
|
QE('id_tpastebutton', state == 3);
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
QE('TermWD', state == 3);
|
|
// ###END###{!Mode-NodeWebkit}
|
|
switch (state) {
|
|
case 0:
|
|
terminal.m.TermResetScreen();
|
|
terminal.m.TermDraw();
|
|
if (xxdialogMode == 3) setDialogMode();
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
QV('termRecordIcon', false);
|
|
// ###END###{Mode-MeshCentral2}
|
|
if (terminal.disconnectCode == 2) { // BUSY
|
|
messagebox("Remote Terminal", "The remote device is busy, a session may already be open.");
|
|
} else if (terminal.disconnectCode == 3) { // UNSUPPORTED
|
|
messagebox("Remote Terminal", "The device indicated that this type of connection of not supported.");
|
|
}
|
|
break;
|
|
case 3:
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
if (terminal.serverIsRecording == true) { QV('termRecordIcon', true); }
|
|
// ###END###{Mode-MeshCentral2}
|
|
break;
|
|
}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_SetupMainMenu(currentView);
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
function termPaste() { terminal.m.TermSendKeys(d3pastetextarea.value); return false; }
|
|
function termSendKey(k) { terminal.m.TermSendKey(k); return false; }
|
|
function termSendKeys() { var k = Q('termkeys').value; if (k < 1000) { termSendKey(k); } else { terminal.m.TermHandleKeyDown({ which: k - 889, repeat: false }); } }
|
|
|
|
// ###BEGIN###{TerminalSize}
|
|
function termToggleSize() {
|
|
if (terminal.m.width == 80) {
|
|
Q('id_tsizebutton').value = '100x30';
|
|
terminal.m.Init(100, 30);
|
|
} else {
|
|
Q('id_tsizebutton').value = '80x25';
|
|
terminal.m.Init(80, 25);
|
|
}
|
|
}
|
|
// ###END###{TerminalSize}
|
|
|
|
// ###BEGIN###{Terminal-Enumation-All}
|
|
var terminalEmulations = ["Terminal UTF8", "ASCII extendido", "Intel ASCII"];
|
|
function termToggleType() {
|
|
terminal.m.terminalEmulation = (terminal.m.terminalEmulation + 1) % 3;
|
|
Q('id_ttypebutton').value = terminalEmulations[terminal.m.terminalEmulation];
|
|
}
|
|
// ###END###{Terminal-Enumation-All}
|
|
|
|
// ###BEGIN###{Terminal-FxEnumation-All}
|
|
function termToggleFx() {
|
|
Q('id_tfxkeysbutton').value = ["Intel (F10 = ESC + [OM)", "Alternativo (F10 = ESC + 0)", "VT100 + (F10 = ESC + [OY)"][terminal.m.fxEmulation = (terminal.m.fxEmulation + 1) % 3];
|
|
}
|
|
// ###END###{Terminal-FxEnumation-All}
|
|
|
|
function termToggleCr() {
|
|
if (terminal.m.lineFeed == '\r\n') {
|
|
Q('id_tcrbutton').value = "LF";
|
|
terminal.m.lineFeed = '\n';
|
|
} else {
|
|
Q('id_tcrbutton').value = "CR + LF";
|
|
terminal.m.lineFeed = '\r\n';
|
|
}
|
|
}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
function terminalCaptureToggle(e) {
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{TerminalReplay}
|
|
if ((e != null) && (e.shiftKey == true)) { terminalReplay(); return; }
|
|
if (terminalReplayTimer != null) { return; }
|
|
// ###END###{TerminalReplay}
|
|
if (terminal.m.capture == undefined) {
|
|
terminal.m.capture = ''; // Start terminal capture
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
idx_terminalCaptureButton.value = "Detener captura";
|
|
// ###END###{!Mode-NodeWebkit}
|
|
} else {
|
|
if (terminal.m.capture.length > 0) {
|
|
var n = 'TerminalCapture', d = new Date();
|
|
if (amtsysstate) { n += '-' + amtsysstate['AMT_GeneralSettings'].response['HostName']; }
|
|
n += '-' + d.getFullYear() + '-' + ('0'+(d.getMonth()+1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
saveAs(data2blob(terminal.m.capture), n + '.txt');
|
|
delete terminal.m.capture;
|
|
idx_terminalCaptureButton.value = "Iniciar captura";
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file');
|
|
chooser.setAttribute('nwsaveas', n + '.txt');
|
|
chooser.addEventListener('change', function() {
|
|
require('fs').writeFile(this.value, terminal.m.capture, function () { });
|
|
delete terminal.m.capture;
|
|
}, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
} else {
|
|
delete terminal.m.capture;
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
idx_terminalCaptureButton.value = "Iniciar captura";
|
|
// ###END###{!Mode-NodeWebkit}
|
|
}
|
|
}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_SetupMainMenu(currentView);
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
// ###BEGIN###{TerminalReplay}
|
|
function terminalReplay() {
|
|
if (xxdialogMode) return;
|
|
if (terminalReplayTimer != null) {
|
|
clearInterval(terminalReplayTimer); terminalReplayBuffer = null; terminalReplayBufferPtr = 0; terminalReplayTimer = null;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_SetupMainMenu(currentView);
|
|
// ###END###{Mode-NodeWebkit}
|
|
} else {
|
|
setDialogMode(11, "Captura de terminal abierta", 3, terminalReplayEx, '<input id=termCaptureFile type=file style=width:100% accept=.txt>');
|
|
}
|
|
}
|
|
|
|
function terminalReplayEx() {
|
|
var x = Q('termCaptureFile');
|
|
if (x.files.length != 1) return;
|
|
var reader = new FileReader();
|
|
reader.onload = terminalReplayEx2;
|
|
reader.readAsBinaryString(x.files[0]);
|
|
}
|
|
|
|
var terminalReplayBuffer = null;
|
|
var terminalReplayBufferPtr = 0;
|
|
var terminalReplayTimer = null;
|
|
function terminalReplayEx2(file) {
|
|
terminal.m.TermResetScreen();
|
|
if (terminalReplayTimer != null) { clearInterval(terminalReplayTimer); terminalReplayTimer = null; }
|
|
terminalReplayBufferPtr = 0;
|
|
terminalReplayBuffer = file.target.result;
|
|
terminalReplayTimer = setInterval(terminalReplayEx3, 5);
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_SetupMainMenu(currentView);
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
function terminalReplayEx3() {
|
|
var len = ((terminalReplayBufferPtr - 1) < terminalReplayBuffer.length) ? 2 : 1;
|
|
var x = terminalReplayBuffer.substring(terminalReplayBufferPtr, terminalReplayBufferPtr + len);
|
|
terminal.m.ProcessData(x);
|
|
terminalReplayBufferPtr += len;
|
|
if (terminalReplayBufferPtr >= terminalReplayBuffer.length) {
|
|
clearInterval(terminalReplayTimer); terminalReplayBuffer = null; terminalReplayBufferPtr = 0; terminalReplayTimer = null;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_SetupMainMenu(currentView);
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
}
|
|
|
|
// ###END###{TerminalReplay}
|
|
|
|
function terminal_FileSelectHandler(e) {
|
|
haltEvent(e);
|
|
if (terminal.State != 3 || e.dataTransfer == null || e.dataTransfer.files.length != 1) return;
|
|
var reader = new FileReader();
|
|
reader.onload = terminal_onSetupBinRead;
|
|
reader.readAsText(e.dataTransfer.files[0]);
|
|
}
|
|
|
|
function terminal_onSetupBinRead(file) {
|
|
d3pastetextarea.value = file.target.result;
|
|
setDialogMode(3, "Pegar", 3, termPaste)
|
|
}
|
|
|
|
// ###END###{Terminal}
|
|
|
|
//
|
|
// Remote Desktop
|
|
//
|
|
|
|
// ###BEGIN###{Desktop}
|
|
|
|
// ###BEGIN###{Desktop-Multi}
|
|
var desktopScreenInfo = null;
|
|
var desktopPollTimer = null;
|
|
// ###END###{Desktop-Multi}
|
|
// ###BEGIN###{DesktopInband}
|
|
var webRtcDesktop = null;
|
|
function webRtcDesktopReset() {
|
|
if (webRtcDesktop == null) return;
|
|
if (webRtcDesktop.softdesktop != null) { webRtcDesktop.softdesktop.Stop(); webRtcDesktop.softdesktop = null; }
|
|
if (webRtcDesktop.webchannel != null) { try { webRtcDesktop.webchannel.close(); } catch (e) { } webRtcDesktop.webchannel = null; }
|
|
if (webRtcDesktop.webrtc != null) { try { webRtcDesktop.webrtc.close(); } catch (e) { } webRtcDesktop.webrtc = null; }
|
|
webRtcDesktop = null;
|
|
// Switch back to hardware KVM
|
|
desktop.m.hold(false);
|
|
updateDesktopState();
|
|
// ###BEGIN###{DesktopInbandFiles}
|
|
p24files = null;
|
|
p24downloadFileCancel() // If any downloads are in process, cancel them.
|
|
p24uploadFileCancel(); // If any uploads are in process, cancel them.
|
|
QV('go24', false); // Files
|
|
if (currentView == 24) { go(14); }
|
|
// ###END###{DesktopInbandFiles}
|
|
}
|
|
|
|
/*
|
|
function webRtcDesktopProcessData(data) {
|
|
console.log('WebRTC data, len = ' + data.length);
|
|
}
|
|
*/
|
|
// ###END###{DesktopInband}
|
|
|
|
function connectDesktopButton(e) { desktop.disconnectCode = 0; connectDesktop(e); }
|
|
|
|
var connectDesktopConsent = false;
|
|
function connectDesktop(skipConsent) {
|
|
if (!desktop || xxdialogMode) return;
|
|
connectDesktopConsent = false; // TODO, this is not a good idea when calls are pending.
|
|
if (desktop.State == 0) {
|
|
// Check if user consent is needed
|
|
if ((skipConsent !== true) && (amtversion > 5) && (amtsysstate != null) && (amtsysstate['IPS_OptInService'] != null) && (amtsysstate['IPS_OptInService'].response != undefined) && (amtsysstate['IPS_OptInService'].response['OptInRequired'] == 0xFFFFFFFF)) {
|
|
connectDesktopConsent = true; amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1); return; // User consent always required, ask for it before KVM.
|
|
}
|
|
// Encoding Flags: 1 = RLE, 2 = 16bit, 4 = Gray, 8 = ZLib, 16 = 4bit Color
|
|
desktop.m.useRLE = ((desktopsettings.encflags & 1) != 0);
|
|
desktop.m.bpp = (desktopsettings.encflags & 2) ? 2 : 1;
|
|
if ((amtversion > 15) && (amtsysstate != null) && (amtsysstate['IPS_KVMRedirectionSettingData'] != null) && (amtsysstate['IPS_KVMRedirectionSettingData'].response)) {
|
|
desktop.m.lowcolor = amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported'] && ((desktopsettings.encflags & 16) != 0);
|
|
desktop.m.graymode = amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported'] && ((desktopsettings.encflags & 4) != 0);
|
|
desktop.m.useZLib = amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported'] && ((desktopsettings.encflags & 8) != 0);
|
|
desktop.m.decimationMode = ((amtsysstate['IPS_KVMRedirectionSettingData'].response['InitialDecimationModeForLowRes'] > 0) ? desktopsettings.decimationMode : 0);
|
|
} else {
|
|
desktop.m.lowcolor = false;
|
|
desktop.m.graymode = false;
|
|
desktop.m.useZLib = false;
|
|
desktop.m.decimationMode = 0;
|
|
}
|
|
desktop.m.showmouse = desktopsettings.showmouse;
|
|
desktop.m.onScreenSizeChange = center;
|
|
// ###BEGIN###{ComputerSelector}
|
|
desktop.digestRealmMatch = amtstack.wsman.comm.digestRealm;
|
|
// ###END###{ComputerSelector}
|
|
// ###BEGIN###{DesktopInband}
|
|
desktop.m.onKvmData = function(x) {
|
|
//console.log('onKvmData (' + x.length + '): ' + x);
|
|
var data = null;
|
|
try { data = JSON.parse(x); } catch (e) {}
|
|
if ((data != null) && (data.action != null)) {
|
|
if (data.action == 'restart') {
|
|
// Clear WebRTC channel
|
|
webRtcDesktopReset();
|
|
desktop.m.sendKvmData(JSON.stringify({ action: 'present', ver: 1 }));
|
|
} else if ((data.action == 'present') && (webRtcDesktop == null)) {
|
|
// Setup WebRTC channel
|
|
webRtcDesktop = { platform: data.platform };
|
|
var configuration = null; //{ "iceServers": [ { 'urls': 'stun:stun.services.mozilla.com' }, { 'urls': 'stun:stun.l.google.com:19302' } ] };
|
|
if (typeof RTCPeerConnection !== 'undefined') { webRtcDesktop.webrtc = new RTCPeerConnection(configuration); }
|
|
else if (typeof webkitRTCPeerConnection !== 'undefined') { webRtcDesktop.webrtc = new webkitRTCPeerConnection(configuration); }
|
|
|
|
webRtcDesktop.webchannel = webRtcDesktop.webrtc.createDataChannel("DataChannel", {}); // { ordered: false, maxRetransmits: 2 }
|
|
webRtcDesktop.webchannel.onopen = function () {
|
|
// Switch to software KVM
|
|
if (urlvars && urlvars['kvmdatatrace']) { console.log('WebRTC Data Channel Open'); }
|
|
desktop.m.hold(true);
|
|
webRtcDesktop.webRtcActive = true;
|
|
webRtcDesktop.softdesktop = CreateKvmDataChannel(webRtcDesktop.webchannel, CreateAgentRemoteDesktop('Desk', Q('id_mainarea')), desktop.m);
|
|
webRtcDesktop.softdesktop.m.setRotation(desktop.m.rotation);
|
|
if (desktopsettings.quality) { webRtcDesktop.softdesktop.m.CompressionLevel = desktopsettings.quality; } // Number from 1 to 100. 50 or less is best.
|
|
if (desktopsettings.scaling) { webRtcDesktop.softdesktop.m.ScalingLevel = desktopsettings.scaling; }
|
|
webRtcDesktop.softdesktop.Start();
|
|
updateDesktopState();
|
|
|
|
// Check if we can get remote file access
|
|
// ###BEGIN###{DesktopInbandFiles}
|
|
QV('go24', true); // Files
|
|
downloadFile = null;
|
|
p24files = webRtcDesktop.softdesktop;
|
|
p24targetpath = '';
|
|
webRtcDesktop.softdesktop.onControlMsg = onFilesControlData;
|
|
webRtcDesktop.softdesktop.sendCtrlMsg(JSON.stringify({ action: 'ls', reqid: 1, path: '' })); // Ask for the root folder
|
|
// ###END###{DesktopInbandFiles}
|
|
}
|
|
webRtcDesktop.webchannel.onclose = function (event) { if (urlvars['kvmdatatrace']) { console.log('WebRTC Data Channel Closed'); } webRtcDesktopReset(); }
|
|
webRtcDesktop.webrtc.onicecandidate = function (e) {
|
|
if (e.candidate == null) {
|
|
desktop.m.sendKvmData(JSON.stringify({ action: 'offer', ver: 1, sdp: webRtcDesktop.webrtcoffer.sdp }));
|
|
} else {
|
|
webRtcDesktop.webrtcoffer.sdp += ('a=' + e.candidate.candidate + '\r\n'); // New candidate, add it to the SDP
|
|
}
|
|
}
|
|
webRtcDesktop.webrtc.oniceconnectionstatechange = function () {
|
|
if ((webRtcDesktop != null) && (webRtcDesktop.webrtc != null) && ((webRtcDesktop.webrtc.iceConnectionState == 'disconnected') || (webRtcDesktop.webrtc.iceConnectionState == 'failed'))) { /*console.log('WebRTC ICE Failed');*/ webRtcDesktopReset(); }
|
|
}
|
|
webRtcDesktop.webrtc.createOffer(function (offer) {
|
|
// Got the offer
|
|
webRtcDesktop.webrtcoffer = offer;
|
|
webRtcDesktop.webrtc.setLocalDescription(offer, function () { }, webRtcDesktopReset);
|
|
}, webRtcDesktopReset, { mandatory: { OfferToReceiveAudio: false, OfferToReceiveVideo: false } });
|
|
} else if ((data.action == 'answer') && (webRtcDesktop != null)) {
|
|
// Complete the WebRTC channel
|
|
webRtcDesktop.webrtc.setRemoteDescription(new RTCSessionDescription({ type: 'answer', sdp: data.sdp }), function () { }, webRtcDesktopReset);
|
|
}
|
|
}
|
|
};
|
|
if ((amtversion > 15) || urlvars['kvmext']) { desktop.m.kvmExtChanged = updateDesktopState; } else { desktop.m.kvmExtChanged = null; }
|
|
// ###END###{DesktopInband}
|
|
desktop.m.frameRateDelay = ((desktopsettings.limitFrameRate == true)?200:0);
|
|
desktop.m.noMouseRotate = desktopsettings.noMouseRotate;
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
desktop.tlsv1only = amtstack.wsman.comm.tlsv1only;
|
|
desktop.Start(currentMeshNode._id, 16994, '*', '*', 0);
|
|
// ###END###{Mode-MeshCentral2}
|
|
// ###BEGIN###{ComputerSelector}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) {
|
|
desktop.Start(currentcomputer._id, 0, 'x', 'x', 0, wsstack.comm, meshCentralServer);
|
|
} else {
|
|
// ###END###{MeshServerConnect}
|
|
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
|
|
if ((amtsysstate) && (amtsysstate['IPS_ScreenConfigurationService'] != null) && ((amtsysstate['IPS_ScreenConfigurationService'].response['EnabledState'] & 1) != 0)) {
|
|
amtstack.IPS_ScreenConfigurationService_SetSessionState(Q('id_DeskSB').checked == true ? 1 : 0, 3, function (stack, name, responses, status) {
|
|
if (status != 200) { Q('id_DeskSB').checked = false; } // Screen blanking command is not supported, uncheck the screen blanking
|
|
desktop.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], wsstack.comm.getPeerCertificateFingerprint(), wsstack.comm.xtlsoptions);
|
|
});
|
|
} else {
|
|
desktop.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], wsstack.comm.getPeerCertificateFingerprint(), wsstack.comm.xtlsoptions);
|
|
}
|
|
// ###BEGIN###{MeshServerConnect}
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
desktop.tlsv1only = amtstack.wsman.comm.tlsv1only;
|
|
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
|
|
if ((amtsysstate) && (amtsysstate['IPS_ScreenConfigurationService'] != null) && ((amtsysstate['IPS_ScreenConfigurationService'].response['EnabledState'] & 1) != 0)) {
|
|
amtstack.IPS_ScreenConfigurationService_SetSessionState(Q('id_DeskSB').checked == true ? 1 : 0, 3, function (stack, name, responses, status) {
|
|
if (status != 200) { Q('id_DeskSB').checked = false; } // Screen blanking command is not supported, uncheck the screen blanking
|
|
desktop.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls']);
|
|
});
|
|
} else {
|
|
desktop.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls']);
|
|
}
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###END###{ComputerSelector}
|
|
// ###BEGIN###{Mode-Firmware}
|
|
desktop.Start();
|
|
// ###END###{Mode-Firmware}
|
|
// ###BEGIN###{Desktop-Multi}
|
|
PullDesktopDisplayInfo();
|
|
|
|
if (!urlvars['norefresh']) { desktopPollTimer = setInterval(PullDesktopDisplayInfo, 5000); }
|
|
|
|
// ###END###{Desktop-Multi}
|
|
} else {
|
|
desktop.Stop();
|
|
// ###BEGIN###{Desktop-Multi}
|
|
clearInterval(desktopPollTimer);
|
|
desktopPollTimer = null;
|
|
PullDesktopDisplayInfo();
|
|
// ###END###{Desktop-Multi}
|
|
// ###BEGIN###{DesktopInband}
|
|
webRtcDesktopReset();
|
|
// ###END###{DesktopInband}
|
|
}
|
|
}
|
|
|
|
// ###BEGIN###{Desktop-Multi}
|
|
function PullDesktopDisplayInfo() {
|
|
if ((amtversion > 7) && (desktop.State > 0)) { amtstack.BatchEnum('', ['*IPS_ScreenSettingData', '*IPS_KVMRedirectionSettingData'], ProcessDesktopDisplayInfo); } else { desktopScreenInfo = null; Q('id_DeskScreenSelector').innerHTML = '' }
|
|
}
|
|
|
|
// Update the currently active displays
|
|
function ProcessDesktopDisplayInfo(stack, name, responses, status) {
|
|
if (status != 200) { desktopScreenInfo = null; return; }
|
|
desktopScreenInfo = responses['IPS_ScreenSettingData'].responses.Body;
|
|
desktopScreenInfo.KVMRSD = responses['IPS_KVMRedirectionSettingData'].responses.Body;
|
|
UpdateDesktopDisplayInfo();
|
|
}
|
|
|
|
// Update screen icons
|
|
function UpdateDesktopDisplayInfo() {
|
|
var buttons = '', activeScreens = 0;
|
|
for (var i = 0; i < 3; i++) { if (desktopScreenInfo['IsActive'][i] == true) { activeScreens++; buttons += '<input type="button" ' + ((i == desktopScreenInfo.KVMRSD['DefaultScreen'])?'style="background-color:DodgerBlue"':'') + ' value="' + (i + 1) + '" title="Switch to screen ' + (i + 1) + '" onkeypress="return false" onkeydown="return false" onclick="desktopSwitchScreen(' + i + ')"> '; } }
|
|
if (activeScreens > 1) { Q('id_DeskScreenSelector').innerHTML = buttons + ' '; } else { Q('id_DeskScreenSelector').innerHTML = ''; }
|
|
}
|
|
|
|
// Request switch to a different desktop
|
|
function desktopSwitchScreen(x) {
|
|
var k = Clone(desktopScreenInfo.KVMRSD); k['DefaultScreen'] = x; amtstack.Put('IPS_KVMRedirectionSettingData', k, desktopSwitchScreenEx);
|
|
}
|
|
|
|
// Response to request for a different desktop
|
|
function desktopSwitchScreenEx(stack, name, responses, status) {
|
|
if (status == 200) { desktopScreenInfo.KVMRSD = responses.Body; UpdateDesktopDisplayInfo(); }
|
|
}
|
|
// ###END###{Desktop-Multi}
|
|
|
|
function onDesktopStateChange(desktop, state) {
|
|
var reconnect = false;
|
|
//console.log("onDesktopStateChange: " + state);
|
|
idx_connectbutton1.value = (state == 0) ? "Conectar" : "Desconectar";
|
|
var input = ((state == 3) && !urlvars['kvmviewonly']);
|
|
QE('id_DeskCAD', input);
|
|
QE('deskkeys', input);
|
|
QE('DeskWD', input);
|
|
// ###BEGIN###{DesktopType}
|
|
QE('id_DeskType', input);
|
|
// ###END###{DesktopType}
|
|
// ###BEGIN###{DesktopClipboard}
|
|
QE('id_DeskKvmClipButton', state == 3);
|
|
// ###END###{DesktopClipboard}
|
|
switch (state) {
|
|
case 0:
|
|
// ###BEGIN###{DesktopRecorder}
|
|
if (desktop.m.recordedData != null) { deskRecordSession(); }
|
|
// ###END###{DesktopRecorder}
|
|
// desktop.m.ResetScreen();
|
|
// ###BEGIN###{DesktopInband}
|
|
webRtcDesktopReset();
|
|
// ###END###{DesktopInband}
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
QV('deskRecordIcon', false);
|
|
// ###END###{Mode-MeshCentral2}
|
|
if (desktop.disconnectCode == 2) { // BUSY
|
|
messagebox("Escritorio remoto", "The remote device is busy, a session may already be open.");
|
|
} else if (desktop.disconnectCode == 3) { // UNSUPPORTED
|
|
messagebox("Escritorio remoto", "The device indicated that this type of connection of not supported.");
|
|
} else if (desktop.disconnectCode == 50000) { // KVM-Disconnect
|
|
messagebox("Escritorio remoto", "KVM disconnection, this may indicate that Intel AMT is unable to capture the display (Try RLE8 encoding), or unsupported GPU.");
|
|
} else if (desktop.disconnectCode == 50001) { // Intel AMT disconnect, try to connect again if connection was more than 5 seconds long.
|
|
reconnect = (desktop.connectTime != null) && ((desktop.connectTime + 5000) < Date.now());
|
|
console.log(desktop.disconnectCode, reconnect);
|
|
} else if (desktop.disconnectCode == 50002) { // KVM-BufferOverflow
|
|
messagebox("Escritorio remoto", "KVM disconnection that may be due to the display size and resolution being too large for the Intel AMT KVM buffer. Try RLE8 encoding or reducing the display resolution.");
|
|
}
|
|
break;
|
|
case 3:
|
|
// ###BEGIN###{DesktopInband}
|
|
if (amtversion >= 12) { desktop.m.sendKvmData(JSON.stringify({ action: 'present', ver: 1 })); } // If this is Intel AMT 12 or higher, send the soft-KVM presence indicator.
|
|
// ###END###{DesktopInband}
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
if (desktop.serverIsRecording == true) { QV('deskRecordIcon', true); }
|
|
// ###END###{Mode-MeshCentral2}
|
|
break;
|
|
}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_SetupMainMenu(currentView);
|
|
// ###END###{Mode-NodeWebkit}
|
|
center();
|
|
updateDesktopState();
|
|
if (reconnect) { setTimeout(connectDesktop, 200); }
|
|
}
|
|
|
|
// Update remote desktop status
|
|
function updateDesktopState() {
|
|
// ###BEGIN###{DesktopInband}
|
|
var x = '';
|
|
if (desktop.State == 3) {
|
|
if ((webRtcDesktop) && (webRtcDesktop.webRtcActive == true)) {
|
|
x = ", Soft-KVM";
|
|
} else {
|
|
if (desktop.m && desktop.m.kvmExt) {
|
|
if (desktop.m.kvmExt.decimationState == 1) { x += ", Downscaled" }
|
|
if (desktop.m.kvmExt.compression == 1) { x += ", Compressed" }
|
|
}
|
|
}
|
|
}
|
|
Q('id_deskstatus').textContent = StatusStrs[desktop.State] + x;
|
|
// ###END###{DesktopInband}
|
|
// ###BEGIN###{!DesktopInband}
|
|
Q('id_deskstatus').textContent = StatusStrs[desktop.State];
|
|
// ###END###{!DesktopInband}
|
|
}
|
|
|
|
function showDesktopSettings() {
|
|
if (xxdialogMode) return;
|
|
applyDesktopSettings();
|
|
setDialogMode(7, "Configuración de escritorio remoto", 3, showDesktopSettingsChanged);
|
|
}
|
|
|
|
function showDesktopSettingsChanged() {
|
|
desktopsettings.encflags = parseInt(idx_d7desktopmode.value);
|
|
// ###BEGIN###{DesktopFocus}
|
|
desktopsettings.showfocus = d7showfocus.checked;
|
|
if ((amtversion > 15) && (amtsysstate['IPS_KVMRedirectionSettingData'].response['InitialDecimationModeForLowRes'] > 0)) { desktopsettings.decimationMode = parseInt(d7decimation.value); }
|
|
// ###END###{DesktopFocus}
|
|
desktopsettings.showmouse = d7showcursor.checked;
|
|
desktopsettings.showcad = d7showcad.checked;
|
|
desktopsettings.limitFrameRate = d7limitFrameRate.checked;
|
|
desktopsettings.noMouseRotate = d7noMouseRotate.checked;
|
|
// ###BEGIN###{DesktopInband}
|
|
desktopsettings.quality = d7bitmapquality.value;
|
|
desktopsettings.scaling = d7bitmapscaling.value;
|
|
// ###END###{DesktopInband}
|
|
try { localStorage.setItem('desktopsettings', JSON.stringify(desktopsettings)); } catch (ex) { }
|
|
applyDesktopSettings();
|
|
// ###BEGIN###{DesktopFocus}
|
|
if (desktopsettings.showfocus == false) { desktop.m.focusmode = 0; idx_deskFocusBtn.value = "Todo el enfoque"; }
|
|
// ###END###{DesktopFocus}
|
|
desktop.m.frameRateDelay = (desktopsettings.limitFrameRate == true)?200:0;
|
|
if (desktop.State != 0) { desktop.disconnectCode = 0; desktop.Stop(); setTimeout(connectDesktop, 800); }
|
|
}
|
|
|
|
function applyDesktopSettings() {
|
|
// ###BEGIN###{DesktopFocus}
|
|
d7showfocus.checked = desktopsettings.showfocus;
|
|
// ###END###{DesktopFocus}
|
|
d7decimation.value = desktopsettings.decimationMode;
|
|
d7showcursor.checked = desktopsettings.showmouse;
|
|
d7showcad.checked = desktopsettings.showcad;
|
|
d7limitFrameRate.checked = desktopsettings.limitFrameRate;
|
|
d7noMouseRotate.checked = desktopsettings.noMouseRotate;
|
|
// ###BEGIN###{DesktopInband}
|
|
if (desktopsettings.quality) { d7bitmapquality.value = desktopsettings.quality; }
|
|
if (desktopsettings.scaling) { d7bitmapscaling.value = desktopsettings.scaling; }
|
|
QV('d7softkvmsettings', amtversion >= 12);
|
|
// ###END###{DesktopInband}
|
|
var encflags = desktopsettings.encflags; // Flags: 1 = RLE, 2 = 16bit, 4 = Gray, 8 = ZLib, 16 = 4bit Color
|
|
|
|
var x = '';
|
|
if ((amtversion > 15) && (amtsysstate != null) && (amtsysstate['IPS_KVMRedirectionSettingData'] != null) && (amtsysstate['IPS_KVMRedirectionSettingData'].response)) {
|
|
if (!amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported']) { encflags = encflags & 11; } // Remove grayscale and lowcolor
|
|
if (!amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported']) { encflags = encflags & 23; } // Remove zlib
|
|
if (amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported']) {
|
|
x += '<option id="d7exm1" value=21>' + "RLE4G, 16 Grays" + '</option>';
|
|
x += '<option id="d7exm2" value=5>' + "RLE8G, 256 Grays" + '</option>';
|
|
}
|
|
x += '<option value=1>' + "RLE8, 256 Colors" + '</option>';
|
|
x += '<option value=3>' + "RLE16, 64k Colors" + '</option>';
|
|
if (amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported']) {
|
|
if (amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported']) {
|
|
x += '<option id="d7exm3" value=29>' + "ZRLE4G, Compressed Gray" + '</option>';
|
|
x += '<option id="d7exm4" value=13>' + "ZRLE8G, Compressed Gray" + '</option>';
|
|
}
|
|
x += '<option id="d7exm5" value=9>' + "ZRLE8, Compressed Color" + '</option>';
|
|
x += '<option id="d7exm6" value=11>' + "ZRLE16, Compressed Color" + '</option>';
|
|
}
|
|
QV('d7decimationspan', amtsysstate['IPS_KVMRedirectionSettingData'].response['InitialDecimationModeForLowRes'] > 0);
|
|
} else {
|
|
encflags = encflags & 3; // Remove gray & zlib flags (4 and 8), keep 1 & 2
|
|
x += '<option value=1>' + "RLE8, 256 Colors" + '</option>';
|
|
x += '<option value=3>' + "RLE16, 64k Colors" + '</option>';
|
|
QV('d7decimationspan', false);
|
|
}
|
|
x += '<option value=0>' + "RAW8, 256 Colors" + '</option>';
|
|
x += '<option value=2>' + "RAW16, 16k Colors" + '</option>';
|
|
QH('idx_d7desktopmode', x);
|
|
idx_d7desktopmode.value = encflags;
|
|
// ###BEGIN###{DesktopFocus}
|
|
QV('idx_deskFocusBtn', desktopsettings.showfocus);
|
|
// ###END###{DesktopFocus}
|
|
QV('id_DeskCAD', desktopsettings.showcad);
|
|
}
|
|
|
|
var fullscreen = false;
|
|
var fullscreenonly = false;
|
|
function deskToggleFull(kvmonly) {
|
|
if (xxdialogMode) return;
|
|
if (fullscreenonly == true) {
|
|
// We are in full screen only mode
|
|
console.log('deskToggleFull1', fullscreenonly, urlvars['kvmonly']);
|
|
fullscreenonly = false;
|
|
if (urlvars['kvmonly'] == 1) {
|
|
console.log('deskToggleFull2');
|
|
// It was initiated by a command line switch, exit now.
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
require('nw.gui').Window.get().close();
|
|
// ###END###{Mode-NodeWebkit}
|
|
} else {
|
|
// It was initiated by a menu selection, disconnect now.
|
|
disconnect();
|
|
}
|
|
return;
|
|
}
|
|
fullscreenonly = kvmonly;
|
|
fullscreen = !fullscreen;
|
|
// ###BEGIN###{!Look-MeshCentral}
|
|
QV('id_topheader', !fullscreen);
|
|
// ###END###{!Look-MeshCentral}
|
|
QV('id_leftbar', !fullscreen);
|
|
QV('id_rdheader', !fullscreen);
|
|
QV('idx_deskFullBtn', !fullscreen);
|
|
QV('idx_deskFullBtn2', fullscreen);
|
|
if (fullscreen) {
|
|
// ###BEGIN###{!Look-MeshCentral}
|
|
QS('id_mainarea').top = 0;
|
|
// ###END###{!Look-MeshCentral}
|
|
QS('id_mainarea').left = 0;
|
|
QS('id_mainarea_pad').padding = 0;
|
|
} else {
|
|
// ###BEGIN###{!Look-MeshCentral}
|
|
// ###BEGIN###{!Look-ISDU}
|
|
QS('id_mainarea').top = '69px';
|
|
// ###END###{!Look-ISDU}
|
|
// ###BEGIN###{Look-ISDU}
|
|
QS('id_mainarea').top = '94px';
|
|
// ###END###{Look-ISDU}
|
|
// ###END###{!Look-MeshCentral}
|
|
QS('id_mainarea').left = '156px';
|
|
QS('id_mainarea_pad').padding = '8px';
|
|
}
|
|
center();
|
|
}
|
|
|
|
// ###BEGIN###{DesktopFocus}
|
|
function deskToggleFocus() {
|
|
desktop.m.focusmode = (desktop.m.focusmode + 64) % 192;
|
|
Q('idx_deskFocusBtn').value = ["Todo el enfoque", "Pequeño enfoque", "Gran enfoque"][desktop.m.focusmode / 64];
|
|
}
|
|
// ###END###{DesktopFocus}
|
|
|
|
// ###BEGIN###{DesktopType}
|
|
// Remote desktop typing
|
|
function deskShowTypeDialog() {
|
|
if (xxdialogMode || desktop.State != 3) return;
|
|
Q('id_DeskType').blur();
|
|
var x = '<div>' + "Ingrese el texto y haga clic en Aceptar para escribirlo de forma remota con un teclado de inglés de EE. UU. Asegúrese de colocar el cursor remoto en la posición correcta antes de continuar." + '<div>';
|
|
x += '<textarea id=d2typeText style="margin-top:5px;width:100%;height:184px;resize:none" maxlength=2000></textarea>';
|
|
setDialogMode(11, "Entrada remota de teclado", 3, showDeskTypeEx, x);
|
|
Q('d2typeText').focus();
|
|
}
|
|
|
|
var AmtDeskTypeTimer = null;
|
|
var AmtDeskTypeContent = null;
|
|
var DeskTypeTranslate = { 39: 222, 42: 106, 43: 107, 44: 188, 45: 189, 46: 190, 47: 191, 59: 186, 61: 187, 91: 219, 92: 220, 93: 221, 96: 192, 191: 111 };
|
|
var DeskTypeShiftTranslate = { 33: 49, 34: 222, 35: 51, 36: 52, 37: 53, 38: 55, 40: 57, 41: 48, 58: 186, 60: 188, 62: 190, 63: 191, 64: 50, 94: 54, 95: 189, 106: 56, 107: 187, 123: 219, 124: 220, 125: 221, 126: 192 };
|
|
function showDeskTypeEx() {
|
|
var txt = Q('d2typeText').value, ltxt = Q('d2typeText').value.toUpperCase(), x = [], shift = false;
|
|
//if (desktop.contype == 2) {
|
|
// Intel AMT
|
|
for (var i in txt) { var a = txt.charCodeAt(i); x.push([a, 1], [a, 0]); }
|
|
AmtDeskTypeContent = x;
|
|
AmtDeskTypeTimer = setInterval(function () {
|
|
var key = AmtDeskTypeContent.shift();
|
|
if (desktop) { desktop.m.sendkey(key[0], key[1]); }
|
|
if ((desktop == null) || (AmtDeskTypeContent.length == 0)) { clearInterval(AmtDeskTypeTimer); AmtDeskTypeContent = null; }
|
|
}, 10);
|
|
/*
|
|
} else {
|
|
// MeshAgent
|
|
for (var i in txt) {
|
|
var a = txt.charCodeAt(i), b = ltxt.charCodeAt(i);
|
|
if (((a >= 65) && (a <= 90)) || ((a >= 97) && (a <= 122))) {
|
|
if ((a == b) && (shift == false)) { x.push([desktop.m.KeyAction.DOWN, 16]); shift = true; } // LShift down
|
|
if ((a != b) && (shift == true)) { x.push([desktop.m.KeyAction.UP, 16]); shift = false; } // LShift up
|
|
} else if ((a >= 48) && (a <= 57)) {
|
|
if (shift == true) { x.push([desktop.m.KeyAction.UP, 16]); shift = false; } // Shift up
|
|
} else if (DeskTypeTranslate[a]) {
|
|
if (shift == true) { x.push([desktop.m.KeyAction.UP, 16]); shift = false; } // Shift up
|
|
b = DeskTypeTranslate[a];
|
|
} else if (DeskTypeShiftTranslate[a]) {
|
|
if (shift == false) { x.push([desktop.m.KeyAction.DOWN, 16]); shift = true; } // LShift down
|
|
b = DeskTypeShiftTranslate[a];
|
|
}
|
|
x.push([desktop.m.KeyAction.DOWN, b], [desktop.m.KeyAction.UP, b]);
|
|
}
|
|
if (shift == true) { x.push([desktop.m.KeyAction.UP, 16]); shift = false; } // Shift up
|
|
desktop.m.SendKeyMsgKC(x);
|
|
}
|
|
*/
|
|
}
|
|
// ###END###{DesktopType}
|
|
|
|
// Send CTRL-ALT-DEL
|
|
function sendCAD() { if (!Q('id_DeskVO').checked) { desktop.m.sendcad(); } }
|
|
|
|
// Special keys
|
|
var deskkeysset = {
|
|
0: [[0xffe7, 1], [0xffe7, 0]], // Win
|
|
1: [[0xffe7, 1], [0xff54, 1], [0xff54, 0], [0xffe7, 0]], // Win+Down
|
|
2: [[0xffe7, 1], [0xff52, 1], [0xff52, 0], [0xffe7, 0]], // Win+Up
|
|
3: [[0xffe7, 1], [0x6c, 1], [0x6c, 0], [0xffe7, 0]], // Win+L
|
|
4: [[0xffe7, 1], [0x6d, 1], [0x6d, 0], [0xffe7, 0]], // Win+M
|
|
5: [[0xffe1, 1], [0xffe7, 1], [0x6d, 1], [0x6d, 0], [0xffe7, 0], [0xffe1, 0]], // Shift+Win+M
|
|
6: [[0xffbe, 1], [0xffbe, 0]], // F1
|
|
7: [[0xffbf, 1], [0xffbf, 0]], // F2
|
|
8: [[0xffc0, 1], [0xffc0, 0]], // F3
|
|
9: [[0xffc1, 1], [0xffc1, 0]], // F4
|
|
10: [[0xffc2, 1], [0xffc2, 0]], // F5
|
|
11: [[0xffc3, 1], [0xffc3, 0]], // F6
|
|
12: [[0xffc4, 1], [0xffc4, 0]], // F7
|
|
13: [[0xffc5, 1], [0xffc5, 0]], // F8
|
|
14: [[0xffc6, 1], [0xffc6, 0]], // F9
|
|
15: [[0xffc7, 1], [0xffc7, 0]], // F10
|
|
16: [[0xffc8, 1], [0xffc8, 0]], // F11
|
|
17: [[0xffc9, 1], [0xffc9, 0]], // F12
|
|
//18: [[0xffe1, 1], [0xffe9, 1], [65, 1], [65, 0], [0xffe9, 0], [0xffe1, 0]] // Left-Shift + Left-Alt + Print Screen
|
|
19: [[0xffe9, 1], [0xff09, 1], [0xff09, 0], [0xffe9, 0]], // Alt-Tab
|
|
20: [[0xffe7, 1], [0x72, 1], [0x72, 0], [0xffe7, 0]], // WIN+R
|
|
21: [[0xffe9, 1], [0xffc1, 1], [0xffc1, 0], [0xffe9, 0]], // Alt-F4
|
|
22: [[0xffe3, 1], [0x77, 1], [0x77, 0], [0xffe3, 0]], // Ctrl-W
|
|
23: [[0xffe7, 1], [0xff51, 1], [0xff51, 0], [0xffe7, 0]], // WIN+Left
|
|
24: [[0xffe7, 1], [0xff53, 1], [0xff53, 0], [0xffe7, 0]] // Win+Right
|
|
}
|
|
|
|
// Send special keys to the remote side.
|
|
function deskSendKeys() {
|
|
if (Q('id_DeskVO').checked) return;
|
|
var ks = Q('deskkeys').value;
|
|
if (ks != null && deskkeysset[ks] != null && desktop.State != 0) {
|
|
for (var i = 0; i < deskkeysset[ks].length; i++) {
|
|
desktop.m.sendkey(deskkeysset[ks][i][0], deskkeysset[ks][i][1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
// ###BEGIN###{DesktopClipboard}
|
|
// Toggle desktop session recording
|
|
function deskClipboard() {
|
|
if (xxdialogMode || (desktop == null) || (desktop.State != 3)) return;
|
|
var x = '';
|
|
x += "Ingrese el texto para enviar al portapapeles Intel® AMT." + '<br />';
|
|
x += '<select id=kvmClipEncoding style=width:100%;margin-top:8px><option value=0>' + "Text Encoding" + '<option value=1>' + "Hex Encoding" + '</select>';
|
|
x += '<textarea id=kvmClipText style=width:100%;height:120px;resize:none;margin-top:8px />';
|
|
setDialogMode(11, "Portapapeles", 3, deskClipboardEx, x);
|
|
focusTextBox('kvmClipText');
|
|
if (xxKvmClipEnc != null) { Q('kvmClipEncoding').value = xxKvmClipEnc; }
|
|
if (xxKvmClipVal != null) { Q('kvmClipText').value = xxKvmClipVal; }
|
|
}
|
|
|
|
function deskClipboardEx() {
|
|
xxKvmClipEnc = Q('kvmClipEncoding').value;
|
|
xxKvmClipVal = Q('kvmClipText').value;
|
|
if (Q('kvmClipEncoding').value == 0) {
|
|
desktop.m.sendClipboardData(Q('kvmClipText').value.split('\\0').join('\0')); // Text encoded input
|
|
} else {
|
|
desktop.m.sendClipboardData(hex2rstr(Q('kvmClipText').value)); // Hex encoded input
|
|
}
|
|
}
|
|
// ###END###{DesktopClipboard}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
// ###BEGIN###{DesktopRecorder}
|
|
// Toggle desktop session recording
|
|
function deskRecordSession() {
|
|
if ((desktop == null) || (urlvars && urlvars['norecord'])) return;
|
|
if (desktop.m.recordedData == null) {
|
|
// Start recording
|
|
if ((desktop.State === 3) && (desktop.m.StartRecording())) { Q('DeskRecordButton').classList.remove('videoIcon'); Q('DeskRecordButton').classList.add('videoIconRed'); }
|
|
} else {
|
|
// Stop recording
|
|
Q('DeskRecordButton').classList.remove('videoIconRed');
|
|
Q('DeskRecordButton').classList.add('videoIcon');
|
|
var d = new Date(), n = 'AmtDesktopSesion-' + currentcomputer['name'] + '-' + d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);
|
|
saveAs(data2blob(desktop.m.StopRecording().join('')), n + '.mcrec');
|
|
}
|
|
}
|
|
// ###END###{DesktopRecorder}
|
|
// ###END###{FileSaver}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
// Save the desktop image to file
|
|
function deskSaveImage() {
|
|
if (xxdialogMode || (desktop.State != 3) || (urlvars && urlvars['norecord'])) return;
|
|
var n = 'Desktop', d = new Date();
|
|
if (amtsysstate) { n += '-' + amtsysstate['AMT_GeneralSettings'].response['HostName']; }
|
|
n += '-' + d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
Q('Desk')['toBlob']( function (blob) { saveAs(blob, n + '.jpg'); } );
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var b64image = document.getElementById('Desk').toDataURL('image/png').split(',')[1];
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file');
|
|
chooser.setAttribute('nwsaveas', n + '.png');
|
|
chooser.addEventListener('change', function () { console.log('cc'); require('fs').writeFile(this.value, b64image, 'base64', function () { }); }, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
// Send special keys
|
|
//function sendSpecialKey() { var k = Q('specialkeylist').value; desktop.m.sendkey(k, 1); desktop.m.sendkey(k, 0); }
|
|
|
|
// ###BEGIN###{!DesktopInband}
|
|
function dmousedown(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) desktop.m.mousedown(e); }
|
|
function dmouseup(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) desktop.m.mouseup(e); }
|
|
function dmousemove(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) desktop.m.mousemove(e); }
|
|
function dmousewheel(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) desktop.m.mousewheel(e); }
|
|
// ###END###{!DesktopInband}
|
|
// ###BEGIN###{DesktopInband}
|
|
function dmousedown(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) { if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.mousedown(e); desktop.m.sendKeepAlive(); } else { desktop.m.mousedown(e); } } }
|
|
function dmouseup(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) { if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.mouseup(e); desktop.m.sendKeepAlive(); } else { desktop.m.mouseup(e); } } }
|
|
function dmousemove(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) { if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.mousemove(e); desktop.m.sendKeepAlive(); } else { desktop.m.mousemove(e); } } }
|
|
function dmousewheel(e) { if (!xxdialogMode && (!Q('id_DeskVO').checked)) { if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null)) { webRtcDesktop.softdesktop.m.mousewheel(e); desktop.m.sendKeepAlive(); } else { desktop.m.mousewheel(e); } } }
|
|
// ###END###{DesktopInband}
|
|
|
|
function drotate(x) {
|
|
if (xxdialogMode) return;
|
|
var r = desktop.m.rotation + x;
|
|
desktop.m.setRotation(r);
|
|
// ###BEGIN###{DesktopInband}
|
|
if ((webRtcDesktop != null) && (webRtcDesktop.softdesktop != null) && (webRtcDesktop.softdesktop.m != null)) {
|
|
webRtcDesktop.softdesktop.m.setRotation(r); }
|
|
// ###END###{DesktopInband}
|
|
center();
|
|
}
|
|
|
|
// ###BEGIN###{DesktopInbandFiles}
|
|
|
|
//
|
|
// Remote Files
|
|
//
|
|
|
|
var p24files = null;
|
|
var p24filetree = null;
|
|
var p24targetpath = null;
|
|
var p24filetreelocation = [];
|
|
|
|
function onFilesControlData(data) {
|
|
if ((data.length > 0) && (data.charCodeAt(0) != 123)) { p24gotDownloadBinaryData(data); return; }
|
|
data = JSON.parse(data);
|
|
if (data.action == 'download') { p24gotDownloadCommand(data); return; }
|
|
if (data.action == 'upload') { p24gotUploadData(data); return; }
|
|
if (data.action == 'pong') { return; }
|
|
data.path = data.path.replace(/\//g, '\\');
|
|
if ((p24filetree != null) && (data.path == p24filetree.path)) {
|
|
// This is an update to the same folder
|
|
var checkedNames = p24getCheckedNames();
|
|
p24filetree = data;
|
|
p24updateFiles(checkedNames);
|
|
} else {
|
|
// Make both paths use the same seperator not start with /
|
|
var x1 = data.path.split('/').join('\\');
|
|
var x2 = p24targetpath.split('/').join('\\');
|
|
while ((x1.length > 0) && (x1[0] == '\\')) { x1 = x1.substring(1); }
|
|
while ((x2.length > 0) && (x2[0] == '\\')) { x2 = x2.substring(1); }
|
|
if ((x1 == x2) || ((data.path == '\\') && (p24targetpath == ''))) {
|
|
// This is a different folder
|
|
p24filetree = data;
|
|
p24updateFiles();
|
|
}
|
|
}
|
|
}
|
|
|
|
function p24getCheckedNames() {
|
|
// Save all existing checked boxes
|
|
var checkedNames = [], checkboxes = document.getElementsByName('fd');
|
|
for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { checkedNames.push(p24filetree.dir[checkboxes[i].value].n) }; }
|
|
return checkedNames;
|
|
}
|
|
|
|
//var p24oldlinkpath = null;
|
|
function p24updateFiles(checkedNames) {
|
|
var html1 = '', html2 = '', displayPath = '<a style=cursor:pointer onclick=p24folderup(0)>' + "Raíz" + '</a>', fullPath = 'Root';
|
|
|
|
// Work on parsing the file path
|
|
var x = p24filetree.path.split('\\');
|
|
p24filetreelocation = [];
|
|
for (var i in x) { if (x[i] != '') { p24filetreelocation.push(x[i]); } } // Remove empty spaces
|
|
for (var i in p24filetreelocation) { displayPath += ' / <a style=cursor:pointer onclick=p24folderup(' + (parseInt(i) + 1) + ')>' + p24filetreelocation[i] + '</a>' } // Setup the path we display
|
|
var newlinkpath = p24filetreelocation.join('/');
|
|
|
|
// Sort the files
|
|
var filetreexx = p24sort_files(p24filetree.dir);
|
|
|
|
// Display all files and folders at this location
|
|
for (var i in filetreexx) {
|
|
// Figure out the name and shortname
|
|
var f = filetreexx[i], name = f.n, shortname;
|
|
shortname = name;
|
|
if (name.length > 70) { shortname = '<span title="' + EscapeHtml(name) + '">' + EscapeHtml(name.substring(0, 70)) + "..." + '</span>'; } else { shortname = EscapeHtml(name); }
|
|
name = EscapeHtml(name);
|
|
|
|
// Figure out the date
|
|
var fdatestr = '';
|
|
if (f.d != null) { var fdate = new Date(f.d), fdatestr = (fdate.getMonth() + 1) + '/' + (fdate.getDate()) + '/' + fdate.getFullYear() + ' ' + fdate.toLocaleTimeString() + ' '; }
|
|
|
|
// Figure out the size
|
|
var fsize = '';
|
|
if (f.s != null) { fsize = getFileSizeStr(f.s); }
|
|
|
|
var h = '';
|
|
if (f.t < 3) {
|
|
var right = '', title = '';
|
|
h = '<div class=filelist file=999><input file=999 style=float:left name=fd class=fcb type=checkbox onchange=p24setActions() value="' + f.nx + '"> <span style=float:right title=\"' + title + '\">' + right + '</span><span><div class=fileIcon' + f.t + '></div><a style=cursor:pointer onclick=p24folderset(\"' + encodeURIComponent(f.nx) + '\")>' + shortname + '</a></span></div>';
|
|
} else {
|
|
var link = shortname;
|
|
if (f.s > 0) { link = '<a rel=\"noreferrer noopener\" target=\"_blank\" style=cursor:pointer onclick=\'p24downloadfile("' + encodeURIComponent(newlinkpath + '/' + name) + '","' + encodeURIComponent(name) + '",' + f.s + ')\'>' + shortname + '</a>'; }
|
|
h = '<div class=filelist file=3><input file=3 style=float:left name=fd class=fcb type=checkbox onchange=p24setActions() value="' + f.nx + '"> <span class=fsize>' + fdatestr + '</span><span style=float:right>' + fsize + '</span><span><div class=fileIcon' + f.t + '></div>' + link + '</span></div>';
|
|
}
|
|
|
|
if (f.t < 3) { html1 += h; } else { html2 += h; }
|
|
}
|
|
|
|
// Display the files and path
|
|
QH('p24files', html1 + html2);
|
|
QH('p24currentpath', displayPath);
|
|
QE('p24FolderUp', p24filetreelocation.length != 0);
|
|
|
|
// Re-check all boxes if needed using names
|
|
if (checkedNames != null) { var checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if (checkedNames.indexOf(p24filetree.dir[checkboxes[i].value].n) >= 0) { checkboxes[i].checked = true; } } }
|
|
|
|
// Update the actions buttons
|
|
p24setActions();
|
|
}
|
|
|
|
function p24folderset(x) {
|
|
p24targetpath = joinPaths(p24filetree.path, p24filetree.dir[x].n).split('\\').join('/');
|
|
p24files.sendCtrlMsg(JSON.stringify({ action: 'ls', reqid: 1, path: p24targetpath }));
|
|
}
|
|
|
|
function p24folderup(x) {
|
|
if (x == null) { p24filetreelocation.pop(); } else { while (p24filetreelocation.length > x) { p24filetreelocation.pop(); } }
|
|
p24targetpath = p24filetreelocation.join('/');
|
|
p24files.sendCtrlMsg(JSON.stringify({ action: 'ls', reqid: 1, path: p24targetpath }));
|
|
}
|
|
|
|
var p24sortorder;
|
|
function p24sort_filename(a, b) { if (a.ln > b.ln) return (1 * p24sortorder); if (a.ln < b.ln) return (-1 * p24sortorder); return 0; }
|
|
function p24sort_timestamp(a, b) { if (a.d > b.d) return (1 * p24sortorder); if (a.d < b.d) return (-1 * p24sortorder); return 0; }
|
|
function p24sort_bysize(a, b) { if (a.s == b.s) return p24sort_filename(a, b); return (((a.s - b.s)) * p24sortorder); }
|
|
|
|
function p24sort_files(files) {
|
|
var r = [], sortselection = Q('p24sortdropdown').value;
|
|
for (var i in files) { files[i].nx = i; if (files[i].s == null) { files[i].s = 0; } if (files[i].n == null) { files[i].n = i; } files[i].ln = files[i].n.toLowerCase(); r.push(files[i]); }
|
|
p24sortorder = 1;
|
|
if (sortselection > 3) { p24sortorder = -1; sortselection -= 3; }
|
|
if (sortselection == 1) { r.sort(p24sort_filename); }
|
|
else if (sortselection == 2) { r.sort(p24sort_bysize); }
|
|
else if (sortselection == 3) { r.sort(p24sort_timestamp); }
|
|
return r;
|
|
}
|
|
|
|
function p24setActions() {
|
|
if (p24filetree == null) {
|
|
QE('p24DeleteFileButton', false);
|
|
QE('p24NewFolderButton', false);
|
|
QE('p24UploadButton', false);
|
|
QE('p24RenameFileButton', false);
|
|
QE('p24SelectAllButton', false);
|
|
Q('p24SelectAllButton').value = "Seleccionar todo";
|
|
QE('p24RefreshButton', false);
|
|
QE('p24CutButton', false);
|
|
QE('p24CopyButton', false);
|
|
QE('p24PasteButton', false);
|
|
} else {
|
|
var cc = p24getFileSelCount(), tc = p24getFileCount(), sfc = p24getFileSelCount(false); // In order: number of entires selected, number of total entries, number of selected entires that are files (not folders)
|
|
var winAgent = (webRtcDesktop.platform == 'win32');
|
|
QE('p24DeleteFileButton', (cc > 0) && ((p24filetreelocation.length > 0) || (winAgent == false)));
|
|
QE('p24NewFolderButton', ((p24filetreelocation.length > 0) || (winAgent == false)));
|
|
QE('p24UploadButton', ((p24filetreelocation.length > 0) || (winAgent == false)));
|
|
QE('p24RenameFileButton', (cc == 1) && ((p24filetreelocation.length > 0) || (winAgent == false)));
|
|
QE('p24SelectAllButton', tc > 0);
|
|
Q('p24SelectAllButton').value = (cc > 0 ? "No seleccionar ninguno" : "Seleccionar todo");
|
|
QE('p24RefreshButton', true);
|
|
QE('p24CutButton', (cc > 0) && (cc == sfc) && ((p24filetreelocation.length > 0) || (winAgent == false)));
|
|
QE('p24CopyButton', (cc > 0) && (cc == sfc) && ((p24filetreelocation.length > 0) || (winAgent == false)));
|
|
QE('p24PasteButton', ((p24filetreelocation.length > 0) || (winAgent == false)) && ((p24clipboard != null) && (p24clipboard.length > 0)));
|
|
}
|
|
}
|
|
|
|
function p24getFileSelCount(includeDirs) { var cc = 0; var checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if ((checkboxes[i].checked) && ((includeDirs != false) || (checkboxes[i].attributes.file.value == "3"))) cc++; } return cc; }
|
|
function p24getFileCount() { var cc = 0; var checkboxes = document.getElementsByName('fd'); return checkboxes.length; }
|
|
function p24selectallfile() { var nv = (p24getFileSelCount() == 0), checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { checkboxes[i].checked = nv; } p24setActions(); }
|
|
function p24createfolder() { setDialogMode(11, "Nueva carpeta", 3, p24createfolderEx, '<input type=text id=p24renameinput maxlength=64 onkeyup=p24fileNameCheck(event) style=width:100% />'); focusTextBox('p24renameinput'); p24fileNameCheck(); }
|
|
function p24createfolderEx() { p24files.sendCtrlMsg(JSON.stringify({ action: 'mkdir', reqid: 1, path: p24filetreelocation.join('/') + '/' + Q('p24renameinput').value })); p24folderup(999); }
|
|
function p24deletefile() { var cc = p24getFileSelCount(); setDialogMode(11, "Eliminar", 3, p24deletefileEx, (cc > 1) ? ('Delete ' + cc + ' selected items?') : ('Delete selected item?')); }
|
|
function p24deletefileEx() { var delfiles = [], checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { delfiles.push(p24filetree.dir[checkboxes[i].value].n); } } p24files.sendCtrlMsg(JSON.stringify({ action: 'rm', reqid: 1, path: p24filetreelocation.join('/'), delfiles: delfiles })); p24folderup(999); }
|
|
function p24renamefile() { var renamefile, checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { renamefile = p24filetree.dir[checkboxes[i].value].n; } } setDialogMode(11, "Rebautizar", 3, p24renamefileEx, '<input type=text id=p24renameinput maxlength=64 onkeyup=p24fileNameCheck(event) style=width:100% value="' + renamefile + '" />', { action: 'rename', path: p24filetreelocation.join('/'), oldname: renamefile }); focusTextBox('p24renameinput'); p24fileNameCheck(); }
|
|
function p24renamefileEx(b, t) { t.newname = Q('p24renameinput').value; p24files.sendCtrlMsg(JSON.stringify(t)); p24folderup(999); }
|
|
function p24fileNameCheck(e) { var x = isFilenameValid(Q('p24renameinput').value); QE('idx_dlgOkButton', x); if ((x == true) && (e != null) && (e.keyCode == 24)) { dialogclose(1); } }
|
|
function p24uploadFile() { setDialogMode(11, "Subir archivo", 3, p24uploadFileEx, '<input type=file name=files id=p24uploadinput style=width:100% multiple=multiple onchange="updateUploadDialogOk(\'p24uploadinput\')" />'); updateUploadDialogOk('p24uploadinput'); }
|
|
function p24uploadFileEx() { p24doUploadFiles(Q('p24uploadinput').files); }
|
|
function updateUploadDialogOk(x) { QE('idx_dlgOkButton', Q(x).value != ''); }
|
|
|
|
var p24clipboard = null, p24clipboardFolder = null, p24clipboardCut = 0;
|
|
function p24copyFile(cut) { var checkboxes = document.getElementsByName('fd'); p24clipboard = []; p24clipboardCut = cut, p24clipboardFolder = p24targetpath; for (var i = 0; i < checkboxes.length; i++) { if ((checkboxes[i].checked) && (checkboxes[i].attributes.file.value == "3")) { p24clipboard.push(p24filetree.dir[checkboxes[i].value].n); } } p24updateClipview(); }
|
|
function p24pasteFile() { var x = ''; if ((p24clipboard != null) && (p24clipboard.length > 0)) { x = 'Confim ' + (p24clipboardCut == 0 ? 'copy' : 'move') + ' of ' + p24clipboard.length + ' entrie' + ((p24clipboard.length > 1) ? 's' : '') + ' to this location?' } setDialogMode(11, "Pegar", 3, p24pasteFileEx, x); }
|
|
function p24pasteFileEx() { p24files.sendCtrlMsg(JSON.stringify({ action: (p24clipboardCut == 0 ? 'copy' : 'move'), reqid: 1, scpath: p24clipboardFolder, dspath: p24targetpath, names: p24clipboard })); p24folderup(999); if (p24clipboardCut == 1) { p24clipboard = null, p24clipboardFolder = null, p24clipboardCut = 0; p24updateClipview(); } }
|
|
function p24updateClipview() { var x = ''; if ((p24clipboard != null) && (p24clipboard.length > 0)) { x = 'Holding ' + p24clipboard.length + ' entrie' + ((p24clipboard.length > 1) ? 's' : '') + ' for ' + (p24clipboardCut == 0 ? 'copy' : 'move') + ', <a onclick=p24clearClip() style=cursor:pointer>Clear</a>.' } QH('p24bottomstatus', x); p24setActions(); }
|
|
function p24clearClip() { p24clipboard = null; p24clipboardFolder = null; p24clipboardCut = 0; p24updateClipview(); }
|
|
|
|
function p24fileDragDrop(e) {
|
|
haltEvent(e);
|
|
QV('p24bigfail', false);
|
|
QV('p24bigok', false);
|
|
if (e.dataTransfer == null || e.dataTransfer.files.length == 0 || p24filetree == null) return;
|
|
if ((p24filetreelocation.length == 0) && (webRtcDesktop.platform == 'win32')) return // If this is Windows, do not accept files in the root folder
|
|
p24doUploadFiles(e.dataTransfer.files);
|
|
}
|
|
|
|
var p24dragtimer = null;
|
|
function p24fileDragOver(e) {
|
|
haltEvent(e);
|
|
if (p24dragtimer != null) { clearTimeout(p24dragtimer); p24dragtimer = null; }
|
|
var ac = (p24filetree != null); // Set to true if we can accept the file
|
|
if ((p24filetreelocation.length == 0) && (webRtcDesktop.platform == 'win32')) { ac = false; } // If this is Windows, do not accept files in the root folder
|
|
QV('p24bigok', ac);
|
|
QV('p24bigfail', !ac);
|
|
}
|
|
|
|
function p24fileDragLeave(e) {
|
|
haltEvent(e);
|
|
if (e.target.id != "p24filetable") {
|
|
QV('p24bigfail', false);
|
|
QV('p24bigok', false);
|
|
} else {
|
|
p24dragtimer = setTimeout(function () { QV('p24bigfail', false); QV('p24bigok', false); p24dragtimer = null; }, 200);
|
|
}
|
|
}
|
|
|
|
function getFileSizeStr(size) { if (size == 1) return "1 byte"; return format("{0} bytes", size); }
|
|
function joinPaths() { var x = []; for (var i in arguments) { var w = arguments[i]; if ((w != null) && (w != '')) { while (w.endsWith('/') || w.endsWith('\\')) { w = w.substring(0, w.length - 1); } while (w.startsWith('/') || w.startsWith('\\')) { w = w.substring(1); } x.push(w); } } return x.join('/'); }
|
|
var isFilenameValid = (function () { var x1 = /^[^\\/:\*\?"<>\|]+$/, x2 = /^\./, x3 = /^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i; return function isFilenameValid(fname) { return x1.test(fname) && !x2.test(fname) && !x3.test(fname) && (fname[0] != '.'); } })();
|
|
function focusTextBox(x) { setTimeout(function () { Q(x).selectionStart = Q(x).selectionEnd = 65535; Q(x).focus(); }, 0); }
|
|
|
|
|
|
//
|
|
// FILES DOWNLOAD
|
|
//
|
|
|
|
var downloadFile; // Global state for file download
|
|
|
|
// Called by the html page to start a download, arguments are: path, file name and file size.
|
|
function p24downloadfile(x, y, z) {
|
|
if (xxdialogMode || downloadFile || !p24files) return;
|
|
downloadFile = { path: decodeURIComponent(x), file: decodeURIComponent(y), size: z, tsize: 0, data: '', state: 0, id: Math.random() }
|
|
//console.log('p24downloadFileCancel', downloadFile);
|
|
p24files.sendCtrlMsg(JSON.stringify({ action: 'download', sub: 'start', id: downloadFile.id, path: downloadFile.path }));
|
|
setDialogMode(11, "Descargar archivo", 10, p24downloadFileCancel, '<div>' + downloadFile.file + '</div><br /><progress id=d2progressBar style=width:100% value=0 max=' + z + ' />');
|
|
}
|
|
|
|
// Called by the html page to cancel the download
|
|
function p24downloadFileCancel() { if (downloadFile != null) { setDialogMode(0); if (p24files != null) { p24files.sendCtrlMsg(JSON.stringify({ action: 'download', sub: 'cancel', id: downloadFile.id })); } downloadFile = null; } }
|
|
|
|
// Called by the transport when download control command is received
|
|
function p24gotDownloadCommand(cmd) {
|
|
//console.log('p24gotDownloadCommand', cmd);
|
|
if ((downloadFile == null) || (cmd.id != downloadFile.id)) return;
|
|
if (cmd.sub == 'start') { downloadFile.state = 1; p24files.sendCtrlMsg(JSON.stringify({ action: 'download', sub: 'startack', id: downloadFile.id })); }
|
|
else if (cmd.sub == 'cancel') { downloadFile = null; setDialogMode(0); }
|
|
}
|
|
|
|
// Called by the transport when binary data is received
|
|
function p24gotDownloadBinaryData(data) {
|
|
if (!downloadFile || downloadFile.state == 0) return;
|
|
try { data = atob(data); } catch (ex) { return; }
|
|
if ((data == null) || (data.length < 4)) return;
|
|
if (data.length > 4) {
|
|
downloadFile.tsize += data.length - 4; // Add to the total bytes received
|
|
downloadFile.data += data.substring(4); // Append the data, decode Base64
|
|
Q('d2progressBar').value = downloadFile.tsize; // Change the progress bar
|
|
}
|
|
if ((ReadInt(data, 0) & 1) != 0) { // Check end flag
|
|
saveAs(data2blob(downloadFile.data), downloadFile.file); downloadFile = null; setDialogMode(0); // Save the file
|
|
} else {
|
|
p24files.sendCtrlMsg(JSON.stringify({ action: 'download', sub: 'ack', id: downloadFile.id })); // Send the ACK
|
|
}
|
|
}
|
|
|
|
//
|
|
// FILES UPLOAD
|
|
//
|
|
|
|
var uploadFile;
|
|
|
|
function p24doUploadFiles(files) {
|
|
if (xxdialogMode) return;
|
|
uploadFile = { xpath: p24filetreelocation.join('/'), xfiles: files, xfilePtr: -1 };
|
|
setDialogMode(11, "Subir archivo", 10, p24uploadFileCancel, '<div id=p24dfileName>' + "Configurando ..." + '</div><br /><progress id=d2progressBar style=width:100% value=0 max=0 />', 99);
|
|
p24uploadNextFile();
|
|
}
|
|
|
|
// Push the next file
|
|
function p24uploadNextFile() {
|
|
uploadFile.xfilePtr++;
|
|
if (uploadFile.xfiles.length > uploadFile.xfilePtr) {
|
|
uploadFile.xptr = 0;
|
|
var file = uploadFile.xfiles[uploadFile.xfilePtr];
|
|
QH('p24dfileName', file.name);
|
|
Q('d2progressBar').max = file.size;
|
|
Q('d2progressBar').value = 0;
|
|
uploadFile.xreader = new FileReader();
|
|
uploadFile.xreader.onload = function () {
|
|
uploadFile.xdata = uploadFile.xreader.result;
|
|
p24files.sendCtrlMsg(JSON.stringify({ action: 'upload', sub: 'start', reqid: uploadFile.xfilePtr, path: uploadFile.xpath, name: file.name, size: uploadFile.xdata.byteLength }));
|
|
};
|
|
uploadFile.xreader.onerror = function () { p24uploadNextFile(); }
|
|
uploadFile.xreader.readAsArrayBuffer(file);
|
|
} else {
|
|
p24uploadFileCancel();
|
|
p24folderup(9999); // Refresh the file view
|
|
}
|
|
}
|
|
|
|
// Used to cancel the entire transfer, close the upload dialog box
|
|
function p24uploadFileCancel(button, tag) {
|
|
if (uploadFile != null) {
|
|
uploadFile = null;
|
|
setDialogMode(0);
|
|
if ((tag == 99) && (p24files != null)) { p24files.sendCtrlMsg(JSON.stringify({ action: 'upload', sub: 'cancel' })); }
|
|
}
|
|
}
|
|
|
|
// Receive upload ack from the mesh agent, use this to keep sending more data
|
|
function p24gotUploadData(cmd) {
|
|
if ((uploadFile == null) || (parseInt(uploadFile.xfilePtr) != parseInt(cmd.reqid))) { return; }
|
|
if (cmd.sub == 'start') {
|
|
p24uploadNextPart(false);
|
|
for (var i = 0; i < 8; i++) { p24uploadNextPart(true); } // Send 8 more blocks of 4 k to full the websocket.
|
|
} else if (cmd.sub == 'ack') {
|
|
p24uploadNextPart(false);
|
|
} else if (cmd.sub == 'error') {
|
|
p24uploadFileCancel();
|
|
}
|
|
}
|
|
|
|
function ab2str(buf) { return String.fromCharCode.apply(null, new Uint8Array(buf)); }
|
|
|
|
// Push the next part of the file into the websocket. If dataPriming is true, push more data only if it's not the last block of the file.
|
|
function p24uploadNextPart(dataPriming) {
|
|
var data = uploadFile.xdata, start = uploadFile.xptr, end = uploadFile.xptr + 4096;
|
|
if (end > data.byteLength) { if (dataPriming == true) { return; } end = data.byteLength; }
|
|
if (start == data.byteLength) {
|
|
p24uploadNextFile();
|
|
} else {
|
|
p24files.sendCtrlMsg(btoa(IntToStr((end != data.byteLength) ? 0x01000000 : 0x01000001) + ab2str(data.slice(start, end))));
|
|
uploadFile.xptr = end;
|
|
Q('d2progressBar').value = end;
|
|
}
|
|
}
|
|
|
|
// ###END###{DesktopInbandFiles}
|
|
// ###END###{Desktop}
|
|
|
|
//
|
|
// Remote IDER
|
|
//
|
|
|
|
// ###BEGIN###{IDER}
|
|
|
|
var ider;
|
|
var iderCodeBlock;
|
|
var iderTimer;
|
|
|
|
// ###BEGIN###{IDER-IMRSDK}
|
|
function iderStartIMR() {
|
|
// Setup the IDER session (NodeJS with IMRSDK.dll)
|
|
iderStop();
|
|
ider = CreateAmtRemoteIderIMR();
|
|
if (ider == null) return;
|
|
ider.digestRealmMatch = wsstack.comm.digestRealm;
|
|
ider.onStateChanged = onIderStateChange;
|
|
ider.m.onDialogPrompt = onIderDialogPrompt;
|
|
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) {
|
|
ider.m.Start(currentcomputer._id, 16992, 'x', 'x', 0, wsstack.comm, meshCentralServer);
|
|
} else {
|
|
// ###END###{MeshServerConnect}
|
|
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
|
|
ider.m.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], amtstack.wsman.comm.xtlsCertificate, wsstack.comm.xtlsoptions);
|
|
// ###BEGIN###{MeshServerConnect}
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
|
|
QV('IDERDiskMapButton', false); // Hide the disk heat map button since it's not supported.
|
|
}
|
|
|
|
function onIderSourceChange() {
|
|
var sel = Q('storagesourceoption').value;
|
|
QV('iderisofile', (sel & 1) == 0);
|
|
QV('iderimgfile', (sel & 2) == 0);
|
|
QV('iderisodrive', (sel & 1) != 0);
|
|
QV('iderimgdrive', (sel & 2) != 0);
|
|
}
|
|
// ###END###{IDER-IMRSDK}
|
|
|
|
function iderStart(e) {
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{IDER-IMRSDK}
|
|
if ((e.shiftKey != true) && (require('os').platform() == 'win32')) { iderStartIMR(); return; }
|
|
// ###END###{IDER-IMRSDK}
|
|
|
|
// Setup the IDER session (WebSocket)
|
|
var x = '<div>' + "Montar imágenes de disco en una computadora Intel® AMT - Experimental." + '</div><br />';
|
|
x += '<div style=height:26px><input id=floppyImageInput type=file style=float:right;width:250px accept=".img"><div>' + NoBreak("Disquete (.img)") + '</div></div>';
|
|
x += '<div style=height:26px><input id=cdromImageInput type=file style=float:right;width:250px accept=".iso"><div>' + NoBreak("CDROM (.iso)") + '</div></div>';
|
|
x += '<div style=height:26px><select id=iderStartType style=float:right;width:250px><option value=0>' + "En el próximo arranque" + '<option value=1>' + "Agraciado" + '<option value=2>' + "Inmediato" + '</select><div>' + "Inicio de sesión" + '</div></div>';
|
|
setDialogMode(11, "Redireccionamiento de almacenamiento", 3, iderStart2, x);
|
|
var iderurl = null;
|
|
try { iderurl = localStorage.getItem('iderurl'); } catch (ex) { }
|
|
if (iderurl) { Q('storageserverurl').value = iderurl.substring(1, iderurl.length - 1); }
|
|
}
|
|
|
|
function iderStart2() {
|
|
// Check the files
|
|
if ((Q('floppyImageInput').files.length != 1) && (Q('cdromImageInput').files.length != 1)) { messagebox("Error de redireccionamiento de almacenamiento", "Se debe seleccionar al menos un archivo de imagen de disco."); return; }
|
|
if ((Q('floppyImageInput').files.length == 1) && ((Q('floppyImageInput').files[0].size % 512) != 0)) { messagebox("Error de redireccionamiento de almacenamiento", "Archivo .img no válido"); return; }
|
|
if ((Q('cdromImageInput').files.length == 1) && ((Q('cdromImageInput').files[0].size % 2048) != 0)) { messagebox("Error de redireccionamiento de almacenamiento", "Archivo .iso no válido"); return; }
|
|
|
|
// Fetch the files
|
|
var floppy = null, cdrom = null;
|
|
if (Q('floppyImageInput').files.length == 1) { floppy = Q('floppyImageInput').files[0]; }
|
|
if (Q('cdromImageInput').files.length == 1) { cdrom = Q('cdromImageInput').files[0]; }
|
|
if ((floppy != null) || (cdrom != null)) { iderStart3(floppy, cdrom, Q('iderStartType').value); }
|
|
}
|
|
|
|
function iderStart3(floppy, cdrom, iderStart) {
|
|
// Setup the IDER session
|
|
iderStop();
|
|
ider = CreateAmtRedirect(CreateAmtRemoteIder());
|
|
ider.onStateChanged = onIderStateChange;
|
|
ider.m.floppy = floppy;
|
|
ider.m.cdrom = cdrom;
|
|
ider.m.iderStart = iderStart;
|
|
// ###BEGIN###{ComputerSelector}
|
|
ider.digestRealmMatch = wsstack.comm.digestRealm;
|
|
// ###END###{ComputerSelector}
|
|
// ###BEGIN###{IDERStats}
|
|
ider.m.sectorStats = iderSectorStats;
|
|
// ###END###{IDERStats}
|
|
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
ider.tlsv1only = amtstack.wsman.comm.tlsv1only;
|
|
ider.Start(currentMeshNode._id, 16994, '*', '*', 0);
|
|
// ###END###{Mode-MeshCentral2}
|
|
// ###BEGIN###{!Mode-MeshCentral2}
|
|
// ###BEGIN###{Mode-Firmware}
|
|
ider.Start();
|
|
// ###END###{Mode-Firmware}
|
|
// ###BEGIN###{!Mode-Firmware}
|
|
ider.tlsv1only = amtstack.wsman.comm.tlsv1only;
|
|
// ###BEGIN###{MeshServerConnect}
|
|
if (meshCentralServer != null) {
|
|
desktop.Start(currentcomputer._id, 0, 'x', 'x', 0, wsstack.comm, meshCentralServer);
|
|
} else {
|
|
// ###END###{MeshServerConnect}
|
|
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
ider.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls']);
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
ider.Start(ports.host, ports.redir, amtstack.wsman.comm.user, amtstack.wsman.comm.pass, currentcomputer['tls'], wsstack.comm.getPeerCertificateFingerprint(), wsstack.comm.xtlsoptions);
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{MeshServerConnect}
|
|
}
|
|
// ###END###{MeshServerConnect}
|
|
// ###END###{!Mode-Firmware}
|
|
// ###END###{!Mode-MeshCentral2}
|
|
|
|
QV('IDERDiskMapButton', true); // Show the disk heat map button since it is supported.
|
|
}
|
|
|
|
function iderStop() {
|
|
// Stop the IDER session
|
|
if (ider) { ider.m.Stop(); ider.onStateChanged = null; ider.m.onDialogPrompt = null; delete ider; }
|
|
if (iderTimer) { clearInterval(iderTimer); delete iderTimer; }
|
|
// ###BEGIN###{IDERStats}
|
|
iderToggleDiskMap(false);
|
|
// ###END###{IDERStats}
|
|
}
|
|
|
|
function onIderStateChange(stack, state) {
|
|
QE('idx_IDER1', state != 3);
|
|
QE('idx_IDER2', state != 3);
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
QE('idx_SIDER1', state != 3);
|
|
QE('idx_SIDER2', state != 3);
|
|
// ###END###{Mode-MeshCentral2}
|
|
|
|
QV('id_iderstatus', state == 3); center();
|
|
if (state == 3) {
|
|
if (!urlvars['norefresh']) { iderTimer = setInterval(onIderTimer, 500); }
|
|
onIderTimer();
|
|
} else {
|
|
if (iderTimer) { clearInterval(iderTimer); delete iderTimer; }
|
|
}
|
|
}
|
|
|
|
function onIderTimer() {
|
|
if (ider.m.Update) { ider.m.Update(); }
|
|
if (ider.m.bytesFromAmt == -1) { iderStop(); } else { QH('id_iderstatusstr', '<b>' + (ider.m.server?"Servidor":'') + "Sesión IDE-R </b>, conectada," + ider.m.bytesFromAmt + " en," + ider.m.bytesToAmt + " fuera."); }
|
|
}
|
|
|
|
// ###BEGIN###{IDERStats}
|
|
var heatMapWidth = 600;
|
|
var heatMapDividor = {};
|
|
function iderSectorStats(mode, dev, total, start, len) {
|
|
var canvas = dev ? Q('cdromHeatMapCanvas') : Q('floppyHeatMapCanvas');
|
|
var ctx = canvas.getContext('2d');
|
|
if (mode == 0) {
|
|
heatMapDividor[dev] = 1;
|
|
if (total > 0) { while ((total / heatMapDividor[dev]) > 8000) { heatMapDividor[dev] *= 2; } }
|
|
if (dev) {
|
|
QV('cdromHeatMap', total)
|
|
QH('cdromHeatMapText', format("<b> CDROM </b>, los bloques son {0} bytes.", (2048 * heatMapDividor[dev])));
|
|
} else {
|
|
QV('floppyHeatMap', total);
|
|
QH('floppyHeatMapText', format("<b> Disquete </b>, los bloques son {0} bytes.", (512 * heatMapDividor[dev])));
|
|
}
|
|
}
|
|
var dividor = heatMapDividor[dev];
|
|
total = total / dividor;
|
|
start = start / dividor;
|
|
len = len / dividor;
|
|
var heatMapScale = 6;
|
|
if (mode == 0) {
|
|
canvas.height = ((Math.floor(total / (heatMapWidth / heatMapScale)) + ((total % heatMapWidth) ? 1 : 0)) * heatMapScale);
|
|
ctx.fillStyle = 'rgba(225,250,225,1)';
|
|
ctx.fillRect(0, 0, heatMapWidth, Math.floor(total / (heatMapWidth / heatMapScale)) * heatMapScale);
|
|
if (total % heatMapWidth) { ctx.fillRect(0, Math.floor(total / (heatMapWidth / heatMapScale)) * heatMapScale, (total % (heatMapWidth / heatMapScale)) * heatMapScale, heatMapScale); }
|
|
ctx.fillStyle = 'rgba(0,0,0,0.3)';
|
|
} else {
|
|
for (var i = start; i < start + len; i++) { sectorHeat(ctx, i, heatMapScale, dividor); }
|
|
}
|
|
}
|
|
|
|
function sectorHeat(ctx, sector, scale, dividor) {
|
|
ctx.fillRect((sector % (heatMapWidth / scale)) * scale, Math.floor(sector / (heatMapWidth / scale)) * scale, scale, scale);
|
|
}
|
|
|
|
function iderToggleDiskMap(x) {
|
|
var visible = (QS('iderHeatmap').display != 'none');
|
|
if (x == null) { x = !visible; }
|
|
if (xxdialogMode) { x = false; }
|
|
QS('iderHeatmap').display = x ? '' : 'none';
|
|
}
|
|
// ###END###{IDERStats}
|
|
|
|
function onIderDialogPrompt(sender, args, buttons) {
|
|
if (iderCodeBlock) { document.body.removeChild(iderCodeBlock); delete iderCodeBlock; }
|
|
if (args['js']) { var JS = document.createElement('script'); JS.text = args['js']; iderCodeBlock = document.body.appendChild(JS); }
|
|
setDialogMode(11, "Redireccionamiento de almacenamiento", buttons ? buttons : 3, onIderDialogPromptOk, args['html']);
|
|
}
|
|
|
|
function onIderDialogPromptOk(button) {
|
|
if (button == 1) {
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
if (window['iderServerCall']) { ider.m.dialogPrompt(window['iderServerCall']()); } else { ider.m.dialogPrompt(); }
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
ider.m.dialogPrompt(iderUserConsent);
|
|
// ###END###{Mode-NodeWebkit}
|
|
} else {
|
|
iderStop();
|
|
}
|
|
}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var restartIderFunction;
|
|
function iderUserConsent(func) {
|
|
restartIderFunction = func;
|
|
amtstack.IPS_OptInService_StartOptIn(iderUserConsent2, 0, 1);
|
|
}
|
|
|
|
function iderUserConsent2(stack, name, response, status) {
|
|
if (errcheck(status, stack)) return;
|
|
//console.log("powerActionResponseC1(" + name + "," + response + "," + status + ")");
|
|
if (response.Body['ReturnValue'] != 0) {
|
|
messagebox("Error de consentimiento del usuario", response.Body.ReturnValueStr.replace(/_/g, ' '));
|
|
} else {
|
|
d6ConsentText.value = ''; // Reset user consent code to empty
|
|
setDialogMode(6, "Consentimiento del usuario", 11, iderUserConsent3);
|
|
checkConsentDisplay();
|
|
consentChanged();
|
|
}
|
|
}
|
|
|
|
function iderUserConsent3() {
|
|
//console.log('IPS_OptInService_SendOptInCode()');
|
|
amtstack.IPS_OptInService_SendOptInCode(d6ConsentText.value, iderUserConsent4, 0, 1);
|
|
}
|
|
|
|
function iderUserConsent4(stack, name, response, status) {
|
|
if (errcheck(status, stack)) return;
|
|
//console.log("powerActionResponseC2(" + name + "," + response + "," + status + ")");
|
|
if (response.Body['ReturnValue'] != 0) {
|
|
messagebox("Error de consentimiento del usuario", response.Body.ReturnValueStr.replace('_',' '));
|
|
} else {
|
|
restartIderFunction();
|
|
}
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
|
|
// Server-side IDER
|
|
function iderServerStart() {
|
|
if (xxdialogMode) return;
|
|
|
|
// Setup the IDER session (NodeJS)
|
|
iderStop();
|
|
ider = CreateAmtRemoteServerIder();
|
|
if (ider == null) return;
|
|
ider.onStateChanged = onIderStateChange;
|
|
ider.m.sectorStats = iderSectorStats;
|
|
ider.m.onDialogPrompt = onIderDialogPrompt;
|
|
ider.tlsv1only = amtstack.wsman.comm.tlsv1only;
|
|
ider.Start(currentMeshNode._id, 16994, '*', '*', 0);
|
|
}
|
|
|
|
// ###END###{Mode-MeshCentral2}
|
|
|
|
// ###END###{IDER}
|
|
|
|
// ###BEGIN###{RemoteAccess}
|
|
|
|
//
|
|
// Remote Access
|
|
//
|
|
|
|
var xxRemoteAccess = null;
|
|
var xxEnvironementDetection = null;
|
|
var xxCiraServers = null;
|
|
var xxUserInitiatedCira = null;
|
|
var xxUserInitiatedEnabledState = { 32768: "Discapacitado", 32769: "BIOS habilitado", 32770: "OS habilitado", 32771: "BIOS y SO habilitados" };
|
|
var xxRemoteAccessCredentiaLinks = null;
|
|
var xxMPSUserPass = null;
|
|
var xxPolicies = null;
|
|
|
|
function PullRemoteAccess() {
|
|
// We only deal with remote access starting with Intel AMT 6 and beyond
|
|
// ###BEGIN###{Certificates}
|
|
var requests = ['*AMT_EnvironmentDetectionSettingData', 'AMT_ManagementPresenceRemoteSAP', 'AMT_RemoteAccessCredentialContext', 'AMT_RemoteAccessPolicyAppliesToMPS', 'AMT_RemoteAccessPolicyRule', '*AMT_UserInitiatedConnectionService', 'AMT_MPSUsernamePassword'];
|
|
// ###END###{Certificates}
|
|
// ###BEGIN###{!Certificates}
|
|
var requests = ['*AMT_EnvironmentDetectionSettingData', 'AMT_ManagementPresenceRemoteSAP', 'AMT_RemoteAccessCredentialContext', 'AMT_RemoteAccessPolicyAppliesToMPS', 'AMT_RemoteAccessPolicyRule', '*AMT_UserInitiatedConnectionService', 'AMT_MPSUsernamePassword', 'AMT_PublicKeyCertificate'];
|
|
// ###END###{!Certificates}
|
|
if (amtversion > 11) { requests.push('*IPS_HTTPProxyService', 'IPS_HTTPProxyAccessPoint'); }
|
|
amtstack.BatchEnum(null, requests, processRemote1);
|
|
}
|
|
|
|
function processRemote1(stack, name, responses, status) {
|
|
if ((amtversion > 11) && (status == 400)) {
|
|
// Check if only the HTTP proxy objects failed
|
|
status = 200;
|
|
if (responses['IPS_HTTPProxyAccessPoint'].status == 400) { delete responses['IPS_HTTPProxyAccessPoint']; }
|
|
if (responses['IPS_HTTPProxyService'].status == 400) { delete responses['IPS_HTTPProxyService']; }
|
|
for (var i in responses) { if (responses[i].status != 200) { status = responses[i].status; } }
|
|
}
|
|
if (status == 400) return;
|
|
if ((errcheck(status, stack)) || (responses['AMT_UserInitiatedConnectionService'] == undefined || responses['AMT_UserInitiatedConnectionService'].response == undefined)) return;
|
|
QV('go17', true); // Remote Access
|
|
xxRemoteAccess = responses;
|
|
xxEnvironementDetection = responses['AMT_EnvironmentDetectionSettingData'].response;
|
|
xxEnvironementDetection['DetectionStrings'] = MakeToArray(xxEnvironementDetection['DetectionStrings']);
|
|
xxCiraServers = responses['AMT_ManagementPresenceRemoteSAP'].responses;
|
|
xxUserInitiatedCira = responses['AMT_UserInitiatedConnectionService'].response;
|
|
xxRemoteAccessCredentiaLinks = responses['AMT_RemoteAccessCredentialContext'].responses;
|
|
xxMPSUserPass = responses['AMT_MPSUsernamePassword'].responses;
|
|
|
|
// Figure out policies attached to servers. Create a policy type to server table.
|
|
xxPolicies = { 'User': [], 'Alert': [], 'Periodic': [] };
|
|
for (var i in responses['AMT_RemoteAccessPolicyAppliesToMPS'].responses) {
|
|
var policy = responses['AMT_RemoteAccessPolicyAppliesToMPS'].responses[i];
|
|
var server = Clone(getItem(xxCiraServers, 'Name', getItem(policy['ManagedElement']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'Name')['Value']));
|
|
server.MpsType = policy['MpsType']; // MpsType was added in Intel AMT 11.6
|
|
var ptype = (getItem(policy['PolicySet']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'PolicyRuleName')['Value']).split(' ')[0];
|
|
xxPolicies[ptype].push(server);
|
|
}
|
|
|
|
updateRemoteAccess();
|
|
}
|
|
|
|
function updateRemoteAccess() {
|
|
if (xxEnvironementDetection == null) return;
|
|
var x = '', e = "Discapacitado", ciraProxySupport = (xxRemoteAccess['IPS_HTTPProxyService'] && xxRemoteAccess['IPS_HTTPProxyAccessPoint']);
|
|
if (xxEnvironementDetection['DetectionStrings'] && xxEnvironementDetection['DetectionStrings'].length > 0) { e = "Habilitado," + xxEnvironementDetection['DetectionStrings'].length + ' ' + (xxEnvironementDetection['DetectionStrings'].length > 1?'domains':'domain'); }
|
|
|
|
// General settings
|
|
x += TableStart();
|
|
x += TableEntry("Detección del entorno", addLink(e, 'editEnvironmentDetection()'));
|
|
x += TableEntry("Opciones de iniciación del usuario", addLinkConditional(xxUserInitiatedEnabledState[xxUserInitiatedCira['EnabledState']], 'editUserInitiatedCira()', xxAccountAdminName));
|
|
var y = ('<i>' + "Ninguna" + '</i>');
|
|
if (xxPolicies['User'].length > 0) { y = ''; for (var i in xxPolicies['User']) { if (y.length > 0) y += ', '; y += xxPolicies['User'][i]['AccessInfo']; if (xxPolicies['User'][i].MpsType == 1) { y += ' (CILA)'; } } }
|
|
x += TableEntry("Conexión iniciada por el usuario", addLinkConditional(y, 'editMpsPolicy("User")', xxAccountAdminName));
|
|
var y = ('<i>' + "Ninguna" + '</i>');
|
|
if (xxPolicies['Alert'].length > 0) { y = ''; for (var i in xxPolicies['Alert']) { if (y.length > 0) y += ', '; y += xxPolicies['Alert'][i]['AccessInfo']; if (xxPolicies['Alert'][i].MpsType == 1) { y += ' (CILA)'; } } }
|
|
x += TableEntry("Conexión iniciada por alerta", addLinkConditional(y, 'editMpsPolicy("Alert")', xxAccountAdminName));
|
|
var y = ('<i>' + "Ninguna" + '</i>');
|
|
if (xxPolicies['Periodic'].length > 0) { y = ''; for (var i in xxPolicies['Periodic']) { if (y.length > 0) y += ', '; y += xxPolicies['Periodic'][i]['AccessInfo']; if (xxPolicies['Periodic'][i].MpsType == 1) { y += ' (CILA)'; } } }
|
|
var periodicPolicy = getItem(xxRemoteAccess['AMT_RemoteAccessPolicyRule'].responses, "PolicyRuleName", "Periódico");
|
|
if (periodicPolicy) {
|
|
var exdata = atob(periodicPolicy['ExtendedData']);
|
|
if (ReadInt(exdata, 0) == 0) { y += format(", cada {0} segundos", ReadInt(exdata, 4)); }
|
|
if (ReadInt(exdata, 0) == 1) { var hours = ReadInt(exdata, 4); var minutes = ReadInt(exdata, 8); if (minutes < 10) minutes = '0' + minutes; y += ', at ' + hours + ":" + minutes + ' daily'; }
|
|
}
|
|
x += TableEntry("Conexión periódica", addLinkConditional(y, 'editMpsPolicy("Periodic")', xxAccountAdminName));
|
|
x += TableEnd();
|
|
|
|
// Show MPS servers
|
|
x += '<br>';
|
|
x += TableStart2();
|
|
x += '<tr><td class=r1 style=padding-left:15px><br>' + "Administre los servidores de administración remota Intel® AMT." + '<br><br>';
|
|
if (xxCiraServers.length == 0) {
|
|
x += '<div style=padding-left:15px><br><i>' + "No se encontraron servidores remotos." + '</i></div><br>';
|
|
} else {
|
|
for (var i in xxCiraServers) {
|
|
var desc = ':' + xxCiraServers[i]['Port'];
|
|
if (xxCiraServers[i]['CN']) desc += ', ' + xxCiraServers[i]['CN'];
|
|
x += '<div class=itemBar onclick=showServerDetails(' + i + ')><div style=padding-top:3px><b>' + xxCiraServers[i]['AccessInfo'] + '</b>' + EscapeHtml(desc) + '</div></div>';
|
|
}
|
|
}
|
|
|
|
// Show MPS proxies if supported
|
|
if (ciraProxySupport) {
|
|
x += '<br>' + "Administre los servidores proxy HTTP utilizados para las conexiones de administración." + '<br><br>';
|
|
var proxyService = xxRemoteAccess['IPS_HTTPProxyService'].response;
|
|
var proxies = xxRemoteAccess['IPS_HTTPProxyAccessPoint'].responses;
|
|
if (proxies.length == 0) {
|
|
x += '<div style=padding-left:15px><br><i>' + "No hay proxies configurados." + '</i></div><br>';
|
|
} else {
|
|
for (var i in proxies) {
|
|
//x += '<div class=itemBar onclick=showProxyDetails(' + i + ')><div style=padding-top:3px><b>' + EscapeHtml(proxies[i]['AccessInfo']) + ':' + proxies[i]['ProxyPort'] + '</b> / ' + EscapeHtml(proxies[i]['NetworkDnsSuffix']) + '</div></div>';
|
|
x += '<div class=itemBar onclick=showProxyDetails(' + i + ')><div style=padding-top:3px><b>' + EscapeHtml(proxies[i]['AccessInfo']) + ':' + proxies[i]['Port'] + '</b> / ' + EscapeHtml(proxies[i]['NetworkDnsSuffix']) + '</div></div>';
|
|
}
|
|
}
|
|
}
|
|
|
|
var addserverbutton = '';
|
|
if (xxAccountAdminName) {
|
|
addserverbutton = AddButton("Agregar servidor...", 'AddRemoteAccessServer()');
|
|
if (ciraProxySupport) { addserverbutton += AddButton("Añadir proxy ...", 'AddRemoteAccessProxy()'); }
|
|
}
|
|
x += '<br><td class=r1>' + TableEnd(AddRefreshButton('PullRemoteAccess()') + addserverbutton);
|
|
|
|
QH('id_TableRemoteAccess', x);
|
|
}
|
|
|
|
var xxEditMpsPolicyType;
|
|
function editMpsPolicy(type) {
|
|
var x = '', cilaSupport = ((amtversion > 11) || ((amtversion == 11) && (amtversionmin >= 6)));
|
|
xxEditMpsPolicyType = type;
|
|
var name = xxEditMpsPolicyType;
|
|
if (name == 'User') name = "Usuario iniciado";
|
|
var policy = getItem(xxRemoteAccess['AMT_RemoteAccessPolicyRule'].responses, "PolicyRuleName", name);
|
|
x += '<div style=height:26px><select id=d2server1 style=float:right;width:206px onchange=editMpsPolicyUpdate()>';
|
|
x += '<option value=-1>' + "(Ninguna)";
|
|
for (var i in xxCiraServers) { x += '<option value=' + i + '' + ((xxPolicies[type][0] && xxPolicies[type][0]['Name'] == xxCiraServers[i]['Name']) ? ' selected' : '') + '>' + xxCiraServers[i]['AccessInfo'] }
|
|
x += '</select><div>' + "Servidor primario" + '</div></div>';
|
|
if (cilaSupport) { x += '<div style=height:26px><select id=d2server1cira style=float:right;width:206px onchange=editMpsPolicyUpdate()><option value=0>' + "CIRA - Externo" + '<option value=1' + (((xxPolicies[type][0]) && (xxPolicies[type][0].MpsType == 1))?' selected':'') + '>' + "CILA - Interna" + '</select><div>' + "Tipo de MPS primario" + '</div></div>'; }
|
|
if (xxCiraServers.length > 1) {
|
|
x += '<div style=height:26px><select id=d2server2 style=float:right;width:206px onchange=editMpsPolicyUpdate()>';
|
|
x += '<option value=-1>' + "(Ninguna)";
|
|
for (var i in xxCiraServers) { x += '<option value=' + i + '' + ((xxPolicies[type][1] && xxPolicies[type][1]['Name'] == xxCiraServers[i]['Name']) ? ' selected' : '') + '>' + xxCiraServers[i]['AccessInfo'] }
|
|
x += '</select><div>' + "Servidor secundario" + '</div></div>';
|
|
if (cilaSupport) { x += '<div style=height:26px><select id=d2server2cira style=float:right;width:206px onchange=editMpsPolicyUpdate()><option value=0>' + "CIRA - Externo" + '<option value=1' + (((xxPolicies[type][1]) && (xxPolicies[type][1].MpsType == 1)) ? ' selected' : '') + '>' + "CILA - Interna" + '</select><div>' + "Tipo secundario de MPS" + '</div></div>'; }
|
|
}
|
|
var t, v = 0;
|
|
if (policy) { v = policy['TunnelLifeTime']; }
|
|
x += '<div style=height:26px><input id=d2lifetime style=float:right;width:200px onchange=editMpsPolicyUpdate() value=' + v + '>';
|
|
x += '<div>' + "Vida útil del túnel (segundos)" + '</div></div>';
|
|
if (type == 'Periodic') {
|
|
t = 0;
|
|
v = 3600;
|
|
if (policy) {
|
|
var xx = atob(policy['ExtendedData']);
|
|
t = ReadInt(xx, 0);
|
|
v = ReadInt(xx, 4);
|
|
if (t == 1) {
|
|
var mm = ReadInt(xx, 8);
|
|
if (mm < 10) mm = '0' + mm;
|
|
v += ':' + mm;
|
|
}
|
|
}
|
|
x += '<div style=height:26px><select id=d2ttype style=float:right;width:206px onchange=editMpsPolicyUpdate()>';
|
|
x += '<option value=0' + (t == 0 ? ' selected' : '') + '>' + "Periodico, intervalo de tiempo" + '<option value=1' + (t == 1 ? ' selected' : '') + '>' + "Hora del día, una vez al día.";
|
|
x += '</select><div>' + "Tipo de disparador" + '</div></div><div style=height:26px><input id=d2timer style=float:right;width:200px onkeyup=editMpsPolicyUpdate() value=' + v + '><div id=ttypelabel></div></div>';
|
|
}
|
|
setDialogMode(11, format("{0} Conexión", type), 3, editMpsPolicyOk, x);
|
|
editMpsPolicyUpdate();
|
|
}
|
|
|
|
function editMpsPolicyUpdate() {
|
|
var cilaSupport = ((amtversion > 11) || ((amtversion == 11) && (amtversionmin >= 6)));
|
|
var ok = (xxCiraServers.length <= 1 || ((Q('d2server1').value == -1) || (Q('d2server1').value != Q('d2server2').value)));
|
|
if (ok == true && xxEditMpsPolicyType == 'Periodic' && Q('d2ttype').value == 1) { var hhmm = Q('d2timer').value.split(':'); if (hhmm.length != 2) ok = false; else { var hh = parseInt(hhmm[0]); var mm = parseInt(hhmm[1]); if (hh < 0 || hh > 23 || mm < 0 || mm > 59) ok = false; } }
|
|
QE('idx_dlgOkButton', ok);
|
|
if (xxCiraServers.length > 1) QE('d2server2', Q('d2server1').value != -1);
|
|
if (xxEditMpsPolicyType == 'Periodic') {
|
|
QE('d2timer', Q('d2server1').value != -1);
|
|
QH('ttypelabel', Q('d2ttype').value == 0 ? "Intervalo de activación (segundos)" : "Hora del día (HH: MM)");
|
|
QE('d2ttype', Q('d2server1').value != -1);
|
|
}
|
|
QE('d2lifetime', Q('d2server1').value != -1);
|
|
|
|
// If we are on Intel AMT 11.6 or higher, enable the CIRA/CILA selector when needed.
|
|
if (cilaSupport) {
|
|
QE('d2server1cira', Q('d2server1').value > -1)
|
|
if (xxCiraServers.length > 1) { QE('d2server2cira', (Q('d2server1').value > -1) && (Q('d2server2').value > -1)); }
|
|
}
|
|
}
|
|
|
|
function editMpsPolicyOk() {
|
|
var name = xxEditMpsPolicyType;
|
|
if (name == 'User') { name = 'User Initiated'; }
|
|
|
|
if (getItem(xxRemoteAccess['AMT_RemoteAccessPolicyRule'].responses, 'PolicyRuleName', name)) {
|
|
// Remove old policy
|
|
amtstack.Delete('AMT_RemoteAccessPolicyRule', { 'PolicyRuleName': name }, editMpsPolicyOk2);
|
|
} else {
|
|
// No old policy to remove, skip this.
|
|
editMpsPolicyOk2();
|
|
}
|
|
}
|
|
|
|
function editMpsPolicyOk2(stack, name, responses, status) {
|
|
var cilaSupport = ((amtversion > 11) || ((amtversion == 11) && (amtversionmin >= 6)));
|
|
if (Q('d2server1').value == -1) { PullRemoteAccess(); return; }
|
|
|
|
var trigger = 0;
|
|
if (xxEditMpsPolicyType == 'Alert') trigger = 1;
|
|
if (xxEditMpsPolicyType == 'Periodic') trigger = 2;
|
|
|
|
// Setup extended data
|
|
var extendedData = null;
|
|
if (trigger == 2) {
|
|
var timertype = Q('d2ttype').value;
|
|
var exdata = IntToStr(Q('d2timer').value); // Interval trigger
|
|
if (timertype == 1) { var hhmm = Q('d2timer').value.split(':'); exdata = IntToStr(parseInt(hhmm[0])) + IntToStr(parseInt(hhmm[1])); } // Time of day trigger
|
|
extendedData = btoa(IntToStr(timertype) + exdata);
|
|
}
|
|
|
|
// Create the MPS server references
|
|
var server1, server2;
|
|
if (Q('d2server1').value >= 0) { server1 = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_ManagementPresenceRemoteSAP</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="Name">' + xxCiraServers[Q('d2server1').value]['Name'] + '</Selector></SelectorSet></ReferenceParameters>'; }
|
|
if (Q('d2server1').value >= 0 && xxCiraServers.length > 1 && Q('d2server2').value >= 0) { server2 = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_ManagementPresenceRemoteSAP</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="Name">' + xxCiraServers[Q('d2server2').value]['Name'] + '</Selector></SelectorSet></ReferenceParameters>'; }
|
|
|
|
// Put the CIRA/CILA servers in the right bins.
|
|
var ciraServers = [];
|
|
var cilaServers = [];
|
|
if (cilaSupport) {
|
|
// Only Intel AMT 11.6 supports this
|
|
if (server1) {
|
|
if (Q('d2server1cira').value == 0) { ciraServers.push(server1); } else { cilaServers.push(server1); }
|
|
if (server2) { if (Q('d2server2cira').value == 0) { ciraServers.push(server2); } else { cilaServers.push(server2); } }
|
|
}
|
|
} else {
|
|
// If older than Intel AMT 11.6, put all servers in the CIRA bucket.
|
|
if (server1) { ciraServers.push(server1); if (server2) { ciraServers.push(server2); } }
|
|
}
|
|
|
|
// Go ahead and create the new CIRA/CILA policy.
|
|
amtstack.AMT_RemoteAccessService_AddRemoteAccessPolicyRule(trigger, Q('d2lifetime').value, extendedData, ciraServers, cilaServers, PullRemoteAccess);
|
|
}
|
|
|
|
var editEnvironmentDetectionTmp;
|
|
function editEnvironmentDetection(a) {
|
|
if (a != 1) { editEnvironmentDetectionTmp = (xxEnvironementDetection['DetectionStrings']) ? Clone(xxEnvironementDetection['DetectionStrings']) : []; }
|
|
var x = '';
|
|
if (xxAccountAdminName) x += "Ingrese hasta 5 sufijos de dominio de intranet. Si la computadora está fuera de estos dominios, los puertos locales Intel® AMT se cerrarán y las conexiones remotas del servidor estarán activas." + '<br><br>';
|
|
if (editEnvironmentDetectionTmp.length == 0) { x += '<i>' + "Sin dominios de intranet, detección de entorno deshabilitada." + '</i><br>'; }
|
|
for (var i in editEnvironmentDetectionTmp) { x += '<div class=itemBar style=margin-right:0><div style=float:right>' + AddButton2("Eliminar", 'editEnvironmentDetectionRemove(' + i + ')') + '</div><div style=padding-top:3px;max-width:260px;overflow:hidden title="' + editEnvironmentDetectionTmp[i] + '"><b>' + editEnvironmentDetectionTmp[i] + '</b></div></div>'; }
|
|
if (xxAccountAdminName && editEnvironmentDetectionTmp.length < 5) { x += '<br><input id=edInput placeholder=intranet.org style=width:276px onkeyup=edInputChg() maxlength=63><input type=button id=edAdd value=Add style=width:80px;margin-left:5px onclick=editEnvironmentDetectionAdd()>'; }
|
|
if (a == 1) QH('id_dialogOptions', x); else setDialogMode(11, "Detección de ambiente", xxAccountAdminName?3:1, editEnvironmentDetectionDlg, x);
|
|
edInputChg();
|
|
}
|
|
|
|
function editEnvironmentDetectionDlg() {
|
|
if (xxAccountAdminName) {
|
|
var t = Clone(xxEnvironementDetection);
|
|
t['DetectionStrings'] = editEnvironmentDetectionTmp;
|
|
//console.log('AMT_EnvironmentDetectionSettingData', t);
|
|
amtstack.Put('AMT_EnvironmentDetectionSettingData', t, editEnvironmentDetectionDlg2, 0, 1);
|
|
}
|
|
}
|
|
|
|
function editEnvironmentDetectionDlg2(stack, name, response, status) {
|
|
if (status != 200) { messagebox("Detección de ambiente", format("Error al agregar servidor, estado {0}", status)); }
|
|
else if ((response.Body['ReturnValue']) && (response.Body['ReturnValue'] != 0)) { messagebox("Detección de ambiente", response.Body.ReturnValueStr.replace(/_/g, ' ')); }
|
|
else { PullRemoteAccess(); }
|
|
}
|
|
|
|
function edInputChg() {
|
|
if (editEnvironmentDetectionTmp.length < 5) QE('edAdd', Q('edInput').value.length > 0);
|
|
}
|
|
|
|
function editEnvironmentDetectionAdd() {
|
|
editEnvironmentDetectionTmp.push(Q('edInput').value);
|
|
editEnvironmentDetection(1);
|
|
}
|
|
|
|
function editEnvironmentDetectionRemove(h) {
|
|
editEnvironmentDetectionTmp.splice(h, 1);
|
|
editEnvironmentDetection(1);
|
|
}
|
|
|
|
function editUserInitiatedCira() {
|
|
if (xxdialogMode) return;
|
|
var s = '';
|
|
for (var i in xxUserInitiatedEnabledState) { s += '<input type=radio name=d11 id=wl' + i + ' value=' + i + ' ' + ((xxUserInitiatedCira['EnabledState'] == i) ? 'checked' : '') + '>' + xxUserInitiatedEnabledState[i] + '<br>'; }
|
|
setDialogMode(11, "Túnel iniciado por el usuario", 3, editUserInitiatedCiraDlg, s);
|
|
}
|
|
|
|
function editUserInitiatedCiraDlg() { amtstack.AMT_UserInitiatedConnectionService_RequestStateChange(document.querySelector('input[name=d11]:checked').value, null, editUserInitiatedCiraDlg2); }
|
|
function editUserInitiatedCiraDlg2(stack, name, response, status) { if (status == 200) { amtstack.Get('AMT_UserInitiatedConnectionService', editUserInitiatedCiraDlg3, 0, 1); } }
|
|
function editUserInitiatedCiraDlg3(stack, name, response, status) { if (status == 200) { xxUserInitiatedCira = response.Body; updateRemoteAccess(); } }
|
|
|
|
var xxShowServerDetailsHandle;
|
|
function showServerDetails(h) {
|
|
xxShowServerDetailsHandle = h;
|
|
var server = xxCiraServers[h];
|
|
var x = '';
|
|
x += addHtmlValue("Nombre de acceso", server['AccessInfo']);
|
|
if (server['Port']) x += addHtmlValue("Puerto", server['Port']);
|
|
if (server['CN']) x += addHtmlValue("Nombre común", server['CN']);
|
|
|
|
var credentiallink = getElementWithContextSelectorValue(xxRemoteAccessCredentiaLinks, server['Name']);
|
|
if (credentiallink) {
|
|
var credentialselectorvalue = credentiallink['ElementInContext']['ReferenceParameters']['SelectorSet']['Selector']['Value'];
|
|
if (credentialselectorvalue.indexOf('Username') > 0) {
|
|
x += addHtmlValue("tipo de autenticación", "Usuario y Pass / Server-Auth TLS");
|
|
x += addHtmlValue("ID remota", getInstance(xxMPSUserPass, credentialselectorvalue)['RemoteID']);
|
|
} else {
|
|
x += addHtmlValue("tipo de autenticación", "Certificado / Mutual-Auth TLS");
|
|
// ###BEGIN###{!Certificates}
|
|
var c = getInstance(xxRemoteAccess['AMT_PublicKeyCertificate'].responses, credentialselectorvalue);
|
|
// ###END###{!Certificates}
|
|
// ###BEGIN###{Certificates}
|
|
var c = getInstance(xxCertificates, credentialselectorvalue);
|
|
// ###END###{Certificates}
|
|
x += addHtmlValue("Nombre del certificado", parseCertName(c['Subject'])['CN']);
|
|
}
|
|
}
|
|
|
|
var buttons = 1;
|
|
if (xxAccountAdminName) buttons = 5;
|
|
setDialogMode(11, "Servidor remoto #" + (h + 1), buttons, showServerDetailsOk, x);
|
|
}
|
|
|
|
function getElementWithContextSelectorValue(elements, value) {
|
|
for (var i in elements) {
|
|
elements[i]['ElementProvidingContext']['ReferenceParameters']['SelectorSet']['Selector'] = MakeToArray(elements[i]['ElementProvidingContext']['ReferenceParameters']['SelectorSet']['Selector']);
|
|
for (var j in elements[i]['ElementProvidingContext']['ReferenceParameters']['SelectorSet']['Selector']) { if (elements[i]['ElementProvidingContext']['ReferenceParameters']['SelectorSet']['Selector'][j]['Value'] == value) return elements[i]; }
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function showServerDetailsOk(r) {
|
|
// Delete the selected CIRA server
|
|
if (r == 2) { amtstack.Delete('AMT_ManagementPresenceRemoteSAP', { 'Name': xxCiraServers[xxShowServerDetailsHandle]['Name'] }, showServerDetailsOk2); }
|
|
}
|
|
|
|
function showServerDetailsOk2(stack, name, responses, status) {
|
|
if (status == 408) { messagebox("Remoción remota del servidor", "No se puede eliminar el servidor, acceso denegado."); } else { PullRemoteAccess(); }
|
|
}
|
|
|
|
function parseCertName(x) {
|
|
var j, r = {}, xx = x.split(',');
|
|
for (var i in xx) { j = xx[i].indexOf('='); r[xx[i].substring(0, j)] = xx[i].substring(j + 1); }
|
|
return r;
|
|
}
|
|
|
|
function showProxyDetails(h) {
|
|
var proxy = xxRemoteAccess['IPS_HTTPProxyAccessPoint'].responses[h];
|
|
|
|
var x = addHtmlValue("Nombre de acceso", proxy['AccessInfo'] + ':' + proxy['ProxyPort']);
|
|
x += addHtmlValue("DNS suffex", proxy['NetworkDnsSuffix']);
|
|
//x += addHtmlValue("Proxy type", ['Administrator', 'Operating system'][proxy['ProxyType']]);
|
|
x += addHtmlValue("Tipo de proxy", ['Administrator', 'Operating system'][proxy['Type']]);
|
|
//x += addHtmlValue("Last time used", proxy['LastTimeUsed']);
|
|
|
|
var buttons = 1;
|
|
if (xxAccountAdminName) { buttons = 5; }
|
|
setDialogMode(11, "HTTP Proxy #" + (h + 1), buttons, showProxyDetailsOk, x, h);
|
|
}
|
|
|
|
function showProxyDetailsOk(r, h) {
|
|
// Delete the selected proxy server
|
|
var proxy = xxRemoteAccess['IPS_HTTPProxyAccessPoint'].responses[h];
|
|
if (r == 2) { amtstack.Delete('IPS_HTTPProxyAccessPoint', { 'Name': proxy['Name'] }, showProxyDetailsOk2); }
|
|
}
|
|
|
|
function showProxyDetailsOk2(stack, name, responses, status) {
|
|
if (status == 408) { messagebox("Eliminación de proxy HTTP", "No se puede eliminar el proxy HTTP, acceso denegado."); } else { PullRemoteAccess(); }
|
|
}
|
|
|
|
function AddRemoteAccessProxy() {
|
|
// AddRemoteAccessProxy Host name = 2, Ipv4 = 3, Ipv6 = 4
|
|
var x = '<div style=height:26px><select id=d2type style=float:right;width:206px onchange=AddRemoteAccessProxyUpdate()><option value=2>' + "Nombre de host FQDN" + '<option value=3>' + "Dirección IPv4" + '<option value=4>' + "Dirección IPv6" + '</select><div>' + "Tipo de conección" + '</div></div>';
|
|
x += '<div style=height:26px><input id=d2host style=float:right;width:200px maxlength=255 onkeyup=AddRemoteAccessProxyUpdate()><div id=d2typespan></div></div>';
|
|
x += '<div style=height:26px><input id=d2port onkeypress="return (event.charCode == 0 || (event.charCode >= 48 && event.charCode <= 57))" style=float:right;width:200px onkeyup=AddRemoteAccessProxyUpdate()><div>' + "Puerto" + '</div></div>';
|
|
x += '<div style=height:26px><input id=d2domain style=float:right;width:200px maxlength=191 onkeyup=AddRemoteAccessProxyUpdate()><div>' + "Sufijo DNS" + '</div></div>';
|
|
setDialogMode(11, "Agregar proxy HTTP", 3, AddRemoteAccessProxyOk, x);
|
|
AddRemoteAccessProxyUpdate();
|
|
}
|
|
|
|
function AddRemoteAccessProxyUpdate() {
|
|
var ok = (Q('d2host').value.length != 0) && (Q('d2domain').value.length != 0);
|
|
if ((Q('d2port').value.length == 0) || (parseInt(Q('d2port').value) > 65535)) { ok = false; }
|
|
QE('idx_dlgOkButton', ok);
|
|
QH('d2typespan', ['', '', "FQDN / nombre de host", "Dirección IPv4", "Dirección IPv6"][Q('d2type').value]);
|
|
}
|
|
|
|
function AddRemoteAccessProxyOk() {
|
|
amtstack.IPS_HTTPProxyService_AddProxyAccessPoint(Q('d2host').value, Q('d2type').value, parseInt(Q('d2port').value), Q('d2domain').value, AddRemoteAccessProxyOk2);
|
|
}
|
|
|
|
function AddRemoteAccessProxyOk2(stack, name, response, status) {
|
|
if (status != 200) {
|
|
messagebox("Agregar servidor proxy", "Error al agregar proxy, estado" + status);
|
|
} else if (response.Body['ReturnValue'] != 0) {
|
|
messagebox("Agregar servidor proxy", response.Body.ReturnValueStr.replace(/_/g, ' '));
|
|
} else {
|
|
PullRemoteAccess();
|
|
}
|
|
}
|
|
|
|
function AddRemoteAccessServer() {
|
|
// ###BEGIN###{!Certificates}
|
|
var certs = xxRemoteAccess['AMT_PublicKeyCertificate'].responses;
|
|
// ###END###{!Certificates}
|
|
// ###BEGIN###{Certificates}
|
|
var certs = [];
|
|
for (var i in xxCertificates) { if (xxCertificates[i].XPrivateKey) { certs.push(xxCertificates[i]); } }
|
|
// ###END###{Certificates}
|
|
var x = '';
|
|
x += '<div style=height:26px><select id=d2type style=float:right;width:206px onchange=AddRemoteAccessServerUpdate()><option value=201>' + "Nombre de host FQDN" + '<option value=3>' + "Dirección IPv4" + '</select><div>' + "Tipo de conección" + '</div></div>';
|
|
x += '<div style=height:26px><input id=d2name style=float:right;width:200px onkeyup=AddRemoteAccessServerUpdate()><div id=d2lname></div></div>';
|
|
x += '<div style=height:26px><input id=d2port onkeypress="return (event.charCode == 0 || (event.charCode >= 48 && event.charCode <= 57))" style=float:right;width:200px value=4433 onkeyup=AddRemoteAccessServerUpdate()><div>' + "Puerto de servicio" + '</div></div>';
|
|
x += '<div style=height:26px id=d2ucn><input id=d2cn style=float:right;width:200px onkeyup=AddRemoteAccessServerUpdate()><div>' + "Nombre común del servidor" + '</div></div>';
|
|
x += '<div style=height:26px><select id=d2auth style=float:right;width:206px onchange=AddRemoteAccessServerUpdate()>';
|
|
if (certs.length > 0) { x += '<option value=1>' + "Certificado"; }
|
|
x += '<option value=2>' + "Usuario Contraseña" + '</select><div>' + "Tipo de autenticación" + '</div></div>';
|
|
x += '<span id=d2utype>';
|
|
x += '<div style=height:26px><input id=d2user style=float:right;width:200px onkeyup=AddRemoteAccessServerUpdate()><div>' + "Nombre de usuario" + '</div></div>';
|
|
x += '<div style=height:26px><input id=d2pass style=float:right;width:200px onkeyup=AddRemoteAccessServerUpdate()><div>' + "Contraseña segura" + '</div></div>';
|
|
x += '</span>';
|
|
x += '<span id=d2ctype>';
|
|
x += '<div style=height:26px><select id=d2cert style=float:right;width:206px onchange=AddRemoteAccessServerUpdate()>';
|
|
for (var i in certs) { x += '<option value=' + certs[i]['InstanceID'].substring(34) + '>' + parseCertName(certs[i]['Subject'])['CN']; }
|
|
x += '</select><div>' + "Certificado" + '</div></div></span>';
|
|
setDialogMode(11, "Agregar servidor remoto", 3, AddRemoteAccessServerOk, x);
|
|
AddRemoteAccessServerUpdate();
|
|
}
|
|
|
|
function AddRemoteAccessServerOk() {
|
|
var cref, user, pass, cn;
|
|
if (Q('d2auth').value == 1) {
|
|
cref = '<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://intel.com/wbem/wscim/1/amt-schema/1/AMT_PublicKeyCertificate</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">Intel(r) AMT Certificate: Handle: ' + Q('d2cert').value + '</Selector></SelectorSet></ReferenceParameters>';
|
|
} else {
|
|
user = Q('d2user').value;
|
|
pass = Q('d2pass').value;
|
|
}
|
|
if (Q('d2cn').value.length > 0) cn = Q('d2cn').value;
|
|
amtstack.AMT_RemoteAccessService_AddMpServer(Q('d2name').value, Q('d2type').value, Q('d2port').value, Q('d2auth').value, cref, user, pass, cn, AddRemoteAccessServerOk2);
|
|
}
|
|
|
|
function AddRemoteAccessServerOk2(stack, name, response, status) {
|
|
if (status != 200) {
|
|
messagebox("Agregar servidor de Internet", format("Error al agregar servidor, estado {0}", status));
|
|
} else if (response.Body['ReturnValue'] != 0) {
|
|
messagebox("Agregar servidor de Internet", response.Body.ReturnValueStr.replace(/_/g, ' '));
|
|
} else {
|
|
PullRemoteAccess();
|
|
}
|
|
}
|
|
|
|
function AddRemoteAccessServerUpdate() {
|
|
var ok = (Q('d2name').value.length != 0);
|
|
if (Q('d2type').value == 3 && ok == true) { ok = (Q('d2cn').value.length != 0); }
|
|
if (Q('d2auth').value == 2 && ok == true) { ok = ((Q('d2user').value.length != 0) && (passwordcheck(Q('d2pass').value))); }
|
|
if ((Q('d2port').value.length == 0) || (parseInt(Q('d2port').value) > 65535)) { ok = false; }
|
|
if ((Q('d2name').value.indexOf(':') != -1) || ((Q('d2type').value == 3) && (Q('d2cn').value.indexOf(':') != -1))) { ok = false; }
|
|
QH('d2lname', (Q('d2type').value == 201) ? "Nombre de host" : "Dirección IPv4");
|
|
QV('d2utype', Q('d2auth').value == 2);
|
|
QV('d2ucn', Q('d2type').value == 3);
|
|
QV('d2ctype', Q('d2auth').value == 1);
|
|
QE('idx_dlgOkButton', ok);
|
|
}
|
|
|
|
// ###END###{RemoteAccess}
|
|
|
|
//
|
|
// Edit Computer Name & DNS feature
|
|
//
|
|
|
|
function showEditNameDlg(x) {
|
|
if (xxdialogMode) return;
|
|
var t = amtsysstate['AMT_GeneralSettings'].response['HostName'], y = amtsysstate['AMT_GeneralSettings'].response['DomainName'];
|
|
if (y != null && y.length > 0) t += '.' + y;
|
|
var r = '<br><div style=height:26px><input id=d11name value="' + t + '" style=float:right;width:200px><div>' + "Nombre y dominio" + '</div></div>';
|
|
if (x == 1) {
|
|
var s = (amtsysstate['AMT_GeneralSettings'].response['SharedFQDN'] == true);
|
|
r += '<div style=height:26px><select id=d11fqdn style=float:right;width:200px><option value=true ' + (s?'selected':'') + '>' + "Compartido, igual que el sistema operativo" + '<option value="false" ' + (s?'':'selected') + '>' + "Dedicado, diferente del sistema operativo" + '</select><div>' + "Nombre compartido" + '</div></div>';
|
|
}
|
|
setDialogMode(11, "Nombre de la computadora", 3, editNameDlgOk, r);
|
|
}
|
|
|
|
function editNameDlgOk() {
|
|
var i = Q('d11name').value, j = i.indexOf('.'), k = '';
|
|
if (j >= 0) { k = i.substring(j + 1); i = i.substring(0, j); }
|
|
var clone = Clone(amtsysstate['AMT_GeneralSettings'].response);
|
|
clone['HostName'] = i;
|
|
clone['DomainName'] = k;
|
|
if (Q('d11fqdn')) { clone['SharedFQDN'] = d11fqdn.value; }
|
|
amtstack.Put('AMT_GeneralSettings', clone, function() { amtstack.Get('AMT_GeneralSettings', computerNameGet, 0, 1); }, 0, 1);
|
|
}
|
|
|
|
function computerNameGet(stack, name, response, status) {
|
|
if (status == 200) { amtsysstate['AMT_GeneralSettings'].response = response.Body; updateSystemStatus(); }
|
|
}
|
|
|
|
function showEditDnsDlg() {
|
|
if (xxdialogMode) return;
|
|
var g = amtsysstate['AMT_GeneralSettings'].response;
|
|
var v = 0;
|
|
if (g['DDNSUpdateByDHCPServerEnabled'] == true) v = 1;
|
|
if (g['DDNSUpdateEnabled'] == true) v = 2;
|
|
idx_d23ddns.value = v;
|
|
idx_d23interval.value = g['DDNSPeriodicUpdateInterval'];
|
|
idx_d23ttl.value = g['DDNSTTL'];
|
|
showEditDnsDlgChange();
|
|
setDialogMode(23, "Cliente DNS dinámico", 3, showEditDnsDlgOk);
|
|
}
|
|
|
|
function showEditDnsDlgOk() {
|
|
var clone = Clone(amtsysstate['AMT_GeneralSettings'].response);
|
|
clone['DDNSUpdateEnabled'] = ((idx_d23ddns.value == 2)?true:false);
|
|
clone['DDNSUpdateByDHCPServerEnabled'] = ((idx_d23ddns.value == 1)?true:false);
|
|
if (idx_d23ddns.value == 2) {
|
|
clone['DDNSPeriodicUpdateInterval'] = idx_d23interval.value;
|
|
clone['DDNSTTL'] = idx_d23ttl.value;
|
|
}
|
|
amtstack.Put('AMT_GeneralSettings', clone, function() { amtstack.Get('AMT_GeneralSettings', computerNameGet, 0, 1); }, 0, 1);
|
|
}
|
|
|
|
function showEditDnsDlgChange() {
|
|
QE('idx_d23interval', idx_d23ddns.value == 2);
|
|
QE('idx_d23ttl', idx_d23ddns.value == 2);
|
|
}
|
|
|
|
//
|
|
// Intel AMT Features
|
|
//
|
|
|
|
function showFeaturesDlg() {
|
|
if (xxdialogMode || !xxAccountAdminName) return;
|
|
idx_d9redir.checked = amtfeatures[0], idx_d9kvm.checked = amtfeatures[3], idx_d9ider.checked = amtfeatures[2], idx_d9sol.checked = amtfeatures[1];
|
|
QV('idx_d9kvm_div', amtfeatures[3] != null);
|
|
setDialogMode(9, "Funciones Intel® AMT", 3, featuresDlgOk)
|
|
}
|
|
|
|
function featuresDlgOk() {
|
|
var r = amtsysstate['AMT_RedirectionService'].response;
|
|
r['ListenerEnabled'] = idx_d9redir.checked;
|
|
r['EnabledState'] = 32768 + ((idx_d9ider.checked?1:0) + (idx_d9sol.checked?2:0));
|
|
amtstack.AMT_RedirectionService_RequestStateChange(r['EnabledState'],
|
|
function (stack, name, response, status) {
|
|
if (status != 200) { messagebox("Error", "RedirectionService, RequestStateChange Error" + status); return; }
|
|
if (amtfeatures[3] != null) {
|
|
amtstack.CIM_KVMRedirectionSAP_RequestStateChange((idx_d9kvm.checked) ? 2 : 3, 0,
|
|
function (stack, name, response, status) {
|
|
if (status != 200) { messagebox("Error", "KVMRedirectionSAP, RequestStateChange Error" + status); return; }
|
|
amtstack.Put('AMT_RedirectionService', r, function (stack, name, response, status) {
|
|
if (status != 200) { messagebox("Error", "RedirectionService PUT Error" + status); return; }
|
|
amtstack.Get('AMT_RedirectionService', featuresDlgGet1, 0, 1);
|
|
amtstack.Get('CIM_KVMRedirectionSAP', featuresDlgGet2, 0, 1)
|
|
}, 0, 1) }
|
|
);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
function featuresDlgGet1(stack, name, response, status) {
|
|
if (status == 200) { amtsysstate['AMT_RedirectionService'].response = response.Body; updateSystemStatus(); }
|
|
}
|
|
|
|
function featuresDlgGet2(stack, name, response, status) {
|
|
if (status == 200) { amtsysstate['CIM_KVMRedirectionSAP'].response = response.Body; updateSystemStatus(); }
|
|
}
|
|
|
|
//
|
|
// Intel AMT Boot Features
|
|
//
|
|
|
|
function showEnableBootServiceDlg() {
|
|
if (xxdialogMode) return;
|
|
if (amtsysstate['CIM_BootService'].response['EnabledState'] != null) {
|
|
QV('d26rpediv', amtversion > 15);
|
|
if (amtversion > 15) {
|
|
idx_d26rpe1.checked = (amtsysstate['CIM_BootService'].response['EnabledState'] & 2)
|
|
idx_d26rpe0.checked = !idx_d26rpe1.checked;
|
|
}
|
|
idx_d26ocr1.checked = (amtsysstate['CIM_BootService'].response['EnabledState'] & 1)
|
|
idx_d26ocr0.checked = !idx_d26ocr1.checked;
|
|
}
|
|
setDialogMode(26, "Boot Features", 3, showEnableBootServiceDlgOk)
|
|
}
|
|
|
|
function showEnableBootServiceDlgOk() {
|
|
var v = 32768 + parseInt(document.querySelector('input[name=d26a]:checked').value);
|
|
if (amtversion > 15) { v += parseInt(document.querySelector('input[name=d26b]:checked').value); }
|
|
amtstack.CIM_BootService_RequestStateChange(v, null, showEnableBootServiceDlgResponse, v);
|
|
}
|
|
|
|
function showEnableBootServiceDlgResponse(stack, name, response, status, tag) {
|
|
if (status == 200) {
|
|
if (response.Body['ReturnValueStr'] != 'SUCCESS') { messagebox("Boot Features Error", response.Body['ReturnValueStr']); }
|
|
amtstack.Get('CIM_BootService', showEnableBootServiceDlgResponse2, tag);
|
|
PullSystemStatus();
|
|
} else {
|
|
if (response.Header['WsmanError']) {
|
|
messagebox("Boot Features Error", response.Header['WsmanError'].replace(/_/g, ' '));
|
|
} else {
|
|
messagebox("Boot Features Error", "Error, Status = " + status);
|
|
}
|
|
}
|
|
}
|
|
|
|
function showEnableBootServiceDlgResponse2(stack, name, response, status, tag) {
|
|
if ((status == 200) && (response.Body['EnabledState'] != tag)) { messagebox("Boot Features Error", "Unable to set OCR/RPE, check that these features are enabled in BIOS."); }
|
|
}
|
|
|
|
//
|
|
// Intel AMT User Consent
|
|
//
|
|
|
|
function showConsentDlg() {
|
|
if (xxdialogMode) return;
|
|
var optinrequired = amtsysstate['IPS_OptInService'].response['OptInRequired'];
|
|
idx_d10none.checked = (optinrequired == 0);
|
|
idx_d10kvm.checked = (optinrequired == 1);
|
|
idx_d10all.checked = (optinrequired == 0xFFFFFFFF);
|
|
setDialogMode(10, "Consentimiento del usuario", 3, consentDlgOk)
|
|
}
|
|
|
|
function consentDlgOk() {
|
|
amtsysstate['IPS_OptInService'].response['OptInRequired'] = document.querySelector('input[name=d10]:checked').value;
|
|
amtstack.Put('IPS_OptInService', amtsysstate['IPS_OptInService'].response, function() { amtstack.Get('IPS_OptInService', consentGet, 0, 1); }, 0, 1);
|
|
}
|
|
|
|
function consentGet(stack, name, response, status) {
|
|
if (status == 200) { PullSystemStatus(); }
|
|
}
|
|
|
|
//
|
|
// NETWORK SETTINGS
|
|
//
|
|
|
|
// ###BEGIN###{NetworkSettings}
|
|
|
|
/*
|
|
IPv6 %AddrType%:
|
|
0 - Address generated from: fe80::/64 + Interface ID,
|
|
1 - Address generated from: [Router advertised prefix] + [Interface ID],
|
|
2 - Global IPv6 address obtained from DHCPv6 Server,
|
|
3 - IPv6 unicast address configured by the user,
|
|
4 - Returned by FW for IPv6 addresses that are not owned by FW (such as IPv6 router address, configuration server address etc.)
|
|
|
|
IPv6 %AddrState%:
|
|
0 - DAD is still in process for this address,
|
|
1 - Address is valid and may be used for new communication,
|
|
2 - Address is deprecated and should not be used for new communication,
|
|
3 - Covers both the preferred and deprecated states,
|
|
4 - The valid lifetime of the address has expired,
|
|
5 - An interface ID collision has been detected for this address when performing DAD,
|
|
6 - Returned by FW for IPv6 addresses that are not owned by FW (such as IPv6 router address, configuration server address etc.
|
|
*/
|
|
// ipv6addrtype are element 0 to 4, ipv6addrstate are 5 and after. Merged both arrays to cut down size
|
|
var ipv6addrtype = ["Dirección local del enlace", "Dirección local de red", "Dirección global", "Usuario configurado", "No permitido", "DAD en progreso", "válido", "obsoleto", "preferido / en desuso", "Caducado", "colisión", "No permitido"];
|
|
function showIPv6AddrDlg(netifid, addrstr) {
|
|
if (xxdialogMode) return;
|
|
var x = TableStart();
|
|
t = addrstr.split(',');
|
|
for (var i = 0; i < t.length; i += 3) {
|
|
x += TableEntry('<b>' + t[i] + '</b><br><span style=font-size:10px>' + ipv6addrtype[t[i + 1]] + "," + ipv6addrtype[+t[i + 2] + 5] + '</span>', '');
|
|
}
|
|
setDialogMode(11, (netifid == 0 ? "Direcciones IPv6 para interfaz cableada" : "Direcciones IPv6 para interfaz inalámbrica"), 1, null, x + TableEnd());
|
|
}
|
|
|
|
function showIPv6StateDlg(netifid, state) {
|
|
if (xxdialogMode || !amtsysstate) return;
|
|
var zz = amtsysstate['IPS_IPv6PortSettings'].responses[netifid];
|
|
ipv6manual = (netifid == 0 && (isIpAddress(zz['IPv6Address']) || isIpAddress(zz['DefaultRouter']) || isIpAddress(zz['PrimaryDNS']) || isIpAddress(zz['SecondaryDNS'])));
|
|
|
|
QV('id_d21manualdiv', netifid == 0);
|
|
QV('id_d21subnetdiv', false);
|
|
QV('d21o0', true);
|
|
QV('d21l0', true);
|
|
QH('d21l0', "IPv6 deshabilitado");
|
|
QH('d21l1', "IPv6 habilitado, automático");
|
|
QH('d21l2', "IPv6 habilitado, automático + dirección manual");
|
|
d21o0.checked = !state;
|
|
d21o1.checked = state && !ipv6manual;
|
|
d21o2.checked = state && ipv6manual;
|
|
idx_d21address.value = isIpAddress(zz['IPv6Address'],'');
|
|
idx_d21gateway.value = isIpAddress(zz['DefaultRouter'],'');
|
|
idx_d21dns1.value = isIpAddress(zz['PrimaryDNS'],'');
|
|
idx_d21dns2.value = isIpAddress(zz['SecondaryDNS'],'');
|
|
setDialogMode(21, (netifid == 0 ? "Soporte IPv6 para interfaz cableada" : "Compatibilidad con IPv6 para interfaz inalámbrica"), 3, function () { showIPv6StateDlgOk(netifid) })
|
|
updateIPSetupDlg();
|
|
}
|
|
|
|
function showIPv6StateDlgOk(netifid) {
|
|
var selector = '<w:SelectorSet><w:Selector Name="InstanceID">Intel(r) IPS IPv6 Settings ' + netifid + '</w:Selector></w:SelectorSet>';
|
|
var zz = amtsysstate['IPS_IPv6PortSettings'].responses[netifid];
|
|
if (netifid == 0) { // We can only set IPv6 manual address for wired interface
|
|
if (d21o1.checked) { // Fully automatic, clear all addresses
|
|
zz['IPv6Address'] = zz['DefaultRouter'] = zz['PrimaryDNS'] = zz['SecondaryDNS'] = '::';
|
|
amtstack.Put('IPS_IPv6PortSettings', zz, showIPv6StateDlgDone, null, 0, selector);
|
|
}
|
|
if (d21o2.checked) { // Manual, set addresses
|
|
zz['IPv6Address'] = (idx_d21address.value == '') ? '::' : idx_d21address.value.toLocaleLowerCase();
|
|
zz['DefaultRouter'] = (idx_d21gateway.value == '') ? '::' : idx_d21gateway.value.toLocaleLowerCase();
|
|
zz['PrimaryDNS'] = (idx_d21dns1.value == '') ? '::' : idx_d21dns1.value.toLocaleLowerCase();
|
|
zz['SecondaryDNS'] = (idx_d21dns2.value == '') ? '::' : idx_d21dns2.value.toLocaleLowerCase();
|
|
amtstack.Put('IPS_IPv6PortSettings', zz, showIPv6StateDlgDone, null, 0, selector);
|
|
}
|
|
}
|
|
// This code enables/disables IPv6 for a given interface.
|
|
var elementSettings = amtsysstate['CIM_ElementSettingData'].responses;
|
|
for (var i = 0; i < elementSettings.length; i++) {
|
|
if (elementSettings[i]['SettingData'] && elementSettings[i]['SettingData']['ReferenceParameters']['SelectorSet']['Selector']['Value'] == ('Intel(r) IPS IPv6 Settings ' + netifid)) {
|
|
var CreationClassName = getItem(elementSettings[i]['ManagedElement']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'CreationClassName').Value;
|
|
var DeviceID = getItem(elementSettings[i]['ManagedElement']['ReferenceParameters']['SelectorSet']['Selector'], '@Name', 'DeviceID').Value;
|
|
var selector2 = '<w:SelectorSet><w:Selector Name="ManagedElement"><a:EndpointReference xmlns:b="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:c="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/' + CreationClassName + '</w:ResourceURI><w:SelectorSet><w:Selector Name="CreationClassName">' + CreationClassName + '</w:Selector><w:Selector Name="DeviceID">' + DeviceID + '</w:Selector><w:Selector Name="SystemCreationClassName">CIM_ComputerSystem</w:Selector><w:Selector Name="SystemName">Intel(r) AMT</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference></w:Selector><w:Selector Name="SettingData"><a:EndpointReference xmlns:b="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:c="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:ReferenceParameters><w:ResourceURI>http://intel.com/wbem/wscim/1/ips-schema/1/IPS_IPv6PortSettings</w:ResourceURI><w:SelectorSet><w:Selector Name="InstanceID">Intel(r) IPS IPv6 Settings ' + netifid + '</w:Selector></w:SelectorSet></a:ReferenceParameters></a:EndpointReference></w:Selector></w:SelectorSet>';
|
|
var clone = Clone(elementSettings[i]);
|
|
clone['IsCurrent'] = ((d21o0.checked) ? 2 : 1);
|
|
amtstack.Put('CIM_ElementSettingData', clone, showIPv6StateDlgDone, null, 0, selector2);
|
|
}
|
|
}
|
|
}
|
|
|
|
function showIPv6StateDlgDone(stack, name, response, status) {
|
|
if (status == 200) {
|
|
amtsysstate = undefined;
|
|
PullSystemStatus();
|
|
} else {
|
|
messagebox("Soporte IPv6", format("No se puede establecer el estado de IPv6, error {0}", status));
|
|
}
|
|
}
|
|
|
|
function showPingActionDlg() {
|
|
if (xxdialogMode) return;
|
|
var g = amtsysstate['AMT_GeneralSettings'].response;
|
|
var v = (g['PingResponseEnabled'] == true) + ((g['RmcpPingResponseEnabled'] == true) << 1);
|
|
d20a.checked = (v == 0);
|
|
d20b.checked = (v == 1);
|
|
d20c.checked = (v == 2);
|
|
d20d.checked = (v == 3);
|
|
setDialogMode(20, "Respuesta Intel® AMT Ping", 3, showPingActionDlgOk);
|
|
}
|
|
|
|
function showPingActionDlgOk() {
|
|
var clone = Clone(amtsysstate['AMT_GeneralSettings'].response);
|
|
var v = document.querySelector('input[name=d20]:checked').value;
|
|
clone['PingResponseEnabled'] = ((v & 1) != 0);
|
|
clone['RmcpPingResponseEnabled'] = ((v & 2) != 0);
|
|
amtstack.Put('AMT_GeneralSettings', clone, PullSystemStatus, 0, 1);
|
|
}
|
|
|
|
function showIPSetupDlg() {
|
|
if ((xxdialogMode) || (amtsysstate == null)) return;
|
|
var x = amtsysstate['AMT_EthernetPortSettings'].responses[0];
|
|
QV('id_d21ipaddrsync', amtversion > 6);
|
|
if (amtversion > 6) { Q('d21ipsync').checked = x['IpSyncEnabled']; };
|
|
QV('id_d21manualdiv', true);
|
|
QV('id_d21subnetdiv', true);
|
|
QV('d21o0', false);
|
|
QV('d21l0', false);
|
|
QH('d21l1', "Configuración automática con servidor DHCP");
|
|
QH('d21l2', "Configuración estática usando la configuración de IPv4 a continuación");
|
|
d21o1.checked = (x['DHCPEnabled'] == true);
|
|
d21o2.checked = !d21o1.checked;
|
|
idx_d21address.value = isIpAddress(x['IPAddress'],'');
|
|
idx_d21subnet.value = isIpAddress(x['SubnetMask'],'');
|
|
idx_d21gateway.value = isIpAddress(x['DefaultGateway'],'');
|
|
idx_d21dns1.value = isIpAddress(x['PrimaryDNS'],'');
|
|
idx_d21dns2.value = isIpAddress(x['SecondaryDNS'],'');
|
|
updateIPSetupDlg();
|
|
setDialogMode(21, "Configuraciones IPv4", 3, showIPSetupDlgOk)
|
|
}
|
|
|
|
function updateIPSetupDlg() {
|
|
var ok = true;
|
|
if (d21o2.checked && (Q('d21l2').innerHTML == "IPv6 habilitado, automático + dirección manual") && (idx_d21address.value.split(':').length < 2)) { ok = false; }
|
|
QE('idx_dlgOkButton', ok);
|
|
idx_d21address.disabled = idx_d21subnet.disabled = idx_d21gateway.disabled = idx_d21dns1.disabled = idx_d21dns2.disabled = !(d21o2.checked && ((amtversion < 7) || (Q('d21ipsync').checked == false)));
|
|
}
|
|
|
|
function showIPSetupDlgOk() {
|
|
var x = Clone(amtsysstate['AMT_EthernetPortSettings'].responses[0]);
|
|
x['DHCPEnabled'] = d21o1.checked;
|
|
delete x['IPAddress'];
|
|
delete x['SubnetMask'];
|
|
delete x['DefaultGateway'];
|
|
delete x['PrimaryDNS'];
|
|
delete x['SecondaryDNS'];
|
|
if (amtversion > 6) { x['IpSyncEnabled'] = Q('d21ipsync').checked; }
|
|
if ((d21o1.checked == false) && (Q('d21ipsync').checked == false)) { // || (amtversion < 7)
|
|
x['IPAddress'] = idx_d21address.value;
|
|
x['SubnetMask'] = idx_d21subnet.value;
|
|
x['DefaultGateway'] = idx_d21gateway.value;
|
|
if (idx_d21dns1.value != '') x['PrimaryDNS'] = idx_d21dns1.value;
|
|
if (idx_d21dns2.value != '') x['SecondaryDNS'] = idx_d21dns2.value;
|
|
}
|
|
amtstack.Put('AMT_EthernetPortSettings', x, showIPSetupDlgDone, 0, 1, x);
|
|
}
|
|
|
|
function showIPSetupDlgDone(stack, name, response, status) {
|
|
if (status == 200) {
|
|
amtsysstate = undefined;
|
|
PullSystemStatus();
|
|
} else {
|
|
messagebox("Configuraciones IPv4", format("No se pueden establecer los parámetros de red, error {0}", status));
|
|
}
|
|
}
|
|
|
|
// ###END###{NetworkSettings}
|
|
|
|
// ###BEGIN###{PowerControl}
|
|
|
|
//
|
|
// POWER ACTIONS
|
|
//
|
|
|
|
amtPowerBootCapabilities = null;
|
|
function showPowerActionDlg() {
|
|
if (xxdialogMode) return;
|
|
statusbox("Acciones de poder", "Comprobando capacidades ...");
|
|
amtstack.Get('AMT_BootCapabilities', powerActionResponse00, 0, 1);
|
|
}
|
|
|
|
function powerActionResponse00(stack, name, response, status) {
|
|
if (status == 200) {
|
|
var powerState = 3;
|
|
try {
|
|
var x = amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'];
|
|
if (x == 2) { powerState = 1; } else { powerState = 2; }
|
|
} catch (ex) { }
|
|
amtPowerBootCapabilities = response.Body;
|
|
QH('d5actionSelect', '');
|
|
if (powerState & 2) { addOption('d5actionSelect', "Encender", 2); }
|
|
if (powerState & 1) {
|
|
addOption('d5actionSelect', "Reiniciar", 10);
|
|
addOption('d5actionSelect', "Ciclo de poder", 5);
|
|
addOption('d5actionSelect', "Corriente cortada", 8);
|
|
}
|
|
if (amtPowerBootCapabilities['ForceDiagnosticBoot'] == true) {
|
|
if (powerState & 2) { addOption('d5actionSelect', "Encendido al diagnóstico", 300); }
|
|
if (powerState & 1) { addOption('d5actionSelect', "Restablecer a diagnóstico", 301); }
|
|
}
|
|
if ((amtversion > 9) && (powerState & 1)) {
|
|
addOption('d5actionSelect', "OS Wake desde Standby", 500);
|
|
addOption('d5actionSelect', "Ahorro de energía del sistema operativo", 501);
|
|
addOption('d5actionSelect', "Soft-off", 12);
|
|
addOption('d5actionSelect', "Reinicio suave", 14);
|
|
addOption('d5actionSelect', "Dormir", 4);
|
|
addOption('d5actionSelect', "Hibernar", 7);
|
|
}
|
|
if (amtPowerBootCapabilities['BIOSSetup'] == true) {
|
|
if (powerState & 2) { addOption('d5actionSelect', "Encienda el BIOS", 100); }
|
|
if (powerState & 1) { addOption('d5actionSelect', "Restablecer a BIOS", 101); }
|
|
}
|
|
if (amtPowerBootCapabilities['SecureErase'] == true) {
|
|
if (powerState & 2) { addOption('d5actionSelect', "Encender para borrar de forma segura", 104); }
|
|
if (powerState & 1) { addOption('d5actionSelect', "Restablecer a borrado seguro", 105); }
|
|
}
|
|
if ((amtPowerBootCapabilities['PlatformErase'] != null) && (amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] >= 32768) && (amtsysstate['CIM_BootService'].response['EnabledState'] & 2)) {
|
|
if (powerState & 2) { addOption('d5actionSelect', "Power up to Platform Erase", 106); }
|
|
if (powerState & 1) { addOption('d5actionSelect', "Reset to Platform Erase", 107); }
|
|
}
|
|
// ###BEGIN###{IDER}
|
|
if (powerState & 1) { addOption('d5actionSelect', "Restablecer al disquete IDE-R", 200); }
|
|
if (powerState & 2) { addOption('d5actionSelect', "Encienda el disquete IDE-R", 201); }
|
|
if (powerState & 1) { addOption('d5actionSelect', "Restablecer a IDE-R CDROM", 202); }
|
|
if (powerState & 2) { addOption('d5actionSelect', "Encienda el CDROM IDE-R", 203); }
|
|
// ###END###{IDER}
|
|
if (powerState & 1) { addOption('d5actionSelect', "Restablecer a PXE", 400); }
|
|
if (powerState & 2) { addOption('d5actionSelect', "Encender a PXE", 401); }
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
if (amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] === true) {
|
|
if (powerState & 1) { addOption('d5actionSelect', "Reset to HTTPS Boot", 600); }
|
|
if (powerState & 2) { addOption('d5actionSelect', "Power on to HTTPS Boot", 601); }
|
|
}
|
|
// ###END###{PowerControl-OneClick}
|
|
addOption('d5actionSelect', "Acción personalizada ...", 999);
|
|
// ###END###{PowerControl-Advanced}
|
|
if (amtversion > 5) { addOption('d5actionSelect', "Consentimiento del usuario ...", 998); } // On AMT 5 and higher, offer the option of doing user consent alone.
|
|
setDialogMode(5, "Acciones de poder", 3, powerActionDlgCheck);
|
|
} else {
|
|
messagebox("Acción de poder", format("No se pueden obtener las capacidades del sistema, error {0}", status));
|
|
}
|
|
}
|
|
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
function oneClickFileSelect() { QE('idx_dlgOkButton', Q('ocrfile').files.length == 1); }
|
|
// ###END###{PowerControl-OneClick}
|
|
// ###END###{PowerControl-Advanced}
|
|
|
|
function powerActionDlgCheck() {
|
|
AmtOcrPba = null;
|
|
AmtOcrPbaLength = 0;
|
|
var action = d5actionSelect.value;
|
|
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
if ((action == 600) || (action == 601)) {
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
// If the connection to intel AMT is not TLS, warn and exit now.
|
|
if (wsstack.comm.xtlsCertificate == null) { messagebox("Acción de poder", "This feature requires a TLS connection to Intel AMT"); return; }
|
|
// ###END###{Mode-NodeWebkit}
|
|
var x = "Select a disk image for remote boot." + '<br /><br /><input id=ocrfile type=file onchange=oneClickFileSelect() accept=".iso">';
|
|
setDialogMode(11, "HTTPS Boot", 3, function () {
|
|
var files = Q('ocrfile').files;
|
|
if (files.length != 1) return;
|
|
setupWebServer(urlvars['webcn'] ? urlvars['webcn'] : wsstack.comm.localAddress);
|
|
webserver.setupBootImage(files[0].path, (urlvars['webcn'] ? urlvars['webcn'] : wsstack.comm.localAddress));
|
|
powerActionDlg();
|
|
}, x);
|
|
QE('idx_dlgOkButton', false);
|
|
return;
|
|
}
|
|
// ###END###{PowerControl-OneClick}
|
|
// ###END###{PowerControl-Advanced}
|
|
|
|
if ((action == 500) || (action == 501)) {
|
|
// Perform OS wake from standby or OS sleep (Intel AMT 10+)
|
|
amtstack.RequestOSPowerStateChange((action == 501)?3:2, function (stack, name, response, status) {
|
|
if (status == 200) { QH('id_dialogMessage', "Acción de poder completada."); } else { QH('id_dialogMessage', format("Error de acción de energía # {0}.", status)); }
|
|
setDialogMode(1, "Acción de poder", 0);
|
|
setTimeout(function () { setDialogMode(0); }, 1300);
|
|
});
|
|
} else if ((action == 104) || (action == 105)) {
|
|
var x = ("¿Confirmar la ejecución de Intel® Remote Secure Erase?" + '<br>' + "Ingrese la contraseña de borrado seguro si es necesario." + '<br>');
|
|
x += ('<br><div style=height:16px><input type=password id=rsepass maxlength=32 style=float:right;width:240px><div>' + "Contraseña" + '</div></div>');
|
|
x += ('<br><div style=color:red>' + "<b> ADVERTENCIA: </b> Esto borrará los datos del sistema remoto." + '</div>');
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (wsstack.comm.xtlsFingerprint == null) { x += ('<div style=color:red>' + "<b> ADVERTENCIA: </b> TLS no se utiliza, la contraseña se enviará en claro." + '</div>'); }
|
|
// ###END###{Mode-NodeWebkit}
|
|
rsepass = 1;
|
|
setDialogMode(11, "Acciones de poder", 3, powerActionDlg, x);
|
|
} else if ((action == 106) || (action == 107)) {
|
|
powerActionDlgRPE();
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
} else if ((action == 999) && (amtversion >= 15)) {
|
|
statusbox("Acciones de poder", "Checking boot sources...");
|
|
amtstack.BatchEnum('', ['CIM_BootSourceSetting'], powerActionDlgCheck00, true);
|
|
// ###END###{PowerControl-OneClick}
|
|
} else {
|
|
powerActionDlg();
|
|
}
|
|
}
|
|
|
|
function powerActionDlgRPE(advanced) {
|
|
var x = ("Confirm execution of Intel® Remote Platform Erase?" + '<br>');
|
|
x += ('<br><div style=color:red>' + "<b> ADVERTENCIA: </b> Esto borrará los datos del sistema remoto." + '</div>');
|
|
var actionTaken = [], platfromEraseSupport = amtPowerBootCapabilities['PlatformErase'];
|
|
if (platfromEraseSupport & (1 << 2)) { actionTaken.push('<label><input id=rpef2 type=checkbox onchange=powerActionDlgRPEValidate()>' + "Secure Erase All SSDs" + '</label>'); }
|
|
if (platfromEraseSupport & (1 << 6)) { actionTaken.push('<label><input id=rpef6 type=checkbox onchange=powerActionDlgRPEValidate()>' + "TPM Clear" + '</label>'); }
|
|
if (platfromEraseSupport & (1 << 25)) { actionTaken.push('<label><input id=rpef25 type=checkbox onchange=powerActionDlgRPEValidate()>' + "Clear BIOS NVM Variables" + '</label>'); }
|
|
if (platfromEraseSupport & (1 << 26)) { actionTaken.push('<label><input id=rpef26 type=checkbox onchange=powerActionDlgRPEValidate()>' + "BIOS Reload of Golden Configuration" + '</label>'); }
|
|
if (platfromEraseSupport & (1 << 31)) { actionTaken.push('<label><input id=rpef31 type=checkbox onchange=powerActionDlgRPEValidate()>' + "CSME Unconfigure" + '</label>'); }
|
|
if (actionTaken.length > 1) { x += (format('<br />' + "Select the actions to take:" + '<br /><br /><div style=margin-left:16px>{0}</div><br />', actionTaken.join('<br />'))); }
|
|
x += '<div id=rpessdpass style=margin-top:4px;margin-bottom:4px;display:none>' + addHtmlValue("SSD Master Password", '<input id=rpessdpassx style=width:210px maxlength=64 type=input>') + '</div>';
|
|
setDialogMode(11, "Acciones de poder", 3, powerActionDlgRPEEx, x, advanced);
|
|
QE('idx_dlgOkButton', false);
|
|
}
|
|
|
|
function powerActionDlgRPEValidate() {
|
|
var rpeFlags = 0, platfromEraseSupport = amtPowerBootCapabilities['PlatformErase'], sf = [2,6,25,26,31];
|
|
for (var i in sf) { if (platfromEraseSupport & (1 << sf[i])) { if (Q('rpef' + sf[i]).checked) { rpeFlags += (1 << sf[i]); } } }
|
|
QV('rpessdpass', rpeFlags & 4);
|
|
QE('idx_dlgOkButton', rpeFlags);
|
|
}
|
|
|
|
var platfromEraseTLV = null;
|
|
function powerActionDlgRPEEx(b, advanced) {
|
|
var rpeFlags = 0, platfromEraseSupport = amtPowerBootCapabilities['PlatformErase'], sf = [1, 2, 6, 25, 26, 31];
|
|
for (var i in sf) { if (platfromEraseSupport & (1 << sf[i])) { if (Q('rpef' + sf[i]).checked) { rpeFlags += (1 << sf[i]); } } }
|
|
var tlv = makeUefiBootParam(1, rpeFlags, 4), tlvlen = 1;
|
|
if (rpeFlags & 2) { tlv += makeUefiBootParam(10, Q('rpepsidx').value); tlvlen++; }
|
|
if (rpeFlags & 4) { tlv += makeUefiBootParam(20, Q('rpessdpassx').value); tlvlen++; }
|
|
platfromEraseTLV = { tlv: btoa(tlv), tlvlen: tlvlen };
|
|
if (advanced) {
|
|
// Attempt user consent
|
|
statusbox("Acción de poder", "Comprobando estado ...");
|
|
amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1);
|
|
} else {
|
|
powerActionDlg();
|
|
}
|
|
}
|
|
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
var AmtOcrPba = null;
|
|
var AmtOcrPbaLength = 0;
|
|
function powerActionDlgCheck00(stack, name, response, status) {
|
|
if (status != 200) { messagebox("Acción de poder", format("GET CIM_BootSourceSetting, Error #{0}", status) + ((response.Header && response.Header.WsmanError) ? (', ' + response.Header.WsmanError) : '')); return; }
|
|
var bootSources = response.CIM_BootSourceSetting.responses;
|
|
AmtOcrPba = {};
|
|
for (var i = 0; i < bootSources.length; i++) {
|
|
var instanceid = bootSources[i]['InstanceID'];
|
|
if ((instanceid != null) && instanceid.toString().startsWith('Intel(r) AMT: Force OCR UEFI Boot')) {
|
|
try {
|
|
var arr = instanceid.trim().split(' ');
|
|
idx = parseInt(arr[arr.length - 1]);
|
|
AmtOcrPba[parseInt(idx)] = { instance: bootSources[i]['BIOSBootString'], bootstr: bootSources[i]['BootString'] };
|
|
AmtOcrPbaLength++;
|
|
} catch (e) { }
|
|
}
|
|
}
|
|
powerActionDlg();
|
|
}
|
|
// ###END###{PowerControl-OneClick}
|
|
|
|
function powerActionDlg() {
|
|
//if (amtversion == 0) return;
|
|
//if (amtversion > 6) { amtstack.Get('IPS_OptInService', powerActionResponse0); } else { amtstack.Get('AMT_BootSettingData', powerActionResponse1); }
|
|
var action = d5actionSelect.value;
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
if (action == 999) { showAdvPowerDlg(); return; }
|
|
// ###END###{PowerControl-Advanced}
|
|
if (action == 998) { amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1); return; }
|
|
|
|
// Some actions will not work if KVM/SOL/IDER are connected. If we perform these, disconnect now.
|
|
if ((action < 10) && (action > 2) && (urlvars['noredirdisconnect'] == null)) {
|
|
// ###BEGIN###{Desktop}
|
|
if (desktop.State == 3) connectDesktop();
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Terminal}
|
|
if (terminal.State == 3) connectTerminal();
|
|
// ###END###{Terminal}
|
|
// ###BEGIN###{IDER}
|
|
if ((ider != undefined) && (ider.state == 3)) iderStop();
|
|
// ###END###{IDER}
|
|
}
|
|
|
|
statusbox("Acción de poder", "Comprobando estado ...");
|
|
if ((rsepass != null) && (rsepass === 1)) { rsepass = Q('rsepass').value; }
|
|
|
|
var uc = true; // Check if we need to ask for user consent
|
|
if (amtversion < 6) uc = false; // Below AMT 6, user consent does not exist.
|
|
if ((currentView == 13) && (action == 8)) uc = false; // if in terminal, don't ask for it if power down.
|
|
if ((currentView != 13) && (action <= 10)) uc = false; // if not in terminal, don't ask for basic operations.
|
|
|
|
if (uc) {
|
|
// Attempt user consent
|
|
amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1);
|
|
} else {
|
|
// Skip user consent
|
|
amtstack.Get('AMT_BootSettingData', powerActionResponse1, 0, 1);
|
|
}
|
|
}
|
|
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
var AvdPowerDlg;
|
|
function showAdvPowerDlg() {
|
|
try { Q('idx_d24Command').value = (amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] == 2)?10:2; } catch (ex) { }
|
|
|
|
// Show boot capabilities
|
|
QV('d24dBiosPause', amtPowerBootCapabilities['BIOSPause'] == true);
|
|
QV('d24dBiosSecureBoot', amtPowerBootCapabilities['BIOSSecureBoot'] == true);
|
|
QV('d24dReflashBios', amtPowerBootCapabilities['BIOSReflash'] == true);
|
|
QV('d24dBiosSetup', amtPowerBootCapabilities['BIOSSetup'] == true);
|
|
QV('ForceDVDBootOption', amtPowerBootCapabilities['ForceCDorDVDBoot'] == true);
|
|
QV('ForceDiagBootOption', amtPowerBootCapabilities['ForceDiagnosticBoot'] == true);
|
|
QV('ForceHDBootOption', amtPowerBootCapabilities['ForceHardDriveBoot'] == true);
|
|
//QV('', amtPowerBootCapabilities['ForceHardDriveSafeModeBoot'] == true);
|
|
//QV('', amtPowerBootCapabilities['ForceWinREBoot'] == true);
|
|
QV('ForcePXEBootOption', amtPowerBootCapabilities['ForcePXEBoot'] == true);
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
QV('ForceUEFIBootOption', false);
|
|
if ((AmtOcrPbaLength > 0) && (amtPowerBootCapabilities['ForceUEFIPBABoot'] == true)) {
|
|
QV('ForceUEFIBootOption', true);
|
|
var x = '';
|
|
for (var i in AmtOcrPba) { x += '<option value=' + i + '>' + AmtOcrPba[i].instance + '</option>'; }
|
|
QH('idx_d24customBootMediaIndex', x);
|
|
}
|
|
var httpsBootPossible = (meshCentralServer==null && wsstack.comm.xtlsCertificate != null) || (meshCentralServer!=null && ((currentcomputer.conn & 4) == 4) && currentcomputer.tls == 1) || (meshCentralServer!=null && ((currentcomputer.conn & 2) == 2) )
|
|
|
|
QV('ForceHttpBootOption', (amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true) && httpsBootPossible);
|
|
QV('ForceHttpUrlBootOption', (amtPowerBootCapabilities['ForceUEFIHTTPSBoot'] == true) && httpsBootPossible);
|
|
// ###END###{PowerControl-OneClick}
|
|
QV('d24dForceProgressEvents', amtPowerBootCapabilities['ForcedProgressEvents'] == true);
|
|
QV('d24dUseIDER', amtPowerBootCapabilities['IDER'] == true);
|
|
QV('d24dLockKeyboard', amtPowerBootCapabilities['KeyboardLock'] == true);
|
|
QV('d24dLockPowerButton', amtPowerBootCapabilities['PowerButtonLock'] == true);
|
|
QV('d24dLockResetButton', amtPowerBootCapabilities['ResetButtonLock'] == true);
|
|
QV('d24dSerialOverLan', amtPowerBootCapabilities['SOL'] == true);
|
|
QV('d24dSecureErase', amtPowerBootCapabilities['SecureErase'] == true);
|
|
QV('d24dPlatformErase', (amtPowerBootCapabilities['PlatformErase'] != null) && (amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] >= 32768) && ((amtsysstate['CIM_BootService'].response['EnabledState'] & 2) != 0));
|
|
QV('d24dFirmwareReset', amtPowerBootCapabilities['ConfigurationDataReset'] == true);
|
|
QV('d24dLockSleepButton', amtPowerBootCapabilities['SleepButtonLock'] == true);
|
|
QV('d24dUserPasswordBypass', amtPowerBootCapabilities['UserPasswordBypass'] == true);
|
|
QV('idx_d24Verbocity1', amtPowerBootCapabilities['VerbosityQuiet'] == true);
|
|
QV('idx_d24Verbocity2', amtPowerBootCapabilities['VerbosityVerbose'] == true);
|
|
QV('idx_d24Verbocity3', amtPowerBootCapabilities['VerbosityScreenBlank'] == true);
|
|
QV('d24p500', amtversion > 9);
|
|
QV('d24p501', amtversion > 9);
|
|
|
|
setDialogMode(24, "Acción de poder personalizada", 3, showAdvPowerDlgOk);
|
|
showAdvPowerDlgChange();
|
|
}
|
|
|
|
function showAdvPowerDlgChange() {
|
|
var ok = true;
|
|
QV('idd_d24IDERBootDevice', Q('d24UseIDER').checked);
|
|
QV('idd_d24RSEPass', Q('d24SecureErase') ? Q('d24SecureErase').checked : false);
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
QV('idd_d24RSEPassTlsWarn', (wsstack.comm.xtlsFingerprint == null) && (Q('d24SecureErase') ? Q('d24SecureErase').checked : false));
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// If this is a OS power state change, gray out all of the options.
|
|
var ospower = ((Q('idx_d24Command').value >= 500) && (Q('idx_d24Command').value < 600));
|
|
QE('idx_d24ForceBootDevice', !ospower);
|
|
QE('idx_d24BootMediaIndex', !ospower);
|
|
QE('idd_d24IDERBootDevice', !ospower);
|
|
QE('idx_d24Verbocity', !ospower);
|
|
QE('idd_d24RSEPass', !ospower);
|
|
|
|
// If the boot source is not "None" (0), disable all boot settings.
|
|
//var bootSettingOpts = ['d24BiosPause', 'd24BiosSecureBoot', 'd24BiosSetup', 'd24ForceProgressEvents', 'd24LockPowerButton', 'd24LockResetButton', 'd24LockSleepButton', 'd24LockKeyboard', 'd24UserPasswordBypass', 'd24ReflashBios', 'd24SafeMode', 'd24UseIDER', 'd24SerialOverLan', 'd24SecureErase'];
|
|
//if ((idx_d24ForceBootDevice.value > 0) && (idx_d24ForceBootDevice.value < 5)) { for (var i in bootSettingOpts) { Q(bootSettingOpts[i]).checked = false; } }
|
|
//for (var i in bootSettingOpts) { QE(bootSettingOpts[i], idx_d24ForceBootDevice.value == 0); }
|
|
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
var bootSourceIndex = Q('idx_d24ForceBootDevice').value;
|
|
QV('idx_d24bootSource', bootSourceIndex < 5);
|
|
QV('idx_d24customBootSource', bootSourceIndex == 5)
|
|
QV('idx_d24diskImage', bootSourceIndex == 6);
|
|
QV('idx_d24diskImageUrl', bootSourceIndex == 7);
|
|
if ((bootSourceIndex == 6) && (Q('idx_d24ocrBootFile').files.length != 1)) { ok = false; }
|
|
if ((bootSourceIndex == 7) && (Q('idx_d24ocrBootUrl').value.trim().toLowerCase().startsWith('https://') == false)) { ok = false;}
|
|
// ###END###{PowerControl-OneClick}
|
|
|
|
QE('idx_dlgOkButton', ok);
|
|
}
|
|
|
|
function showAdvPowerDlgOk() {
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
var forceBootSelection = Q('idx_d24ForceBootDevice').value;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (((forceBootSelection == 5) || (forceBootSelection == 6) || (forceBootSelection == 7)) &&
|
|
((meshCentralServer==null && wsstack.comm.xtlsCertificate == null) || (meshCentralServer!=null && ((currentcomputer.conn & 4) == 4) && currentcomputer.tls == 0))) {
|
|
messagebox("Acción de poder", "This feature requires a TLS connection to Intel AMT"); return;
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
if (forceBootSelection == 6) {
|
|
var files = Q('idx_d24ocrBootFile').files;
|
|
if (files.length == 1) {
|
|
setupWebServer(urlvars['webcn'] ? urlvars['webcn'] : wsstack.comm.localAddress);
|
|
webserver.setupBootImage(files[0].path, (urlvars['webcn'] ? urlvars['webcn'] : wsstack.comm.localAddress));
|
|
}
|
|
}
|
|
// ###END###{PowerControl-OneClick}
|
|
|
|
var action = Q('idx_d24Command').value;
|
|
if ((action == 500) || (action == 501)) {
|
|
// Perform OS wake from standby or OS sleep (Intel AMT 10+)
|
|
amtstack.RequestOSPowerStateChange((action == 501) ? 3 : 2, function (stack, name, response, status) {
|
|
if (status == 200) { QH('id_dialogMessage', "Acción de poder completada."); } else { QH('id_dialogMessage', format("Error de acción de energía # {0}.", status)); }
|
|
setDialogMode(1, "Acción de poder", 0);
|
|
setTimeout(function () { setDialogMode(0); }, 1300);
|
|
});
|
|
} else {
|
|
// Fetch all of the user data
|
|
AvdPowerDlg = {};
|
|
AvdPowerDlg.Action = Q('idx_d24Command').value;
|
|
AvdPowerDlg.BIOSPause = Q('d24BiosPause').checked;
|
|
AvdPowerDlg.BIOSSecureBoot = Q('d24BiosSecureBoot').checked;
|
|
AvdPowerDlg.BIOSSetup = Q('d24BiosSetup').checked;
|
|
AvdPowerDlg.BootMediaIndex = Q('idx_d24BootMediaIndex').value;
|
|
AvdPowerDlg.FirmwareVerbosity = Q('idx_d24Verbocity').value;
|
|
AvdPowerDlg.ForcedProgressEvents = Q('d24ForceProgressEvents').checked;
|
|
AvdPowerDlg.IDERBootDevice = Q('idx_d24IDERBootDevice').value; // 0 = Boot on Floppy, 1 = Boot on IDER
|
|
AvdPowerDlg.LockKeyboard = Q('d24LockKeyboard').checked;
|
|
AvdPowerDlg.LockPowerButton = Q('d24LockPowerButton').checked;
|
|
AvdPowerDlg.LockResetButton = Q('d24LockResetButton').checked;
|
|
AvdPowerDlg.LockSleepButton = Q('d24LockSleepButton').checked;
|
|
AvdPowerDlg.ReflashBIOS = Q('d24ReflashBios').checked;
|
|
AvdPowerDlg.UseIDER = Q('d24UseIDER').checked;
|
|
AvdPowerDlg.UseSOL = Q('d24SerialOverLan').checked;
|
|
AvdPowerDlg.UseSafeMode = Q('d24SafeMode').checked;
|
|
AvdPowerDlg.UserPasswordBypass = Q('d24UserPasswordBypass').checked;
|
|
AvdPowerDlg.SecureErase = Q('d24SecureErase').checked;
|
|
AvdPowerDlg.PlatformErase = Q('d24PlatformErase').checked
|
|
AvdPowerDlg.FirmwareReset = Q('d24FirmwareReset').checked;
|
|
if ((AvdPowerDlg.SecureErase === true) && (Q('d24rsepass').value.length > 0)) { AvdPowerDlg.RSEPassword = Q('d24rsepass').value; }
|
|
|
|
if (AvdPowerDlg.PlatformErase === true) {
|
|
// Ask additional information about RPE
|
|
powerActionDlgRPE(true);
|
|
} else {
|
|
// Attempt user consent
|
|
statusbox("Acción de poder", "Comprobando estado ...");
|
|
amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1);
|
|
}
|
|
}
|
|
}
|
|
// ###END###{PowerControl-Advanced}
|
|
|
|
function powerActionResponse0(stack, name, response, status) {
|
|
//if (errcheck(status, stack)) return; // TODO: If AMT 5 or below, this will error and we need to skip user consent.
|
|
if (status != 200) {
|
|
if (connectDesktopConsent) { connectDesktop(true); } else { messagebox("Acción de poder", format("Error # {0}", status)); }
|
|
return;
|
|
}
|
|
//console.log('powerActionResponse0(' + name + ',' + ObjectToString2(response) + ',' + status + ')');
|
|
//console.log("OptInRequired:", response.Body['OptInRequired']);
|
|
//console.log("OptInState:", response.Body['OptInState']);
|
|
//console.log(response);
|
|
if (response.Body['OptInRequired'] == 0xFFFFFFFF && response.Body['OptInState'] != 3 && response.Body['OptInState'] != 4) {
|
|
if (response.Body['OptInState'] == 2) {
|
|
// amtstack.IPS_OptInService_CancelOptIn(null);
|
|
d6ConsentText.value = ''; // Reset user consent code to empty
|
|
setDialogMode(6, "Consentimiento del usuario", 11, powerActionSendConsent);
|
|
checkConsentDisplay();
|
|
consentChanged();
|
|
return;
|
|
}
|
|
//console.log("Opt-in Required.", response.Body['OptInRequired']);
|
|
statusbox("Acción de poder", "Iniciando opt-in ...");
|
|
amtstack.IPS_OptInService_StartOptIn(powerActionResponseC1, 0, 1);
|
|
} else {
|
|
if (connectDesktopConsent) { setDialogMode(0); connectDesktop(true); return; }
|
|
if (d5actionSelect.value == 998) { messagebox("Consentimiento del usuario", "El consentimiento del usuario no es necesario."); return; }
|
|
statusbox("Acción de poder", "Obteniendo la configuración de arranque ...");
|
|
amtstack.Get('AMT_BootSettingData', powerActionResponse1, 0, 1);
|
|
}
|
|
}
|
|
|
|
function powerActionResponseC1(stack, name, response, status) {
|
|
//if (errcheck(status, stack)) return;
|
|
//console.log('powerActionResponseC1', action, status, response);
|
|
if (status != 200) { if (connectDesktopConsent) { setDialogMode(0); connectDesktop(true); } else { messagebox("Acción de poder", format("Error #", status)); } return; }
|
|
//console.log("powerActionResponseC1(" + name + "," + ObjectToString2(response) + "," + status + ")");
|
|
if (response.Body['ReturnValue'] != 0) {
|
|
if (connectDesktopConsent) { setDialogMode(0); connectDesktop(true); } else { messagebox("Error de consentimiento del usuario", response.Body.ReturnValueStr.replace(/_/g, ' ')); }
|
|
} else {
|
|
d6ConsentText.value = ''; // Reset user consent code to empty
|
|
setDialogMode(6, "Consentimiento del usuario", 11, powerActionSendConsent);
|
|
checkConsentDisplay();
|
|
consentChanged();
|
|
|
|
// Check if the machine is powered down, if it is, power it up for user consent.
|
|
amtstack.Enum('CIM_ServiceAvailableToElement', function(stack, name, responses, status) {
|
|
if (errcheck(status, stack)) return;
|
|
amtsysstate['CIM_ServiceAvailableToElement'].responses = responses;
|
|
updateSystemStatus();
|
|
if ((amtsysstate['CIM_ServiceAvailableToElement'] != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses != null) && (amtsysstate['CIM_ServiceAvailableToElement'].responses.length > 0)) {
|
|
if (amtsysstate['CIM_ServiceAvailableToElement'].responses[0]['PowerState'] != 2) {
|
|
// System is not on, power it on now.
|
|
amtstack.RequestPowerStateChange(2, function (stack, name, response, status) { });
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
//function powerActionCancelConsent() { amtstack.IPS_OptInService_CancelOptIn(null); }
|
|
|
|
function powerActionSendConsent(buttons) {
|
|
if (buttons == 0) {
|
|
// Cancel button
|
|
amtstack.IPS_OptInService_CancelOptIn(function() {});
|
|
} else {
|
|
// OK Button
|
|
statusbox("Acción de poder", "Enviando consentimiento del usuario ...");
|
|
amtstack.IPS_OptInService_SendOptInCode(d6ConsentText.value, powerActionResponseC2, 0, 1);
|
|
}
|
|
}
|
|
|
|
function powerActionResponseC2(stack, name, response, status) {
|
|
//if (errcheck(status, stack)) return;
|
|
if (status != 200) { messagebox("Acción de poder", format("Error # {0}", status)); return; }
|
|
//console.log("powerActionResponseC2(" + name + "," + ObjectToString2(response) + "," + status + ")");
|
|
if (response.Body['ReturnValue'] != 0) {
|
|
amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1);
|
|
} else {
|
|
if (connectDesktopConsent) { setDialogMode(0); connectDesktop(true); return; }
|
|
if (d5actionSelect.value == 998) { messagebox("Consentimiento del usuario", "Consentimiento del usuario exitoso."); return; } // This was just a user consent request, no need to go further.
|
|
statusbox("Acción de poder", "Comprobando estado ...");
|
|
amtstack.Get('AMT_BootSettingData', powerActionResponse1, 0, 1);
|
|
}
|
|
}
|
|
|
|
function powerActionResponse1(stack, name, response, status) {
|
|
//if (errcheck(status, stack)) return;
|
|
if (status != 200) { messagebox("Acción de poder", format("Error # {0}", status)); return; }
|
|
//console.log("powerActionResponse1(" + name + "," + ObjectToString2(response) + "," + status + ")");
|
|
var action = d5actionSelect.value;
|
|
var r = response.Body;
|
|
r['ConfigurationDataReset'] = false;
|
|
|
|
// Clean up parameters
|
|
delete r['WinREBootEnabled'];
|
|
delete r['UEFILocalPBABootEnabled'];
|
|
delete r['UEFIHTTPSBootEnabled'];
|
|
delete r['SecureBootControlEnabled'];
|
|
delete r['BootguardStatus'];
|
|
delete r['OptionsCleared'];
|
|
delete r['BIOSLastStatus'];
|
|
delete r['UefiBootParametersArray'];
|
|
delete r['RPEEnabled'];
|
|
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
if (action == 999) {
|
|
r['BIOSPause'] = AvdPowerDlg.BIOSPause;
|
|
r['EnforceSecureBoot'] = AvdPowerDlg.BIOSSecureBoot;
|
|
r['BIOSSetup'] = AvdPowerDlg.BIOSSetup;
|
|
r['BootMediaIndex'] = AvdPowerDlg.BootMediaIndex;
|
|
r['FirmwareVerbosity'] = AvdPowerDlg.FirmwareVerbosity;
|
|
r['ForcedProgressEvents'] = AvdPowerDlg.ForcedProgressEvents;
|
|
r['IDERBootDevice'] = AvdPowerDlg.IDERBootDevice; // 0 = Boot on Floppy, 1 = Boot on IDER
|
|
r['LockKeyboard'] = AvdPowerDlg.LockKeyboard;
|
|
r['LockPowerButton'] = AvdPowerDlg.LockPowerButton;
|
|
r['LockResetButton'] = AvdPowerDlg.LockResetButton;
|
|
r['LockSleepButton'] = AvdPowerDlg.LockSleepButton;
|
|
r['ReflashBIOS'] = AvdPowerDlg.ReflashBIOS;
|
|
r['UseIDER'] = AvdPowerDlg.UseIDER;
|
|
r['UseSOL'] = AvdPowerDlg.UseSOL;
|
|
r['UseSafeMode'] = AvdPowerDlg.UseSafeMode;
|
|
r['UserPasswordBypass'] = AvdPowerDlg.UserPasswordBypass;
|
|
if (r['SecureErase'] != null) {
|
|
r['SecureErase'] = ((AvdPowerDlg.SecureErase) && (amtPowerBootCapabilities['SecureErase'] == true));
|
|
if ((r['SecureErase'] == true) && (AvdPowerDlg.RSEPassword)) { r['RSEPassword'] = AvdPowerDlg.RSEPassword; }
|
|
}
|
|
if ((r['PlatformErase'] != null) && (amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] >= 32768) && (amtsysstate['CIM_BootService'].response['EnabledState'] & 2) && ((AvdPowerDlg.PlatformErase) && (amtPowerBootCapabilities['PlatformErase'] != null) && ((amtPowerBootCapabilities['PlatformErase'] & 1) != 0))) {
|
|
r['PlatformErase'] = true;
|
|
r['UefiBootParametersArray'] = platfromEraseTLV.tlv;
|
|
r['UefiBootNumberOfParams'] = platfromEraseTLV.tlvlen;
|
|
}
|
|
if (r['ConfigurationDataReset'] != null) { r['ConfigurationDataReset'] = AvdPowerDlg.FirmwareReset; }
|
|
} else {
|
|
// ###END###{PowerControl-Advanced}
|
|
r['BIOSPause'] = false;
|
|
r['EnforceSecureBoot'] = false;
|
|
r['BIOSSetup'] = (action > 99 && action < 104);
|
|
r['BootMediaIndex'] = 0;
|
|
r['FirmwareVerbosity'] = 0;
|
|
r['ForcedProgressEvents'] = false;
|
|
r['IDERBootDevice'] = ((action == 202) || (action == 203))?1:0; // 0 = Boot on Floppy, 1 = Boot on IDER
|
|
r['LockKeyboard'] = false;
|
|
r['LockPowerButton'] = false;
|
|
r['LockResetButton'] = false;
|
|
r['LockSleepButton'] = false;
|
|
r['ReflashBIOS'] = false;
|
|
r['UseIDER'] = ((action > 199) && (action < 300));
|
|
//r['UseSOL'] = ((currentView == 13) && (action != 8) && (action != 300) && (action != 301)); // If we are looking at the terminal, turn on SOL. SOL can't be used with diagnostic mode (300/301)
|
|
r['UseSOL'] = ((currentView == 13) && (action != 8) && (action < 300)); // If we are looking at the terminal, turn on SOL.
|
|
r['UseSafeMode'] = false;
|
|
r['UserPasswordBypass'] = false;
|
|
if (r['SecureErase'] != null) {
|
|
r['SecureErase'] = (((action == 104) || (action == 105)) && (amtPowerBootCapabilities['SecureErase'] == true));
|
|
if ((r['SecureErase'] === true) && (rsepass.length > 0)) { r['RSEPassword'] = rsepass; }
|
|
}
|
|
if ((r['PlatformErase'] != null) && (amtsysstate['CIM_BootService'] != null) && (amtsysstate['CIM_BootService'].response['EnabledState'] >= 32768) && (amtsysstate['CIM_BootService'].response['EnabledState'] & 2) && (((action == 106) || (action == 107)) && (amtPowerBootCapabilities['PlatformErase'] != null) && (((amtPowerBootCapabilities['PlatformErase'] & 1)) != 0))) {
|
|
r['PlatformErase'] = true;
|
|
r['UefiBootParametersArray'] = platfromEraseTLV.tlv;
|
|
r['UefiBootNumberOfParams'] = platfromEraseTLV.tlvlen;
|
|
}
|
|
if (r['ConfigurationDataReset'] != null) {
|
|
r['ConfigurationDataReset'] = false;
|
|
}
|
|
rsepass = null;
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
}
|
|
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
// Add OCR TLV parameters if firmware supports OCR and Force HTTPS Boot is requested
|
|
if ((action == 999) && (Q('idx_d24ForceBootDevice').value == 7)) { // Force UEFI HTTPS Boot using URL
|
|
r['UefiBootParametersArray'] = btoa(makeUefiBootParam(1, Q('idx_d24ocrBootUrl').value.trim()) + makeUefiBootParam(20, 1, 1) + makeUefiBootParam(30, 0, 2));
|
|
r['UefiBootNumberOfParams'] = 3;
|
|
r['BootMediaIndex'] = 0; // Do not use boot media index for One Click Recovery (OCR)
|
|
} else if ((action == 600) || (action == 601) || ((action == 999) && (Q('idx_d24ForceBootDevice').value == 6))) { // Force UEFI HTTPS Boot
|
|
// Check if using built-in webserver or external webserver
|
|
r['UefiBootParametersArray'] = webserver.lastBootImageArgs.args;
|
|
r['UefiBootNumberOfParams'] = webserver.lastBootImageArgs.argscount;
|
|
r['BootMediaIndex'] = 0; // Do not use boot media index for One Click Recovery (OCR)
|
|
} else if ((action == 999) && (Q('idx_d24ForceBootDevice').value == 5)) {
|
|
var bootstr = AmtOcrPba[Q('idx_d24customBootMediaIndex').value].bootstr;
|
|
console.log('OCR BootStr: ' + bootstr);
|
|
r['UefiBootParametersArray'] = btoa(makeUefiBootParam(2, bootstr) + makeUefiBootParam(3, bootstr.length, 2)); // EFI_DEVICE_PATH (2) + EFI_DEVICE_PATH-LENGTH (3)
|
|
r['UefiBootNumberOfParams'] = 2;
|
|
r['BootMediaIndex'] = 0; // Do not use boot media index for One Click Recovery (OCR)
|
|
}
|
|
// ###END###{PowerControl-OneClick}
|
|
// ###END###{PowerControl-Advanced}
|
|
|
|
//if (((action == 104) || (action == 105)) && !r['SecureErase']) { /*console.log("This Intel® AMT does not support Secure Erase");*/ cleanup(); return; }
|
|
console.log("Acción de arranque: " + action);
|
|
console.log("Configuración de arranque: " + ObjectToString2(r));
|
|
statusbox("Acción de poder", "Establecer la configuración de arranque ...");
|
|
|
|
// Set the boot order to null, this is needed for some AMT versions that don't clear this automatically.
|
|
amtstack.CIM_BootConfigSetting_ChangeBootOrder(null, function (stack, name, response, status) {
|
|
if (status != 200) { messagebox("Acción de poder", format("PUT CIM_BootConfigSetting_ChangeBootOrder, Error #{0}", status) + ((response.Header && response.Header.WsmanError) ? (', ' + response.Header.WsmanError) : '')); return; }
|
|
if (response.Body['ReturnValue'] != 0) { messagebox("Change Boot Order", "(1) Change Boot Order returns "+ response.Body.ReturnValueStr); return; }
|
|
amtstack.Put('AMT_BootSettingData', r, powerActionResponse2, 0, 1);
|
|
}, 0, 1);
|
|
}
|
|
|
|
function powerActionResponse2(stack, name, response, status, tag) {
|
|
//console.log("powerActionResponse2(" + name + "," + response + "," + status + ")");
|
|
if (status != 200) { messagebox("Acción de poder", format("PONER AMT_BootSettingData, Error # {0}", status) + ((response.Header && response.Header.WsmanError) ? (', ' + response.Header.WsmanError) : '')); return; }
|
|
//if (status == 408) { messagebox("Power Action", "Access denied."); return; }
|
|
//if (errcheck(status, stack)) return;
|
|
//console.log("Setup next boot...");
|
|
statusbox("Acción de poder", "Configurando el próximo arranque ...");
|
|
amtstack.SetBootConfigRole(1, powerActionResponse3x, 0, 1);
|
|
}
|
|
|
|
function powerActionResponse3x(stack, name, response, status) {
|
|
//console.log("powerActionResponse3x(" + name + "," + response + "," + status + ")");
|
|
var action = d5actionSelect.value, bootSource = null;
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
if (action == 999) {
|
|
// ###BEGIN###{!PowerControl-OneClick}
|
|
if (idx_d24ForceBootDevice.value > 0) { bootSource = ['Force CD/DVD Boot', 'Force PXE Boot', 'Force Hard-drive Boot', 'Force Diagnostic Boot'][idx_d24ForceBootDevice.value - 1]; }
|
|
// ###END###{!PowerControl-OneClick}
|
|
// ###BEGIN###{PowerControl-OneClick}
|
|
if (idx_d24ForceBootDevice.value > 0) { bootSource = ['Force CD/DVD Boot', 'Force PXE Boot', 'Force Hard-drive Boot', 'Force Diagnostic Boot', 'Force OCR UEFI Boot Option ' + Q('idx_d24customBootMediaIndex').value, 'Force OCR UEFI HTTPS Boot', 'Force OCR UEFI HTTPS Boot'][idx_d24ForceBootDevice.value - 1]; }
|
|
// ###END###{PowerControl-OneClick}
|
|
} else {
|
|
// ###END###{PowerControl-Advanced}
|
|
if (action == 300 || action == 301) { bootSource = 'Force Diagnostic Boot'; }
|
|
if (action == 400 || action == 401) { bootSource = 'Force PXE Boot'; }
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
if (action == 600 || action == 601) {
|
|
|
|
bootSource = 'Force OCR UEFI HTTPS Boot';
|
|
}
|
|
}
|
|
|
|
// Resetting Force boot data in case it was changed so that it won't be used on the next power action
|
|
Q('idx_d24ForceBootDevice').value = 0;
|
|
|
|
// ###END###{PowerControl-Advanced}
|
|
console.log('ChangeBootOrder: ' + bootSource);
|
|
amtstack.CIM_BootConfigSetting_ChangeBootOrder((bootSource == null)?bootSource:'<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_BootSourceSetting</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">Intel(r) AMT: ' + bootSource + '</Selector></SelectorSet></ReferenceParameters>', powerActionResponse3);
|
|
}
|
|
|
|
var targetPowerAction = 0;
|
|
function powerActionResponse3(stack, name, response, status) {
|
|
console.log('powerActionResponse3(' + name + ',' + response + ',' + status + ')');
|
|
if (errcheck(status, stack)) return;
|
|
if (response.Body['ReturnValue'] != 0) { messagebox("Change Boot Order", "(2) Change Boot Order returns "+ response.Body.ReturnValueStr); return; }
|
|
|
|
//console.log("Performing Power State Change...");
|
|
statusbox("Acción de poder", "Realizando acción de poder ...");
|
|
var action = d5actionSelect.value;
|
|
if (action == 100 || action == 201 || action == 203 || action == 300 || action == 401 || action == 601) action = 2; // Power up
|
|
if (action == 101 || action == 200 || action == 202 || action == 301 || action == 400 || action == 600) action = 10; // Reset
|
|
if (action == 104) action = 2; // Power on with Remote Secure Erase
|
|
if (action == 105) action = 10; // Reset with Remote Secure Erase
|
|
if (action == 106) action = 2; // Power on with Remote Platfrom Erase
|
|
if (action == 107) action = 10; // Reset with Remote Platfrom Erase
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
if (action == 999) action = AvdPowerDlg.Action;
|
|
targetPowerAction = action;
|
|
//console.log('RequestPowerStateChange:' + action);
|
|
if (action == 11) { action = 10; }
|
|
if (action < 999) { console.log('RequestPowerStateChange(' + action + ')'); amtstack.RequestPowerStateChange(action, powerActionResponse4); } else { messagebox("Acción de poder", "Siguiente conjunto de acciones de arranque."); }
|
|
// ###END###{PowerControl-Advanced}
|
|
// ###BEGIN###{!PowerControl-Advanced}
|
|
targetPowerAction = action;
|
|
amtstack.RequestPowerStateChange(action, powerActionResponse4);
|
|
// ###END###{!PowerControl-Advanced}
|
|
}
|
|
|
|
function powerActionResponse4(stack, name, response, status) {
|
|
//console.log("powerActionResponse4(" + name + "," + response + "," + status + ")");
|
|
if (status == 200) {
|
|
// Done!
|
|
//console.log("Action Completed.");
|
|
QH('id_dialogMessage', "Acción de poder completada.");
|
|
setDialogMode(1, "Acción de poder", 0);
|
|
setTimeout(function() { setDialogMode(0); }, 1300);
|
|
}
|
|
// console.log("Power State Error: " + status);
|
|
// Sometimes Intel AMT with not respond and this will timeout. Try to pull the power state
|
|
amtstack.Get('CIM_AssociatedPowerManagementService', powerActionResponse5, 0, 1);
|
|
}
|
|
|
|
function powerActionResponse5(stack, name, response, status) {
|
|
//console.log("powerActionResponse5(" + name + "," + response + "," + status + ")");
|
|
/*
|
|
if (errcheck(status, stack)) return;
|
|
var powerstate = parseInt(response.Body['PowerState']);
|
|
console.log("powerstate: " + powerstate);
|
|
if (targetPowerAction == powerstate) {
|
|
console.log("Action Completed. ");
|
|
} else {
|
|
console.log("Power State Error: " + status + ", CurrentState=" + powerstate + ", TargetState=" + targetPowerAction);
|
|
}
|
|
*/
|
|
}
|
|
|
|
function consentChanged() { QE('idx_dlgOkButton', d6ConsentText.value.length == 6); }
|
|
function changeConsentDisplay() { xxchangeConsentDisplay = true; checkConsentDisplay(); }
|
|
function checkConsentDisplay() { /*console.log("Getting display information...");*/ amtstack.Get('IPS_SecIOService', checkConsentDisplayResponse1); }
|
|
|
|
var xxchangeConsentDisplay = false;
|
|
function checkConsentDisplayResponse1(stack, name, response, status) {
|
|
// console.log('checkConsentDisplayResponse1(' + name + ',' + response + ',' + status + ')');
|
|
if (status == 200) {
|
|
if (response.Body['DefaultScreen']) response.Body['DefaultScreen'] = parseInt(response.Body['DefaultScreen']);
|
|
if (response.Body['NumberOfScreens']) response.Body['NumberOfScreens'] = parseInt(response.Body['NumberOfScreens']);
|
|
if (xxchangeConsentDisplay == true) {
|
|
xxchangeConsentDisplay = false;
|
|
// Change consent screen settings
|
|
response.Body['DefaultScreen'] = d6Display.value;
|
|
amtstack.Put('IPS_SecIOService', response.Body, checkConsentDisplayResponse1);
|
|
} else {
|
|
d6Display.value = response.Body['DefaultScreen'];
|
|
QV('d6ThirdDisplay', response.Body['NumberOfScreens'] > 2);
|
|
}
|
|
} else {
|
|
//console.log("Display Error: " + status);
|
|
}
|
|
}
|
|
|
|
// ###END###{PowerControl}
|
|
|
|
// ###BEGIN###{Storage}
|
|
|
|
//
|
|
// Storage
|
|
//
|
|
|
|
var xxStorage = null;
|
|
var xxStorageVendors = [];
|
|
var xxStorageApplications = [];
|
|
|
|
function PullStorage() {
|
|
amtFirstPull |= 8;
|
|
wsstack.comm.PerformAjax('', PullStorageResponse, null, 0, '/amt-storage/', 'GET');
|
|
}
|
|
|
|
function PullStorageResponse(data, status, tag) {
|
|
if (amtstack.PendingBatchOperations == 0) refreshButtons(true); // If nothing is being done, re-enable refresh buttons
|
|
|
|
if (status == 200) {
|
|
QV('go21', true); // Show Storage Panel
|
|
|
|
var len; // Remove all chars that are below 32, this will allow parsing even the the firmware gives us garbage.
|
|
for (var i = 0; i < 32; i++) { do { len = data.length; data = data.replace(String.fromCharCode(i), ''); } while (len > data.length); }
|
|
//data = '{"information": {"version": 1.1,"realms": 7765759,"user": "admin"},"content": [{"name": "index.htm","size": 38864},{"vendor": "User","app": "SDK","name": "Sample.html","size": 26760,"link": "SDK Sample"},{"vendor": "User","app": "SDK","name": "ws.js","size": 42575,"link": "SDK Sample"},{"vendor": "User","app": "SDK","name": "btp.min.css","size": 121265,"link": "SDK Sample"},{"vendor": "User","app": "SDK","name": "logo.png","size": 2803,"link": "SDK Sample"}]}';
|
|
try { xxStorage = JSON.parse(data); } catch (e) { return; }
|
|
xxStorageVendors = [];
|
|
xxStorageApplications = [];
|
|
var content = xxStorage['content'];
|
|
|
|
if (Array.isArray(content)) {
|
|
// New flat format, convert to tree format.
|
|
var newcontent = {};
|
|
for (var i in content) {
|
|
var vendor = content[i]['vendor'] ? content[i]['vendor'] : '';
|
|
if (!newcontent[vendor]) { newcontent[vendor] = {}; }
|
|
var app = content[i]['app'] ? content[i]['app'] : '';
|
|
if (!newcontent[vendor][app]) { newcontent[vendor][app] = {}; }
|
|
if (content[i]['name']) { newcontent[vendor][app][content[i]['name']] = content[i]; }
|
|
}
|
|
xxStorage['content'] = content = newcontent;
|
|
} else {
|
|
// Tree format, move index.htm and logon.htm
|
|
if (content['index.htm'] || content['logon.htm']) { content[''] = { '': {} }; }
|
|
if (content['index.htm']) { content['']['']['index.htm'] = content['index.htm']; delete content['index.htm']; }
|
|
if (content['logon.htm']) { content['']['']['logon.htm'] = content['logon.htm']; delete content['logon.htm']; }
|
|
}
|
|
|
|
// Display all storage files
|
|
var count = 0, x = TableStart2() + '<tr><td class=r1 style=padding-left:15px><br>' + "Administre el almacenamiento Intel® AMT para esta computadora." + '<br><br>';
|
|
var ii, jj, xx = '', links = '', linkid = 30;
|
|
for (var i in content) {
|
|
var jcount = 0;
|
|
for (var j in content[i]) {
|
|
jcount++;
|
|
var kcount = 0;
|
|
for (var k in content[i][j]) {
|
|
kcount++;
|
|
if (i != ii || j != jj) {
|
|
if (xx != '') { x += xx; xx = '<br>'; }
|
|
ii = i; jj = j;
|
|
if (i != '') { xx += EscapeHtml(i + ' / ' + j); } else { xx += "Raíz"; }
|
|
}
|
|
//var handle = "\"" + i + "\",\"" + j + "\",\"" + k + "\"";
|
|
var handle = '\"' + i + ((i != '') ? '/' : '') + j + ((j != '') ? '/' : '') + k + '\"';
|
|
xx += '<div class=itemBar onclick=showStorageDetails("' + i + '","' + j + '","' + k + '",' + handle + ')><div style=float:right>';
|
|
// ###BEGIN###{Mode-Firmware}
|
|
xx += AddButton2("Abierto", 'OpenFromStorage(' + handle + ',event)');
|
|
// ###END###{Mode-Firmware}
|
|
// ###BEGIN###{Mode-LMS}
|
|
xx += ' ' + AddButton2("Abierto", 'OpenFromStorage(' + handle + ',event)');
|
|
// ###END###{Mode-LMS}
|
|
// ###BEGIN###{FileSaver}
|
|
xx += ' ' + AddButton2("Descargar", 'DownloadFromStorage(' + handle + ',\"' + k + '\",event)');
|
|
// ###END###{FileSaver}
|
|
xx += '</div><div style=padding-top:3px><b>' + EscapeHtml(k) + '</b>, <i>' + content[i][j][k]['size'] + " bytes" + '</i></div></div>';
|
|
// ###BEGIN###{Mode-Firmware}
|
|
if (content[i][j][k]['link'] && i != '') { links += '<p id=go' + linkid + ' class=nav1 onclick=goiFrame(event,' + linkid + ',"/amt-storage/' + i + '/' + j + '/' + k + '") title="' + i + ' / ' + j + '"><a>' + content[i][j][k]['link'] + '</a></p>'; linkid++; }
|
|
// ###END###{Mode-Firmware}
|
|
count++;
|
|
if (xxStorageVendors.indexOf(i) == -1) xxStorageVendors.push(i);
|
|
if (xxStorageApplications.indexOf(j) == -1) xxStorageApplications.push(j);
|
|
}
|
|
if (kcount == 0) { // Clear empty application & vendor
|
|
wsstack.comm.PerformAjax('', function () { }, null, 0, '/amt-storage/' + i + '/' + j, 'DELETE');
|
|
wsstack.comm.PerformAjax('', function () { }, null, 0, '/amt-storage/' + i, 'DELETE');
|
|
}
|
|
}
|
|
if (jcount == 0) { wsstack.comm.PerformAjax('', function () { }, null, 0, '/amt-storage/' + i, 'DELETE'); } // Clear empty vendor
|
|
}
|
|
if (xx != '') x += xx;
|
|
if (count == 0) { x += '<div style=padding-left:15px><br><i>' + "No se encontraron archivos." + '</i></div><br>'; }
|
|
var uploadSupport = false;
|
|
try { var reader = new FileReader(); uploadSupport = ((reader != null) && (reader.readAsBinaryString != null)); } catch (ex) { console.log(ex); }
|
|
x += '<br><td class=r1>' + TableEnd(AddRefreshButton('PullStorage()') + (uploadSupport ? AddButton("Subir...", 'UploadToStorage()') : '')
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
//+ AddButton("Upload Application...", 'UploadAppToStorage()')
|
|
// ###END###{Mode-NodeWebkit}
|
|
);
|
|
// ###BEGIN###{Mode-Firmware}
|
|
//QH('storagelinks', links);
|
|
// ###END###{Mode-Firmware}
|
|
QH('id_TableSystemStorage', x);
|
|
} else {
|
|
QH('id_TableSystemStorage', "No se pueden cargar los datos de almacenamiento ..." + '<br/>' + AddButton("Actualizar", 'PullStorage()'));
|
|
}
|
|
}
|
|
|
|
function showStorageDetails(i, j, k, h) {
|
|
if (xxdialogMode) return;
|
|
var x = '', item = xxStorage['content'][i][j][k];
|
|
if (i != '') x += addHtmlValue("Vendedor", i);
|
|
if (j != '') x += addHtmlValue("Solicitud", j);
|
|
x += addHtmlValue("Nombre", k);
|
|
x += addHtmlValue("Talla", item['size'] + ' bytes');
|
|
if (item['link']) { x += addHtmlValue("Enlace", item['link']); }
|
|
setDialogMode(11, "Artículo de almacenamiento", 5, showStorageDetailsEx, x, h);
|
|
}
|
|
|
|
function showStorageDetailsEx(buttons, handle) {
|
|
if (buttons == 2) { wsstack.comm.PerformAjax('', storageDeleteResponse, null, 0, '/amt-storage/' + handle, 'DELETE'); }
|
|
}
|
|
|
|
function storageDeleteResponse(data, status) {
|
|
if (status != 200) {
|
|
messagebox("Almacenamiento", format("No se puede eliminar el archivo (ERR {0}), verifique que la computadora esté encendida.", status));
|
|
} else {
|
|
PullStorage();
|
|
}
|
|
}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
function DownloadFromStorage(handle, filename, e) {
|
|
if (xxdialogMode) return;
|
|
haltEvent(e);
|
|
wsstack.comm.PerformAjax('', DownloadFromStorageEx, filename, 0, '/amt-storage/' + handle, 'GET');
|
|
}
|
|
|
|
function DownloadFromStorageEx(data, status, tag) {
|
|
if ((status != 200) || (data == null)) { console.log(status, 'Data = null'); return; }
|
|
saveAs(data2blob(data), tag);
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
function OpenFromStorage(handle, e) {
|
|
if (xxdialogMode) return;
|
|
haltEvent(e);
|
|
// ###BEGIN###{Mode-Firmware}
|
|
var newWindow = window.open('/amt-storage/' + handle, '_blank', 'noopener,noreferrer');
|
|
// ###END###{Mode-Firmware}
|
|
// ###BEGIN###{!Mode-Firmware}
|
|
var newWindow = window.open('http://' + wsstack.comm.host + ':' + wsstack.comm.port + '/amt-storage/' + handle, '_blank', 'noopener,noreferrer');
|
|
// ###END###{!Mode-Firmware}
|
|
newWindow.opener = null;
|
|
newWindow.focus();
|
|
}
|
|
|
|
function PushToStorage(vendorAppnameFilename, data, append) {
|
|
var tag = null;
|
|
if (data.length > 7000) { tag = [vendorAppnameFilename, data.substring(7000)]; data = data.substring(0, 7000); }
|
|
wsstack.comm.PerformAjax(data, PushToStorageResponse, tag, 0, '/amt-storage/' + vendorAppnameFilename + (append == true ? '?append=' : ''), 'PUT');
|
|
}
|
|
|
|
function PushToStorageResponse(data, status, tag) {
|
|
if (status != 200) { messagebox("Almacenamiento", format("No se puede enviar el archivo (ERR {0}), verifique que la computadora esté encendida.", status)); } else {
|
|
if (tag != null) { PushToStorage(tag[0], tag[1], true); } else { PullStorage(); }
|
|
}
|
|
}
|
|
|
|
function UploadToStorage(file, filename) {
|
|
if (xxdialogMode) return;
|
|
if (!filename) { filename = ''; }
|
|
var x = '';
|
|
x += '<br>' + "Seleccione un archivo pequeño para cargar al almacenamiento e ingrese un proveedor, una aplicación y un nombre de archivo." + '<br>';
|
|
if (!file) {
|
|
x += '<br><div style=height:20px><input type=file id=mstoragefile style=float:right;width:240px onchange=SetStorageName()><div>Upload file</div></div>';
|
|
} else {
|
|
x += '<br><div style=height:20px><input id=mstoragefile style=float:right;width:240px readonly disabled=disabled value="' + filename + '" ><div>' + "Subir archivo" + '</div></div>';
|
|
}
|
|
x += '<br><div style=height:16px><input id=mstoragevendor placeholder="' + "Vendedor" + '" list=mstoragevendorlist maxlength=11 style=float:right;width:240px><div>' + "Nombre del vendedor" + '</div></div>';
|
|
x += '<br><div style=height:16px><input id=mstorageapplication placeholder="' + "App" + '" list=mstorageapplicationlist maxlength=11 style=float:right;width:240px><div>' + "Nombre de la aplicación" + '</div></div>';
|
|
x += '<br><div style=height:16px><input id=mstoragefilename placeholder="' + "Nombre del archivo" + '" maxlength=11 style=float:right;width:240px><div>' + "Nombre del archivo" + '</div></div>';
|
|
x += '<br><div style=height:16px><input id=mstoragetype placeholder=application/octet-stream list=mstoragetypelist style=float:right;width:240px><div>' + "Tipo de Mimica" + '</div></div>';
|
|
x += '<br><div style=height:16px><input id=mstoragelink style=float:right;width:240px><div title=\"' + "Si está configurado, crea un enlace a este contenido desde la página web principal" + '\">' + "Enlace" + '</div></div><br>';
|
|
x += '<datalist id=mstoragevendorlist>';
|
|
for (var i in xxStorageVendors) { x += '<option value="' + xxStorageVendors[i] + '">'; }
|
|
x += '</datalist>';
|
|
x += '<datalist id=mstorageapplicationlist>';
|
|
for (var i in xxStorageApplications) { x += '<option value="' + xxStorageApplications[i] + '">'; }
|
|
x += '</datalist><datalist id=mstoragetypelist><option value="application/octet-stream"><option value="image/jpeg"><option value="text/html"><option value="text/plain"></datalist>';
|
|
setDialogMode(11, "Carga de almacenamiento", 3, UploadToStorageEx, x, file);
|
|
if (file) { SetStorageName(filename); }
|
|
}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
/*
|
|
var UploadAppToStorageFileList;
|
|
function UploadAppToStorage() {
|
|
if (xxdialogMode) return;
|
|
require('fs').readdir('.', function read(err, data) {
|
|
var filelist = [], filecount = 0;
|
|
if (err == null) { for (var i in data) { if ((data[i].endsWith('.gz')) || (data[i].endsWith('.br'))) { filelist.push(data[i]); filecount++; } } }
|
|
if (filecount > 0) {
|
|
var x = '';
|
|
x += "Select the web application to upload, this will replace the Intel® AMT default web pages." + '<br><br><div style=height:26px><select id=mwebappsel style=float:right;width:240px>';
|
|
for (var i in filelist) { x += '<option value=' + i + '>' + filelist[i].substring(0, filelist[i].length - 3) + '</option>'; }
|
|
x += '</select><div>' + "Web Application" + '</div></div>';
|
|
setDialogMode(11, "Storage Application Upload", 3, UploadAppToStorageEx, x, filelist);
|
|
}
|
|
});
|
|
}
|
|
|
|
function UploadAppToStorageEx(b, filelist) {
|
|
var file = filelist[Q('mwebappsel').value];
|
|
require('fs').readFile(file, 'binary', function read(err, data) {
|
|
if (err == null) { PushToStorage('index.htm', '<metadata><headers><h>Content-Encoding: ' + (file.endsWith('.br')?'br':'gzip') + '</h><h>Content-Type: text/html</h></headers></metadata>' + data); }
|
|
});
|
|
}
|
|
*/
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
function UploadToStorageEx(button, tag) {
|
|
if (!tag) {
|
|
var x = Q('mstoragefile');
|
|
if (x.files.length != 1) return;
|
|
var reader = new FileReader();
|
|
reader.onload = UploadToStorageEx2;
|
|
reader.filename = x.files[0].name;
|
|
reader.readAsBinaryString(x.files[0]);
|
|
} else {
|
|
var reader = new FileReader();
|
|
reader.onload = UploadToStorageEx2;
|
|
reader.filename = Q('mstoragefile').value;
|
|
reader.readAsBinaryString(tag);
|
|
}
|
|
}
|
|
|
|
function SetStorageName(filename) {
|
|
if (!filename) {
|
|
var x = Q('mstoragefile');
|
|
if (x.files.length == 1) { filename = x.files[0].name; } else { filename = ''; }
|
|
}
|
|
filename = filename.split(' ').join('');
|
|
var filenameSplit = filename.split('-');
|
|
if (filenameSplit.length == 3 && filenameSplit[0].length < 12 && filenameSplit[1].length < 12) {
|
|
Q('mstoragevendor').value = filenameSplit[0];
|
|
Q('mstorageapplication').value = filenameSplit[1];
|
|
filename = filenameSplit[2];
|
|
}
|
|
filename = filename.split('-').join('');
|
|
if (filename.endsWith('.gz')) filename = filename.substring(0, filename.length - 3);
|
|
if (filename.endsWith('.htm') || filename.endsWith('.html')) Q('mstoragetype').value = 'text/html';
|
|
else if (filename.endsWith('.txt')) Q('mstoragetype').value = 'text/plain';
|
|
if (filename.length > 11) filename = filename.substring(0, 11);
|
|
Q('mstoragefilename').value = filename;
|
|
}
|
|
|
|
function UploadToStorageEx2(file) {
|
|
var vaf, vendor = Q('mstoragevendor').value;
|
|
var app = Q('mstorageapplication').value;
|
|
var filename = Q('mstoragefilename').value;
|
|
if (filename == '') filename = 'Filename';
|
|
var mimetype = Q('mstoragetype').value;
|
|
if (mimetype == '') mimetype = 'application/octet-stream';
|
|
var link = Q('mstoragelink').value;
|
|
if (vendor == '' && app == '' && (filename.toLowerCase() == 'logon.htm' || filename.toLowerCase() == 'index.htm')) {
|
|
vaf = filename.toLowerCase();
|
|
} else {
|
|
if (vendor == '') vendor = 'Vendor';
|
|
if (app == '') app = 'App';
|
|
vaf = vendor + '/' + app + '/' + filename;
|
|
}
|
|
|
|
var data = '<metadata><headers>';
|
|
var filename = file.target.filename;
|
|
if (!filename) { filename = Q('mstoragefile').files[0].name; }
|
|
if (filename.endsWith('.gz')) { data += '<h>Content-Encoding: gzip</h>'; }
|
|
data += '<h>Content-Type: ' + mimetype + '</h></headers>'; // <h>X-UA-Compatible: IE=Edge</h>
|
|
if (link != '') data += '<link>' + link + '</link>';
|
|
data += '</metadata>' + file.target.result;
|
|
|
|
PushToStorage(vaf, data);
|
|
}
|
|
|
|
// ###END###{Storage}
|
|
|
|
// ###BEGIN###{Alarms}
|
|
|
|
//
|
|
// Alarm Panel
|
|
//
|
|
|
|
function _fmtdatetime(str) {
|
|
return str.replace('T',' ').replace('Z','');
|
|
}
|
|
|
|
function _fmtinterval(str) {
|
|
var cl = str.replace('T', '').substring(str.indexOf('P') + 1);
|
|
cl = ' ' + cl.replace('D', " dias").replace('H', " horas").replace('M'," minutos");
|
|
cl = cl.replace(" 1 día", " 1 día").replace(" 1 hora", " 1 hora").replace(" 1 minuto "," 1 minuto ");
|
|
return cl.substring(0, cl.length - 1);
|
|
}
|
|
|
|
function _fmttimepad(str) {
|
|
str = '' + str;
|
|
while (str.length < 2) { str = '0' + str; }
|
|
return str;
|
|
}
|
|
|
|
var xxAlarms = null;
|
|
|
|
function PullAlarms() {
|
|
var x = TableStart2() + '<tr><td class=r1 style=padding-left:15px><br>' + "Gestionar alarmas de despertador." + '<br><br>';
|
|
amtstack.Enum('IPS_AlarmClockOccurrence', function(stack, name, response, status) {
|
|
if (status == 200) {
|
|
QV('go23', true);
|
|
if (response.length > 0) {
|
|
xxAlarms = response;
|
|
for (var i = 0; i < response.length; i++) {
|
|
var waketime = new Date(response[i]['StartTime']['Datetime']);
|
|
var details = '<b>' + response[i]['ElementName'] + '</b>, ' + "despertar en" + ' ' + waketime.toLocaleString().replace(', ', " a");
|
|
if (response[i]['Interval'] != undefined) { details += " y cada" + _fmtinterval(response[i]['Interval']['Interval']); }
|
|
if (response[i]['DeleteOnCompletion'] == true) { details += ", eliminar cuando haya terminado"; }
|
|
x += '<div class=itemBar onclick=showAlertDetails(' + i + ')><div style=float:right>';
|
|
if (xxAccountAdminName) x += ' ' + AddButton2("Editar...", 'showAddAlarm(" + i + ")');
|
|
x += '</div><div style=padding-top:3px;width:auto;float:left;overflow-x:hidden>' + details + '</div></div>';
|
|
}
|
|
} else {
|
|
xxAlarms = null;
|
|
x += '<div style=padding-left:15px><br><i>' + "No hay alarmas de despertador registradas." + '</i></div><br>';
|
|
}
|
|
var y = '<div> ' + AddRefreshButton('PullAlarms()');
|
|
if (xxAccountAdminName) { y += AddButton("Eliminar todas las alarmas", 'RemoveAllAlarms()') + AddButton("Añadir", 'showAddAlarm()'); }
|
|
x += '<br><td class=r1>' + TableEnd(y + '</div>');
|
|
QH('id_TableAlarm', x);
|
|
}
|
|
}, null, true);
|
|
}
|
|
|
|
function prepareAlarmOccurenceTemplate(id, nm, start, interval, del) {
|
|
return '<d:AlarmTemplate xmlns:d=\"http://intel.com/wbem/wscim/1/amt-schema/1/AMT_AlarmClockService\" xmlns:s=\"http://intel.com/wbem/wscim/1/ips-schema/1/IPS_AlarmClockOccurrence\"><s:InstanceID>' + id + '</s:InstanceID><s:StartTime><p:Datetime xmlns:p=\"http://schemas.dmtf.org/wbem/wscim/1/common\">' + start + '</p:Datetime></s:StartTime><s:Interval><p:Interval xmlns:p=\"http://schemas.dmtf.org/wbem/wscim/1/common\">' + interval + '</p:Interval></s:Interval><s:DeleteOnCompletion>' + del + '</s:DeleteOnCompletion></d:AlarmTemplate>';
|
|
}
|
|
|
|
function RemoveAllAlarms(){
|
|
setDialogMode(1, "Eliminar todas las alarmas de activación", 3, RemoveAllAlarmsEx, "¿Confirmar la eliminación de todas las alarmas de activación?");
|
|
}
|
|
|
|
function RemoveAllAlarmsEx() {
|
|
var deleteCount = xxAlarms.length;
|
|
for (var a in xxAlarms) { amtstack.Delete('IPS_AlarmClockOccurrence', xxAlarms[a], function(stack, name, response, status) { if (--deleteCount == 0) { PullAlarms(); }}); }
|
|
}
|
|
|
|
function showAddAlarm(alrm){
|
|
if (xxdialogMode) return;
|
|
QE('d25alarm_name', !alrm);
|
|
if (alrm != undefined) {
|
|
var alarm = xxAlarms[alrm], waketime = new Date(alarm['StartTime']['Datetime']);
|
|
Q('d25alarm_name').value = alarm['ElementName'];
|
|
Q('d25alarm_sdate').value = waketime.getFullYear() + '-' + _fmttimepad(waketime.getMonth() + 1) + '-' + _fmttimepad(waketime.getDate());
|
|
Q('d25alarm_stime').value = waketime.getHours() + ':' + _fmttimepad(waketime.getMinutes()) + ':' + _fmttimepad(waketime.getSeconds());
|
|
if (alarm['Interval']) {
|
|
var j = alarm['Interval']['Interval'].replace('P','').replace('T','').replace('D','D,').replace('H','H,').replace('M','M,').split(','), k = [0, 0, 0];
|
|
for (var i in j) {
|
|
var jl = j[i].length - 1;
|
|
if (j[i][jl] == 'D') { k[0] = parseInt(j[i].substring(0, jl)); }
|
|
if (j[i][jl] == 'H') { k[1] = parseInt(j[i].substring(0, jl)); }
|
|
if (j[i][jl] == 'M') { k[2] = parseInt(j[i].substring(0, jl)); }
|
|
}
|
|
Q('d25alarm_interval').value = k.join('-');
|
|
} else {
|
|
Q('d25alarm_interval').value = '';
|
|
}
|
|
Q('d25alarm_doc').value = (alarm['DeleteOnCompletion'] == true)?1:0;
|
|
} else {
|
|
var currentTime = new Date();
|
|
currentTime.setDate(new Date().getDate() + 1);
|
|
Q('d25alarm_name').value = '';
|
|
Q('d25alarm_sdate').value = currentTime.getFullYear() + '-' + _fmttimepad(currentTime.getMonth() + 1) + '-' + _fmttimepad(currentTime.getDate());
|
|
Q('d25alarm_stime').value = currentTime.getHours() + ':' + _fmttimepad(currentTime.getMinutes()) + ':00';
|
|
Q('d25alarm_interval').value = '';
|
|
Q('d25alarm_doc').value = 0;
|
|
}
|
|
setDialogMode(25, "Agregar nueva alarma", (alrm != undefined)?7:3, showAddAlarmOk, '', alrm);
|
|
alertDialogUpdate();
|
|
}
|
|
|
|
function alertDialogUpdate() {
|
|
var il = Q('d25alarm_interval').value.split('-').length;
|
|
var ok = (Q('d25alarm_name').value.length > 0) && (Q('d25alarm_sdate').value.split('-').length == 3) && (Q('d25alarm_stime').value.split(':').length == 3) && ((il == 1) || (il == 3));
|
|
QE('idx_dlgOkButton', ok);
|
|
}
|
|
|
|
function showAddAlarmOk(button, alrm) {
|
|
if (button == 2) { showAlertDetailsDelete(button, alrm); return; }
|
|
var alarm_name = Q('d25alarm_name').value;
|
|
var x1 = Q('d25alarm_sdate').value.split('-');
|
|
var x2 = Q('d25alarm_stime').value.split(':');
|
|
var t = new Date(x1[0], x1[1] - 1, x1[2], x2[0], x2[1], x2[2], 0); // Month is 0 = JAN, 11 = DEC
|
|
var alarm_starttime = _fmttimepad(t.getUTCFullYear()) + '-' + _fmttimepad(t.getUTCMonth() + 1) + '-' + _fmttimepad(t.getUTCDate()) + 'T' + _fmttimepad(t.getUTCHours()) + ':' + _fmttimepad(t.getUTCMinutes()) + ':' + _fmttimepad(t.getUTCSeconds()) + 'Z';
|
|
var x = Q('d25alarm_interval').value.split('-');
|
|
if (x.length != 3) { x = [0, 0, 0]; }
|
|
var alarm_interval = 'P' + x[0] + 'DT' + x[1] + 'H' + x[2] + 'M';
|
|
var alarm_doc = (Q('d25alarm_doc').value == 1);
|
|
var tpl = prepareAlarmOccurenceTemplate(alarm_name, alarm_name, alarm_starttime, alarm_interval, alarm_doc);
|
|
if (alrm == undefined) {
|
|
wsstack.ExecMethodXml(amtstack.CompleteName('AMT_AlarmClockService'), 'AddAlarm', tpl,
|
|
function (ws, resuri, response, status) {
|
|
if (status != 200) { messagebox("Agregar alarma", format("No se pudo agregar la alarma. Estado: {0}. <br/> Verifique que la alarma sea para un tiempo futuro.", status)); return; }
|
|
if (response.Body['ReturnValue'] != 0) { messagebox("Agregar alarma", format("No se pudo agregar la alarma {0}. <br/> Verifique que la alarma sea para un tiempo futuro.", response.Body['ReturnValueStr'])); return; }
|
|
PullAlarms();
|
|
}
|
|
);
|
|
} else {
|
|
var alarmx = Clone(xxAlarms[alrm]);
|
|
alarmx['StartTime'] = '<p:Datetime xmlns:p=\"http://schemas.dmtf.org/wbem/wscim/1/common\">' + alarm_starttime + '</p:Datetime>';
|
|
alarmx['Interval'] = '<p:Interval xmlns:p=\"http://schemas.dmtf.org/wbem/wscim/1/common\">' + alarm_interval + '</p:Interval>';
|
|
alarmx['DeleteOnCompletion'] = alarm_doc;
|
|
amtstack.Put('IPS_AlarmClockOccurrence', alarmx, function (ws, resuri, response, status) {
|
|
if (status != 200) { messagebox("Editar alarma", format('Failed to change alarm. Status: {0}.<br/>Verify the alarm for at a future time.', status)); return; }
|
|
PullAlarms();
|
|
}, null, null, { 'InstanceID' : alarmx['InstanceID']});
|
|
}
|
|
}
|
|
|
|
function showAlertDetails(i) {
|
|
if (xxdialogMode) return;
|
|
var alarm = xxAlarms[i], waketime = new Date(alarm['StartTime']['Datetime']);
|
|
var x = '<div style=text-align:left>' + addHtmlValue("Nombre", alarm['ElementName']) + addHtmlValue("Hora de despertarse", waketime.toLocaleString().replace(', ', ' at '));
|
|
if (alarm['Interval'] != undefined) { x += addHtmlValue("Interno", _fmtinterval(alarm['Interval']['Interval'])); }
|
|
x += addHtmlValue("Despues de despertar", (alarm['DeleteOnCompletion'] == true)?"Eliminar alarma":"Mantener alarma") + '</div>';
|
|
messagebox(format("Alarma {0}", alarm['ElementName']), x);
|
|
setDialogMode(11, "Alarma" + alarm['ElementName'], 5, showAlertDetailsDelete, x, i);
|
|
}
|
|
|
|
function showAlertDetailsDelete(button, tag) {
|
|
if (button == 2) { amtstack.Delete('IPS_AlarmClockOccurrence', xxAlarms[tag], function(stack, name, response, status) { PullAlarms(); }); }
|
|
}
|
|
|
|
// ###END###{Alarms}
|
|
|
|
// ###BEGIN###{Scripting}
|
|
|
|
//
|
|
// Scripting
|
|
//
|
|
|
|
// Called by the "Run Script..." button. Display a dialog box to ask for the script file.
|
|
function script_runScriptDlg() {
|
|
if (xxdialogMode || scriptstate) return;
|
|
setDialogMode(11, "Ejecutar guión", 3, script_runScriptDlgOk, '<br><input id=scriptopen type=file style=width:100% accept=.mescript>');
|
|
}
|
|
|
|
// Once the script file is selected, decode the script here.
|
|
function script_runScriptDlgOk(r) {
|
|
if (r != 1) return;
|
|
var x = Q('scriptopen');
|
|
if (x.files.length != 1) return;
|
|
var reader = new FileReader();
|
|
reader.onload = script_onScriptRead;
|
|
reader.readAsBinaryString(x.files[0]);
|
|
}
|
|
|
|
// Called once the script is decoded, get the script setup and start running it.
|
|
function script_onScriptRead(file) {
|
|
var x;
|
|
try { x = JSON.parse(file.target.result); } catch (e) {}
|
|
// ###BEGIN###{Scripting-Editor}
|
|
if (currentView == 20) {
|
|
// Load script into editor
|
|
if (x['scriptText']) Q('scriptarea').value = x['scriptText'];
|
|
if (x['mescript']) Q('compiledarea').value = rstr2hex(atob(x['mescript']));
|
|
if (x['blocks']) { script_setBuildBlocks(x['blocks']); scriptViewButton(1); } else { script_setBuildBlocks(); scriptViewButton(0); }
|
|
if (x['scriptBlocks']) { script_BlockScript = x['scriptBlocks']; } else { if (!script_BuildingBlocks) { script_BlockScript = []; } }
|
|
|
|
// Update the scriptBlocks to the latest blocks. This is does because we may update an existing script to new blocks.
|
|
for (var i in script_BlockScript) {
|
|
var block = script_BlockScript[i];
|
|
var xblock = script_BuildingBlocks[block['xname']];
|
|
if (xblock) {
|
|
var b = Clone(xblock); // Clone a new block, then set all the variables.
|
|
b['id'] = block['id'];
|
|
b['xname'] = block['xname'];
|
|
for (var j in b.vars) { if (block.vars[j]) { b.vars[j]['value'] = block.vars[j]['value']; } }
|
|
script_BlockScript[i] = b;
|
|
}
|
|
}
|
|
|
|
// Reset the script state
|
|
fupdatescript();
|
|
delete scriptstate;
|
|
resetScriptButton();
|
|
return;
|
|
}
|
|
// ###END###{Scripting-Editor}
|
|
var startvars = { '_interactive':1 };
|
|
// ###BEGIN###{Certificates}
|
|
startvars['_certificates'] = 1;
|
|
// ###END###{Certificates}
|
|
// ###BEGIN###{!Mode-Firmware}
|
|
startvars['_mode'] = 'Firmware';
|
|
// ###END###{!Mode-Firmware}
|
|
// ###BEGIN###{!Mode-MeshCentral2}
|
|
startvars['_mode'] = 'MeshCentral2';
|
|
// ###END###{!Mode-MeshCentral2}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
startvars['_mode'] = 'NodeWebkit';
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-LMS}
|
|
startvars['_mode'] = 'LMS';
|
|
// ###END###{Mode-LMS}
|
|
// ###BEGIN###{Mode-WebSite}
|
|
startvars['_mode'] = 'WebSite';
|
|
// ###END###{Mode-WebSite}
|
|
if (x && x['mescript']) scriptstate = script_setup(atob(x['mescript']), startvars);
|
|
if (scriptstate) {
|
|
scriptstate.wsstack = wsstack;
|
|
scriptstate.amtstack = amtstack;
|
|
scriptstate.onStep = script_updateScriptState;
|
|
scriptstate.onConsole = script_console;
|
|
scriptstate.start(100);
|
|
} else {
|
|
messagebox("Ejecutar guión", "Archivo de script no válido");
|
|
}
|
|
}
|
|
|
|
// Called when the script changes state, displays the green status bar at the top of the web page.
|
|
function script_updateScriptState() {
|
|
if (scriptstate) {
|
|
QV('id_scriptstatus', scriptstate.state > 0); center();
|
|
if (scriptstate.state == 0) {
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (urlvars['autoexit']) { // Exit if script finished running
|
|
require('nw.gui').Window.get().close();
|
|
//require('nw.gui').App.quit();
|
|
return;
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
scriptstate = undefined;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Called by a running script to update the console. The last message in the console is displayed in the top green bar.
|
|
function script_console(msg) {
|
|
if (msg.indexOf('INFO: ') == 0) { msg = msg.substring(6); }
|
|
if (msg.indexOf('SUCCESS: ') == 0) { msg = msg.substring(9); }
|
|
if (msg.indexOf('ERROR: ') == 0) { msg = msg.substring(7); }
|
|
QH('id_scriptstatusstr', ', ' + msg);
|
|
}
|
|
|
|
// Called by the "Stop" button on the script status bar. Causes the script to stop.
|
|
function script_Stop() {
|
|
if (scriptstate) {
|
|
if (scriptstate.dialog == true) { setDialogMode(0); }
|
|
scriptstate.stop();
|
|
scriptstate.state = 0;
|
|
script_updateScriptState();
|
|
}
|
|
}
|
|
|
|
// ###END###{Scripting}
|
|
|
|
// ###BEGIN###{Scripting-Editor}
|
|
|
|
var script_BuildingBlocks; // List of block that can be used to build a script. This is shown on the list side.
|
|
var script_StartingBuildingBlocks; // List of block that can be used to build a script when you get started.
|
|
var script_BlockScript = []; // List of blocks that are part of the current script.
|
|
var script_BlockScriptSelectedId = null; // The identifier of the currently selected block.
|
|
var script_BuilderView = 0; // 0 = Editor View, 1 = Builder View
|
|
var editscriptstate; // This is the instance of the script runner used by the editor. This is different from the runner used by the web page.
|
|
|
|
// ###BEGIN###{!Mode-Firmware}
|
|
function scriptLoadStartingBlocks() {
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
var request = new XMLHttpRequest();
|
|
request.onload = function() {
|
|
if (request.status >= 200 && request.status < 400) {
|
|
// Success
|
|
var x;
|
|
try { x = JSON.parse(request.responseText); } catch (e) {}
|
|
if ((x) && (x['blocks'])) { script_StartingBuildingBlocks = x['blocks']; script_setBuildBlocks(script_StartingBuildingBlocks); }
|
|
}
|
|
};
|
|
request.onerror = function() { console.log('Failed to get script blocks'); };
|
|
request.open('GET', 'scriptblocks.txt', true);
|
|
request.send();
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var content;
|
|
require('fs').readFile('scriptblocks.txt', 'utf8', function read(err, data) {
|
|
if (err == null) {
|
|
var x;
|
|
try { x = JSON.parse(data); } catch (e) {}
|
|
if (x['blocks']) { script_StartingBuildingBlocks = x['blocks']; script_setBuildBlocks(script_StartingBuildingBlocks); }
|
|
}
|
|
});
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
// ###END###{!Mode-Firmware}
|
|
|
|
// Called by the "View Editor" or "View Builder" button to toggle between the view modes.
|
|
// If there is no construction blocks, display the script editor only.
|
|
function scriptViewButton(x) {
|
|
script_BuilderView = x;
|
|
QV('scripteditor', x == 0);
|
|
QV('scriptbuilder', x == 1);
|
|
QV('viewEditorButton', script_BuildingBlocks && (x == 1));
|
|
QV('viewBuilderButton', script_BuildingBlocks && (x == 0));
|
|
}
|
|
|
|
// Display the list of construction script block on the left side.
|
|
function script_setBuildBlocks(blocks) {
|
|
script_BuildingBlocks = blocks;
|
|
var x = '';
|
|
if (blocks) {
|
|
for (var i in blocks) {
|
|
if (i.charCodeAt(0) != 95) {
|
|
x += '<div id=sblock_' + i + ' style=cursor:pointer;background-color:#ccc;width:auto;padding:5px;margin:2px ondblclick=script_faddblock("' + i + '") draggable=true ondragstart=script_fondragstart(event,this) ondragend=script_fondragend(event,this) title="' + blocks[i]['desc'] + '"';
|
|
// ###BEGIN###{ContextMenus}
|
|
var cmenus = [];
|
|
cmenus.push("Añadir" + '#script_faddblock("' + i + '")');
|
|
cmenus.push("Editar..." + '#script_feditblock("' + i + '")');
|
|
x += ' cm=\"' + cmenus.join('|') + '\"';
|
|
// ###END###{ContextMenus}
|
|
x += '>' + blocks[i]['name'] + '</div>';
|
|
}
|
|
}
|
|
}
|
|
QH('blocks', x);
|
|
script_fonfilterchanged();
|
|
scriptViewButton(script_BuildingBlocks?1:0);
|
|
}
|
|
|
|
// Add a new block to the end of the block script. This is called when you right click on a block and hit "Add" in the context menu.
|
|
function script_faddblock(h) {
|
|
var b = Clone(script_BuildingBlocks[h]); // To add a new block to the script, clone the block, assign it a random id and set the xname to the name of the block.
|
|
b['id'] = Math.random();
|
|
b['xname'] = h;
|
|
script_BlockScript.push(b); // Now that a block is created, add it at the end of the script and set it as the selected block.
|
|
script_BlockScriptSelectedId = script_BlockScript.length - 1;
|
|
fupdatescript(); // Re-display the list of script blocks. The selected block will also be highlighted.
|
|
}
|
|
|
|
// Edit a script block
|
|
function script_feditblock(h) {
|
|
if (xxdialogMode) return;
|
|
setDialogMode(11, format("Editar {0}", script_BuildingBlocks[h]['name']), 3, script_feditblockEx, 'Edit this block? This operation will reset the block editor and load the block code into the code editor.', h);
|
|
}
|
|
|
|
// Called when the script block edit dialog is closed.
|
|
function script_feditblockEx(button, h) {
|
|
script_newScriptDlgOk();
|
|
scriptViewButton(0);
|
|
var x = '', b = script_BuildingBlocks[h];
|
|
x += '##!BLOCK!##\r\n#id=' + h + '\r\n#name=' + b['name'] + '\r\n#desc=' + b['desc'] + '\r\n##!BLOCK!##\r\n';
|
|
for (var i in b['vars']) {
|
|
var v = b['vars'][i];
|
|
x += '##!VAR!##\r\n#id=' + i + '\r\n#name=' + v['name'] + '\r\n#desc=' + v['desc'] + '\r\n#type=' + v['type'] + '\r\n';
|
|
if (v['maxlength']) { x += '#maxlength=' + v['maxlength'] + '\r\n'; }
|
|
if (v['values']) { for (var j in v['values']) { x += '#values-' + j +'=' + v['values'][j] + '\r\n'; } }
|
|
x += '#value=' + v['value'] + '\r\n##SWAP %%%' + i + '%%% ' + v['value'] + '\r\n';
|
|
}
|
|
x += '##!VAR!##\r\n##SWAP %%%~%%% 0\r\n\r\n##!BLOCK!##\r\n' + b['code'] + '\r\n##!BLOCK!##\r\n';
|
|
Q('scriptarea').value = x;
|
|
}
|
|
|
|
function script_fConvertScriptToJsonBlock(script) {
|
|
var result = {}, scriptparts = script.split('##!BLOCK!##\n'), scriptlines = scriptparts[1].split('\n');
|
|
|
|
// Parse information part
|
|
for (var i in scriptlines) {
|
|
var s = scriptlines[i].split('=');
|
|
if (s.length == 2) { result[s[0].substring(1)] = s[1]; }
|
|
}
|
|
|
|
// Parse variables part
|
|
result['vars'] = {};
|
|
scriptvariables = scriptparts[2].split('##!VAR!##\n');
|
|
for (var i in scriptvariables) {
|
|
scriptlines = scriptvariables[i].split('\n');
|
|
var v = {}, values = {}, valueslen = 0;
|
|
for (var j in scriptlines) {
|
|
var s = scriptlines[j].split('=');
|
|
if ((s.length == 2) && (s[1])) {
|
|
if ((s[0]) && (s[0].length > 0)) {
|
|
if (s[0].substring(0, 8) == '#values-') {
|
|
values[s[0].substring(8)] = s[1];
|
|
valueslen++;
|
|
} else {
|
|
v[s[0].substring(1)] = s[1];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (v.id) {
|
|
if (valueslen > 0) { v['values'] = values; }
|
|
var id = v.id;
|
|
delete v.id;
|
|
result['vars'][id] = v;
|
|
}
|
|
}
|
|
|
|
// Parse code part
|
|
result['code'] = scriptparts[3];
|
|
|
|
// Package the result
|
|
var id = result.id;
|
|
delete result.id;
|
|
var r = {};
|
|
r[id] = result;
|
|
return JSON.stringify(r, null, ' ');
|
|
}
|
|
|
|
/*
|
|
// If the delete key is pressed, delete the block
|
|
function script_fonkeypress(e) {
|
|
if (xxdialogMode) return;
|
|
if (e.key == 'Delete' && script_BlockScriptSelectedId != null) {
|
|
//delete script_BlockScript[script_BlockScriptSelectedId];
|
|
script_BlockScript.splice(script_BlockScriptSelectedId, 1);
|
|
script_BlockScriptSelectedId = null;
|
|
fupdatescript();
|
|
}
|
|
}
|
|
*/
|
|
|
|
// Filer the list of blocks on the left side list.
|
|
function script_fonfilterchanged() {
|
|
var filter = Q('blockfilter').value.toLowerCase();
|
|
for (var i in script_BuildingBlocks) {
|
|
// Script blocks that start with "_" are hidden blocks and should never be shown.
|
|
if (i.charCodeAt(0) != 95) { QV('sblock_' + i, (script_BuildingBlocks[i]['name'].toLowerCase().indexOf(filter) >= 0 || script_BuildingBlocks[i]['desc'].toLowerCase().indexOf(filter) >= 0)); }
|
|
}
|
|
}
|
|
|
|
// Called when you click on a block. If you double click, on a block, do like pressing on the "Edit..." button.
|
|
var script_fonclickDblClickDetectIndex = null;
|
|
var script_fonclickDblClickDetectTime = null;
|
|
function script_fonclick(e, t) {
|
|
// ###BEGIN###{ContextMenus}
|
|
hideContextMenu(); // Any click on this area must close the context menu
|
|
// ###END###{ContextMenus}
|
|
if (xxdialogMode) return;
|
|
script_BlockScriptSelectedId = null;
|
|
if (t) { t = fgetParentWithId(t); if (t.id.startsWith('xblock_')) { script_BlockScriptSelectedId = t.id.substring(7); } } // Figure out what block was clicked on
|
|
fupdatescript(); // This will show the currently selected block in a different color.
|
|
haltEvent(e);
|
|
|
|
// Figure out if this is a double click. We need two clicks on the same object within 250ms.
|
|
if (script_fonclickDblClickDetectIndex == script_BlockScriptSelectedId && (new Date().getTime() - script_fonclickDblClickDetectTime) < 250) { return script_foneditclick(script_BlockScriptSelectedId); }
|
|
script_fonclickDblClickDetectIndex = script_BlockScriptSelectedId;
|
|
script_fonclickDblClickDetectTime = new Date().getTime();
|
|
}
|
|
|
|
// Script block drag & drop functions, allow the user to create and move script blocks.
|
|
function script_fondragstart(e, t) { if (xxdialogMode) return; t = fgetParentWithId(t); t.style.opacity = '0.4'; e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData('scriptbuilder/block', t.id); }
|
|
function script_fondragend(e, t) { if (xxdialogMode) return; t = fgetParentWithId(t); t.style.opacity = '1.0'; }
|
|
function script_fondragenter(e, t) { if (xxdialogMode) return; fgetParentWithId(t).style['border-top'] = 'solid 2px black'; }
|
|
function script_fondragleave(e, t) { if (xxdialogMode) return; e = e.originalEvent || e; var currentElement = document.elementFromPoint(e.pageX, e.pageY); if (!t.contains(currentElement)) { fgetParentWithId(t).style['border-top'] = 'none'; } }
|
|
|
|
// Called when you drop a block on the block script area. This code will add or move a block into it's new place.
|
|
function script_fondrop(e, t) {
|
|
if (xxdialogMode) return;
|
|
t = fgetParentWithId(t);
|
|
var b, x = e.dataTransfer.getData('scriptbuilder/block'), dp = parseInt(t.id.substring(7));
|
|
if (x == '') { documentFileSelectHandler(e); return; }
|
|
if (x.startsWith("sblock_")) {
|
|
// Create a new script block
|
|
b = Clone(script_BuildingBlocks[x.substring(7)]);
|
|
b['id'] = Math.random();
|
|
b['xname'] = x.substring(7);
|
|
} else {
|
|
// Pull an existing script block from the list
|
|
var i = parseInt(x.substring(7));
|
|
b = script_BlockScript[i];
|
|
script_BlockScript.splice(i, 1);
|
|
if (dp > i) dp--;
|
|
}
|
|
if (t.id == 'scriptblocks') {
|
|
// Put the block at the end of the list
|
|
if (b) script_BlockScript.push(b);
|
|
script_BlockScriptSelectedId = script_BlockScript.length - 1;
|
|
} else {
|
|
// Insert the block within the list, above the drop point
|
|
script_BlockScript.splice(dp, 0, b);
|
|
script_BlockScriptSelectedId = dp;
|
|
}
|
|
fupdatescript();
|
|
haltEvent(e);
|
|
}
|
|
|
|
// Called when you hit "Edit..." on a block, displays a dialog box with all block attributes.
|
|
function script_foneditclick(h) {
|
|
if (xxdialogMode) return;
|
|
var block = script_BlockScript[h];
|
|
script_BlockScriptSelectedId = h;
|
|
fupdatescript();
|
|
|
|
if (block != null) {
|
|
var b = block['vars'] ? 7 : 5;
|
|
var c = block['desc'] + '<br><br>';
|
|
if (block['vars']) {
|
|
// For each variable in a block, add the proper input control for this variable and set the control to the current value.
|
|
for (var i in block['vars']) {
|
|
var d = block['vars'][i]['value'];
|
|
var attributes = '';
|
|
// Block values can be on type 1:Text,2:Number,3:DropDownList,4:password,5:MultiSelect
|
|
if (block['vars'][i]['maxlength']) attributes += (' maxlength=' + block['vars'][i]['maxlength']);
|
|
if (block['vars'][i]['type'] == 2) { attributes += ' onkeypress=\'return numbersOnly(event)\'' }
|
|
if (block['vars'][i]['type'] == 1 || block['vars'][i]['type'] == 2) { d = '<input title="' + block['vars'][i]['desc'] + '" id=scriptXvalue_' + i + ' value="' + block['vars'][i]['value'] + '" ' + attributes + ' style=width:100%></input>'; }
|
|
if (block['vars'][i]['type'] == 3) {
|
|
d = '<select title=\'' + block['vars'][i]['desc'] + '\' id=scriptXvalue_' + i + ' style=width:100%;padding:0;margin:0>';
|
|
for (var j in block['vars'][i]['values']) { d += '<option value=' + j + (j == block['vars'][i]['value'] ? ' selected' : '') + '>' + block['vars'][i]['values'][j] + '</option>'; }
|
|
d += '</select>';
|
|
}
|
|
if (block['vars'][i]['type'] == 4) { d = '<input type=password autocomplete=off title="' + block['vars'][i]['desc'] + '" id=scriptXvalue_' + i + ' value="' + block['vars'][i]['value'] + '" ' + attributes + ' style=width:100%></input>'; }
|
|
if (block['vars'][i]['type'] == 5) { d = ''; }
|
|
if (block['vars'][i]['type'] == 6) { d = '<input type=file title="' + block['vars'][i]['desc'] + '" id=scriptXvalue_' + i + ' ' + attributes + ' style=width:100%></input>'; }
|
|
c += '<table style=width:100% title="' + block['vars'][i]['desc'] + '"><td style=width:120px>' + block['vars'][i]['name'] + '<td><b>' + d + '</b></table>';
|
|
if (block['vars'][i]['type'] == 5) {
|
|
var x = '';
|
|
c += '<ul id=scriptXvalue_' + i + ' style="list-style-type:none;height:100px;overflow:auto;width:100%;border:1px solid #000;background-color:white;overflow-x:hidden;margin:0;padding:0">';
|
|
for (var y in block['vars'][i]['values']) {
|
|
var xc = '';
|
|
if (block['vars'][i]['value'].indexOf(y) >= 0) xc = ' checked';
|
|
c += '<li><label><input type=checkbox id=scriptXvaluex_' + i + '-' + y + '' + xc + '>' + block['vars'][i]['values'][y] + '</label></li>';
|
|
}
|
|
c += '</ul>';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Parameters: Dialog Mode (0 = none), Dialog Title, Buttons (1 = OK, 2 = Cancel, 3 = OK & Cancel), Call back function(0 = Cancel, 1 = OK), Dialog Content (Mode 11 only)
|
|
setDialogMode(11, block.name, b, script_foneditclickEx, c, h);
|
|
}
|
|
|
|
// Called when the script block edit dialog is closed.
|
|
function script_foneditclickEx(button, tag) {
|
|
if (xxdialogMode) return;
|
|
if (button == 2) {
|
|
// Delete this block
|
|
script_BlockScript.splice(tag, 1);
|
|
if (script_BlockScriptSelectedId == tag) { script_BlockScriptSelectedId = null; }
|
|
} else {
|
|
// Change this block with new arguments
|
|
var block = script_BlockScript[tag];
|
|
if (block['vars']) {
|
|
for (var i in block['vars']) {
|
|
if (block['vars'][i]['type'] == 5) {
|
|
block['vars'][i]['value'] = [];
|
|
for (var y in block['vars'][i]['values']) { if (Q('scriptXvaluex_' + i + '-' + y).checked) block['vars'][i]['value'].push(y); }
|
|
} else if (block['vars'][i]['type'] == 6) {
|
|
var x = Q('scriptXvalue_' + i);
|
|
if (x.files.length == 1) {
|
|
var reader = new FileReader();
|
|
reader.onload = function(file) { block['vars'][i]['value'] = btoa(file.target.result); fupdatescript(); };
|
|
reader.readAsBinaryString(x.files[0]);
|
|
}
|
|
} else {
|
|
block['vars'][i]['value'] = Q('scriptXvalue_' + i).value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
fupdatescript();
|
|
}
|
|
|
|
// Starting with a child element, go up one parent at a time until we find an element with an ID.
|
|
function fgetParentWithId(x) { while (!x.id) { x = x.parentElement; } return x; }
|
|
|
|
// Displays the list of script blocks to the HTML page. Each block is displayed with it's name, attributes and an edit button.
|
|
function fupdatescript() {
|
|
var x = '';
|
|
for (var i in script_BlockScript) {
|
|
x += '<div id=xblock_' + i + ' style=cursor:pointer;min-height:24px;background-color:#' + ((script_BlockScriptSelectedId == i) ? 'aaa' : 'ccc') + ';width:auto;padding:5px;margin:2px draggable=true onclick=script_fonclick(event,this) ondragenter=script_fondragenter(event,this) ondragleave=script_fondragleave(event,this) ondragstart=script_fondragstart(event,this) ondragend=script_fondragend(event,this) ondrop=script_fondrop(event,this) title="' + script_BlockScript[i]['desc'] + '"';
|
|
// ###BEGIN###{ContextMenus}
|
|
var cmenus = [];
|
|
cmenus.push("Editar..." + '#script_foneditclick('+i+')');
|
|
cmenus.push("Eliminar" + '#script_foneditclickEx(2,'+i+')');
|
|
x += ' cm=\'' + cmenus.join('|') + '\'';
|
|
// ###END###{ContextMenus}
|
|
x += '><input style=float:right type=button value=Edit... onclick=script_foneditclick(' + i + ')><div style=font-size:16px><b>' + script_BlockScript[i].name + '</b>';
|
|
if (script_BlockScript[i]['vars']) {
|
|
var r = 0;
|
|
x += '<table class="scriptBlockVar us" cellpadding=0 cellspacing=0 style=width:100%;border-radius:5px;margin-top:8px>';
|
|
for (var j in script_BlockScript[i]['vars']) {
|
|
var v = script_BlockScript[i]['vars'][j]['value'];
|
|
if (script_BlockScript[i]['vars'][j]['type'] == 4 && script_BlockScript[i]['vars'][j]['value'].length > 0) v = '*****';
|
|
if (script_BlockScript[i]['vars'][j]['type'] == 3) v = script_BlockScript[i]['vars'][j]['values'][script_BlockScript[i]['vars'][j]['value']];
|
|
if (script_BlockScript[i]['vars'][j]['type'] == 6) {
|
|
if (script_BlockScript[i]['vars'][j]['value']) { v = "Archivo binario," + script_BlockScript[i]['vars'][j]['value'].length + " bytes"; } else { v = "No establecido"; }
|
|
}
|
|
x += '<tr title="' + script_BlockScript[i]['vars'][j]['desc'] + '"><td width=200px style="' + (r > 0 ? 'border-top:1px solid #a810a8' : '') + '"><p>' + script_BlockScript[i]['vars'][j]['name'] + '<td style="' + (r > 0 ? 'border-top:1px solid #a810a8' : '') + '">' + v;
|
|
r++;
|
|
}
|
|
x += '<tr><td style=height:3px></table>';
|
|
}
|
|
x += '</div></div>';
|
|
}
|
|
if (x == '') { x = '<div style=\"padding:15px;color:gray\">' + "Comience su secuencia de comandos arrastrando y soltando bloques desde el lado izquierdo en este cuadro de secuencias de comandos." + '<div>'; }
|
|
QH('scriptblocks', x + '<div style=height:80px></div>');
|
|
for (var i in script_BlockScript) { QS('xblock_' + i).borderLeft = (script_CurrentHighlightBlock == i) ? '3px solid black' : ''; }
|
|
script_blocksToScript();
|
|
}
|
|
|
|
// Convert the list of blocks into a script that can be compiled
|
|
function script_blocksToScript() {
|
|
var script = '';
|
|
if (script_BuildingBlocks) {
|
|
if (script_BuildingBlocks['_start']) { script += '##### Starting Block #####\r\n' + script_BuildingBlocks['_start']['code'] + '\r\n\r\n'; }
|
|
for (var i in script_BlockScript) {
|
|
var code = script_BlockScript[i]['code'];
|
|
code = code.split('%%%~%%%').join(i);
|
|
for (var j in script_BlockScript[i]['vars']) { code = code.split('%%%' + j + '%%%').join(script_BlockScript[i]['vars'][j]['value']); }
|
|
script += '##### Block: ' + script_BlockScript[i]['name'] + ' #####\r\nHighlightBlock __t ' + i + '\r\n' + code + '\r\n\r\n';
|
|
}
|
|
if (script_BuildingBlocks['_end']) { script += '##### Ending Block #####\r\n' + script_BuildingBlocks['_end']['code'] + '\r\nHighlightBlock\r\n'; }
|
|
}
|
|
Q('scriptarea').value = script;
|
|
}
|
|
|
|
// Highlight a script block. This is useful to know what block the script is currently running
|
|
var script_CurrentHighlightBlock;
|
|
function script_HighlightBlock(runner, x) {
|
|
if (runner == editscriptstate) { // Only highlight blocks if the scrpt editor is running the script. If running a script on the page, don't highlight blocks in the editor.
|
|
script_CurrentHighlightBlock = x;
|
|
for (var i in script_BlockScript) { QS('xblock_' + i).borderLeft = (script_CurrentHighlightBlock == i) ? '3px solid black' : ''; }
|
|
}
|
|
}
|
|
|
|
// Called by the "New..." button to reset the script editor to the start
|
|
function script_newScriptDlg() {
|
|
if (xxdialogMode) return;
|
|
setDialogMode(11, "Nuevo guión", 3, script_newScriptDlgOk, '<br>' + "Restablecer y borrar el editor de script?");
|
|
}
|
|
|
|
// Clear the script editor
|
|
function script_newScriptDlgOk() {
|
|
script_setBuildBlocks(script_StartingBuildingBlocks);
|
|
script_BlockScript = [];
|
|
script_BlockScriptSelectedId = null;
|
|
delete editscriptstate;
|
|
scriptViewButton(script_BuildingBlocks?1:0);
|
|
QH('variables', '');
|
|
Q('scriptarea').value = '';
|
|
resetScriptButton();
|
|
}
|
|
|
|
// Compile and reset a script to the starting position
|
|
function resetScriptButton() {
|
|
// Compile the script
|
|
breakScriptButton();
|
|
Q('compiledarea').value = rstr2hex(script_compile(Q('scriptarea').value, function(m) { messagebox("Error de compilación de script", m); }));
|
|
delete editscriptstate;
|
|
|
|
// Reset the script environment
|
|
Q('console').value = '';
|
|
QH('variables', '');
|
|
QH('EditScriptStatus', "Detenido");
|
|
if (script_BuilderView == 1) { fupdatescript(); }
|
|
if (Q('compiledarea').value.length == 0) return;
|
|
|
|
// Create a new script runtime object
|
|
var startvars = { '_interactive':1 };
|
|
// ###BEGIN###{Certificates}
|
|
startvars['_certificates'] = 1;
|
|
// ###END###{Certificates}
|
|
// ###BEGIN###{!Mode-Firmware}
|
|
startvars['_mode'] = 'Firmware';
|
|
// ###END###{!Mode-Firmware}
|
|
// ###BEGIN###{!Mode-MeshCentral2}
|
|
startvars['_mode'] = 'MeshCentral2';
|
|
// ###END###{!Mode-MeshCentral2}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
startvars['_mode'] = 'NodeWebkit';
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-LMS}
|
|
startvars['_mode'] = 'LMS';
|
|
// ###END###{Mode-LMS}
|
|
// ###BEGIN###{Mode-WebSite}
|
|
startvars['_mode'] = 'WebSite';
|
|
// ###END###{Mode-WebSite}
|
|
editscriptstate = script_setup(hex2rstr(Q('compiledarea').value), startvars);
|
|
editscriptstate.wsstack = wsstack;
|
|
editscriptstate.amtstack = amtstack;
|
|
editscriptstate.onStep = editscript_updateScriptState;
|
|
editscriptstate.onConsole = editscript_console;
|
|
editscript_updateScriptState(editscriptstate);
|
|
}
|
|
|
|
// Start running the script
|
|
function runScriptButton() {
|
|
if (editscriptstate == null) resetScriptButton();
|
|
if (editscriptstate == null) return;
|
|
editscriptstate.start(100);
|
|
}
|
|
|
|
// Stop/Pause the script
|
|
function breakScriptButton() {
|
|
if (editscriptstate == null) return;
|
|
editscriptstate.stop();
|
|
}
|
|
|
|
// Run one step of the script
|
|
function stepScriptButton() {
|
|
if (editscriptstate == null) resetScriptButton();
|
|
if (editscriptstate == null) return;
|
|
breakScriptButton();
|
|
editscriptstate.step();
|
|
}
|
|
|
|
// Display a new line into the script console
|
|
function editscript_console(msg) {
|
|
Q('console').value += (msg + '\n');
|
|
}
|
|
|
|
// Update the script state information and displayed variables
|
|
var script_states = ["Detenido", "Corriendo", "Pausado"];
|
|
function editscript_updateScriptState(runstate) {
|
|
// Update variables
|
|
var r = '';
|
|
if (runstate && runstate != null) {
|
|
var vs = [];
|
|
for (var i in runstate.variables) { if (!i.startsWith('__')) vs.push(i); }
|
|
vs.sort();
|
|
//for (var i in vs) { r += vs[i] + ' = ' + script_toString(runstate.variables[vs[i]]) + "\n"; }
|
|
for (var i in vs) {
|
|
if (typeof runstate.variables[vs[i]] == 'object') {
|
|
r += '<b>' + vs[i] + '</b> = ' + ObjectToStringEx(runstate.variables[vs[i]], 2) + '<br>';
|
|
} else {
|
|
r += '<b>' + vs[i] + '</b> = ' + EscapeHtml(script_toString(runstate.variables[vs[i]])) + '<br>';
|
|
}
|
|
}
|
|
}
|
|
QH('variables', r);
|
|
|
|
// Update state
|
|
r = "Detenido, sin guión";
|
|
if (runstate && runstate != null) { r = script_states[runstate.state]; if (runstate.state > 0) r += ', ' + runstate.ip + ' : ' + script_decompile(runstate.script, runstate.ip); }
|
|
if (r.length > 50) { r = r.substring(0, 50) + "..."; }
|
|
QH('EditScriptStatus', r);
|
|
}
|
|
|
|
// Return a string from any input, if the input is an object, stringify it.
|
|
function script_toString(x) { if (typeof x == 'object') return JSON.stringify(x); return x; }
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
// Save a script to disk, start by showing a dialog box to prompt to the filename.
|
|
function script_saveScript(e) {
|
|
if (xxdialogMode || scriptstate) return;
|
|
if (e && (e.shiftKey == true)) {
|
|
// Save as script block
|
|
setDialogMode(11, "Bloque de guiones", 1, null, '<br><textarea id=scriptSaveScriptJsonBlock style=width:100%;height:200px;resize:vertical />');
|
|
QH('scriptSaveScriptJsonBlock', script_fConvertScriptToJsonBlock(Q('scriptarea').value));
|
|
} else {
|
|
// Save as .mescript file
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
setDialogMode(11, "Save Script", 3, script_saveScriptOk, '<br><input id=scriptsavename style=width:100% value=test.mescript >');
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', "archivo")
|
|
chooser.setAttribute('nwsaveas', "script.mescript");
|
|
chooser.addEventListener('change', function() {
|
|
require('fs').writeFile(this.value, JSON.stringify({
|
|
'scriptText': Q('scriptarea').value,
|
|
'mescript': btoa(script_compile(Q('scriptarea').value)),
|
|
'blocks': script_StartingBuildingBlocks,
|
|
'scriptBlocks': script_BlockScript
|
|
}, null, ' ').replace(/\n/g, '\r\n'), function () { });
|
|
}, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
}
|
|
|
|
// Once the filename is selected, save the file.
|
|
function script_saveScriptOk() {
|
|
if (xxdialogMode) return;
|
|
var x = JSON.stringify({
|
|
'scriptText': Q('scriptarea').value,
|
|
'mescript': btoa(script_compile(Q('scriptarea').value)),
|
|
'blocks': script_StartingBuildingBlocks,
|
|
'scriptBlocks': script_BlockScript
|
|
}, null, ' ');
|
|
saveAs(data2blob(x), Q('scriptsavename').value);
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
// ###END###{Scripting-Editor}
|
|
|
|
// ###BEGIN###{CertificateManager}
|
|
|
|
//
|
|
// Certificate Manager
|
|
//
|
|
|
|
/*
|
|
function issueCertButtonOk() {
|
|
var certopen = getInputElement('certopen');
|
|
var files = xxDragDropCertFiles;
|
|
if (certopen) files = certopen.files;
|
|
if (files && files.length == 1) {
|
|
// Issue a certificate using this file
|
|
var reader = new FileReader();
|
|
reader.onload = issueCertButtonOk2;
|
|
reader.readAsBinaryString(files[0]);
|
|
} else {
|
|
// Issue a certificate using a dummy CA
|
|
issueCertButtonOk3(null);
|
|
}
|
|
}
|
|
*/
|
|
|
|
var certificateStore = [];
|
|
var currentCertificate = null;
|
|
|
|
function cert_updateCertificateList() {
|
|
var x = '', certcount = 0;
|
|
if (currentCertificate == null && certificateStore.length > 0) { currentCertificate = certificateStore[0]; }
|
|
certificateStore.sort(function (a, b) { var aa = a.cert.subject.getField('CN').value; var bb = b.cert.subject.getField('CN').value; if (aa > bb) { return 1; } if (aa < bb) { return -1; } return 0; });
|
|
for (var y in certificateStore) {
|
|
try {
|
|
var certificate = certificateStore[y], name = certificate.cert.subject.getField('CN').value, extra = [];
|
|
if (certificate['tlsauth']) { extra.push('<span title="' + "Este certificado se utilizará para autenticar esta consola en Intel AMT." + '">' + "Autenticación TLS" + '</span>'); }
|
|
if (certificate['trusted'] == true) { extra.push('<span title="' + "Confiamos en los certificados firmados por este certificado." + '">' + "Trusted" + '</span>'); }
|
|
if (certificate['privateKey']) { extra.push('<span title="' + "Tenemos la clave privada para este certificado." + '">' + "Llave privada" + '</span>'); }
|
|
x += '<div style=margin:4px;cursor:pointer>';
|
|
x += '<img src=images-commander/cert' + ((certificate['privateKey'])?'2':'1') + '.png style=vertical-align:text-top;float:left;background-color:white;height:28px height=32 width=32 />';
|
|
x += '<div id=LCR-' + certificate['h'] + ' class=g1 style=float:left;height:28px> </div><div id=RCR-' + certificate['h'] + ' class=g2 style=float:right;height:28px> </div><div style=height:28px ';
|
|
// ###BEGIN###{ContextMenus}
|
|
var cmenus = [];
|
|
cmenus.push("Ver..." + '#cert_view(' + certificate['h'] +'")');
|
|
if (certificate['privateKey']) { cmenus.push("Emitir nuevo cert ..." + '#cert_issueNew(' + certificate['h'] + ')'); }
|
|
cmenus.push("Exportar como .cer ..." + '#cert_saveCertCer(' + certificate['h'] + ')');
|
|
if (certificate['privateKey']) { cmenus.push("Exportar como .p12 ..." + '#cert_saveCertP12(' + certificate['h'] + ')'); }
|
|
x += ' cm=\'' + cmenus.join('|') + '\'';
|
|
// ###END###{ContextMenus}
|
|
x += ' onclick=\'cert_select(event, ' + certificate['h'] + ')\' id=CR-' + certificate['h'] + ' ondblclick=cert_view(' + certificate['h'] + ')>';
|
|
//x += '<input id=SC-' + certificate['h'] + ' type=checkbox style=float:left;margin-top:8px onclick=cert_onCertificateChecked()' + (certificate.checked?' checked':'') + ' />';
|
|
x += '<div style=float:right><span style=font-size:14px>' + extra.join(', ') + '</span> <input type=button value="' + "Ver..." + '" onclick=cert_view(' + certificate['h'] + ')> </div><div style=padding-top:2px> ';
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
//x += '<img src=images-BrandedCommander/ComputerIcon.png style=vertical-align:text-top /> ';
|
|
// ###END###{Look-BrandedCommander}
|
|
//x += '<img src=certificate.png style=vertical-align:text-top height=28 width=24 />';
|
|
x += '<b style=font-size:16px>' + EscapeHtml(name) + '</b></div></div></div>';
|
|
certcount++;
|
|
} catch (e) { delete certificateStore[y]; }
|
|
}
|
|
QV('id_certStartScreen', certcount == 0);
|
|
QH('id_certManagerMainArea', x);
|
|
cert_select();
|
|
}
|
|
|
|
function cert_view(h) {
|
|
if (xxdialogMode) return;
|
|
var x = '', certificate = getCertificate(h), cert = certificate.cert, commonName = cert.subject.getField('CN').value;
|
|
var fingerprint = '', fingerprint2 = forge.md.sha1.create().update(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()).digest().toHex().toUpperCase();
|
|
for (i = 0; i < fingerprint2.length; i++) { if ((i != 0) && (i % 2 == 0)) { fingerprint += ':'; } fingerprint += fingerprint2.substring(i, i + 1); }
|
|
x += '<img src=images-commander/cert' + ((certificate['privateKey']) ? '2' : '1') + '.png style=vertical-align:text-top;float:right;height:28px height=32 width=32 />';
|
|
x += '<input id=certTrustedCheck type=checkbox>' + "Este es un certificado confiable" + '<br>';
|
|
var extKeyUsage = null;
|
|
for (var i in certificate.cert.extensions) { if (certificate.cert.extensions[i].id == '2.5.29.37') { extKeyUsage = certificate.cert.extensions[i]; } }
|
|
if ((certificate['privateKey']) && (extKeyUsage != null) && (extKeyUsage['2.16.840.1.113741.1.2.1'] == true)) { x += '<div><input id=certMutualAuth type=checkbox>' + "Usar para autenticación de consola TLS" + '<br></div>'; }
|
|
x += '<br>';
|
|
// ###BEGIN###{FileSaver}
|
|
var y = atob(certificate['certbin']).length + " bytes," + '<a style=cursor:pointer;color:blue onclick=cert_saveCertCer(' + h + ',1)>' + NoBreak("Guardar .cer") + '</a>';
|
|
if (certificate['privateKey']) { y += ', <a style=cursor:pointer;color:blue onclick=cert_saveCertP12(' + h + ')>' + NoBreak("Guardar .p12") + '</a>'; }
|
|
y += ', <a style=cursor:pointer;color:blue onclick=cert_saveCertCer(' + h + ',2)>' + NoBreak("Guardar .pem") + '</a>';
|
|
x += addHtmlValueNoTitle("Certificado", y);
|
|
// ###END###{FileSaver}
|
|
// ###BEGIN###{!FileSaver}
|
|
//x += addHtmlValueNoTitle("Certificate", c.X509Certificate.length + " bytes");
|
|
// ###END###{!FileSaver}
|
|
// Decode certificate usages
|
|
y = [];
|
|
if (extKeyUsage != null) {
|
|
if (extKeyUsage.clientAuth == true) { y.push(NoBreak("Cliente TLS")); }
|
|
if (extKeyUsage.codeSigning == true) { y.push(NoBreak("Firma de código")); }
|
|
if (extKeyUsage.emailProtection == true) { y.push("Correo electrónico"); }
|
|
if (extKeyUsage.serverAuth == true) { y.push(NoBreak("Servidor TLS")); }
|
|
if (extKeyUsage['2.16.840.1.113741.1.2.1'] == true) { y.push(NoBreak("Consola Intel® AMT")); }
|
|
if (extKeyUsage['2.16.840.1.113741.1.2.2'] == true) { y.push(NoBreak("Agente Intel® AMT")); }
|
|
if (extKeyUsage['2.16.840.1.113741.1.2.3'] == true) { y.push(NoBreak("Activación Intel® AMT")); }
|
|
if (extKeyUsage.timeStamping == true) { y.push(NoBreak("Marcando la hora")); }
|
|
if (y.length > 0) { x += addHtmlValueNoTitle("Uso de certificado", y.join(', ') + '.') + '<br clear=all />'; }
|
|
}
|
|
x += '<br><div style=\"border-bottom:1px solid gray\"><i>' + "Asunto del certificado" + '</i></div><br>';
|
|
for (var i in xxCertSubjectNames) { var a = cert.subject.getField(i); if (a) { x += addHtmlValue(xxCertSubjectNames[i], EscapeHtml(a.value)); } }
|
|
x += addHtmlValueNoTitle("Huella dactilar", fingerprint.substring(0,29) + '<br />' + fingerprint.substring(30));
|
|
x += '<br><div style="border-bottom:1px solid gray"><i>' + "Certificado de emisor" + '</i></div><br>';
|
|
for (var i in xxCertSubjectNames) { var a = cert.issuer.getField(i); if (a) { x += addHtmlValue(xxCertSubjectNames[i], EscapeHtml(a.value)); } }
|
|
setDialogMode(11, "Certificado -" + EscapeHtml(commonName), 5, cert_viewex, x, certificate);
|
|
Q('certTrustedCheck').checked = (certificate['trusted'] == true);
|
|
if (certificate['privateKey'] && Q('certMutualAuth')) { Q('certMutualAuth').checked = (certificate['tlsauth'] == true); }
|
|
}
|
|
|
|
function cert_saveCertCer(h,type) {
|
|
var certificate = getCertificate(h), cert = certificate.cert, commonName = cert.subject.getField('CN').value;
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
//saveAs(data2blob(xxCertificates[h].X509Certificate), xxCertificates[h].XSubject['CN'] + '.cer');
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file')
|
|
if (type == 1) { // .cer format
|
|
chooser.setAttribute('nwsaveas', commonName + '.cer');
|
|
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, certificate['certbin'], 'base64', function () { }); }, false);
|
|
} else if (type == 2) { // .pem format
|
|
chooser.setAttribute('nwsaveas', commonName + '.pem');
|
|
chooser.addEventListener('change', function () {
|
|
var ptr = 0, xcert = '';
|
|
// Write the public certificate
|
|
while (ptr < certificate['certbin'].length) { xcert += certificate['certbin'].substring(ptr, ptr + Math.min(certificate['certbin'].length - ptr, 64)) + '\r\n'; ptr += 64; }
|
|
xcert = '-----BEGIN CERTIFICATE-----\r\n' + xcert + '-----END CERTIFICATE-----\r\n';
|
|
if (certificate['privateKeyBin']) { xcert += '\r\n' + certificate['privateKeyBin']; } // Write the private key
|
|
require('fs').writeFile(this.value, xcert, function () { });
|
|
}, false);
|
|
}
|
|
chooser.click();
|
|
setDialogMode(0);
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
function cert_saveCertP12(h) {
|
|
// Prompt to the PKCS12 password
|
|
var x = "Ingrese una contraseña de clave privada de certificado." + '<br/><br/><div style=height:26px><input id=idx_filepass1 type=password onkeyup=cert_saveCertP12Update() style=float:right;width:200px><div>' + "Contraseña" + '</div></div><div style=height:26px><input id=idx_filepass2 type=password onkeyup=cert_saveCertP12Update() style=float:right;width:200px><div>' + "Contraseña" + '</div></div>';
|
|
setDialogMode(11, "Contraseña de certificado", 3, cert_saveCertP12b, x, h);
|
|
cert_saveCertP12Update();
|
|
}
|
|
|
|
function cert_saveCertP12Update() {
|
|
QE('idx_dlgOkButton', (Q('idx_filepass1').value == Q('idx_filepass2').value) && (Q('idx_filepass1').value.length > 0));
|
|
}
|
|
|
|
function cert_saveCertP12b(b, h) {
|
|
var certificate = getCertificate(h), cert = certificate.cert, commonName = cert.subject.getField('CN').value, pass = Q('idx_filepass1').value;
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
//saveAs(data2blob(xxCertificates[h].X509Certificate), xxCertificates[h].XSubject['CN'] + '.cer');
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file')
|
|
chooser.setAttribute('nwsaveas', commonName + '.p12');
|
|
chooser.addEventListener('change', function() {
|
|
require('fs').writeFile(this.value, forge.util.encode64(forge.asn1.toDer(forge.pkcs12.toPkcs12Asn1(certificate['privateKey'], certificate['cert'], pass)).getBytes()), 'base64', function () { });
|
|
}, false);
|
|
chooser.click();
|
|
setDialogMode(0);
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
function cert_viewex(b, certificate) {
|
|
if (b == 2) {
|
|
cert_removeCertificateEx(certificate['h']);
|
|
} else {
|
|
var update = 0;
|
|
if (certificate['trusted'] != Q('certTrustedCheck').checked) { certificate['trusted'] = Q('certTrustedCheck').checked; update = 1; }
|
|
if ((certificate['privateKey']) && Q('certMutualAuth') && (certificate['tlsauth'] != Q('certMutualAuth').checked)) {
|
|
for (var y in certificateStore) { certificateStore[y]['tlsauth'] = false; }
|
|
certificate['tlsauth'] = Q('certMutualAuth').checked;
|
|
update = 1;
|
|
}
|
|
if (update == 1) { cert_updateCertificateList(); cert_saveCertificates(); }
|
|
}
|
|
}
|
|
|
|
function cert_removeCertificateEx(h) {
|
|
cert_deleteCertificatesEx(2, [ getCertificate(h) ]);
|
|
}
|
|
|
|
function cert_select(e, h) {
|
|
if (h) { currentCertificate = getCertificate(h); /*updateComputerDetails();*/ }
|
|
for (var y in certificateStore) {
|
|
var certificate = certificateStore[y];
|
|
var sel = (currentCertificate != null && certificate['h'] == currentCertificate['h']);
|
|
QS('CR-' + certificate['h'])['background-color'] = sel ? '#a0a0a0' : '#c9c9c9';
|
|
Q('LCR-' + certificate['h']).classList.remove('g1');
|
|
Q('LCR-' + certificate['h']).classList.remove('g1s');
|
|
Q('RCR-' + certificate['h']).classList.remove('g2');
|
|
Q('RCR-' + certificate['h']).classList.remove('g2s');
|
|
Q('LCR-' + certificate['h']).classList.add(sel ? 'g1s' : 'g1');
|
|
Q('RCR-' + certificate['h']).classList.add(sel ? 'g2s' : 'g2');
|
|
}
|
|
QE('IssueCertButton', (currentCertificate != null) && (currentCertificate['privateKey']));
|
|
}
|
|
|
|
function getCertificate(h) { for (var i in certificateStore) { if (certificateStore[i]['h'] == h) return certificateStore[i]; } return null; }
|
|
function getCertificateWithKeyCount(h) { for (var i in certificateStore) { var c = 0; if (certificateStore[i]['privateKey']) { c++; } } return c; }
|
|
function getTlsAuthCertificate() { for (var i in certificateStore) { if (certificateStore[i]['tlsauth'] == true) return certificateStore[i]; } return null; }
|
|
|
|
function cert_onCertificateChecked() {
|
|
for (var y in certificateStore) { certificateStore[y].checked = Q('SC-' + certificateStore[y]['h']).checked; }
|
|
}
|
|
|
|
function cert_deleteCertificates() {
|
|
if (xxdialogMode) return;
|
|
// Figure out how many certificates are selected.
|
|
var clist = [];
|
|
for (var y in certificateStore) { if (certificateStore[y].checked == true) { clist.push(certificateStore[y]); } }
|
|
if (clist.length == 0) { clist.push(currentCertificate); }
|
|
if (clist.length == 1) {
|
|
setDialogMode(11, "Eliminar certificados", 3, cert_deleteCertificatesEx, '<br>' + "¿Eliminar 1 certificado?", clist);
|
|
} else {
|
|
setDialogMode(11, "Eliminar certificados", 3, cert_deleteCertificatesEx, '<br>' + format("¿Eliminar {0} certificados?", clist.length), clist);
|
|
}
|
|
}
|
|
|
|
function cert_deleteCertificatesEx(button, clist) {
|
|
for (var i in clist) {
|
|
var handleToDelete = clist[i]['h'];
|
|
if ((currentCertificate != null) && (currentCertificate['h'] == handleToDelete)) { currentCertificate = null; }
|
|
for (x = 0; x < certificateStore.length; x++) { if (certificateStore[x]['h'] == handleToDelete) { certificateStore.splice(x, 1); } }
|
|
}
|
|
cert_saveCertificates();
|
|
cert_updateCertificateList();
|
|
//updateComputerDetails();
|
|
}
|
|
|
|
function cert_loadCertificates() {
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var ctext = null;
|
|
try { ctext = localStorage.getItem('certificates'); } catch (ex) { }
|
|
if (ctext) {
|
|
try { computerlist = JSON.parse(ctext); } catch (e) {
|
|
if (ctext.length > 512) { // Add trivial security, not intended to be real security. This just avoids storing data in plain text, but it's almost the same.
|
|
var crypto = require('crypto'), k = ctext.substring(0, 512), crypted = ctext.substring(512), decipher = crypto.createDecipher('aes-256-ctr', k), dec = decipher.update(crypted, 'hex', 'utf8');
|
|
dec += decipher.final('utf8');
|
|
var certificateStore2 = JSON.parse(dec);
|
|
if (Array.isArray(certificateStore2) == false) { certificateStore2 = []; }
|
|
for (var i in certificateStore2) {
|
|
try {
|
|
certificateStore2[i].checked = false;
|
|
if (certificateStore2[i]['certbin']) { certificateStore2[i]['cert'] = forge.pki.certificateFromAsn1(forge.asn1.fromDer(atob(certificateStore2[i]['certbin']))); }
|
|
if (certificateStore2[i]['privateKeyBin']) { certificateStore2[i]['privateKey'] = forge.pki.privateKeyFromPem(certificateStore2[i]['privateKeyBin']); }
|
|
} catch (e) { delete certificateStore2[i]; }
|
|
}
|
|
certificateStore = [];
|
|
for (var i in certificateStore2) { if (typeof certificateStore2[i] == 'object') certificateStore.push(certificateStore2[i]); }
|
|
}
|
|
}
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
//var ctext = null;
|
|
//try { ctext = localStorage.getItem('computers'); } catch (ex) { }
|
|
//if (ctext) { computerlist = JSON.parse(ctext); }
|
|
// ###END###{!Mode-NodeWebkit}
|
|
cert_updateCertificateList();
|
|
}
|
|
|
|
function cert_saveCertificates() {
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
const crypto = require('crypto');
|
|
crypto.randomBytes(256, function(err, buf) {
|
|
if (err) throw err; // Add trivial security, not intended to be real security. This just avoids storing data in plain text, but it's almost the same.
|
|
var k = buf.toString('hex'), cipher = crypto.createCipher('aes-256-ctr', k), crypted = cipher.update(JSON.stringify(certificateStore), 'utf8', 'hex');
|
|
crypted += cipher.final('hex');
|
|
try { localStorage.setItem('certificates', k + crypted); } catch (ex) { }
|
|
});
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
//try { localStorage.setItem('computers', JSON.stringify(computerlist)); } catch (ex) { }
|
|
// ###END###{!Mode-NodeWebkit}
|
|
}
|
|
|
|
function cert_createNew() {
|
|
if (xxdialogMode) return;
|
|
var x = '';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certcn style=float:right;width:230px><div style=padding-top:4px>' + "Nombre común" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certo style=float:right;width:230px><div style=padding-top:4px>' + "Organización" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certst style=float:right;width:230px><div style=padding-top:4px>' + "Provincia del estado" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certc style=float:right;width:230px><div style=padding-top:4px>' + "País" + '</div></div>';
|
|
setDialogMode(11, "Crear certificado raíz", 3, cert_createNewEx, x);
|
|
cert_createNew_Update();
|
|
}
|
|
|
|
function cert_createNew_Update() {
|
|
x = (getInputElement('certcn').value != '' && getInputElement('certo').value != '' && getInputElement('certst').value != '' && getInputElement('certc').value != '');
|
|
QE('idx_dlgOkButton', x);
|
|
}
|
|
|
|
// --- Extended Key Usage OID's ---
|
|
// 1.3.6.1.5.5.7.3.1 = TLS Server certificate
|
|
// 1.3.6.1.5.5.7.3.2 = TLS Client certificate
|
|
// 2.16.840.1.113741.1.2.1 = Intel AMT Remote Console
|
|
// 2.16.840.1.113741.1.2.2 = Intel AMT Local Console
|
|
// 2.16.840.1.113741.1.2.3 = Intel AMT Client Setup Certificate (Zero-Touch)
|
|
|
|
function cert_createNewEx(b, rootCert) {
|
|
// Generate a keypair and create an X.509v3 certificate
|
|
var keys = forge.pki.rsa.generateKeyPair(2048);
|
|
var cert = forge.pki.createCertificate();
|
|
cert.publicKey = keys.publicKey;
|
|
cert.serialNumber = '' + Math.floor((Math.random() * 100000) + 1);
|
|
cert.validity.notBefore = new Date(2018, 0, 1);
|
|
//cert.validity.notBefore.setFullYear(cert.validity.notBefore.getFullYear() - 1); // Create a certificate that is valid one year before, to make sure out-of-sync clocks don't reject this cert.
|
|
cert.validity.notAfter = new Date(2049, 11, 31);
|
|
//cert.validity.notAfter.setFullYear(cert.validity.notAfter.getFullYear() + 20);
|
|
var attrs = [
|
|
{ name: 'commonName', value: Q('certcn').value },
|
|
{ name: 'countryName', value: Q('certc').value },
|
|
{ shortName: 'ST', value: Q('certst').value },
|
|
{ name: 'organizationName', value: Q('certo').value }
|
|
];
|
|
cert.setSubject(attrs);
|
|
|
|
if (rootCert) {
|
|
// Use root attributes
|
|
cert.setIssuer(rootCert['cert'].subject.attributes);
|
|
} else {
|
|
// Use our own attributes
|
|
cert.setIssuer(attrs);
|
|
}
|
|
|
|
if (rootCert == undefined) {
|
|
// Create a root certificate
|
|
cert.setExtensions([{
|
|
name: 'basicConstraints',
|
|
cA: true
|
|
}, {
|
|
name: 'nsCertType',
|
|
sslCA: true,
|
|
emailCA: true,
|
|
objCA: true
|
|
}, {
|
|
name: 'subjectKeyIdentifier'
|
|
}]);
|
|
} else {
|
|
// Figure out the extended key usages
|
|
var extKeyUsage = { name: 'extKeyUsage' }
|
|
if (Q('d11_cu1').checked) { extKeyUsage['2.16.840.1.113741.1.2.1'] = true; extKeyUsage.clientAuth = true; }
|
|
if (Q('d11_cu2').checked) { extKeyUsage['2.16.840.1.113741.1.2.2'] = true; extKeyUsage.clientAuth = true; }
|
|
if (Q('d11_cu3').checked) { extKeyUsage['2.16.840.1.113741.1.2.3'] = true; extKeyUsage.clientAuth = true; }
|
|
if (Q('d11_cu4').checked) { extKeyUsage.serverAuth = true; }
|
|
if (Q('d11_cu5').checked) { extKeyUsage.clientAuth = true; }
|
|
if (Q('d11_cu6').checked) { extKeyUsage.emailProtection = true; }
|
|
if (Q('d11_cu7').checked) { extKeyUsage.codeSigning = true; }
|
|
if (Q('d11_cu8').checked) { extKeyUsage.timeStamping = true; }
|
|
|
|
// Create a leaf certificate
|
|
cert.setExtensions([{
|
|
name: 'basicConstraints'
|
|
}, {
|
|
name: 'keyUsage',
|
|
keyCertSign: true,
|
|
digitalSignature: true,
|
|
nonRepudiation: true,
|
|
keyEncipherment: true,
|
|
dataEncipherment: true
|
|
}, extKeyUsage, {
|
|
name: 'nsCertType',
|
|
client: Q('d11_cu5').checked,
|
|
server: Q('d11_cu4').checked,
|
|
email: Q('d11_cu6').checked,
|
|
objsign: Q('d11_cu7').checked,
|
|
}, {
|
|
name: 'subjectKeyIdentifier'
|
|
} ]);
|
|
}
|
|
|
|
// Self-sign certificate
|
|
if (rootCert) {
|
|
cert.sign(rootCert['privateKey'], forge.md.sha256.create());
|
|
} else {
|
|
cert.sign(keys.privateKey, forge.md.sha256.create());
|
|
}
|
|
|
|
// Save the certificate in the store
|
|
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(hex2rstr(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).toHex())), 'privateKey': keys.privateKey, 'privateKeyBin': forge.pki.privateKeyToPem(keys.privateKey), 'checked': false });
|
|
cert_saveCertificates();
|
|
cert_updateCertificateList();
|
|
}
|
|
|
|
function cert_issueNew() {
|
|
if (xxdialogMode) return;
|
|
var x = '';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certcn style=float:right;width:230px><div style=padding-top:4px>' + "Nombre común" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certo style=float:right;width:230px><div style=padding-top:4px>' + "Organización" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certst style=float:right;width:230px><div style=padding-top:4px>' + "Provincia del estado" + '</div></div>';
|
|
x += '<div style=height:26px;margin-top:4px><input onkeyup=cert_createNew_Update() id=certc style=float:right;width:230px><div style=padding-top:4px>' + "País" + '</div></div>';
|
|
x += '<div>Certificate Usages</div><ul style="list-style-type:none;height:100px;overflow:auto;width:100%;border: 1px solid #000;background-color:white;overflow-x:hidden;margin:0;padding:0">';
|
|
x += '<li><label><input type=checkbox id=d11_cu1>' + "Consola Intel® AMT" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu2>' + "Agente Intel® AMT" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu3>' + "Activación Intel® AMT" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu4>' + "Servidor TLS (HTTPS)" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu5>' + "Cliente TLS (HTTPS)" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu6>' + "Protección de correo electrónico" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu7>' + "Firma de código" + '</label></li>';
|
|
x += '<li><label><input type=checkbox id=d11_cu8>' + "Sello de tiempo" + '</label></li>';
|
|
x += '</ul>';
|
|
setDialogMode(11, format("Emitir certificado firmado por {0}", currentCertificate.cert.subject.getField('CN').value), 3, cert_createNewEx, x, currentCertificate);
|
|
cert_issueNew_Update();
|
|
}
|
|
|
|
function cert_issueNew_Update() {
|
|
x = (getInputElement('certcn').value != '' && getInputElement('certo').value != '' && getInputElement('certst').value != '' && getInputElement('certc').value != '');
|
|
QE('idx_dlgOkButton', x);
|
|
}
|
|
|
|
function cert_importCert() {
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = Q('certOpenFile');
|
|
if (chooser.getAttribute('eventset') != 1) {
|
|
chooser.setAttribute('eventset', '1');
|
|
chooser.addEventListener('change', cert_importCertOk, false);
|
|
}
|
|
chooser.value = null;
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
|
|
function cert_importCertOk2(e) {
|
|
haltEvent(e);
|
|
if (e.dataTransfer.files.length == 1) {
|
|
var reader = new FileReader();
|
|
if (e.dataTransfer.files[0].name.toLowerCase().endsWith('.p12') || e.dataTransfer.files[0].name.toLowerCase().endsWith('.pfx')) {
|
|
reader.onload = cert_importCertOkP12;
|
|
} else {
|
|
reader.onload = cert_importCertOkCER;
|
|
}
|
|
reader.readAsBinaryString(e.dataTransfer.files[0]);
|
|
}
|
|
}
|
|
|
|
function cert_importCertOk() {
|
|
var x = Q('certOpenFile');
|
|
if (x.files.length != 1) return;
|
|
var reader = new FileReader();
|
|
if (x.files[0].name.toLowerCase().endsWith('.p12') || x.files[0].name.toLowerCase().endsWith('.pfx')) { reader.onload = cert_importCertOkP12; } else { reader.onload = cert_importCertOkCER; }
|
|
reader.readAsBinaryString(x.files[0]);
|
|
}
|
|
|
|
function cert_importCertOkP12(file) {
|
|
// Prompt to the PKCS12 password
|
|
var x = "El archivo de certificado seleccionado requiere una contraseña." + '<br/><br/><div style=height:26px><input id=idx_filepass type=password style=float:right;width:200px><div>' + "Contraseña" + '</div></div>';
|
|
setDialogMode(11, "Contraseña de certificado", 3, cert_importCertOkP12b, x, file);
|
|
}
|
|
|
|
function cert_importCertOkP12b(button, file) {
|
|
// Try to decode the PKCS12 file
|
|
var p12;
|
|
try { p12 = forge.pkcs12.pkcs12FromAsn1(forge.asn1.fromDer(file.target.result), Q('idx_filepass').value); } catch (e) { setDialogMode(11, "Archivo de certificado", 1, function() {}, "Contraseña de certificado no válida o no se puede decodificar el archivo."); return; }
|
|
var bags1 = p12.getBags({bagType: forge.pki.oids.certBag});
|
|
var cert = bags1[forge.pki.oids.certBag][0].cert;
|
|
var bags2 = p12.getBags({bagType: '1.2.840.113549.1.12.10.1.2'})
|
|
var key = bags2['1.2.840.113549.1.12.10.1.2'][0].key;
|
|
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(hex2rstr(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).toHex())), 'privateKey': key, 'privateKeyBin': forge.pki.privateKeyToPem(key), 'checked': false });
|
|
cert_saveCertificates();
|
|
cert_updateCertificateList();
|
|
}
|
|
|
|
function cert_importCertOkCER(file) {
|
|
var cert, str = file.target.result;
|
|
var pemcert = cert_getMiddleString(str, '-----BEGIN CERTIFICATE-----', '-----END CERTIFICATE-----');
|
|
var pemkey = cert_getMiddleString(str, '-----BEGIN PRIVATE KEY-----', '-----END PRIVATE KEY-----');
|
|
if (pemkey == null) { pemkey = cert_getMiddleString(str, '-----BEGIN RSA PRIVATE KEY-----', '-----END RSA PRIVATE KEY-----'); }
|
|
if (pemcert != null) {
|
|
// Try to decode the .PEM file
|
|
try { cert = forge.pki.certificateFromPem(pemcert); } catch (e) { setDialogMode(11, "Archivo de certificado", 1, function () { }, "No se puede decodificar el archivo PEM."); return; }
|
|
if (pemkey == null) {
|
|
// Public key only
|
|
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()), 'checked': false });
|
|
} else {
|
|
// Public and private key
|
|
var privatekey;
|
|
try { privatekey = forge.pki.privateKeyFromPem(pemkey); } catch (e) { setDialogMode(11, "Archivo de certificado", 1, function () { }, "No se puede decodificar la clave privada PEM."); return; }
|
|
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()), 'privateKey': privatekey, 'privateKeyBin': forge.pki.privateKeyToPem(privatekey), 'checked': false });
|
|
}
|
|
} else {
|
|
// Try to decode the .CER file, public key only
|
|
try { cert = forge.pki.certificateFromAsn1(forge.asn1.fromDer(str)); } catch (e) { setDialogMode(11, "Archivo de certificado", 1, function () { }, "No se puede decodificar el archivo del certificado."); return; }
|
|
certificateStore.push({ 'h': Math.random(), 'cert': cert, 'certbin': btoa(file.target.result), 'checked': false });
|
|
}
|
|
cert_saveCertificates();
|
|
cert_updateCertificateList();
|
|
}
|
|
|
|
function cert_getMiddleString(str, start, end) { var a = str.indexOf(start), b = str.indexOf(end); if ((a == -1) || (b == -1) || (b < a)) return null; return str.substring(a, b + end.length); }
|
|
|
|
// ###END###{CertificateManager}
|
|
|
|
// ###BEGIN###{USBSetup}
|
|
|
|
//
|
|
// USB SETUP.BIN
|
|
//
|
|
|
|
function usb_newSetupBin() {
|
|
if (xxdialogMode) return;
|
|
idx_d14version.value = 4;
|
|
idx_d14consume.value = 1;
|
|
setDialogMode(14, "Crear nuevo archivo Setup.bin", 3, usb_newSetupBinOk);
|
|
}
|
|
|
|
function usb_newSetupBinOk(r) {
|
|
if (r == 1) { setupbin = AmtSetupBinCreate(idx_d14version.value, idx_d14consume.value); } // OK Button
|
|
usb_displaySetupBin();
|
|
}
|
|
|
|
function usb_openSetupBin() {
|
|
if (xxdialogMode) return;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file')
|
|
chooser.setAttribute('accept', '.bin')
|
|
chooser.addEventListener('change', function() {
|
|
setupbin = AmtSetupBinDecode(require('fs').readFileSync(this.value, 'binary'));
|
|
if (!setupbin) { messagebox("Abrir documento", "Archivo setup.bin no válido o dañado. No se puede abrir."); } else { usb_displaySetupBin(); }
|
|
}, false);
|
|
chooser.value = null;
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
setDialogMode(15, "Open Setup.bin file", 3, usb_openSetupBinOk);
|
|
// ###END###{!Mode-NodeWebkit}
|
|
}
|
|
|
|
function usb_openSetupBinOk() {
|
|
var x = Q('d15setupbinfile');
|
|
if (x.files.length != 1) return;
|
|
var reader = new FileReader();
|
|
reader.onload = usb_onSetupBinRead;
|
|
reader.readAsBinaryString(x.files[0]);
|
|
}
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
function usb_saveSetupBin() {
|
|
if (xxdialogMode || !setupbin) return;
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
saveAs(data2blob(AmtSetupBinEncode(setupbin)), 'setup.bin');
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file')
|
|
chooser.setAttribute('nwsaveas', 'setup.bin');
|
|
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, AmtSetupBinEncode(setupbin), 'binary', function () { }); }, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
function usb_onSetupBinRead(file) {
|
|
setupbin = AmtSetupBinDecode(file.target.result);
|
|
if (!setupbin) { messagebox("Abrir documento", "Archivo setup.bin no válido o dañado. No se puede abrir."); } else { usb_displaySetupBin(); }
|
|
}
|
|
|
|
function usb_displaySetupBin() {
|
|
QV('id_StartupScreen', !setupbin);
|
|
// ###BEGIN###{FileSaver}
|
|
QV('id_saveSetupBin', setupbin);
|
|
// ###END###{FileSaver}
|
|
if (!setupbin) { return QH('id_SetupBinArea', ''); }
|
|
|
|
// Update record count
|
|
var consumed = 0;
|
|
for (var i in setupbin.records) { if ((setupbin.records[i].flags & 1) == 0) { consumed++; } }
|
|
setupbin.dataRecordsConsumed = consumed;
|
|
|
|
// Main Header
|
|
var x = '<table onclick=usb_editheader(event) class="log1 us" cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px;cursor:pointer><tr><td><p><td>';
|
|
x += '<tr><td class=r2 style=padding-left:15px>';
|
|
x += '<div style=float:right;margin-right:12px onclick=usb_addRecordSetupBin()><a><u title=\'' + "Agregar un nuevo registro" + '\'>' + "Agregar registro" + '</u></a></div>';
|
|
x += '<div><strong>' + format("Intel® AMT Setup.bin versión del archivo {0}. {1}", setupbin.majorVersion, + setupbin.minorVersion) + '</strong>.</div>';
|
|
x += (((setupbin.flags & 1) == 0) ? 'Records will be consumed.' : 'Records will not be consumed.');
|
|
x += '<br>' + format("Registros: {0}, Consumido: {1}", setupbin.records.length, setupbin.dataRecordsConsumed)+ '<br>';
|
|
x += '<tr style=height:4px></table>';
|
|
|
|
// Display each record
|
|
for (var i in setupbin.records) {
|
|
var rec = setupbin.records[i];
|
|
x += '<div style=height:4px></div><table class="log1 us" cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td><p><td><tr><td class=r2 style=padding-left:15px;cursor:pointer>';
|
|
x += '<div style=float:right;margin-right:12px onclick="usb_addvariable(event,' + i + ')"><a><u title="' + "Agregar una nueva variable" + '">' + "Agregar variable" + '</u></a></div>';
|
|
x += '<div onclick=\'usb_editrecord(event, ' + i + ')\'>' + "Registro #" + '<strong>' + (+i + 1) + '</strong>. ' + "Este registro es: " + '<strong>' + ((rec.flags & 1) ? "Válido" : "Consumado") + ((rec.flags & 2) ? "Revuelto" : '') + '</strong></div>';
|
|
|
|
// Display each variable
|
|
for (var j in rec.variables) {
|
|
var v = rec.variables[j], val = v.value;
|
|
if (AmtSetupBinVarIds[v.moduleid][v.varid][2] && AmtSetupBinVarIds[v.moduleid][v.varid][2][val]) { val = AmtSetupBinVarIds[v.moduleid][v.varid][2][val]; }
|
|
if (v.moduleid == 2 && v.varid == 8) {
|
|
var hashtype = val.charCodeAt(0);
|
|
if (hashtype >= 0 && hashtype <= 3) {
|
|
var hashsize = [20, 32, 48][hashtype - 1];
|
|
var hash = rstr2hex(val.substring(1, hashsize + 1));
|
|
var hashnamesize = val.charCodeAt(1 + hashsize);
|
|
var hashname = val.substring(2 + hashsize, 2 + hashsize + hashnamesize)
|
|
val = ['SHA1', 'SHA256', 'SHA384'][hashtype - 1] + ', ' + hashname + ', ' + hash;
|
|
}
|
|
}
|
|
if (v.moduleid == 2 && v.varid == 17) {
|
|
val = val.charCodeAt(3) + '.' + val.charCodeAt(2) + '.' + val.charCodeAt(1) + '.' + val.charCodeAt(0);
|
|
}
|
|
x += '<div style=margin-right:12px><table onclick=\'usb_editvariable(event,' + i + ',' + j + ')\' class=\'itemBar us\' cellpadding=0 cellspacing=0 style=width:100%;border-radius:4px;margin-top:2px;margin-bottom:2px;padding:0><tr><td><p style=float:right;margin-right:8px><b>' + val + '</b><p>' + v['desc'] + '<tr style=height:4px></table></div>';
|
|
}
|
|
|
|
x += '<tr style=height:4px></table>';
|
|
}
|
|
|
|
QH('id_SetupBinArea', x);
|
|
}
|
|
|
|
function usb_addRecordSetupBin() {
|
|
if (xxdialogMode) return;
|
|
d13valid.checked = 1;
|
|
d13scramble.checked = 0;
|
|
QV('d13ScrambledRecordSpan', setupbin.majorVersion > 3);
|
|
setDialogMode(13, "Nuevo record #", 3, usb_addRecordSetupBinOk);
|
|
}
|
|
|
|
function usb_addRecordSetupBinOk() {
|
|
var r = {};
|
|
r.typeIdentifier = 1;
|
|
r.flags = (d13valid.checked ? 1 : 0) + (d13scramble.checked ? 2 : 0);
|
|
r.chunkCount = 0;
|
|
r.headerByteCount = 0;
|
|
r.number = 0;
|
|
r.variables = [];
|
|
setupbin.records.push(r);
|
|
usb_displaySetupBin();
|
|
}
|
|
|
|
function usb_editheader(e) {
|
|
if (xxdialogMode) return;
|
|
haltEvent(e);
|
|
idx_d14version.value = setupbin.majorVersion;
|
|
idx_d14consume.value = (setupbin.flags & 1);
|
|
setDialogMode(14, "Editar encabezado", 7, usb_editheaderok);
|
|
}
|
|
|
|
function usb_editheaderok(r) {
|
|
if (r == 2) {
|
|
delete setupbin;
|
|
} else {
|
|
setupbin.majorVersion = idx_d14version.value;
|
|
setupbin.flags = idx_d14consume.value;
|
|
}
|
|
usb_displaySetupBin();
|
|
}
|
|
|
|
function usb_editrecord(e, i) {
|
|
if (xxdialogMode) return;
|
|
selectedRecord = i;
|
|
selectedVariable = -1;
|
|
haltEvent(e);
|
|
d13valid.checked = (setupbin.records[selectedRecord].flags & 1);
|
|
d13scramble.checked = (setupbin.records[selectedRecord].flags & 2);
|
|
QV('d13ScrambledRecordSpan', setupbin.majorVersion > 3);
|
|
setDialogMode(13, format("Editar registro # {0}", (i + 1)), 7, usb_editrecordok);
|
|
}
|
|
|
|
function usb_editrecordok(r) {
|
|
if (r == 1) { setupbin.records[selectedRecord].flags = (d13valid.checked ? 1 : 0) + (d13scramble.checked ? 2 : 0); } // Edit Record
|
|
if (r == 2) { setupbin.records.splice(selectedRecord, 1); } // Delete Record
|
|
usb_displaySetupBin();
|
|
}
|
|
|
|
function usb_editvariable(e, i, j) {
|
|
if (xxdialogMode) return;
|
|
selectedRecord = i;
|
|
selectedVariable = j;
|
|
var modid = setupbin.records[i].variables[j].moduleid;
|
|
var varid = setupbin.records[i].variables[j].varid;
|
|
d16type.value = modid + '-' + varid;
|
|
d16type.disabled = true;
|
|
usb_ond16typechange();
|
|
QV('d16genericvalue', false);
|
|
QV('d16customvalue', false);
|
|
if (modid == 2 && varid == 8) {
|
|
var x = '<div style=height:26px><select id=idx_d16valc1 style=float:right;width:260px onchange=usb_ond16checkhash()><option value=1>' + "SHA1" + '</option>';
|
|
if (setupbin.majorVersion >= 3) { x += '<option value=2>SHA256</option><option value=3>' + "SHA384" + '</option>'; }
|
|
x += '</select><div>' + "Tipo de hash" + '</div></div>';
|
|
x += '<div style=height:26px><input id=idx_d16valc2 style=float:right;width:260px onkeyup=usb_ond16checkhash()><div>' + "Hash (HEX)" + '</div></div>';
|
|
x += '<div style=height:26px><input id=idx_d16valc3 style=float:right;width:260px onkeyup=usb_ond16checkhash() maxlength=31><div>' + "Nombre de hash" + '</div></div>';
|
|
QH('d16customvalue', x);
|
|
QV('d16customvalue', true);
|
|
var val = setupbin.records[i].variables[j].value;
|
|
var hashtype = val.charCodeAt(0);
|
|
if (hashtype >= 0 && hashtype <= 3) {
|
|
var hashsize = [20, 32, 48][hashtype - 1];
|
|
var hash = rstr2hex(val.substring(1, hashsize + 1));
|
|
var hashnamesize = val.charCodeAt(1 + hashsize);
|
|
var hashname = val.substring(2 + hashsize, 2 + hashsize + hashnamesize)
|
|
val = ["SHA1", "SHA256", "SHA384"][hashtype - 1] + ', ' + hashname + ', ' + hash;
|
|
Q('idx_d16valc1').value = hashtype;
|
|
Q('idx_d16valc2').value = hash;
|
|
Q('idx_d16valc3').value = hashname;
|
|
}
|
|
usb_ond16checkhash();
|
|
} else if (modid == 2 && varid == 17) { // Provisioning server address
|
|
QV('d16genericvalue', true);
|
|
var ip = setupbin.records[i].variables[j].value;
|
|
idx_d16value1.value = idx_d16value2.value = ip.charCodeAt(3) + '.' + ip.charCodeAt(2) + '.' + ip.charCodeAt(1) + '.' + ip.charCodeAt(0);
|
|
} else {
|
|
QV('d16genericvalue', true);
|
|
idx_d16value1.value = idx_d16value2.value = setupbin.records[i].variables[j].value;
|
|
}
|
|
haltEvent(e);
|
|
setDialogMode(16, format("Editar registro # {0}, variable # {1}", (i + 1), (j + 1)), 7, usb_editvariableok);
|
|
}
|
|
|
|
function usb_editvariableok(r) {
|
|
if (r == 1) { // OK
|
|
var ids = d16type.value.split('-');
|
|
var modid = +ids[0];
|
|
var varid = +ids[1];
|
|
var value = '';
|
|
var vardescription = AmtSetupBinVarIds[modid][varid];
|
|
if ((modid == 2) && (varid == 8)) {
|
|
value = String.fromCharCode(Q('idx_d16valc1').value) + hex2rstr(Q('idx_d16valc2').value) + String.fromCharCode(Q('idx_d16valc3').value.length) + Q('idx_d16valc3').value;
|
|
} else {
|
|
if (vardescription[2]) { value = idx_d16value1.value; } else { value = idx_d16value2.value; }
|
|
}
|
|
if ((modid == 2) && (varid == 17)) { // Provisioning server address
|
|
var ipSplit = value.split('.');
|
|
if (ipSplit.length != 4) return;
|
|
value = String.fromCharCode(parseInt(ipSplit[3]), parseInt(ipSplit[2]), parseInt(ipSplit[1]), parseInt(ipSplit[0]));
|
|
}
|
|
setupbin.records[selectedRecord].variables[selectedVariable].value = value;
|
|
}
|
|
if (r == 2) { setupbin.records[selectedRecord].variables.splice(selectedVariable, 1); } // Delete
|
|
usb_displaySetupBin();
|
|
}
|
|
|
|
function usb_addvariable(e, i) {
|
|
if (xxdialogMode) return;
|
|
selectedRecord = i;
|
|
d16type.value = '1-1';
|
|
d16type.disabled = false;
|
|
idx_d16value1.value = idx_d16value2.value = '';
|
|
usb_ond16typechange();
|
|
haltEvent(e);
|
|
setDialogMode(16, format("Agregar variable al registro # {0}", (i + 1)), 3, usb_addvariableok);
|
|
}
|
|
|
|
function usb_addvariableok() {
|
|
var ids = d16type.value.split('-');
|
|
var modid = +ids[0];
|
|
var varid = +ids[1];
|
|
var value = '';
|
|
var vardescription = AmtSetupBinVarIds[modid][varid];
|
|
if ((modid == 2) && (varid == 8)) {
|
|
value = String.fromCharCode(Q('idx_d16valc1').value) + hex2rstr(Q('idx_d16valc2').value) + String.fromCharCode(Q('idx_d16valc3').value.length) + Q('idx_d16valc3').value;
|
|
} else {
|
|
if (vardescription[2]) { value = idx_d16value1.value; } else { value = idx_d16value2.value; }
|
|
}
|
|
if ((modid == 2) && (varid == 17)) { // Provisioning server address
|
|
var ipSplit = value.split('.');
|
|
if (ipSplit.length != 4) return;
|
|
value = String.fromCharCode(parseInt(ipSplit[3]), parseInt(ipSplit[2]), parseInt(ipSplit[1]), parseInt(ipSplit[0]));
|
|
}
|
|
|
|
// Create a new variable
|
|
var v = {};
|
|
v.moduleid = modid;
|
|
v.varid = varid;
|
|
v.length = -1;
|
|
v.type = AmtSetupBinVarIds[modid][varid][0];
|
|
v.desc = AmtSetupBinVarIds[modid][varid][1];
|
|
v.value = value;
|
|
setupbin.records[selectedRecord].variables.push(v);
|
|
|
|
setupbin.records[selectedRecord].variables.sort(AmtSetupBinVariableCompare); // Sort the variables
|
|
usb_displaySetupBin();
|
|
}
|
|
|
|
function usb_ond16typechange() {
|
|
var ids = d16type.value.split('-');
|
|
var modid = +ids[0];
|
|
var varid = +ids[1];
|
|
var vardescription = AmtSetupBinVarIds[modid][varid];
|
|
QV('d16genericvalue', false);
|
|
QV('d16customvalue', false);
|
|
if (modid == 2 && varid == 8) {
|
|
var x = '<div style=height:26px><select id=idx_d16valc1 style=float:right;width:260px onchange=usb_ond16checkhash()><option value=1>' + "SHA1" + '</option>';
|
|
if (setupbin.majorVersion >= 3) { x += ('<option value=2>' + "SHA256" + '</option><option value=3>' + "SHA384" + '</option>'); }
|
|
x += '</select><div>' + "Tipo de hash" + '</div></div>';
|
|
x += '<div style=height:26px><input id=idx_d16valc2 style=float:right;width:260px onkeyup=usb_ond16checkhash()><div>' + "Hash (HEX)" + '</div></div>';
|
|
x += '<div style=height:26px><input id=idx_d16valc3 style=float:right;width:260px onkeyup=usb_ond16checkhash() maxlength=31><div>' + "Nombre de hash" + '</div></div>';
|
|
QV('d16customvalue', true);
|
|
QH('d16customvalue', x);
|
|
usb_ond16checkhash();
|
|
} else {
|
|
QV('d16genericvalue', true);
|
|
if (vardescription[2]) {
|
|
QV('idx_d16value1', true);
|
|
QV('idx_d16value2', false);
|
|
var options = '';
|
|
for (var i in vardescription[2]) { options += '<option value="' + i + '">' + vardescription[2][i] }
|
|
QH('idx_d16value1', options);
|
|
} else {
|
|
QV('idx_d16value1', false);
|
|
QV('idx_d16value2', true);
|
|
}
|
|
}
|
|
}
|
|
|
|
function usb_ond16checkhash() {
|
|
var hashtype = Q('idx_d16valc1').value;
|
|
var hashlen = hex2rstr(Q('idx_d16valc2').value).length;
|
|
QE('idx_dlgOkButton', (Q('idx_d16valc3').value.length > 0) && ((hashtype == 1) && (hashlen == 20)) || ((hashtype == 2) && (hashlen == 32)) || ((hashtype == 3) && (hashlen == 48)));
|
|
}
|
|
|
|
var usb_alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
|
|
function usb_computeChecksum(s) {
|
|
var A = 0;
|
|
for (var i = 0; i < s.length; i++) A += s.charCodeAt(i);
|
|
return usb_alphabet[A % 36];
|
|
}
|
|
|
|
function usb_generateRandomPid() {
|
|
var pid = '';
|
|
for (var i = 0; i < 7; i++) { pid += usb_alphabet[random(36)]; }
|
|
return pid + usb_computeChecksum(pid);
|
|
}
|
|
|
|
function usb_generateRandomPps()
|
|
{
|
|
var pps = '', s;
|
|
for (var j = 0; j < 8; j++) {
|
|
s = '';
|
|
for (var i = 0; i < 3; i++) s += usb_alphabet[random(36)];
|
|
pps += s + usb_computeChecksum(s);
|
|
}
|
|
return pps;
|
|
}
|
|
|
|
// ###END###{USBSetup}
|
|
|
|
// ###BEGIN###{SessionRecording}
|
|
|
|
var recFile = null;
|
|
var recFilePtr = 0;
|
|
var recFileStartTime = 0;
|
|
var recFileLastTime = 0;
|
|
var recFileEndTime = 0;
|
|
var recFileMetadata = null;
|
|
var recFileProtocol = 0;
|
|
var agentDesktop = null;
|
|
var agentTerminal = null;
|
|
var amtDesktop = null;
|
|
var srec_playing = 0; // 0 = Stopped, 1 = Pausing, 2 = Playing
|
|
var readState = 0;
|
|
var waitTimer = null;
|
|
var waitTimerArgs = null;
|
|
var srec_deskAspectRatio = 0;
|
|
var currentDeltaTimeTotalSec = 0;
|
|
|
|
function readNextBlock(func) {
|
|
if ((recFilePtr + 16) > recFile.size) { QS('srec_progressbar').width = '100%'; func(-1); } else {
|
|
var fr = new FileReader();
|
|
fr.onload = function () {
|
|
var type = ReadShort(this.result, 0);
|
|
var flags = ReadShort(this.result, 2);
|
|
var size = ReadInt(this.result, 4);
|
|
var time = (ReadInt(this.result, 8) << 32) + ReadInt(this.result, 12);
|
|
if ((recFilePtr + 16 + size) > recFile.size) { QS('srec_progressbar').width = '100%'; func(-1); } else {
|
|
var fr2 = new FileReader();
|
|
fr2.onload = function () {
|
|
recFilePtr += (16 + size);
|
|
if (recFileEndTime == 0) {
|
|
// File pointer progress bar
|
|
QS('srec_progressbar').width = Math.floor(100 * (recFilePtr / recFile.size)) + '%';
|
|
} else {
|
|
// Time progress bar
|
|
QS('srec_progressbar').width = Math.floor(((recFileLastTime - recFileStartTime) / (recFileEndTime - recFileStartTime)) * 100) + '%';
|
|
}
|
|
func(type, flags, time, this.result);
|
|
};
|
|
fr2.readAsBinaryString(recFile.slice(recFilePtr + 16, recFilePtr + 16 + size));
|
|
}
|
|
};
|
|
fr.readAsBinaryString(recFile.slice(recFilePtr, recFilePtr + 16));
|
|
}
|
|
}
|
|
|
|
function readLastBlock(func) {
|
|
if (recFile.size < 32) { func(-1); } else {
|
|
var fr = new FileReader();
|
|
fr.onload = function () {
|
|
var type = ReadShort(this.result, 0);
|
|
var flags = ReadShort(this.result, 2);
|
|
var size = ReadInt(this.result, 4);
|
|
var time = (ReadInt(this.result, 8) << 32) + ReadInt(this.result, 12);
|
|
if ((type == 3) && (size == 16) && (this.result.substring(16, 32) == 'MeshCentralMCREC')) { func(type, flags, time); } else { func(-1); }
|
|
};
|
|
fr.readAsBinaryString(recFile.slice(recFile.size - 32, recFile.size));
|
|
}
|
|
}
|
|
|
|
function addInfo(name, value) { if (value == null) return ''; return addInfoNoEsc(name, EscapeHtml(value)); }
|
|
|
|
function addInfoNoEsc(name, value) {
|
|
if (value == null) return '';
|
|
return '<span style=color:gray>' + EscapeHtml(name) + '</span>: <span style=font-size:20px;color:black>' + value + '</span><br/>';
|
|
}
|
|
|
|
function processFirstBlock(type, flags, time, data) {
|
|
recFileProtocol = 0;
|
|
if ((type != 1) || (flags != 0)) { cleanup(); return; }
|
|
try { recFileMetadata = JSON.parse(data) } catch (ex) { cleanup(); return; }
|
|
if ((recFileMetadata == null) || (recFileMetadata.magic != 'MeshCentralRelaySession') || (recFileMetadata.ver != 1)) { cleanup(); return; }
|
|
var x = '';
|
|
x += addInfo("Hora", recFileMetadata.time);
|
|
if (recFileEndTime != 0) {
|
|
var secs = Math.floor((recFileEndTime - time) / 1000);
|
|
if (secs > 1) { x += addInfo("Duración", format("{0} segundos", secs)); } else { x += addInfo("Duración", "1 segundo"); }
|
|
}
|
|
x += addInfo("Nombre de usuario", recFileMetadata.username);
|
|
x += addInfo("ID de usuario", recFileMetadata.userid);
|
|
x += addInfo("ID de sesión", recFileMetadata.sessionid);
|
|
if (recFileMetadata.ipaddr1 && recFileMetadata.ipaddr2) { x += addInfo("Direcciones", format("{0} a {1}", recFileMetadata.ipaddr1, recFileMetadata.ipaddr2)); }
|
|
x += addInfo("NodeID", recFileMetadata.nodeid);
|
|
if (recFileMetadata.protocol) {
|
|
var p = recFileMetadata.protocol;
|
|
if (p == 1) { p = "Terminal central de malla"; }
|
|
else if (p == 2) { p = "Escritorio MeshCentral"; }
|
|
else if (p == 100) { p = "Intel® AMT WSMAN"; }
|
|
else if (p == 101) { p = "Redirección Intel® AMT"; }
|
|
else if (p == 200) { p = "Intel® AMT KVM"; }
|
|
x += addInfoNoEsc("Protocolo", p);
|
|
}
|
|
QV('srec_DeskParent', false);
|
|
QV('srec_TermParent', false);
|
|
if (recFileMetadata.protocol == 1) {
|
|
// MeshCentral remote terminal
|
|
recFileProtocol = 1;
|
|
x += '<br /><br /><span style=color:gray>' + "Presione [espacio] para reproducir / pausar." + '</span>';
|
|
QE('srec_PlayButton', true);
|
|
QE('srec_PauseButton', false);
|
|
QE('srec_RestartButton', false);
|
|
QV('srec_toggleviewmode', false);
|
|
recFileStartTime = recFileLastTime = time;
|
|
}
|
|
else if (recFileMetadata.protocol == 2) {
|
|
// MeshCentral remote desktop
|
|
recFileProtocol = 2;
|
|
x += '<br /><br /><span style=color:gray>' + "Presione [espacio] para reproducir / pausar." + '</span>';
|
|
QE('srec_PlayButton', true);
|
|
QE('srec_PauseButton', false);
|
|
QE('srec_RestartButton', false);
|
|
QV('srec_toggleviewmode', true);
|
|
recFileStartTime = recFileLastTime = time;
|
|
agentDesktop = CreateAgentRemoteDesktop('srec_Desk');
|
|
agentDesktop.onScreenSizeChange = srec_deskAdjust;
|
|
agentDesktop.State = 3;
|
|
srec_deskAdjust();
|
|
}
|
|
else if (recFileMetadata.protocol == 101) {
|
|
// Intel AMT Redirection
|
|
recFileProtocol = 101;
|
|
x += '<br /><br /><span style=color:gray>' + "Presione [espacio] para reproducir / pausar." + '</span>';
|
|
QE('srec_PlayButton', true);
|
|
QE('srec_PauseButton', false);
|
|
QE('srec_RestartButton', false);
|
|
QV('srec_toggleviewmode', true);
|
|
recFileStartTime = recFileLastTime = time;
|
|
amtDesktop = CreateAmtRemoteDesktop('srec_Desk');
|
|
amtDesktop.onScreenSizeChange = srec_deskAdjust;
|
|
amtDesktop.State = 3;
|
|
amtDesktop.Start();
|
|
srec_deskAdjust();
|
|
} else if (recFileMetadata.protocol == 200) {
|
|
// Intel AMT Midstream KVM
|
|
recFileProtocol = 200;
|
|
x += '<br /><br /><span style=color:gray>' + "Presione [espacio] para reproducir / pausar." + '</span>';
|
|
QE('srec_PlayButton', true);
|
|
QE('srec_PauseButton', false);
|
|
QE('srec_RestartButton', false);
|
|
QV('srec_toggleviewmode', true);
|
|
recFileStartTime = recFileLastTime = time;
|
|
amtDesktop = CreateAmtRemoteDesktop('srec_Desk');
|
|
amtDesktop.onScreenSizeChange = srec_deskAdjust;
|
|
amtDesktop.State = 3;
|
|
amtDesktop.Start();
|
|
if (recFileMetadata.bpp) { amtDesktop.bpp = recFileMetadata.bpp; }
|
|
if (recFileMetadata.graymode) { amtDesktop.graymode = recFileMetadata.graymode; }
|
|
if (recFileMetadata.lowcolor) { amtDesktop.lowcolor = recFileMetadata.lowcolor; }
|
|
amtDesktop.state = 3;
|
|
srec_deskAdjust();
|
|
}
|
|
QV('srec_metadatadiv', true);
|
|
QH('srec_metadatadiv', x);
|
|
QH('srec_deskstatus', recFile.name);
|
|
}
|
|
|
|
function processBlock(type, flags, time, data) {
|
|
if (type < 0) { srec_pause(); return; }
|
|
var waitTime = Math.round((time - recFileLastTime) * parseFloat(Q('srec_PlaySpeed').value));
|
|
if (waitTime < 5) {
|
|
processBlockEx(type, flags, time, data);
|
|
} else {
|
|
waitTimerArgs = [type, flags, time, data]
|
|
waitTimer = setTimeout(function () { waitTimer = null; processBlockEx(waitTimerArgs[0], waitTimerArgs[1], waitTimerArgs[2], waitTimerArgs[3]); }, waitTime);
|
|
}
|
|
}
|
|
|
|
function processBlockEx(type, flags, time, data) {
|
|
if (srec_playing == 0) return;
|
|
var flagBinary = (flags & 1) != 0, flagUser = (flags & 2) != 0;
|
|
|
|
// Update the clock
|
|
var deltaTimeTotalSec = Math.floor((time - recFileStartTime) / 1000);
|
|
if (currentDeltaTimeTotalSec != deltaTimeTotalSec) {
|
|
currentDeltaTimeTotalSec = deltaTimeTotalSec;
|
|
var deltaTimeHours = Math.floor(deltaTimeTotalSec / 3600);
|
|
deltaTimeTotalSec -= (deltaTimeHours * 3600)
|
|
var deltaTimeMinutes = Math.floor(deltaTimeTotalSec / 60);
|
|
deltaTimeTotalSec -= (deltaTimeHours * 60)
|
|
var deltaTimeSeconds = Math.floor(deltaTimeTotalSec);
|
|
QH('srec_timespan', pad2(deltaTimeHours) + ':' + pad2(deltaTimeMinutes) + ':' + pad2(deltaTimeSeconds))
|
|
}
|
|
|
|
if ((type == 2) && flagBinary && !flagUser) {
|
|
// Device --> User data
|
|
if (recFileProtocol == 1) {
|
|
// MeshCentral Terminal
|
|
agentTerminal.ProcessData(data);
|
|
} else if (recFileProtocol == 2) {
|
|
// MeshCentral Remote Desktop
|
|
agentDesktop.ProcessData(data);
|
|
} else if (recFileProtocol == 101) {
|
|
// Intel AMT KVM
|
|
if ((readState == 0) && (rstr2hex(data).startsWith('4100000000000000'))) {
|
|
// We are not authenticated, KVM data starts here.
|
|
readState = 1;
|
|
if (data.length > 8) {
|
|
var view = new Uint8Array(data.length - 8);
|
|
for (var i = 8; i < data.length; i++) { view[i] = data.charCodeAt(i); }
|
|
amtDesktop.ProcessBinaryData(view.buffer);
|
|
}
|
|
} else if (readState == 1) {
|
|
var view = new Uint8Array(data.length);
|
|
for (var i = 0; i < data.length; i++) { view[i] = data.charCodeAt(i); }
|
|
amtDesktop.ProcessBinaryData(view.buffer);
|
|
}
|
|
} else if (recFileProtocol == 200) {
|
|
// Intel AMT midstream KVM
|
|
var view = new Uint8Array(data.length);
|
|
for (var i = 0; i < data.length; i++) { view[i] = data.charCodeAt(i); }
|
|
amtDesktop.ProcessBinaryData(view.buffer);
|
|
}
|
|
} else if ((type == 2) && flagBinary && flagUser) {
|
|
// User --> Device data
|
|
if (recFileProtocol == 101) {
|
|
// Intel AMT KVM
|
|
if (rstr2hex(data) == '0000000008080001000700070003050200000000') { console.log('RGB8'); amtDesktop.bpp = 1; } // Switch to 1 byte per pixel, 256 colors
|
|
if (rstr2hex(data) == '000000000808000100FF00000000000000000000') { console.log('GRAY8'); amtDesktop.bpp = 1; obj.graymode = true; } // Switch to 1 byte per pixel, 256 grays
|
|
if (rstr2hex(data) == '0000000008040001000F00000000000000000000') { console.log('GRAY4'); amtDesktop.bpp = 1; obj.graymode = true; obj.lowcolor = true; } // Switch to 1 byte per pixel, 16 grays
|
|
}
|
|
}
|
|
|
|
// This is a PNG screenshot of the display, load it and render it.
|
|
if ((type == 3) && (recFileProtocol == 200)) {
|
|
var tile = new Image();
|
|
tile.src = 'data:image/png;base64,' + btoa(data);
|
|
tile.onload = function () { amtDesktop.canvas.drawImage(tile, 0, 0); }
|
|
tile.error = function () { }
|
|
}
|
|
|
|
recFileLastTime = time;
|
|
if (srec_playing == 2) { readNextBlock(processBlock); }
|
|
}
|
|
|
|
function srec_cleanup() {
|
|
recFile = null;
|
|
recFilePtr = 0;
|
|
recFileMetadata = null;
|
|
srec_playing = 0;
|
|
if (agentDesktop != null) { agentDesktop.Canvas.clearRect(0, 0, agentDesktop.CanvasId.width, agentDesktop.CanvasId.height); agentDesktop = null; }
|
|
if (amtDesktop != null) { amtDesktop.canvas.clearRect(0, 0, amtDesktop.canvasid.width, amtDesktop.canvasid.height); amtDesktop = null; }
|
|
readState = 0;
|
|
waitTimerArgs = null;
|
|
currentDeltaTimeTotalSec = 0;
|
|
recFileEndTime = 0;
|
|
agentTerminal = null;
|
|
if (waitTimer != null) { clearTimeout(waitTimer); waitTimer = null; }
|
|
QH('srec_deskstatus', '');
|
|
QE('srec_PlayButton', false);
|
|
QE('srec_PauseButton', false);
|
|
QE('srec_RestartButton', false);
|
|
QS('srec_progressbar').width = '0px';
|
|
QH('srec_timespan', '00:00:00');
|
|
QV('srec_metadatadiv', true);
|
|
QH('srec_metadatadiv', '<div style="width:100%;text-align:center;color:gray;margin-top:26px"><span style="font-size:20px">' + "Reproductor de sesión grabado" + '</span><div style="margin:4px">' + "Arrastre y suelte un archivo .mcrec o haga clic en \"Abrir archivo ...\"" + '</div></div>');
|
|
QV('srec_DeskParent', false);
|
|
QV('srec_TermParent', false);
|
|
QV('srec_toggleviewmode', false);
|
|
}
|
|
|
|
function srec_ondrop(e) {
|
|
haltEvent(e);
|
|
|
|
// Check if these are files we can upload, remove all folders.
|
|
if (e.dataTransfer == null) return;
|
|
var files = [];
|
|
for (var i in e.dataTransfer.files) {
|
|
if ((e.dataTransfer.files[i].type != null) && (e.dataTransfer.files[i].size != null) && (e.dataTransfer.files[i].size != 0) && (e.dataTransfer.files[i].name.endsWith('.mcrec'))) {
|
|
files.push(e.dataTransfer.files[i]);
|
|
}
|
|
}
|
|
if (files.length == 0) return;
|
|
srec_cleanup();
|
|
recFile = files[0];
|
|
recFilePtr = 0;
|
|
readNextBlock(processFirstBlock);
|
|
readLastBlock(function (type, flags, time) { if (type == 3) { recFileEndTime = time; } else { recFileEndTime = 0; } });
|
|
srec_restart();
|
|
}
|
|
|
|
function srec_openfile() {
|
|
var x = '<input type=file name=files id=srec_p2fileinput style=width:100% accept=".mcrec" onchange="openfileChanged()" />';
|
|
setDialogMode(11, "Abrir documento...", 3, srec_openfileEx, x);
|
|
QE('idx_dlgOkButton', false);
|
|
}
|
|
|
|
function srec_openfileEx() {
|
|
var xfiles = Q('srec_p2fileinput').files;
|
|
if (xfiles != null) { var files = []; for (var i in xfiles) { if ((xfiles[i].type != null) && (xfiles[i].size != null) && (xfiles[i].size != 0) && (xfiles[i].name.endsWith('.mcrec'))) { files.push(xfiles[i]); } } }
|
|
if (files.length == 0) return;
|
|
srec_cleanup();
|
|
recFile = files[0];
|
|
recFilePtr = 0;
|
|
readNextBlock(processFirstBlock);
|
|
readLastBlock(function (type, flags, time) { if (type == 3) { recFileEndTime = time; } else { recFileEndTime = 0; } });
|
|
Q('srec_OpenFileButton').blur();
|
|
}
|
|
|
|
function openfileChanged() {
|
|
var xfiles = Q('srec_p2fileinput').files;
|
|
if (xfiles != null) { var files = []; for (var i in xfiles) { if ((xfiles[i].type != null) && (xfiles[i].size != null) && (xfiles[i].size != 0) && (xfiles[i].name.endsWith('.mcrec'))) { files.push(xfiles[i]); } } }
|
|
QE('idx_dlgOkButton', files.length == 1);
|
|
}
|
|
|
|
function srec_togglePause() {
|
|
if (recFile != null) { if (srec_playing == 2) { srec_pause(); } else { if (recFilePtr != recFile.size) { srec_play(); } } } return false;
|
|
}
|
|
|
|
function srec_play() {
|
|
Q('srec_PlayButton').blur();
|
|
if ((srec_playing == 2) || (recFileProtocol == 0)) return;
|
|
srec_playing = 2;
|
|
QV('srec_metadatadiv', false);
|
|
QE('srec_PlayButton', false);
|
|
QE('srec_PauseButton', true);
|
|
QE('srec_RestartButton', false);
|
|
if ((recFileProtocol == 2) || (recFileProtocol == 101) || (recFileProtocol == 200)) {
|
|
QV('srec_DeskParent', true);
|
|
QV('srec_TermParent', false);
|
|
} else if ((recFileProtocol == 1) && (agentTerminal == null)) {
|
|
QV('srec_DeskParent', false);
|
|
QV('srec_TermParent', true);
|
|
agentTerminal = CreateAmtRemoteTerminal('srec_Term', {});
|
|
agentTerminal.State = 3;
|
|
agentTerminal.heightLock = 1;
|
|
}
|
|
readNextBlock(processBlock);
|
|
}
|
|
|
|
function srec_pause() {
|
|
Q('srec_PauseButton').blur();
|
|
if (srec_playing < 2) return;
|
|
srec_playing = 1;
|
|
QE('srec_PlayButton', recFilePtr != recFile.size);
|
|
QE('srec_PauseButton', false);
|
|
QE('srec_RestartButton', recFilePtr != 0);
|
|
if (waitTimer != null) {
|
|
clearTimeout(waitTimer);
|
|
waitTimer = null;
|
|
processBlockEx(waitTimerArgs[0], waitTimerArgs[1], waitTimerArgs[2], waitTimerArgs[3]);
|
|
waitTimerArgs = null;
|
|
}
|
|
}
|
|
|
|
function srec_restart() {
|
|
Q('srec_RestartButton').blur();
|
|
if (srec_playing == 0) return;
|
|
recFilePtr = 0;
|
|
readState = 0;
|
|
currentDeltaTimeTotalSec = 0;
|
|
QV('srec_metadatadiv', true);
|
|
QE('srec_PlayButton', true);
|
|
QE('srec_PauseButton', false);
|
|
QE('srec_RestartButton', false);
|
|
QS('srec_progressbar').width = '0px';
|
|
QH('srec_timespan', '00:00:00');
|
|
QV('srec_DeskParent', false);
|
|
QV('srec_TermParent', false);
|
|
if (agentDesktop) {
|
|
agentDesktop.Canvas.clearRect(0, 0, agentDesktop.CanvasId.width, agentDesktop.CanvasId.height);
|
|
}
|
|
if (amtDesktop) {
|
|
amtDesktop.canvas.clearRect(0, 0, amtDesktop.canvasid.width, amtDesktop.canvasid.height);
|
|
amtDesktop = CreateAmtRemoteDesktop('srec_Desk');
|
|
amtDesktop.onScreenSizeChange = srec_deskAdjust;
|
|
amtDesktop.State = 3;
|
|
amtDesktop.Start();
|
|
if (recFileMetadata.protocol == 200) {
|
|
if (recFileMetadata.bpp) { amtDesktop.bpp = recFileMetadata.bpp; }
|
|
if (recFileMetadata.graymode) { amtDesktop.graymode = recFileMetadata.graymode; }
|
|
if (recFileMetadata.lowcolor) { amtDesktop.lowcolor = recFileMetadata.lowcolor; }
|
|
amtDesktop.state = 3;
|
|
srec_deskAdjust();
|
|
}
|
|
}
|
|
if (agentTerminal) { agentTerminal = null; }
|
|
}
|
|
|
|
function clearConsoleMsg() {
|
|
//QH('srec_p11DeskConsoleMsg', '');
|
|
}
|
|
|
|
// Toggle the web page to full screen
|
|
function srec_toggleAspectRatio(toggle) {
|
|
if (toggle === 1) { srec_deskAspectRatio = ((srec_deskAspectRatio + 1) % 3); }
|
|
srec_deskAdjust();
|
|
}
|
|
|
|
function srec_deskAdjust() {
|
|
var parentH = Q('srec_DeskParent').clientHeight, parentW = Q('srec_DeskParent').clientWidth;
|
|
var deskH = Q('srec_Desk').height, deskW = Q('srec_Desk').width;
|
|
QS('srec_Desk')['margin-top'] = null;
|
|
QS('srec_Desk')['margin-left'] = null;
|
|
|
|
if (srec_deskAspectRatio == 2) {
|
|
// Scale mode
|
|
QS('srec_Desk')['margin-top'] = null;
|
|
QS('srec_Desk').height = '100%';
|
|
QS('srec_Desk').width = '100%';
|
|
QS('srec_DeskParent').overflow = 'hidden';
|
|
} else if (srec_deskAspectRatio == 1) {
|
|
// Zoomed mode
|
|
QS('srec_Desk')['margin-top'] = '0px';
|
|
QS('srec_Desk').height = deskH + 'px';
|
|
QS('srec_Desk').width = deskW + 'px';
|
|
QS('srec_DeskParent').overflow = 'scroll';
|
|
} else {
|
|
// Fixed aspect ratio
|
|
if ((parentH / parentW) > (deskH / deskW)) {
|
|
var hNew = ((deskH * parentW) / deskW) + 'px';
|
|
QS('srec_Desk').height = hNew;
|
|
QS('srec_Desk').width = '100%';
|
|
QS('srec_Desk')['margin-top'] = ((parentH - ((deskH * parentW) / deskW)) / 2) + 'px';
|
|
} else {
|
|
var wNew = ((deskW * parentH) / deskH) + 'px';
|
|
QS('srec_Desk').height = '100%';
|
|
QS('srec_Desk').width = wNew;
|
|
QS('srec_Desk')['margin-left'] = ((parentW - ((deskW * parentH) / deskH)) / 2) + 'px'
|
|
}
|
|
QS('srec_DeskParent').overflow = 'hidden';
|
|
}
|
|
}
|
|
|
|
function pad2(num) { var s = '00' + num; return s.substr(s.length - 2); }
|
|
|
|
// ###END###{SessionRecording}
|
|
|
|
//
|
|
// POPUP DIALOG
|
|
//
|
|
|
|
// undefined = Hidden, 1 = Generic Message
|
|
var xxdialogMode;
|
|
var xxdialogFunc;
|
|
var xxdialogButtons;
|
|
var xxdialogTag;
|
|
|
|
// Display a dialog box
|
|
// Parameters: Dialog Mode (0 = none), Dialog Title, Buttons (1 = OK, 2 = Cancel, 3 = OK & Cancel), Call back function(0 = Cancel, 1 = OK), Dialog Content (Mode 11 only)
|
|
function setDialogMode(x, y, b, f, c, tag) {
|
|
xxdialogMode = x;
|
|
xxdialogFunc = f;
|
|
xxdialogButtons = b;
|
|
xxdialogTag = tag;
|
|
QE('idx_dlgOkButton', true);
|
|
QV('idx_dlgOkButton', b & 1);
|
|
QV('idx_dlgCancelButton', b & 2);
|
|
QV('id_dialogclose', b & 2);
|
|
QV('idx_dlgDeleteButton', b & 4);
|
|
if (y) QH('id_dialogtitle', y);
|
|
for (var i = 1; i < 27; i++) { QV('dialog' + i, i == x); } // Edit this line when more dialogs are added
|
|
QV('dialog', x);
|
|
if (c) { if (x == 11) { QH('id_dialogOptions', c); } else { QH('id_dialogMessage', c); } }
|
|
|
|
// ###BEGIN###{IDERStats}
|
|
if (xxdialogMode != 0) { iderToggleDiskMap(false); }
|
|
// ###END###{IDERStats}
|
|
}
|
|
|
|
function dialogclose(x) {
|
|
var f = xxdialogFunc, b = xxdialogButtons, t = xxdialogTag;
|
|
setDialogMode();
|
|
if (((b & 8) || x) && f) f(x, t);
|
|
}
|
|
|
|
function center() {
|
|
QS('dialog').left = ((((getDocWidth() - 400) / 2)) + 'px');
|
|
// ###BEGIN###{Desktop}
|
|
var sh = 0, mh = (Q('id_mainarea').offsetHeight - ((fullscreen == false)?126:53));
|
|
// ###BEGIN###{Scripting}
|
|
if (QS('id_scriptstatus').display == '') sh += 32; // If script status is displayed, reduce max-height by 22 pixels
|
|
// ###END###{Scripting}
|
|
// ###BEGIN###{IDER}
|
|
if (QS('id_iderstatus').display == '') sh += 32; // If ider status is displayed, reduce max-height by 22 pixels
|
|
// ###END###{IDER}
|
|
QS('id_mainarea_pad').height = (Q('id_mainarea').offsetHeight - sh - ((fullscreen == false)?16:0)) + 'px';
|
|
QS('Desk')['max-height'] = (mh - sh) + 'px';
|
|
QS('Desk')['max-width'] = (Q('id_mainarea').offsetWidth - ((fullscreen == false)?32:0)) + 'px';
|
|
if (Q('id_DeskParent').offsetWidth != 0) { QS('Desk')['max-width'] = Q('id_DeskParent').offsetWidth; }
|
|
if (fullscreen) {
|
|
QS('id_mainarea_pad')['overflow-y'] = 'hidden';
|
|
var h = (mh - sh - Q('Desk').offsetHeight) / 2;
|
|
QS('Desk')['margin-top'] = h + 'px';
|
|
QS('Desk')['margin-bottom'] = h + 'px';
|
|
} else {
|
|
QS('id_mainarea_pad')['overflow-y'] = 'scroll';
|
|
QS('Desk')['margin-top'] = '0';
|
|
QS('Desk')['margin-bottom'] = '0';
|
|
}
|
|
// ###END###{Desktop}
|
|
// ###BEGIN###{Storage}
|
|
//QS('id_mainarea_frame').height = Q('id_mainarea').offsetHeight;
|
|
// ###END###{Storage}
|
|
|
|
// ###BEGIN###{SessionRecording}
|
|
srec_deskAdjust();
|
|
// ###END###{SessionRecording}
|
|
}
|
|
function messagebox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t, 1); }
|
|
function statusbox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t); }
|
|
|
|
//
|
|
// GENERIC METHODS
|
|
//
|
|
|
|
// ###BEGIN###{FileSaver}
|
|
function SaveJsonFile(name, name2, desc, data) {
|
|
var n = '', r = {}, d = new Date();
|
|
if (amtsysstate) {
|
|
n = '-' + amtsysstate['AMT_GeneralSettings'].response['HostName'];
|
|
r = {'webappversion':version,'description':desc,'hostname':amtsysstate['AMT_GeneralSettings'].response['HostName'],'localtime':Date(),'utctime':new Date().toUTCString(),'isotime':new Date().toISOString()};
|
|
if (HardwareInventory) r['systemid'] = guidToStr(HardwareInventory['CIM_ComputerSystemPackage'].response['PlatformGUID'].toLowerCase());
|
|
}
|
|
n += '-' + d.getFullYear() + '-' + ('0'+(d.getMonth()+1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);;
|
|
r[name2] = data;
|
|
// ###BEGIN###{!Mode-NodeWebkit}
|
|
saveAs(data2blob(JSON.stringify(r, null, ' ').replace(/\n/g, '\r\n')), name + n + '.json');
|
|
// ###END###{!Mode-NodeWebkit}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var chooser = document.createElement('input');
|
|
chooser.setAttribute('type', 'file')
|
|
chooser.setAttribute('nwsaveas', name + n + '.json');
|
|
chooser.addEventListener('change', function () { require('fs').writeFile(this.value, JSON.stringify(r, null, ' ').replace(/\n/g, '\r\n'), function () { }); }, false);
|
|
chooser.click();
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
// ###END###{FileSaver}
|
|
|
|
var httpErrorTable = {
|
|
200: "Okay",
|
|
401: "Error de autenticación",
|
|
408: "Error de tiempo de espera",
|
|
601: "Error de análisis de WSMAN",
|
|
602: "No se puede analizar el encabezado de respuesta HTTP",
|
|
603: "Respuesta inesperada de enumeración HTTP",
|
|
604: "Respuesta de extracción HTTP inesperada",
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
998: "Certificado TLS inválido",
|
|
// ###END###{Mode-NodeWebkit}
|
|
997: "Reino de resumen inválido"
|
|
}
|
|
function errcheck(s, stack) {
|
|
if (wsstack == null || amtstack != stack) return true;
|
|
if (s != 200 && s != 9) {
|
|
setDialogMode();
|
|
wsstack.comm.FailAllError = 999; // Cause all new responses to be silent
|
|
amtstack.CancelAllQueries(999);
|
|
QH('id_messageviewstr', ((httpErrorTable[s])?(httpErrorTable[s]):(format("Error # {0}", s))));
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
if (s == 401) { QH('id_messageviewstr', "Error de autenticación" + '<br /><br /><input type=button value=\"' + "Set new credentials" + '\" onclick=meshcentral2credCallback(true)></input>'); }
|
|
// ###END###{Mode-MeshCentral2}
|
|
go(100);
|
|
QS('id_progressbar').width = 0;
|
|
// ###BEGIN###{ComputerSelector}
|
|
Q('id_messageviewbutton').focus();
|
|
// ###END###{ComputerSelector}
|
|
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
if (s == 998) {
|
|
//console.log('errcheck', wsstack.comm.xtlsCertificate.fingerprint);
|
|
if (wsstack.comm.xtlsCertificate != null) {
|
|
showTlsCert(11, '<img style=float:left;margin-right:8px src=warning.png width=48 height=48><div style=min-height:48px;display:table><div style=display:table-cell;vertical-align:middle>' + "Intel® AMT conectado con el siguiente certificado. Presione cancelar para desconectarse si este no es el certificado esperado." + '</div></div>', wsstack.comm.xtlsCertificate, 1);
|
|
}
|
|
}
|
|
// ###END###{Mode-NodeWebkit}
|
|
}
|
|
return (s != 200);
|
|
}
|
|
|
|
// ###BEGIN###{Storage}
|
|
function goiFrame(e,x,y) {
|
|
if (xxdialogMode) return;
|
|
go(x);
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
var ports = portsFromHost(currentcomputer['host'], currentcomputer['tls']);
|
|
y = (currentcomputer['tls']==0?'http://':'https://') + ports.host + ':' + ports.http + y;
|
|
// ###END###{Mode-NodeWebkit}
|
|
if ((e.shiftKey == true) || (Q('id_StorageIFrame').src.endsWith(y) == false)) Q('id_StorageIFrame').src = y;
|
|
QV('id_mainarea_pad', false);
|
|
QV('id_mainarea_frame', true);
|
|
}
|
|
// ###END###{Storage}
|
|
|
|
function go(x, force) {
|
|
if (xxdialogMode && force != 1) return;
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
// Remove left bar selection
|
|
var leftBarItems = ['LeftMenuMyDevices', 'LeftMenuMyCerts', 'LeftMenuMyUsb'];
|
|
// ###BEGIN###{SessionRecording}
|
|
leftBarItems.push('LeftMenuPlayer');
|
|
// ###END###{SessionRecording}
|
|
for (var i in leftBarItems) { Q(leftBarItems[i]).classList.remove('lbbuttonsel'); Q(leftBarItems[i]).classList.remove('lbbuttonsel2'); }
|
|
if (x == 101) { Q('LeftMenuMyDevices').classList.add('lbbuttonsel2'); }
|
|
if (x == 103) { Q('LeftMenuMyCerts').classList.add('lbbuttonsel2'); }
|
|
if (x == 102) { Q('LeftMenuMyUsb').classList.add('lbbuttonsel2'); }
|
|
if (x == 104) { Q('LeftMenuPlayer').classList.add('lbbuttonsel2'); }
|
|
QV('LeftSideToolBar', ((x >= 101) && (x <= 104)));
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{Storage}
|
|
QV('id_mainarea_frame', false);
|
|
QV('id_mainarea_pad', true);
|
|
// ###END###{Storage}
|
|
// ###BEGIN###{ComputerSelector}
|
|
QV('id_computerSelector', x == 101);
|
|
// ###END###{ComputerSelector}
|
|
// ###BEGIN###{Mode-LMS}
|
|
QV('id_lmsMainPanel', x == 101);
|
|
// ###END###{Mode-LMS}
|
|
// ###BEGIN###{USBSetup}
|
|
QV('id_usbSetupPanel', x == 102);
|
|
// ###END###{USBSetup}
|
|
// ###BEGIN###{CertificateManager}
|
|
QV('id_certManagerPanel', x == 103);
|
|
// ###END###{CertificateManager}
|
|
// ###BEGIN###{SessionRecording}
|
|
QV('id_sessionPlayerPanel', x == 104);
|
|
// ###END###{SessionRecording}
|
|
QV('id_messageview', x == 100);
|
|
QV('id_mainview', x < 100);
|
|
for (var i = 0; i < 80; i++) { // Edit this line when adding a new screen
|
|
QV('p' + i, i == x);
|
|
var q = QS('go' + i);
|
|
// ###BEGIN###{Look-Intel}
|
|
if (q) { q['background-color'] = ((i == x)?'#abcae1':''); } // #e8eefe
|
|
// ###END###{Look-Intel}
|
|
// ###BEGIN###{Look-ISDU}
|
|
if (q) { q['background-color'] = ((i == x)?'#abcae1':''); } // #e8eefe
|
|
// ###END###{Look-ISDU}
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
if (q) { q['background-color'] = ((i == x)?'#abcae1':''); } // #e8eefe
|
|
// ###END###{Look-BrandedCommander}
|
|
// ###BEGIN###{Look-Unite}
|
|
if (q) { q['background-color'] = ((i == x)?'#abcae1':''); } // #e8eefe
|
|
// ###END###{Look-Unite}
|
|
// ###BEGIN###{Look-Commander}
|
|
if (q) { q['background-color'] = ((i == x)?'gray':''); }
|
|
// ###END###{Look-Commander}
|
|
// ###BEGIN###{Look-MeshCentral}
|
|
if (q) { q['background-color'] = ((i == x)?'gray':''); }
|
|
// ###END###{Look-MeshCentral}
|
|
}
|
|
currentView = x;
|
|
// ###BEGIN###{Look-ISDU}
|
|
QV('id_isdu-image1', x == 11);
|
|
QV('id_isdu-image2', x == 8);
|
|
QV('id_isdu-image3', x == 14 || x == 13);
|
|
QV('id_isdu-image4', x == 1 || x == 0);
|
|
QV('id_isdu-image5', x == 6 || x == 15);
|
|
QV('id_isdu-image6', x == 18 || x == 19);
|
|
QV('id_isdu-image7', x == 16 || x == 12 || x == 2);
|
|
QV('id_isdu-image8', x == 17);
|
|
// ###END###{Look-ISDU}
|
|
// ###BEGIN###{Look-BrandedCommander}
|
|
// ###BEGIN###{!Mode-Firmware}
|
|
QV('id_isdu-image1', x == 11);
|
|
QV('id_isdu-image2', x == 8);
|
|
QV('id_isdu-image3', x == 14 || x == 13);
|
|
QV('id_isdu-image4', x == 1 || x == 0);
|
|
QV('id_isdu-image5', x == 6 || x == 15);
|
|
QV('id_isdu-image6', x == 18 || x == 19);
|
|
QV('id_isdu-image7', x == 16 || x == 12 || x == 2);
|
|
QV('id_isdu-image8', x == 17);
|
|
// ###END###{!Mode-Firmware}
|
|
// ###END###{Look-BrandedCommander}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
NW_SetupMainMenu(x);
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###BEGIN###{Desktop}
|
|
center();
|
|
// ###END###{Desktop}
|
|
}
|
|
|
|
function portsFromHost(host, tls) {
|
|
host = decodeURIComponent(host);
|
|
var x = host.split(':'), hp = ((tls == 0) ? 16992 : 16993), rp = ((tls == 0) ? 16994 : 16995);
|
|
if (x[0].indexOf('[') == 0) { // IPv6 address
|
|
x = host.split(']:');
|
|
if (x.length == 1) { return { host: host.substring(1, host.length - 1), http: hp, redir: rp } }
|
|
if (x.length > 1) { var y = x[1].split(':'); if (y.length > 0) { hp = parseInt(y[0]); } if (y.length > 1) { rp = parseInt(y[1]); } }
|
|
return { host: x[0].substring(1), http: hp, redir: rp }
|
|
}
|
|
if (x.length > 1) { hp = parseInt(x[1]); }
|
|
if (x.length > 2) { rp = parseInt(x[2]); }
|
|
return { host: x[0], http: hp, redir: rp }
|
|
}
|
|
function addLink(x, f) { return '<a style=cursor:pointer;color:blue onclick=\'' + f + '\'>♦ ' + x + '</a>'; }
|
|
function addLinkConditional(x, f, c) { if (c) return addLink(x, f); return x; }
|
|
function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
|
|
function addOption(q, t, i) { var option = document.createElement('option'); option.text = t; option.value = i; Q(q).add(option); }
|
|
function addDisabledOption(q, t, i) { var option = document.createElement('option'); option.text = t; option.value = i; option.disabled = 1; Q(q).add(option); }
|
|
function passwordcheck(p) { if (p.length < 8) return false; var upper = 0, lower = 0, number = 0, nonalpha = 0; for (var i in p) { var c = p.charCodeAt(i); if ((c > 64) && (c < 91)) { upper = 1; } else if ((c > 96) && (c < 123)) { lower = 1; } else if ((c > 47) && (c < 58)) { number = 1; } else { nonalpha = 1; } } return ((upper + lower + number + nonalpha) == 4); }
|
|
function methodcheck(r) { if (r && r != null && r.Body && r.Body['ReturnValue'] != 0) { messagebox("Error de llamada", r.Header['Method'] + ': ' + (r.Body.ReturnValueStr + '').replace('_', ' ')); return true; } return false; }
|
|
function TableStart() { return '<table class=\'log1 us\' cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td width=200px><p><td>'; }
|
|
function TableStart2() { return '<table class=\'log1 us\' cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td><p><td>'; }
|
|
function TableEntry(n, v) { return '<tr><td class=r1><p>' + n + '<td class=r1>' + v; }
|
|
function FullTable(x, e) { var r = TableStart(); for (i in x) { if (i && x[i]) r += TableEntry(i, x[i]); } return r + TableEnd(e); }
|
|
function TableEnd(n) { return '<tr><td colspan=2><p>' + (n?n:'') + '</table>'; }
|
|
function AddButton(v, f) { return '<input type=button value=\'' + v + '\' onclick=\'' + f + '\' style=margin:4px>'; }
|
|
function AddButton2(v, f, s) { return '<input type=button value=\'' + v + '\' onclick=\'' + f + '\' ' + s + '>'; }
|
|
function AddRefreshButton(f) { return '<input type=button name=refreshbtn value="' + "Actualizar" + '" onclick=\'refreshButtons(false);' + f + '\' style=margin:4px ' + (refreshButtonsState==false?'disabled':'') + '>'; }
|
|
function MoreStart() { return '<a style=cursor:pointer;color:blue id=morexxx1 onclick=QV(\"morexxx1\",false);QV(\"morexxx2\",true)>▼ More</a><div id=morexxx2 style=display:none><br><hr>'; };
|
|
function MoreEnd() { return '<a style=cursor:pointer;color:blue onclick=QV(\"morexxx2\",false);QV(\"morexxx1\",true)>▲ Less</a></div>'; };
|
|
function getSelectedOptions(sel) { var opts = [], opt; for (var i = 0, len = sel.options.length; i < len; i++) { opt = sel.options[i]; if (opt.selected) { opts.push(opt.value); } } return opts; }
|
|
function getInstance(x, y) { for (var i in x) { if (x[i]['InstanceID'] == y) return x[i]; } return null; }
|
|
function getItem(x, y, z) { for (var i in x) { if (x[i][y] == z) return x[i]; } return null; }
|
|
function guidToStr(g) { return g.substring(6, 8) + g.substring(4, 6) + g.substring(2, 4) + g.substring(0, 2) + '-' + g.substring(10, 12) + g.substring(8, 10) + '-' + g.substring(14, 16) + g.substring(12, 14) + '-' + g.substring(16, 20) + '-' + g.substring(20); }
|
|
function getUrlVars() { var j, hash, vars = [], hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); for (var i = 0; i < hashes.length; i++) { j = hashes[i].indexOf('='); if (j > 0) { vars[hashes[i].substring(0, j)] = hashes[i].substring(j + 1, hashes[i].length); } } return vars; }
|
|
function getDocWidth() { if (window.innerWidth) return window.innerWidth; if (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientWidth != 0) return document.documentElement.clientWidth; return document.getElementsByTagName('body')[0].clientWidth; }
|
|
function getDocHeight() { if (window.innerHeight) return window.innerHeight; if (document.documentElement && document.documentElement.clientHeight && document.documentElement.clientHeight != 0) return document.documentElement.clientHeight; return document.getElementsByTagName('body')[0].clientHeight; }
|
|
function addHtmlValue(t, v) { return '<div style=height:20px><div style=float:right;width:220px;overflow:hidden><b title="' + v + '">' + v + '</b></div><div>' + t + '</div></div>'; }
|
|
function addHtmlValueNoTitle(t, v) { return '<div style=height:20px><div style=float:right;width:220px;overflow:hidden>' + v + '</b></div><div>' + t + '</div></div>'; }
|
|
function numbersOnly(e, x) { return (event.charCode == 0) || (event.charCode == x) || (event.charCode >= 48 && event.charCode <= 57); }
|
|
function format(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); };
|
|
|
|
// ###BEGIN###{**ClosureAdvancedMode}
|
|
// Google closure advanced mode externs
|
|
window['cleanup'] = cleanup;
|
|
window['disconnect'] = disconnect;
|
|
window['dialogclose'] = dialogclose;
|
|
window['go'] = go;
|
|
window['QV'] = QV;
|
|
window['numbersOnly'] = numbersOnly;
|
|
window['syncClock'] = syncClock;
|
|
window['showLinkPolicyDlg'] = showLinkPolicyDlg;
|
|
// ###BEGIN###{PowerControl}
|
|
window['showPowerActionDlg'] = showPowerActionDlg;
|
|
// ###BEGIN###{PowerControl-Advanced}
|
|
window['showAdvPowerDlg'] = showAdvPowerDlg;
|
|
window['showAdvPowerDlgChange'] = showAdvPowerDlgChange;
|
|
// ###END###{PowerControl-Advanced}
|
|
// ###END###{PowerControl}
|
|
window['showFeaturesDlg'] = showFeaturesDlg;
|
|
window['showConsentDlg'] = showConsentDlg;
|
|
// ###BEGIN###{NetworkSettings}
|
|
window['showPingActionDlg'] = showPingActionDlg;
|
|
window['showIPSetupDlg'] = showIPSetupDlg;
|
|
window['updateIPSetupDlg'] = updateIPSetupDlg;
|
|
window['showIPv6StateDlg'] = showIPv6StateDlg;
|
|
window['showIPv6AddrDlg'] = showIPv6AddrDlg;
|
|
// ###END###{NetworkSettings}
|
|
window['PullSystemStatus'] = PullSystemStatus;
|
|
window['changeAccountButton'] = changeAccountButton;
|
|
window['changeAccountStateButton'] = changeAccountStateButton;
|
|
window['newAccountButton'] = newAccountButton;
|
|
window['showUserDetails'] = showUserDetails;
|
|
window['showEditDnsDlg'] = showEditDnsDlg;
|
|
window['showEditDnsDlgChange'] = showEditDnsDlgChange;
|
|
window['setDialogMode'] = setDialogMode;
|
|
window['PullUserInfo'] = PullUserInfo;
|
|
window['toggleAccountButton'] = toggleAccountButton;
|
|
window['showEditNameDlg'] = showEditNameDlg;
|
|
window['updateAccountDialog'] = updateAccountDialog;
|
|
window['refreshButtons'] = refreshButtons;
|
|
window['showPowerPolicyDlg'] = showPowerPolicyDlg;
|
|
// ###BEGIN###{HardwareInfo}
|
|
window['PullHardware'] = PullHardware;
|
|
// ###BEGIN###{FileSaver}
|
|
window['SaveHardwareLog'] = SaveHardwareLog;
|
|
// ###END###{FileSaver}
|
|
// ###END###{HardwareInfo}
|
|
// ###BEGIN###{WsmanBrowser}
|
|
// ###BEGIN###{FileSaver}
|
|
window['saveEntireAmtState'] = saveEntireAmtState;
|
|
// ###END###{FileSaver}
|
|
// ###END###{WsmanBrowser}
|
|
// ###BEGIN###{ContextMenus}
|
|
window['handleContextMenu'] = handleContextMenu;
|
|
window['hideContextMenu'] = hideContextMenu;
|
|
// ###END###{ContextMenus}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
window['showTlsCert'] = showTlsCert;
|
|
window['downloadTlsCert'] = downloadTlsCert;
|
|
// ###END###{Mode-NodeWebkit}
|
|
|
|
// ###BEGIN###{Desktop}
|
|
window['connectDesktopButton'] = connectDesktopButton;
|
|
window['connectDesktop'] = connectDesktop;
|
|
window['deskToggleFull'] = deskToggleFull;
|
|
window['showDesktopSettings'] = showDesktopSettings;
|
|
window['dmousedown'] = dmousedown;
|
|
window['dmouseup'] = dmouseup;
|
|
window['dmousemove'] = dmousemove;
|
|
window['drotate'] = drotate;
|
|
window['sendCAD'] = sendCAD;
|
|
// ###BEGIN###{FileSaver}
|
|
window['deskSaveImage'] = deskSaveImage;
|
|
// ###END###{FileSaver}
|
|
// ###BEGIN###{DesktopFocus}
|
|
window['deskToggleFocus'] = deskToggleFocus;
|
|
// ###END###{DesktopFocus}
|
|
// ###BEGIN###{Desktop-Multi}
|
|
window['desktopSwitchScreen'] = desktopSwitchScreen;
|
|
// ###END###{Desktop-Multi}
|
|
// ###END###{Desktop}
|
|
|
|
// ###BEGIN###{Desktop-Settings}
|
|
window['showDesktopSettingsDlg'] = showDesktopSettingsDlg;
|
|
window['showDesktopSettingsDlgUpdate'] = showDesktopSettingsDlgUpdate;
|
|
// ###END###{Desktop-Settings}
|
|
|
|
// ###BEGIN###{Terminal}
|
|
window['connectTerminal'] = connectTerminal;
|
|
window['termPaste'] = termPaste;
|
|
window['termSendKey'] = termSendKey;
|
|
// ###BEGIN###{FileSaver}
|
|
window['terminalCaptureToggle'] = terminalCaptureToggle;
|
|
// ###END###{FileSaver}
|
|
// ###BEGIN###{TerminalSize}
|
|
window['termToggleSize'] = termToggleSize;
|
|
// ###END###{TerminalSize}
|
|
window['termToggleFx'] = termToggleFx;
|
|
// ###BEGIN###{Terminal-Enumation-All}
|
|
window['termToggleType'] = termToggleType;
|
|
// ###END###{Terminal-Enumation-All}
|
|
window['termPaste'] = termPaste;
|
|
// ###END###{Terminal}
|
|
|
|
// ###BEGIN###{IDER}
|
|
window['iderStart'] = iderStart;
|
|
window['iderStop'] = iderStop;
|
|
// ###BEGIN###{IDERStats}
|
|
window['iderToggleDiskMap'] = iderToggleDiskMap;
|
|
// ###END###{IDERStats}
|
|
// ###END###{IDER}
|
|
|
|
// ###BEGIN###{RemoteAccess}
|
|
window['editEnvironmentDetection'] = editEnvironmentDetection;
|
|
window['editEnvironmentDetectionAdd'] = editEnvironmentDetectionAdd;
|
|
window['editUserInitiatedCira'] = editUserInitiatedCira;
|
|
window['editMpsPolicy'] = editMpsPolicy;
|
|
window['showServerDetails'] = showServerDetails;
|
|
window['AddRemoteAccessServer'] = AddRemoteAccessServer;
|
|
window['AddRemoteAccessServerUpdate'] = AddRemoteAccessServerUpdate;
|
|
window['edInputChg'] = edInputChg;
|
|
window['editMpsPolicyUpdate'] = editMpsPolicyUpdate;
|
|
window['editEnvironmentDetectionRemove'] = editEnvironmentDetectionRemove;
|
|
// ###END###{RemoteAccess}
|
|
|
|
// ###BEGIN###{EventLog}
|
|
window['showEventDetails'] = showEventDetails;
|
|
window['PullEventLog'] = PullEventLog;
|
|
window['FreezeLog'] = FreezeLog;
|
|
window['ClearLog'] = ClearLog;
|
|
window['eventFilter'] = eventFilter;
|
|
// ###BEGIN###{FileSaver}
|
|
window['SaveEventLog'] = SaveEventLog;
|
|
// ###END###{FileSaver}
|
|
// ###END###{EventLog}
|
|
|
|
// ###BEGIN###{AuditLog}
|
|
window['PullAuditLog'] = PullAuditLog;
|
|
window['auditFilter'] = auditFilter;
|
|
window['showAuditDetails'] = showAuditDetails;
|
|
// ###BEGIN###{FileSaver}
|
|
window['SaveAuditLog'] = SaveAuditLog;
|
|
// ###END###{FileSaver}
|
|
// ###END###{AuditLog}
|
|
|
|
// ###BEGIN###{Certificates}
|
|
window['PullCertificates'] = PullCertificates;
|
|
window['showCertDetails'] = showCertDetails;
|
|
window['addCertButton'] = addCertButton;
|
|
window['issueCertButton'] = issueCertButton;
|
|
window['showSetTlsSecurityDlg'] = showSetTlsSecurityDlg;
|
|
window['showSetTlsSecurityDlgUpdate'] = showSetTlsSecurityDlgUpdate;
|
|
window['showKeyPairDetails'] = showKeyPairDetails;
|
|
window['addCertButtonUpdate'] = addCertButtonUpdate;
|
|
window['issueCertButtonUpdate'] = issueCertButtonUpdate;
|
|
// ###BEGIN###{FileSaver}
|
|
window['downloadCert'] = downloadCert;
|
|
// ###END###{FileSaver}
|
|
// ###END###{Certificates}
|
|
|
|
// ###BEGIN###{AgentPresence}
|
|
window['addWatchdogAction'] = addWatchdogAction;
|
|
window['deleteWatchdogActions'] = deleteWatchdogActions;
|
|
window['PullWatchdog'] = PullWatchdog;
|
|
window['AddWatchdog'] = AddWatchdog;
|
|
window['AddWatchdogUpdate'] = AddWatchdogUpdate;
|
|
window['addWatchdogActionUpdate'] = addWatchdogActionUpdate;
|
|
window['showWatchdogDetails'] = showWatchdogDetails;
|
|
window['GenerateWatchdogGuid'] = GenerateWatchdogGuid;
|
|
// ###END###{AgentPresence}
|
|
|
|
// ###BEGIN###{SystemDefense}
|
|
window['changeDefaultPolicy'] = changeDefaultPolicy;
|
|
window['AddDefenseFilter'] = AddDefenseFilter;
|
|
window['AddDefenseFilterUpdate'] = AddDefenseFilterUpdate;
|
|
window['showFilterDetails'] = showFilterDetails;
|
|
window['AddDefensePolicy'] = AddDefensePolicy;
|
|
window['addFilterButton'] = addFilterButton;
|
|
window['removeFilterButton'] = removeFilterButton;
|
|
window['AddDefensePolicyUpdate'] = AddDefensePolicyUpdate;
|
|
window['showPolicyDetails'] = showPolicyDetails;
|
|
window['deleteDefensePolicy'] = deleteDefensePolicy;
|
|
// ###END###{SystemDefense}
|
|
|
|
// ###BEGIN###{Wireless}
|
|
window['showWifiStateDlg'] = showWifiStateDlg;
|
|
window['showWifiDetails'] = showWifiDetails;
|
|
window['wifiRemoveButton'] = wifiRemoveButton;
|
|
window['showWifiNewProfile'] = showWifiNewProfile;
|
|
window['updateWifiDialog'] = updateWifiDialog;
|
|
window['wifiRefresh'] = wifiRefresh;
|
|
// ###END###{Wireless}
|
|
|
|
// ###BEGIN###{WsmanBrowser}
|
|
window['wsmanQuery'] = wsmanQuery;
|
|
window['wsmanFilter'] = wsmanFilter;
|
|
window['QH'] = QH;
|
|
window['QV'] = QV;
|
|
// ###END###{WsmanBrowser}
|
|
|
|
// ###BEGIN###{Alarms}
|
|
window['PullAlarms'] = PullAlarms;
|
|
window['RemoveAllAlarms'] = RemoveAllAlarms;
|
|
window['showAddAlarm'] = showAddAlarm;
|
|
window['showAlertDetails'] = showAlertDetails;
|
|
window['alertDialogUpdate'] = alertDialogUpdate;
|
|
// ###END###{Alarms}
|
|
|
|
// ###BEGIN###{ComputerSelector}
|
|
window['computerConnect'] = computerConnect;
|
|
window['toolmenuclick'] = toolmenuclick;
|
|
window['computerFilterFunc'] = computerFilterFunc;
|
|
window['computerSelect'] = computerSelect;
|
|
|
|
// ###BEGIN###{ComputerSelector-Local}
|
|
window['updateComputerDialog'] = updateComputerDialog;
|
|
window['computerEdit'] = computerEdit;
|
|
window['addComputer'] = addComputer;
|
|
window['newComputerList'] = newComputerList;
|
|
window['openComputerList'] = openComputerList;
|
|
window['saveComputerList'] = saveComputerList;
|
|
// ###END###{ComputerSelector-Local}
|
|
|
|
// ###BEGIN###{Scripting}
|
|
window['computerStopScript'] = computerStopScript;
|
|
window['mscript_runScriptDlg'] = mscript_runScriptDlg;
|
|
window['onComputerChecked'] = onComputerChecked;
|
|
window['mscript_showComputerScriptOutput'] = mscript_showComputerScriptOutput;
|
|
// ###END###{Scripting}
|
|
|
|
// ###BEGIN###{ComputerSelectorScanner}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
window['showScanDialog'] = showScanDialog;
|
|
window['showScanDialogUpdate'] = showScanDialogUpdate;
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###END###{ComputerSelectorScanner}
|
|
|
|
// ###END###{ComputerSelector}
|
|
|
|
// ###BEGIN###{Mode-LMS}
|
|
window['lmsRefresh'] = lmsRefresh;
|
|
window['lmsConfigure'] = lmsConfigure;
|
|
window['lmsLogin'] = lmsLogin;
|
|
window['lmsConfigureLogin'] = lmsConfigureLogin;
|
|
window['lmsUpdateLoginDialog'] = lmsUpdateLoginDialog;
|
|
window['lmsShowVersionsDlg'] = lmsShowVersionsDlg;
|
|
window['lmsActivate'] = lmsActivate;
|
|
window['lmsDeactivate'] = lmsDeactivate;
|
|
window['toolmenuclick'] = toolmenuclick;
|
|
window['lmsShowTrustedHashesDlg'] = lmsShowTrustedHashesDlg;
|
|
// ###END###{Mode-LMS}
|
|
|
|
// ###BEGIN###{Storage}
|
|
window['SetStorageName'] = SetStorageName;
|
|
window['showStorageDetails'] = showStorageDetails;
|
|
window['PullStorage'] = PullStorage;
|
|
window['UploadToStorage'] = UploadToStorage;
|
|
window['goiFrame'] = goiFrame;
|
|
// ###BEGIN###{Mode-Firmware}
|
|
window['OpenFromStorage'] = OpenFromStorage;
|
|
// ###END###{Mode-Firmware}
|
|
// ###BEGIN###{Mode-LMS}
|
|
window['OpenFromStorage'] = OpenFromStorage;
|
|
// ###END###{Mode-LMS}
|
|
// ###BEGIN###{FileSaver}
|
|
window['DownloadFromStorage'] = DownloadFromStorage;
|
|
// ###END###{FileSaver}
|
|
// ###BEGIN###{Mode-NodeWebkit}
|
|
window['UploadAppToStorage'] = UploadAppToStorage;
|
|
// ###END###{Mode-NodeWebkit}
|
|
// ###END###{Storage}
|
|
|
|
// ###BEGIN###{Scripting}
|
|
window['script_runScriptDlg'] = script_runScriptDlg;
|
|
window['script_Stop'] = script_Stop;
|
|
// ###END###{Scripting}
|
|
|
|
// ###BEGIN###{Scripting-Editor}
|
|
// ###BEGIN###{FileSaver}
|
|
window['script_saveScript'] = script_saveScript;
|
|
// ###END###{FileSaver}
|
|
window['resetScriptButton'] = resetScriptButton;
|
|
window['runScriptButton'] = runScriptButton;
|
|
window['breakScriptButton'] = breakScriptButton;
|
|
window['stepScriptButton'] = stepScriptButton;
|
|
window['scriptViewButton'] = scriptViewButton;
|
|
window['script_fonfilterchanged'] = script_fonfilterchanged;
|
|
window['script_fonclick'] = script_fonclick;
|
|
window['script_fondragstart'] = script_fondragstart;
|
|
window['script_fondragend'] = script_fondragend;
|
|
window['script_fondragenter'] = script_fondragenter;
|
|
window['script_fondragleave'] = script_fondragleave;
|
|
window['script_fondrop'] = script_fondrop;
|
|
window['script_foneditclick'] = script_foneditclick;
|
|
window['script_foneditclickEx'] = script_foneditclickEx;
|
|
// ###END###{Scripting-Editor}
|
|
|
|
// ###BEGIN###{USBSetup}
|
|
window['usb_newSetupBin'] = usb_newSetupBin;
|
|
window['usb_openSetupBin'] = usb_openSetupBin;
|
|
window['usb_addRecordSetupBin'] = usb_addRecordSetupBin;
|
|
window['usb_addvariable'] = usb_addvariable;
|
|
window['usb_editheader'] = usb_editheader;
|
|
window['usb_editrecord'] = usb_editrecord;
|
|
window['usb_editvariable'] = usb_editvariable;
|
|
window['usb_ond16typechange'] = usb_ond16typechange;
|
|
// ###BEGIN###{FileSaver}
|
|
window['usb_saveSetupBin'] = usb_saveSetupBin;
|
|
// ###END###{FileSaver}
|
|
// ###END###{USBSetup}
|
|
|
|
// ###BEGIN###{Mode-MeshCentral2}
|
|
window['connectButtonfunction'] = connectButtonfunction;
|
|
// ###END###{Mode-MeshCentral2}
|
|
|
|
// ###END###{**ClosureAdvancedMode}
|
|
|
|
// Get things started
|
|
startup();
|
|
</script>
|
|
|
|
|
|
</div></div></body></html> |