From 5ecc909f6fec1febbaae61b6de758804e882dd30 Mon Sep 17 00:00:00 2001 From: atrovato <1839717+atrovato@users.noreply.github.com> Date: Sun, 14 May 2023 15:12:17 +0200 Subject: [PATCH] Filter unique MAC --- .../lan-manager/lib/lan-manager.scan.js | 10 ++++- .../lan-manager/lib/lan-manager.scan.test.js | 42 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/server/services/lan-manager/lib/lan-manager.scan.js b/server/services/lan-manager/lib/lan-manager.scan.js index 036e49156d..1e7c6286b1 100644 --- a/server/services/lan-manager/lib/lan-manager.scan.js +++ b/server/services/lan-manager/lib/lan-manager.scan.js @@ -33,7 +33,15 @@ async function scan() { let deviceChanged = false; if (nbDevices > 0) { deviceChanged = this.discoveredDevices.length !== nbDevices; - this.discoveredDevices = discoveredDevices; + // Filter unique MAC + const filteredDevices = {}; + discoveredDevices.forEach((device) => { + const { mac } = device; + if (mac && mac.length > 0) { + filteredDevices[mac] = device; + } + }); + this.discoveredDevices = Object.values(filteredDevices); } this.scanning = false; diff --git a/server/test/services/lan-manager/lib/lan-manager.scan.test.js b/server/test/services/lan-manager/lib/lan-manager.scan.test.js index 01370a91be..32b8ec9584 100644 --- a/server/test/services/lan-manager/lib/lan-manager.scan.test.js +++ b/server/test/services/lan-manager/lib/lan-manager.scan.test.js @@ -46,6 +46,48 @@ describe('LANManager scan', () => { expect(manager.scanning).to.equal(false); expect(result).deep.equal([{ device: '2', mac: 'mac' }]); + expect(manager.discoveredDevices).deep.equal([{ device: '2', mac: 'mac' }]); + + assert.calledWithNew(NmapScan); + assert.calledTwice(gladys.event.emit); + assert.calledWithExactly(gladys.event.emit, EVENTS.WEBSOCKET.SEND_ALL, { + type: WEBSOCKET_MESSAGE_TYPES.LAN.SCANNING, + payload: { + scanning: true, + configured: true, + }, + }); + assert.calledWithExactly(gladys.event.emit, EVENTS.WEBSOCKET.SEND_ALL, { + type: WEBSOCKET_MESSAGE_TYPES.LAN.SCANNING, + payload: { + scanning: false, + configured: true, + deviceChanged: true, + success: true, + }, + }); + }); + + it('scan devices dupe found', async () => { + manager.configured = true; + manager.ipMasks = [ + { mask: '255.255.255.248/29', enabled: true }, + { mask: '192.168.0.1/10', enabled: false }, + ]; + + NmapScan.prototype.on.onCall(1).yieldsRight([ + { device: '1', mac: 'mac' }, + { device: '2', mac: 'mac' }, + ]); + + const result = await manager.scan(); + + expect(manager.scanning).to.equal(false); + expect(result).deep.equal([ + { device: '1', mac: 'mac' }, + { device: '2', mac: 'mac' }, + ]); + expect(manager.discoveredDevices).deep.equal([{ device: '2', mac: 'mac' }]); assert.calledWithNew(NmapScan); assert.calledTwice(gladys.event.emit);