From 4823d6b98c7c9cb48746a98b3efb7623e46de48c Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Thu, 11 Jul 2019 16:54:27 -0700 Subject: [PATCH] Added Intel AMT power actions to MeshCMD --- agents/MeshCmd-signed.exe | Bin 4090560 -> 4095232 bytes agents/MeshCmd64-signed.exe | Bin 3673280 -> 3677952 bytes agents/meshcmd.js | 91 ++++++++++++++++++++++++++++++++++- agents/meshcmd.min.js | 91 ++++++++++++++++++++++++++++++++++- package.json | 2 +- views/default-min.handlebars | 2 +- views/default.handlebars | 2 +- webserver.js | 2 +- 8 files changed, 184 insertions(+), 6 deletions(-) diff --git a/agents/MeshCmd-signed.exe b/agents/MeshCmd-signed.exe index bb5c6aff32e918e826d31f5ee95c74840817d703..1e7260250ca7152c3b730e763f641ed174838f5d 100644 GIT binary patch delta 3708 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 diff --git a/agents/MeshCmd64-signed.exe b/agents/MeshCmd64-signed.exe index cf3893d0b07abf6f221fc7ceb247f2663c0dfe26..f99c19f7e83b0c76f431d4cbaa3dd2274957ef87 100644 GIT binary patch delta 3686 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 RWIfoi6($>>Ws*pwe*x^9w?O~^ diff --git a/agents/meshcmd.js b/agents/meshcmd.js index 618e9ff0..bdbe7f7c 100644 --- a/agents/meshcmd.js +++ b/agents/meshcmd.js @@ -113,7 +113,7 @@ function run(argv) { //console.log('addedModules = ' + JSON.stringify(addedModules)); var actionpath = 'meshaction.txt'; if (args.actionfile != null) { actionpath = args.actionfile; } - var actions = ['HELP', 'ROUTE', 'MICROLMS', 'AMTLOADWEBAPP', 'AMTLOADSMALLWEBAPP', 'AMTLOADLARGEWEBAPP', 'AMTCLEARWEBAPP', 'AMTSTORAGESTATE', 'AMTINFO', 'AMTINFODEBUG', 'AMTVERSIONS', 'AMTHASHES', 'AMTSAVESTATE', 'AMTSCRIPT', 'AMTUUID', 'AMTCCM', 'AMTACM', 'AMTDEACTIVATE', 'AMTACMDEACTIVATE', 'SMBIOS', 'RAWSMBIOS', 'MESHCOMMANDER', 'AMTAUDITLOG', 'AMTPRESENCE']; + var actions = ['HELP', 'ROUTE', 'MICROLMS', 'AMTPOWER', 'AMTLOADWEBAPP', 'AMTLOADSMALLWEBAPP', 'AMTLOADLARGEWEBAPP', 'AMTCLEARWEBAPP', 'AMTSTORAGESTATE', 'AMTINFO', 'AMTINFODEBUG', 'AMTVERSIONS', 'AMTHASHES', 'AMTSAVESTATE', 'AMTSCRIPT', 'AMTUUID', 'AMTCCM', 'AMTACM', 'AMTDEACTIVATE', 'AMTACMDEACTIVATE', 'SMBIOS', 'RAWSMBIOS', 'MESHCOMMANDER', 'AMTAUDITLOG', 'AMTPRESENCE']; // Load the action file var actionfile = null; @@ -186,6 +186,7 @@ function run(argv) { console.log(' AmtStorageState - Show contents of the Intel AMT web storage.'); console.log(' AmtSaveState - Save all Intel AMT WSMAN object to file.'); console.log(' AmtPresence - Heartbeat a local Intel AMT watchdog agent.'); + console.log(' AmtPower - Perform remote Intel AMT power operation.'); console.log(' AmtScript - Run .mescript on Intel AMT.'); console.log(' AmtIDER - Mount local disk image to remote computer.'); console.log('\r\nHelp on a specific action using:\r\n'); @@ -295,6 +296,15 @@ function run(argv) { console.log(' --user [username] The Intel AMT login username, admin is default.'); console.log(' --pass [password] The Intel AMT login password.'); console.log(' --tls Specifies that TLS must be used.'); + } else if (action == 'amtpower') { + console.log('AmtPower will get current pwoer state or send a reboot command to a remote Intel AMT device. Example usage:\r\n\r\n meshcmd amtpower --reset --host 1.2.3.4 --user admin --pass mypassword --tls'); + console.log('\r\nRequired arguments:\r\n'); + console.log(' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.'); + console.log(' --pass [password] The Intel AMT login password.'); + console.log('\r\nOptional arguments:\r\n'); + console.log(' --reset, --poweron, --poweroff, --powercycle, --sleep, --hibernate'); + console.log(' --user [username] The Intel AMT login username, admin is default.'); + console.log(' --tls Specifies that TLS must be used.'); } else if (action == 'meshcommander') { console.log('This action launched a local web server that hosts MeshCommander, a Intel AMT management console.'); console.log('\r\nPossible arguments:\r\n'); @@ -572,6 +582,38 @@ function run(argv) { if ((settings.cdrom == null) || (typeof settings.cdrom != 'string') || (settings.cdrom == '')) { settings.cdrom = null; } if ((settings.floppy == null) && (settings.cdrom == null)) { console.log('No or invalid \"floppy\" or \"cdrom\" specified, use --floppy [file] or --cdrom [file].'); exit(1); return; } performIder(); + } else if (settings.action == 'amtpower') { // Perform remote Intel AMT power operation + if ((settings.hostname == null) || (typeof settings.hostname != 'string') || (settings.hostname == '')) { console.log('No or invalid \"hostname\" specified, use --hostname [host].'); exit(1); return; } + if ((settings.password == null) || (typeof settings.password != 'string') || (settings.password == '')) { console.log('No or invalid \"password\" specified, use --password [password].'); exit(1); return; } + if ((settings.username == null) || (typeof settings.username != 'string') || (settings.username == '')) { settings.username = 'admin'; } + + /* + 2 = Power On + 3 = Sleep - Light + 4 = Sleep - Deep + 5 = Power Cycle (Off Soft) + 6 = Power Off - Hard + 7 = Hibernate + 8 = Power Off - Soft + 9 = Power Cycle (Off Hard) + 10 = Master Bus Reset + 11 = Diagnostic Interrupt (NMI) + 12 = Power Off - Soft Graceful + 13 = Power Off - Hard Graceful + 14 = Master Bus Reset Graceful + 15 = Power Cycle (Off - Soft Graceful) + 16 = Power Cycle (Off - Hard Graceful) + */ + + settings.poweraction = 0; + if (args.poweron) { settings.poweraction = 2; } + if (args.sleep) { settings.poweraction = 3; } + if (args.powercycle) { settings.poweraction = 5; } + if (args.poweroff) { settings.poweraction = 6; } + if (args.hibernate) { settings.poweraction = 7; } + if (args.reset) { settings.poweraction = 10; } + //if (settings.poweraction == 0) { console.log('No power action, specify --poweron, --sleep, --powercycle, --poweroff, --hibernate, --reset.'); exit(1); return; } + performAmtPowerAction(); } else { console.log('Invalid \"action\" specified.'); exit(1); return; } @@ -2027,6 +2069,53 @@ function iderSectorStats(mode, dev, mediaBlocks, lba, len) { iderIdleTimer = setTimeout(function () { console.log('Idle timeout'); process.exit(1); }, 1000 * settings.timeout); } + +// +// Intel AMT Remote Power Action +// + +function performAmtPowerAction() { + var transport = require('amt-wsman-duk'); + var wsman = require('amt-wsman'); + var amt = require('amt'); + wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls); + amtstack = new amt(wsstack); + if (settings.poweraction != 0) { + // Set the power state + amtstack.RequestPowerStateChange(settings.poweraction, performAmtPowerActionEx); + } else { + // Get the power state + amtstack.Get("CIM_AssociatedPowerManagementService", performAmtPowerActionEx2, 0, 1); + } +} + +function performAmtPowerActionEx(stack, name, response, status) { + if (status == 200) { + console.log(response.Body.ReturnValueStr.split('_').join(' ')); + process.exit(0); + } else { + console.log('Error, status ' + status + '.'); + process.exit(1); + } +} + +var DMTFPowerStates = ["", "", "Power on", "Light sleep", "Deep sleep", "Power cycle (Soft off)", "Off - Hard", "Hibernate (Off soft)", "Soft off", "Power cycle (Off-hard)", "Master bus reset", "Diagnostic interrupt (NMI)", "Not applicable", "Off - Soft graceful", "Off - Hard graceful", "Master bus reset graceful", "Power cycle (Off - Soft graceful)", "Power cycle (Off - Hard graceful)", "Diagnostic interrupt (INIT)"]; +function performAmtPowerActionEx2(stack, name, response, status) { + if (status == 200) { + var powerNumber = parseInt(response.Body.PowerState); + if ((powerNumber >= DMTFPowerStates.length) && (powerNumber > 1)) { + console.log('Unknown power state: ' + response.Body.PowerState); + } else { + console.log('Current power state: ' + DMTFPowerStates[powerNumber]); + } + process.exit(0); + } else { + console.log('Error, status ' + status + '.'); + process.exit(1); + } +} + + // // Startup // diff --git a/agents/meshcmd.min.js b/agents/meshcmd.min.js index 618e9ff0..bdbe7f7c 100644 --- a/agents/meshcmd.min.js +++ b/agents/meshcmd.min.js @@ -113,7 +113,7 @@ function run(argv) { //console.log('addedModules = ' + JSON.stringify(addedModules)); var actionpath = 'meshaction.txt'; if (args.actionfile != null) { actionpath = args.actionfile; } - var actions = ['HELP', 'ROUTE', 'MICROLMS', 'AMTLOADWEBAPP', 'AMTLOADSMALLWEBAPP', 'AMTLOADLARGEWEBAPP', 'AMTCLEARWEBAPP', 'AMTSTORAGESTATE', 'AMTINFO', 'AMTINFODEBUG', 'AMTVERSIONS', 'AMTHASHES', 'AMTSAVESTATE', 'AMTSCRIPT', 'AMTUUID', 'AMTCCM', 'AMTACM', 'AMTDEACTIVATE', 'AMTACMDEACTIVATE', 'SMBIOS', 'RAWSMBIOS', 'MESHCOMMANDER', 'AMTAUDITLOG', 'AMTPRESENCE']; + var actions = ['HELP', 'ROUTE', 'MICROLMS', 'AMTPOWER', 'AMTLOADWEBAPP', 'AMTLOADSMALLWEBAPP', 'AMTLOADLARGEWEBAPP', 'AMTCLEARWEBAPP', 'AMTSTORAGESTATE', 'AMTINFO', 'AMTINFODEBUG', 'AMTVERSIONS', 'AMTHASHES', 'AMTSAVESTATE', 'AMTSCRIPT', 'AMTUUID', 'AMTCCM', 'AMTACM', 'AMTDEACTIVATE', 'AMTACMDEACTIVATE', 'SMBIOS', 'RAWSMBIOS', 'MESHCOMMANDER', 'AMTAUDITLOG', 'AMTPRESENCE']; // Load the action file var actionfile = null; @@ -186,6 +186,7 @@ function run(argv) { console.log(' AmtStorageState - Show contents of the Intel AMT web storage.'); console.log(' AmtSaveState - Save all Intel AMT WSMAN object to file.'); console.log(' AmtPresence - Heartbeat a local Intel AMT watchdog agent.'); + console.log(' AmtPower - Perform remote Intel AMT power operation.'); console.log(' AmtScript - Run .mescript on Intel AMT.'); console.log(' AmtIDER - Mount local disk image to remote computer.'); console.log('\r\nHelp on a specific action using:\r\n'); @@ -295,6 +296,15 @@ function run(argv) { console.log(' --user [username] The Intel AMT login username, admin is default.'); console.log(' --pass [password] The Intel AMT login password.'); console.log(' --tls Specifies that TLS must be used.'); + } else if (action == 'amtpower') { + console.log('AmtPower will get current pwoer state or send a reboot command to a remote Intel AMT device. Example usage:\r\n\r\n meshcmd amtpower --reset --host 1.2.3.4 --user admin --pass mypassword --tls'); + console.log('\r\nRequired arguments:\r\n'); + console.log(' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.'); + console.log(' --pass [password] The Intel AMT login password.'); + console.log('\r\nOptional arguments:\r\n'); + console.log(' --reset, --poweron, --poweroff, --powercycle, --sleep, --hibernate'); + console.log(' --user [username] The Intel AMT login username, admin is default.'); + console.log(' --tls Specifies that TLS must be used.'); } else if (action == 'meshcommander') { console.log('This action launched a local web server that hosts MeshCommander, a Intel AMT management console.'); console.log('\r\nPossible arguments:\r\n'); @@ -572,6 +582,38 @@ function run(argv) { if ((settings.cdrom == null) || (typeof settings.cdrom != 'string') || (settings.cdrom == '')) { settings.cdrom = null; } if ((settings.floppy == null) && (settings.cdrom == null)) { console.log('No or invalid \"floppy\" or \"cdrom\" specified, use --floppy [file] or --cdrom [file].'); exit(1); return; } performIder(); + } else if (settings.action == 'amtpower') { // Perform remote Intel AMT power operation + if ((settings.hostname == null) || (typeof settings.hostname != 'string') || (settings.hostname == '')) { console.log('No or invalid \"hostname\" specified, use --hostname [host].'); exit(1); return; } + if ((settings.password == null) || (typeof settings.password != 'string') || (settings.password == '')) { console.log('No or invalid \"password\" specified, use --password [password].'); exit(1); return; } + if ((settings.username == null) || (typeof settings.username != 'string') || (settings.username == '')) { settings.username = 'admin'; } + + /* + 2 = Power On + 3 = Sleep - Light + 4 = Sleep - Deep + 5 = Power Cycle (Off Soft) + 6 = Power Off - Hard + 7 = Hibernate + 8 = Power Off - Soft + 9 = Power Cycle (Off Hard) + 10 = Master Bus Reset + 11 = Diagnostic Interrupt (NMI) + 12 = Power Off - Soft Graceful + 13 = Power Off - Hard Graceful + 14 = Master Bus Reset Graceful + 15 = Power Cycle (Off - Soft Graceful) + 16 = Power Cycle (Off - Hard Graceful) + */ + + settings.poweraction = 0; + if (args.poweron) { settings.poweraction = 2; } + if (args.sleep) { settings.poweraction = 3; } + if (args.powercycle) { settings.poweraction = 5; } + if (args.poweroff) { settings.poweraction = 6; } + if (args.hibernate) { settings.poweraction = 7; } + if (args.reset) { settings.poweraction = 10; } + //if (settings.poweraction == 0) { console.log('No power action, specify --poweron, --sleep, --powercycle, --poweroff, --hibernate, --reset.'); exit(1); return; } + performAmtPowerAction(); } else { console.log('Invalid \"action\" specified.'); exit(1); return; } @@ -2027,6 +2069,53 @@ function iderSectorStats(mode, dev, mediaBlocks, lba, len) { iderIdleTimer = setTimeout(function () { console.log('Idle timeout'); process.exit(1); }, 1000 * settings.timeout); } + +// +// Intel AMT Remote Power Action +// + +function performAmtPowerAction() { + var transport = require('amt-wsman-duk'); + var wsman = require('amt-wsman'); + var amt = require('amt'); + wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls); + amtstack = new amt(wsstack); + if (settings.poweraction != 0) { + // Set the power state + amtstack.RequestPowerStateChange(settings.poweraction, performAmtPowerActionEx); + } else { + // Get the power state + amtstack.Get("CIM_AssociatedPowerManagementService", performAmtPowerActionEx2, 0, 1); + } +} + +function performAmtPowerActionEx(stack, name, response, status) { + if (status == 200) { + console.log(response.Body.ReturnValueStr.split('_').join(' ')); + process.exit(0); + } else { + console.log('Error, status ' + status + '.'); + process.exit(1); + } +} + +var DMTFPowerStates = ["", "", "Power on", "Light sleep", "Deep sleep", "Power cycle (Soft off)", "Off - Hard", "Hibernate (Off soft)", "Soft off", "Power cycle (Off-hard)", "Master bus reset", "Diagnostic interrupt (NMI)", "Not applicable", "Off - Soft graceful", "Off - Hard graceful", "Master bus reset graceful", "Power cycle (Off - Soft graceful)", "Power cycle (Off - Hard graceful)", "Diagnostic interrupt (INIT)"]; +function performAmtPowerActionEx2(stack, name, response, status) { + if (status == 200) { + var powerNumber = parseInt(response.Body.PowerState); + if ((powerNumber >= DMTFPowerStates.length) && (powerNumber > 1)) { + console.log('Unknown power state: ' + response.Body.PowerState); + } else { + console.log('Current power state: ' + DMTFPowerStates[powerNumber]); + } + process.exit(0); + } else { + console.log('Error, status ' + status + '.'); + process.exit(1); + } +} + + // // Startup // diff --git a/package.json b/package.json index 6fe9c9ec..f27b5ffc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "meshcentral", - "version": "0.3.7-o", + "version": "0.3.7-p", "keywords": [ "Remote Management", "Intel AMT", diff --git a/views/default-min.handlebars b/views/default-min.handlebars index cdcda4f1..c33107c1 100644 --- a/views/default-min.handlebars +++ b/views/default-min.handlebars @@ -1 +1 @@ - {{{title}}}
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

 

\ No newline at end of file + {{{title}}}
{{{title}}}
{{{title2}}}

{{{logoutControl}}}

 

\ No newline at end of file diff --git a/views/default.handlebars b/views/default.handlebars index 8925c107..a9f0f240 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -3842,7 +3842,7 @@ // Add node name var nname = EscapeHtml(node.name); if (nname.length == 0) { nname = 'None'; } - if (((meshrights & 4) != 0) && ((!mesh.flags) || ((mesh.flags & 2) == 0))) { nname = '' + nname + ' '; } + if (((meshrights & 4) != 0) && ((!mesh.flags) || ((mesh.flags & 2) == 0))) { nname = '' + nname + ' '; } QH('p10deviceName', nname); QH('p11deviceName', nname); QH('p12deviceName', nname); diff --git a/webserver.js b/webserver.js index eccd4597..397dff49 100644 --- a/webserver.js +++ b/webserver.js @@ -2584,7 +2584,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'text/plain', 'Content-Disposition': 'attachment; filename="' + scriptInfo.rname + '"' }); var data = scriptInfo.data; var cmdoptions = { wgetoptionshttp: '', wgetoptionshttps: '', curloptionshttp: '-L ', curloptionshttps: '-L ' } - if (isTrustedCert() == false) { + if (isTrustedCert() != true) { cmdoptions.wgetoptionshttps += '--no-check-certificate '; cmdoptions.curloptionshttps += '-k '; }