diff --git a/amtmanager.js b/amtmanager.js
index 620ed72a..09da752d 100644
--- a/amtmanager.js
+++ b/amtmanager.js
@@ -946,7 +946,7 @@ module.exports.CreateAmtManager = function (parent) {
});
}
- // Perform a power action: 2 = Power up, 5 = Power cycle, 8 = Power down, 10 = Reset
+ // Perform a power action: 2 = Power up, 5 = Power cycle, 8 = Power down, 10 = Reset, 11 = Power on to BIOS, 12 = Reset to BIOS, 13 = Power on to BIOS with SOL, 14 = Reset to BIOS with SOL
function performPowerAction(nodeid, action) {
var devices = obj.amtDevices[nodeid];
if (devices == null) return;
@@ -954,14 +954,44 @@ module.exports.CreateAmtManager = function (parent) {
var dev = devices[i];
// If not LMS, has a AMT stack present and is in connected state, perform power operation.
if ((dev.connType != 2) && (dev.state == 1) && (dev.amtstack != null)) {
- // Action: 2 = Power on, 8 = Power down, 10 = reset
parent.debug('amt', dev.name, "performPowerAction", action);
dev.powerAction = action;
- try { dev.amtstack.RequestPowerStateChange(action, performPowerActionResponse); } catch (ex) { }
+ if (action <= 10) {
+ // Action: 2 = Power up, 5 = Power cycle, 8 = Power down, 10 = Reset
+ try { dev.amtstack.RequestPowerStateChange(action, performPowerActionResponse); } catch (ex) { }
+ } else {
+ // 11 = Power on to BIOS, 12 = Reset to BIOS, 13 = Power on to BIOS with SOL, 14 = Reset to BIOS with SOL
+ dev.amtstack.BatchEnum(null, ['*AMT_BootSettingData'], performAdvancedPowerActionResponse);
+ }
}
}
}
+ // Response to Intel AMT advanced power action
+ function performAdvancedPowerActionResponse(stack, name, responses, status) {
+ const dev = stack.dev;
+ const action = dev.powerAction;
+ delete dev.powerAction;
+ if (obj.amtDevices[dev.nodeid] == null) return; // Device no longer exists, ignore this response.
+ if (status != 200) return;
+ if ((responses['AMT_BootSettingData'] == null) || (responses['AMT_BootSettingData'].response == null)) return;
+
+ var bootSettingData = responses['AMT_BootSettingData'].response;
+ bootSettingData['BIOSSetup'] = ((action >= 11) && (action <= 14));
+ bootSettingData['UseSOL'] = ((action >= 13) && (action <= 14));
+ if ((action == 11) || (action == 13)) { dev.powerAction = 2; } // Power on
+ if ((action == 12) || (action == 14)) { dev.powerAction = 10; } // Reset
+
+ dev.amtstack.Put('AMT_BootSettingData', bootSettingData, function performAdvancedPowerActionResponseEx(stack, name, response, status, tag) {
+ const dev = stack.dev;
+ const action = dev.powerAction;
+ delete dev.powerAction;
+ if (obj.amtDevices[dev.nodeid] == null) return; // Device no longer exists, ignore this response.
+ if (status != 200) return;
+ try { dev.amtstack.RequestPowerStateChange(action, performPowerActionResponse); } catch (ex) { }
+ }, 0, 1);
+ }
+
// Response to Intel AMT power action
function performPowerActionResponse(stack, name, responses, status) {
const dev = stack.dev;
diff --git a/meshuser.js b/meshuser.js
index afcc566c..87d83dc2 100644
--- a/meshuser.js
+++ b/meshuser.js
@@ -3001,8 +3001,8 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
}
if ((command.actiontype >= 300) && (command.actiontype < 400)) {
- if ((command.actiontype != 302) && (command.actiontype != 308) && (command.actiontype != 310)) return; // Invalid action type.
- // Intel AMT power command, actiontype: 2 = Power on, 8 = Power down, 10 = reset
+ if ((command.actiontype != 302) && (command.actiontype != 308) && (command.actiontype < 310) && (command.actiontype > 312)) return; // Invalid action type.
+ // Intel AMT power command, actiontype: 2 = Power on, 8 = Power down, 10 = reset, 11 = Power on to BIOS, 12 = Reset to BIOS, 13 = Power on to BIOS with SOL, 14 = Reset to BIOS with SOL
parent.parent.DispatchEvent('*', obj, { action: 'amtpoweraction', userid: user._id, username: user.name, nodeids: [node._id], domain: domain.id, nolog: 1, actiontype: command.actiontype - 300 });
} else {
if ((command.actiontype < 2) && (command.actiontype > 4)) return; // Invalid action type.
diff --git a/views/default.handlebars b/views/default.handlebars
index 4c41d04c..ecdbce87 100644
--- a/views/default.handlebars
+++ b/views/default.handlebars
@@ -7993,12 +7993,16 @@
count++;
y += '';
y += '';
+ if ((xxcurrentView == 11) || (xxcurrentView == 12)) { // Only show these options on terminal or desktop tabs
+ y += '';
+ y += '';
+ }
}
if ((currentNode.intelamt != null) && (currentNode.intelamt.state == 2) && ((currentNode.conn & 6) != 0) && ((rights & 64) != 0)) {
count++;
y += '';
}
- if ((getNodeAmtVersion(currentNode) >= 15) && (currentNode.intelamt.state == 2) && ((currentNode.conn & 6) != 0) && (rights == 0xFFFFFFFF) && ((features & 0x00000400) == 0)) { count++; y += ''; } // CIRA (2) or AMT (4) connected
+ if (((xxcurrentView == 11) || (xxcurrentView == 12)) && (getNodeAmtVersion(currentNode) >= 15) && (currentNode.intelamt.state == 2) && ((currentNode.conn & 6) != 0) && (rights == 0xFFFFFFFF) && ((features & 0x00000400) == 0)) { count++; y += ''; } // CIRA (2) or AMT (4) connected
if (((currentNode.conn & 1) != 0) && ((rights & 32768) != 0)) { count++; y += ''; }
}
y += '';
@@ -8056,6 +8060,10 @@
setDialogMode(2, "Intel® AMT Power Operation", 3, function() { meshserver.send({ action: 'poweraction', nodeids: [ currentNode._id ], actiontype: parseInt(op) }); }, "Perform Intel® AMT power off?");
} else if (op == 310) { // Intel AMT reset
setDialogMode(2, "Intel® AMT Power Operation", 3, function() { meshserver.send({ action: 'poweraction', nodeids: [ currentNode._id ], actiontype: parseInt(op) }); }, "Perform Intel® AMT reset?");
+ } else if (op == 311) { // Intel AMT power on to BIOS
+ setDialogMode(2, "Intel® AMT Power Operation", 3, function() { meshserver.send({ action: 'poweraction', nodeids: [ currentNode._id ], actiontype: parseInt(op) + ((xxcurrentView == 12) ? 2 : 0) }); }, "Perform Intel® AMT power on to BIOS?");
+ } else if (op == 312) { // Intel AMT reset to BIOS
+ setDialogMode(2, "Intel® AMT Power Operation", 3, function() { meshserver.send({ action: 'poweraction', nodeids: [ currentNode._id ], actiontype: parseInt(op) + ((xxcurrentView == 12) ? 2 : 0) }); }, "Perform Intel® AMT reset to BIOS?");
} else if ((op == 400) || (op == 401)) {
// Flash / vibrate
meshserver.send({ action: 'poweraction', nodeids: [ currentNode._id ], actiontype: parseInt(op), time: parseInt(Q('d2devicetime').value) });