diff --git a/meshuser.js b/meshuser.js
index 9e4e3baf..3dea9278 100644
--- a/meshuser.js
+++ b/meshuser.js
@@ -2809,44 +2809,65 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
return;
}
- // Check we have the rights to run commands on this device
- if ((rights & MESHRIGHT_REMOTECOMMAND) == 0) {
- if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'Access denied' })); } catch (ex) { } }
- return;
- }
+ if (command.type == 4) {
+ // This is an agent console command
- // Get the agent and run the commands
- var agent = parent.wsagents[node._id];
- if ((agent != null) && (agent.authenticated == 2) && (agent.agentInfo != null)) {
- // Check if this agent is correct for this command type
- // command.type 1 = Windows Command, 2 = Windows PowerShell, 3 = Linux/BSD/macOS
- var commandsOk = false;
- if ((agent.agentInfo.agentId > 0) && (agent.agentInfo.agentId < 5)) {
- // Windows Agent
- if ((command.type == 1) || (command.type == 2)) { commandsOk = true; }
- else if (command.type === 0) { command.type = 1; commandsOk = true; } // Set the default type of this agent
- } else {
- // Non-Windows Agent
- if (command.type == 3) { commandsOk = true; }
- else if (command.type === 0) { command.type = 3; commandsOk = true; } // Set the default type of this agent
+ // Check we have the rights to run commands on this device, MESHRIGHT_REMOTECONTROL & MESHRIGHT_AGENTCONSOLE are needed
+ if ((rights & 24) != 24) {
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'Access denied' })); } catch (ex) { } }
+ return;
}
- if (commandsOk == true) {
- // Send the commands to the agent
- try { agent.send(JSON.stringify({ action: 'runcommands', type: command.type, cmds: command.cmds, runAsUser: command.runAsUser })); } catch (ex) { }
- if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'OK' })); } catch (ex) { } }
- // Send out an event that these commands where run on this device
- var targets = parent.CreateNodeDispatchTargets(node.meshid, node._id, ['server-users', user._id]);
- var msgid = 24; // "Running commands"
- if (command.type == 1) { msgid = 99; } // "Running commands as user"
- if (command.type == 2) { msgid = 100; } // "Running commands as user if possible"
- var event = { etype: 'node', userid: user._id, username: user.name, nodeid: node._id, action: 'runcommands', msg: 'Running commands', msgid: msgid, cmds: command.cmds, cmdType: command.type, runAsUser: command.runAsUser, domain: domain.id };
- parent.parent.DispatchEvent(targets, obj, event);
+ // Send the commands to the agent
+ var agent = parent.wsagents[node._id];
+ if ((agent != null) && (agent.authenticated == 2) && (agent.agentInfo != null)) {
+ try { agent.send(JSON.stringify({ action: 'msg', type: 'console', value: command.cmds, rights: rights, sessionid: ws.sessionId })); } catch (ex) { }
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'OK' })); } catch (ex) { } }
} else {
- if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'Invalid command type' })); } catch (ex) { } }
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'Agent not connected' })); } catch (ex) { } }
}
} else {
- if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'Agent not connected' })); } catch (ex) { } }
+ // This is a standard (bash/shell/powershell) command.
+
+ // Check we have the rights to run commands on this device
+ if ((rights & MESHRIGHT_REMOTECOMMAND) == 0) {
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'Access denied' })); } catch (ex) { } }
+ return;
+ }
+
+ // Get the agent and run the commands
+ var agent = parent.wsagents[node._id];
+ if ((agent != null) && (agent.authenticated == 2) && (agent.agentInfo != null)) {
+ // Check if this agent is correct for this command type
+ // command.type 1 = Windows Command, 2 = Windows PowerShell, 3 = Linux/BSD/macOS
+ var commandsOk = false;
+ if ((agent.agentInfo.agentId > 0) && (agent.agentInfo.agentId < 5)) {
+ // Windows Agent
+ if ((command.type == 1) || (command.type == 2)) { commandsOk = true; }
+ else if (command.type === 0) { command.type = 1; commandsOk = true; } // Set the default type of this agent
+ } else {
+ // Non-Windows Agent
+ if (command.type == 3) { commandsOk = true; }
+ else if (command.type === 0) { command.type = 3; commandsOk = true; } // Set the default type of this agent
+ }
+ if (commandsOk == true) {
+ // Send the commands to the agent
+ try { agent.send(JSON.stringify({ action: 'runcommands', type: command.type, cmds: command.cmds, runAsUser: command.runAsUser })); } catch (ex) { }
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'OK' })); } catch (ex) { } }
+
+ // Send out an event that these commands where run on this device
+ var targets = parent.CreateNodeDispatchTargets(node.meshid, node._id, ['server-users', user._id]);
+ var msgid = 24; // "Running commands"
+ if (command.type == 1) { msgid = 99; } // "Running commands as user"
+ if (command.type == 2) { msgid = 100; } // "Running commands as user if possible"
+ var event = { etype: 'node', userid: user._id, username: user.name, nodeid: node._id, action: 'runcommands', msg: 'Running commands', msgid: msgid, cmds: command.cmds, cmdType: command.type, runAsUser: command.runAsUser, domain: domain.id };
+ parent.parent.DispatchEvent(targets, obj, event);
+ } else {
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'Invalid command type' })); } catch (ex) { } }
+ }
+ } else {
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'runcommands', responseid: command.responseid, result: 'Agent not connected' })); } catch (ex) { } }
+ }
}
});
}
diff --git a/views/default.handlebars b/views/default.handlebars
index 5d19d59a..3f5703db 100644
--- a/views/default.handlebars
+++ b/views/default.handlebars
@@ -5534,24 +5534,24 @@
p2downloadDeviceInfo();
} else if (op == 106) {
// Run commands
- var wintype = false, linuxtype = false, chkNodeIds = getCheckedDevices();
+ var wintype = false, linuxtype = false, agenttype = false, chkNodeIds = getCheckedDevices();
for (var i in chkNodeIds) {
var n = getNodeFromId(chkNodeIds[i]);
- if (n.agent) { if ((n.agent.id > 0) && (n.agent.id < 5)) { wintype = true; } else { linuxtype = true; } }
+ if (n.agent) { if ((GetNodeRights(n) & 24) == 24) { agenttype = true; } if ((n.agent.id > 0) && (n.agent.id < 5)) { wintype = true; } else { linuxtype = true; } }
}
- if ((wintype == true) || (linuxtype == true)) {
+ if ((wintype == true) || (linuxtype == true) || (agenttype == true)) {
var x = "Run commands on selected devices." + '
';
- if (wintype == true) {
- x += '';
- }
+ x += '';
x += '';
x += '';
setDialogMode(2, "Run Commands", 3, d2groupActionFunctionRunCommands, x);
Q('d2runcmd').focus();
//QE('idx_dlgOkButton', true);
+ d2runCommandValidate();
}
} else if (op == 107) {
// Edit tags
@@ -5608,6 +5608,7 @@
}
}
+ function d2runCommandValidate() { QV('d2cmduser', Q('d2cmdtype').value < 4); }
function d2batchUploadValidate() { QE('idx_dlgOkButton', (Q('d2uploadinput').files.length != 0) && ((Q('d2winuploadpath') == null) || (Q('d2winuploadpath').value != '')) && ((Q('d2linuxuploadpath') == null) || (Q('d2linuxuploadpath').value != ''))); }
function d2batchUploadValidateOk() { Q('d2batchUploadSubmit').click(); }
function d2groupActionFunctionAgentUpdateExec() { meshserver.send({ action: 'updateAgents', nodeids: getCheckedDevices() }); }