mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2025-03-09 15:40:18 +00:00
Compare commits
13 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
88a765bb13 | ||
|
|
7ad4b917be | ||
|
|
d10173a018 | ||
|
|
0e3a6b4915 | ||
|
|
b949cecc5f | ||
|
|
c7cbf2f12a | ||
|
|
d49afdd7bf | ||
|
|
133e77c8c6 | ||
|
|
e404e86b9f | ||
|
|
c6da201af8 | ||
|
|
9a27d7637c | ||
|
|
5aa2467409 | ||
|
|
9398afd07e |
22 changed files with 10795 additions and 10345 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -295,8 +295,9 @@ if (process.platform == 'win32' && require('user-sessions').isRoot()) {
|
|||
// Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value
|
||||
try {
|
||||
var writtenSize = 0, actualSize = Math.floor(require('fs').statSync(process.execPath).size / 1024);
|
||||
try { writtenSize = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MeshCentralAgent', 'EstimatedSize'); } catch (ex) { }
|
||||
if (writtenSize != actualSize) { try { require('win-registry').WriteKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MeshCentralAgent', 'EstimatedSize', actualSize); } catch (ex) { } }
|
||||
var serviceName = (_MSH().serviceName ? _MSH().serviceName : (require('_agentNodeId').serviceName() ? require('_agentNodeId').serviceName() : 'Mesh Agent'));
|
||||
try { writtenSize = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + serviceName, 'EstimatedSize'); } catch (ex) { }
|
||||
if (writtenSize != actualSize) { try { require('win-registry').WriteKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + serviceName, 'EstimatedSize', actualSize); } catch (ex) { } }
|
||||
} catch (ex) { }
|
||||
|
||||
// Check to see if we are the Installed Mesh Agent Service, if we are, make sure we can run in Safe Mode
|
||||
|
|
@ -310,6 +311,16 @@ if (process.platform == 'win32' && require('user-sessions').isRoot()) {
|
|||
try { meshCheck = require('service-manager').manager.getService(svcname).isMe(); } catch (ex) { }
|
||||
if (meshCheck && require('win-bcd').isSafeModeService && !require('win-bcd').isSafeModeService(svcname)) { require('win-bcd').enableSafeModeService(svcname); }
|
||||
} catch (ex) { }
|
||||
|
||||
// Check the Agent Uninstall MetaData for DisplayVersion and update if not the same and only on windows
|
||||
if (process.platform == 'win32') {
|
||||
try {
|
||||
var writtenDisplayVersion = 0, actualDisplayVersion = process.versions.commitDate.toString();
|
||||
var serviceName = (_MSH().serviceName ? _MSH().serviceName : (require('_agentNodeId').serviceName() ? require('_agentNodeId').serviceName() : 'Mesh Agent'));
|
||||
try { writtenDisplayVersion = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + serviceName, 'DisplayVersion'); } catch (ex) { }
|
||||
if (writtenDisplayVersion != actualDisplayVersion) { try { require('win-registry').WriteKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + serviceName, 'DisplayVersion', actualDisplayVersion); } catch (ex) { } }
|
||||
} catch (ex) { }
|
||||
}
|
||||
}
|
||||
|
||||
if (process.platform != 'win32') {
|
||||
|
|
@ -4573,10 +4584,11 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
|
|||
if (process.platform == 'win32') {
|
||||
// Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value
|
||||
var writtenSize = 0;
|
||||
try { writtenSize = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MeshCentralAgent', 'EstimatedSize'); } catch (ex) { response = ex; }
|
||||
var serviceName = (_MSH().serviceName ? _MSH().serviceName : (require('_agentNodeId').serviceName() ? require('_agentNodeId').serviceName() : 'Mesh Agent'));
|
||||
try { writtenSize = require('win-registry').QueryKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + serviceName, 'EstimatedSize'); } catch (ex) { response = ex; }
|
||||
if (writtenSize != actualSize) {
|
||||
response = "Size updated from: " + writtenSize + " to: " + actualSize;
|
||||
try { require('win-registry').WriteKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MeshCentralAgent', 'EstimatedSize', actualSize); } catch (ex) { response = ex; }
|
||||
try { require('win-registry').WriteKey(require('win-registry').HKEY.LocalMachine, 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + serviceName, 'EstimatedSize', actualSize); } catch (ex) { response = ex; }
|
||||
} else
|
||||
{ response = "Agent Size: " + actualSize + " kb"; }
|
||||
} else
|
||||
|
|
@ -5656,7 +5668,7 @@ function windows_execve(name, agentfilename, sessionid) {
|
|||
sendAgentMessage('Self Update failed because msvcrt.dll is missing', 3);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
var cmd = require('_GenericMarshal').CreateVariable(process.env['windir'] + '\\system32\\cmd.exe', { wide: true });
|
||||
var args = require('_GenericMarshal').CreateVariable(3 * require('_GenericMarshal').PointerSize);
|
||||
var arg1 = require('_GenericMarshal').CreateVariable('cmd.exe', { wide: true });
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -123,6 +123,10 @@ Use of the optional file `plugin_name.js` in the optional folder `modules_meshco
|
|||
Much of MeshCentral revolves around returning objects for your structures, and plugins are no different. Within your plugin you can traverse all the way up to the web server and MeshCentral Server classes to access all the functionality those layers provide. This is done by passing the current object to newly created objects, and assigning that reference to a `parent` variable within that object.
|
||||
|
||||
|
||||
## Ping-Pong
|
||||
|
||||
If you build a plugin which makes use of `meshrelay.ashx`, keep in mind to either handle ping-pong messages (`serverPing`, `serverPong`) on the control channel or to request MeshCentral to not send such messages through sending the `noping=1` parameter in the connection URL. For a deeper sight search for "PING/PONG" in `meshrelay.js`.
|
||||
|
||||
## Versioning
|
||||
|
||||
Versioning your plugin correctly and consistently is essential to ensure users of your plugin are prompted to upgrade when it is available. Semantic versioning is recommended.
|
||||
|
|
|
|||
525
meshuser.js
525
meshuser.js
|
|
@ -601,11 +601,11 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
|||
}
|
||||
if (typeof domain.userconsentflags == 'number') { serverinfo.consent = domain.userconsentflags; }
|
||||
if ((typeof domain.usersessionidletimeout == 'number') && (domain.usersessionidletimeout > 0)) {serverinfo.timeout = (domain.usersessionidletimeout * 60 * 1000); }
|
||||
if (typeof domain.logoutOnIdleSessionTimeout == 'boolean') {
|
||||
serverinfo.logoutOnIdleSessionTimeout = domain.logoutOnIdleSessionTimeout;
|
||||
if (typeof domain.logoutonidlesessiontimeout == 'boolean') {
|
||||
serverinfo.logoutonidlesessiontimeout = domain.logoutonidlesessiontimeout;
|
||||
} else {
|
||||
// Default
|
||||
serverinfo.logoutOnIdleSessionTimeout = true;
|
||||
serverinfo.logoutonidlesessiontimeout = true;
|
||||
}
|
||||
if (user.siteadmin === SITERIGHT_ADMIN) {
|
||||
if (parent.parent.config.settings.managealldevicegroups.indexOf(user._id) >= 0) { serverinfo.manageAllDeviceGroups = true; }
|
||||
|
|
@ -5076,286 +5076,295 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
|||
case 'getDeviceDetails': {
|
||||
if ((common.validateStrArray(command.nodeids, 1) == false) && (command.nodeids != null)) break; // Check nodeids
|
||||
if (common.validateString(command.type, 3, 4) == false) break; // Check type
|
||||
|
||||
const links = parent.GetAllMeshIdWithRights(user);
|
||||
const extraids = getUserExtraIds();
|
||||
db.GetAllTypeNoTypeFieldMeshFiltered(links, extraids, domain.id, 'node', null, obj.deviceSkip, obj.deviceLimit, function (err, docs) {
|
||||
if (docs == null) return;
|
||||
const ids = [];
|
||||
if (command.nodeids != null) {
|
||||
// Create a list of node ids and query them for last device connection time
|
||||
for (var i in command.nodeids) { ids.push('lc' + command.nodeids[i]); }
|
||||
} else {
|
||||
// Create a list of node ids for this user and query them for last device connection time
|
||||
for (var i in docs) { ids.push('lc' + docs[i]._id); }
|
||||
}
|
||||
db.GetAllIdsOfType(ids, domain.id, 'lastconnect', function (err, docs) {
|
||||
const lastConnects = {};
|
||||
if (docs != null) { for (var i in docs) { lastConnects[docs[i]._id] = docs[i]; } }
|
||||
|
||||
// Create a list of node ids and query them for last device connection time
|
||||
const ids = []
|
||||
for (var i in command.nodeids) { ids.push('lc' + command.nodeids[i]); }
|
||||
db.GetAllIdsOfType(ids, domain.id, 'lastconnect', function (err, docs) {
|
||||
const lastConnects = {};
|
||||
if (docs != null) { for (var i in docs) { lastConnects[docs[i]._id] = docs[i]; } }
|
||||
|
||||
getDeviceDetailedInfo(command.nodeids, command.type, function (results, type) {
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
// Remove any device system and network information is we do not have details rights to this device
|
||||
if ((parent.GetNodeRights(user, results[i].node.meshid, results[i].node._id) & MESHRIGHT_DEVICEDETAILS) == 0) {
|
||||
delete results[i].sys; delete results[i].net;
|
||||
}
|
||||
|
||||
// Merge any last connection information
|
||||
const lc = lastConnects['lc' + results[i].node._id];
|
||||
if (lc != null) { delete lc._id; delete lc.type; delete lc.meshid; delete lc.domain; results[i].lastConnect = lc; }
|
||||
|
||||
// Remove any connectivity and power state information, that should not be in the database anyway.
|
||||
// TODO: Find why these are sometimes saved in the db.
|
||||
if (results[i].node.conn != null) { delete results[i].node.conn; }
|
||||
if (results[i].node.pwr != null) { delete results[i].node.pwr; }
|
||||
if (results[i].node.agct != null) { delete results[i].node.agct; }
|
||||
if (results[i].node.cict != null) { delete results[i].node.cict; }
|
||||
|
||||
// Add the connection state
|
||||
var state = parent.parent.GetConnectivityState(results[i].node._id);
|
||||
if (state) {
|
||||
results[i].node.conn = state.connectivity;
|
||||
results[i].node.pwr = state.powerState;
|
||||
if ((state.connectivity & 1) != 0) { var agent = parent.wsagents[results[i].node._id]; if (agent != null) { results[i].node.agct = agent.connectTime; } }
|
||||
|
||||
// Use the connection time of the CIRA/Relay connection
|
||||
if ((state.connectivity & 2) != 0) {
|
||||
var ciraConnection = parent.parent.mpsserver.GetConnectionToNode(results[i].node._id, null, true);
|
||||
if ((ciraConnection != null) && (ciraConnection.tag != null)) { results[i].node.cict = ciraConnection.tag.connectTime; }
|
||||
getDeviceDetailedInfo(command.nodeids, command.type, function (results, type) {
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
// Remove any device system and network information is we do not have details rights to this device
|
||||
if ((parent.GetNodeRights(user, results[i].node.meshid, results[i].node._id) & MESHRIGHT_DEVICEDETAILS) == 0) {
|
||||
delete results[i].sys; delete results[i].net;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var output = null;
|
||||
if (type == 'csv') {
|
||||
try {
|
||||
// Create the CSV file
|
||||
output = 'id,name,rname,host,icon,ip,osdesc,groupname,av,update,firewall,bitlocker,avdetails,tags,lastbootuptime,cpu,osbuild,biosDate,biosVendor,biosVersion,biosSerial,biosMode,boardName,boardVendor,boardVersion,productUuid,tpmversion,tpmmanufacturer,tpmmanufacturerversion,tpmisactivated,tpmisenabled,tpmisowned,totalMemory,agentOpenSSL,agentCommitDate,agentCommitHash,agentCompileTime,netIfCount,macs,addresses,lastConnectTime,lastConnectAddr\r\n';
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
const nodeinfo = results[i];
|
||||
// Merge any last connection information
|
||||
const lc = lastConnects['lc' + results[i].node._id];
|
||||
if (lc != null) { delete lc._id; delete lc.type; delete lc.meshid; delete lc.domain; results[i].lastConnect = lc; }
|
||||
|
||||
// Node information
|
||||
if (nodeinfo.node != null) {
|
||||
const n = nodeinfo.node;
|
||||
output += csvClean(n._id) + ',' + csvClean(n.name) + ',' + csvClean(n.rname ? n.rname : '') + ',' + csvClean(n.host ? n.host : '') + ',' + (n.icon ? n.icon : 1) + ',' + (n.ip ? n.ip : '') + ',' + (n.osdesc ? csvClean(n.osdesc) : '') + ',' + csvClean(parent.meshes[n.meshid].name);
|
||||
if (typeof n.wsc == 'object') {
|
||||
output += ',' + csvClean(n.wsc.antiVirus ? n.wsc.antiVirus : '') + ',' + csvClean(n.wsc.autoUpdate ? n.wsc.autoUpdate : '') + ',' + csvClean(n.wsc.firewall ? n.wsc.firewall : '')
|
||||
} else { output += ',,,'; }
|
||||
if (typeof n.volumes == 'object') {
|
||||
var bitlockerdetails = '', firstbitlocker = true;
|
||||
for (var a in n.volumes) { if (typeof n.volumes[a].protectionStatus !== 'undefined') { if (firstbitlocker) { firstbitlocker = false; } else { bitlockerdetails += '|'; } bitlockerdetails += a + '/' + n.volumes[a].volumeStatus; } }
|
||||
output += ',' + csvClean(bitlockerdetails);
|
||||
} else {
|
||||
output += ',';
|
||||
}
|
||||
if (typeof n.av == 'object') {
|
||||
var avdetails = '', firstav = true;
|
||||
for (var a in n.av) { if (typeof n.av[a].product == 'string') { if (firstav) { firstav = false; } else { avdetails += '|'; } avdetails += (n.av[a].product + '/' + ((n.av[a].enabled) ? 'enabled' : 'disabled') + '/' + ((n.av[a].updated) ? 'updated' : 'notupdated')); } }
|
||||
output += ',' + csvClean(avdetails);
|
||||
} else {
|
||||
output += ',';
|
||||
}
|
||||
if (typeof n.tags == 'object') {
|
||||
var tagsdetails = '', firsttags = true;
|
||||
for (var a in n.tags) { if (firsttags) { firsttags = false; } else { tagsdetails += '|'; } tagsdetails += n.tags[a]; }
|
||||
output += ',' + csvClean(tagsdetails);
|
||||
} else {
|
||||
output += ',';
|
||||
}
|
||||
if (typeof n.lastbootuptime == 'number') { output += ',' + n.lastbootuptime; } else { output += ','; }
|
||||
} else {
|
||||
output += ',,,,,,,,,,,,,,,,,,,,';
|
||||
// Remove any connectivity and power state information, that should not be in the database anyway.
|
||||
// TODO: Find why these are sometimes saved in the db.
|
||||
if (results[i].node.conn != null) { delete results[i].node.conn; }
|
||||
if (results[i].node.pwr != null) { delete results[i].node.pwr; }
|
||||
if (results[i].node.agct != null) { delete results[i].node.agct; }
|
||||
if (results[i].node.cict != null) { delete results[i].node.cict; }
|
||||
|
||||
// Add the connection state
|
||||
var state = parent.parent.GetConnectivityState(results[i].node._id);
|
||||
if (state) {
|
||||
results[i].node.conn = state.connectivity;
|
||||
results[i].node.pwr = state.powerState;
|
||||
if ((state.connectivity & 1) != 0) { var agent = parent.wsagents[results[i].node._id]; if (agent != null) { results[i].node.agct = agent.connectTime; } }
|
||||
|
||||
// Use the connection time of the CIRA/Relay connection
|
||||
if ((state.connectivity & 2) != 0) {
|
||||
var ciraConnection = parent.parent.mpsserver.GetConnectionToNode(results[i].node._id, null, true);
|
||||
if ((ciraConnection != null) && (ciraConnection.tag != null)) { results[i].node.cict = ciraConnection.tag.connectTime; }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// System infomation
|
||||
if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.windows)) {
|
||||
// Windows
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.windows.cpu && (nodeinfo.sys.hardware.windows.cpu.length > 0) && (typeof nodeinfo.sys.hardware.windows.cpu[0].Name == 'string')) { output += csvClean(nodeinfo.sys.hardware.windows.cpu[0].Name); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.windows.osinfo && (nodeinfo.sys.hardware.windows.osinfo.BuildNumber)) { output += csvClean(nodeinfo.sys.hardware.windows.osinfo.BuildNumber); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_date)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_date); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_vendor)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_vendor); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_version)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_version); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_serial)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_serial); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_mode)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_mode); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.board_name)) { output += csvClean(nodeinfo.sys.hardware.identifiers.board_name); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.board_vendor)) { output += csvClean(nodeinfo.sys.hardware.identifiers.board_vendor); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.board_version)) { output += csvClean(nodeinfo.sys.hardware.identifiers.board_version); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.product_uuid)) { output += csvClean(nodeinfo.sys.hardware.identifiers.product_uuid); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.SpecVersion) { output += csvClean(nodeinfo.sys.hardware.tpm.SpecVersion); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.ManufacturerId) { output += csvClean(nodeinfo.sys.hardware.tpm.ManufacturerId); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.ManufacturerVersion) { output += csvClean(nodeinfo.sys.hardware.tpm.ManufacturerVersion); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsActivated) { output += csvClean(nodeinfo.sys.hardware.tpm.IsActivated ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsEnabled) { output += csvClean(nodeinfo.sys.hardware.tpm.IsEnabled ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsOwned) { output += csvClean(nodeinfo.sys.hardware.tpm.IsOwned ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.windows.memory) {
|
||||
var totalMemory = 0;
|
||||
for (var j in nodeinfo.sys.hardware.windows.memory) {
|
||||
if (nodeinfo.sys.hardware.windows.memory[j].Capacity) {
|
||||
if (typeof nodeinfo.sys.hardware.windows.memory[j].Capacity == 'number') { totalMemory += nodeinfo.sys.hardware.windows.memory[j].Capacity; }
|
||||
if (typeof nodeinfo.sys.hardware.windows.memory[j].Capacity == 'string') { totalMemory += parseInt(nodeinfo.sys.hardware.windows.memory[j].Capacity); }
|
||||
}
|
||||
var output = null;
|
||||
if (type == 'csv') {
|
||||
try {
|
||||
// Create the CSV file
|
||||
output = 'id,name,rname,host,icon,ip,osdesc,groupname,av,update,firewall,bitlocker,avdetails,tags,lastbootuptime,cpu,osbuild,biosDate,biosVendor,biosVersion,biosSerial,biosMode,boardName,boardVendor,boardVersion,productUuid,tpmversion,tpmmanufacturer,tpmmanufacturerversion,tpmisactivated,tpmisenabled,tpmisowned,totalMemory,agentOpenSSL,agentCommitDate,agentCommitHash,agentCompileTime,netIfCount,macs,addresses,lastConnectTime,lastConnectAddr\r\n';
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
const nodeinfo = results[i];
|
||||
|
||||
// Node information
|
||||
if (nodeinfo.node != null) {
|
||||
const n = nodeinfo.node;
|
||||
output += csvClean(n._id) + ',' + csvClean(n.name) + ',' + csvClean(n.rname ? n.rname : '') + ',' + csvClean(n.host ? n.host : '') + ',' + (n.icon ? n.icon : 1) + ',' + (n.ip ? n.ip : '') + ',' + (n.osdesc ? csvClean(n.osdesc) : '') + ',' + csvClean(parent.meshes[n.meshid].name);
|
||||
if (typeof n.wsc == 'object') {
|
||||
output += ',' + csvClean(n.wsc.antiVirus ? n.wsc.antiVirus : '') + ',' + csvClean(n.wsc.autoUpdate ? n.wsc.autoUpdate : '') + ',' + csvClean(n.wsc.firewall ? n.wsc.firewall : '')
|
||||
} else { output += ',,,'; }
|
||||
if (typeof n.volumes == 'object') {
|
||||
var bitlockerdetails = '', firstbitlocker = true;
|
||||
for (var a in n.volumes) { if (typeof n.volumes[a].protectionStatus !== 'undefined') { if (firstbitlocker) { firstbitlocker = false; } else { bitlockerdetails += '|'; } bitlockerdetails += a + '/' + n.volumes[a].volumeStatus; } }
|
||||
output += ',' + csvClean(bitlockerdetails);
|
||||
} else {
|
||||
output += ',';
|
||||
}
|
||||
output += csvClean('' + totalMemory);
|
||||
if (typeof n.av == 'object') {
|
||||
var avdetails = '', firstav = true;
|
||||
for (var a in n.av) { if (typeof n.av[a].product == 'string') { if (firstav) { firstav = false; } else { avdetails += '|'; } avdetails += (n.av[a].product + '/' + ((n.av[a].enabled) ? 'enabled' : 'disabled') + '/' + ((n.av[a].updated) ? 'updated' : 'notupdated')); } }
|
||||
output += ',' + csvClean(avdetails);
|
||||
} else {
|
||||
output += ',';
|
||||
}
|
||||
if (typeof n.tags == 'object') {
|
||||
var tagsdetails = '', firsttags = true;
|
||||
for (var a in n.tags) { if (firsttags) { firsttags = false; } else { tagsdetails += '|'; } tagsdetails += n.tags[a]; }
|
||||
output += ',' + csvClean(tagsdetails);
|
||||
} else {
|
||||
output += ',';
|
||||
}
|
||||
if (typeof n.lastbootuptime == 'number') { output += ',' + n.lastbootuptime; } else { output += ','; }
|
||||
} else {
|
||||
output += ',,,,,,,,,,,,,,,,,,,,';
|
||||
}
|
||||
} else if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.mobile)) {
|
||||
// Mobile
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.mobile && (nodeinfo.sys.hardware.mobile.bootloader)) { output += csvClean(nodeinfo.sys.hardware.mobile.bootloader); }
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.mobile && (nodeinfo.sys.hardware.mobile.model)) { output += csvClean(nodeinfo.sys.hardware.mobile.model); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.mobile && (nodeinfo.sys.hardware.mobile.brand)) { output += csvClean(nodeinfo.sys.hardware.mobile.brand); }
|
||||
output += ',';
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.mobile && (nodeinfo.sys.hardware.mobile.id)) { output += csvClean(nodeinfo.sys.hardware.mobile.id); }
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
} else if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.linux)) {
|
||||
// Linux
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.cpu_name)) { output += csvClean(nodeinfo.sys.hardware.identifiers.cpu_name); }
|
||||
output += ',,';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.bios_date)) { output += csvClean(nodeinfo.sys.hardware.linux.bios_date); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.bios_vendor)) { output += csvClean(nodeinfo.sys.hardware.linux.bios_vendor); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.bios_version)) { output += csvClean(nodeinfo.sys.hardware.linux.bios_version); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.product_serial)) { output += csvClean(nodeinfo.sys.hardware.linux.product_serial); }
|
||||
else if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_serial)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_serial); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_mode)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_mode); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.board_name)) { output += csvClean(nodeinfo.sys.hardware.linux.board_name); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.board_vendor)) { output += csvClean(nodeinfo.sys.hardware.linux.board_vendor); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.board_version)) { output += csvClean(nodeinfo.sys.hardware.linux.board_version); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.product_uuid)) { output += csvClean(nodeinfo.sys.hardware.linux.product_uuid); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.SpecVersion) { output += csvClean(nodeinfo.sys.hardware.tpm.SpecVersion); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.ManufacturerId) { output += csvClean(nodeinfo.sys.hardware.tpm.ManufacturerId); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.ManufacturerVersion) { output += csvClean(nodeinfo.sys.hardware.tpm.ManufacturerVersion); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsActivated) { output += csvClean(nodeinfo.sys.hardware.tpm.IsActivated ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsEnabled) { output += csvClean(nodeinfo.sys.hardware.tpm.IsEnabled ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsOwned) { output += csvClean(nodeinfo.sys.hardware.tpm.IsOwned ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux.memory) {
|
||||
if (nodeinfo.sys.hardware.linux.memory.Memory_Device) {
|
||||
|
||||
// System infomation
|
||||
if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.windows)) {
|
||||
// Windows
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.windows.cpu && (nodeinfo.sys.hardware.windows.cpu.length > 0) && (typeof nodeinfo.sys.hardware.windows.cpu[0].Name == 'string')) { output += csvClean(nodeinfo.sys.hardware.windows.cpu[0].Name); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.windows.osinfo && (nodeinfo.sys.hardware.windows.osinfo.BuildNumber)) { output += csvClean(nodeinfo.sys.hardware.windows.osinfo.BuildNumber); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_date)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_date); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_vendor)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_vendor); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_version)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_version); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_serial)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_serial); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_mode)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_mode); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.board_name)) { output += csvClean(nodeinfo.sys.hardware.identifiers.board_name); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.board_vendor)) { output += csvClean(nodeinfo.sys.hardware.identifiers.board_vendor); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.board_version)) { output += csvClean(nodeinfo.sys.hardware.identifiers.board_version); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.product_uuid)) { output += csvClean(nodeinfo.sys.hardware.identifiers.product_uuid); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.SpecVersion) { output += csvClean(nodeinfo.sys.hardware.tpm.SpecVersion); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.ManufacturerId) { output += csvClean(nodeinfo.sys.hardware.tpm.ManufacturerId); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.ManufacturerVersion) { output += csvClean(nodeinfo.sys.hardware.tpm.ManufacturerVersion); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsActivated) { output += csvClean(nodeinfo.sys.hardware.tpm.IsActivated ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsEnabled) { output += csvClean(nodeinfo.sys.hardware.tpm.IsEnabled ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsOwned) { output += csvClean(nodeinfo.sys.hardware.tpm.IsOwned ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.windows.memory) {
|
||||
var totalMemory = 0;
|
||||
for (var j in nodeinfo.sys.hardware.linux.memory.Memory_Device) {
|
||||
if (nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size) {
|
||||
if (typeof nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size == 'number') { totalMemory += nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size; }
|
||||
if (typeof nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size == 'string') { totalMemory += parseInt(nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size); }
|
||||
for (var j in nodeinfo.sys.hardware.windows.memory) {
|
||||
if (nodeinfo.sys.hardware.windows.memory[j].Capacity) {
|
||||
if (typeof nodeinfo.sys.hardware.windows.memory[j].Capacity == 'number') { totalMemory += nodeinfo.sys.hardware.windows.memory[j].Capacity; }
|
||||
if (typeof nodeinfo.sys.hardware.windows.memory[j].Capacity == 'string') { totalMemory += parseInt(nodeinfo.sys.hardware.windows.memory[j].Capacity); }
|
||||
}
|
||||
}
|
||||
output += csvClean('' + (totalMemory * Math.pow(1024, 3)));
|
||||
output += csvClean('' + totalMemory);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
output += ',,,,,,,,,,,,,,,,,,';
|
||||
}
|
||||
|
||||
// Agent information
|
||||
if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.agentvers)) {
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.agentvers.openssl) { output += csvClean(nodeinfo.sys.hardware.agentvers.openssl); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.agentvers.commitDate) { output += csvClean(nodeinfo.sys.hardware.agentvers.commitDate); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.agentvers.commitHash) { output += csvClean(nodeinfo.sys.hardware.agentvers.commitHash); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.agentvers.compileTime) { output += csvClean(nodeinfo.sys.hardware.agentvers.compileTime); }
|
||||
} else {
|
||||
output += ',,,,';
|
||||
}
|
||||
|
||||
// Network interfaces
|
||||
if ((nodeinfo.net) && (nodeinfo.net.netif2)) {
|
||||
output += ',';
|
||||
output += Object.keys(nodeinfo.net.netif2).length; // Interface count
|
||||
var macs = [], addresses = [];
|
||||
for (var j in nodeinfo.net.netif2) {
|
||||
if (Array.isArray(nodeinfo.net.netif2[j])) {
|
||||
for (var k = 0; k < nodeinfo.net.netif2[j].length; k++) {
|
||||
if (typeof nodeinfo.net.netif2[j][k].mac == 'string') { macs.push(nodeinfo.net.netif2[j][k].mac); }
|
||||
if (typeof nodeinfo.net.netif2[j][k].address == 'string') { addresses.push(nodeinfo.net.netif2[j][k].address); }
|
||||
} else if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.mobile)) {
|
||||
// Mobile
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.mobile && (nodeinfo.sys.hardware.mobile.bootloader)) { output += csvClean(nodeinfo.sys.hardware.mobile.bootloader); }
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.mobile && (nodeinfo.sys.hardware.mobile.model)) { output += csvClean(nodeinfo.sys.hardware.mobile.model); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.mobile && (nodeinfo.sys.hardware.mobile.brand)) { output += csvClean(nodeinfo.sys.hardware.mobile.brand); }
|
||||
output += ',';
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.mobile && (nodeinfo.sys.hardware.mobile.id)) { output += csvClean(nodeinfo.sys.hardware.mobile.id); }
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
output += ',';
|
||||
} else if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.linux)) {
|
||||
// Linux
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.cpu_name)) { output += csvClean(nodeinfo.sys.hardware.identifiers.cpu_name); }
|
||||
output += ',,';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.bios_date)) { output += csvClean(nodeinfo.sys.hardware.linux.bios_date); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.bios_vendor)) { output += csvClean(nodeinfo.sys.hardware.linux.bios_vendor); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.bios_version)) { output += csvClean(nodeinfo.sys.hardware.linux.bios_version); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.product_serial)) { output += csvClean(nodeinfo.sys.hardware.linux.product_serial); }
|
||||
else if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_serial)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_serial); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.identifiers && (nodeinfo.sys.hardware.identifiers.bios_mode)) { output += csvClean(nodeinfo.sys.hardware.identifiers.bios_mode); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.board_name)) { output += csvClean(nodeinfo.sys.hardware.linux.board_name); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.board_vendor)) { output += csvClean(nodeinfo.sys.hardware.linux.board_vendor); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.board_version)) { output += csvClean(nodeinfo.sys.hardware.linux.board_version); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux && (nodeinfo.sys.hardware.linux.product_uuid)) { output += csvClean(nodeinfo.sys.hardware.linux.product_uuid); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.SpecVersion) { output += csvClean(nodeinfo.sys.hardware.tpm.SpecVersion); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.ManufacturerId) { output += csvClean(nodeinfo.sys.hardware.tpm.ManufacturerId); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.ManufacturerVersion) { output += csvClean(nodeinfo.sys.hardware.tpm.ManufacturerVersion); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsActivated) { output += csvClean(nodeinfo.sys.hardware.tpm.IsActivated ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsEnabled) { output += csvClean(nodeinfo.sys.hardware.tpm.IsEnabled ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.tpm && nodeinfo.sys.hardware.tpm.IsOwned) { output += csvClean(nodeinfo.sys.hardware.tpm.IsOwned ? 'true' : 'false'); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.linux.memory) {
|
||||
if (nodeinfo.sys.hardware.linux.memory.Memory_Device) {
|
||||
var totalMemory = 0;
|
||||
for (var j in nodeinfo.sys.hardware.linux.memory.Memory_Device) {
|
||||
if (nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size) {
|
||||
if (typeof nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size == 'number') { totalMemory += nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size; }
|
||||
if (typeof nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size == 'string') { totalMemory += parseInt(nodeinfo.sys.hardware.linux.memory.Memory_Device[j].Size); }
|
||||
}
|
||||
}
|
||||
output += csvClean('' + (totalMemory * Math.pow(1024, 3)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
output += ',,,,,,,,,,,,,,,,,,';
|
||||
}
|
||||
output += ',';
|
||||
output += csvClean(macs.join(' ')); // MACS
|
||||
output += ',';
|
||||
output += csvClean(addresses.join(' ')); // Addresses
|
||||
} else {
|
||||
output += ',,,';
|
||||
}
|
||||
|
||||
// Last connection information
|
||||
if (nodeinfo.lastConnect) {
|
||||
output += ',';
|
||||
if (nodeinfo.lastConnect.time) {
|
||||
// Last connection time
|
||||
if ((typeof command.l == 'string') && (typeof command.tz == 'string')) {
|
||||
output += csvClean(new Date(nodeinfo.lastConnect.time).toLocaleString(command.l, { timeZone: command.tz }))
|
||||
} else {
|
||||
output += nodeinfo.lastConnect.time;
|
||||
// Agent information
|
||||
if ((nodeinfo.sys) && (nodeinfo.sys.hardware) && (nodeinfo.sys.hardware.agentvers)) {
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.agentvers.openssl) { output += csvClean(nodeinfo.sys.hardware.agentvers.openssl); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.agentvers.commitDate) { output += csvClean(nodeinfo.sys.hardware.agentvers.commitDate); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.agentvers.commitHash) { output += csvClean(nodeinfo.sys.hardware.agentvers.commitHash); }
|
||||
output += ',';
|
||||
if (nodeinfo.sys.hardware.agentvers.compileTime) { output += csvClean(nodeinfo.sys.hardware.agentvers.compileTime); }
|
||||
} else {
|
||||
output += ',,,,';
|
||||
}
|
||||
|
||||
// Network interfaces
|
||||
if ((nodeinfo.net) && (nodeinfo.net.netif2)) {
|
||||
output += ',';
|
||||
output += Object.keys(nodeinfo.net.netif2).length; // Interface count
|
||||
var macs = [], addresses = [];
|
||||
for (var j in nodeinfo.net.netif2) {
|
||||
if (Array.isArray(nodeinfo.net.netif2[j])) {
|
||||
for (var k = 0; k < nodeinfo.net.netif2[j].length; k++) {
|
||||
if (typeof nodeinfo.net.netif2[j][k].mac == 'string') { macs.push(nodeinfo.net.netif2[j][k].mac); }
|
||||
if (typeof nodeinfo.net.netif2[j][k].address == 'string') { addresses.push(nodeinfo.net.netif2[j][k].address); }
|
||||
}
|
||||
}
|
||||
}
|
||||
output += ',';
|
||||
output += csvClean(macs.join(' ')); // MACS
|
||||
output += ',';
|
||||
output += csvClean(addresses.join(' ')); // Addresses
|
||||
} else {
|
||||
output += ',,,';
|
||||
}
|
||||
output += ',';
|
||||
if (typeof nodeinfo.lastConnect.addr == 'string') { output += csvClean(nodeinfo.lastConnect.addr); } // Last connection address and port
|
||||
} else {
|
||||
output += ',,';
|
||||
|
||||
// Last connection information
|
||||
if (nodeinfo.lastConnect) {
|
||||
output += ',';
|
||||
if (nodeinfo.lastConnect.time) {
|
||||
// Last connection time
|
||||
if ((typeof command.l == 'string') && (typeof command.tz == 'string')) {
|
||||
output += csvClean(new Date(nodeinfo.lastConnect.time).toLocaleString(command.l, { timeZone: command.tz }))
|
||||
} else {
|
||||
output += nodeinfo.lastConnect.time;
|
||||
}
|
||||
}
|
||||
output += ',';
|
||||
if (typeof nodeinfo.lastConnect.addr == 'string') { output += csvClean(nodeinfo.lastConnect.addr); } // Last connection address and port
|
||||
} else {
|
||||
output += ',,';
|
||||
}
|
||||
|
||||
output += '\r\n';
|
||||
}
|
||||
} catch (ex) { console.log(ex); }
|
||||
} else {
|
||||
// Create the JSON file
|
||||
|
||||
output += '\r\n';
|
||||
// Add the device group name to each device
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
const nodeinfo = results[i];
|
||||
if (nodeinfo.node) {
|
||||
const mesh = parent.meshes[nodeinfo.node.meshid];
|
||||
if (mesh) { results[i].node.groupname = mesh.name; }
|
||||
}
|
||||
}
|
||||
} catch (ex) { console.log(ex); }
|
||||
} else {
|
||||
// Create the JSON file
|
||||
|
||||
// Add the device group name to each device
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
const nodeinfo = results[i];
|
||||
if (nodeinfo.node) {
|
||||
const mesh = parent.meshes[nodeinfo.node.meshid];
|
||||
if (mesh) { results[i].node.groupname = mesh.name; }
|
||||
}
|
||||
output = JSON.stringify(results, null, 2);
|
||||
}
|
||||
|
||||
output = JSON.stringify(results, null, 2);
|
||||
}
|
||||
try { ws.send(JSON.stringify({ action: 'getDeviceDetails', data: output, type: type })); } catch (ex) { }
|
||||
try { ws.send(JSON.stringify({ action: 'getDeviceDetails', data: output, type: type })); } catch (ex) { }
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case 'endDesktopMultiplex': {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "meshcentral",
|
||||
"version": "1.1.40",
|
||||
"version": "1.1.42",
|
||||
"keywords": [
|
||||
"Remote Device Management",
|
||||
"Remote Device Monitoring",
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ module.exports.pluginHandler = function (parent) {
|
|||
try {
|
||||
obj.plugins[p][hookName](...args);
|
||||
} catch (e) {
|
||||
console.log("Error occurred while running plugin hook" + p + ':' + hookName + ' (' + e + ')');
|
||||
console.log("Error occurred while running plugin hook " + p + ':' + hookName, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
2
public/scripts/amt-wsman-0.2.0-min.js
vendored
2
public/scripts/amt-wsman-0.2.0-min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -39,6 +39,7 @@ var meshCentralSourceFiles = [
|
|||
"../views/messenger.handlebars",
|
||||
"../views/player.handlebars",
|
||||
"../views/sharing.handlebars",
|
||||
"../views/sharing-mobile.handlebars",
|
||||
"../views/mstsc.handlebars",
|
||||
"../views/ssh.handlebars",
|
||||
"../emails/account-check.html",
|
||||
|
|
|
|||
20441
translate/translate.json
20441
translate/translate.json
File diff suppressed because it is too large
Load diff
|
|
@ -1524,8 +1524,22 @@
|
|||
function setSessionActivity() { sessionActivity = Date.now(); }
|
||||
function checkIdleSessionTimeout() {
|
||||
var delta = (Date.now() - sessionActivity);
|
||||
if (delta > serverinfo.timeout && serverinfo.logoutOnIdleSessionTimeout) {
|
||||
window.location.href = 'logout';
|
||||
if (delta > serverinfo.timeout) {
|
||||
if (desktop != null) { // Disconnect remote desktop
|
||||
desktop.Stop();
|
||||
desktopNode = desktop = null;
|
||||
}
|
||||
if (terminal != null) { // Disconnect terminal
|
||||
terminal.Stop();
|
||||
terminal = null;
|
||||
}
|
||||
if (files != null) { // Disconnect files
|
||||
files.Stop();
|
||||
files = null;
|
||||
}
|
||||
if (serverinfo.logoutonidlesessiontimeout) {
|
||||
window.location.href = 'logout';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6805,7 +6819,19 @@
|
|||
if (e.shiftKey == true) { meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, type: 'default' }); } // Upload default core
|
||||
else if (e.altKey == true) { meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, type: 'clear' }); } // Clear the core
|
||||
else if (e.ctrlKey == true) { p15uploadCore2(); } // Upload the core from a file
|
||||
else { setDialogMode(2, "Perform Agent Action", 3, p15uploadCoreEx, addHtmlValue("Action", '<select id=d3coreMode style=width:230px><option value=1>' + "Upload default server core" + '</option><option value=2>' + "Clear the core" + '</option><option value=6>' + "Upload recovery core" + '</option><option value=7>' + "Upload tiny core" + '</option><option value=3>' + "Upload a core file" + '</option><option value=4>' + "Soft disconnect agent" + '</option><option value=5>' + "Hard disconnect agent" + '</option><option value=8>' + "Restart agent service" + '</select>')); }
|
||||
else {
|
||||
var htmlValue = '<select id=d3coreMode style=width:230px>' +
|
||||
'<option value=1>' + "Upload default server core" + '</option>' +
|
||||
'<option value=2>' + "Clear the core" + '</option>' +
|
||||
'<option value=3>' + "Upload a core file" + '</option>' +
|
||||
'<option value=4>' + "Soft disconnect agent" + '</option>' +
|
||||
'<option value=5>' + "Hard disconnect agent" + '</option>' +
|
||||
'<option value=6>' + "Upload recovery core" + '</option>' +
|
||||
'<option value=7>' + "Upload tiny core" + '</option>' +
|
||||
'<option value=8>' + "Restart agent service" + '</option>' +
|
||||
'<option value=9>' + "Force agent update" + '</option></select>';
|
||||
setDialogMode(2, "Perform Agent Action", 3, p15uploadCoreEx, addHtmlValue("Action", htmlValue));
|
||||
}
|
||||
}
|
||||
|
||||
function p15uploadCoreEx() {
|
||||
|
|
@ -6833,6 +6859,9 @@
|
|||
} else if (Q('d3coreMode').value == 8) {
|
||||
// Restart MeshAgent service
|
||||
meshserver.send({ action: 'msg', type: 'console', nodeid: consoleNode._id, value:'service restart' });
|
||||
} else if (Q('d3coreMode').value == 9) {
|
||||
// Update mesh agent
|
||||
meshserver.send({ action: 'updateAgents', nodeids: [consoleNode._id] });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2447,17 +2447,28 @@
|
|||
files.Stop();
|
||||
files = null;
|
||||
}
|
||||
if (serverinfo.logoutOnIdleSessionTimeout) {
|
||||
if (serverinfo.logoutonidlesessiontimeout) {
|
||||
window.location.href = 'logout';
|
||||
}
|
||||
} else {
|
||||
var ds = Math.round((serverinfo.timeout - delta) / 1000);
|
||||
var sessionInProgress = desktop != null || terminal != null || files != null;
|
||||
var show = serverinfo.logoutonidlesessiontimeout || sessionInProgress;
|
||||
var isLogout = serverinfo.logoutonidlesessiontimeout;
|
||||
var theText = ''; // Initialize theText
|
||||
if (ds <= 60) {
|
||||
QH('idleTimeoutNotify', '<br />' + format((ds == 1)?"1 second until disconnect":"{0} seconds until disconnect", ds));
|
||||
theText = isLogout
|
||||
? (ds == 1 ? "1 second until logout" : "{0} seconds until logout")
|
||||
: (ds == 1 ? "1 second until disconnect" : "{0} seconds until disconnect");
|
||||
} else {
|
||||
ds = Math.round(ds / 60);
|
||||
if (ds <= 5) { QH('idleTimeoutNotify', '<br />' + format((ds == 1)?"1 minute until disconnect":"{0} minutes until disconnect", ds)); }
|
||||
if (ds <= 5) {
|
||||
theText = isLogout
|
||||
? (ds == 1 ? "1 minute until logout" : "{0} minutes until logout")
|
||||
: (ds == 1 ? "1 minute until disconnect" : "{0} minutes until disconnect");
|
||||
}
|
||||
}
|
||||
QH('idleTimeoutNotify', show && theText ? '<br />' + format(theText, ds) : '');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -11356,7 +11367,7 @@
|
|||
}
|
||||
|
||||
function p13openfilefolder() {
|
||||
setDialogMode(2, "Open File/Folder", 3, p13openfilefolderEx, "Are you sure you want to open this file/folder on the remote devices desktop ?");
|
||||
setDialogMode(2, "Open File/Folder", 3, p13openfilefolderEx, "Are you sure you want to open this file/folder on the remote devices desktop?");
|
||||
}
|
||||
function p13openfilefolderEx() {
|
||||
var openfilefolder = "", checkboxes = document.getElementsByName('fd');
|
||||
|
|
@ -12733,7 +12744,19 @@
|
|||
if (e.shiftKey == true) { meshserver.send({ action: 'uploadagentcore', nodeids: [ consoleNode._id ], type: 'default' }); } // Upload default core
|
||||
else if (e.altKey == true) { meshserver.send({ action: 'uploadagentcore', nodeids: [ consoleNode._id ], type: 'clear' }); } // Clear the core
|
||||
else if (e.ctrlKey == true) { p15uploadCore2(); } // Upload the core from a file
|
||||
else { setDialogMode(2, "Perform Agent Action", 3, p15uploadCoreEx, addHtmlValue("Action", '<select id=d3coreMode style=width:230px><option value=1>' + "Upload default server core" + '</option><option value=2>' + "Clear the core" + '</option><option value=6>' + "Upload recovery core" + '</option><option value=7>' + "Upload tiny core" + '</option><option value=3>' + "Upload a core file" + '</option><option value=4>' + "Soft disconnect agent" + '</option><option value=5>' + "Hard disconnect agent" + '</option><option value=8>' + "Restart agent service" + '</select>')); }
|
||||
else {
|
||||
var htmlValue = '<select id=d3coreMode style=width:230px>' +
|
||||
'<option value=1>' + "Upload default server core" + '</option>' +
|
||||
'<option value=2>' + "Clear the core" + '</option>' +
|
||||
'<option value=3>' + "Upload a core file" + '</option>' +
|
||||
'<option value=4>' + "Soft disconnect agent" + '</option>' +
|
||||
'<option value=5>' + "Hard disconnect agent" + '</option>' +
|
||||
'<option value=6>' + "Upload recovery core" + '</option>' +
|
||||
'<option value=7>' + "Upload tiny core" + '</option>' +
|
||||
'<option value=8>' + "Restart agent service" + '</option>' +
|
||||
'<option value=9>' + "Force agent update" + '</option></select>';
|
||||
setDialogMode(2, "Perform Agent Action", 3, p15uploadCoreEx, addHtmlValue("Action", htmlValue));
|
||||
}
|
||||
}
|
||||
|
||||
function p15uploadCoreEx() {
|
||||
|
|
@ -12761,6 +12784,9 @@
|
|||
} else if (Q('d3coreMode').value == 8) {
|
||||
// Restart MeshAgent service
|
||||
meshserver.send({ action: 'msg', type: 'console', nodeid: consoleNode._id, value:'service restart' });
|
||||
} else if (Q('d3coreMode').value == 9) {
|
||||
// Update mesh agent
|
||||
meshserver.send({ action: 'updateAgents', nodeids: [ consoleNode._id ] });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2897,17 +2897,28 @@
|
|||
files.Stop();
|
||||
files = null;
|
||||
}
|
||||
if (serverinfo.logoutOnIdleSessionTimeout) {
|
||||
if (serverinfo.logoutonidlesessiontimeout) {
|
||||
window.location.href = 'logout';
|
||||
}
|
||||
} else {
|
||||
var ds = Math.round((serverinfo.timeout - delta) / 1000);
|
||||
var sessionInProgress = (desktop != null || terminal != null || files != null);
|
||||
var show = serverinfo.logoutonidlesessiontimeout || sessionInProgress;
|
||||
var isLogout = serverinfo.logoutonidlesessiontimeout;
|
||||
var theText = '';
|
||||
if (ds <= 60) {
|
||||
QH('idleTimeoutNotify', '<br />' + format((ds == 1) ? "1 second until disconnect" : "{0} seconds until disconnect", ds));
|
||||
theText = isLogout
|
||||
? (ds == 1 ? "1 second until logout" : "{0} seconds until logout")
|
||||
: (ds == 1 ? "1 second until disconnect" : "{0} seconds until disconnect");
|
||||
} else {
|
||||
ds = Math.round(ds / 60);
|
||||
if (ds <= 5) { QH('idleTimeoutNotify', '<br />' + format((ds == 1) ? "1 minute until disconnect" : "{0} minutes until disconnect", ds)); }
|
||||
if (ds <= 5) {
|
||||
theText = isLogout
|
||||
? (ds == 1 ? "1 minute until logout" : "{0} minutes until logout")
|
||||
: (ds == 1 ? "1 minute until disconnect" : "{0} minutes until disconnect");
|
||||
}
|
||||
}
|
||||
QH('idleTimeoutNotify', show && theText ? '<br />' + format(theText, ds) : '');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -12150,7 +12161,7 @@
|
|||
}
|
||||
|
||||
function p13openfilefolder() {
|
||||
setModalContent('xxAddAgent', "Open File/Folder", 'Are you sure you want to open this file/folder on the remote devices desktop ?');
|
||||
setModalContent('xxAddAgent', "Open File/Folder", "Are you sure you want to open this file/folder on the remote devices desktop?");
|
||||
showModal('xxAddAgentModal', 'idx_dlgOkButton', () => p13openfilefolderEx());
|
||||
}
|
||||
function p13openfilefolderEx() {
|
||||
|
|
@ -13567,7 +13578,17 @@
|
|||
else if (e.altKey == true) { meshserver.send({ action: 'uploadagentcore', nodeids: [consoleNode._id], type: 'clear' }); } // Clear the core
|
||||
else if (e.ctrlKey == true) { p15uploadCore2(); } // Upload the core from a file
|
||||
else {
|
||||
setModalContent('xxAddAgent', "Perform Agent Action", addHtmlFormFloating("Action", '<select id=d3coreMode class="form-select me-2"><option value=1>' + "Upload default server core" + '</option><option value=2>' + "Clear the core" + '</option><option value=6>' + "Upload recovery core" + '</option><option value=7>' + "Upload tiny core" + '</option><option value=3>' + "Upload a core file" + '</option><option value=4>' + "Soft disconnect agent" + '</option><option value=5>' + "Hard disconnect agent" + '</option><option value=8>' + "Restart agent service" + '</select>'));
|
||||
var htmlValue = '<select id=d3coreMode class="form-select me-2">' +
|
||||
'<option value=1>' + "Upload default server core" + '</option>' +
|
||||
'<option value=2>' + "Clear the core" + '</option>' +
|
||||
'<option value=3>' + "Upload a core file" + '</option>' +
|
||||
'<option value=4>' + "Soft disconnect agent" + '</option>' +
|
||||
'<option value=5>' + "Hard disconnect agent" + '</option>' +
|
||||
'<option value=6>' + "Upload recovery core" + '</option>' +
|
||||
'<option value=7>' + "Upload tiny core" + '</option>' +
|
||||
'<option value=8>' + "Restart agent service" + '</option>' +
|
||||
'<option value=9>' + "Force agent update" + '</option></select>';
|
||||
setModalContent('xxAddAgent', "Perform Agent Action", addHtmlFormFloating("Action", htmlValue));
|
||||
showModal('xxAddAgentModal', 'idx_dlgOkButton', p15uploadCoreEx);
|
||||
}
|
||||
}
|
||||
|
|
@ -13597,6 +13618,9 @@
|
|||
} else if (Q('d3coreMode').value == 8) {
|
||||
// Restart MeshAgent service
|
||||
meshserver.send({ action: 'msg', type: 'console', nodeid: consoleNode._id, value:'service restart' });
|
||||
} else if (Q('d3coreMode').value == 9) {
|
||||
// Update mesh agent
|
||||
meshserver.send({ action: 'updateAgents', nodeids: [consoleNode._id] });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -746,7 +746,7 @@
|
|||
var domainUrl = '{{{domainurl}}}';
|
||||
var authCookie = '{{{authCookie}}}';
|
||||
var authRelayCookie = '{{{authRelayCookie}}}';
|
||||
var viewOnly = (parseInt('{{{viewOnly}}}') == 1);
|
||||
var viewOnly = parseInt('{{{viewOnly}}}');
|
||||
var authCookieRenewTimer = null;
|
||||
var serverPublicNamePort = '{{{serverDnsName}}}:{{{serverPublicPort}}}';
|
||||
var debugmode = false;
|
||||
|
|
@ -822,8 +822,22 @@
|
|||
function setSessionActivity() { sessionActivity = Date.now(); }
|
||||
function checkIdleSessionTimeout() {
|
||||
var delta = (Date.now() - sessionActivity);
|
||||
if (delta > serverinfo.timeout && serverinfo.logoutOnIdleSessionTimeout) {
|
||||
window.location.href = 'logout';
|
||||
if (delta > serverinfo.timeout) {
|
||||
if (desktop != null) { // Disconnect remote desktop
|
||||
desktop.Stop();
|
||||
desktopNode = desktop = null;
|
||||
}
|
||||
if (terminal != null) { // Disconnect terminal
|
||||
terminal.Stop();
|
||||
terminal = null;
|
||||
}
|
||||
if (files != null) { // Disconnect files
|
||||
files.Stop();
|
||||
files = null;
|
||||
}
|
||||
if (serverinfo.logoutonidlesessiontimeout) {
|
||||
window.location.href = 'logout';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -850,7 +864,7 @@
|
|||
gotKeyPressEvent = true;
|
||||
Q('softKeyboard').value = '';
|
||||
// Check what keys we are allows to send
|
||||
if (viewOnly) return false;
|
||||
if (viewOnly == 1) return false;
|
||||
return desktop.m.handleKeys(e);
|
||||
}
|
||||
if (terminal && !xxdialogMode && (xxcurrentView == 10) && (currentDevicePanel == 5) && (t !== 1)) {
|
||||
|
|
@ -878,7 +892,7 @@
|
|||
gotKeyPressEvent = false;
|
||||
Q('softKeyboard').value = '';
|
||||
// Check what keys we are allows to send
|
||||
if (viewOnly) return false;
|
||||
if (viewOnly == 1) return false;
|
||||
return desktop.m.handleKeyDown(e);
|
||||
}
|
||||
if (terminal && !xxdialogMode && (xxcurrentView == 10) && (currentDevicePanel == 5) && (t !== 1)) {
|
||||
|
|
@ -907,7 +921,7 @@
|
|||
var inputStr = Q('softKeyboard').value;
|
||||
Q('softKeyboard').value = '';
|
||||
// Check what keys we are allows to send
|
||||
if (viewOnly) return;
|
||||
if (viewOnly == 1) return;
|
||||
if ((gotKeyPressEvent == false) && (inputStr.length > 0) && desktop.m.SendKeyUnicode) {
|
||||
// This is a mobile keyboard, we need to send that is in the input control.
|
||||
var inputchar = inputStr[inputStr.length - 1].charCodeAt(0);
|
||||
|
|
@ -1067,6 +1081,7 @@
|
|||
desktop = CreateAmtRedirect(CreateAmtRemoteDesktop('Desk'), authCookie);
|
||||
desktop.debugmode = debugmode;
|
||||
desktop.onStateChanged = onDesktopStateChange;
|
||||
desktop.m.stopInput = (viewOnly == 1);
|
||||
desktop.m.bpp = (desktopsettings.encoding == 1 || desktopsettings.encoding == 3) ? 1 : 2;
|
||||
desktop.m.useZRLE = (desktopsettings.encoding < 3);
|
||||
desktop.m.showmouse = true;
|
||||
|
|
@ -1076,6 +1091,8 @@
|
|||
} else if ((contype == null) || (contype == 1) || ((contype == 3))) {
|
||||
// Setup the Mesh Agent remote desktop
|
||||
desktop = CreateAgentRedirect(null, CreateAgentRemoteDesktop('Desk'), serverPublicNamePort, authCookie, null, domainUrl);
|
||||
desktop.m.stopInput = (viewOnly == 1);
|
||||
desktop.m.mouseCursorActive(true);
|
||||
desktop.debugmode = debugmode;
|
||||
desktop.m.debugmode = debugmode;
|
||||
desktop.attemptWebRTC = attemptWebRTC;
|
||||
|
|
@ -1447,7 +1464,7 @@
|
|||
QV('deskarea4', !fullscreen);
|
||||
QV('termarea1', !fullscreen);
|
||||
QV('termarea4', !fullscreen);
|
||||
var inputAllowed = !viewOnly;
|
||||
var inputAllowed = (viewOnly == 0);
|
||||
|
||||
// Show full screen buttons if needed
|
||||
QV('deskkeybutton1', fullscreen);
|
||||
|
|
|
|||
|
|
@ -7092,7 +7092,10 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
|
|||
});
|
||||
} else {
|
||||
// Login failed
|
||||
handleRootRequestEx(req, res, domain, direct);
|
||||
parent.debug('web', 'handleRootRequest: login authorization failed when returning from Duo 2FA.');
|
||||
req.session.loginmode = 1;
|
||||
res.redirect(domain.url + getQueryPortion(req)); // redirect back to main page
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue