From fa5ce67e6758f3c3db823041bcc2d394b27b7606 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Tue, 11 Sep 2018 14:28:47 -0700 Subject: [PATCH] Fixed desktop tools --- MeshCentralServer.njsproj | 2 - agents/modules_meshcmd/process-manager.js | 27 +++++--- agents/modules_meshcore/process-manager.js | 76 +++++++++------------- views/default.handlebars | 3 +- webserver.js | 2 +- 5 files changed, 52 insertions(+), 58 deletions(-) diff --git a/MeshCentralServer.njsproj b/MeshCentralServer.njsproj index 21542aa6..8d050d23 100644 --- a/MeshCentralServer.njsproj +++ b/MeshCentralServer.njsproj @@ -31,8 +31,6 @@ - - diff --git a/agents/modules_meshcmd/process-manager.js b/agents/modules_meshcmd/process-manager.js index 47a7d58a..c09f7ac4 100644 --- a/agents/modules_meshcmd/process-manager.js +++ b/agents/modules_meshcmd/process-manager.js @@ -14,11 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -// JavaScript source code var GM = require('_GenericMarshal'); +// Used on Windows and Linux to get information about running processes function processManager() { - this._ObjectID = 'processManager'; + this._ObjectID = 'process-manager'; // Used for debugging, allows you to get the object type at runtime. + + // Setup the platform specific calls. switch (process.platform) { case 'win32': this._kernel32 = GM.CreateNativeProxy('kernel32.dll'); @@ -32,12 +34,16 @@ function processManager() { break; default: throw (process.platform + ' not supported'); + break; } + + // Return a object of: pid -> process information. this.getProcesses = function getProcesses(callback) { switch (process.platform) { - default: + default: // This is not a supported platform. throw ('Enumerating processes on ' + process.platform + ' not supported'); - case 'win32': + break; + case 'win32': // Windows processes var retVal = {}; var h = this._kernel32.CreateToolhelp32Snapshot(2, 0); var info = GM.CreateVariable(304); @@ -49,7 +55,7 @@ function processManager() { } if (callback) { callback.apply(this, [retVal]); } break; - case 'linux': + case 'linux': // Linux processes if (!this._psp) { this._psp = {}; } var p = this._childProcess.execFile("/bin/ps", ["ps", "-uxa"], { type: this._childProcess.SpawnTypes.TERM }); this._psp[p.pid] = p; @@ -68,8 +74,8 @@ function processManager() { if (i == 0 && tokens[x]) { key[tokens[x]] = keyi++; } if (i > 0 && tokens[x]) { tokenList.push(tokens[x]); } } - if ((i > 0) && (tokenList[key.PID])) { - retVal[tokenList[key.PID]] = { user: tokenList[key.USER], cmd: tokenList[key.COMMAND] }; + if (i > 0) { + if (tokenList[key.PID]) { retVal[tokenList[key.PID]] = { user: tokenList[key.USER], cmd: tokenList[key.COMMAND] }; } } } if (this.callback) { @@ -81,18 +87,23 @@ function processManager() { break; } }; + + // Get information about a specific process on Linux this.getProcessInfo = function getProcessInfo(pid) { switch (process.platform) { default: throw ('getProcessInfo() not supported for ' + process.platform); + break; case 'linux': - var status = require('fs').readFileSync('/proc/' + pid + '/status'), info = {}, lines = status.toString().split('\n'); + var status = require('fs').readFileSync('/proc/' + pid + '/status'); + var info = {}, lines = status.toString().split('\n'); for (var i in lines) { var tokens = lines[i].split(':'); if (tokens.length > 1) { tokens[1] = tokens[1].trim(); } info[tokens[0]] = tokens[1]; } return (info); + break; } }; } diff --git a/agents/modules_meshcore/process-manager.js b/agents/modules_meshcore/process-manager.js index a9a41985..c09f7ac4 100644 --- a/agents/modules_meshcore/process-manager.js +++ b/agents/modules_meshcore/process-manager.js @@ -14,14 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ - var GM = require('_GenericMarshal'); -function processManager() -{ - this._ObjectID = 'process-manager'; - switch(process.platform) - { +// Used on Windows and Linux to get information about running processes +function processManager() { + this._ObjectID = 'process-manager'; // Used for debugging, allows you to get the object type at runtime. + + // Setup the platform specific calls. + switch (process.platform) { case 'win32': this._kernel32 = GM.CreateNativeProxy('kernel32.dll'); this._kernel32.CreateMethod('GetLastError'); @@ -36,27 +36,26 @@ function processManager() throw (process.platform + ' not supported'); break; } - this.getProcesses = function getProcesses(callback) - { - switch(process.platform) - { - default: + + // Return a object of: pid -> process information. + this.getProcesses = function getProcesses(callback) { + switch (process.platform) { + default: // This is not a supported platform. throw ('Enumerating processes on ' + process.platform + ' not supported'); break; - case 'win32': - var retVal = []; + case 'win32': // Windows processes + var retVal = {}; var h = this._kernel32.CreateToolhelp32Snapshot(2, 0); var info = GM.CreateVariable(304); info.toBuffer().writeUInt32LE(304, 0); var nextProcess = this._kernel32.Process32First(h, info); - while (nextProcess.Val) - { - retVal.push({ pid: info.Deref(8, 4).toBuffer().readUInt32LE(0), command: info.Deref(GM.PointerSize == 4 ? 36 : 44, 260).String }); + while (nextProcess.Val) { + retVal[info.Deref(8, 4).toBuffer().readUInt32LE(0)] = { cmd: info.Deref(GM.PointerSize == 4 ? 36 : 44, 260).String }; nextProcess = this._kernel32.Process32Next(h, info); } if (callback) { callback.apply(this, [retVal]); } break; - case 'linux': + case 'linux': // Linux processes if (!this._psp) { this._psp = {}; } var p = this._childProcess.execFile("/bin/ps", ["ps", "-uxa"], { type: this._childProcess.SpawnTypes.TERM }); this._psp[p.pid] = p; @@ -65,32 +64,21 @@ function processManager() p.callback = callback; p.args = []; for (var i = 1; i < arguments.length; ++i) { p.args.push(arguments[i]); } - p.on('exit', function onGetProcesses() - { - delete this.Parent._psp[this.pid]; - var retVal = []; - var lines = this.ps.split('\x0D\x0A'); - var key = {}; - var keyi = 0; - for (var i in lines) - { + p.on('exit', function onGetProcesses() { + delete this.Parent._psp[this.pid]; + var retVal = {}, lines = this.ps.split('\x0D\x0A'), key = {}, keyi = 0; + for (var i in lines) { var tokens = lines[i].split(' '); var tokenList = []; - for(var x in tokens) - { + for (var x in tokens) { if (i == 0 && tokens[x]) { key[tokens[x]] = keyi++; } - if (i > 0 && tokens[x]) { tokenList.push(tokens[x]);} + if (i > 0 && tokens[x]) { tokenList.push(tokens[x]); } } - if(i>0) - { - if (tokenList[key.PID]) - { - retVal.push({ pid: tokenList[key.PID], user: tokenList[key.USER], command: tokenList[key.COMMAND] }); - } + if (i > 0) { + if (tokenList[key.PID]) { retVal[tokenList[key.PID]] = { user: tokenList[key.USER], cmd: tokenList[key.COMMAND] }; } } } - if (this.callback) - { + if (this.callback) { this.args.unshift(retVal); this.callback.apply(this.parent, this.args); } @@ -99,19 +87,17 @@ function processManager() break; } }; - this.getProcessInfo = function getProcessInfo(pid) - { - switch(process.platform) - { + + // Get information about a specific process on Linux + this.getProcessInfo = function getProcessInfo(pid) { + switch (process.platform) { default: throw ('getProcessInfo() not supported for ' + process.platform); break; case 'linux': var status = require('fs').readFileSync('/proc/' + pid + '/status'); - var info = {}; - var lines = status.toString().split('\n'); - for(var i in lines) - { + var info = {}, lines = status.toString().split('\n'); + for (var i in lines) { var tokens = lines[i].split(':'); if (tokens.length > 1) { tokens[1] = tokens[1].trim(); } info[tokens[0]] = tokens[1]; diff --git a/views/default.handlebars b/views/default.handlebars index 4ea5665c..5b33df47 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -1522,7 +1522,7 @@ QV('NoMeshesPanel', meshcount == 0); QV('devListToolbarView', (meshcount != 0) && (nodes.length > 0)); QV('devListToolbarSort', (meshcount != 0) && (nodes.length > 0) && (view < 4)); - if ((meshcount == 0) || (nodes.length == 0)) { view = 1; } + if ((meshcount == 0) || (nodes.length == 0)) { view = 1; sort = 0; } if (view == 4) { setTimeout( function() { if (xxmap.map != null) { xxmap.map.updateSize(); } }, 200); // TODO @@ -3711,7 +3711,6 @@ if (Q('DeskTools').nodeid != message.nodeid) return; var p = [], processes = null; try { processes = JSON.parse(message.value); } catch (e) { } - console.log(processes); if (processes != null) { for (var pid in processes) { p.push( { p:parseInt(pid), c:processes[pid].cmd, d:processes[pid].cmd.toLowerCase(), u: processes[pid].user } ); } if (deskTools.sort == 0) { p.sort(sortProcessPid); } else if (deskTools.sort == 1) { p.sort(sortProcessName); } diff --git a/webserver.js b/webserver.js index 2c6040bd..ed533e37 100644 --- a/webserver.js +++ b/webserver.js @@ -653,7 +653,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { obj.users[req.session.userid] = { type: 'user', _id: req.session.userid, name: '~', email: '~', domain: domain.id, siteadmin: 0xFFFFFFFF }; obj.db.SetUser(obj.users[req.session.userid]); } - } else if (obj.args.user && (!req.session || !req.session.userid) && obj.users['user/' + domain.id + '/' + obj.args.user.toLowerCase()]) { + } else if (obj.args.user && obj.users['user/' + domain.id + '/' + obj.args.user.toLowerCase()]) { // If a default user is active, setup the session here. if (req.session && req.session.loginmode) { delete req.session.loginmode; } req.session.userid = 'user/' + domain.id + '/' + obj.args.user.toLowerCase();