Improved server wake-on-lan.

Ylian Saint-Hilaire committed Oct 28, 2020 at 12:52 UTC 341c6e72b265acd7b1e781d974c5f9af5b270f3e
2 files changed +23 -16
meshscanner.js
+22 -15
@@ -89,14 +89,14 @@ module.exports.CreateMeshScanner = function (parent) {
89 server4.xxclear = false;
90 server4.xxtype = 4;
91 server4.xxlocal = localAddress;
92 - server4.on('error', function (err) { if (this.xxlocal == '*') { console.log("ERROR: Server port 16989 not available, check if server is running twice."); } this.close(); delete obj.servers6[this.xxlocal]; });
92 + server4.on('error', function (err) { /*if (this.xxlocal == '*') { console.log("ERROR: Server port 16989 not available, check if server is running twice."); } this.close(); delete obj.servers6[this.xxlocal];*/ });
93 bindOptions = { port: 16989, exclusive: true };
94 if (server4.xxlocal != '*') { bindOptions.address = server4.xxlocal; }
95 server4.bind(bindOptions, function () {
96 try {
97 var doscan = true;
98 try { this.setBroadcast(true); this.setMulticastTTL(128); this.addMembership(membershipIPv4, this.xxlocal); } catch (e) { doscan = false; }
99 - this.on('error', function (error) { console.log('Error: ' + error); });
99 + this.on('error', function (error) { /*console.log('Error: ' + error);*/ });
100 this.on('message', function (msg, info) { onUdpPacket(msg, info, this); });
101 if (doscan == true) { obj.performScan(this); obj.performScan(this); }
102 } catch (e) { console.log(e); }
@@ -120,7 +120,7 @@ module.exports.CreateMeshScanner = function (parent) {
120 server6.xxclear = false;
121 server6.xxtype = 6;
122 server6.xxlocal = localAddress;
123 - server6.on('error', function (err) { this.close(); delete obj.servers6[this.xxlocal]; });
123 + server6.on('error', function (err) { /*this.close(); delete obj.servers6[this.xxlocal];*/ });
124 bindOptions = { port: 16989, exclusive: true };
125 if (server6.xxlocal != '*') { bindOptions.address = server6.xxlocal; }
126 server6.bind(bindOptions, function () {
@@ -228,7 +228,7 @@ module.exports.CreateMeshScanner = function (parent) {
228 }
229
230 // As a side job, we also send server wake-on-lan packets
231 - obj.wakeOnLan = function (macs) {
231 + obj.wakeOnLan = function (macs, host) {
232 var i, j;
233 for (i in macs) {
234 var mac = macs[i].split(':').join('');
@@ -237,17 +237,24 @@ module.exports.CreateMeshScanner = function (parent) {
237 var wakepacket = Buffer.from(hexpacket, 'hex');
238 //console.log(wakepacket.toString('hex'));
239
240 - // Send the wake packet 3 times with small time intervals
241 - for (j in obj.servers4) { obj.servers4[j].send(wakepacket, 0, wakepacket.length, 7, "255.255.255.255"); obj.servers4[j].send(wakepacket, 0, wakepacket.length, 16990, membershipIPv4); }
242 - for (j in obj.servers6) { obj.servers6[j].send(wakepacket, 0, wakepacket.length, 16990, membershipIPv6); }
243 - setTimeout(function () {
244 - for (j in obj.servers4) { obj.servers4[j].send(wakepacket, 0, wakepacket.length, 7, "255.255.255.255"); obj.servers4[j].send(wakepacket, 0, wakepacket.length, 16990, membershipIPv4); }
245 - for (j in obj.servers6) { obj.servers6[j].send(wakepacket, 0, wakepacket.length, 16990, membershipIPv6); }
246 - }, 200);
247 - setTimeout(function () {
248 - for (j in obj.servers4) { obj.servers4[j].send(wakepacket, 0, wakepacket.length, 7, "255.255.255.255"); obj.servers4[j].send(wakepacket, 0, wakepacket.length, 16990, membershipIPv4); }
249 - for (j in obj.servers6) { obj.servers6[j].send(wakepacket, 0, wakepacket.length, 16990, membershipIPv6); }
250 - }, 500);
240 + // Setup the wake function
241 + const func = function wakeFunc() {
242 + for (j in obj.servers4) {
243 + obj.servers4[j].send(wakeFunc.wakepacket, 0, wakeFunc.wakepacket.length, 7, '255.255.255.255');
244 + obj.servers4[j].send(wakeFunc.wakepacket, 0, wakeFunc.wakepacket.length, 16990, membershipIPv4);
245 + if (wakeFunc.host != null) { obj.servers4[j].send(wakeFunc.wakepacket, 0, wakeFunc.wakepacket.length, 7, wakeFunc.host); }
246 + }
247 + for (j in obj.servers6) {
248 + obj.servers6[j].send(wakeFunc.wakepacket, 0, wakeFunc.wakepacket.length, 16990, membershipIPv6);
249 + }
250 + }
251 + func.wakepacket = wakepacket;
252 + func.host = host;
253 +
254 + // Call the wake function 3 times with small time intervals
255 + func();
256 + setTimeout(func, 200);
257 + setTimeout(func, 500);
258 }
259 };
260
meshuser.js
+1 -1
@@ -3594,7 +3594,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
3594 if (macs.length == 0) return;
3595
3596 // Have the server send a wake-on-lan packet (Will not work in WAN-only)
3597 - if (parent.parent.meshScanner != null) { parent.parent.meshScanner.wakeOnLan(macs); }
3597 + if (parent.parent.meshScanner != null) { parent.parent.meshScanner.wakeOnLan(macs, node.host); }
3598
3599 // Get the list of device groups this user as wake permissions on
3600 var targets = [], targetDeviceGroups = parent.GetAllMeshWithRights(user, MESHRIGHT_WAKEDEVICE);