MeshCentral/agents/meshcmd.js

871 lines
438 KiB
JavaScript
Raw Normal View History

2018-01-30 21:23:57 -05:00
/*
Copyright 2018 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @description MeshCmd, command line tool for Intel AMT and MeshCentral.
* @author Ylian Saint-Hilaire
* @version v0.2.0
*/
2018-03-06 20:50:44 -05:00
//console.displayFinalizerMessages = 1;
2017-10-31 19:19:58 -04:00
var fs = require('fs');
var os = require('os');
var net = require('net');
var http = require('http');
var dgram = require('dgram');
var httpHeaders = require('http-headers');
var tcpserver = null;
var broadcastSockets = {};
var multicastSockets = {};
var discoveryInterval = null;
var membershipIPv4 = '239.255.255.235';
var membershipIPv6 = 'FF02:0:0:0:0:0:0:FE';
var settings = null;
2018-01-30 21:23:57 -05:00
var meshCmdVersion = '***Mesh*Cmd*Version***'; // Dynamically replaced with MeshCentral version
var amtLms = null, amtMei = null, amtMeiState = null;
2018-02-07 21:45:14 -05:00
var wsstack = null, amtstack = null;
var oswsstack = null, osamtstack = null;
2018-03-06 20:50:44 -05:00
var amtMeiTmpState = null;
2018-02-07 21:45:14 -05:00
// MeshCommander for Firmware (GZIP'ed, Base64)
var Small_IntelAmtWebApp = "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
var Medium_IntelAmtWebApp = "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
var Large_IntelAmtWebApp = "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
2017-10-31 19:19:58 -04:00
// Check the server certificate fingerprint
function onVerifyServer(clientName, certs) {
2018-01-26 20:01:38 -05:00
if (certs == null) { certs = clientName; } // Temporary thing until we fix duktape
2017-10-31 19:19:58 -04:00
try { for (var i in certs) { if (certs[i].fingerprint.replace(/:/g, '') == settings.serverHttpsHash) { return; } } } catch (e) { }
if (serverhash != null) { console.log('Error: Failed to verify server certificate.'); throw 'Invalid server certificate'; }
2017-10-31 19:19:58 -04:00
}
2018-03-06 20:50:44 -05:00
// Various utility functions
2017-10-31 19:19:58 -04:00
function debug(level, message) { if ((settings.debugLevel != null) && (settings.debugLevel >= level)) { console.log(message); } }
function exit(status) { if (status == null) { status = 0; } try { process.exit(status); } catch (e) { } }
2018-03-06 20:50:44 -05:00
function getInstance(x, y) { for (var i in x) { if (x[i]["InstanceID"] == y) return x[i]; } return null; }
function md5hex(str) { return require('MD5Stream').create().syncHash(str).toString('hex'); }
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 parceArguments(argv) { var r = {}; for (var i in argv) { i = parseInt(i); if (argv[i].startsWith('--') == true) { var key = argv[i].substring(2).toLowerCase(), val = true; if (((i + 1) < argv.length) && (argv[i + 1].startsWith('--') == false)) { val = argv[i + 1]; } r[key] = val; } } return r; }
2017-11-02 21:44:27 -04:00
2018-01-30 21:23:57 -05:00
// Parse the incoming arguments
2017-10-31 19:19:58 -04:00
function run(argv) {
if (meshCmdVersion[0] == '*') { meshCmdVersion = ''; } else { meshCmdVersion = ' v' + meshCmdVersion; }
2017-11-02 21:44:27 -04:00
var args = parceArguments(argv);
2018-03-06 20:50:44 -05:00
//console.log('MeshCentral Command' + meshCmdVersion);
//console.log('addedModules = ' + JSON.stringify(addedModules));
2017-10-31 19:19:58 -04:00
var actionpath = 'meshaction.txt';
2017-11-02 21:44:27 -04:00
if (args.actionfile != null) { actionpath = args.actionfile; }
2018-03-06 20:50:44 -05:00
var actions = ['ROUTE', 'AMTLMS', 'AMTLOADWEBAPP', 'AMTLOADSMALLWEBAPP', 'AMTLOADLARGEWEBAPP', 'AMTCLEARWEBAPP', 'AMTSTORAGESTATE', 'MEINFO', 'MEVERSIONS', 'MEHASHES', 'AMTSAVESTATE', 'MESCRIPT', 'AMTUUID', 'AMTCCM', 'AMTDEACTIVATE'];
2017-10-31 19:19:58 -04:00
// Load the action file
var actionfile = null;
try { actionfile = fs.readFileSync(actionpath); } catch (e) { }
if ((actionpath != 'meshaction.txt') && (actionfile == null)) { console.log('Unable to load \"' + actionpath + '\". Create this file or specify the location using --actionfile [filename].'); exit(1); return; }
if (actionfile != null) { try { settings = JSON.parse(actionfile); } catch (e) { console.log(actionpath, e); exit(1); return; } } else { if (argv.length >= 2) { settings = { action: argv[1] } } }
2017-12-15 16:43:04 -05:00
if (settings == null) { settings = {}; }
2017-10-31 19:19:58 -04:00
2017-11-02 21:44:27 -04:00
// Set the arguments
2017-12-15 16:43:04 -05:00
if ((typeof args.action) == 'string') { settings.action = args.action; }
2017-11-02 21:44:27 -04:00
if ((typeof args.localport) == 'string') { settings.localport = parseInt(args.localport); }
if ((typeof args.remotenodeid) == 'string') { settings.remoteNodeId = args.remotenodeid; }
if ((typeof args.username) == 'string') { settings.username = args.username; }
if ((typeof args.password) == 'string') { settings.password = args.password; }
if ((typeof args.user) == 'string') { settings.username = args.user; }
if ((typeof args.pass) == 'string') { settings.password = args.pass; }
if ((typeof args.host) == 'string') { settings.hostname = args.host; }
if ((typeof args.hostname) == 'string') { settings.hostname = args.hostname; }
2017-11-02 21:44:27 -04:00
if ((typeof args.serverid) == 'string') { settings.serverId = args.serverid; }
if ((typeof args.serverhttpshash) == 'string') { settings.serverHttpsHash = args.serverhttpshash; }
if ((typeof args.remoteport) == 'string') { settings.remotePort = parseInt(args.remoteport); }
2018-01-25 19:12:53 -05:00
if ((typeof args.out) == 'string') { settings.output = args.out; }
if ((typeof args.output) == 'string') { settings.output = args.output; }
if ((typeof args.debug) == 'string') { settings.debugLevel = parseInt(args.debug); }
if ((typeof args.script) == 'string') { settings.script = args.script; }
2018-01-25 19:28:52 -05:00
if (args.noconsole) { settings.noconsole = true; }
if (args.nocommander) { settings.noconsole = true; }
2018-01-25 19:12:53 -05:00
if (args.lmsdebug) { settings.lmsdebug = true; }
if (args.tls) { settings.tls = true; }
2017-12-15 16:43:04 -05:00
if ((argv.length > 1) && (actions.indexOf(argv[1].toUpperCase()) >= 0)) { settings.action = argv[1]; }
2017-11-02 21:44:27 -04:00
2017-10-31 19:19:58 -04:00
// Validate meshaction.txt
2018-03-06 20:50:44 -05:00
if (settings.action == null) { console.log('No action specified, valid actions are: ' + actions.join(', ') + '.'); exit(1); return; }
2017-10-31 19:19:58 -04:00
settings.action = settings.action.toLowerCase();
debug(1, "Settings: " + JSON.stringify(settings));
2018-01-30 21:23:57 -05:00
if (settings.action == 'route') {
// MeshCentral Router, port map local TCP port to a remote computer
if ((settings.localPort == null) || (typeof settings.localPort != 'number') || (settings.localPort < 0) || (settings.localPort > 65535)) { console.log('No or invalid \"localPort\" specified, use --localport [localport].'); exit(1); return; }
if ((settings.remoteNodeId == null) || (typeof settings.remoteNodeId != 'string')) { console.log('No or invalid \"remoteNodeId\" specified.'); exit(1); return; }
if ((settings.username == null) || (typeof settings.username != 'string') || (settings.username == '')) { console.log('No or invalid \"username\" specified, use --username [username].'); 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.serverId == null) || (typeof settings.serverId != 'string') || (settings.serverId.length != 96)) { console.log('No or invalid \"serverId\" specified.'); exit(1); return; }
if ((settings.serverHttpsHash == null) || (typeof settings.serverHttpsHash != 'string') || (settings.serverHttpsHash.length != 96)) { console.log('No or invalid \"serverHttpsHash\" specified.'); exit(1); return; }
if ((settings.remotePort == null) || (typeof settings.remotePort != 'number') || (settings.remotePort < 0) || (settings.remotePort > 65535)) { console.log('No or invalid \"remotePort\" specified, use --remoteport [remoteport].'); exit(1); return; }
if (settings.serverUrl != null) { startRouter(); } else { discoverMeshServer(); } // Start MeshCentral Router
}
2017-12-15 16:43:04 -05:00
else if ((settings.action == 'amtloadwebapp') || (settings.action == 'amtloadsmallwebapp') || (settings.action == 'amtloadlargewebapp') || (settings.action == 'amtclearwebapp') || (settings.action == 'amtstoragestate')) { // Intel AMT Web Application Actions
2018-01-30 21:23:57 -05:00
// Intel AMT 11.6+ Load MeshCommander into firmware
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.hostname == null) || (typeof settings.hostname != 'string') || (settings.hostname == '')) { settings.hostname = '127.0.0.1'; }
if ((settings.username == null) || (typeof settings.username != 'string') || (settings.username == '')) { settings.username = 'admin'; }
settings.protocol = 'http:';
settings.localport = 16992;
debug(1, "Settings: " + JSON.stringify(settings));
digest = require('http-digest').create(settings.username, settings.password);
digest.http = require('http');
2017-12-15 16:43:04 -05:00
if (settings.action == 'amtstoragestate') {
getAmtStorage(function (statusCode, data) { if (statusCode == 200) { console.log("Storage State: " + JSON.stringify(data, null, 2)); exit(); return; } else { console.log("Unable to read storage state."); exit(); return; } });
} else {
2017-12-15 16:43:04 -05:00
if (settings.action == 'amtloadwebapp') { settings.webapp = Medium_IntelAmtWebApp; }
else if (settings.action == 'amtloadsmallwebapp') { settings.webapp = Small_IntelAmtWebApp; }
else if (settings.action == 'amtloadlargewebapp') { settings.webapp = Large_IntelAmtWebApp; }
else if (settings.action == 'amtclearwebapp') { settings.webapp = null; }
nextStepStorageUpload();
}
} else if ((settings.action == 'meversion') || (settings.action == 'meversions') || (settings.action == 'mever')) {
2018-01-30 21:23:57 -05:00
// Display Intel AMT versions
var amtMeiModule = require('amt-mei');
var amtMei = new amtMeiModule();
2018-01-25 19:28:52 -05:00
amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; });
amtMei.on('connect', function () {
this.getVersion(function (val) {
console.log("MEI Version = " + val.BiosVersion.toString());
for (var version in val.Versions) { console.log(val.Versions[version].Description + " = " + val.Versions[version].Version); }
exit(1); return;
});
});
} else if (settings.action == 'mehashes') {
2018-01-30 21:23:57 -05:00
// Display Intel AMT list of trusted hashes
var amtMeiModule = require('amt-mei');
var amtMei = new amtMeiModule();
2018-01-25 19:28:52 -05:00
amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; });
amtMei.on('connect', function () {
this.getHashHandles(function (handles) {
exitOnCount = handles.length;
for (var i = 0; i < handles.length; ++i) {
this.getCertHashEntry(handles[i], function (result) {
2018-01-25 19:28:52 -05:00
console.log(result.name + ', (' + (result.isDefault ? 'Default' : '') + (result.isActive ? ', Active' : ', Disabled') + ')\r\n ' + result.hashAlgorithmStr + ': ' + result.certificateHash);
if (--exitOnCount == 0) { exit(1); }
});
}
});
});
} else if (settings.action == 'meinfo') {
2018-01-30 21:23:57 -05:00
// Display Intel AMT version and activation state
var amtMeiModule = require('amt-mei');
var amtMei = new amtMeiModule();
2018-01-25 19:28:52 -05:00
amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; });
amtMei.on('connect', function () {
mestate = {};
this.getVersion(function (val) { for (var version in val.Versions) { if (val.Versions[version].Description == 'AMT') { mestate.ver = val.Versions[version].Version; } } });
this.getProvisioningState(function (result) { mestate.ProvisioningState = result; });
this.getProvisioningMode(function (result) { mestate.ProvisioningMode = result; });
this.getEHBCState(function (result) { mestate.ehbc = result; });
this.getControlMode(function (result) { mestate.controlmode = result; });
this.getMACAddresses(function (result) { mestate.mac = result; });
this.getDnsSuffix(function (result) {
mestate.dns = result;
var str = 'Intel AMT v' + mestate.ver;
2017-12-15 16:43:04 -05:00
if (mestate.ProvisioningState.stateStr == 'PRE') { str += ', pre-provisioning state'; }
else if (mestate.ProvisioningState.stateStr == 'IN') { str += ', in-provisioning state'; }
else if (mestate.ProvisioningState.stateStr == 'POST') { if (mestate.ProvisioningMode.modeStr == 'ENTERPRISE') { str += ', activated in ' + ["none", "client control mode", "admin control mode", "remote assistance mode"][mestate.controlmode.controlMode]; } else { str += ', activated in ' + mestate.ProvisioningMode.modeStr; } }
if (mestate.ehbc.EHBC == true) { str += ', EHBC enabled'; }
console.log(str + '.');
exit(1);
});
});
2018-01-02 19:52:49 -05:00
} else if (settings.action == 'amtsavestate') {
2018-01-30 21:23:57 -05:00
// Save the entire state of Intel AMT info a JSON file
2018-01-25 19:12:53 -05:00
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.hostname == null) || (typeof settings.hostname != 'string') || (settings.hostname == '')) { settings.hostname = '127.0.0.1'; }
if ((settings.username == null) || (typeof settings.username != 'string') || (settings.username == '')) { settings.username = 'admin'; }
if ((settings.output == null) || (typeof settings.output != 'string') || (settings.output == '')) { console.log('No or invalid \"output\" file specified, use --output [filename].'); exit(1); return; }
settings.protocol = 'http:';
settings.localport = 16992;
debug(1, "Settings: " + JSON.stringify(settings));
2018-01-02 19:52:49 -05:00
saveEntireAmtState();
2017-12-15 16:43:04 -05:00
} else if (settings.action == 'amtlms') {
2018-01-30 21:23:57 -05:00
// Start Intel AMT MicroLMS
startLms(function (state) { console.log(['MicroLMS did not start. MicroLMS must run as administrator or LMS any already be active.', 'MicroLMS started.', 'MicroLMS started, MeshCommander on HTTP/16994.', 'MEI error'][state]); if (state == 0) { exit(0); } });
} else if (settings.action == 'mescript') {
// Start running a MEScript
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.hostname == null) || (typeof settings.hostname != 'string') || (settings.hostname == '')) { settings.hostname = '127.0.0.1'; }
if ((settings.username == null) || (typeof settings.username != 'string') || (settings.username == '')) { settings.username = 'admin'; }
2018-03-06 20:50:44 -05:00
if ((settings.script == null) || (typeof settings.script != 'string') || (settings.script == '')) { if (mescriptJSON != '') { settings.scriptJSON = mescriptJSON; } else { console.log('No or invalid \"script\" file specified, use --script [filename].'); exit(1); return; } }
startMeScript();
2018-03-06 20:50:44 -05:00
} else if (settings.action == 'amtuuid') {
// Start running
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.hostname == null) || (typeof settings.hostname != 'string') || (settings.hostname == '')) { settings.hostname = '127.0.0.1'; }
if ((settings.username == null) || (typeof settings.username != 'string') || (settings.username == '')) { settings.username = 'admin'; }
settings.protocol = 'http:';
settings.localport = 16992;
debug(1, "Settings: " + JSON.stringify(settings));
getAmtUuid();
} else if (settings.action == 'amtccm') {
// Start activation to CCM
if ((settings.password == null) || (typeof settings.password != 'string') || (settings.password == '')) { console.log('No or invalid \"password\" specified, use --password [password].'); exit(1); return; }
settings.protocol = 'http:';
settings.localport = 16992;
debug(1, "Settings: " + JSON.stringify(settings));
activeToCCM();
} else if (settings.action == 'amtdeactivate') {
// Deactivate CCM
debug(1, "Settings: " + JSON.stringify(settings));
deactivateCCM();
2017-10-31 19:19:58 -04:00
} else {
console.log('Invalid \"action\" specified.'); exit(1); return;
2017-10-31 19:19:58 -04:00
}
}
2017-10-31 19:19:58 -04:00
2018-03-06 20:50:44 -05:00
//
// Deactivate Intel AMT CCM
//
// When called, this will use MEI to deactivate Intel AMT when it's in CCM mode. Simply calls "unprovision" on MEI and checks the return code.
function deactivateCCM() {
var amtMeiModule = require('amt-mei');
var amtMei = new amtMeiModule();
amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; });
amtMei.on('connect', function () { amtMei.unprovision(1, function (status) { if (status == 0) { console.log('Success'); } else { console.log('Error ' + status); } exit(1); }); });
}
//
// Activate Intel AMT to CCM
//
function activeToCCM() {
// See if MicroLMS needs to be started and setup the $$OsAdmin wsman stack
settings.noconsole = true;
startLms(activeToCCMEx); // TODO: Fix this so that it works even if LMS already running.
}
function activeToCCMEx(state) {
osamtstack.BatchEnum(null, ['*AMT_GeneralSettings', '*IPS_HostBasedSetupService'], activeToCCMEx2);
}
function activeToCCMEx2(stack, name, responses, status) {
if (status != 200) { console.log('Failed to fetch activation status, status ' + status); exit(1); }
else if (responses['IPS_HostBasedSetupService'].response['AllowedControlModes'].length != 2) { console.log('Client control mode activation not allowed'); exit(1); }
else { osamtstack.IPS_HostBasedSetupService_Setup(2, md5hex('admin:' + responses['AMT_GeneralSettings'].response['DigestRealm'] + ':' + settings.password).substring(0,32), null, null, null, null, activeToCCMEx3); }
}
function activeToCCMEx3(stack, name, responses, status) {
if (status != 200) { console.log('Failed to activate, status ' + status); }
else if (responses.Body.ReturnValue != 0) { console.log('Client control mode activation failed: ' + responses.Body.ReturnValueStr); }
else { console.log('Success'); exit(0); }
exit(1);
}
//
// Get AMT UUID
//
// Called to get the UUID of Intel AMT, start by setting up MicroLMS if we are doing the operation on the local computer
function getAmtUuid() {
// See if MicroLMS needs to be started
if ((settings.hostname == '127.0.0.1') || (settings.hostname.toLowerCase() == 'localhost')) { settings.noconsole = true; startLms(getAmtUuidEx); } else { getAmtUuidEx() };
}
// Fetch the computer's UUID by fetching the CIM_ComputerSystemPackage WSMAN object.
function getAmtUuidEx() {
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);
amtstack.Get("CIM_ComputerSystemPackage", function (obj, name, response, xstatus, tag) {
if (xstatus == 200) { console.log("GUID: " + guidToStr(response.Body.PlatformGUID.toLowerCase())); } else { console.log("Intel AMT is not available or not activated."); } exit(1);
});
}
//
// Run MESCRIPT
//
2018-03-06 20:50:44 -05:00
// Run a .mescript targeting local or remote Intel AMT.
function startMeScript() {
// See if MicroLMS needs to be started
if ((settings.hostname == '127.0.0.1') || (settings.hostname.toLowerCase() == 'localhost')) { settings.noconsole = true; startLms(startMeScriptEx); return; } else { startMeScriptEx(); }
}
function startMeScriptEx() {
2018-03-06 20:50:44 -05:00
//console.log('Running script...');
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);
2018-02-07 21:45:14 -05:00
//IntelAmtEntireStateProgress = 101;
//amtstack.onProcessChanged = onWsmanProcessChanged;
var scriptData = null;
2018-03-06 20:50:44 -05:00
if (settings.script != null) {
try { scriptData = fs.readFileSync(settings.script); } catch (e) { console.log('Unable to read script file (1): ' + settings.script + '.'); exit(1); return; }
} else {
scriptData = settings.scriptJSON;
}
if (scriptData == null) { console.log('Unable to read script file (2): ' + settings.script + '.'); exit(1); return; }
try { scriptData = JSON.parse(scriptData); } catch (e) { console.log('Unable to read script file (3): ' + settings.script + '.'); exit(1); return; }
if (scriptData.mescript == null) { console.log('Unable to read script file (4): ' + settings.script + '.'); exit(1); return; }
var scriptData = Buffer.from(scriptData.mescript, 'base64');
var scriptModule = require('amt-script');
var script = scriptModule.setup(scriptData, {})
script.amtstack = amtstack;
script.start();
2018-03-06 20:50:44 -05:00
script.onCompleted = function () { exit(1);}
}
2018-01-30 21:23:57 -05:00
2018-03-06 20:50:44 -05:00
2018-01-30 21:23:57 -05:00
//
// FETCH ALL INTEL AMT STATE
//
2018-01-02 19:52:49 -05:00
// Save the entire Intel AMT state
function saveEntireAmtState() {
2018-01-25 19:28:52 -05:00
// See if MicroLMS needs to be started
if ((settings.hostname == '127.0.0.1') || (settings.hostname.toLowerCase() == 'localhost')) { settings.noconsole = true; startLms(); }
2018-01-25 19:12:53 -05:00
console.log('Fetching all Intel AMT state, this may take a few minutes...');
2018-01-30 21:23:57 -05:00
var transport = require('amt-wsman-duk');
var wsman = require('amt-wsman');
var amt = require('amt');
2018-01-25 19:12:53 -05:00
wsstack = new wsman(transport, settings.hostname, settings.tls?16993:16992, settings.username, settings.password, settings.tls);
2018-01-02 19:52:49 -05:00
amtstack = new amt(wsstack);
2018-01-25 19:28:52 -05:00
amtstack.onProcessChanged = onWsmanProcessChanged;
//var AllWsman = "AMT_GeneralSystemDefenseCapabilities".split(',');
2018-01-02 19:52:49 -05:00
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_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_PolicyR
2018-01-25 19:28:52 -05:00
IntelAmtEntireStateProgress = 101;
2018-01-02 19:52:49 -05:00
IntelAmtEntireStateCalls = 3;
IntelAmtEntireState = { 'localtime': Date(), 'utctime': new Date().toUTCString(), 'isotime': new Date().toISOString() };
amtstack.BatchEnum(null, AllWsman, saveEntireAmtStateOk2, null, true);
amtstack.GetAuditLog(saveEntireAmtStateOk3);
amtstack.GetMessageLog(saveEntireAmtStateOk4);
}
2018-01-25 19:28:52 -05:00
function onWsmanProcessChanged(a, b) { var x = Math.floor((a * 100) / b); if (x < IntelAmtEntireStateProgress) { IntelAmtEntireStateProgress = x; console.log((100 - x) + '%'); } }
function saveEntireAmtStateOk2(stack, name, responses, status) { if (status == 600) { console.log('ERROR: Unable to connect to Intel(R) AMT.'); exit(2); } IntelAmtEntireState['wsmanenums'] = responses; saveEntireAmtStateDone(); }
function saveEntireAmtStateOk3(stack, messages, status) { if (status == 600) { console.log('ERROR: Unable to connect to Intel(R) AMT.'); exit(2); } IntelAmtEntireState['auditlog'] = messages; saveEntireAmtStateDone(); }
function saveEntireAmtStateOk4(stack, messages, tag, status) { if (status == 600) { console.log('ERROR: Unable to connect to Intel(R) AMT.'); exit(2); } IntelAmtEntireState['eventlog'] = messages; saveEntireAmtStateDone(); }
2018-01-02 19:52:49 -05:00
2018-01-30 21:23:57 -05:00
// Called when the entire state of Intel AMT is fetched.
2018-01-02 19:52:49 -05:00
function saveEntireAmtStateDone() {
if (--IntelAmtEntireStateCalls != 0) return;
2018-01-25 19:12:53 -05:00
var out = fs.openSync(settings.output, 'w');
fs.writeSync(out, new Buffer(JSON.stringify(IntelAmtEntireState), 'utf8'));
fs.closeSync(out);
console.log('Done, results written to ' + settings.output + '.');
2018-01-02 19:52:49 -05:00
exit(1);
}
2018-01-30 21:23:57 -05:00
//
// FETCH ALL INTEL AMT MEI STATE
//
// Get Intel AMT information using MEI
2018-03-06 20:50:44 -05:00
// TODO: If this call is called many time at once, it's going to cause issues.
function getAmtInfo(func, tag) {
2018-03-06 20:50:44 -05:00
//console.log('getAmtInfo1');
if (amtMei == null) { if (func != null) { func(null, tag); } return; }
2018-03-06 20:50:44 -05:00
amtMeiTmpState = { Flags: 0, TrustedHashes: [] }; // Flags: 1=EHBC, 2=CCM, 4=ACM
amtMei.getProtocolVersion(function (result) { if (result != null) { amtMeiTmpState.MeiVersion = result; } });
amtMei.getVersion(function (val) {
amtMeiTmpState.Versions = {};
if (val != null) {
for (var version in val.Versions) { amtMeiTmpState.Versions[val.Versions[version].Description] = val.Versions[version].Version; }
amtMei.getProvisioningMode(function (result) { if (result != null) { amtMeiTmpState.ProvisioningMode = result.mode; } });
amtMei.getProvisioningState(function (result) { if (result != null) { amtMeiTmpState.ProvisioningState = result.state; } });
amtMei.getEHBCState(function (result) { if ((result != null) && (result.EHBC == true)) { amtMeiTmpState.Flags += 1; } });
amtMei.getControlMode(function (result) { if (result != null) { if (result.controlMode == 1) { amtMeiTmpState.Flags += 2; } if (result.controlMode == 2) { amtMeiTmpState.Flags += 4; } } });
//amtMei.getMACAddresses(function (result) { if (result != null) { amtMeiTmpState.mac = result; } });
amtMei.getDnsSuffix(function (result) { if (result != null) { amtMeiTmpState.dns = result; } });
amtMei.getHashHandles(function (handles) {
exitOnCount = handles.length;
for (var i = 0; i < handles.length; ++i) {
amtMei.getCertHashEntry(handles[i], function (result) {
amtMeiTmpState.TrustedHashes.push({ Active: result.isActive, Default: result.isDefault, HashAlgorithm: result.hashAlgorithm, Name: result.name, Hash: result.certificateHash });
2018-03-06 20:50:44 -05:00
if (--exitOnCount == 0) {
amtMeiTmpState.Notifications = lmsNotifications; amtMeiState = amtMeiTmpState;
//console.log('getAmtInfo2', JSON.stringify(amtMeiState));
if (func != null) { func(amtMeiTmpState, tag); }
amtMeiTmpState = null;
}
});
}
});
} else {
amtMeiState = amtMeiTmpState;
amtMeiState.ProvisioningMode = -858993460;
amtMeiState.TrustedHashes = {};
amtMeiState.Notifications = lmsNotifications;
2018-03-06 20:50:44 -05:00
//console.log('getAmtInfo3', JSON.stringify(amtMeiState));
if (func != null) { func(amtMeiState, tag); }
}
});
}
2018-01-30 21:23:57 -05:00
//
// MicroLMS
//
var lmsControlSockets = {};
var lmsControlSocketsNextId = 1;
var lmsNotifications = [];
2018-03-06 20:50:44 -05:00
var amtLms = null;
2018-01-25 19:28:52 -05:00
function startLms(func) {
2018-01-30 21:23:57 -05:00
var lme_heci = require('amt-lme');
2018-03-06 20:50:44 -05:00
//var amtLms = null;
var http = require('http');
2018-03-06 20:50:44 -05:00
// MeshCommander LMS v0.6.0 with LMS improvements
var _IntelAmtWebApp_etag = "EywwrEJnIclcslSGdOXb";
var _IntelAmtWebApp = "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
2018-01-30 21:23:57 -05:00
var amtMeiModule = require('amt-mei');
amtMei = new amtMeiModule();
2018-01-25 19:28:52 -05:00
amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; });
//console.log('PTHI Connecting...');
amtMei.on('connect', function () {
//console.log("PTHI Connected.");
2018-01-25 19:12:53 -05:00
amtLms = new lme_heci({ debug: settings.lmsdebug });
2018-01-25 19:28:52 -05:00
amtLms.on('error', function (e) {
//console.log('LME connection failed', e);
2018-03-06 20:50:44 -05:00
setupMeiOsAdmin(func, amtLms.connected == false ? 0 : 3);
2018-01-30 21:23:57 -05:00
});
2018-03-06 20:50:44 -05:00
amtLms.on('notify', function (data, options, str, code) {
2018-03-08 20:58:22 -05:00
if (code == 'iAMT0052-3') {
kvmGetData(true);
} else if (str != null) {
2018-03-06 20:50:44 -05:00
var notify = { date: Date.now(), str: str, code: code };
lmsNotifications.push(notify);
while (lmsNotifications.length > 100) { lmsNotifications.shift(); }
var notifyBuf = Buffer.concat([Buffer.from('0900', 'hex'), Buffer.from(JSON.stringify(notify))]) // Add a notification
for (var i in lmsControlSockets) { lmsControlSockets[i].write(notifyBuf); }
}
2018-01-25 19:28:52 -05:00
});
//console.log('LME Connecting...');
amtLms.on('connect', function () {
2018-01-30 21:23:57 -05:00
amtLms.connected = true;
2018-03-06 20:50:44 -05:00
//console.log("LME Connected.");
2018-01-25 19:28:52 -05:00
if (settings.noconsole !== true) {
amtLms.meshCommander = http.createServer();
amtLms.meshCommander.listen(16994);
amtLms.meshCommander.on('upgrade', function (req, socket, head) {
//console.log("WebSocket for " + req.url.split('?')[0]);
switch (req.url.split('?')[0]) {
case '/lms.ashx': // MeshCommander control channel (PTHI)
socket.ws = socket.upgradeWebSocket();
socket.ws.on('data', processLmsControlData);
socket.ws.on('end', function () { if (lmsControlSockets[this.id]) { delete lmsControlSockets[this.id]; /*console.log('removeControl', JSON.stringify(lmsControlSockets));*/ } });
var id = lmsControlSocketsNextId++;
lmsControlSockets[id] = socket.ws;
socket.ws.id = id;
//socket.ws.write(Buffer.concat([Buffer.from('0900', 'hex'), Buffer.from(JSON.stringify(lmsNotifications))])); // Send out full list of notifications
//console.log('addControl', JSON.stringify(lmsControlSockets));
2018-01-25 19:28:52 -05:00
break;
case '/webrelay.ashx': // MeshCommander data channel (LME)
socket.ws = socket.upgradeWebSocket();
amtLms.bindDuplexStream(socket.ws, 'IPv4', 16992);
break;
default:
socket.end();
break;
}
});
amtLms.meshCommander.on('request', function (req, rsp) {
//console.log("WebRequest for " + req.url.split('?')[0]);
switch (req.url.split('?')[0]) {
case '/': // Serve MeshCommander Web Application for LMS
var lmscommander = null;
try { lmscommander = fs.readFileSync('lmscommander.htm'); } catch (e) { }
if (lmscommander != null) {
rsp.writeHead(200, 'OK', { Server: 'JSLMS', 'Cache-Control': 'max-age=0, no-cache', 'X-Frame-Options': 'DENY', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked' });
rsp.end(lmscommander);
} else {
rsp.writeHead(200, 'OK', { Server: 'JSLMS', 'Cache-Control': 'max-age=0, no-cache', 'X-Frame-Options': 'DENY', 'Content-Type': 'text/html', 'Content-Encoding': 'gzip', 'Transfer-Encoding': 'chunked', ETag: _IntelAmtWebApp_etag });
rsp.end(Buffer.from(_IntelAmtWebApp, 'base64'));
}
2018-01-25 19:28:52 -05:00
break;
default: // Unknown request
rsp.statusCode = 404;
rsp.statusMessage = "Not Found";
rsp.end();
break;
}
2018-01-25 19:28:52 -05:00
});
//console.log("LMS started, MeshCommander on HTTP/16994.");
2018-03-06 20:50:44 -05:00
tempTimer = setTimeout(function () { delete tempTimer; setupMeiOsAdmin(func, 2); }, 100);
//console.logReferenceCount(tempTimer);
2018-01-25 19:28:52 -05:00
} else {
//console.log("LMS started.");
2018-03-06 20:50:44 -05:00
tempTimer = setTimeout(function () { delete tempTimer; setupMeiOsAdmin(func, 1); }, 100);
//console.logReferenceCount(tempTimer);
2018-01-25 19:28:52 -05:00
}
});
});
}
2018-03-06 20:50:44 -05:00
function setupMeiOsAdmin(func, state) {
amtMei.getLocalSystemAccount(function (x) {
var transport = require('amt-wsman-duk');
var wsman = require('amt-wsman');
var amt = require('amt');
oswsstack = new wsman(transport, '127.0.0.1', 16992, x.user, x.pass, false);
osamtstack = new amt(oswsstack);
if (func) { func(state); }
//var AllWsman = "CIM_SoftwareIdentity,IPS_SecIOService,IPS_ScreenSettingData,IPS_ProvisioningRecordLog,IPS_HostBasedSetupService,IPS_HostIPSettings,IPS_IPv6PortSettings".split(',');
//osamtstack.BatchEnum(null, AllWsman, startLmsWsmanResponse, null, true);
2018-03-08 20:58:22 -05:00
tempTimer = setInterval(function () { kvmGetData(true); }, 2000);
kvmGetData(false);
kvmSetData(JSON.stringify({ action: 'restart', ver: 1 }));
2018-03-06 20:50:44 -05:00
});
}
2018-03-08 20:58:22 -05:00
function kvmGetData(tag) {
osamtstack.IPS_KVMRedirectionSettingData_DataChannelRead(kvmDataGetResponse, tag);
}
function kvmDataGetResponse(stack, name, response, status, tag) {
if ((tag == true) && (status == 200) && (response.Body.ReturnValue == 0)) {
var val = null;
try { val = Buffer.from(response.Body.DataMessage, 'base64').toString(); } catch (e) { return }
if (val != null) kvmProcessData(response.Body.RealmsBitmap, response.Body.MessageId, val);
}
}
var webRtcDesktop = null;
function kvmProcessData(realms, messageId, val) {
//console.log('kvmProcessData', val);
var data = null;
try { data = JSON.parse(val) } catch (e) { }
if ((data != null) && (data.action)) {
if (data.action == 'present') { kvmSetData(JSON.stringify({ action: 'present', ver: 1 })); }
if (data.action == 'offer') {
webRtcDesktop = {};
var rtc = require('ILibWebRTC');
webRtcDesktop.webrtc = rtc.createConnection();
webRtcDesktop.webrtc.on('connected', function () { });
webRtcDesktop.webrtc.on('disconnected', function () { webRtcCleanUp(); });
webRtcDesktop.webrtc.on('dataChannel', function (rtcchannel) {
webRtcDesktop.rtcchannel = rtcchannel;
var kvmmodule = require('meshDesktop');
webRtcDesktop.kvm = kvmmodule.getRemoteDesktopStream();
webRtcDesktop.kvm.pipe(webRtcDesktop.rtcchannel, { end: false });
webRtcDesktop.rtcchannel.pipe(webRtcDesktop.kvm, { end: false });
webRtcDesktop.rtcchannel.on('end', function () { webRtcCleanUp(); });
//webRtcDesktop.kvm.on('end', function () { console.log('WebRTC DataChannel closed2'); webRtcCleanUp(); });
//webRtcDesktop.rtcchannel.on('data', function (data) { console.log('WebRTC data: ' + data); });
});
kvmSetData(JSON.stringify({ action: 'answer', ver: 1, sdp: webRtcDesktop.webrtc.setOffer(data.sdp) }));
}
}
}
function webRtcCleanUp() {
if (webRtcDesktop == null) return;
if (webRtcDesktop.rtcchannel) {
try { webRtcDesktop.rtcchannel.close(); } catch (e) { }
try { webRtcDesktop.rtcchannel.removeAllListeners('data'); } catch (e) { }
try { webRtcDesktop.rtcchannel.removeAllListeners('end'); } catch (e) { }
delete webRtcDesktop.rtcchannel;
}
if (webRtcDesktop.webrtc) {
try { webRtcDesktop.webrtc.close(); } catch (e) { }
try { webRtcDesktop.webrtc.removeAllListeners('connected'); } catch (e) { }
try { webRtcDesktop.webrtc.removeAllListeners('disconnected'); } catch (e) { }
try { webRtcDesktop.webrtc.removeAllListeners('dataChannel'); } catch (e) { }
delete webRtcDesktop.webrtc;
}
if (webRtcDesktop.kvm) {
try { webRtcDesktop.kvm.end(); } catch (e) { }
delete webRtcDesktop.kvm;
}
webRtcDesktop = null;
}
function kvmSetData(x) {
osamtstack.IPS_KVMRedirectionSettingData_DataChannelWrite(Buffer.from(x).toString('base64'), function () { });
}
2018-02-07 21:45:14 -05:00
function startLmsWsmanResponse(stack, name, responses, status) {
if (status == 600) { console.log('ERROR: Unable to connect to Intel(R) AMT.'); }
else if (status != 200) { console.log('ERROR: Unable to get object from Intel(R) AMT, status = ' + status + '.'); }
2018-03-06 20:50:44 -05:00
else {
//console.log(JSON.stringify(responses), status);
var amtlogicalelements = responses["CIM_SoftwareIdentity"].responses;
if (amtlogicalelements.length > 0) {
var v = getInstance(amtlogicalelements, "AMT")["VersionString"];
amtversion = parseInt(v.split('.')[0]);
amtversionmin = parseInt(v.split('.')[1]);
//console.log(amtversion, amtversionmin);
}
}
2018-02-07 21:45:14 -05:00
}
2018-01-30 21:23:57 -05:00
// Process commands in the LMS control channel
// Command 9 is add a notification.
function processLmsControlData(data) {
if (data.length < 2) return;
var cmdid = data.readUInt16LE(0);
switch (cmdid) {
case 1: // Request basic Intel AMT information (CMD = 1)
2018-01-30 21:23:57 -05:00
{ getAmtInfo(function (meinfo, socket) { meinfo.LoginMode = 2; socket.write(Buffer.concat([Buffer.from('0100', 'hex'), Buffer.from(JSON.stringify(meinfo))])); }, this); break; }
case 2: // Intel AMT MEI Unprovision (CMD = 2)
2018-01-30 21:23:57 -05:00
{ if (data.length < 6) break; amtMei.unprovision(data.readUInt32LE(2), function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(2, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }
case 3: // Intel AMT MEI GetLocalSystemAccount (CMD = 3)
2018-01-30 21:23:57 -05:00
{ amtMei.getLocalSystemAccount(function (account, socket) {socket.write(Buffer.concat([Buffer.from('030000000000', 'hex'), account.raw])); }, this); break; }
case 4: // Instruct Intel AMT to start remote configuration (CMD = 4)
2018-01-30 21:23:57 -05:00
{ amtMei.startConfiguration(function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }
case 5: // Instruct Intel AMT to stop remote configuration (CMD = 5)
2018-01-30 21:23:57 -05:00
{ amtMei.stopConfiguration(function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }
case 6: // Instruct Intel AMT connect CIRA (CMD = 6)
2018-01-30 21:23:57 -05:00
{ amtMei.openUserInitiatedConnection(function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }
case 7: // Instruct Intel AMT disconnect CIRA (CMD = 7)
2018-01-30 21:23:57 -05:00
{ amtMei.closeUserInitiatedConnection(function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }
case 8: // Get Intel AMT CIRA State (CMD = 8)
2018-01-30 21:23:57 -05:00
{ amtMei.getRemoteAccessConnectionStatus(function (state, socket) { var data = new Buffer(6); data.writeUInt16LE(8, 0); data.writeUInt32LE(state.status, 2); socket.write(Buffer.concat([data, state.raw])); }, this); break; }
}
2017-10-31 19:19:58 -04:00
}
2018-01-30 21:23:57 -05:00
//
// MeshCentral TCP port router
//
2017-10-31 19:19:58 -04:00
function startRouter() {
tcpserver = net.createServer(OnTcpClientConnected);
2018-03-08 20:58:22 -05:00
tcpserver.on('error', function (e) { console.log('ERROR: ' + JSON.stringify(e)); exit(0); return; });
2017-10-31 19:19:58 -04:00
tcpserver.listen(settings.localPort, function () {
// We started listening.
if (settings.remoteName == null) {
console.log('Redirecting local port ' + settings.localPort + ' to remote port ' + settings.remotePort + '.');
} else {
console.log('Redirecting local port ' + settings.localPort + ' to ' + settings.remoteName + ':' + settings.remotePort + '.');
}
console.log('Press ctrl-c to terminal.');
// If settings has a "cmd", run it now.
//process.exec("notepad.exe");
});
}
// Called when a TCP connect is received on the local port. Launch a tunnel.
function OnTcpClientConnected(c) {
try {
// 'connection' listener
debug(1, 'Client connected');
c.on('end', function () { disconnectTunnel(this, this.websocket, 'Client closed'); });
c.pause();
try {
options = http.parseUri(settings.serverUrl + '?user=' + settings.username + '&pass=' + settings.password + '&nodeid=' + settings.remoteNodeId + '&tcpport=' + settings.remotePort);
} catch (e) { console.log('Unable to parse \"serverUrl\".'); process.exit(1); return; }
2017-10-31 19:19:58 -04:00
options.checkServerIdentity = onVerifyServer;
2018-01-26 20:01:38 -05:00
options.rejectUnauthorized = false;
2017-10-31 19:19:58 -04:00
c.websocket = http.request(options);
c.websocket.tcp = c;
c.websocket.tunneling = false;
c.websocket.upgrade = OnWebSocket;
2018-01-26 20:01:38 -05:00
c.websocket.on('error', function (e) { console.log('ERROR: ' + JSON.stringify(e)); });
2017-10-31 19:19:58 -04:00
c.websocket.end();
} catch (e) { debug(2, e); }
}
// Disconnect both TCP & WebSocket connections and display a message.
function disconnectTunnel(tcp, ws, msg) {
if (ws != null) { try { ws.end(); } catch (e) { debug(2, e); } }
if (tcp != null) { try { tcp.end(); } catch (e) { debug(2, e); } }
debug(1, 'Tunnel disconnected: ' + msg);
}
// Called when the web socket gets connected
function OnWebSocket(msg, s, head) {
debug(1, 'Websocket connected');
s.on('data', function (msg) {
if (this.parent.tunneling == false) {
msg = msg.toString();
if (msg == 'c') {
this.parent.tunneling = true; this.pipe(this.parent.tcp); this.parent.tcp.pipe(this); debug(1, 'Tunnel active');
} else if ((msg.length > 6) && (msg.substring(0, 6) == 'error:')) {
console.log(msg.substring(6));
disconnectTunnel(this.tcp, this, msg.substring(6));
}
}
});
s.on('error', function (msg) { disconnectTunnel(this.tcp, this, 'Websocket error'); });
s.on('close', function (msg) { disconnectTunnel(this.tcp, this, 'Websocket closed'); });
s.parent = this;
}
// Try to discover the location of the mesh server
function discoverMeshServer() { console.log('Looking for server...'); discoveryInterval = setInterval(discoverMeshServerOnce, 5000); discoverMeshServerOnce(); }
// Try to discover the location of the mesh server only once
function discoverMeshServerOnce() {
var interfaces = os.networkInterfaces();
for (var adapter in interfaces) {
if (interfaces.hasOwnProperty(adapter)) {
for (var i = 0; i < interfaces[adapter].length; ++i) {
2017-10-31 19:19:58 -04:00
var addr = interfaces[adapter][i];
multicastSockets[i] = dgram.createSocket({ type: (addr.family == "IPv4" ? "udp4" : "udp6") });
multicastSockets[i].bind({ address: addr.address, exclusive: false });
if (addr.family == "IPv4") {
multicastSockets[i].addMembership(membershipIPv4);
//multicastSockets[i].setMulticastLoopback(true);
multicastSockets[i].once('message', OnMulticastMessage);
multicastSockets[i].send(settings.serverId, 16989, membershipIPv4);
}
}
}
}
}
// Called when a multicast packet is received
function OnMulticastMessage(msg, rinfo) {
var m = msg.toString().split('|');
if ((m.length == 3) && (m[0] == 'MeshCentral2') && (m[1] == settings.serverId)) {
settings.serverUrl = m[2].replace('%s', rinfo.address).replace('/agent.ashx', '/meshrelay.ashx');
console.log('Found server at ' + settings.serverUrl + '.');
if (discoveryInterval != null) { clearInterval(discoveryInterval); discoveryInterval = null; }
startRouter();
}
}
2018-01-30 21:23:57 -05:00
//
// PUSH MESHCOMMANDER INTO FIRMWARE
//
function nextStepStorageUpload() {
debug(3, "nextStepStorageUpload");
getAmtStorage(function (statusCode, data) {
if (statusCode == 200) {
debug(2, "getAmtStorage: " + JSON.stringify(data, null, 2));
if ((data['content'] != null) && (data['content']['index.htm'] != null)) { nextStepStorageUpload3('index.htm'); }
else if ((data['content'] != null) && (data['content']['logon.htm'] != null)) { nextStepStorageUpload3('logon.htm'); }
else if ((data['content'] != null) && (data['content']['logon.htm'] != null)) { nextStepStorageUpload3('logon.htm'); }
else { nextStepStorageUpload2('index.htm', null); }
} else {
console.log("Unable to read storage state.");
exit();
return;
}
});
}
function nextStepStorageUpload2(uploadName, linkName) {
debug(3, "nextStepStorageUpload2");
if (settings.webapp == null) { console.log("Done."); exit(); return; } else {
console.log("Uploading MeshCommander...");
pushToStorage(uploadName, linkName, Buffer.from(settings.webapp, 'base64'), function (statusCode) {
if (statusCode == 500) { console.log("Error, check that computer is powered on."); exit(); return; }
if (statusCode != 200) {
if (uploadName == 'index.htm') {
nextStepStorageUpload2('mesh/commander/console', 'MeshCommander');
} else {
console.log("Unable to upload MeshCommander, status = " + statusCode + "."); exit(); return;
}
} else {
console.log("Verifying MeshCommander...");
verifyStorage(uploadName, Buffer.from(settings.webapp, 'base64'), function (verified) {
if (verified == true) { console.log('Done.'); } else { console.log('MeshCommander verification failed.'); }
exit(); return;
});
}
});
}
}
function nextStepStorageUpload3(deleteName) {
console.log("Deleting " + deleteName + " from storage...");
deleteStorage(deleteName, function (statusCode) {
if (statusCode == 500) { console.log("Error, check that computer is powered on."); exit(); return; }
if (statusCode == 200) { nextStepStorageUpload(); } else { console.log("Unable to delete " + deleteName + "."); exit(); return; }
});
}
// Fetch the Intel AMT storage document
function getAmtStorage(func, noretry) {
var req = digest.request({ protocol: settings.protocol, method: "GET", host: settings.hostname, path: "/amt-storage/", port: settings.localport },
function (response) {
if (response.statusCode != 200) { console.log("Unable to connect to Intel(R) AMT."); func(response.statusCode, null); }
response.on('data', function (chunk) { if (response.acc == null) { response.acc = chunk; } else { response.acc += chunk; } });
response.on('end', function () {
var data = response.acc.toString(), len, data2, amtstorage = null;
try {
do { len = data.length; data2 = data; data = data2.replace('\x00', ''); } while (data != data2); // Remove all zero's, this is needed because firmware sometimes returns garbage we must fix.
do { len = data.length; data2 = data; data = data2.replace('\x22\x01\x22', '\x22\x22'); } while (data != data2); // "\x01", this is needed because firmware sometimes returns garbage we must fix.
amtstorage = JSON.parse(data);
} catch (e) { console.log("Error: Unable to parse Intel AMT response."); func(null); }
if (func != null) { func(response.statusCode, amtstorage); }
});
});
req.on('error', function (e) { console.log("Error occured: " + JSON.stringify(e)); if (noretry == true) { if (func != null) { func(null); } } else { getAmtStorage(func, true); } });
req.end();
}
// Fetch the Intel AMT storage document
function pushToStorage(name, linkname, data, func, ptr) {
if (ptr == null) { ptr = 0; }
2018-01-25 19:12:53 -05:00
var req = digest.request({ protocol: settings.protocol, method: "PUT", host: settings.hostname, path: ("/amt-storage/" + name + ((ptr != 0) ? '?append=' : '')), port: settings.localport } );
req.on('error', function (e) { console.log("Error occured: " + JSON.stringify(e)); if (func != null) { func(null); } });
2018-01-25 19:12:53 -05:00
req.on('response', function (response) {
debug(1, 'Chunk Done', data.length, ptr);
if ((response.statusCode == 200) && (ptr < data.length)) { pushToStorage(name, linkname, data, func, ptr); } else { if (func != null) { func(response.statusCode); } }
});
var header = (ptr > 0) ? '<metadata></metadata>' : '<metadata><headers><h>Content-Encoding:gzip</h><h>Content-Type:text/html</h></headers>' + ((linkname != null) ? ('<link>' + linkname + '</link>') : '') + '</metadata>';
var blocklen = ((data.length - ptr) > (7000 - header.length)) ? (7000 - header.length) : (data.length - ptr);
req.write(Buffer.concat([new Buffer(header), data.slice(ptr, ptr + blocklen)]));
ptr += blocklen;
req.end();
}
// Fetch the Intel AMT storage document
function verifyStorage(name, data, func) {
2018-01-25 19:12:53 -05:00
var req = digest.request({ protocol: settings.protocol, method: "GET", host: settings.hostname, path: ("/amt-storage/" + name), port: settings.localport });
req.on('error', function (e) { console.log("Verify error occured: " + JSON.stringify(e)); if (func != null) { func(null); } });
2018-01-25 19:12:53 -05:00
req.on('response', function (response) {
response.ptr = 0;
response.ok = true;
2018-01-26 20:01:38 -05:00
response.on('data', function (data2) { if (data2.toString('hex') != data.slice(response.ptr, response.ptr + data2.length).toString('hex')) { response.ok = false; console.log('Verifiy failed (' + response.ptr + ', ' + data2.length + ').'); } response.ptr += data2.length; });
2018-01-25 19:12:53 -05:00
response.on('end', function () { if (func != null) { func(response.ok); } });
});
req.end();
}
// Fetch the Intel AMT storage document
function deleteStorage(name, func, noretry) {
2018-01-25 19:12:53 -05:00
var req = digest.request({ protocol: settings.protocol, method: "DELETE", host: settings.hostname, path: "/amt-storage/" + name, port: settings.localport } );
req.on('error', function (e) { if ((e == 'Error: Socket was unexpectedly closed') && (noretry != true)) { deleteStorage(name, func, true); } else { if (func != null) { if (e.statusCode) { func(e.statusCode); } else { func(null); } } } });
2018-01-25 19:12:53 -05:00
req.on('response', function (response) { if (func != null) { func(response.statusCode); } });
req.end();
}
2018-01-30 21:23:57 -05:00
// Run MeshCmd
2018-01-25 19:28:52 -05:00
try { run(process.argv); } catch (e) { console.log('ERROR: ' + e); }