diff --git a/agents/MeshService.exe b/agents/MeshService.exe index ec1aac33..f497fc5e 100644 Binary files a/agents/MeshService.exe and b/agents/MeshService.exe differ diff --git a/agents/MeshService64.exe b/agents/MeshService64.exe index 961e691f..ef38b60d 100644 Binary files a/agents/MeshService64.exe and b/agents/MeshService64.exe differ diff --git a/agents/meshagent_arm b/agents/meshagent_arm index 713c1dd3..3fb73d09 100644 Binary files a/agents/meshagent_arm and b/agents/meshagent_arm differ diff --git a/agents/meshagent_pi b/agents/meshagent_pi index 15e3e84b..e693257c 100644 Binary files a/agents/meshagent_pi and b/agents/meshagent_pi differ diff --git a/agents/meshagent_pogo b/agents/meshagent_pogo index 79007df8..4a2aa802 100644 Binary files a/agents/meshagent_pogo and b/agents/meshagent_pogo differ diff --git a/agents/meshagent_poky b/agents/meshagent_poky index 8ccc7aeb..996a6b43 100644 Binary files a/agents/meshagent_poky and b/agents/meshagent_poky differ diff --git a/agents/meshagent_poky64 b/agents/meshagent_poky64 index 662ffb6e..8f5c9649 100644 Binary files a/agents/meshagent_poky64 and b/agents/meshagent_poky64 differ diff --git a/agents/meshagent_x86 b/agents/meshagent_x86 index 4490a0a8..9d0ab1c2 100644 Binary files a/agents/meshagent_x86 and b/agents/meshagent_x86 differ diff --git a/agents/meshagent_x86-64 b/agents/meshagent_x86-64 index e93ba729..9d5030cb 100644 Binary files a/agents/meshagent_x86-64 and b/agents/meshagent_x86-64 differ diff --git a/agents/meshagent_x86-64_nokvm b/agents/meshagent_x86-64_nokvm index 35bd7a5f..7b0d75f6 100644 Binary files a/agents/meshagent_x86-64_nokvm and b/agents/meshagent_x86-64_nokvm differ diff --git a/agents/meshagent_x86_nokvm b/agents/meshagent_x86_nokvm index ec91cc18..f9665969 100644 Binary files a/agents/meshagent_x86_nokvm and b/agents/meshagent_x86_nokvm differ diff --git a/agents/meshcmd.js b/agents/meshcmd.js index 244ed9f7..12a9bf5e 100644 --- a/agents/meshcmd.js +++ b/agents/meshcmd.js @@ -391,7 +391,7 @@ function startLms(func) { //var xx = AllWsman[4]; //console.log(xx); //osamtstack.Get(AllWsmanRequests.shift(), startLmsWsmanResponse, null, true); - osamtstack.Get('IPS_SecIOService', startLmsWsmanResponse, null, true); + //osamtstack.Get('IPS_SecIOService', startLmsWsmanResponse, null, true); //osamtstack.BatchEnum(null, ['IPS_KVMRedirectionSettingData', 'CIM_SoftwareIdentity'], startLmsWsmanResponse, null, true); //osamtstack.BatchEnum(null, AllWsman, startLmsWsmanResponse, null, true); }); diff --git a/agents/meshcore.js b/agents/meshcore.js index 95bd8d82..ea6c5524 100644 --- a/agents/meshcore.js +++ b/agents/meshcore.js @@ -31,7 +31,7 @@ function createMeshCore(agent) { var fs = require('fs'); var rtc = require('ILibWebRTC'); var amtMei = null, amtLms = null, amtLmsState = 0; - var amtMeiConnected = 0, amtMeiState = null, amtMeiTmpState = null; + var amtMeiConnected = 0, amtMeiTmpState = null; var wifiScannerLib = null; var wifiScanner = null; var networkMonitor = null; @@ -77,7 +77,7 @@ function createMeshCore(agent) { amtMeiConnected = 1; amtMei = new amtMeiLib(); amtMei.on('error', function (e) { amtMeiLib = null; amtMei = null; sendPeriodicServerUpdate(); }); - amtMei.on('connect', function () { amtMeiConnected = 2; getAmtInfo(); }); + amtMei.on('connect', function () { amtMeiConnected = 2; sendPeriodicServerUpdate(); }); } catch (e) { amtMeiLib = null; amtMei = null; amtMeiConnected = -1; } // Try to load up the WIFI scanner @@ -403,7 +403,7 @@ function createMeshCore(agent) { // List all the drives in the root, or the root itself var results = null; try { results = fs.readDrivesSync(); } catch (e) { } // TODO: Anyway to get drive total size and free space? Could draw a progress bar. - //console.log('a', objToString(results, 0, '.')); + //console.log('a', objToString(results, 0, ' ')); if (results != null) { for (var i = 0; i < results.length; ++i) { var drive = { n: results[i].name, t: 1 }; @@ -515,6 +515,7 @@ function createMeshCore(agent) { this.write(new Buffer(JSON.stringify({ action: 'uploadack', reqid: this.httprequest.uploadFileid }))); // Ask for more data return; } + /* // If this is a download, send more of the file if (this.httprequest.downloadFile) { var buf = new Buffer(4096); @@ -523,14 +524,15 @@ function createMeshCore(agent) { if (len > 0) { this.write(buf.slice(0, len)); } else { fs.closeSync(this.httprequest.downloadFile); this.httprequest.downloadFile = undefined; this.end(); } return; } - + */ + if (this.httprequest.state == 0) { // Check if this is a relay connection if (data == 'c') { this.httprequest.state = 1; sendConsoleText("Tunnel #" + this.httprequest.index + " now active", this.httprequest.sessionid); } } else { // Handle tunnel data if (this.httprequest.protocol == 0) { // 1 = SOL, 2 = KVM, 3 = IDER, 4 = Files, 5 = FileTransfer - // Take a look at the protocolab + // Take a look at the protocol this.httprequest.protocol = parseInt(data); if (typeof this.httprequest.protocol != 'number') { this.httprequest.protocol = 0; } if (this.httprequest.protocol == 1) { @@ -550,8 +552,7 @@ function createMeshCore(agent) { this.on('data', onTunnelControlData); //this.write('MeshCore Terminal Hello'); if (process.platform != 'win32') { this.httprequest.process.stdin.write("stty erase ^H\nalias ls='ls --color=auto'\nclear\n"); } - } - if (this.httprequest.protocol == 2) { + } else if (this.httprequest.protocol == 2) { // Remote desktop using native pipes this.httprequest.desktop = { state: 0, kvm: mesh.getRemoteDesktopStream(), tunnel: this }; this.httprequest.desktop.kvm.parent = this.httprequest.desktop; @@ -568,8 +569,7 @@ function createMeshCore(agent) { this.removeAllListeners('data'); this.on('data', onTunnelControlData); //this.write('MeshCore KVM Hello!1'); - } - else if (this.httprequest.protocol == 5) { + } else if (this.httprequest.protocol == 5) { // Setup files // NOP } @@ -579,7 +579,6 @@ function createMeshCore(agent) { this.httprequest.process.write(data); } else if (this.httprequest.protocol == 2) { // Send data into remote desktop - // TODO ADD REMOTE DESKTOP (This is test code) if (this.httprequest.desktop.state == 0) { this.write(new Buffer(String.fromCharCode(0x11, 0xFE, 0x00, 0x00, 0x4D, 0x45, 0x53, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02))); this.httprequest.desktop.state = 1; @@ -590,9 +589,13 @@ function createMeshCore(agent) { // Process files commands var cmd = null; try { cmd = JSON.parse(data); } catch (e) { }; - if ((cmd == null) || (cmd.action == undefined)) { return; } + if (cmd == null) { return; } + if ((cmd.ctrlChannel == '102938') || ((cmd.type == 'offer') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now. + if (cmd.action == undefined) { return; } + //sendConsoleText('CMD: ' + JSON.stringify(cmd)); + if ((cmd.path != null) && (process.platform != 'win32') && (cmd.path[0] != '/')) { cmd.path = '/' + cmd.path; } // Add '/' to paths on non-windows - //console.log(objToString(cmd, 0, '.')); + //console.log(objToString(cmd, 0, ' ')); switch (cmd.action) { case 'ls': { /* @@ -642,6 +645,36 @@ function createMeshCore(agent) { try { fs.renameSync(oldfullpath, newfullpath); } catch (e) { console.log(e); } break; } + case 'download': { + // Download a file + var sendNextBlock = 0; + if (cmd.sub == 'start') { // Setup the download + if (this.filedownload != null) { this.write({ action: 'download', sub: 'cancel', id: this.filedownload.id }); delete this.filedownload; } + this.filedownload = { id: cmd.id, path: cmd.path, ptr: 0 } + try { this.filedownload.f = fs.openSync(this.filedownload.path, 'rbN'); } catch (e) { this.write({ action: 'download', sub: 'cancel', id: this.filedownload.id }); delete this.filedownload; } + if (this.filedownload) { this.write({ action: 'download', sub: 'start', id: cmd.id }); } + } else if ((this.filedownload != null) && (cmd.id == this.filedownload.id)) { // Download commands + if (cmd.sub == 'startack') { sendNextBlock = 8; } else if (cmd.sub == 'stop') { delete this.filedownload; } else if (cmd.sub == 'ack') { sendNextBlock = 1; } + } + // Send the next download block(s) + while (sendNextBlock > 0) { + sendNextBlock--; + var buf = new Buffer(4096); + buf.writeInt32BE(0x01020304, 0); + var len = fs.readSync(this.filedownload.f, buf, 4, 4092, null); + this.filedownload.ptr += len; + if (len > 0) { + this.write(buf.slice(0, len + 4)); // Write as binary + } else { + fs.closeSync(this.filedownload.f); + this.write({ action: 'download', sub: 'done', id: this.filedownload.id }); + delete this.filedownload; + sendNextBlock = 0; + } + } + break; + } + /* case 'download': { // Packet download of a file, agent to browser if (cmd.path == undefined) break; @@ -662,6 +695,7 @@ function createMeshCore(agent) { this.httprequest.downloadFile.end = function () { } break; } + */ case 'upload': { // Upload a file, browser to agent if (this.httprequest.uploadFile != undefined) { fs.closeSync(this.httprequest.uploadFile); this.httprequest.uploadFile = undefined; } @@ -691,65 +725,61 @@ function createMeshCore(agent) { } // Called when receiving control data on websocket - function onTunnelControlData(data) { - if (typeof data != 'string') return; - //sendConsoleText('onTunnelControlData: ' + data); - //console.log('onTunnelControlData: ' + data); - + function onTunnelControlData(data, ws) { var obj; - try { obj = JSON.parse(data); } catch (e) { sendConsoleText('Invalid control JSON'); return; } + if (ws == null) { ws = this; } + if (typeof data == 'string') { try { obj = JSON.parse(data); } catch (e) { sendConsoleText('Invalid control JSON'); return; } } + else if (typeof data == 'object') { obj = data; } else { return; } + //sendConsoleText('onTunnelControlData(' + ws.httprequest.protocol + '): ' + JSON.stringify(data)); + //console.log('onTunnelControlData: ' + JSON.stringify(data)); if (obj.type == 'close') { // We received the close on the websocket - //sendConsoleText('Tunnel #' + this.tunnel.index + ' WebSocket control close'); - try { this.close(); } catch (e) { } + //sendConsoleText('Tunnel #' + ws.tunnel.index + ' WebSocket control close'); + try { ws.close(); } catch (e) { } } else if (obj.type == 'webrtc0') { // Browser indicates we can start WebRTC switch-over. - if (this.websocket.httprequest.protocol == 1) { // Terminal + if (ws.httprequest.protocol == 1) { // Terminal // This is a terminal data stream, unpipe the terminal now and indicate to the other side that terminal data will no longer be received over WebSocket - this.websocket.httprequest.process.stdout.unpipe(this.websocket); - this.websocket.httprequest.process.stderr.unpipe(this.websocket); - this.websocket.write("{\"type\":\"webrtc1\"}"); // End of data marker - } else if (this.websocket.httprequest.protocol == 2) { // Desktop + ws.httprequest.process.stdout.unpipe(ws); + ws.httprequest.process.stderr.unpipe(ws); + } else if (ws.httprequest.protocol == 2) { // Desktop // This is a KVM data stream, unpipe the KVM now and indicate to the other side that KVM data will no longer be received over WebSocket - this.websocket.httprequest.desktop.kvm.unpipe(this.websocket); - this.websocket.write("{\"type\":\"webrtc1\"}"); // End of data marker + ws.httprequest.desktop.kvm.unpipe(ws); + } else { + // Switch things around so all WebRTC data goes to onTunnelData(). + ws.rtcchannel.httprequest = ws.httprequest; + ws.rtcchannel.removeAllListeners('data'); + ws.rtcchannel.on('data', onTunnelData); } - /* - else { - // Debug, just display on agent console - rtcchannel.on('data', function (buffer) { sendConsoleText("RTCReceived: " + buffer.length + " bytes"); }); - rtcchannel.on('end', function () { sendConsoleText("RTCChannel: " + this.name + " was closed"); }); - channel.write('WebRTC HELLO!'); - } - */ + ws.write("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc1\"}"); // End of data marker } else if (obj.type == 'webrtc1') { - if (this.httprequest.protocol == 1) { // Terminal + if (ws.httprequest.protocol == 1) { // Terminal // Switch the user input from websocket to webrtc at this point. - this.unpipe(this.httprequest.process.stdin); - this.rtcchannel.pipe(this.httprequest.process.stdin, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text. - this.resume(); // Resume the websocket to keep receiving control data - } else if (this.httprequest.protocol == 2) { // Desktop + ws.unpipe(ws.httprequest.process.stdin); + ws.rtcchannel.pipe(ws.httprequest.process.stdin, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text. + ws.resume(); // Resume the websocket to keep receiving control data + } else if (ws.httprequest.protocol == 2) { // Desktop // Switch the user input from websocket to webrtc at this point. - this.unpipe(this.httprequest.desktop.kvm); - try { this.webrtc.rtcchannel.pipe(this.httprequest.desktop.kvm, { dataTypeSkip: 1 }); } catch (e) { sendConsoleText('EX2'); } // 0 = Binary, 1 = Text. - this.resume(); // Resume the websocket to keep receiving control data + ws.unpipe(ws.httprequest.desktop.kvm); + try { ws.webrtc.rtcchannel.pipe(ws.httprequest.desktop.kvm, { dataTypeSkip: 1 }); } catch (e) { sendConsoleText('EX2'); } // 0 = Binary, 1 = Text. + ws.resume(); // Resume the websocket to keep receiving control data } - this.write("{\"type\":\"webrtc2\"}"); // Indicates we will no longer get any data on websocket, switching to WebRTC at this point. + ws.write("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc2\"}"); // Indicates we will no longer get any data on websocket, switching to WebRTC at this point. } else if (obj.type == 'webrtc2') { // Other side received websocket end of data marker, start sending data on WebRTC channel - if (this.httprequest.protocol == 1) { // Terminal - this.httprequest.process.stdout.pipe(this.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. - this.httprequest.process.stderr.pipe(this.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. - } else if (this.httprequest.protocol == 2) { // Desktop - this.httprequest.desktop.kvm.pipe(this.webrtc.rtcchannel, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text. + if (ws.httprequest.protocol == 1) { // Terminal + ws.httprequest.process.stdout.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. + ws.httprequest.process.stderr.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. + } else if (ws.httprequest.protocol == 2) { // Desktop + ws.httprequest.desktop.kvm.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text. } } else if (obj.type == 'offer') { // This is a WebRTC offer. - this.webrtc = rtc.createConnection(); - this.webrtc.websocket = this; - this.webrtc.on('connected', function () { /*sendConsoleText('Tunnel #' + this.websocket.tunnel.index + ' WebRTC connected');*/ }); - this.webrtc.on('disconnected', function () { /*sendConsoleText('Tunnel #' + this.websocket.tunnel.index + ' WebRTC disconnected');*/ }); - this.webrtc.on('dataChannel', function (rtcchannel) { + ws.webrtc = rtc.createConnection(); + ws.webrtc.websocket = ws; + ws.webrtc.on('connected', function () { /*sendConsoleText('Tunnel #' + this.websocket.tunnel.index + ' WebRTC connected');*/ }); + ws.webrtc.on('disconnected', function () { /*sendConsoleText('Tunnel #' + this.websocket.tunnel.index + ' WebRTC disconnected');*/ }); + ws.webrtc.on('dataChannel', function (rtcchannel) { //sendConsoleText('WebRTC Datachannel open, protocol: ' + this.websocket.httprequest.protocol); rtcchannel.xrtc = this; rtcchannel.websocket = this.websocket; @@ -757,9 +787,9 @@ function createMeshCore(agent) { this.websocket.rtcchannel = rtcchannel; this.websocket.rtcchannel.on('data', onTunnelWebRTCControlData); this.websocket.rtcchannel.on('end', function () { /*sendConsoleText('Tunnel #' + this.websocket.tunnel.index + ' WebRTC data channel closed');*/ }); - this.websocket.write("{\"type\":\"webrtc0\"}"); // Indicate we are ready for WebRTC switch-over. + this.websocket.write("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc0\"}"); // Indicate we are ready for WebRTC switch-over. }); - this.write({ type: "answer", sdp: this.webrtc.setOffer(obj.sdp) }); + ws.write({ type: 'answer', ctrlChannel: '102938', sdp: ws.webrtc.setOffer(obj.sdp) }); } } @@ -804,19 +834,19 @@ function createMeshCore(agent) { case 'info': { // Return information about the agent and agent core module response = 'Current Core: ' + obj.meshCoreInfo + '.\r\nAgent Time: ' + Date() + '.\r\nUser Rights: 0x' + rights.toString(16) + '.\r\nPlatform Info: ' + process.platform + '.\r\nCapabilities: ' + obj.meshCoreCapabilities + '.\r\nServer URL: ' + mesh.ServerUrl + '.'; if (amtLmsState >= 0) { response += '\r\nBuilt-in LMS: ' + ['Disabled', 'Connecting..', 'Connected'][amtLmsState] + '.'; } - response += '\r\nModules: ' + JSON.stringify(addedModules) + ''; - response += '\r\nServerConnected: ' + mesh.isControlChannelConnected + ''; + response += '\r\nModules: ' + addedModules.join(', '); + response += '\r\nServerConnected: ' + mesh.isControlChannelConnected; var oldNodeId = db.Get('OldNodeId'); if (oldNodeId != null) { response += '\r\nOldNodeID: ' + oldNodeId + '.'; } response += '\r\ServerState: ' + meshServerConnectionState + '.'; break; } case 'selfinfo': { // Return self information block - response = JSON.stringify(buildSelfInfo()); + buildSelfInfo(function (info) { sendConsoleText(objToString(info, 0, ' '), sessionid); }); break; } case 'args': { // Displays parsed command arguments - response = 'args ' + objToString(args, 0, '.'); + response = 'args ' + objToString(args, 0, ' '); break; } case 'print': { // Print a message on the mesh agent console, does nothing when running in the background @@ -986,17 +1016,17 @@ function createMeshCore(agent) { break; } case 'amt': { // Show Intel AMT status - if (amtMeiState != null) { - response = objToString(amtMeiState, 0, '.'); - } else { - response = 'This mesh agent does not support Intel AMT.'; - } + getAmtInfo(function (state) { + var resp = 'Intel AMT not detected.'; + if (state != null) { resp = objToString(state, 0, ' '); } + sendConsoleText(resp, sessionid); + }); break; } case 'netinfo': { // Show network interface information - //response = objToString(mesh.NetInfo, 0, '.'); + //response = objToString(mesh.NetInfo, 0, ' '); var interfaces = require('os').networkInterfaces(); - response = objToString(interfaces, 0, '.'); + response = objToString(interfaces, 0, ' '); break; } case 'wakeonlan': { // Send wake-on-lan @@ -1027,7 +1057,7 @@ function createMeshCore(agent) { } case 'location': { getIpLocationData(function (location) { - sendConsoleText(objToString({ "action": "iplocation", "type": "publicip", "value": location }, 0, '.')); + sendConsoleText(objToString({ "action": "iplocation", "type": "publicip", "value": location }, 0, ' ')); }); break; } @@ -1108,20 +1138,19 @@ function createMeshCore(agent) { // Build a bunch a self information data that will be sent to the server // We need to do this periodically and if anything changes, send the update to the server. - function buildSelfInfo() { - var r = { "action": "coreinfo", "value": obj.meshCoreInfo, "caps": obj.meshCoreCapabilities }; - if (mesh.hasHECI == 1) { - var meinfo = amtMeiState; - var amtPresent = false, intelamt = {}; + function buildSelfInfo(func) { + getAmtInfo(function (meinfo) { + var r = { "action": "coreinfo", "value": obj.meshCoreInfo, "caps": obj.meshCoreCapabilities }; if (meinfo != null) { - if (meinfo.Versions && meinfo.Versions.AMT) { intelamt.ver = meinfo.Versions.AMT; amtPresent = true; } - if (meinfo.ProvisioningState) { intelamt.state = meinfo.ProvisioningState; amtPresent = true; } - if (meinfo.flags) { intelamt.flags = meinfo.Flags; amtPresent = true; } - if (meinfo.OsHostname) { intelamt.host = meinfo.OsHostname; amtPresent = true; } - if (amtPresent == true) { r.intelamt = intelamt } + var intelamt = {}, p = false; + if (meinfo.Versions && meinfo.Versions.AMT) { intelamt.ver = meinfo.Versions.AMT; p = true; } + if (meinfo.ProvisioningState) { intelamt.state = meinfo.ProvisioningState; p = true; } + if (meinfo.flags) { intelamt.flags = meinfo.Flags; p = true; } + if (meinfo.OsHostname) { intelamt.host = meinfo.OsHostname; p = true; } + if (p == true) { r.intelamt = intelamt } } - } - return JSON.stringify(r); + func(r); + }); } // Update the server with the latest network interface information @@ -1141,8 +1170,10 @@ function createMeshCore(agent) { function sendPeriodicServerUpdate(force) { if ((amtMeiConnected != 1) || (force == true)) { // If we are pending MEI connection, hold off on updating the server on self-info // Update the self information data - var selfInfo = buildSelfInfo(), selfInfoStr = JSON.stringify(selfInfo); - if ((force == true) || (selfInfoStr != lastSelfInfo)) { mesh.SendCommand(selfInfo); lastSelfInfo = selfInfoStr; } + buildSelfInfo(function (selfInfo) { + selfInfoStr = JSON.stringify(selfInfo); + if ((force == true) || (selfInfoStr != lastSelfInfo)) { mesh.SendCommand(selfInfo); lastSelfInfo = selfInfoStr; } + }); } // Update network information @@ -1160,7 +1191,7 @@ function createMeshCore(agent) { amtMei.getEHBCState(function (result) { if (result.EHBC == true) { amtMeiTmpState.Flags += 1; } }); amtMei.getControlMode(function (result) { if (result.controlMode == 1) { amtMeiTmpState.Flags += 2; } if (result.controlMode == 2) { amtMeiTmpState.Flags += 4; } }); //amtMei.getMACAddresses(function (result) { amtMeiTmpState.mac = result; }); - amtMei.getDnsSuffix(function (result) { if (result != null) { amtMeiTmpState.dns = result; } amtMeiState = amtMeiTmpState; sendPeriodicServerUpdate(); if (func != null) { func(amtMeiState); } }); + amtMei.getDnsSuffix(function (result) { if (result != null) { amtMeiTmpState.dns = result; } if (func != null) { func(amtMeiTmpState); } }); } // Called on MicroLMS Intel AMT user notification diff --git a/agents/meshinstall-initd.sh b/agents/meshinstall-initd.sh new file mode 100644 index 00000000..244aead4 --- /dev/null +++ b/agents/meshinstall-initd.sh @@ -0,0 +1,78 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: +# Required-Start: $local_fs $network $named $time $syslog +# Required-Stop: $local_fs $network $named $time $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Description: +### END INIT INFO + +SCRIPT=/usr/local/mesh/meshagent +RUNAS=root + +PIDFILE=/var/run/meshagent.pid +LOGFILE=/var/log/meshagent.log + +start() { + if [ -f "$PIDFILE" ] && kill -0 $(cat "$PIDFILE"); then + echo 'Service already running' >&2 + return 1 + fi + echo 'Starting serviceā€¦' >&2 + local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!" + su -c "$CMD" $RUNAS > "$PIDFILE" + echo 'Service started' >&2 +} + +stop() { + if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then + echo 'Service not running' >&2 + return 1 + fi + echo 'Stopping serviceā€¦' >&2 + kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE" + echo 'Service stopped' >&2 +} + +uninstall() { + echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] " + local SURE + read SURE + if [ "$SURE" = "yes" ]; then + stop + rm -f "$PIDFILE" + echo "Notice: log file will not be removed: '$LOGFILE'" >&2 + update-rc.d -f remove + rm -fv "$0" + fi +} + +forceuninstall() { + stop + rm -f "$PIDFILE" + rm -f "$LOGFILE" + update-rc.d -f remove + rm -fv "$0" +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + uninstall) + uninstall + ;; + forceuninstall) + uninstall + ;; + restart) + stop + start + ;; + *) + echo "Usage: $0 {start|stop|restart|uninstall}" +esac diff --git a/agents/meshinstall-linux-old.sh b/agents/meshinstall-linux-old.sh new file mode 100644 index 00000000..180045cd --- /dev/null +++ b/agents/meshinstall-linux-old.sh @@ -0,0 +1,164 @@ +#!/bin/bash + +CheckStartupType() { +# echo "Checking process autostart system..." + if [[ `systemctl` =~ -\.mount ]]; then return 1; # systemd; + elif [[ `/sbin/init --version` =~ upstart ]]; then return 2; # upstart; + elif [[ -f /etc/init.d/cron && ! -h /etc/init.d/cron ]]; then return 3; # sysv-init; + fi + return 0; +} + +# Add "StartupType=(type)" to .msh file +UpdateMshFile() { + # Remove all lines that start with "StartupType=" + sed '/^StartupType=/ d' < /usr/local/mesh/meshagent.msh >> /usr/local/mesh/meshagent2.msh + # Add the startup type to the file + echo "StartupType=$starttype" >> /usr/local/mesh/meshagent2.msh + mv /usr/local/mesh/meshagent2.msh /usr/local/mesh/meshagent.msh +} + +CheckInstallAgent() { +# echo "Checking mesh identifier..." + if [ -e "/usr/local" ] + then + installpath="/usr/local/mesh" + else + installpath="/usr/mesh" + fi + if [ $# -eq 2 ] + then + url=$1 + meshid=$2 + meshidlen=${#meshid} + if [ $meshidlen -eq 64 ] + then +# echo "Detecting computer type..." + machinetype=$( uname -m ) + machineid=0 + if [ $machinetype == 'x86_64' ] + then +# Linux x86, 64 bit + machineid=6 + fi + if [ $machinetype == 'x86' ] + then +# Linux x86, 32 bit + machineid=5 + fi + if [ $machinetype == 'armv6l' ] || [ $machinetype == 'armv7l' ] + then +# RaspberryPi 1 (armv6l) or RaspberryPi 2/3 (armv7l) + machineid=25 + fi +# TODO: Add more machine types, detect KVM support, etc. + if [ $machineid -eq 0 ] + then + echo "Unsupported machine type: $machinetype, check with server administrator." + else + DownloadAgent $url $meshid $machineid + fi + else + echo "MeshID is not correct, must be 64 characters long." + fi + else + echo "URI and/or MeshID have not been specified, must be passed in as arguments." + return 0; + fi +} + +DownloadAgent() { + url=$1 + meshid=$2 + machineid=$3 +# Create folder + mkdir -p /usr/local/mesh + cd /usr/local/mesh +# echo "Downloading mesh agent..." + wget $url/meshagents?id=$machineid -q --no-check-certificate -O /usr/local/mesh/meshagent + if [ $? -eq 0 ] + then + echo "Mesh agent downloaded." +# TODO: We could check the meshagent sha256 hash, but best to authenticate the server. + chmod 755 /usr/local/mesh/meshagent + wget $url/meshsettings?id=$meshid -q --no-check-certificate -O /usr/local/mesh/meshagent.msh + if [ $? -eq 0 ] + then + UpdateMshFile + if [ $starttype -eq 1 ] + then + echo -e "[Unit]\nDescription=MeshCentral Agent\n[Service]\nExecStart=/usr/local/mesh/meshagent\nStandardOutput=null\nRestart=always\nRestartSec=3\n[Install]\nWantedBy=multi-user.target\nAlias=meshagent.service\n" > /lib/systemd/system/meshagent.service + systemctl enable meshagent + systemctl start meshagent + else + ./meshagent start + ln -s /usr/local/mesh/meshagent /sbin/meshcmd + ln -s /usr/local/mesh/meshagent /etc/rc2.d/S20mesh + ln -s /usr/local/mesh/meshagent /etc/rc3.d/S20mesh + ln -s /usr/local/mesh/meshagent /etc/rc5.d/S20mesh + fi + echo "Mesh agent started." + else + echo "Unable to download mesh settings at: $url/meshsettings?id=$meshid." + fi + else + echo "Unable to download mesh agent at: $url/meshagents?id=$machineid." + fi +} + +UninstallAgent() { +# Uninstall agent + if [ -e "/usr/local" ] + then + installpath="/usr/local/mesh" + else + installpath="/usr/mesh" + fi + + if [ $starttype -eq 1 ] + then + rm -f /sbin/meshcmd /lib/systemd/system/meshagent.service + systemctl disable meshagent + systemctl stop meshagent + else + rm -f /sbin/meshcmd /etc/rc2.d/S20mesh /etc/rc3.d/S20mesh /etc/rc5.d/S20mesh + fi + + if [ -e $installpath ] + then + cd $installpath + if [ -e "$installpath/meshagent" ] + then + ./meshagent stop + fi + rm -rf $installpath/* + rmdir $installpath + fi + echo "Agent uninstalled." +} + + +CheckStartupType +starttype=$? +#echo "Type: $starttype" + +currentuser=$( whoami ) +if [ $currentuser == 'root' ] +then + if [ $# -eq 0 ] + then + echo -e "This script will install or uninstall a mesh agent, usage:\n $0 [serverurl] [meshid]\n $0 uninstall" + else + if [ $# -eq 1 ] + then + if [ $1 == 'uninstall' ] || [ $1 == 'UNINSTALL' ] + then + UninstallAgent + fi + else + CheckInstallAgent $1 $2 + fi + fi +else + echo "Must be root to install or uninstall mesh agent." +fi diff --git a/agents/meshinstall-linux.sh b/agents/meshinstall-linux.sh index 180045cd..e79dd770 100644 --- a/agents/meshinstall-linux.sh +++ b/agents/meshinstall-linux.sh @@ -1,6 +1,16 @@ #!/bin/bash CheckStartupType() { +# echo "Checking process autostart system..." + starttype=`ps -p 1 | awk '/1/ {print $4}'` + if [[ $starttype == 'systemd' ]]; then return 1; # systemd; + elif [[ $starttype == 'init' ]]; then return 3; # sysv-init; + elif [[ `/sbin/init --version` =~ upstart ]]; then return 2; # upstart; + fi + return 0; +} + +CheckStartupTypeOld() { # echo "Checking process autostart system..." if [[ `systemctl` =~ -\.mount ]]; then return 1; # systemd; elif [[ `/sbin/init --version` =~ upstart ]]; then return 2; # upstart; @@ -87,15 +97,26 @@ DownloadAgent() { UpdateMshFile if [ $starttype -eq 1 ] then + # systemd echo -e "[Unit]\nDescription=MeshCentral Agent\n[Service]\nExecStart=/usr/local/mesh/meshagent\nStandardOutput=null\nRestart=always\nRestartSec=3\n[Install]\nWantedBy=multi-user.target\nAlias=meshagent.service\n" > /lib/systemd/system/meshagent.service systemctl enable meshagent systemctl start meshagent else - ./meshagent start - ln -s /usr/local/mesh/meshagent /sbin/meshcmd - ln -s /usr/local/mesh/meshagent /etc/rc2.d/S20mesh - ln -s /usr/local/mesh/meshagent /etc/rc3.d/S20mesh - ln -s /usr/local/mesh/meshagent /etc/rc5.d/S20mesh + if [ $starttype -eq 3 ] + then + # initd + wget $url/meshagents?script=2 -q --no-check-certificate -O /etc/init.d/meshagent + chmod +x /etc/init.d/meshagent + update-rc.d meshagent default # creates symlinks for rc.d + service meshagent start + else + # upstart / others (???) + ./meshagent start + ln -s /usr/local/mesh/meshagent /sbin/meshcmd + ln -s /usr/local/mesh/meshagent /etc/rc2.d/S20mesh + ln -s /usr/local/mesh/meshagent /etc/rc3.d/S20mesh + ln -s /usr/local/mesh/meshagent /etc/rc5.d/S20mesh + fi fi echo "Mesh agent started." else @@ -117,11 +138,20 @@ UninstallAgent() { if [ $starttype -eq 1 ] then + # systemd rm -f /sbin/meshcmd /lib/systemd/system/meshagent.service systemctl disable meshagent systemctl stop meshagent else - rm -f /sbin/meshcmd /etc/rc2.d/S20mesh /etc/rc3.d/S20mesh /etc/rc5.d/S20mesh + if [ $starttype -eq 3 ] + then + # initd + service meshagent forceuninstall + rm -f /sbin/meshcmd /etc/init.d/meshagent + else + # upstart / others (???) + rm -f /sbin/meshcmd /etc/rc2.d/S20mesh /etc/rc3.d/S20mesh /etc/rc5.d/S20mesh + fi fi if [ -e $installpath ] diff --git a/agents/modules_meshcmd/amt.js b/agents/modules_meshcmd/amt.js index da5aecc7..aa3b2f9d 100644 --- a/agents/modules_meshcmd/amt.js +++ b/agents/modules_meshcmd/amt.js @@ -357,6 +357,7 @@ function AmtStackCreateService(wsmanStack) { obj.IPS_HostBasedSetupService_DisableClientControlMode = function (_method_dummy, callback_func) { obj.Exec("IPS_HostBasedSetupService", "DisableClientControlMode", { "_method_dummy": _method_dummy }, callback_func); } obj.IPS_KVMRedirectionSettingData_TerminateSession = function (callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "TerminateSession", {}, callback_func); } obj.IPS_KVMRedirectionSettingData_DataChannelRead = function (callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "DataChannelRead", {}, callback_func); } + obj.IPS_KVMRedirectionSettingData_DataChannelWrite = function (Data, callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "DataChannelWrite", { "DataMessage": Data }, callback_func); } obj.IPS_OptInService_StartOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "StartOptIn", {}, callback_func); } obj.IPS_OptInService_CancelOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "CancelOptIn", {}, callback_func); } obj.IPS_OptInService_SendOptInCode = function (OptInCode, callback_func) { obj.Exec("IPS_OptInService", "SendOptInCode", { "OptInCode": OptInCode }, callback_func); } diff --git a/meshcentral.js b/meshcentral.js index 0d10e712..d7234389 100644 --- a/meshcentral.js +++ b/meshcentral.js @@ -809,7 +809,8 @@ function CreateMeshCentralServer(config) { // List of possible mesh agent install scripts var meshAgentsInstallScriptList = { - 1: { id: 1, localname: 'meshinstall-linux.sh', rname: 'meshinstall.sh' } + 1: { id: 1, localname: 'meshinstall-linux.sh', rname: 'meshinstall.sh' }, + 2: { id: 2, localname: 'meshinstall-initd.sh', rname: 'meshagent' } }; // Update the list of available mesh agents diff --git a/mpsserver.js b/mpsserver.js index 9ebfaec3..081fa42f 100644 --- a/mpsserver.js +++ b/mpsserver.js @@ -374,7 +374,7 @@ module.exports.CreateMpsServer = function (parent, db, args, certificates) { var WindowSize = common.ReadInt(data, 9); socket.tag.activetunnels++; var cirachannel = socket.tag.channels[RecipientChannel]; - if (cirachannel == undefined) { console.log("MPS Error in CHANNEL_OPEN_CONFIRMATION: Unable to find channelid " + RecipientChannel); return; } + if (cirachannel == undefined) { /*console.log("MPS Error in CHANNEL_OPEN_CONFIRMATION: Unable to find channelid " + RecipientChannel);*/ return; } cirachannel.amtchannelid = SenderChannel; cirachannel.sendcredits = cirachannel.amtCiraWindow = WindowSize; Debug(3, 'MPS:CHANNEL_OPEN_CONFIRMATION', RecipientChannel, SenderChannel, WindowSize); diff --git a/package.json b/package.json index f75bb956..68a13470 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "meshcentral", - "version": "0.1.4-f", + "version": "0.1.4-g", "keywords": [ "Remote Management", "Intel AMT", diff --git a/public/commander.htm b/public/commander.htm index 13d84bf9..49b38da3 100644 --- a/public/commander.htm +++ b/public/commander.htm @@ -539,8 +539,8 @@ th {

-
Profile Name
-
SSID
+
Profile Name
+
SSID
Priority
@@ -565,8 +565,8 @@ th {
Encryption
-
Password*
-
Confirm Password
+
Password*
+
Confirm Password
This will save the entire state of Intel® AMT for this machine into file. Passwords will not be saved, but some sensitive data may be included.

@@ -1504,7 +1504,7 @@ var WsmanStackCreateService = function (host, port, user, pass, tls, extra) { // Perform a WSMAN PULL operation obj.ExecPull = function (resuri, enumctx, callback, tag, pri) { - obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull" + obj.Address + "" + resuri + "" + (obj.NextMessageId++) + "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymousPT60S" + enumctx + "99999999", callback, tag, pri); + obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull" + obj.Address + "" + resuri + "" + (obj.NextMessageId++) + "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymousPT60S" + enumctx + "", callback, tag, pri); // --99999999-- } // Private method @@ -1644,9 +1644,8 @@ var WsmanStackCreateService = function (host, port, user, pass, tls, extra) { function _turnToXml(text) { if (window.DOMParser) { return new DOMParser().parseFromString(text, "text/xml"); - } - else // Internet Explorer - { + } else { + // Internet Explorer var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.loadXML(text); @@ -1823,9 +1822,9 @@ function AmtStackCreateService(wsmanStack) { if (response == null || response.Header["Method"] != "PullResponse") { callback(obj, name, null, 604, tag); _EnumDoNext(1); return; } for (var i in response.Body["Items"]) { if (response.Body["Items"][i] instanceof Array) { - for (var j in response.Body["Items"][i]) { items.push(response.Body["Items"][i][j]); } + for (var j in response.Body["Items"][i]) { if (typeof response.Body["Items"][i][j] != 'function') { items.push(response.Body["Items"][i][j]); } } } else { - items.push(response.Body["Items"][i]); + if (typeof response.Body["Items"][i] != 'function') { items.push(response.Body["Items"][i]); } } } if (response.Body["EnumerationContext"]) { @@ -2078,6 +2077,8 @@ function AmtStackCreateService(wsmanStack) { obj.IPS_HostBasedSetupService_UpgradeClientToAdmin = function (McNonce, SigningAlgorithm, DigitalSignature, callback_func) { obj.Exec("IPS_HostBasedSetupService", "UpgradeClientToAdmin", { "McNonce": McNonce, "SigningAlgorithm": SigningAlgorithm, "DigitalSignature": DigitalSignature }, callback_func); } obj.IPS_HostBasedSetupService_DisableClientControlMode = function (_method_dummy, callback_func) { obj.Exec("IPS_HostBasedSetupService", "DisableClientControlMode", { "_method_dummy": _method_dummy }, callback_func); } obj.IPS_KVMRedirectionSettingData_TerminateSession = function (callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "TerminateSession", {}, callback_func); } + obj.IPS_KVMRedirectionSettingData_DataChannelRead = function (callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "DataChannelRead", {}, callback_func); } + obj.IPS_KVMRedirectionSettingData_DataChannelWrite = function (Data, callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "DataChannelWrite", { "DataMessage": Data }, callback_func); } obj.IPS_OptInService_StartOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "StartOptIn", {}, callback_func); } obj.IPS_OptInService_CancelOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "CancelOptIn", {}, callback_func); } obj.IPS_OptInService_SendOptInCode = function (OptInCode, callback_func) { obj.Exec("IPS_OptInService", "SendOptInCode", { "OptInCode": OptInCode }, callback_func); } @@ -33061,7 +33062,7 @@ if (typeof module !== "undefined" && module.exports) { }); } - var version = '0.5.8'; + var version = '0.6.0'; var urlvars = null; var amtstack; var wsstack = null; @@ -33398,7 +33399,7 @@ if (typeof module !== "undefined" && module.exports) { } } } - if (amtlogicalelements.length == 0) { disconnect(); return; } // Could not get Intel AMT version, disconnect(); + if (amtlogicalelements.length == 0) { console.error('ERROR: Could not get Intel AMT version.'); disconnect(); return; } // Could not get Intel AMT version, disconnect(); var v = getInstance(amtlogicalelements, "AMT")["VersionString"]; amtversion = parseInt(v.split('.')[0]); amtversionmin = parseInt(v.split('.')[1]); @@ -34602,9 +34603,7 @@ if (typeof module !== "undefined" && module.exports) { xx += getWatchdogTransitionStr(t['OldState']) + " → " + getWatchdogTransitionStr(t['NewState']); if (t.actions) { var action = t.actions[0]; - if (action['EventOnTransition'] == true) { - xx += " : Event to log"; - } + if (action['EventOnTransition'] == true) { xx += " : Event to log"; } } } if (xx != '') { x += "
" + xx + "
"; } @@ -35298,8 +35297,7 @@ if (typeof module !== "undefined" && module.exports) { '__parameterType': 'reference', '__resourceUri': amtstack.CompleteName('CIM_WiFiEndpoint'), 'Name': 'WiFi Endpoint 0' - }, - { + }, { '__parameterType': 'instance', '__namespace': amtstack.CompleteName('CIM_WiFiEndpointSettings'), 'ElementName': idx_d12name.value, @@ -35328,7 +35326,7 @@ if (typeof module !== "undefined" && module.exports) { // Check if there is already a profile with this name for (var j in xxWireless['CIM_WiFiEndpointSettings'].responses) { if (xxWireless['CIM_WiFiEndpointSettings'].responses[j]['ElementName'] == idx_d12name.value) { r = false; } } - QE('idx_dlgOkButton', r == true && idx_d12name.value.length > 0 && idx_d12ssid.value.length > 0 && idx_d12password1.value.length > 0 && idx_d12password1.value == idx_d12password2.value); + QE('idx_dlgOkButton', r == true && (idx_d12name.value.length > 0) && (idx_d12ssid.value.length > 0) && (idx_d12password1.value.length > 7) && (idx_d12password1.value == idx_d12password2.value)); } @@ -35598,7 +35596,7 @@ if (typeof module !== "undefined" && module.exports) { QE('idx_dlgOkButton', ok); } - var xxUserPermissions = [ 'Local only' , 'Network only', 'All (Local & Network)']; + var xxUserPermissions = ['Local only' , 'Network only', 'All (Local & Network)']; function showUserDetails(h) { if (xxdialogMode) return; var a = xxAccountRealmInfo[h], x = '
'; @@ -36275,7 +36273,7 @@ if (typeof module !== "undefined" && module.exports) { delete x["DefaultGateway"]; delete x["PrimaryDNS"]; delete x["SecondaryDNS"]; - if (!y) { + if (d21o1.checked == false) { x["IPAddress"] = idx_d21address.value; x["SubnetMask"] = idx_d21subnet.value; x["DefaultGateway"] = idx_d21gateway.value; diff --git a/public/scripts/agent-desktop-0.0.2.js b/public/scripts/agent-desktop-0.0.2.js index 3de618b7..fba6996b 100644 --- a/public/scripts/agent-desktop-0.0.2.js +++ b/public/scripts/agent-desktop-0.0.2.js @@ -83,9 +83,9 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) { } } - obj.Send = function (x) { + obj.send = function (x) { //console.log("KSend(" + x.length + "): " + rstr2hex(x)); - obj.parent.Send(x); + obj.parent.send(x); } // KVM Control. @@ -138,24 +138,24 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) { obj.SendUnPause = function () { //obj.Debug("SendUnPause"); //obj.xxStateChange(3); - obj.Send(String.fromCharCode(0x00, 0x08, 0x00, 0x05, 0x00)); + obj.send(String.fromCharCode(0x00, 0x08, 0x00, 0x05, 0x00)); } obj.SendPause = function () { //obj.Debug("SendPause"); //obj.xxStateChange(2); - obj.Send(String.fromCharCode(0x00, 0x08, 0x00, 0x05, 0x01)); + obj.send(String.fromCharCode(0x00, 0x08, 0x00, 0x05, 0x01)); } obj.SendCompressionLevel = function (type, level, scaling, frametimer) { if (level) { obj.CompressionLevel = level; } if (scaling) { obj.ScalingLevel = scaling; } if (frametimer) { obj.FrameRateTimer = frametimer; } - obj.Send(String.fromCharCode(0x00, 0x05, 0x00, 0x0A, type, obj.CompressionLevel) + obj.shortToStr(obj.ScalingLevel) + obj.shortToStr(obj.FrameRateTimer)); + obj.send(String.fromCharCode(0x00, 0x05, 0x00, 0x0A, type, obj.CompressionLevel) + obj.shortToStr(obj.ScalingLevel) + obj.shortToStr(obj.FrameRateTimer)); } obj.SendRefresh = function () { - obj.Send(String.fromCharCode(0x00, 0x06, 0x00, 0x04)); + obj.send(String.fromCharCode(0x00, 0x06, 0x00, 0x04)); } obj.ProcessScreenMsg = function (width, height) { @@ -214,7 +214,7 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) { obj.SendKeyMsgKC(obj.KeyAction.UP, 91); // Left-Windows obj.SendKeyMsgKC(obj.KeyAction.UP, 92); // Right-Windows obj.SendKeyMsgKC(obj.KeyAction.UP, 16); // Shift - obj.Send(String.fromCharCode(0x00, 0x0E, 0x00, 0x04)); + obj.send(String.fromCharCode(0x00, 0x0E, 0x00, 0x04)); break; case 11: // GetDisplays var myOptions = [], dcount = ((str.charCodeAt(4) & 0xFF) << 8) + (str.charCodeAt(5) & 0xFF); @@ -268,21 +268,21 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) { } obj.SendMessage = function (msg) { - if (obj.State == 3) obj.Send(String.fromCharCode(0x00, 0x11) + obj.shortToStr(4 + msg.length) + msg); // 0x11 = 17 MNG_KVM_MESSAGE + if (obj.State == 3) obj.send(String.fromCharCode(0x00, 0x11) + obj.shortToStr(4 + msg.length) + msg); // 0x11 = 17 MNG_KVM_MESSAGE } obj.SendKeyMsgKC = function (action, kc) { - if (obj.State == 3) obj.Send(String.fromCharCode(0x00, obj.InputType.KEY, 0x00, 0x06, (action - 1), kc)); + if (obj.State == 3) obj.send(String.fromCharCode(0x00, obj.InputType.KEY, 0x00, 0x06, (action - 1), kc)); } obj.sendcad = function() { obj.SendCtrlAltDelMsg(); } obj.SendCtrlAltDelMsg = function () { - if (obj.State == 3) { obj.Send(String.fromCharCode(0x00, obj.InputType.CTRLALTDEL, 0x00, 0x04)); } + if (obj.State == 3) { obj.send(String.fromCharCode(0x00, obj.InputType.CTRLALTDEL, 0x00, 0x04)); } } obj.SendEscKey = function () { - if (obj.State == 3) obj.Send(String.fromCharCode(0x00, obj.InputType.KEY, 0x00, 0x06, 0x00, 0x1B, 0x00, obj.InputType.KEY, 0x00, 0x06, 0x01, 0x1B)); + if (obj.State == 3) obj.send(String.fromCharCode(0x00, obj.InputType.KEY, 0x00, 0x06, 0x00, 0x1B, 0x00, obj.InputType.KEY, 0x00, 0x06, 0x01, 0x1B)); } obj.SendStartMsg = function () { @@ -298,7 +298,7 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) { } obj.SendTouchMsg1 = function (id, flags, x, y) { - if (obj.State == 3) obj.Send(String.fromCharCode(0x00, obj.InputType.TOUCH) + obj.shortToStr(14) + String.fromCharCode(0x01, id) + obj.intToStr(flags) + obj.shortToStr(x) + obj.shortToStr(y)); + if (obj.State == 3) obj.send(String.fromCharCode(0x00, obj.InputType.TOUCH) + obj.shortToStr(14) + String.fromCharCode(0x01, id) + obj.intToStr(flags) + obj.shortToStr(x) + obj.shortToStr(y)); } obj.SendTouchMsg2 = function (id, flags) { @@ -314,7 +314,7 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) { msg += String.fromCharCode(k) + obj.intToStr(flags2) + obj.shortToStr(obj.TouchArray[k].x) + obj.shortToStr(obj.TouchArray[k].y); if (obj.TouchArray[k].f == 2) delete obj.TouchArray[k]; } - if (obj.State == 3) obj.Send(String.fromCharCode(0x00, obj.InputType.TOUCH) + obj.shortToStr(5 + msg.length) + String.fromCharCode(0x02) + msg); + if (obj.State == 3) obj.send(String.fromCharCode(0x00, obj.InputType.TOUCH) + obj.shortToStr(5 + msg.length) + String.fromCharCode(0x02) + msg); if (Object.keys(obj.TouchArray).length == 0 && obj.touchtimer != null) { clearInterval(obj.touchtimer); obj.touchtimer = null; } } @@ -342,13 +342,13 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) { var MouseMsg = ""; if (Action == obj.KeyAction.SCROLL) MouseMsg = String.fromCharCode(0x00, obj.InputType.MOUSE, 0x00, 0x0C, 0x00, ((Action == obj.KeyAction.DOWN) ? Button : ((Button * 2) & 0xFF)), ((X / 256) & 0xFF), (X & 0xFF), ((Y / 256) & 0xFF), (Y & 0xFF), ((Delta / 256) & 0xFF), (Delta & 0xFF)); else MouseMsg = String.fromCharCode(0x00, obj.InputType.MOUSE, 0x00, 0x0A, 0x00, ((Action == obj.KeyAction.DOWN) ? Button : ((Button * 2) & 0xFF)), ((X / 256) & 0xFF), (X & 0xFF), ((Y / 256) & 0xFF), (Y & 0xFF)); - if (obj.Action == obj.KeyAction.NONE) { if (obj.Alternate == 0 || obj.ipad) { obj.Send(MouseMsg); obj.Alternate = 1; } else { obj.Alternate = 0; } } else { obj.Send(MouseMsg); } + if (obj.Action == obj.KeyAction.NONE) { if (obj.Alternate == 0 || obj.ipad) { obj.send(MouseMsg); obj.Alternate = 1; } else { obj.Alternate = 0; } } else { obj.send(MouseMsg); } } } } - obj.GetDisplayNumbers = function () { obj.Send(String.fromCharCode(0x00, 0x0B, 0x00, 0x04)); } // Get Terminal display - obj.SetDisplay = function (number) { obj.Send(String.fromCharCode(0x00, 0x0C, 0x00, 0x06, number >> 8, number & 0xFF)); } // Set Terminal display + obj.GetDisplayNumbers = function () { obj.send(String.fromCharCode(0x00, 0x0B, 0x00, 0x04)); } // Get Terminal display + obj.SetDisplay = function (number) { obj.send(String.fromCharCode(0x00, 0x0C, 0x00, 0x06, number >> 8, number & 0xFF)); } // Set Terminal display obj.intToStr = function (x) { return String.fromCharCode((x >> 24) & 0xFF, (x >> 16) & 0xFF, (x >> 8) & 0xFF, x & 0xFF); } obj.shortToStr = function (x) { return String.fromCharCode((x >> 8) & 0xFF, x & 0xFF); } diff --git a/public/scripts/agent-redir-ws-0.1.0.js b/public/scripts/agent-redir-ws-0.1.0.js index 8bd4831f..b2581e54 100644 --- a/public/scripts/agent-redir-ws-0.1.0.js +++ b/public/scripts/agent-redir-ws-0.1.0.js @@ -10,18 +10,19 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { obj.m = module; // This is the inner module (Terminal or Desktop) module.parent = obj; obj.meshserver = meshserver; - obj.nodeid = null; obj.State = 0; + obj.nodeid = null; obj.socket = null; obj.connectstate = -1; obj.tunnelid = Math.random().toString(36).substring(2); // Generate a random client tunnel id obj.protocol = module.protocol; // 1 = SOL, 2 = KVM, 3 = IDER, 4 = Files, 5 = FileTransfer + obj.onStateChanged = null; + obj.ctrlMsgAllowed = true; obj.attemptWebRTC = false; obj.webRtcActive = false; obj.webSwitchOk = false; - obj.webrtc = null; obj.webchannel = null; - obj.onStateChanged = null; + obj.webrtc = null; obj.debugmode = 0; // Private method @@ -38,8 +39,8 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { obj.socket.onerror = function (e) { console.error(e); } obj.socket.onclose = obj.xxOnSocketClosed; obj.xxStateChange(1); - //obj.meshserver.Send({ action: 'msg', type: 'tunnel', nodeid: obj.nodeid, value: url2 }); - obj.meshserver.Send({ action: 'msg', type: 'tunnel', nodeid: obj.nodeid, value: "*/meshrelay.ashx?id=" + obj.tunnelid }); + //obj.meshserver.send({ action: 'msg', type: 'tunnel', nodeid: obj.nodeid, value: url2 }); + obj.meshserver.send({ action: 'msg', type: 'tunnel', nodeid: obj.nodeid, value: "*/meshrelay.ashx?id=" + obj.tunnelid }); //obj.debug("Agent Redir Start: " + url); } @@ -53,6 +54,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { obj.xxOnControlCommand = function (msg) { var controlMsg; try { controlMsg = JSON.parse(msg); } catch (e) { return; } + if (controlMsg.ctrlChannel != '102938') { obj.xxOnSocketData(msg); return; } //console.log(controlMsg); if (obj.webrtc != null) { if (controlMsg.type == 'answer') { @@ -61,16 +63,19 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { obj.webSwitchOk = true; // Other side is ready for switch over performWebRtcSwitch(); } else if (controlMsg.type == 'webrtc1') { - obj.socket.send("{\"type\":\"webrtc2\"}"); // Confirm we got end of data marker, indicates data will no longer be received on websocket. + sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc2\"}"); // Confirm we got end of data marker, indicates data will no longer be received on websocket. } else if (controlMsg.type == 'webrtc2') { // TODO: Resume/Start sending data over WebRTC } } } + function sendCtrlMsg(x) { if (obj.ctrlMsgAllowed == true) { try { obj.socket.send(x); } catch (e) { } } } + function performWebRtcSwitch() { if ((obj.webSwitchOk == true) && (obj.webRtcActive == true)) { - obj.socket.send("{\"type\":\"webrtc1\"}"); // Indicate to the other side that data traffic will no longer be sent over websocket. + sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc0\"}"); // Indicate to the meshagent that it can start traffic switchover + sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc1\"}"); // Indicate to the meshagent that data traffic will no longer be sent over websocket. // TODO: Hold/Stop sending data over websocket if (obj.onStateChanged != null) { obj.onStateChanged(obj, obj.State); } } @@ -78,7 +83,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { // Close the WebRTC connection, should be called if a problem occurs during WebRTC setup. obj.xxCloseWebRTC = function () { - try { obj.webchannel.send("{\"type\":\"close\"}"); } catch (e) { } + sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"close\"}"); if (obj.webchannel != null) { try { obj.webchannel.close(); } catch (e) { } obj.webchannel = null; } if (obj.webrtc != null) { try { obj.webrtc.close(); } catch (e) { } obj.webrtc = null; } obj.webRtcActive = false; @@ -86,6 +91,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { obj.xxOnMessage = function (e) { //if (obj.debugmode == 1) { console.log('Recv', e.data); } + //console.log('Recv', e.data, obj.State); if (obj.State < 3) { if (e.data == 'c') { obj.socket.send(obj.protocol); @@ -120,7 +126,6 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { }, obj.xxCloseWebRTC, { mandatory: { OfferToReceiveAudio: false, OfferToReceiveVideo: false } }); } } - return; } } @@ -169,9 +174,9 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { return obj.m.ProcessData(data); } - obj.Send = function (x) { + obj.send = function (x) { //obj.debug("Agent Redir Send(" + obj.webRtcActive + ", " + x.length + "): " + rstr2hex(x)); - //console.log("Agent Redir Send(" + obj.webRtcActive + ", " + x.length + "): " + rstr2hex(x)); + //console.log("Agent Redir Send(" + obj.webRtcActive + ", " + x.length + "): " + ((typeof x == 'string')?x:rstr2hex(x))); if (obj.socket != null && obj.socket.readyState == WebSocket.OPEN) { if (typeof x == 'string') { if (obj.debugmode == 1) { @@ -210,7 +215,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) { obj.connectstate = -1; obj.xxCloseWebRTC(); if (obj.socket != null) { - try { if (obj.socket.readyState == 1) { obj.socket.send("{\"type\":\"close\"}"); obj.socket.close(); } } catch (e) { } + try { if (obj.socket.readyState == 1) { sendCtrlMsg("{\"ctrlChannel\":\"102938\",\"type\":\"close\"}"); obj.socket.close(); } } catch (e) { } obj.socket = null; } obj.xxStateChange(0); diff --git a/public/scripts/amt-desktop-0.0.2.js b/public/scripts/amt-desktop-0.0.2.js index 72eacd8f..a46d9a14 100644 --- a/public/scripts/amt-desktop-0.0.2.js +++ b/public/scripts/amt-desktop-0.0.2.js @@ -81,19 +81,19 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { //var version = parseFloat(obj.acc.substring(4, 11)); //obj.Debug("KVersion: " + version); obj.state = 1; - obj.Send("RFB 003.008\n"); + obj.send("RFB 003.008\n"); } else if (obj.state == 1 && obj.acc.length >= 1) { // Getting security options cmdsize = obj.acc.charCodeAt(0) + 1; - obj.Send(String.fromCharCode(1)); // Send the "None" security type. Since we already authenticated using redirection digest auth, we don't need to do this again. + obj.send(String.fromCharCode(1)); // Send the "None" security type. Since we already authenticated using redirection digest auth, we don't need to do this again. obj.state = 2; } else if (obj.state == 2 && obj.acc.length >= 4) { // Getting security response cmdsize = 4; if (ReadInt(obj.acc, 0) != 0) { return obj.Stop(); } - obj.Send(String.fromCharCode(1)); // Send share desktop flag + obj.send(String.fromCharCode(1)); // Send share desktop flag obj.state = 3; } else if (obj.state == 3 && obj.acc.length >= 24) { @@ -138,11 +138,11 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { if (obj.useZRLE) supportedEncodings += IntToStr(16); supportedEncodings += IntToStr(0); - obj.Send(String.fromCharCode(2, 0) + ShortToStr((supportedEncodings.length / 4) + 1) + supportedEncodings + IntToStr(-223)); // Supported Encodings + Desktop Size + obj.send(String.fromCharCode(2, 0) + ShortToStr((supportedEncodings.length / 4) + 1) + supportedEncodings + IntToStr(-223)); // Supported Encodings + Desktop Size // Set the pixel encoding to something much smaller - // obj.Send(String.fromCharCode(0, 0, 0, 0, 16, 16, 0, 1) + ShortToStr(31) + ShortToStr(63) + ShortToStr(31) + String.fromCharCode(11, 5, 0, 0, 0, 0)); // Setup 16 bit color RGB565 (This is the default, so we don't need to set it) - if (obj.bpp == 1) obj.Send(String.fromCharCode(0, 0, 0, 0, 8, 8, 0, 1) + ShortToStr(7) + ShortToStr(7) + ShortToStr(3) + String.fromCharCode(5, 2, 0, 0, 0, 0)); // Setup 8 bit color RGB332 + // obj.send(String.fromCharCode(0, 0, 0, 0, 16, 16, 0, 1) + ShortToStr(31) + ShortToStr(63) + ShortToStr(31) + String.fromCharCode(11, 5, 0, 0, 0, 0)); // Setup 16 bit color RGB565 (This is the default, so we don't need to set it) + if (obj.bpp == 1) obj.send(String.fromCharCode(0, 0, 0, 0, 8, 8, 0, 1) + ShortToStr(7) + ShortToStr(7) + ShortToStr(3) + String.fromCharCode(5, 2, 0, 0, 0, 0)); // Setup 8 bit color RGB332 obj.state = 4; obj.parent.xxStateChange(3); @@ -194,7 +194,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { // Desktop Size (0xFFFFFF21, -223) obj.canvas.canvas.width = obj.rwidth = obj.width = width; obj.canvas.canvas.height = obj.rheight = obj.height = height; - obj.Send(String.fromCharCode(3, 0, 0, 0, 0, 0) + ShortToStr(obj.width) + ShortToStr(obj.height)); // FramebufferUpdateRequest + obj.send(String.fromCharCode(3, 0, 0, 0, 0, 0) + ShortToStr(obj.width) + ShortToStr(obj.height)); // FramebufferUpdateRequest cmdsize = 12; if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); } // obj.Debug("New desktop width: " + obj.width + ", height: " + obj.height); @@ -454,13 +454,13 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { if (obj.focusmode > 0) { // Request only pixels around the last mouse position var df = obj.focusmode * 2; - obj.Send(String.fromCharCode(3, 1) + ShortToStr(Math.max(Math.min(obj.ox, obj.mx) - obj.focusmode, 0)) + ShortToStr(Math.max(Math.min(obj.oy, obj.my) - obj.focusmode, 0)) + ShortToStr(df + Math.abs(obj.ox - obj.mx)) + ShortToStr(df + Math.abs(obj.oy - obj.my))); // FramebufferUpdateRequest + obj.send(String.fromCharCode(3, 1) + ShortToStr(Math.max(Math.min(obj.ox, obj.mx) - obj.focusmode, 0)) + ShortToStr(Math.max(Math.min(obj.oy, obj.my) - obj.focusmode, 0)) + ShortToStr(df + Math.abs(obj.ox - obj.mx)) + ShortToStr(df + Math.abs(obj.oy - obj.my))); // FramebufferUpdateRequest obj.ox = obj.mx; obj.oy = obj.my; } else { // ###END###{DesktopFocus} // Request the entire screen - obj.Send(String.fromCharCode(3, 1, 0, 0, 0, 0) + ShortToStr(obj.rwidth) + ShortToStr(obj.rheight)); // FramebufferUpdateRequest + obj.send(String.fromCharCode(3, 1, 0, 0, 0, 0) + ShortToStr(obj.rwidth) + ShortToStr(obj.rheight)); // FramebufferUpdateRequest // ###BEGIN###{DesktopFocus} } // ###END###{DesktopFocus} @@ -485,10 +485,10 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { obj.parent.Stop(); } - obj.Send = function (x) { + obj.send = function (x) { //obj.Debug("KSend(" + x.length + "): " + rstr2hex(x)); //obj.outbytes += x.length; - obj.parent.Send(x); + obj.parent.send(x); } /* @@ -552,7 +552,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { return obj.haltEvent(e); } - obj.sendkey = function (k, d) { obj.Send(String.fromCharCode(4, d, 0, 0) + IntToStr(k)); } + obj.sendkey = function (k, d) { obj.send(String.fromCharCode(4, d, 0, 0) + IntToStr(k)); } obj.SendCtrlAltDelMsg = function () { obj.sendcad(); } obj.sendcad = function () { @@ -625,7 +625,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { } // ###END###{DesktopRotation} - obj.Send(String.fromCharCode(5, obj.buttonmask) + ShortToStr(obj.mx) + ShortToStr(obj.my)); + obj.send(String.fromCharCode(5, obj.buttonmask) + ShortToStr(obj.mx) + ShortToStr(obj.my)); // ###BEGIN###{DesktopFocus} // Update focus area if we are in focus mode diff --git a/public/scripts/amt-redir-ws-0.1.0.js b/public/scripts/amt-redir-ws-0.1.0.js index 8718ad6f..a8328b5b 100644 --- a/public/scripts/amt-redir-ws-0.1.0.js +++ b/public/scripts/amt-redir-ws-0.1.0.js @@ -253,7 +253,7 @@ var CreateAmtRedirect = function (module) { } } - obj.Send = function (x) { + obj.send = function (x) { if (obj.socket == null || obj.connectstate != 1) return; if (obj.protocol == 1) { obj.xxSend(String.fromCharCode(0x28, 0x00, 0x00, 0x00) + IntToStrX(obj.amtsequence++) + ShortToStrX(x.length) + x); } else { obj.xxSend(x); } } diff --git a/public/scripts/amt-terminal-0.0.2.js b/public/scripts/amt-terminal-0.0.2.js index 27446d66..797227c3 100644 --- a/public/scripts/amt-terminal-0.0.2.js +++ b/public/scripts/amt-terminal-0.0.2.js @@ -554,8 +554,8 @@ var CreateAmtRemoteTerminal = function (divid) { } } - obj.TermSendKeys = function(keys) { obj.parent.Send(keys); } - obj.TermSendKey = function(key) { obj.parent.Send(String.fromCharCode(key)); } + obj.TermSendKeys = function(keys) { obj.parent.send(keys); } + obj.TermSendKey = function(key) { obj.parent.send(String.fromCharCode(key)); } function _TermMoveUp(linecount) { var x, y; diff --git a/public/scripts/meshcentral.js b/public/scripts/meshcentral.js index 8bb95b65..317cdba4 100644 --- a/public/scripts/meshcentral.js +++ b/public/scripts/meshcentral.js @@ -37,7 +37,7 @@ var MeshServerCreateControl = function (domain) { if (obj.onMessage) obj.onMessage(obj, message); }; - obj.Send = function (x) { if (obj.socket != null && obj.connectstate == 1) { obj.socket.send(JSON.stringify(x)); } } + obj.send = function (x) { if (obj.socket != null && obj.connectstate == 1) { obj.socket.send(JSON.stringify(x)); } } return obj; } diff --git a/views/default.handlebars b/views/default.handlebars index 8c388e52..c2768c26 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -777,9 +777,9 @@ setTimeout(serverPoll, 5000); } else if (state == 2) { // Fetch list of meshes, nodes, files - meshserver.Send({ action: 'meshes' }); - meshserver.Send({ action: 'nodes' }); - meshserver.Send({ action: 'files' }); + meshserver.send({ action: 'meshes' }); + meshserver.send({ action: 'nodes' }); + meshserver.send({ action: 'files' }); } } @@ -821,8 +821,8 @@ if ((userinfo.siteadmin & 2) != 0) { // We are user administrator - if (users == null) { meshserver.Send({ action: 'users' }); } - if (wssessions == null) { meshserver.Send({ action: 'wssessioncount' }); } + if (users == null) { meshserver.send({ action: 'users' }); } + if (wssessions == null) { meshserver.send({ action: 'wssessioncount' }); } } else { // We are not user administrator users = null; @@ -830,7 +830,7 @@ updateUsers(); if (xxcurrentView == 4) go(1); } - meshserver.Send({ action: 'events', limit: parseInt(p3limitdropdown.value) }); + meshserver.send({ action: 'events', limit: parseInt(p3limitdropdown.value) }); QV('p2deleteall', userinfo.siteadmin == 0xFFFFFFFF); } @@ -996,7 +996,7 @@ if (userinfo.name == message.event.account.name) { var newsiteadmin = message.event.account.siteadmin?message.event.account.siteadmin:0; var oldsiteadmin = userinfo.siteadmin?userinfo.siteadmin:0; - if ((message.event.account.quota != userinfo.quota) || (((userinfo.siteadmin & 8) == 0) && ((message.event.account.siteadmin & 8) != 0))) { meshserver.Send({ action: 'files' }); } + if ((message.event.account.quota != userinfo.quota) || (((userinfo.siteadmin & 8) == 0) && ((message.event.account.siteadmin & 8) != 0))) { meshserver.send({ action: 'files' }); } userinfo = message.event.account; if (oldsiteadmin != newsiteadmin) updateSiteAdmin(); QV('verifyEmailId', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true)); @@ -1020,7 +1020,7 @@ meshes[message.event.meshid] = { _id: message.event.meshid, name: message.event.name, mtype: message.event.mtype, desc: message.event.desc, links: message.event.links }; updateMeshes(); updateDevices(); - meshserver.Send({ action: 'files' }); + meshserver.send({ action: 'files' }); } break; } @@ -1029,7 +1029,7 @@ if (meshes[message.event.meshid] == null) { // This is a new mesh for us meshes[message.event.meshid] = { _id: message.event.meshid, name: message.event.name, mtype: message.event.mtype, desc: message.event.desc, links: message.event.links }; - meshserver.Send({ action: 'nodes' }); // Request a refresh of all nodes (TODO: We could optimize this to only request nodes for the new mesh). + meshserver.send({ action: 'nodes' }); // Request a refresh of all nodes (TODO: We could optimize this to only request nodes for the new mesh). } else { // This is an existing mesh meshes[message.event.meshid].name = message.event.name; @@ -1052,7 +1052,7 @@ } updateMeshes(); updateDevices(); - meshserver.Send({ action: 'files' }); + meshserver.send({ action: 'files' }); // If we are looking at a mesh that is now deleted, move back to "My Account" if (xxcurrentView == 20 && currentMesh._id == message.event.meshid) { p20updateMesh(); } @@ -1063,7 +1063,7 @@ if (meshes[message.event.meshid]) { delete meshes[message.event.meshid]; updateMeshes(); - meshserver.Send({ action: 'files' }); + meshserver.send({ action: 'files' }); } // Delete all nodes in that mesh @@ -1505,7 +1505,7 @@ if (elements[i].checked) { var ipaddr = elements[i].getAttribute('tag'); var amtinfo = amtScanResults[ipaddr]; - meshserver.Send({ action: 'addamtdevice', meshid: meshid, devicename: ipaddr, hostname: amtinfo.hostname, amtusername: '', amtpassword: '', amttls: amtinfo.tls }); + meshserver.send({ action: 'addamtdevice', meshid: meshid, devicename: ipaddr, hostname: amtinfo.hostname, amtusername: '', amtpassword: '', amttls: amtinfo.tls }); } } } @@ -1515,7 +1515,7 @@ QE('dp1range', false); QE('dp1rangebutton', false); QH('dp1results', '
Scanning...
'); - meshserver.Send({ action: 'scanamtdevice', range: Q('dp1range').value }); + meshserver.send({ action: 'scanamtdevice', range: Q('dp1range').value }); } // Called when a scanned computer is checked or unchecked. @@ -1596,7 +1596,7 @@ } function performAgentInvite(button, meshid) { - meshserver.Send({ action: 'inviteAgent', meshid: meshid, email: Q('agentInviteEmail').value }); + meshserver.send({ action: 'inviteAgent', meshid: meshid, email: Q('agentInviteEmail').value }); } function addAgentToMesh(meshid) { @@ -1660,7 +1660,7 @@ if (amtuser == '') amtuser = 'admin'; var host = Q('dp1hostname').value; if (host == '') host = Q('dp1devicename').value; - meshserver.Send({ action: 'addamtdevice', meshid: meshid, devicename: Q('dp1devicename').value, hostname: host, amtusername: amtuser, amtpassword: Q('dp1password').value, amttls: Q('dp1tls').value }); + meshserver.send({ action: 'addamtdevice', meshid: meshid, devicename: Q('dp1devicename').value, hostname: host, amtusername: amtuser, amtpassword: Q('dp1password').value, amttls: Q('dp1tls').value }); } function deviceHeaderSet() { @@ -1735,7 +1735,7 @@ // Group wake var nodeids = [], elements = document.getElementsByClassName("DeviceCheckbox"), checkcount = 0; for (var i in elements) { if (elements[i].checked) { nodeids.push(elements[i].value.substring(6)); } } - meshserver.Send({ action: 'wakedevices', nodeids: nodeids }); + meshserver.send({ action: 'wakedevices', nodeids: nodeids }); } else if (op == 101) { // Group delete, ask for confirmation var x = "Confirm delete selected devices(s)?

"; @@ -1746,7 +1746,7 @@ // Power operation var nodeids = [], elements = document.getElementsByClassName("DeviceCheckbox"), checkcount = 0; for (var i in elements) { if (elements[i].checked) { nodeids.push(elements[i].value.substring(6)); } } - meshserver.Send({ action: 'poweraction', nodeids: nodeids, actiontype: op }); + meshserver.send({ action: 'poweraction', nodeids: nodeids, actiontype: op }); } } @@ -1755,7 +1755,7 @@ function groupActionFunctionDelEx() { var nodeids = [], elements = document.getElementsByClassName("DeviceCheckbox"), checkcount = 0; for (var i in elements) { if (elements[i].checked) { nodeids.push(elements[i].value.substring(6)); } } - meshserver.Send({ action: 'removedevices', nodeids: nodeids }); + meshserver.send({ action: 'removedevices', nodeids: nodeids }); } function onSortSelectChange(skipsave) { @@ -1875,7 +1875,7 @@ // Clear Marker item var map_cm_clearMarker = { text: "Remove node location", callback: function (obj) { - meshserver.Send({ action: 'changedevice', nodeid: obj.data.a, userloc: [] }); // Clear the user position marker + meshserver.send({ action: 'changedevice', nodeid: obj.data.a, userloc: [] }); // Clear the user position marker }}; // Save Marker item @@ -2085,7 +2085,7 @@ var coord = ft.getGeometry().getCoordinates(); var v = ol.proj.transform(coord, 'EPSG:3857', 'EPSG:4326'); var vx = [ v[1], v[0] ]; // Flip the coordinates around, lat/long - meshserver.Send({ action: 'changedevice', nodeid: featid, userloc: vx }); // Send them to server to save changes + meshserver.send({ action: 'changedevice', nodeid: featid, userloc: vx }); // Send them to server to save changes } } } @@ -2241,10 +2241,10 @@ if (activeInteraction) { saveMarkerloc(feature); } else { // If this feature is not saved after its location is changed, then send updated coords to server. - meshserver.Send({ action: 'changedevice', nodeid: node._id, userloc: vx }); // Send them to server to save changes + meshserver.send({ action: 'changedevice', nodeid: node._id, userloc: vx }); // Send them to server to save changes } } else { - meshserver.Send({ action: 'changedevice', nodeid: node._id, userloc: vx }); // This Node is not yet added to maps. + meshserver.send({ action: 'changedevice', nodeid: node._id, userloc: vx }); // This Node is not yet added to maps. } } } @@ -2616,7 +2616,7 @@ QV('filesActionsBtn', (meshrights & 72) != 0); // Request the power timeline - if ((powerTimelineNode != currentNode._id) && (powerTimelineReq != currentNode._id)) { powerTimelineReq = currentNode._id; meshserver.Send({ action: 'powertimeline', nodeid: currentNode._id }); } + if ((powerTimelineNode != currentNode._id) && (powerTimelineReq != currentNode._id)) { powerTimelineReq = currentNode._id; meshserver.send({ action: 'powertimeline', nodeid: currentNode._id }); } } if (!panel) panel = 10; go(panel); @@ -2637,10 +2637,10 @@ var op = Q('d2deviceop').value; if (op == 100) { // Device wake - meshserver.Send({ action: 'wakedevices', nodeids: [ currentNode._id ] }); + meshserver.send({ action: 'wakedevices', nodeids: [ currentNode._id ] }); } else { // Power operation - meshserver.Send({ action: 'poweraction', nodeids: [ currentNode._id ], actiontype: op }); + meshserver.send({ action: 'poweraction', nodeids: [ currentNode._id ], actiontype: op }); } } @@ -2661,7 +2661,7 @@ // Look to see if we need to update the device timeline function updateDeviceTimeline() { if ((meshserver.State != 2) || (powerTimelineNode == null) || (powerTimelineUpdate == null) || (currentNode == null)) return; - if ((powerTimelineNode == powerTimelineReq) && (currentNode._id == powerTimelineNode) && (powerTimelineUpdate < Date.now())) { powerTimelineUpdate = null; meshserver.Send({ action: 'powertimeline', nodeid: currentNode._id }); } + if ((powerTimelineNode == powerTimelineReq) && (currentNode._id == powerTimelineNode) && (powerTimelineUpdate < Date.now())) { powerTimelineUpdate = null; meshserver.send({ action: 'powertimeline', nodeid: currentNode._id }); } } // Draw device power bars. The bars are 766px wide. @@ -2746,14 +2746,14 @@ function editDeviceAmtSettingsEx(button, tag) { if (button == 2) { // Delete button pressed, remove credentials - meshserver.Send({ action: 'changedevice', nodeid: tag.node._id, intelamt: { user: '', pass: '' } }); + meshserver.send({ action: 'changedevice', nodeid: tag.node._id, intelamt: { user: '', pass: '' } }); } else { // Change Intel AMT credentials var amtuser = Q('dp10username').value; if (amtuser == '') amtuser = 'admin'; var amtpass = Q('dp10password').value; if (amtpass == '') amtuser = ''; - meshserver.Send({ action: 'changedevice', nodeid: tag.node._id, intelamt: { user: amtuser, pass: amtpass, tls: Q('dp10tls').value } }); + meshserver.send({ action: 'changedevice', nodeid: tag.node._id, intelamt: { user: amtuser, pass: amtpass, tls: Q('dp10tls').value } }); tag.node.intelamt.user = amtuser; tag.node.intelamt.tls = Q('dp10tls').value; if (tag.func) { setTimeout(tag.func, 300); } @@ -2773,11 +2773,11 @@ } function p10showDeleteNodeDialogEx(buttons, nodeid) { - meshserver.Send({ action: 'removedevices', nodeids: [ nodeid ] }); + meshserver.send({ action: 'removedevices', nodeids: [ nodeid ] }); } function p10clickOnce(nodeid, protocol, port) { - meshserver.Send({ action: 'getcookie', nodeid: nodeid, tcpport: port, tag: 'clickonce', protocol: protocol }); + meshserver.send({ action: 'getcookie', nodeid: nodeid, tcpport: port, tag: 'clickonce', protocol: protocol }); } // Show current location @@ -2831,7 +2831,7 @@ function p10showNodeNetInfoDialog() { if (xxdialogMode) return; setDialogMode(2, "Network Interfaces", 1, null, "
Loading...
", 'if' + currentNode._id ); - meshserver.Send({ action: 'getnetworkinfo', nodeid: currentNode._id }); + meshserver.send({ action: 'getnetworkinfo', nodeid: currentNode._id }); } // Show router dialog @@ -2888,7 +2888,7 @@ function p10setIcon(icon) { setDialogMode(0); - meshserver.Send({ action: 'changedevice', nodeid: currentNode._id, icon: icon }); + meshserver.send({ action: 'changedevice', nodeid: currentNode._id, icon: icon }); } var showEditNodeValueDialog_modes = ['Device Name', 'Hostname', 'Description']; @@ -2907,7 +2907,7 @@ function showEditNodeValueDialogEx(button, mode) { var x = { action: 'changedevice', nodeid: currentNode._id }; x[showEditNodeValueDialog_modes2[mode]] = Q('dp10devicevalue').value; - meshserver.Send(x); + meshserver.send(x); } function p10editdevicevalueValidate(mode, e) { @@ -3314,7 +3314,7 @@ break; case 3: p13targetpath = ''; - files.Send(JSON.stringify({ action: 'ls', reqid: 1, path: '' })); + files.send(JSON.stringify({ action: 'ls', reqid: 1, path: '' })); break; } } @@ -3335,7 +3335,7 @@ if (!files) { // Setup a mesh agent files files = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotFiles), serverPublicNamePort); - files.attemptWebRTC = false; + files.attemptWebRTC = attemptWebRTC; files.onStateChanged = onFilesStateChange; files.Start(filesNode._id); } else { @@ -3351,7 +3351,11 @@ var p13filetreelocation = []; function p13gotFiles(data) { + //console.log('p13gotFiles', data); + if ((data.length > 0) && (data.charCodeAt(0) != 123)) { p13gotDownloadBinaryData(data); return; } + //console.log('p13gotFiles', data); data = JSON.parse(data); + if (data.action == 'download') { p13gotDownloadCommand(data); return; } data.path = data.path.replace(/\//g, "\\"); if ((p13filetree != null) && (data.path == p13filetree.path)) { // This is an update to the same folder @@ -3450,13 +3454,13 @@ function p13folderset(x) { p13targetpath = joinPaths(p13filetree.path, p13filetree.dir[x].n).split('\\').join('/'); - files.Send(JSON.stringify({ action: 'ls', reqid: 1, path: p13targetpath })); + files.send(JSON.stringify({ action: 'ls', reqid: 1, path: p13targetpath })); } function p13folderup(x) { if (x == null) { p13filetreelocation.pop(); } else { while (p13filetreelocation.length > x) { p13filetreelocation.pop(); } } p13targetpath = p13filetreelocation.join('/'); - files.Send(JSON.stringify({ action: 'ls', reqid: 1, path: p13targetpath })); + files.send(JSON.stringify({ action: 'ls', reqid: 1, path: p13targetpath })); } var p13sortorder; @@ -3501,11 +3505,11 @@ function p13getFileCount() { var cc = 0; var checkboxes = document.getElementsByName('fd'); return checkboxes.length; } function p13selectallfile() { var nv = (p13getFileSelCount() == 0), checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { checkboxes[i].checked = nv; } p13setActions(); } function p13createfolder() { setDialogMode(2, "New Folder", 3, p13createfolderEx, ''); focusTextBox('p13renameinput'); p13fileNameCheck(); } - function p13createfolderEx() { files.Send(JSON.stringify({ action: 'mkdir', reqid: 1, path: p13filetreelocation.join('/') + '/' + Q('p13renameinput').value })); p13folderup(999); } + function p13createfolderEx() { files.send(JSON.stringify({ action: 'mkdir', reqid: 1, path: p13filetreelocation.join('/') + '/' + Q('p13renameinput').value })); p13folderup(999); } function p13deletefile() { var cc = getFileSelCount(); setDialogMode(2, "Delete", 3, p13deletefileEx, (cc > 1)?('Delete ' + cc + ' selected items?'):('Delete selected item?')); } - function p13deletefileEx() { var delfiles = [], checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { delfiles.push(p13filetree.dir[checkboxes[i].value].n); } } files.Send(JSON.stringify({ action: 'rm', reqid: 1, path: p13filetreelocation.join('/'), delfiles: delfiles })); p13folderup(999); } + function p13deletefileEx() { var delfiles = [], checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { delfiles.push(p13filetree.dir[checkboxes[i].value].n); } } files.send(JSON.stringify({ action: 'rm', reqid: 1, path: p13filetreelocation.join('/'), delfiles: delfiles })); p13folderup(999); } function p13renamefile() { var renamefile, checkboxes = document.getElementsByName('fd'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { renamefile = p13filetree.dir[checkboxes[i].value].n; } } setDialogMode(2, "Rename", 3, p13renamefileEx, '', { action: 'rename', path: p13filetreelocation.join('/'), oldname: renamefile}); focusTextBox('p13renameinput'); p13fileNameCheck(); } - function p13renamefileEx(b, t) { t.newname = Q('p13renameinput').value; files.Send(JSON.stringify(t)); p13folderup(999); } + function p13renamefileEx(b, t) { t.newname = Q('p13renameinput').value; files.send(JSON.stringify(t)); p13folderup(999); } function p13fileNameCheck(e) { var x = isFilenameValid(Q('p13renameinput').value); QE('idx_dlgOkButton', x); if ((x == true) && (e.keyCode == 13)) { dialogclose(1); } } function p13uploadFile() { setDialogMode(2, "Upload File", 3, p13uploadFileEx, ''); updateUploadDialogOk('p13uploadinput'); } function p13uploadFileEx() { p13doUploadFiles(Q('p13uploadinput').files); } @@ -3545,8 +3549,42 @@ // Called by the html page to start a download, arguments are: path, file name and file size. function p13downloadfile(x, y, z) { - downloadFile = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotDownloadData), serverPublicNamePort); // Create our file transport - downloadFile.attemptWebRTC = false; + if (xxdialogMode || downloadFile || !files) return; + downloadFile = { path: decodeURIComponent(x), file: decodeURIComponent(y), size: z, tsize: 0, data: '', state: 0, id: Math.random() } + //console.log('p13downloadFileCancel', downloadFile); + files.send(JSON.stringify({ action: 'download', sub: 'start', id: downloadFile.id, path: downloadFile.path })); + setDialogMode(2, "Download File", 10, p13downloadFileCancel, '
' + downloadFile.file + '

'); + } + + // Called by the html page to cancel the download + function p13downloadFileCancel() { setDialogMode(0); files.send(JSON.stringify({ action: 'download', sub: 'cancel', id: downloadFile.id })); downloadFile = null; } + + // Called by the transport when download control command is received + function p13gotDownloadCommand(cmd) { + //console.log('p13gotDownloadCommand', cmd); + if ((downloadFile == null) || (cmd.id != downloadFile.id)) return; + if (cmd.sub == 'start') { downloadFile.state = 1; files.send(JSON.stringify({ action: 'download', sub: 'startack', id: downloadFile.id })); } + else if (cmd.sub == 'cancel') { downloadFile = null; setDialogMode(0); } + else if (cmd.sub == 'done') { saveAs(data2blob(downloadFile.data), downloadFile.file); downloadFile = null; setDialogMode(0); } // Save the file + } + + // Called by the transport when binary data is received + function p13gotDownloadBinaryData(data) { + if (!downloadFile || downloadFile.state == 0) return; + downloadFile.tsize += (data.length - 4); // Add to the total bytes received + downloadFile.data += data.substring(4); // Append the data + Q('d2progressBar').value = downloadFile.tsize; // Change the progress bar + files.send(JSON.stringify({ action: 'download', sub: 'ack', id: downloadFile.id })); // Send the ACK + } + + /* + var downloadFile; // Global state for file download + + // Called by the html page to start a download, arguments are: path, file name and file size. + function p13downloadfile(x, y, z) { + if (xxdialogMode) return; + downloadFile = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotDownloadData), serverPublicNamePort); // Create our websocket file transport + downloadFile.ctrlMsgAllowed = false; downloadFile.onStateChanged = onFileDownloadStateChange; downloadFile.xpath = decodeURIComponent(x); downloadFile.xfile = decodeURIComponent(y); @@ -3573,7 +3611,7 @@ if ((downloadFile != null) && (downloadFile.xstate == 1)) { saveAs(data2blob(downloadFile.xdata), downloadFile.xfile); } // Save the file break; case 3: // Transport as connected, send a command to indicate we want to start a file download - downloadFile.Send(JSON.stringify({ action: 'download', reqid: 1, path: downloadFile.xpath })); + downloadFile.send(JSON.stringify({ action: 'download', reqid: 1, path: downloadFile.xpath })); break; } } @@ -3585,7 +3623,7 @@ if (cmd.action == 'downloadstart') { // Yes, the file is about to start downloadFile.xstate = 1; // Switch to state 1, we will start receiving the file data downloadFile.xdata = ''; // Start with empty data - downloadFile.Send('a'); // Send the first ACK + downloadFile.send('a'); // Send the first ACK } else if (cmd.action == 'downloaderror') { // Problem opening this file, cancel p13downloadFileCancel(); } @@ -3593,9 +3631,10 @@ downloadFile.xtsize += (data.length); // Add to the total bytes received downloadFile.xdata += data; // Append the data Q('d2progressBar').value = downloadFile.xtsize; // Change the progress bar - downloadFile.Send('a'); // Send the ACK + downloadFile.send('a'); // Send the ACK } } + */ // // FILES UPLOAD @@ -3603,6 +3642,7 @@ var uploadFile; function p13doUploadFiles(files) { + if (xxdialogMode) return; uploadFile = {}; uploadFile.xpath = p13filetreelocation.join('/'); uploadFile.xfiles = files; @@ -3626,6 +3666,7 @@ function p13uploadReconnect() { uploadFile.ws = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotUploadData), serverPublicNamePort); uploadFile.ws.attemptWebRTC = false; + uploadFile.ws.ctrlMsgAllowed = false; uploadFile.ws.onStateChanged = onFileUploadStateChange; uploadFile.ws.Start(filesNode._id); } @@ -3643,7 +3684,7 @@ uploadFile.xreader = new FileReader(); uploadFile.xreader.onload = function() { uploadFile.xdata = uploadFile.xreader.result; - uploadFile.ws.Send(JSON.stringify({ action: 'upload', reqid: uploadFile.xfilePtr, path: uploadFile.xpath, name: file.name, size: uploadFile.xdata.byteLength })); + uploadFile.ws.send(JSON.stringify({ action: 'upload', reqid: uploadFile.xfilePtr, path: uploadFile.xpath, name: file.name, size: uploadFile.xdata.byteLength })); }; uploadFile.xreader.readAsArrayBuffer(file); } else { @@ -3689,7 +3730,7 @@ if (uploadFile.xfiles.length > uploadFile.xfilePtr + 1) { p13uploadReconnect(); } else { p13uploadFileCancel(); } } else { var datapart = data.slice(start, end); - uploadFile.ws.Send(datapart); + uploadFile.ws.send(datapart); uploadFile.xptr = end; Q('d2progressBar').value = end; } @@ -3777,7 +3818,7 @@ Q('p15consoleText').value = ''; // Send the command to the mesh agent - meshserver.Send({ action: 'msg', type:'console', nodeid: consoleNode._id, value: v }); + meshserver.send({ action: 'msg', type:'console', nodeid: consoleNode._id, value: v }); // Add command to history list if (v.length > 0) { @@ -3802,8 +3843,8 @@ // Called then user presses the "Change Core" button function p15uploadCore(e) { if (xxdialogMode) return; - if (e.shiftKey == true) { meshserver.Send({ action: 'uploadagentcore', nodeid: consoleNode._id, path:'*' }); } // Upload default core - else if (e.altKey == true) { meshserver.Send({ action: 'uploadagentcore', nodeid: consoleNode._id }); } // Clear the core + if (e.shiftKey == true) { meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, path:'*' }); } // Upload default core + else if (e.altKey == true) { meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id }); } // Clear the core else if (e.ctrlKey == true) { p15uploadCore2(); } // Upload the core from a file else { setDialogMode(2, "Change Mesh Agent Core", 3, p15uploadCoreEx, '
Change Core
'); } } @@ -3811,19 +3852,19 @@ function p15uploadCoreEx() { if (Q('d3coreMode').value == 1) { // Upload default core - meshserver.Send({ action: 'uploadagentcore', nodeid: consoleNode._id, path:'*' }); + meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, path:'*' }); } else if (Q('d3coreMode').value == 2) { // Clear the core - meshserver.Send({ action: 'uploadagentcore', nodeid: consoleNode._id }); + meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id }); } else if (Q('d3coreMode').value == 3) { // Upload file as core p15uploadCore2(); } else if (Q('d3coreMode').value == 4) { // Soft disconnect the mesh agent - meshserver.Send({ action: 'agentdisconnect', nodeid: consoleNode._id, disconnectMode: 1 }); + meshserver.send({ action: 'agentdisconnect', nodeid: consoleNode._id, disconnectMode: 1 }); } else if (Q('d3coreMode').value == 5) { // Hard disconnect the mesh agent - meshserver.Send({ action: 'agentdisconnect', nodeid: consoleNode._id, disconnectMode: 2 }); + meshserver.send({ action: 'agentdisconnect', nodeid: consoleNode._id, disconnectMode: 2 }); } } @@ -3844,7 +3885,7 @@ } else { // Upload server mesh agent code var files = d3getFileSel(); - if (files.length == 1) { meshserver.Send({ action: 'uploadagentcore', nodeid: consoleNode._id, path: d3filetreelocation.join('/') + '/' + files[0] }); } + if (files.length == 1) { meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id, path: d3filetreelocation.join('/') + '/' + files[0] }); } } } @@ -3859,7 +3900,7 @@ } function account_showVerifyEmailEx() { - meshserver.Send({ action: 'verifyemail', email: userinfo.email }); + meshserver.send({ action: 'verifyemail', email: userinfo.email }); } function account_showChangeEmail() { @@ -3880,7 +3921,7 @@ } function account_changeEmail() { - meshserver.Send({ action: 'changeemail', email: Q('dp2email').value }); + meshserver.send({ action: 'changeemail', email: Q('dp2email').value }); } function account_showDeleteAccount() { @@ -3933,7 +3974,7 @@ } function account_createMeshEx(button, tag) { - meshserver.Send({ action: 'createmesh', meshname: Q('dp2meshname').value, meshtype: Q('dp2meshtype').value, desc: Q('dp2meshdesc').value }); + meshserver.send({ action: 'createmesh', meshname: Q('dp2meshname').value, meshtype: Q('dp2meshtype').value, desc: Q('dp2meshdesc').value }); } function account_validateDeleteAccount() { @@ -4004,11 +4045,11 @@ function server_showVersionDlg() { if (xxdialogMode) return; setDialogMode(2, "MeshCentral Version", 1, null, "Loading...", 'MeshCentralServerUpdate'); - meshserver.Send({ action: 'serverversion' }); + meshserver.send({ action: 'serverversion' }); } function server_showVersionDlgEx() { - meshserver.Send({ action: 'serverupdate' }); + meshserver.send({ action: 'serverupdate' }); } // @@ -4091,7 +4132,7 @@ } function p20showDeleteMeshDialogEx(buttons, tag) { - meshserver.Send({ action: 'deletemesh', meshid: currentMesh._id, meshname: currentMesh.name }); + meshserver.send({ action: 'deletemesh', meshid: currentMesh._id, meshname: currentMesh.name }); } function p20editmesh(focus) { @@ -4107,7 +4148,7 @@ } function p20editmeshEx() { - meshserver.Send({ action: 'editmesh', meshid: currentMesh._id, meshname: Q('dp20meshname').value, desc: Q('dp20meshdesc').value }); + meshserver.send({ action: 'editmesh', meshid: currentMesh._id, meshname: Q('dp20meshname').value, desc: Q('dp20meshdesc').value }); } function p20editmeshValidate() { @@ -4157,7 +4198,7 @@ if (Q('p20meshserverfiles').checked == true) meshadmin += 32; if (Q('p20wakedevices').checked == true) meshadmin += 64; } - meshserver.Send({ action: 'addmeshuser', meshid: currentMesh._id, meshname: currentMesh.name, username: Q('dp20username').value , meshadmin: meshadmin}); + meshserver.send({ action: 'addmeshuser', meshid: currentMesh._id, meshname: currentMesh.name, username: Q('dp20username').value , meshadmin: meshadmin}); } function p20viewuser(userid) { @@ -4193,7 +4234,7 @@ } function p20viewuserEx2(button, userid) { - meshserver.Send({ action: 'removemeshuser', meshid: currentMesh._id, meshname: currentMesh.name, userid: userid}); + meshserver.send({ action: 'removemeshuser', meshid: currentMesh._id, meshname: currentMesh.name, userid: userid}); } // @@ -4331,11 +4372,11 @@ function p5folderup(x) { if (x == null) { filetreelocation.pop(); } else { while (filetreelocation.length > x) { filetreelocation.pop(); } } updateFiles(); } function p5folderset(x) { filetreelocation.push(decodeURIComponent(x)); updateFiles(); } function p5createfolder() { setDialogMode(2, "New Folder", 3, p5createfolderEx, ''); focusTextBox('p5renameinput'); p5fileNameCheck(); } - function p5createfolderEx() { meshserver.Send({ action: 'fileoperation', fileop: 'createfolder', path: filetreelocation, newfolder: Q('p5renameinput').value}); } + function p5createfolderEx() { meshserver.send({ action: 'fileoperation', fileop: 'createfolder', path: filetreelocation, newfolder: Q('p5renameinput').value}); } function p5deletefile() { var cc = getFileSelCount(); setDialogMode(2, "Delete", 3, p5deletefileEx, (cc > 1)?('Delete ' + cc + ' selected items?'):('Delete selected item?')); } - function p5deletefileEx() { var delfiles = [], checkboxes = document.getElementsByName('fc'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { delfiles.push(checkboxes[i].value); } } meshserver.Send({ action: 'fileoperation', fileop: 'delete', path: filetreelocation, delfiles: delfiles}); } + function p5deletefileEx() { var delfiles = [], checkboxes = document.getElementsByName('fc'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { delfiles.push(checkboxes[i].value); } } meshserver.send({ action: 'fileoperation', fileop: 'delete', path: filetreelocation, delfiles: delfiles}); } function p5renamefile() { var renamefile, checkboxes = document.getElementsByName('fc'); for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i].checked) { renamefile = checkboxes[i].value; } } setDialogMode(2, "Rename", 3, p5renamefileEx, '', { action: 'fileoperation', fileop: 'rename', path: filetreelocation, oldname: renamefile}); focusTextBox('p5renameinput'); p5fileNameCheck(); } - function p5renamefileEx(b, t) { t.newname = Q('p5renameinput').value; meshserver.Send(t); } + function p5renamefileEx(b, t) { t.newname = Q('p5renameinput').value; meshserver.send(t); } function p5fileNameCheck(e) { var x = isFilenameValid(Q('p5renameinput').value); QE('idx_dlgOkButton', x); if ((x == true) && (e.keyCode == 13)) { dialogclose(1); } } var isFilenameValid = (function(){ var x1=/^[^\\/:\*\?"<>\|]+$/, x2=/^\./, x3=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i; return function isFilenameValid(fname){ return x1.test(fname)&&!x2.test(fname)&&!x3.test(fname)&&(fname[0] != '.'); } })(); function p5uploadFile() { setDialogMode(2, "Upload File", 3, p5uploadFileEx, '
'); updateUploadDialogOk('p5uploadinput'); } @@ -4439,11 +4480,11 @@ } function showDeleteAllEventsDialogEx(buttons, tag) { - meshserver.Send({ action: 'clearevents' }); + meshserver.send({ action: 'clearevents' }); } function refreshEvents() { - meshserver.Send({ action: 'events', limit: parseInt(p3limitdropdown.value) }); + meshserver.send({ action: 'events', limit: parseInt(p3limitdropdown.value) }); } // @@ -4506,7 +4547,7 @@ } function showUserInfoDialogDelete(button, user) { - if (button == 2) { meshserver.Send({ action: 'deleteuser', userid: user._id, username: user.name }); } + if (button == 2) { meshserver.send({ action: 'deleteuser', userid: user._id, username: user.name }); } } function showCreateNewAccountDialog() { @@ -4526,7 +4567,7 @@ } function showCreateNewAccountDialogEx() { - meshserver.Send({ action: 'adduser', username: Q('p4name').value, email: Q('p4email').value, pass: Q('p4pass1').value }); + meshserver.send({ action: 'adduser', username: Q('p4name').value, email: Q('p4email').value, pass: Q('p4pass1').value }); } function showUserAdminDialog(e, userid) { @@ -4583,7 +4624,7 @@ } var x = { action: 'edituser', name: user.name, siteadmin: siteadmin }; if (isNaN(quota) == false) { x.quota = (quota * 1024); } - meshserver.Send(x); + meshserver.send(x); } //