mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2024-12-24 06:05:53 -05:00
Improved file transfers, added file downloads over WebRTC.
This commit is contained in:
parent
2a835d25cd
commit
0c3c0973bc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -391,7 +391,7 @@ function startLms(func) {
|
|||||||
//var xx = AllWsman[4];
|
//var xx = AllWsman[4];
|
||||||
//console.log(xx);
|
//console.log(xx);
|
||||||
//osamtstack.Get(AllWsmanRequests.shift(), startLmsWsmanResponse, null, true);
|
//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, ['IPS_KVMRedirectionSettingData', 'CIM_SoftwareIdentity'], startLmsWsmanResponse, null, true);
|
||||||
//osamtstack.BatchEnum(null, AllWsman, startLmsWsmanResponse, null, true);
|
//osamtstack.BatchEnum(null, AllWsman, startLmsWsmanResponse, null, true);
|
||||||
});
|
});
|
||||||
|
@ -31,7 +31,7 @@ function createMeshCore(agent) {
|
|||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var rtc = require('ILibWebRTC');
|
var rtc = require('ILibWebRTC');
|
||||||
var amtMei = null, amtLms = null, amtLmsState = 0;
|
var amtMei = null, amtLms = null, amtLmsState = 0;
|
||||||
var amtMeiConnected = 0, amtMeiState = null, amtMeiTmpState = null;
|
var amtMeiConnected = 0, amtMeiTmpState = null;
|
||||||
var wifiScannerLib = null;
|
var wifiScannerLib = null;
|
||||||
var wifiScanner = null;
|
var wifiScanner = null;
|
||||||
var networkMonitor = null;
|
var networkMonitor = null;
|
||||||
@ -77,7 +77,7 @@ function createMeshCore(agent) {
|
|||||||
amtMeiConnected = 1;
|
amtMeiConnected = 1;
|
||||||
amtMei = new amtMeiLib();
|
amtMei = new amtMeiLib();
|
||||||
amtMei.on('error', function (e) { amtMeiLib = null; amtMei = null; sendPeriodicServerUpdate(); });
|
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; }
|
} catch (e) { amtMeiLib = null; amtMei = null; amtMeiConnected = -1; }
|
||||||
|
|
||||||
// Try to load up the WIFI scanner
|
// 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
|
// List all the drives in the root, or the root itself
|
||||||
var results = null;
|
var results = null;
|
||||||
try { results = fs.readDrivesSync(); } catch (e) { } // TODO: Anyway to get drive total size and free space? Could draw a progress bar.
|
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) {
|
if (results != null) {
|
||||||
for (var i = 0; i < results.length; ++i) {
|
for (var i = 0; i < results.length; ++i) {
|
||||||
var drive = { n: results[i].name, t: 1 };
|
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
|
this.write(new Buffer(JSON.stringify({ action: 'uploadack', reqid: this.httprequest.uploadFileid }))); // Ask for more data
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
// If this is a download, send more of the file
|
// If this is a download, send more of the file
|
||||||
if (this.httprequest.downloadFile) {
|
if (this.httprequest.downloadFile) {
|
||||||
var buf = new Buffer(4096);
|
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(); }
|
if (len > 0) { this.write(buf.slice(0, len)); } else { fs.closeSync(this.httprequest.downloadFile); this.httprequest.downloadFile = undefined; this.end(); }
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if (this.httprequest.state == 0) {
|
if (this.httprequest.state == 0) {
|
||||||
// Check if this is a relay connection
|
// Check if this is a relay connection
|
||||||
if (data == 'c') { this.httprequest.state = 1; sendConsoleText("Tunnel #" + this.httprequest.index + " now active", this.httprequest.sessionid); }
|
if (data == 'c') { this.httprequest.state = 1; sendConsoleText("Tunnel #" + this.httprequest.index + " now active", this.httprequest.sessionid); }
|
||||||
} else {
|
} else {
|
||||||
// Handle tunnel data
|
// Handle tunnel data
|
||||||
if (this.httprequest.protocol == 0) { // 1 = SOL, 2 = KVM, 3 = IDER, 4 = Files, 5 = FileTransfer
|
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);
|
this.httprequest.protocol = parseInt(data);
|
||||||
if (typeof this.httprequest.protocol != 'number') { this.httprequest.protocol = 0; }
|
if (typeof this.httprequest.protocol != 'number') { this.httprequest.protocol = 0; }
|
||||||
if (this.httprequest.protocol == 1) {
|
if (this.httprequest.protocol == 1) {
|
||||||
@ -550,8 +552,7 @@ function createMeshCore(agent) {
|
|||||||
this.on('data', onTunnelControlData);
|
this.on('data', onTunnelControlData);
|
||||||
//this.write('MeshCore Terminal Hello');
|
//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 (process.platform != 'win32') { this.httprequest.process.stdin.write("stty erase ^H\nalias ls='ls --color=auto'\nclear\n"); }
|
||||||
}
|
} else if (this.httprequest.protocol == 2) {
|
||||||
if (this.httprequest.protocol == 2) {
|
|
||||||
// Remote desktop using native pipes
|
// Remote desktop using native pipes
|
||||||
this.httprequest.desktop = { state: 0, kvm: mesh.getRemoteDesktopStream(), tunnel: this };
|
this.httprequest.desktop = { state: 0, kvm: mesh.getRemoteDesktopStream(), tunnel: this };
|
||||||
this.httprequest.desktop.kvm.parent = this.httprequest.desktop;
|
this.httprequest.desktop.kvm.parent = this.httprequest.desktop;
|
||||||
@ -568,8 +569,7 @@ function createMeshCore(agent) {
|
|||||||
this.removeAllListeners('data');
|
this.removeAllListeners('data');
|
||||||
this.on('data', onTunnelControlData);
|
this.on('data', onTunnelControlData);
|
||||||
//this.write('MeshCore KVM Hello!1');
|
//this.write('MeshCore KVM Hello!1');
|
||||||
}
|
} else if (this.httprequest.protocol == 5) {
|
||||||
else if (this.httprequest.protocol == 5) {
|
|
||||||
// Setup files
|
// Setup files
|
||||||
// NOP
|
// NOP
|
||||||
}
|
}
|
||||||
@ -579,7 +579,6 @@ function createMeshCore(agent) {
|
|||||||
this.httprequest.process.write(data);
|
this.httprequest.process.write(data);
|
||||||
} else if (this.httprequest.protocol == 2) {
|
} else if (this.httprequest.protocol == 2) {
|
||||||
// Send data into remote desktop
|
// Send data into remote desktop
|
||||||
// TODO ADD REMOTE DESKTOP (This is test code)
|
|
||||||
if (this.httprequest.desktop.state == 0) {
|
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.write(new Buffer(String.fromCharCode(0x11, 0xFE, 0x00, 0x00, 0x4D, 0x45, 0x53, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02)));
|
||||||
this.httprequest.desktop.state = 1;
|
this.httprequest.desktop.state = 1;
|
||||||
@ -590,9 +589,13 @@ function createMeshCore(agent) {
|
|||||||
// Process files commands
|
// Process files commands
|
||||||
var cmd = null;
|
var cmd = null;
|
||||||
try { cmd = JSON.parse(data); } catch (e) { };
|
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
|
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) {
|
switch (cmd.action) {
|
||||||
case 'ls': {
|
case 'ls': {
|
||||||
/*
|
/*
|
||||||
@ -642,6 +645,36 @@ function createMeshCore(agent) {
|
|||||||
try { fs.renameSync(oldfullpath, newfullpath); } catch (e) { console.log(e); }
|
try { fs.renameSync(oldfullpath, newfullpath); } catch (e) { console.log(e); }
|
||||||
break;
|
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': {
|
case 'download': {
|
||||||
// Packet download of a file, agent to browser
|
// Packet download of a file, agent to browser
|
||||||
if (cmd.path == undefined) break;
|
if (cmd.path == undefined) break;
|
||||||
@ -662,6 +695,7 @@ function createMeshCore(agent) {
|
|||||||
this.httprequest.downloadFile.end = function () { }
|
this.httprequest.downloadFile.end = function () { }
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
case 'upload': {
|
case 'upload': {
|
||||||
// Upload a file, browser to agent
|
// Upload a file, browser to agent
|
||||||
if (this.httprequest.uploadFile != undefined) { fs.closeSync(this.httprequest.uploadFile); this.httprequest.uploadFile = undefined; }
|
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
|
// Called when receiving control data on websocket
|
||||||
function onTunnelControlData(data) {
|
function onTunnelControlData(data, ws) {
|
||||||
if (typeof data != 'string') return;
|
|
||||||
//sendConsoleText('onTunnelControlData: ' + data);
|
|
||||||
//console.log('onTunnelControlData: ' + data);
|
|
||||||
|
|
||||||
var obj;
|
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') {
|
if (obj.type == 'close') {
|
||||||
// We received the close on the websocket
|
// We received the close on the websocket
|
||||||
//sendConsoleText('Tunnel #' + this.tunnel.index + ' WebSocket control close');
|
//sendConsoleText('Tunnel #' + ws.tunnel.index + ' WebSocket control close');
|
||||||
try { this.close(); } catch (e) { }
|
try { ws.close(); } catch (e) { }
|
||||||
} else if (obj.type == 'webrtc0') { // Browser indicates we can start WebRTC switch-over.
|
} 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 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);
|
ws.httprequest.process.stdout.unpipe(ws);
|
||||||
this.websocket.httprequest.process.stderr.unpipe(this.websocket);
|
ws.httprequest.process.stderr.unpipe(ws);
|
||||||
this.websocket.write("{\"type\":\"webrtc1\"}"); // End of data marker
|
} else if (ws.httprequest.protocol == 2) { // Desktop
|
||||||
} else if (this.websocket.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 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);
|
ws.httprequest.desktop.kvm.unpipe(ws);
|
||||||
this.websocket.write("{\"type\":\"webrtc1\"}"); // End of data marker
|
} 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);
|
||||||
}
|
}
|
||||||
/*
|
ws.write("{\"ctrlChannel\":\"102938\",\"type\":\"webrtc1\"}"); // End of data marker
|
||||||
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!');
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
} else if (obj.type == 'webrtc1') {
|
} 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.
|
// Switch the user input from websocket to webrtc at this point.
|
||||||
this.unpipe(this.httprequest.process.stdin);
|
ws.unpipe(ws.httprequest.process.stdin);
|
||||||
this.rtcchannel.pipe(this.httprequest.process.stdin, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.
|
ws.rtcchannel.pipe(ws.httprequest.process.stdin, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.
|
||||||
this.resume(); // Resume the websocket to keep receiving control data
|
ws.resume(); // Resume the websocket to keep receiving control data
|
||||||
} else if (this.httprequest.protocol == 2) { // Desktop
|
} else if (ws.httprequest.protocol == 2) { // Desktop
|
||||||
// Switch the user input from websocket to webrtc at this point.
|
// Switch the user input from websocket to webrtc at this point.
|
||||||
this.unpipe(this.httprequest.desktop.kvm);
|
ws.unpipe(ws.httprequest.desktop.kvm);
|
||||||
try { this.webrtc.rtcchannel.pipe(this.httprequest.desktop.kvm, { dataTypeSkip: 1 }); } catch (e) { sendConsoleText('EX2'); } // 0 = Binary, 1 = Text.
|
try { ws.webrtc.rtcchannel.pipe(ws.httprequest.desktop.kvm, { dataTypeSkip: 1 }); } catch (e) { sendConsoleText('EX2'); } // 0 = Binary, 1 = Text.
|
||||||
this.resume(); // Resume the websocket to keep receiving control data
|
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') {
|
} else if (obj.type == 'webrtc2') {
|
||||||
// Other side received websocket end of data marker, start sending data on WebRTC channel
|
// Other side received websocket end of data marker, start sending data on WebRTC channel
|
||||||
if (this.httprequest.protocol == 1) { // Terminal
|
if (ws.httprequest.protocol == 1) { // Terminal
|
||||||
this.httprequest.process.stdout.pipe(this.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.
|
ws.httprequest.process.stdout.pipe(ws.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.
|
ws.httprequest.process.stderr.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.
|
||||||
} else if (this.httprequest.protocol == 2) { // Desktop
|
} else if (ws.httprequest.protocol == 2) { // Desktop
|
||||||
this.httprequest.desktop.kvm.pipe(this.webrtc.rtcchannel, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.
|
ws.httprequest.desktop.kvm.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.
|
||||||
}
|
}
|
||||||
} else if (obj.type == 'offer') {
|
} else if (obj.type == 'offer') {
|
||||||
// This is a WebRTC offer.
|
// This is a WebRTC offer.
|
||||||
this.webrtc = rtc.createConnection();
|
ws.webrtc = rtc.createConnection();
|
||||||
this.webrtc.websocket = this;
|
ws.webrtc.websocket = ws;
|
||||||
this.webrtc.on('connected', function () { /*sendConsoleText('Tunnel #' + this.websocket.tunnel.index + ' WebRTC connected');*/ });
|
ws.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');*/ });
|
ws.webrtc.on('disconnected', function () { /*sendConsoleText('Tunnel #' + this.websocket.tunnel.index + ' WebRTC disconnected');*/ });
|
||||||
this.webrtc.on('dataChannel', function (rtcchannel) {
|
ws.webrtc.on('dataChannel', function (rtcchannel) {
|
||||||
//sendConsoleText('WebRTC Datachannel open, protocol: ' + this.websocket.httprequest.protocol);
|
//sendConsoleText('WebRTC Datachannel open, protocol: ' + this.websocket.httprequest.protocol);
|
||||||
rtcchannel.xrtc = this;
|
rtcchannel.xrtc = this;
|
||||||
rtcchannel.websocket = this.websocket;
|
rtcchannel.websocket = this.websocket;
|
||||||
@ -757,9 +787,9 @@ function createMeshCore(agent) {
|
|||||||
this.websocket.rtcchannel = rtcchannel;
|
this.websocket.rtcchannel = rtcchannel;
|
||||||
this.websocket.rtcchannel.on('data', onTunnelWebRTCControlData);
|
this.websocket.rtcchannel.on('data', onTunnelWebRTCControlData);
|
||||||
this.websocket.rtcchannel.on('end', function () { /*sendConsoleText('Tunnel #' + this.websocket.tunnel.index + ' WebRTC data channel closed');*/ });
|
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
|
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 + '.';
|
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] + '.'; }
|
if (amtLmsState >= 0) { response += '\r\nBuilt-in LMS: ' + ['Disabled', 'Connecting..', 'Connected'][amtLmsState] + '.'; }
|
||||||
response += '\r\nModules: ' + JSON.stringify(addedModules) + '';
|
response += '\r\nModules: ' + addedModules.join(', ');
|
||||||
response += '\r\nServerConnected: ' + mesh.isControlChannelConnected + '';
|
response += '\r\nServerConnected: ' + mesh.isControlChannelConnected;
|
||||||
var oldNodeId = db.Get('OldNodeId');
|
var oldNodeId = db.Get('OldNodeId');
|
||||||
if (oldNodeId != null) { response += '\r\nOldNodeID: ' + oldNodeId + '.'; }
|
if (oldNodeId != null) { response += '\r\nOldNodeID: ' + oldNodeId + '.'; }
|
||||||
response += '\r\ServerState: ' + meshServerConnectionState + '.';
|
response += '\r\ServerState: ' + meshServerConnectionState + '.';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'selfinfo': { // Return self information block
|
case 'selfinfo': { // Return self information block
|
||||||
response = JSON.stringify(buildSelfInfo());
|
buildSelfInfo(function (info) { sendConsoleText(objToString(info, 0, ' '), sessionid); });
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'args': { // Displays parsed command arguments
|
case 'args': { // Displays parsed command arguments
|
||||||
response = 'args ' + objToString(args, 0, '.');
|
response = 'args ' + objToString(args, 0, ' ');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'print': { // Print a message on the mesh agent console, does nothing when running in the background
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case 'amt': { // Show Intel AMT status
|
case 'amt': { // Show Intel AMT status
|
||||||
if (amtMeiState != null) {
|
getAmtInfo(function (state) {
|
||||||
response = objToString(amtMeiState, 0, '.');
|
var resp = 'Intel AMT not detected.';
|
||||||
} else {
|
if (state != null) { resp = objToString(state, 0, ' '); }
|
||||||
response = 'This mesh agent does not support Intel AMT.';
|
sendConsoleText(resp, sessionid);
|
||||||
}
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'netinfo': { // Show network interface information
|
case 'netinfo': { // Show network interface information
|
||||||
//response = objToString(mesh.NetInfo, 0, '.');
|
//response = objToString(mesh.NetInfo, 0, ' ');
|
||||||
var interfaces = require('os').networkInterfaces();
|
var interfaces = require('os').networkInterfaces();
|
||||||
response = objToString(interfaces, 0, '.');
|
response = objToString(interfaces, 0, ' ');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'wakeonlan': { // Send wake-on-lan
|
case 'wakeonlan': { // Send wake-on-lan
|
||||||
@ -1027,7 +1057,7 @@ function createMeshCore(agent) {
|
|||||||
}
|
}
|
||||||
case 'location': {
|
case 'location': {
|
||||||
getIpLocationData(function (location) {
|
getIpLocationData(function (location) {
|
||||||
sendConsoleText(objToString({ "action": "iplocation", "type": "publicip", "value": location }, 0, '.'));
|
sendConsoleText(objToString({ "action": "iplocation", "type": "publicip", "value": location }, 0, ' '));
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1108,20 +1138,19 @@ function createMeshCore(agent) {
|
|||||||
|
|
||||||
// Build a bunch a self information data that will be sent to the server
|
// 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.
|
// We need to do this periodically and if anything changes, send the update to the server.
|
||||||
function buildSelfInfo() {
|
function buildSelfInfo(func) {
|
||||||
var r = { "action": "coreinfo", "value": obj.meshCoreInfo, "caps": obj.meshCoreCapabilities };
|
getAmtInfo(function (meinfo) {
|
||||||
if (mesh.hasHECI == 1) {
|
var r = { "action": "coreinfo", "value": obj.meshCoreInfo, "caps": obj.meshCoreCapabilities };
|
||||||
var meinfo = amtMeiState;
|
|
||||||
var amtPresent = false, intelamt = {};
|
|
||||||
if (meinfo != null) {
|
if (meinfo != null) {
|
||||||
if (meinfo.Versions && meinfo.Versions.AMT) { intelamt.ver = meinfo.Versions.AMT; amtPresent = true; }
|
var intelamt = {}, p = false;
|
||||||
if (meinfo.ProvisioningState) { intelamt.state = meinfo.ProvisioningState; amtPresent = true; }
|
if (meinfo.Versions && meinfo.Versions.AMT) { intelamt.ver = meinfo.Versions.AMT; p = true; }
|
||||||
if (meinfo.flags) { intelamt.flags = meinfo.Flags; amtPresent = true; }
|
if (meinfo.ProvisioningState) { intelamt.state = meinfo.ProvisioningState; p = true; }
|
||||||
if (meinfo.OsHostname) { intelamt.host = meinfo.OsHostname; amtPresent = true; }
|
if (meinfo.flags) { intelamt.flags = meinfo.Flags; p = true; }
|
||||||
if (amtPresent == true) { r.intelamt = intelamt }
|
if (meinfo.OsHostname) { intelamt.host = meinfo.OsHostname; p = true; }
|
||||||
|
if (p == true) { r.intelamt = intelamt }
|
||||||
}
|
}
|
||||||
}
|
func(r);
|
||||||
return JSON.stringify(r);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the server with the latest network interface information
|
// Update the server with the latest network interface information
|
||||||
@ -1141,8 +1170,10 @@ function createMeshCore(agent) {
|
|||||||
function sendPeriodicServerUpdate(force) {
|
function sendPeriodicServerUpdate(force) {
|
||||||
if ((amtMeiConnected != 1) || (force == true)) { // If we are pending MEI connection, hold off on updating the server on self-info
|
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
|
// Update the self information data
|
||||||
var selfInfo = buildSelfInfo(), selfInfoStr = JSON.stringify(selfInfo);
|
buildSelfInfo(function (selfInfo) {
|
||||||
if ((force == true) || (selfInfoStr != lastSelfInfo)) { mesh.SendCommand(selfInfo); lastSelfInfo = selfInfoStr; }
|
selfInfoStr = JSON.stringify(selfInfo);
|
||||||
|
if ((force == true) || (selfInfoStr != lastSelfInfo)) { mesh.SendCommand(selfInfo); lastSelfInfo = selfInfoStr; }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update network information
|
// Update network information
|
||||||
@ -1160,7 +1191,7 @@ function createMeshCore(agent) {
|
|||||||
amtMei.getEHBCState(function (result) { if (result.EHBC == true) { amtMeiTmpState.Flags += 1; } });
|
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.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.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
|
// Called on MicroLMS Intel AMT user notification
|
||||||
|
78
agents/meshinstall-initd.sh
Normal file
78
agents/meshinstall-initd.sh
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: <NAME>
|
||||||
|
# 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: <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 <NAME> remove
|
||||||
|
rm -fv "$0"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
forceuninstall() {
|
||||||
|
stop
|
||||||
|
rm -f "$PIDFILE"
|
||||||
|
rm -f "$LOGFILE"
|
||||||
|
update-rc.d -f <NAME> 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
|
164
agents/meshinstall-linux-old.sh
Normal file
164
agents/meshinstall-linux-old.sh
Normal file
@ -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
|
@ -1,6 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
CheckStartupType() {
|
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..."
|
# echo "Checking process autostart system..."
|
||||||
if [[ `systemctl` =~ -\.mount ]]; then return 1; # systemd;
|
if [[ `systemctl` =~ -\.mount ]]; then return 1; # systemd;
|
||||||
elif [[ `/sbin/init --version` =~ upstart ]]; then return 2; # upstart;
|
elif [[ `/sbin/init --version` =~ upstart ]]; then return 2; # upstart;
|
||||||
@ -87,15 +97,26 @@ DownloadAgent() {
|
|||||||
UpdateMshFile
|
UpdateMshFile
|
||||||
if [ $starttype -eq 1 ]
|
if [ $starttype -eq 1 ]
|
||||||
then
|
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
|
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 enable meshagent
|
||||||
systemctl start meshagent
|
systemctl start meshagent
|
||||||
else
|
else
|
||||||
./meshagent start
|
if [ $starttype -eq 3 ]
|
||||||
ln -s /usr/local/mesh/meshagent /sbin/meshcmd
|
then
|
||||||
ln -s /usr/local/mesh/meshagent /etc/rc2.d/S20mesh
|
# initd
|
||||||
ln -s /usr/local/mesh/meshagent /etc/rc3.d/S20mesh
|
wget $url/meshagents?script=2 -q --no-check-certificate -O /etc/init.d/meshagent
|
||||||
ln -s /usr/local/mesh/meshagent /etc/rc5.d/S20mesh
|
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
|
fi
|
||||||
echo "Mesh agent started."
|
echo "Mesh agent started."
|
||||||
else
|
else
|
||||||
@ -117,11 +138,20 @@ UninstallAgent() {
|
|||||||
|
|
||||||
if [ $starttype -eq 1 ]
|
if [ $starttype -eq 1 ]
|
||||||
then
|
then
|
||||||
|
# systemd
|
||||||
rm -f /sbin/meshcmd /lib/systemd/system/meshagent.service
|
rm -f /sbin/meshcmd /lib/systemd/system/meshagent.service
|
||||||
systemctl disable meshagent
|
systemctl disable meshagent
|
||||||
systemctl stop meshagent
|
systemctl stop meshagent
|
||||||
else
|
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
|
fi
|
||||||
|
|
||||||
if [ -e $installpath ]
|
if [ -e $installpath ]
|
||||||
|
@ -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_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_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_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_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_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); }
|
obj.IPS_OptInService_SendOptInCode = function (OptInCode, callback_func) { obj.Exec("IPS_OptInService", "SendOptInCode", { "OptInCode": OptInCode }, callback_func); }
|
||||||
|
@ -809,7 +809,8 @@ function CreateMeshCentralServer(config) {
|
|||||||
|
|
||||||
// List of possible mesh agent install scripts
|
// List of possible mesh agent install scripts
|
||||||
var meshAgentsInstallScriptList = {
|
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
|
// Update the list of available mesh agents
|
||||||
|
@ -374,7 +374,7 @@ module.exports.CreateMpsServer = function (parent, db, args, certificates) {
|
|||||||
var WindowSize = common.ReadInt(data, 9);
|
var WindowSize = common.ReadInt(data, 9);
|
||||||
socket.tag.activetunnels++;
|
socket.tag.activetunnels++;
|
||||||
var cirachannel = socket.tag.channels[RecipientChannel];
|
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.amtchannelid = SenderChannel;
|
||||||
cirachannel.sendcredits = cirachannel.amtCiraWindow = WindowSize;
|
cirachannel.sendcredits = cirachannel.amtCiraWindow = WindowSize;
|
||||||
Debug(3, 'MPS:CHANNEL_OPEN_CONFIRMATION', RecipientChannel, SenderChannel, WindowSize);
|
Debug(3, 'MPS:CHANNEL_OPEN_CONFIRMATION', RecipientChannel, SenderChannel, WindowSize);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "meshcentral",
|
"name": "meshcentral",
|
||||||
"version": "0.1.4-f",
|
"version": "0.1.4-g",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"Remote Management",
|
"Remote Management",
|
||||||
"Intel AMT",
|
"Intel AMT",
|
||||||
|
@ -539,8 +539,8 @@ th {
|
|||||||
</div>
|
</div>
|
||||||
<div id="dialog12" style="margin:auto;margin:3px">
|
<div id="dialog12" style="margin:auto;margin:3px">
|
||||||
<br>
|
<br>
|
||||||
<div style='height:26px'><input id="idx_d12name" style="float:right;width:200px" onkeyup="updateWifiDialog()"><div>Profile Name</div></div>
|
<div style='height:26px'><input id="idx_d12name" style="float:right;width:200px" maxlength="32" onkeyup="updateWifiDialog()" title="Maximum 32 characters"><div title="Maximum 32 characters">Profile Name</div></div>
|
||||||
<div style='height:26px'><input id="idx_d12ssid" style="float:right;width:200px" onkeyup="updateWifiDialog()"><div>SSID</div></div>
|
<div style='height:26px'><input id="idx_d12ssid" style="float:right;width:200px" maxlength="32" onkeyup="updateWifiDialog()" title="Maximum 32 characters"><div title="Maximum 32 characters">SSID</div></div>
|
||||||
<div style='height:26px'>
|
<div style='height:26px'>
|
||||||
<select id="idx_d12pri" style="float:right;width:200px" onclick="updateWifiDialog()"></select>
|
<select id="idx_d12pri" style="float:right;width:200px" onclick="updateWifiDialog()"></select>
|
||||||
<div>Priority</div>
|
<div>Priority</div>
|
||||||
@ -565,8 +565,8 @@ th {
|
|||||||
</select>
|
</select>
|
||||||
<div>Encryption</div>
|
<div>Encryption</div>
|
||||||
</div>
|
</div>
|
||||||
<div style='height:26px'><input id="idx_d12password1" type="password" style="float:right;width:200px" onkeyup="updateWifiDialog()"><div>Password*</div></div>
|
<div style='height:26px'><input id="idx_d12password1" type="password" style="float:right;width:200px" maxlength="63" onkeyup="updateWifiDialog()" title="Length between 8 and 63 characters"><div title="Length between 8 and 63 characters">Password*</div></div>
|
||||||
<div style='height:26px'><input id="idx_d12password2" type="password" style="float:right;width:200px" onkeyup="updateWifiDialog()"><div>Confirm Password</div></div>
|
<div style='height:26px'><input id="idx_d12password2" type="password" style="float:right;width:200px" maxlength="63" onkeyup="updateWifiDialog()" title="Length between 8 and 63 characters"><div title="Length between 8 and 63 characters">Confirm Password</div></div>
|
||||||
</div>
|
</div>
|
||||||
<div id="dialog19" style="margin:auto;margin:3px">
|
<div id="dialog19" style="margin:auto;margin:3px">
|
||||||
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.<br><br>
|
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.<br><br>
|
||||||
@ -1504,7 +1504,7 @@ var WsmanStackCreateService = function (host, port, user, pass, tls, extra) {
|
|||||||
|
|
||||||
// Perform a WSMAN PULL operation
|
// Perform a WSMAN PULL operation
|
||||||
obj.ExecPull = function (resuri, enumctx, callback, tag, pri) {
|
obj.ExecPull = function (resuri, enumctx, callback, tag, pri) {
|
||||||
obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns=\"http://schemas.xmlsoap.org/ws/2004/09/enumeration\"><EnumerationContext>" + enumctx + "</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>", callback, tag, pri);
|
obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns=\"http://schemas.xmlsoap.org/ws/2004/09/enumeration\"><EnumerationContext>" + enumctx + "</EnumerationContext></Pull></Body></Envelope>", callback, tag, pri); // </EnumerationContext>--<MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters>--</Pull>
|
||||||
}
|
}
|
||||||
|
|
||||||
// Private method
|
// Private method
|
||||||
@ -1644,9 +1644,8 @@ var WsmanStackCreateService = function (host, port, user, pass, tls, extra) {
|
|||||||
function _turnToXml(text) {
|
function _turnToXml(text) {
|
||||||
if (window.DOMParser) {
|
if (window.DOMParser) {
|
||||||
return new DOMParser().parseFromString(text, "text/xml");
|
return new DOMParser().parseFromString(text, "text/xml");
|
||||||
}
|
} else {
|
||||||
else // Internet Explorer
|
// Internet Explorer
|
||||||
{
|
|
||||||
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
|
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
|
||||||
xmlDoc.async = false;
|
xmlDoc.async = false;
|
||||||
xmlDoc.loadXML(text);
|
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; }
|
if (response == null || response.Header["Method"] != "PullResponse") { callback(obj, name, null, 604, tag); _EnumDoNext(1); return; }
|
||||||
for (var i in response.Body["Items"]) {
|
for (var i in response.Body["Items"]) {
|
||||||
if (response.Body["Items"][i] instanceof Array) {
|
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 {
|
} else {
|
||||||
items.push(response.Body["Items"][i]);
|
if (typeof response.Body["Items"][i] != 'function') { items.push(response.Body["Items"][i]); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (response.Body["EnumerationContext"]) {
|
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_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_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_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_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_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); }
|
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 urlvars = null;
|
||||||
var amtstack;
|
var amtstack;
|
||||||
var wsstack = null;
|
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"];
|
var v = getInstance(amtlogicalelements, "AMT")["VersionString"];
|
||||||
amtversion = parseInt(v.split('.')[0]);
|
amtversion = parseInt(v.split('.')[0]);
|
||||||
amtversionmin = parseInt(v.split('.')[1]);
|
amtversionmin = parseInt(v.split('.')[1]);
|
||||||
@ -34602,9 +34603,7 @@ if (typeof module !== "undefined" && module.exports) {
|
|||||||
xx += getWatchdogTransitionStr(t['OldState']) + " → " + getWatchdogTransitionStr(t['NewState']);
|
xx += getWatchdogTransitionStr(t['OldState']) + " → " + getWatchdogTransitionStr(t['NewState']);
|
||||||
if (t.actions) {
|
if (t.actions) {
|
||||||
var action = t.actions[0];
|
var action = t.actions[0];
|
||||||
if (action['EventOnTransition'] == true) {
|
if (action['EventOnTransition'] == true) { xx += " : Event to log"; }
|
||||||
xx += " : Event to log";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (xx != '') { x += "<div style=padding:12px>" + xx + "</div>"; }
|
if (xx != '') { x += "<div style=padding:12px>" + xx + "</div>"; }
|
||||||
@ -35298,8 +35297,7 @@ if (typeof module !== "undefined" && module.exports) {
|
|||||||
'__parameterType': 'reference',
|
'__parameterType': 'reference',
|
||||||
'__resourceUri': amtstack.CompleteName('CIM_WiFiEndpoint'),
|
'__resourceUri': amtstack.CompleteName('CIM_WiFiEndpoint'),
|
||||||
'Name': 'WiFi Endpoint 0'
|
'Name': 'WiFi Endpoint 0'
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
'__parameterType': 'instance',
|
'__parameterType': 'instance',
|
||||||
'__namespace': amtstack.CompleteName('CIM_WiFiEndpointSettings'),
|
'__namespace': amtstack.CompleteName('CIM_WiFiEndpointSettings'),
|
||||||
'ElementName': idx_d12name.value,
|
'ElementName': idx_d12name.value,
|
||||||
@ -35328,7 +35326,7 @@ if (typeof module !== "undefined" && module.exports) {
|
|||||||
// Check if there is already a profile with this name
|
// 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; } }
|
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);
|
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) {
|
function showUserDetails(h) {
|
||||||
if (xxdialogMode) return;
|
if (xxdialogMode) return;
|
||||||
var a = xxAccountRealmInfo[h], x = '<div style=text-align:left>';
|
var a = xxAccountRealmInfo[h], x = '<div style=text-align:left>';
|
||||||
@ -36275,7 +36273,7 @@ if (typeof module !== "undefined" && module.exports) {
|
|||||||
delete x["DefaultGateway"];
|
delete x["DefaultGateway"];
|
||||||
delete x["PrimaryDNS"];
|
delete x["PrimaryDNS"];
|
||||||
delete x["SecondaryDNS"];
|
delete x["SecondaryDNS"];
|
||||||
if (!y) {
|
if (d21o1.checked == false) {
|
||||||
x["IPAddress"] = idx_d21address.value;
|
x["IPAddress"] = idx_d21address.value;
|
||||||
x["SubnetMask"] = idx_d21subnet.value;
|
x["SubnetMask"] = idx_d21subnet.value;
|
||||||
x["DefaultGateway"] = idx_d21gateway.value;
|
x["DefaultGateway"] = idx_d21gateway.value;
|
||||||
|
@ -83,9 +83,9 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.Send = function (x) {
|
obj.send = function (x) {
|
||||||
//console.log("KSend(" + x.length + "): " + rstr2hex(x));
|
//console.log("KSend(" + x.length + "): " + rstr2hex(x));
|
||||||
obj.parent.Send(x);
|
obj.parent.send(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
// KVM Control.
|
// KVM Control.
|
||||||
@ -138,24 +138,24 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) {
|
|||||||
obj.SendUnPause = function () {
|
obj.SendUnPause = function () {
|
||||||
//obj.Debug("SendUnPause");
|
//obj.Debug("SendUnPause");
|
||||||
//obj.xxStateChange(3);
|
//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.SendPause = function () {
|
||||||
//obj.Debug("SendPause");
|
//obj.Debug("SendPause");
|
||||||
//obj.xxStateChange(2);
|
//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) {
|
obj.SendCompressionLevel = function (type, level, scaling, frametimer) {
|
||||||
if (level) { obj.CompressionLevel = level; }
|
if (level) { obj.CompressionLevel = level; }
|
||||||
if (scaling) { obj.ScalingLevel = scaling; }
|
if (scaling) { obj.ScalingLevel = scaling; }
|
||||||
if (frametimer) { obj.FrameRateTimer = frametimer; }
|
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.SendRefresh = function () {
|
||||||
obj.Send(String.fromCharCode(0x00, 0x06, 0x00, 0x04));
|
obj.send(String.fromCharCode(0x00, 0x06, 0x00, 0x04));
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.ProcessScreenMsg = function (width, height) {
|
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, 91); // Left-Windows
|
||||||
obj.SendKeyMsgKC(obj.KeyAction.UP, 92); // Right-Windows
|
obj.SendKeyMsgKC(obj.KeyAction.UP, 92); // Right-Windows
|
||||||
obj.SendKeyMsgKC(obj.KeyAction.UP, 16); // Shift
|
obj.SendKeyMsgKC(obj.KeyAction.UP, 16); // Shift
|
||||||
obj.Send(String.fromCharCode(0x00, 0x0E, 0x00, 0x04));
|
obj.send(String.fromCharCode(0x00, 0x0E, 0x00, 0x04));
|
||||||
break;
|
break;
|
||||||
case 11: // GetDisplays
|
case 11: // GetDisplays
|
||||||
var myOptions = [], dcount = ((str.charCodeAt(4) & 0xFF) << 8) + (str.charCodeAt(5) & 0xFF);
|
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) {
|
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) {
|
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.sendcad = function() { obj.SendCtrlAltDelMsg(); }
|
||||||
|
|
||||||
obj.SendCtrlAltDelMsg = function () {
|
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 () {
|
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 () {
|
obj.SendStartMsg = function () {
|
||||||
@ -298,7 +298,7 @@ var CreateAgentRemoteDesktop = function (canvasid, scrolldiv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
obj.SendTouchMsg1 = function (id, flags, x, y) {
|
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) {
|
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);
|
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.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; }
|
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 = "";
|
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));
|
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));
|
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.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.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.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); }
|
obj.shortToStr = function (x) { return String.fromCharCode((x >> 8) & 0xFF, x & 0xFF); }
|
||||||
|
|
||||||
|
@ -10,18 +10,19 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) {
|
|||||||
obj.m = module; // This is the inner module (Terminal or Desktop)
|
obj.m = module; // This is the inner module (Terminal or Desktop)
|
||||||
module.parent = obj;
|
module.parent = obj;
|
||||||
obj.meshserver = meshserver;
|
obj.meshserver = meshserver;
|
||||||
obj.nodeid = null;
|
|
||||||
obj.State = 0;
|
obj.State = 0;
|
||||||
|
obj.nodeid = null;
|
||||||
obj.socket = null;
|
obj.socket = null;
|
||||||
obj.connectstate = -1;
|
obj.connectstate = -1;
|
||||||
obj.tunnelid = Math.random().toString(36).substring(2); // Generate a random client tunnel id
|
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.protocol = module.protocol; // 1 = SOL, 2 = KVM, 3 = IDER, 4 = Files, 5 = FileTransfer
|
||||||
|
obj.onStateChanged = null;
|
||||||
|
obj.ctrlMsgAllowed = true;
|
||||||
obj.attemptWebRTC = false;
|
obj.attemptWebRTC = false;
|
||||||
obj.webRtcActive = false;
|
obj.webRtcActive = false;
|
||||||
obj.webSwitchOk = false;
|
obj.webSwitchOk = false;
|
||||||
obj.webrtc = null;
|
|
||||||
obj.webchannel = null;
|
obj.webchannel = null;
|
||||||
obj.onStateChanged = null;
|
obj.webrtc = null;
|
||||||
obj.debugmode = 0;
|
obj.debugmode = 0;
|
||||||
|
|
||||||
// Private method
|
// Private method
|
||||||
@ -38,8 +39,8 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) {
|
|||||||
obj.socket.onerror = function (e) { console.error(e); }
|
obj.socket.onerror = function (e) { console.error(e); }
|
||||||
obj.socket.onclose = obj.xxOnSocketClosed;
|
obj.socket.onclose = obj.xxOnSocketClosed;
|
||||||
obj.xxStateChange(1);
|
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: 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: "*/meshrelay.ashx?id=" + obj.tunnelid });
|
||||||
//obj.debug("Agent Redir Start: " + url);
|
//obj.debug("Agent Redir Start: " + url);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,6 +54,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) {
|
|||||||
obj.xxOnControlCommand = function (msg) {
|
obj.xxOnControlCommand = function (msg) {
|
||||||
var controlMsg;
|
var controlMsg;
|
||||||
try { controlMsg = JSON.parse(msg); } catch (e) { return; }
|
try { controlMsg = JSON.parse(msg); } catch (e) { return; }
|
||||||
|
if (controlMsg.ctrlChannel != '102938') { obj.xxOnSocketData(msg); return; }
|
||||||
//console.log(controlMsg);
|
//console.log(controlMsg);
|
||||||
if (obj.webrtc != null) {
|
if (obj.webrtc != null) {
|
||||||
if (controlMsg.type == 'answer') {
|
if (controlMsg.type == 'answer') {
|
||||||
@ -61,16 +63,19 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) {
|
|||||||
obj.webSwitchOk = true; // Other side is ready for switch over
|
obj.webSwitchOk = true; // Other side is ready for switch over
|
||||||
performWebRtcSwitch();
|
performWebRtcSwitch();
|
||||||
} else if (controlMsg.type == 'webrtc1') {
|
} 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') {
|
} else if (controlMsg.type == 'webrtc2') {
|
||||||
// TODO: Resume/Start sending data over WebRTC
|
// TODO: Resume/Start sending data over WebRTC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sendCtrlMsg(x) { if (obj.ctrlMsgAllowed == true) { try { obj.socket.send(x); } catch (e) { } } }
|
||||||
|
|
||||||
function performWebRtcSwitch() {
|
function performWebRtcSwitch() {
|
||||||
if ((obj.webSwitchOk == true) && (obj.webRtcActive == true)) {
|
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
|
// TODO: Hold/Stop sending data over websocket
|
||||||
if (obj.onStateChanged != null) { obj.onStateChanged(obj, obj.State); }
|
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.
|
// Close the WebRTC connection, should be called if a problem occurs during WebRTC setup.
|
||||||
obj.xxCloseWebRTC = function () {
|
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.webchannel != null) { try { obj.webchannel.close(); } catch (e) { } obj.webchannel = null; }
|
||||||
if (obj.webrtc != null) { try { obj.webrtc.close(); } catch (e) { } obj.webrtc = null; }
|
if (obj.webrtc != null) { try { obj.webrtc.close(); } catch (e) { } obj.webrtc = null; }
|
||||||
obj.webRtcActive = false;
|
obj.webRtcActive = false;
|
||||||
@ -86,6 +91,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) {
|
|||||||
|
|
||||||
obj.xxOnMessage = function (e) {
|
obj.xxOnMessage = function (e) {
|
||||||
//if (obj.debugmode == 1) { console.log('Recv', e.data); }
|
//if (obj.debugmode == 1) { console.log('Recv', e.data); }
|
||||||
|
//console.log('Recv', e.data, obj.State);
|
||||||
if (obj.State < 3) {
|
if (obj.State < 3) {
|
||||||
if (e.data == 'c') {
|
if (e.data == 'c') {
|
||||||
obj.socket.send(obj.protocol);
|
obj.socket.send(obj.protocol);
|
||||||
@ -120,7 +126,6 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) {
|
|||||||
}, obj.xxCloseWebRTC, { mandatory: { OfferToReceiveAudio: false, OfferToReceiveVideo: false } });
|
}, obj.xxCloseWebRTC, { mandatory: { OfferToReceiveAudio: false, OfferToReceiveVideo: false } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -169,9 +174,9 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) {
|
|||||||
return obj.m.ProcessData(data);
|
return obj.m.ProcessData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.Send = function (x) {
|
obj.send = function (x) {
|
||||||
//obj.debug("Agent Redir Send(" + obj.webRtcActive + ", " + x.length + "): " + rstr2hex(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 (obj.socket != null && obj.socket.readyState == WebSocket.OPEN) {
|
||||||
if (typeof x == 'string') {
|
if (typeof x == 'string') {
|
||||||
if (obj.debugmode == 1) {
|
if (obj.debugmode == 1) {
|
||||||
@ -210,7 +215,7 @@ var CreateAgentRedirect = function (meshserver, module, serverPublicNamePort) {
|
|||||||
obj.connectstate = -1;
|
obj.connectstate = -1;
|
||||||
obj.xxCloseWebRTC();
|
obj.xxCloseWebRTC();
|
||||||
if (obj.socket != null) {
|
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.socket = null;
|
||||||
}
|
}
|
||||||
obj.xxStateChange(0);
|
obj.xxStateChange(0);
|
||||||
|
@ -81,19 +81,19 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
|||||||
//var version = parseFloat(obj.acc.substring(4, 11));
|
//var version = parseFloat(obj.acc.substring(4, 11));
|
||||||
//obj.Debug("KVersion: " + version);
|
//obj.Debug("KVersion: " + version);
|
||||||
obj.state = 1;
|
obj.state = 1;
|
||||||
obj.Send("RFB 003.008\n");
|
obj.send("RFB 003.008\n");
|
||||||
}
|
}
|
||||||
else if (obj.state == 1 && obj.acc.length >= 1) {
|
else if (obj.state == 1 && obj.acc.length >= 1) {
|
||||||
// Getting security options
|
// Getting security options
|
||||||
cmdsize = obj.acc.charCodeAt(0) + 1;
|
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;
|
obj.state = 2;
|
||||||
}
|
}
|
||||||
else if (obj.state == 2 && obj.acc.length >= 4) {
|
else if (obj.state == 2 && obj.acc.length >= 4) {
|
||||||
// Getting security response
|
// Getting security response
|
||||||
cmdsize = 4;
|
cmdsize = 4;
|
||||||
if (ReadInt(obj.acc, 0) != 0) { return obj.Stop(); }
|
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;
|
obj.state = 3;
|
||||||
}
|
}
|
||||||
else if (obj.state == 3 && obj.acc.length >= 24) {
|
else if (obj.state == 3 && obj.acc.length >= 24) {
|
||||||
@ -138,11 +138,11 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
|||||||
if (obj.useZRLE) supportedEncodings += IntToStr(16);
|
if (obj.useZRLE) supportedEncodings += IntToStr(16);
|
||||||
supportedEncodings += IntToStr(0);
|
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
|
// 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)
|
// 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
|
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.state = 4;
|
||||||
obj.parent.xxStateChange(3);
|
obj.parent.xxStateChange(3);
|
||||||
@ -194,7 +194,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
|||||||
// Desktop Size (0xFFFFFF21, -223)
|
// Desktop Size (0xFFFFFF21, -223)
|
||||||
obj.canvas.canvas.width = obj.rwidth = obj.width = width;
|
obj.canvas.canvas.width = obj.rwidth = obj.width = width;
|
||||||
obj.canvas.canvas.height = obj.rheight = obj.height = height;
|
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;
|
cmdsize = 12;
|
||||||
if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); }
|
if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); }
|
||||||
// obj.Debug("New desktop width: " + obj.width + ", height: " + obj.height);
|
// obj.Debug("New desktop width: " + obj.width + ", height: " + obj.height);
|
||||||
@ -454,13 +454,13 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
|||||||
if (obj.focusmode > 0) {
|
if (obj.focusmode > 0) {
|
||||||
// Request only pixels around the last mouse position
|
// Request only pixels around the last mouse position
|
||||||
var df = obj.focusmode * 2;
|
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.ox = obj.mx;
|
||||||
obj.oy = obj.my;
|
obj.oy = obj.my;
|
||||||
} else {
|
} else {
|
||||||
// ###END###{DesktopFocus}
|
// ###END###{DesktopFocus}
|
||||||
// Request the entire screen
|
// 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}
|
// ###BEGIN###{DesktopFocus}
|
||||||
}
|
}
|
||||||
// ###END###{DesktopFocus}
|
// ###END###{DesktopFocus}
|
||||||
@ -485,10 +485,10 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
|||||||
obj.parent.Stop();
|
obj.parent.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.Send = function (x) {
|
obj.send = function (x) {
|
||||||
//obj.Debug("KSend(" + x.length + "): " + rstr2hex(x));
|
//obj.Debug("KSend(" + x.length + "): " + rstr2hex(x));
|
||||||
//obj.outbytes += x.length;
|
//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);
|
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.SendCtrlAltDelMsg = function () { obj.sendcad(); }
|
||||||
obj.sendcad = function () {
|
obj.sendcad = function () {
|
||||||
@ -625,7 +625,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
|||||||
}
|
}
|
||||||
// ###END###{DesktopRotation}
|
// ###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}
|
// ###BEGIN###{DesktopFocus}
|
||||||
// Update focus area if we are in focus mode
|
// Update focus area if we are in focus mode
|
||||||
|
@ -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.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); }
|
if (obj.protocol == 1) { obj.xxSend(String.fromCharCode(0x28, 0x00, 0x00, 0x00) + IntToStrX(obj.amtsequence++) + ShortToStrX(x.length) + x); } else { obj.xxSend(x); }
|
||||||
}
|
}
|
||||||
|
@ -554,8 +554,8 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.TermSendKeys = function(keys) { obj.parent.Send(keys); }
|
obj.TermSendKeys = function(keys) { obj.parent.send(keys); }
|
||||||
obj.TermSendKey = function(key) { obj.parent.Send(String.fromCharCode(key)); }
|
obj.TermSendKey = function(key) { obj.parent.send(String.fromCharCode(key)); }
|
||||||
|
|
||||||
function _TermMoveUp(linecount) {
|
function _TermMoveUp(linecount) {
|
||||||
var x, y;
|
var x, y;
|
||||||
|
@ -37,7 +37,7 @@ var MeshServerCreateControl = function (domain) {
|
|||||||
if (obj.onMessage) obj.onMessage(obj, message);
|
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;
|
return obj;
|
||||||
}
|
}
|
||||||
|
@ -777,9 +777,9 @@
|
|||||||
setTimeout(serverPoll, 5000);
|
setTimeout(serverPoll, 5000);
|
||||||
} else if (state == 2) {
|
} else if (state == 2) {
|
||||||
// Fetch list of meshes, nodes, files
|
// Fetch list of meshes, nodes, files
|
||||||
meshserver.Send({ action: 'meshes' });
|
meshserver.send({ action: 'meshes' });
|
||||||
meshserver.Send({ action: 'nodes' });
|
meshserver.send({ action: 'nodes' });
|
||||||
meshserver.Send({ action: 'files' });
|
meshserver.send({ action: 'files' });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,8 +821,8 @@
|
|||||||
if ((userinfo.siteadmin & 2) != 0)
|
if ((userinfo.siteadmin & 2) != 0)
|
||||||
{
|
{
|
||||||
// We are user administrator
|
// We are user administrator
|
||||||
if (users == null) { meshserver.Send({ action: 'users' }); }
|
if (users == null) { meshserver.send({ action: 'users' }); }
|
||||||
if (wssessions == null) { meshserver.Send({ action: 'wssessioncount' }); }
|
if (wssessions == null) { meshserver.send({ action: 'wssessioncount' }); }
|
||||||
} else {
|
} else {
|
||||||
// We are not user administrator
|
// We are not user administrator
|
||||||
users = null;
|
users = null;
|
||||||
@ -830,7 +830,7 @@
|
|||||||
updateUsers();
|
updateUsers();
|
||||||
if (xxcurrentView == 4) go(1);
|
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);
|
QV('p2deleteall', userinfo.siteadmin == 0xFFFFFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -996,7 +996,7 @@
|
|||||||
if (userinfo.name == message.event.account.name) {
|
if (userinfo.name == message.event.account.name) {
|
||||||
var newsiteadmin = message.event.account.siteadmin?message.event.account.siteadmin:0;
|
var newsiteadmin = message.event.account.siteadmin?message.event.account.siteadmin:0;
|
||||||
var oldsiteadmin = userinfo.siteadmin?userinfo.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;
|
userinfo = message.event.account;
|
||||||
if (oldsiteadmin != newsiteadmin) updateSiteAdmin();
|
if (oldsiteadmin != newsiteadmin) updateSiteAdmin();
|
||||||
QV('verifyEmailId', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true));
|
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 };
|
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();
|
updateMeshes();
|
||||||
updateDevices();
|
updateDevices();
|
||||||
meshserver.Send({ action: 'files' });
|
meshserver.send({ action: 'files' });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1029,7 +1029,7 @@
|
|||||||
if (meshes[message.event.meshid] == null) {
|
if (meshes[message.event.meshid] == null) {
|
||||||
// This is a new mesh for us
|
// 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 };
|
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 {
|
} else {
|
||||||
// This is an existing mesh
|
// This is an existing mesh
|
||||||
meshes[message.event.meshid].name = message.event.name;
|
meshes[message.event.meshid].name = message.event.name;
|
||||||
@ -1052,7 +1052,7 @@
|
|||||||
}
|
}
|
||||||
updateMeshes();
|
updateMeshes();
|
||||||
updateDevices();
|
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 we are looking at a mesh that is now deleted, move back to "My Account"
|
||||||
if (xxcurrentView == 20 && currentMesh._id == message.event.meshid) { p20updateMesh(); }
|
if (xxcurrentView == 20 && currentMesh._id == message.event.meshid) { p20updateMesh(); }
|
||||||
@ -1063,7 +1063,7 @@
|
|||||||
if (meshes[message.event.meshid]) {
|
if (meshes[message.event.meshid]) {
|
||||||
delete meshes[message.event.meshid];
|
delete meshes[message.event.meshid];
|
||||||
updateMeshes();
|
updateMeshes();
|
||||||
meshserver.Send({ action: 'files' });
|
meshserver.send({ action: 'files' });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete all nodes in that mesh
|
// Delete all nodes in that mesh
|
||||||
@ -1505,7 +1505,7 @@
|
|||||||
if (elements[i].checked) {
|
if (elements[i].checked) {
|
||||||
var ipaddr = elements[i].getAttribute('tag');
|
var ipaddr = elements[i].getAttribute('tag');
|
||||||
var amtinfo = amtScanResults[ipaddr];
|
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('dp1range', false);
|
||||||
QE('dp1rangebutton', false);
|
QE('dp1rangebutton', false);
|
||||||
QH('dp1results', '<div style=width:100%;text-align:center;margin-top:12px>Scanning...</div>');
|
QH('dp1results', '<div style=width:100%;text-align:center;margin-top:12px>Scanning...</div>');
|
||||||
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.
|
// Called when a scanned computer is checked or unchecked.
|
||||||
@ -1596,7 +1596,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function performAgentInvite(button, meshid) {
|
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) {
|
function addAgentToMesh(meshid) {
|
||||||
@ -1660,7 +1660,7 @@
|
|||||||
if (amtuser == '') amtuser = 'admin';
|
if (amtuser == '') amtuser = 'admin';
|
||||||
var host = Q('dp1hostname').value;
|
var host = Q('dp1hostname').value;
|
||||||
if (host == '') host = Q('dp1devicename').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() {
|
function deviceHeaderSet() {
|
||||||
@ -1735,7 +1735,7 @@
|
|||||||
// Group wake
|
// Group wake
|
||||||
var nodeids = [], elements = document.getElementsByClassName("DeviceCheckbox"), checkcount = 0;
|
var nodeids = [], elements = document.getElementsByClassName("DeviceCheckbox"), checkcount = 0;
|
||||||
for (var i in elements) { if (elements[i].checked) { nodeids.push(elements[i].value.substring(6)); } }
|
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) {
|
} else if (op == 101) {
|
||||||
// Group delete, ask for confirmation
|
// Group delete, ask for confirmation
|
||||||
var x = "Confirm delete selected devices(s)?<br /><br />";
|
var x = "Confirm delete selected devices(s)?<br /><br />";
|
||||||
@ -1746,7 +1746,7 @@
|
|||||||
// Power operation
|
// Power operation
|
||||||
var nodeids = [], elements = document.getElementsByClassName("DeviceCheckbox"), checkcount = 0;
|
var nodeids = [], elements = document.getElementsByClassName("DeviceCheckbox"), checkcount = 0;
|
||||||
for (var i in elements) { if (elements[i].checked) { nodeids.push(elements[i].value.substring(6)); } }
|
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() {
|
function groupActionFunctionDelEx() {
|
||||||
var nodeids = [], elements = document.getElementsByClassName("DeviceCheckbox"), checkcount = 0;
|
var nodeids = [], elements = document.getElementsByClassName("DeviceCheckbox"), checkcount = 0;
|
||||||
for (var i in elements) { if (elements[i].checked) { nodeids.push(elements[i].value.substring(6)); } }
|
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) {
|
function onSortSelectChange(skipsave) {
|
||||||
@ -1875,7 +1875,7 @@
|
|||||||
|
|
||||||
// Clear Marker item
|
// Clear Marker item
|
||||||
var map_cm_clearMarker = { text: "Remove node location", callback: function (obj) {
|
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
|
// Save Marker item
|
||||||
@ -2085,7 +2085,7 @@
|
|||||||
var coord = ft.getGeometry().getCoordinates();
|
var coord = ft.getGeometry().getCoordinates();
|
||||||
var v = ol.proj.transform(coord, 'EPSG:3857', 'EPSG:4326');
|
var v = ol.proj.transform(coord, 'EPSG:3857', 'EPSG:4326');
|
||||||
var vx = [ v[1], v[0] ]; // Flip the coordinates around, lat/long
|
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) {
|
if (activeInteraction) {
|
||||||
saveMarkerloc(feature);
|
saveMarkerloc(feature);
|
||||||
} else { // If this feature is not saved after its location is changed, then send updated coords to server.
|
} 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 {
|
} 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);
|
QV('filesActionsBtn', (meshrights & 72) != 0);
|
||||||
|
|
||||||
// Request the power timeline
|
// 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;
|
if (!panel) panel = 10;
|
||||||
go(panel);
|
go(panel);
|
||||||
@ -2637,10 +2637,10 @@
|
|||||||
var op = Q('d2deviceop').value;
|
var op = Q('d2deviceop').value;
|
||||||
if (op == 100) {
|
if (op == 100) {
|
||||||
// Device wake
|
// Device wake
|
||||||
meshserver.Send({ action: 'wakedevices', nodeids: [ currentNode._id ] });
|
meshserver.send({ action: 'wakedevices', nodeids: [ currentNode._id ] });
|
||||||
} else {
|
} else {
|
||||||
// Power operation
|
// 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
|
// Look to see if we need to update the device timeline
|
||||||
function updateDeviceTimeline() {
|
function updateDeviceTimeline() {
|
||||||
if ((meshserver.State != 2) || (powerTimelineNode == null) || (powerTimelineUpdate == null) || (currentNode == null)) return;
|
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.
|
// Draw device power bars. The bars are 766px wide.
|
||||||
@ -2746,14 +2746,14 @@
|
|||||||
function editDeviceAmtSettingsEx(button, tag) {
|
function editDeviceAmtSettingsEx(button, tag) {
|
||||||
if (button == 2) {
|
if (button == 2) {
|
||||||
// Delete button pressed, remove credentials
|
// 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 {
|
} else {
|
||||||
// Change Intel AMT credentials
|
// Change Intel AMT credentials
|
||||||
var amtuser = Q('dp10username').value;
|
var amtuser = Q('dp10username').value;
|
||||||
if (amtuser == '') amtuser = 'admin';
|
if (amtuser == '') amtuser = 'admin';
|
||||||
var amtpass = Q('dp10password').value;
|
var amtpass = Q('dp10password').value;
|
||||||
if (amtpass == '') amtuser = '';
|
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.user = amtuser;
|
||||||
tag.node.intelamt.tls = Q('dp10tls').value;
|
tag.node.intelamt.tls = Q('dp10tls').value;
|
||||||
if (tag.func) { setTimeout(tag.func, 300); }
|
if (tag.func) { setTimeout(tag.func, 300); }
|
||||||
@ -2773,11 +2773,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function p10showDeleteNodeDialogEx(buttons, nodeid) {
|
function p10showDeleteNodeDialogEx(buttons, nodeid) {
|
||||||
meshserver.Send({ action: 'removedevices', nodeids: [ nodeid ] });
|
meshserver.send({ action: 'removedevices', nodeids: [ nodeid ] });
|
||||||
}
|
}
|
||||||
|
|
||||||
function p10clickOnce(nodeid, protocol, port) {
|
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
|
// Show current location
|
||||||
@ -2831,7 +2831,7 @@
|
|||||||
function p10showNodeNetInfoDialog() {
|
function p10showNodeNetInfoDialog() {
|
||||||
if (xxdialogMode) return;
|
if (xxdialogMode) return;
|
||||||
setDialogMode(2, "Network Interfaces", 1, null, "<div id=d2netinfo>Loading...</div>", 'if' + currentNode._id );
|
setDialogMode(2, "Network Interfaces", 1, null, "<div id=d2netinfo>Loading...</div>", 'if' + currentNode._id );
|
||||||
meshserver.Send({ action: 'getnetworkinfo', nodeid: currentNode._id });
|
meshserver.send({ action: 'getnetworkinfo', nodeid: currentNode._id });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show router dialog
|
// Show router dialog
|
||||||
@ -2888,7 +2888,7 @@
|
|||||||
|
|
||||||
function p10setIcon(icon) {
|
function p10setIcon(icon) {
|
||||||
setDialogMode(0);
|
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'];
|
var showEditNodeValueDialog_modes = ['Device Name', 'Hostname', 'Description'];
|
||||||
@ -2907,7 +2907,7 @@
|
|||||||
function showEditNodeValueDialogEx(button, mode) {
|
function showEditNodeValueDialogEx(button, mode) {
|
||||||
var x = { action: 'changedevice', nodeid: currentNode._id };
|
var x = { action: 'changedevice', nodeid: currentNode._id };
|
||||||
x[showEditNodeValueDialog_modes2[mode]] = Q('dp10devicevalue').value;
|
x[showEditNodeValueDialog_modes2[mode]] = Q('dp10devicevalue').value;
|
||||||
meshserver.Send(x);
|
meshserver.send(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
function p10editdevicevalueValidate(mode, e) {
|
function p10editdevicevalueValidate(mode, e) {
|
||||||
@ -3314,7 +3314,7 @@
|
|||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
p13targetpath = '';
|
p13targetpath = '';
|
||||||
files.Send(JSON.stringify({ action: 'ls', reqid: 1, path: '' }));
|
files.send(JSON.stringify({ action: 'ls', reqid: 1, path: '' }));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3335,7 +3335,7 @@
|
|||||||
if (!files) {
|
if (!files) {
|
||||||
// Setup a mesh agent files
|
// Setup a mesh agent files
|
||||||
files = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotFiles), serverPublicNamePort);
|
files = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotFiles), serverPublicNamePort);
|
||||||
files.attemptWebRTC = false;
|
files.attemptWebRTC = attemptWebRTC;
|
||||||
files.onStateChanged = onFilesStateChange;
|
files.onStateChanged = onFilesStateChange;
|
||||||
files.Start(filesNode._id);
|
files.Start(filesNode._id);
|
||||||
} else {
|
} else {
|
||||||
@ -3351,7 +3351,11 @@
|
|||||||
var p13filetreelocation = [];
|
var p13filetreelocation = [];
|
||||||
|
|
||||||
function p13gotFiles(data) {
|
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);
|
data = JSON.parse(data);
|
||||||
|
if (data.action == 'download') { p13gotDownloadCommand(data); return; }
|
||||||
data.path = data.path.replace(/\//g, "\\");
|
data.path = data.path.replace(/\//g, "\\");
|
||||||
if ((p13filetree != null) && (data.path == p13filetree.path)) {
|
if ((p13filetree != null) && (data.path == p13filetree.path)) {
|
||||||
// This is an update to the same folder
|
// This is an update to the same folder
|
||||||
@ -3450,13 +3454,13 @@
|
|||||||
|
|
||||||
function p13folderset(x) {
|
function p13folderset(x) {
|
||||||
p13targetpath = joinPaths(p13filetree.path, p13filetree.dir[x].n).split('\\').join('/');
|
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) {
|
function p13folderup(x) {
|
||||||
if (x == null) { p13filetreelocation.pop(); } else { while (p13filetreelocation.length > x) { p13filetreelocation.pop(); } }
|
if (x == null) { p13filetreelocation.pop(); } else { while (p13filetreelocation.length > x) { p13filetreelocation.pop(); } }
|
||||||
p13targetpath = p13filetreelocation.join('/');
|
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;
|
var p13sortorder;
|
||||||
@ -3501,11 +3505,11 @@
|
|||||||
function p13getFileCount() { var cc = 0; var checkboxes = document.getElementsByName('fd'); return checkboxes.length; }
|
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 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, '<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% />'); focusTextBox('p13renameinput'); p13fileNameCheck(); }
|
function p13createfolder() { setDialogMode(2, "New Folder", 3, p13createfolderEx, '<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% />'); 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 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, '<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% value="' + renamefile + '" />', { action: 'rename', path: p13filetreelocation.join('/'), oldname: renamefile}); focusTextBox('p13renameinput'); p13fileNameCheck(); }
|
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, '<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% value="' + renamefile + '" />', { 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 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, '<input type=file name=files id=p13uploadinput style=width:100% multiple=multiple onchange="updateUploadDialogOk(\'p13uploadinput\')" />'); updateUploadDialogOk('p13uploadinput'); }
|
function p13uploadFile() { setDialogMode(2, "Upload File", 3, p13uploadFileEx, '<input type=file name=files id=p13uploadinput style=width:100% multiple=multiple onchange="updateUploadDialogOk(\'p13uploadinput\')" />'); updateUploadDialogOk('p13uploadinput'); }
|
||||||
function p13uploadFileEx() { p13doUploadFiles(Q('p13uploadinput').files); }
|
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.
|
// Called by the html page to start a download, arguments are: path, file name and file size.
|
||||||
function p13downloadfile(x, y, z) {
|
function p13downloadfile(x, y, z) {
|
||||||
downloadFile = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotDownloadData), serverPublicNamePort); // Create our file transport
|
if (xxdialogMode || downloadFile || !files) return;
|
||||||
downloadFile.attemptWebRTC = false;
|
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, '<div>' + downloadFile.file + '</div><br /><progress id=d2progressBar style=width:100% value=0 max=' + z + ' />');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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.onStateChanged = onFileDownloadStateChange;
|
||||||
downloadFile.xpath = decodeURIComponent(x);
|
downloadFile.xpath = decodeURIComponent(x);
|
||||||
downloadFile.xfile = decodeURIComponent(y);
|
downloadFile.xfile = decodeURIComponent(y);
|
||||||
@ -3573,7 +3611,7 @@
|
|||||||
if ((downloadFile != null) && (downloadFile.xstate == 1)) { saveAs(data2blob(downloadFile.xdata), downloadFile.xfile); } // Save the file
|
if ((downloadFile != null) && (downloadFile.xstate == 1)) { saveAs(data2blob(downloadFile.xdata), downloadFile.xfile); } // Save the file
|
||||||
break;
|
break;
|
||||||
case 3: // Transport as connected, send a command to indicate we want to start a file download
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3585,7 +3623,7 @@
|
|||||||
if (cmd.action == 'downloadstart') { // Yes, the file is about to start
|
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.xstate = 1; // Switch to state 1, we will start receiving the file data
|
||||||
downloadFile.xdata = ''; // Start with empty 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
|
} else if (cmd.action == 'downloaderror') { // Problem opening this file, cancel
|
||||||
p13downloadFileCancel();
|
p13downloadFileCancel();
|
||||||
}
|
}
|
||||||
@ -3593,9 +3631,10 @@
|
|||||||
downloadFile.xtsize += (data.length); // Add to the total bytes received
|
downloadFile.xtsize += (data.length); // Add to the total bytes received
|
||||||
downloadFile.xdata += data; // Append the data
|
downloadFile.xdata += data; // Append the data
|
||||||
Q('d2progressBar').value = downloadFile.xtsize; // Change the progress bar
|
Q('d2progressBar').value = downloadFile.xtsize; // Change the progress bar
|
||||||
downloadFile.Send('a'); // Send the ACK
|
downloadFile.send('a'); // Send the ACK
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
//
|
//
|
||||||
// FILES UPLOAD
|
// FILES UPLOAD
|
||||||
@ -3603,6 +3642,7 @@
|
|||||||
|
|
||||||
var uploadFile;
|
var uploadFile;
|
||||||
function p13doUploadFiles(files) {
|
function p13doUploadFiles(files) {
|
||||||
|
if (xxdialogMode) return;
|
||||||
uploadFile = {};
|
uploadFile = {};
|
||||||
uploadFile.xpath = p13filetreelocation.join('/');
|
uploadFile.xpath = p13filetreelocation.join('/');
|
||||||
uploadFile.xfiles = files;
|
uploadFile.xfiles = files;
|
||||||
@ -3626,6 +3666,7 @@
|
|||||||
function p13uploadReconnect() {
|
function p13uploadReconnect() {
|
||||||
uploadFile.ws = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotUploadData), serverPublicNamePort);
|
uploadFile.ws = CreateAgentRedirect(meshserver, CreateRemoteFiles(p13gotUploadData), serverPublicNamePort);
|
||||||
uploadFile.ws.attemptWebRTC = false;
|
uploadFile.ws.attemptWebRTC = false;
|
||||||
|
uploadFile.ws.ctrlMsgAllowed = false;
|
||||||
uploadFile.ws.onStateChanged = onFileUploadStateChange;
|
uploadFile.ws.onStateChanged = onFileUploadStateChange;
|
||||||
uploadFile.ws.Start(filesNode._id);
|
uploadFile.ws.Start(filesNode._id);
|
||||||
}
|
}
|
||||||
@ -3643,7 +3684,7 @@
|
|||||||
uploadFile.xreader = new FileReader();
|
uploadFile.xreader = new FileReader();
|
||||||
uploadFile.xreader.onload = function() {
|
uploadFile.xreader.onload = function() {
|
||||||
uploadFile.xdata = uploadFile.xreader.result;
|
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);
|
uploadFile.xreader.readAsArrayBuffer(file);
|
||||||
} else {
|
} else {
|
||||||
@ -3689,7 +3730,7 @@
|
|||||||
if (uploadFile.xfiles.length > uploadFile.xfilePtr + 1) { p13uploadReconnect(); } else { p13uploadFileCancel(); }
|
if (uploadFile.xfiles.length > uploadFile.xfilePtr + 1) { p13uploadReconnect(); } else { p13uploadFileCancel(); }
|
||||||
} else {
|
} else {
|
||||||
var datapart = data.slice(start, end);
|
var datapart = data.slice(start, end);
|
||||||
uploadFile.ws.Send(datapart);
|
uploadFile.ws.send(datapart);
|
||||||
uploadFile.xptr = end;
|
uploadFile.xptr = end;
|
||||||
Q('d2progressBar').value = end;
|
Q('d2progressBar').value = end;
|
||||||
}
|
}
|
||||||
@ -3777,7 +3818,7 @@
|
|||||||
Q('p15consoleText').value = '';
|
Q('p15consoleText').value = '';
|
||||||
|
|
||||||
// Send the command to the mesh agent
|
// 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
|
// Add command to history list
|
||||||
if (v.length > 0) {
|
if (v.length > 0) {
|
||||||
@ -3802,8 +3843,8 @@
|
|||||||
// Called then user presses the "Change Core" button
|
// Called then user presses the "Change Core" button
|
||||||
function p15uploadCore(e) {
|
function p15uploadCore(e) {
|
||||||
if (xxdialogMode) return;
|
if (xxdialogMode) return;
|
||||||
if (e.shiftKey == true) { meshserver.Send({ action: 'uploadagentcore', nodeid: consoleNode._id, path:'*' }); } // Upload default 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.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 if (e.ctrlKey == true) { p15uploadCore2(); } // Upload the core from a file
|
||||||
else { setDialogMode(2, "Change Mesh Agent Core", 3, p15uploadCoreEx, '<select id=d3coreMode style=float:right;width:260px><option value=1>Upload default server core</option><option value=2>Clear the core</option><option value=3>Upload a core file</option><option value=4>Soft disconnect agent</option><option value=5>Hard disconnect agent</option></select><div>Change Core</div>'); }
|
else { setDialogMode(2, "Change Mesh Agent Core", 3, p15uploadCoreEx, '<select id=d3coreMode style=float:right;width:260px><option value=1>Upload default server core</option><option value=2>Clear the core</option><option value=3>Upload a core file</option><option value=4>Soft disconnect agent</option><option value=5>Hard disconnect agent</option></select><div>Change Core</div>'); }
|
||||||
}
|
}
|
||||||
@ -3811,19 +3852,19 @@
|
|||||||
function p15uploadCoreEx() {
|
function p15uploadCoreEx() {
|
||||||
if (Q('d3coreMode').value == 1) {
|
if (Q('d3coreMode').value == 1) {
|
||||||
// Upload default core
|
// 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) {
|
} else if (Q('d3coreMode').value == 2) {
|
||||||
// Clear the core
|
// Clear the core
|
||||||
meshserver.Send({ action: 'uploadagentcore', nodeid: consoleNode._id });
|
meshserver.send({ action: 'uploadagentcore', nodeid: consoleNode._id });
|
||||||
} else if (Q('d3coreMode').value == 3) {
|
} else if (Q('d3coreMode').value == 3) {
|
||||||
// Upload file as core
|
// Upload file as core
|
||||||
p15uploadCore2();
|
p15uploadCore2();
|
||||||
} else if (Q('d3coreMode').value == 4) {
|
} else if (Q('d3coreMode').value == 4) {
|
||||||
// Soft disconnect the mesh agent
|
// 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) {
|
} else if (Q('d3coreMode').value == 5) {
|
||||||
// Hard disconnect the mesh agent
|
// 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 {
|
} else {
|
||||||
// Upload server mesh agent code
|
// Upload server mesh agent code
|
||||||
var files = d3getFileSel();
|
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() {
|
function account_showVerifyEmailEx() {
|
||||||
meshserver.Send({ action: 'verifyemail', email: userinfo.email });
|
meshserver.send({ action: 'verifyemail', email: userinfo.email });
|
||||||
}
|
}
|
||||||
|
|
||||||
function account_showChangeEmail() {
|
function account_showChangeEmail() {
|
||||||
@ -3880,7 +3921,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function account_changeEmail() {
|
function account_changeEmail() {
|
||||||
meshserver.Send({ action: 'changeemail', email: Q('dp2email').value });
|
meshserver.send({ action: 'changeemail', email: Q('dp2email').value });
|
||||||
}
|
}
|
||||||
|
|
||||||
function account_showDeleteAccount() {
|
function account_showDeleteAccount() {
|
||||||
@ -3933,7 +3974,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function account_createMeshEx(button, tag) {
|
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() {
|
function account_validateDeleteAccount() {
|
||||||
@ -4004,11 +4045,11 @@
|
|||||||
function server_showVersionDlg() {
|
function server_showVersionDlg() {
|
||||||
if (xxdialogMode) return;
|
if (xxdialogMode) return;
|
||||||
setDialogMode(2, "MeshCentral Version", 1, null, "Loading...", 'MeshCentralServerUpdate');
|
setDialogMode(2, "MeshCentral Version", 1, null, "Loading...", 'MeshCentralServerUpdate');
|
||||||
meshserver.Send({ action: 'serverversion' });
|
meshserver.send({ action: 'serverversion' });
|
||||||
}
|
}
|
||||||
|
|
||||||
function server_showVersionDlgEx() {
|
function server_showVersionDlgEx() {
|
||||||
meshserver.Send({ action: 'serverupdate' });
|
meshserver.send({ action: 'serverupdate' });
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -4091,7 +4132,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function p20showDeleteMeshDialogEx(buttons, tag) {
|
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) {
|
function p20editmesh(focus) {
|
||||||
@ -4107,7 +4148,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function p20editmeshEx() {
|
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() {
|
function p20editmeshValidate() {
|
||||||
@ -4157,7 +4198,7 @@
|
|||||||
if (Q('p20meshserverfiles').checked == true) meshadmin += 32;
|
if (Q('p20meshserverfiles').checked == true) meshadmin += 32;
|
||||||
if (Q('p20wakedevices').checked == true) meshadmin += 64;
|
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) {
|
function p20viewuser(userid) {
|
||||||
@ -4193,7 +4234,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function p20viewuserEx2(button, userid) {
|
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 p5folderup(x) { if (x == null) { filetreelocation.pop(); } else { while (filetreelocation.length > x) { filetreelocation.pop(); } } updateFiles(); }
|
||||||
function p5folderset(x) { filetreelocation.push(decodeURIComponent(x)); updateFiles(); }
|
function p5folderset(x) { filetreelocation.push(decodeURIComponent(x)); updateFiles(); }
|
||||||
function p5createfolder() { setDialogMode(2, "New Folder", 3, p5createfolderEx, '<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% />'); focusTextBox('p5renameinput'); p5fileNameCheck(); }
|
function p5createfolder() { setDialogMode(2, "New Folder", 3, p5createfolderEx, '<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% />'); 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 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, '<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% value="' + renamefile + '" />', { action: 'fileoperation', fileop: 'rename', path: filetreelocation, oldname: renamefile}); focusTextBox('p5renameinput'); p5fileNameCheck(); }
|
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, '<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% value="' + renamefile + '" />', { 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); } }
|
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] != '.'); } })();
|
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, '<form method=post enctype=multipart/form-data action=uploadfile.ashx target=fileUploadFrame><input type=text name=link style=display:none id=p5uploadpath value=\"' + encodeURIComponent(filetreelinkpath) + '\" /><input type=file name=files id=p5uploadinput style=width:100% multiple=multiple onchange="updateUploadDialogOk(\'p5uploadinput\')" /><input type=submit id=p5loginSubmit style=display:none /></form>'); updateUploadDialogOk('p5uploadinput'); }
|
function p5uploadFile() { setDialogMode(2, "Upload File", 3, p5uploadFileEx, '<form method=post enctype=multipart/form-data action=uploadfile.ashx target=fileUploadFrame><input type=text name=link style=display:none id=p5uploadpath value=\"' + encodeURIComponent(filetreelinkpath) + '\" /><input type=file name=files id=p5uploadinput style=width:100% multiple=multiple onchange="updateUploadDialogOk(\'p5uploadinput\')" /><input type=submit id=p5loginSubmit style=display:none /></form>'); updateUploadDialogOk('p5uploadinput'); }
|
||||||
@ -4439,11 +4480,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function showDeleteAllEventsDialogEx(buttons, tag) {
|
function showDeleteAllEventsDialogEx(buttons, tag) {
|
||||||
meshserver.Send({ action: 'clearevents' });
|
meshserver.send({ action: 'clearevents' });
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshEvents() {
|
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) {
|
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() {
|
function showCreateNewAccountDialog() {
|
||||||
@ -4526,7 +4567,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function showCreateNewAccountDialogEx() {
|
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) {
|
function showUserAdminDialog(e, userid) {
|
||||||
@ -4583,7 +4624,7 @@
|
|||||||
}
|
}
|
||||||
var x = { action: 'edituser', name: user.name, siteadmin: siteadmin };
|
var x = { action: 'edituser', name: user.name, siteadmin: siteadmin };
|
||||||
if (isNaN(quota) == false) { x.quota = (quota * 1024); }
|
if (isNaN(quota) == false) { x.quota = (quota * 1024); }
|
||||||
meshserver.Send(x);
|
meshserver.send(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user