From c3005f47703b9bb56dc74998ea0d9f3bc5e1575f Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Wed, 6 Sep 2017 10:08:01 -0700 Subject: [PATCH] Fixed agent desktop/terminal pipes + added IP location info store in the server --- agents/meshcore.js | 10 +++----- meshagent.js | 61 +++++++++++++++++++++++++++++----------------- meshcentral.js | 3 ++- package.json | 2 +- 4 files changed, 46 insertions(+), 30 deletions(-) diff --git a/agents/meshcore.js b/agents/meshcore.js index 35d7735e30..e59fae519b 100644 --- a/agents/meshcore.js +++ b/agents/meshcore.js @@ -373,10 +373,8 @@ function createMeshCore(agent) { return; } // Setup remote desktop & terminal without using native pipes - if (useNativePipes == false) { - if (this.httprequest.desktop) { this.httprequest.desktop.kvm.write(data); return; } - if (this.httprequest.terminal) { this.httprequest.terminal.write(data); return; } - } + if ((this.httprequest.desktop) && (obj.useNativePipes == false)) { this.httprequest.desktop.kvm.write(data); return; } + if ((this.httprequest.terminal) && (obj.useNativePipes == false)) { this.httprequest.terminal.write(data); return; } if (this.httprequest.state == 0) { // Check if this is a relay connection @@ -388,7 +386,7 @@ function createMeshCore(agent) { this.httprequest.protocol = parseInt(data); if (typeof this.httprequest.protocol != 'number') { this.httprequest.protocol = 0; } if (this.httprequest.protocol == 1) { - if (useNativePipes == false) { + if (obj.useNativePipes == false) { // Remote Terminal without using native pipes if (process.platform == "win32") { this.httprequest.terminal = processManager.CreateProcess("%windir%\\system32\\cmd.exe"); @@ -412,7 +410,7 @@ function createMeshCore(agent) { } } if (this.httprequest.protocol == 2) { - if (useNativePipes == false) { + if (obj.useNativePipes == false) { // Remote Desktop without using native pipes this.httprequest.desktop = { state: 0, kvm: mesh.getRemoteDesktopStream(), tunnel: this }; this.httprequest.desktop.kvm.tunnel = this; diff --git a/meshagent.js b/meshagent.js index 4f3caac099..fb46b238f0 100644 --- a/meshagent.js +++ b/meshagent.js @@ -294,31 +294,42 @@ module.exports.CreateMeshAgent = function (parent, db, ws, req, args, domain) { obj.agentInfo = obj.parent.parent.meshAgentBinaries[obj.agentInfo.agentId]; if ((obj.agentInfo != undefined) && (obj.agentInfo.update == true)) { obj.send(obj.common.ShortToStr(12) + obj.common.ShortToStr(0)); } // Ask the agent for it's executable binary hash - // Check if we need to ask for the IP location - var doIpLocation = 0; - if (device.iploc == null) { - doIpLocation = 1; - } else { - var loc = device.iploc.split(','); - if (loc.length < 3) { - doIpLocation = 2; + // Check if we already have IP location information for this node + obj.db.Get('iploc_' + obj.remoteaddr, function (err, iplocs) { + if (iplocs.length == 1) { + // We have a location in the database for this remote IP + var iploc = nodes[0], x = {}; + x.publicip = iploc.ip; + x.iploc = iploc.loc + ',' + (Math.floor((new Date(command.value.date)) / 1000)); + ChangeAgentLocationInfo(x); } else { - var t = new Date((parseFloat(loc[2]) * 1000)), now = Date.now(); - t.setDate(t.getDate() + 20); - if (t < now) { doIpLocation = 3; } - } - } + // Check if we need to ask for the IP location + var doIpLocation = 0; + if (device.iploc == null) { + doIpLocation = 1; + } else { + var loc = device.iploc.split(','); + if (loc.length < 3) { + doIpLocation = 2; + } else { + var t = new Date((parseFloat(loc[2]) * 1000)), now = Date.now(); + t.setDate(t.getDate() + 20); + if (t < now) { doIpLocation = 3; } + } + } - // If we need to ask for IP location, see if we have the quota to do it. - if (doIpLocation > 0) { - obj.db.getValueOfTheDay('ipLocationRequestLimitor', 10, function (ipLocationLimitor) { - if (ipLocationLimitor.value > 0) { - ipLocationLimitor.value--; - obj.db.Set(ipLocationLimitor); - obj.send(JSON.stringify({ action: 'iplocation' })); + // If we need to ask for IP location, see if we have the quota to do it. + if (doIpLocation > 0) { + obj.db.getValueOfTheDay('ipLocationRequestLimitor', 10, function (ipLocationLimitor) { + if (ipLocationLimitor.value > 0) { + ipLocationLimitor.value--; + obj.db.Set(ipLocationLimitor); + obj.send(JSON.stringify({ action: 'iplocation' })); + } + }); } - }); - } + } + }); }); }); } @@ -425,11 +436,17 @@ module.exports.CreateMeshAgent = function (parent, db, ws, req, args, domain) { case 'iplocation': { // Sent by the agent to update location information + console.log(command); if ((command.type == 'publicip') && (command.value != null) && (typeof command.value == 'object') && (command.value.ip) && (command.value.loc)) { var x = {}; x.publicip = command.value.ip; x.iploc = command.value.loc + ',' + (Math.floor(Date.now() / 1000) ); ChangeAgentLocationInfo(x); + command.value._id = 'iploc_' + command.value.ip; + command.value.type = 'iploc'; + command.value.date = Date.now(); + obj.db.Set(command.value); // Store the IP to location data in the database + // Sample Value: { ip: '192.55.64.246', city: 'Hillsboro', region: 'Oregon', country: 'US', loc: '45.4443,-122.9663', org: 'AS4983 Intel Corporation', postal: '97123' } } break; } diff --git a/meshcentral.js b/meshcentral.js index fa99bd9961..f17a608296 100644 --- a/meshcentral.js +++ b/meshcentral.js @@ -54,7 +54,7 @@ function CreateMeshCentralServer() { try { require('./pass').hash('test', function () { }); } catch (e) { console.log('Old version of node, must upgrade.'); return; } // TODO: Not sure if this test works or not. // Check for invalid arguments - var validArguments = ['_', 'notls', 'user', 'port', 'mpsport', 'redirport', 'cert', 'deletedomain', 'deletedefaultdomain', 'showusers', 'shownodes', 'showmeshes', 'showevents', 'showpower', 'help', 'exactports', 'install', 'uninstall', 'start', 'stop', 'restart', 'debug', 'filespath', 'datapath', 'noagentupdate', 'launch', 'noserverbackup', 'mongodb', 'mongodbcol', 'wanonly', 'lanonly', 'nousers', 'mpsdebug', 'mpspass', 'ciralocalfqdn', 'dbexport', 'dbimport']; + var validArguments = ['_', 'notls', 'user', 'port', 'mpsport', 'redirport', 'cert', 'deletedomain', 'deletedefaultdomain', 'showusers', 'shownodes', 'showmeshes', 'showevents', 'showpower', 'showiplocations', 'help', 'exactports', 'install', 'uninstall', 'start', 'stop', 'restart', 'debug', 'filespath', 'datapath', 'noagentupdate', 'launch', 'noserverbackup', 'mongodb', 'mongodbcol', 'wanonly', 'lanonly', 'nousers', 'mpsdebug', 'mpspass', 'ciralocalfqdn', 'dbexport', 'dbimport']; for (var arg in obj.args) { if (validArguments.indexOf(arg.toLocaleLowerCase()) == -1) { console.log('Invalid argument "' + arg + '", use --help.'); return; } } if (obj.args.mongodb == true) { console.log('Must specify: --mongodb [connectionstring] \r\nSee https://docs.mongodb.com/manual/reference/connection-string/ for MongoDB connection string.'); return; } @@ -208,6 +208,7 @@ function CreateMeshCentralServer() { if (obj.args.showmeshes) { obj.db.GetAllType('mesh', function (err, docs) { console.log(docs); process.exit(); }); return; } if (obj.args.showevents) { obj.db.GetAllType('event', function (err, docs) { console.log(docs); process.exit(); }); return; } if (obj.args.showpower) { obj.db.GetAllType('power', function (err, docs) { console.log(docs); process.exit(); }); return; } + if (obj.args.showiplocations) { obj.db.GetAllType('iploc', function (err, docs) { console.log(docs); process.exit(); }); return; } if (obj.args.dbexport) { // Export the entire database to a JSON file if (obj.args.dbexport == true) { console.log('Use --dbexport [filename]'); process.exit(); } else { obj.db.GetAll(function (err, docs) { obj.fs.writeFileSync(obj.args.dbexport, JSON.stringify(docs)); console.log('Exported ' + docs.length + ' document(s).'); process.exit(); }); } diff --git a/package.json b/package.json index ba4f0c00ea..07dea7e9f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "meshcentral", - "version": "0.0.7-f", + "version": "0.0.7-g", "keywords": [ "Remote Management", "Intel AMT",