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);