Updated wakeonlan logic
Bryan Roe committed
Apr 24, 2021 at 10:20 UTC
34d7f00226a8b6396d3a28c4f8656d1b6c4b0b4d
1 file changed
+60
-22
agents/meshcore.js
+60
-22
@@ -745,38 +745,76 @@ function getServerTargetUrlEx(url) {
745
return url;
746
}
747
748
-// Send a wake-on-lan packet
749
-function sendWakeOnLan(hexMac) {
750
- hexMac = hexMac.split(':').join('');
751
- var count = 0;
752
- try {
753
- var interfaces = require('os').networkInterfaces();
754
- var magic = 'FFFFFFFFFFFF';
755
- for (var x = 1; x <= 16; ++x) { magic += hexMac; }
756
- var magicbin = Buffer.from(magic, 'hex');
748
+function sendWakeOnLanEx_interval()
749
+{
750
+ var t = require('MeshAgent').wakesockets;
751
+ if (t.list.length == 0)
752
+ {
753
+ clearInterval(t);
754
+ require('MeshAgent').wakesockets = null;
755
+ return;
756
+ }
757
+
758
+ var mac = t.list.shift().split(':').join('')
759
+ var magic = 'FFFFFFFFFFFF';
760
+ for (var x = 1; x <= 16; ++x) { magic += mac; }
761
+ var magicbin = Buffer.from(magic, 'hex');
762
758
- for (var adapter in interfaces) {
759
- if (interfaces.hasOwnProperty(adapter)) {
760
- for (var i = 0; i < interfaces[adapter].length; ++i) {
763
+ for(var i in t.sockets)
764
+ {
765
+ t.sockets[i].send(magicbin, 7, '255.255.255.255');
766
+ //sendConsoleText('Sending wake packet on ' + JSON.stringify(t.sockets[i].address()));
767
+ }
768
+}
769
+function sendWakeOnLanEx(hexMacList)
770
+{
771
+ var ret = 0;
772
+
773
+ if (require('MeshAgent').wakesockets == null)
774
+ {
775
+ // Create a new interval timer
776
+ require('MeshAgent').wakesockets = setInterval(sendWakeOnLanEx_interval, 10);
777
+ require('MeshAgent').wakesockets.sockets = [];
778
+ require('MeshAgent').wakesockets.list = hexMacList;
779
+
780
+ var interfaces = require('os').networkInterfaces();
781
+ for (var adapter in interfaces)
782
+ {
783
+ if (interfaces.hasOwnProperty(adapter))
784
+ {
785
+ for (var i = 0; i < interfaces[adapter].length; ++i)
786
+ {
787
var addr = interfaces[adapter][i];
762
- if ((addr.family == 'IPv4') && (addr.mac != '00:00:00:00:00:00')) {
763
- try {
788
+ if ((addr.family == 'IPv4') && (addr.mac != '00:00:00:00:00:00'))
789
+ {
790
+ try
791
+ {
792
var socket = require('dgram').createSocket({ type: 'udp4' });
793
socket.bind({ address: addr.address });
794
socket.setBroadcast(true);
795
socket.setMulticastInterface(addr.address);
796
socket.setMulticastTTL(1);
769
- socket.send(magicbin, 7, '255.255.255.255');
770
- socket.descriptorMetadata = 'WoL (' + addr.address + ' => ' + hexMac + ')';
771
- count++;
797
+ socket.descriptorMetadata = 'WoL (' + addr.address + ')';
798
+ require('MeshAgent').wakesockets.sockets.push(socket);
799
+ ++ret;
800
}
801
catch (e) { }
802
}
803
}
804
}
805
}
778
- } catch (e) { }
779
- return count;
806
+ }
807
+ else
808
+ {
809
+ // Append to an existing interval timer
810
+ for(var i in hexMacList)
811
+ {
812
+ require('MeshAgent').wakesockets.list.push(hexMacList[i]);
813
+ }
814
+ ret = require('MeshAgent').wakesockets.sockets.length;
815
+ }
816
+
817
+ return (ret);
818
}
819
820
// Handle a mesh agent command
@@ -1079,7 +1117,7 @@ function handleServerCommand(data) {
1117
case 'wakeonlan': {
1118
// Send wake-on-lan on all interfaces for all MAC addresses in data.macs array. The array is a list of HEX MAC addresses.
1119
//sendConsoleText("Server requesting wake-on-lan for: " + data.macs.join(', '));
1082
- for (var i in data.macs) { sendWakeOnLan(data.macs[i]); }
1120
+ sendWakeOnLanEx(data.macs);
1121
break;
1122
}
1123
case 'runcommands': {
@@ -3733,8 +3771,8 @@ function processConsoleCommand(cmd, args, rights, sessionid) {
3771
if ((args['_'].length != 1) || (args['_'][0].length != 12)) {
3772
response = 'Proper usage: wakeonlan [mac], for example "wakeonlan 010203040506".';
3773
} else {
3736
- var count = sendWakeOnLan(args['_'][0]);
3737
- response = 'Sent wake-on-lan on ' + count + ' interface(s).';
3774
+ var count = sendWakeOnLanEx([args['_'][0]]);
3775
+ response = 'Sending wake-on-lan on ' + count + ' interface(s).';
3776
}
3777
break;
3778
}