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 }