dhcp.js is not only on Linux.

This commit is contained in:
Ylian Saint-Hilaire 2021-07-24 09:28:41 -07:00
parent 14ebbf0f77
commit 345f3c12b4
3 changed files with 376 additions and 109 deletions

View File

@ -46,11 +46,9 @@ var MESHRIGHT_CHATNOTIFY = 16384;
var MESHRIGHT_UNINSTALL = 32768; var MESHRIGHT_UNINSTALL = 32768;
var MESHRIGHT_NODESKTOP = 65536; var MESHRIGHT_NODESKTOP = 65536;
if (require('MeshAgent').ARCHID == null) if (require('MeshAgent').ARCHID == null) {
{
var id = null; var id = null;
switch (process.platform) switch (process.platform) {
{
case 'win32': case 'win32':
id = require('_GenericMarshal').PointerSize == 4 ? 3 : 4; id = require('_GenericMarshal').PointerSize == 4 ? 3 : 4;
break; break;
@ -58,12 +56,10 @@ if (require('MeshAgent').ARCHID == null)
id = require('_GenericMarshal').PointerSize == 4 ? 31 : 30; id = require('_GenericMarshal').PointerSize == 4 ? 31 : 30;
break; break;
case 'darwin': case 'darwin':
try try {
{
id = require('os').arch() == 'x64' ? 16 : 29; id = require('os').arch() == 'x64' ? 16 : 29;
} }
catch (xx) catch (xx) {
{
id = 16; id = 16;
} }
break; break;
@ -280,11 +276,9 @@ obj.DAIPC.on('connection', function (c) {
}); });
// Send current sessions to registered apps // Send current sessions to registered apps
function broadcastSessionsToRegisteredApps(x) function broadcastSessionsToRegisteredApps(x) {
{
var p = {}, i; var p = {}, i;
for (i = 0; sendAgentMessage.messages != null && i < sendAgentMessage.messages.length; ++i) for (i = 0; sendAgentMessage.messages != null && i < sendAgentMessage.messages.length; ++i) {
{
p[i] = sendAgentMessage.messages[i]; p[i] = sendAgentMessage.messages[i];
} }
tunnelUserCount.msg = p; tunnelUserCount.msg = p;
@ -849,8 +843,7 @@ function handleServerCommand(data) {
// Perform manual server TLS certificate checking based on the certificate hash given by the server. // Perform manual server TLS certificate checking based on the certificate hash given by the server.
woptions.rejectUnauthorized = 0; woptions.rejectUnauthorized = 0;
woptions.checkServerIdentity = function checkServerIdentity(certs) woptions.checkServerIdentity = function checkServerIdentity(certs) {
{
/* /*
try { sendConsoleText("certs[0].digest: " + certs[0].digest); } catch (ex) { sendConsoleText(ex); } try { sendConsoleText("certs[0].digest: " + certs[0].digest); } catch (ex) { sendConsoleText(ex); }
try { sendConsoleText("certs[0].fingerprint: " + certs[0].fingerprint); } catch (ex) { sendConsoleText(ex); } try { sendConsoleText("certs[0].fingerprint: " + certs[0].fingerprint); } catch (ex) { sendConsoleText(ex); }
@ -1057,17 +1050,13 @@ function handleServerCommand(data) {
} }
case 'setclip': { case 'setclip': {
// Set the load clipboard to a user value // Set the load clipboard to a user value
if (typeof data.data == 'string') if (typeof data.data == 'string') {
{
MeshServerLogEx(22, [data.data.length], "Setting clipboard content, " + data.data.length + " byte(s)", data); MeshServerLogEx(22, [data.data.length], "Setting clipboard content, " + data.data.length + " byte(s)", data);
if (require('MeshAgent').isService) if (require('MeshAgent').isService) {
{ if (process.platform != 'win32') {
if (process.platform != 'win32')
{
require('clipboard').dispatchWrite(data.data); require('clipboard').dispatchWrite(data.data);
} }
else else {
{
var clipargs = data.data; var clipargs = data.data;
var uid = require('user-sessions').consoleUid(); var uid = require('user-sessions').consoleUid();
var user = require('user-sessions').getUsername(uid); var user = require('user-sessions').getUsername(uid);
@ -1077,20 +1066,17 @@ function handleServerCommand(data) {
this._dispatcher = require('win-dispatcher').dispatch({ user: user, modules: [{ name: 'clip-dispatch', script: "module.exports = { dispatch: function dispatch(val) { require('clipboard')(val); process.exit(); } };" }], launch: { module: 'clip-dispatch', method: 'dispatch', args: [clipargs] } }); this._dispatcher = require('win-dispatcher').dispatch({ user: user, modules: [{ name: 'clip-dispatch', script: "module.exports = { dispatch: function dispatch(val) { require('clipboard')(val); process.exit(); } };" }], launch: { module: 'clip-dispatch', method: 'dispatch', args: [clipargs] } });
this._dispatcher.parent = this; this._dispatcher.parent = this;
//require('events').setFinalizerMetadata.call(this._dispatcher, 'clip-dispatch'); //require('events').setFinalizerMetadata.call(this._dispatcher, 'clip-dispatch');
this._dispatcher.on('connection', function (c) this._dispatcher.on('connection', function (c) {
{
this._c = c; this._c = c;
this._c.root = this.parent; this._c.root = this.parent;
this._c.on('end', function () this._c.on('end', function () {
{
this.root._dispatcher = null; this.root._dispatcher = null;
this.root = null; this.root = null;
}); });
}); });
} }
} }
else else {
{
require("clipboard")(data.data); require("clipboard")(data.data);
} // Set the clipboard } // Set the clipboard
mesh.SendCommand({ action: 'msg', type: 'setclip', sessionid: data.sessionid, success: true }); mesh.SendCommand({ action: 'msg', type: 'setclip', sessionid: data.sessionid, success: true });
@ -1324,7 +1310,7 @@ function handleServerCommand(data) {
if (data.tag == 'info') { sendConsoleText(JSON.stringify(data, null, 2)); } if (data.tag == 'info') { sendConsoleText(JSON.stringify(data, null, 2)); }
if (data.tag == 'install') { if (data.tag == 'install') {
data.func = function (options, success) { data.func = function (options, success) {
sendConsoleText('Download of MeshCentral Assistant ' + (success?'succeed':'failed')); sendConsoleText('Download of MeshCentral Assistant ' + (success ? 'succeed' : 'failed'));
if (success) { if (success) {
// TODO: Install & Run // TODO: Install & Run
} }
@ -2885,7 +2871,7 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
case 'help': { // Displays available commands case 'help': { // Displays available commands
var fin = '', f = '', availcommands = 'agentupdate,errorlog,msh,timerinfo,coreinfo,coredump,service,fdsnapshot,fdcount,startupoptions,alert,agentsize,versions,help,info,osinfo,args,print,type,dbkeys,dbget,dbset,dbcompact,eval,parseuri,httpget,wslist,plugin,wsconnect,wssend,wsclose,notify,ls,ps,kill,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,openurl,getscript,getclip,setclip,log,av,cpuinfo,sysinfo,apf,scanwifi,wallpaper,agentmsg'; var fin = '', f = '', availcommands = 'agentupdate,errorlog,msh,timerinfo,coreinfo,coredump,service,fdsnapshot,fdcount,startupoptions,alert,agentsize,versions,help,info,osinfo,args,print,type,dbkeys,dbget,dbset,dbcompact,eval,parseuri,httpget,wslist,plugin,wsconnect,wssend,wsclose,notify,ls,ps,kill,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,openurl,getscript,getclip,setclip,log,av,cpuinfo,sysinfo,apf,scanwifi,wallpaper,agentmsg';
if (require('os').dns != null) { availcommands += ',dnsinfo'; } if (require('os').dns != null) { availcommands += ',dnsinfo'; }
try { require('dhcp'); availcommands += ',dhcp'; } catch (e) { } try { require('linux-dhcp'); availcommands += ',dhcp'; } catch (e) { }
if (process.platform == 'win32') { availcommands += ',cs,safemode,wpfhwacceleration,uac'; } if (process.platform == 'win32') { availcommands += ',cs,safemode,wpfhwacceleration,uac'; }
if (amt != null) { availcommands += ',amt,amtconfig,amtevents'; } if (amt != null) { availcommands += ',amt,amtconfig,amtevents'; }
if (process.platform != 'freebsd') { availcommands += ',vm'; } if (process.platform != 'freebsd') { availcommands += ',vm'; }
@ -2901,27 +2887,15 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
response = "Available commands: \r\n" + fin + "."; response = "Available commands: \r\n" + fin + ".";
break; break;
} }
case 'dhcp': case 'dhcp': // This command is only supported on Linux, this is because Linux does not give us the DNS suffix for each network adapter independently so we have to ask the DHCP server.
{
try
{
require('dhcp');
}
catch(e)
{
response = 'Unknown command "dhcp", type "help" for list of avaialble commands.';
break;
}
if(args['_'].length==0)
{ {
try { require('linux-dhcp'); } catch (e) { response = 'Unknown command "dhcp", type "help" for list of avaialble commands.'; break; }
if (args['_'].length == 0) {
var j = require('os').networkInterfaces(); var j = require('os').networkInterfaces();
var ifcs = []; var ifcs = [];
for(var i in j) for (var i in j) {
{ for (var z in j[i]) {
for (var z in j[i]) if (j[i][z].status == 'up' && j[i][z].type != 'loopback' && j[i][z].address != null) {
{
if (j[i][z].status == 'up' && j[i][z].type != 'loopback' && j[i][z].address != null)
{
ifcs.push('"' + i + '"'); ifcs.push('"' + i + '"');
break; break;
} }
@ -2929,15 +2903,12 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
} }
response = 'Proper usage: dhcp [' + ifcs.join(' | ') + ']'; response = 'Proper usage: dhcp [' + ifcs.join(' | ') + ']';
} }
else else {
{ require('linux-dhcp').client.info(args['_'][0]).
require('dhcp').client.info(args['_'][0]). then(function (d) {
then(function (d)
{
sendConsoleText(JSON.stringify(d, null, 1), sessionid); sendConsoleText(JSON.stringify(d, null, 1), sessionid);
}, },
function (e) function (e) {
{
sendConsoleText(e, sessionid); sendConsoleText(e, sessionid);
}); });
} }
@ -3064,24 +3035,19 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
break; break;
} }
case 'agentmsg': { case 'agentmsg': {
if (args['_'].length == 0) if (args['_'].length == 0) {
{
response = "Proper usage:\r\n agentmsg add \"[message]\" [iconIndex]\r\n agentmsg remove [index]\r\n agentmsg list"; // Display usage response = "Proper usage:\r\n agentmsg add \"[message]\" [iconIndex]\r\n agentmsg remove [index]\r\n agentmsg list"; // Display usage
} else } else {
{ if ((args['_'][0] == 'add') && (args['_'].length > 1)) {
if ((args['_'][0] == 'add') && (args['_'].length > 1))
{
var msgID, iconIndex = 0; var msgID, iconIndex = 0;
if (args['_'].length >= 3) { try { iconIndex = parseInt(args['_'][2]); } catch (e) { } } if (args['_'].length >= 3) { try { iconIndex = parseInt(args['_'][2]); } catch (e) { } }
if (typeof iconIndex != 'number') { iconIndex = 0; } if (typeof iconIndex != 'number') { iconIndex = 0; }
msgID = sendAgentMessage(args['_'][1], iconIndex); msgID = sendAgentMessage(args['_'][1], iconIndex);
response = 'Agent message: ' + msgID + ' added.'; response = 'Agent message: ' + msgID + ' added.';
} else if ((args['_'][0] == 'remove') && (args['_'].length > 1)) } else if ((args['_'][0] == 'remove') && (args['_'].length > 1)) {
{
var r = removeAgentMessage(args['_'][1]); var r = removeAgentMessage(args['_'][1]);
response = 'Message ' + (r ? 'removed' : 'NOT FOUND'); response = 'Message ' + (r ? 'removed' : 'NOT FOUND');
} else if (args['_'][0] == 'list') } else if (args['_'][0] == 'list') {
{
response = JSON.stringify(sendAgentMessage(), null, 2); response = JSON.stringify(sendAgentMessage(), null, 2);
} }
broadcastSessionsToRegisteredApps(); broadcastSessionsToRegisteredApps();
@ -3518,8 +3484,7 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
if (process.platform != 'win32') { if (process.platform != 'win32') {
require('clipboard').dispatchWrite(args['_'][0]); require('clipboard').dispatchWrite(args['_'][0]);
} }
else else {
{
var clipargs = args['_'][0]; var clipargs = args['_'][0];
var uid = require('user-sessions').consoleUid(); var uid = require('user-sessions').consoleUid();
var user = require('user-sessions').getUsername(uid); var user = require('user-sessions').getUsername(uid);
@ -3529,12 +3494,10 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
this._dispatcher = require('win-dispatcher').dispatch({ user: user, modules: [{ name: 'clip-dispatch', script: "module.exports = { dispatch: function dispatch(val) { require('clipboard')(val); process.exit(); } };" }], launch: { module: 'clip-dispatch', method: 'dispatch', args: [clipargs] } }); this._dispatcher = require('win-dispatcher').dispatch({ user: user, modules: [{ name: 'clip-dispatch', script: "module.exports = { dispatch: function dispatch(val) { require('clipboard')(val); process.exit(); } };" }], launch: { module: 'clip-dispatch', method: 'dispatch', args: [clipargs] } });
this._dispatcher.parent = this; this._dispatcher.parent = this;
//require('events').setFinalizerMetadata.call(this._dispatcher, 'clip-dispatch'); //require('events').setFinalizerMetadata.call(this._dispatcher, 'clip-dispatch');
this._dispatcher.on('connection', function (c) this._dispatcher.on('connection', function (c) {
{
this._c = c; this._c = c;
this._c.root = this.parent; this._c.root = this.parent;
this._c.on('end', function () this._c.on('end', function () {
{
this.root._dispatcher = null; this.root._dispatcher = null;
this.root = null; this.root = null;
}); });
@ -3542,8 +3505,7 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
} }
response = 'Setting clipboard to: "' + args['_'][0] + '"'; response = 'Setting clipboard to: "' + args['_'][0] + '"';
} }
else else {
{
require("clipboard")(args['_'][0]); response = 'Setting clipboard to: "' + args['_'][0] + '"'; require("clipboard")(args['_'][0]); response = 'Setting clipboard to: "' + args['_'][0] + '"';
} }
} }
@ -4108,20 +4070,16 @@ function sendConsoleText(text, sessionid) {
if (sessionid != 'pipe') { require('MeshAgent').SendCommand({ action: 'msg', type: 'console', value: text, sessionid: sessionid }); } if (sessionid != 'pipe') { require('MeshAgent').SendCommand({ action: 'msg', type: 'console', value: text, sessionid: sessionid }); }
} }
function removeAgentMessage(msgid) function removeAgentMessage(msgid) {
{
var ret = false; var ret = false;
if (msgid == null) if (msgid == null) {
{
// Delete all messages // Delete all messages
sendAgentMessage.messages = []; sendAgentMessage.messages = [];
ret = true; ret = true;
} }
else else {
{
var i = sendAgentMessage.messages.findIndex(function (v) { return (v.id == msgid); }); var i = sendAgentMessage.messages.findIndex(function (v) { return (v.id == msgid); });
if (i >= 0) if (i >= 0) {
{
sendAgentMessage.messages.splice(i, 1); sendAgentMessage.messages.splice(i, 1);
ret = true; ret = true;
} }
@ -4131,33 +4089,26 @@ function removeAgentMessage(msgid)
} }
// Send a mesh agent message to server, placing a bubble/badge on the agent device // Send a mesh agent message to server, placing a bubble/badge on the agent device
function sendAgentMessage(msg, icon, serverid, first) function sendAgentMessage(msg, icon, serverid, first) {
{ if (sendAgentMessage.messages == null) {
if (sendAgentMessage.messages == null)
{
sendAgentMessage.messages = []; sendAgentMessage.messages = [];
} }
if (arguments.length > 0) if (arguments.length > 0) {
{ if (first == null || (serverid && first && sendAgentMessage.messages.findIndex(function (v) { return (v.msgid == serverid); }) < 0)) {
if (first == null || (serverid && first && sendAgentMessage.messages.findIndex(function (v) { return (v.msgid == serverid); }) < 0))
{
sendAgentMessage.messages.push({ msg: msg, icon: icon, msgid: serverid }); sendAgentMessage.messages.push({ msg: msg, icon: icon, msgid: serverid });
sendAgentMessage.messages.peek().id = sendAgentMessage.messages.peek()._hashCode(); sendAgentMessage.messages.peek().id = sendAgentMessage.messages.peek()._hashCode();
} }
} }
var p = {}, i; var p = {}, i;
for (i = 0; i < sendAgentMessage.messages.length; ++i) for (i = 0; i < sendAgentMessage.messages.length; ++i) {
{
p[i] = sendAgentMessage.messages[i]; p[i] = sendAgentMessage.messages[i];
} }
try try {
{
require('MeshAgent').SendCommand({ action: 'sessions', type: 'msg', value: p }); require('MeshAgent').SendCommand({ action: 'sessions', type: 'msg', value: p });
} }
catch(ex) catch (ex) {
{
} }
return (arguments.length > 0 ? sendAgentMessage.messages.peek().id : sendAgentMessage.messages); return (arguments.length > 0 ? sendAgentMessage.messages.peek().id : sendAgentMessage.messages);
} }
@ -4557,24 +4508,19 @@ function agentUpdate_Start(updateurl, updateoptions) {
//process.exit = function (code) { console.log("Exit with code: " + code.toString()); } //process.exit = function (code) { console.log("Exit with code: " + code.toString()); }
// Called when the server connection state changes // Called when the server connection state changes
function handleServerConnection(state) function handleServerConnection(state) {
{
meshServerConnectionState = state; meshServerConnectionState = state;
if (meshServerConnectionState == 0) if (meshServerConnectionState == 0) {
{
// Server disconnected // Server disconnected
if (selfInfoUpdateTimer != null) { clearInterval(selfInfoUpdateTimer); selfInfoUpdateTimer = null; } if (selfInfoUpdateTimer != null) { clearInterval(selfInfoUpdateTimer); selfInfoUpdateTimer = null; }
lastSelfInfo = null; lastSelfInfo = null;
} else } else {
{
// Server connected, send mesh core information // Server connected, send mesh core information
if (require('MeshAgent').ServerInfo == null || require('MeshAgent').ServerInfo.ControlChannelCertificate == null) if (require('MeshAgent').ServerInfo == null || require('MeshAgent').ServerInfo.ControlChannelCertificate == null) {
{
// Outdated Agent, will have insecure tunnels // Outdated Agent, will have insecure tunnels
sendAgentMessage("This agent has an outdated certificate validation mechanism, consider updating.", 3, 118); sendAgentMessage("This agent has an outdated certificate validation mechanism, consider updating.", 3, 118);
} }
else if (global._MSH == null) else if (global._MSH == null) {
{
sendAgentMessage("This is an old agent version, consider updating.", 3, 117); sendAgentMessage("This is an old agent version, consider updating.", 3, 117);
} }
@ -4587,15 +4533,13 @@ function handleServerConnection(state)
// Update the server on with basic info, logged in users and more advanced stuff, like Intel ME and Network Settings // Update the server on with basic info, logged in users and more advanced stuff, like Intel ME and Network Settings
meInfoStr = null; meInfoStr = null;
sendPeriodicServerUpdate(null, true); sendPeriodicServerUpdate(null, true);
if (selfInfoUpdateTimer == null) if (selfInfoUpdateTimer == null) {
{
selfInfoUpdateTimer = setInterval(sendPeriodicServerUpdate, 1200000); // 20 minutes selfInfoUpdateTimer = setInterval(sendPeriodicServerUpdate, 1200000); // 20 minutes
selfInfoUpdateTimer.metadata = 'meshcore (InfoUpdate Timer)'; selfInfoUpdateTimer.metadata = 'meshcore (InfoUpdate Timer)';
} }
// Send any state messages // Send any state messages
if (Object.keys(tunnelUserCount.msg).length > 0) if (Object.keys(tunnelUserCount.msg).length > 0) {
{
sendAgentMessage(); sendAgentMessage();
broadcastSessionsToRegisteredApps(); broadcastSessionsToRegisteredApps();
} }

File diff suppressed because one or more lines are too long