From 0866459b232e2c3f4faf3b8c78943c48a784ad36 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 8 Jun 2026 20:31:37 +1000 Subject: [PATCH] feat(devices): map MACs to LAN devices; identify Orbi satellite + Galaxy Tab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ARP/nmap rescan (2026-06-08) attaches real MACs to the devices band and shows them in the UI. Reclassifies two flagged "unknowns": .13 = Orbi mesh satellite (BC:A5:11:.. Netgear; the uhttpd UI made it look like a rogue OpenWrt box) → Network; .171 = Galaxy Tab S4 (randomized MAC) → Personal. Remaining flags are .15 (ASUSTek, needs ID) and .34/.35/.51 (offline). Co-Authored-By: Claude Opus 4.8 --- public/devices.json | 44 ++++++++++++++++++------------------ public/style.css | 1 + public/views/devices_band.js | 1 + 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/public/devices.json b/public/devices.json index da10e3f..c34fa08 100644 --- a/public/devices.json +++ b/public/devices.json @@ -1,38 +1,38 @@ { - "note": "Auto-scanned LAN devices (ARP/nmap 2026-06-02). Separate from Little Blue's homelab services. Vendor-guessed; identification + live discovery to come.", + "note": "LAN devices — ARP/nmap rescan 2026-06-08 with MACs mapped. Separate from Little Blue's homelab services (Proxmox BC:24:11:* guests, tracked in the infra inventory). Locally-administered / randomized MACs (2nd hex digit 2/6/A/E) can't be OUI-identified and are labelled by hand.", "groups": [ { "name": "Smart Home", "devices": [ - { "name": "Amazon Echo", "ip": "192.168.1.3", "vendor": "Amazon" }, - { "name": "Amazon Echo", "ip": "192.168.1.4", "vendor": "Amazon" }, - { "name": "Smart device", "ip": "192.168.1.6", "vendor": "Beken" }, - { "name": "Smart device", "ip": "192.168.1.23", "vendor": "Tuya" }, - { "name": "Xiaomi device", "ip": "192.168.1.20", "vendor": "Xiaomi" } + { "name": "Amazon Echo", "ip": "192.168.1.3", "mac": "48:43:DD:FC:2F:84", "vendor": "Amazon" }, + { "name": "Amazon Echo", "ip": "192.168.1.4", "mac": "14:0A:C5:6D:15:6E", "vendor": "Amazon" }, + { "name": "Smart device", "ip": "192.168.1.6", "mac": "C8:47:8C:01:17:70", "vendor": "Beken" }, + { "name": "Smart device", "ip": "192.168.1.23", "mac": "D4:A6:51:12:36:92", "vendor": "Tuya" }, + { "name": "Xiaomi device", "ip": "192.168.1.20", "mac": "EC:4D:3E:36:EF:E1", "vendor": "Xiaomi" } ]}, { "name": "Entertainment", "devices": [ - { "name": "Google / Nest", "ip": "192.168.1.12", "vendor": "Google" }, - { "name": "Google / Nest", "ip": "192.168.1.14", "vendor": "Google" }, - { "name": "Google / Nest", "ip": "192.168.1.18", "vendor": "Google" }, + { "name": "Google / Nest", "ip": "192.168.1.12", "mac": "1C:53:F9:BB:32:24", "vendor": "Google" }, + { "name": "Google / Nest", "ip": "192.168.1.14", "mac": "D4:F5:47:95:33:93", "vendor": "Google" }, + { "name": "Google / Nest", "ip": "192.168.1.18", "mac": "EC:4D:3E:37:38:8F", "vendor": "Google", "note": "MAC OUI is Xiaomi — label may be wrong" }, { "name": "Google / Nest", "ip": "192.168.1.21", "vendor": "Google" }, { "name": "Google / Nest", "ip": "192.168.1.22", "vendor": "Google" }, - { "name": "Cambridge Audio", "ip": "192.168.1.29", "vendor": "StreamMagic" }, - { "name": "Apple TV / HomePod", "ip": "192.168.1.43", "vendor": "Apple" }, - { "name": "Samsung TV", "ip": "192.168.1.24", "vendor": "Samsung" } + { "name": "Cambridge Audio", "ip": "192.168.1.29", "mac": "48:70:1E:01:4F:7B", "vendor": "StreamMagic" }, + { "name": "Apple TV / HomePod", "ip": "192.168.1.43", "mac": "08:66:98:B9:CF:F2", "vendor": "Apple" }, + { "name": "Samsung TV", "ip": "192.168.1.24", "mac": "1C:86:9A:4C:F0:EC", "vendor": "Samsung" } ]}, { "name": "Personal", "devices": [ - { "name": "Apple device", "ip": "192.168.1.133", "vendor": "Apple" }, - { "name": "Samsung device", "ip": "192.168.1.61", "vendor": "Samsung" }, - { "name": "TP-Link device", "ip": "192.168.1.10", "vendor": "TP-Link" } + { "name": "Galaxy Tab S4", "ip": "192.168.1.171", "mac": "5A:DA:61:7A:0F:12", "vendor": "Samsung (randomized MAC)" }, + { "name": "Apple device", "ip": "192.168.1.133", "mac": "1C:57:DC:70:E8:2D", "vendor": "Apple" }, + { "name": "Samsung device", "ip": "192.168.1.61", "mac": "A0:D0:5B:04:70:96", "vendor": "Samsung" }, + { "name": "TP-Link device", "ip": "192.168.1.10", "mac": "14:EB:B6:40:7E:93", "vendor": "TP-Link" } ]}, { "name": "Network", "devices": [ - { "name": "Gateway / Router", "ip": "192.168.1.1", "vendor": "Netgear" } + { "name": "Gateway / Router", "ip": "192.168.1.1", "mac": "44:A5:6E:68:D0:E9", "vendor": "Netgear" }, + { "name": "Orbi Satellite", "ip": "192.168.1.13", "mac": "BC:A5:11:3E:06:88", "vendor": "Netgear (Orbi mesh)" } ]}, { "name": "Flagged / Unknown", "devices": [ - { "name": "Rogue OpenWrt", "ip": "192.168.1.13", "vendor": "Netgear · uhttpd", "flag": true }, - { "name": "ASUS device", "ip": "192.168.1.15", "vendor": "ASUSTek", "flag": true }, - { "name": "Unknown", "ip": "192.168.1.34", "vendor": "randomized MAC", "flag": true }, - { "name": "Unknown", "ip": "192.168.1.35", "vendor": "unknown", "flag": true }, - { "name": "Unknown", "ip": "192.168.1.51", "vendor": "randomized MAC", "flag": true }, - { "name": "Unknown", "ip": "192.168.1.171", "vendor": "randomized MAC", "flag": true } + { "name": "ASUS device", "ip": "192.168.1.15", "mac": "24:4B:FE:8E:09:A4", "vendor": "ASUSTek", "flag": true }, + { "name": "Unknown", "ip": "192.168.1.34", "vendor": "randomized MAC · offline", "flag": true }, + { "name": "Unknown", "ip": "192.168.1.35", "vendor": "unknown · offline", "flag": true }, + { "name": "Unknown", "ip": "192.168.1.51", "vendor": "randomized MAC · offline", "flag": true } ]} ] } diff --git a/public/style.css b/public/style.css index 68a2d37..6b6c60f 100644 --- a/public/style.css +++ b/public/style.css @@ -562,6 +562,7 @@ body.drawer-open #scrim { opacity: 1; pointer-events: auto; } } .dv-tile .dv-nm { font-family: var(--font-ui); font-size: 13px; color: var(--text); } .dv-tile .dv-ip { font-family: var(--font-mono); font-size: 12px; color: var(--muted); } +.dv-tile .dv-mac { font-family: var(--font-mono); font-size: 10px; color: var(--muted); opacity: .6; letter-spacing: .02em; } .dv-tile .dv-vendor { font-family: var(--font-ui); font-size: 11px; color: var(--muted); opacity: .7; } .dv-tile.flag { border-color: var(--bad); background: #1a1012; } .dv-tile.flag .dv-nm { color: var(--bad); } diff --git a/public/views/devices_band.js b/public/views/devices_band.js index 15e9213..6a046cf 100644 --- a/public/views/devices_band.js +++ b/public/views/devices_band.js @@ -20,6 +20,7 @@ async function load() { el('div', { class: 'dv-tile' + (d.flag ? ' flag' : '') }, el('span', { class: 'dv-nm' }, d.name), el('span', { class: 'dv-ip' }, d.ip), + d.mac ? el('span', { class: 'dv-mac' }, d.mac) : null, el('span', { class: 'dv-vendor' }, d.vendor || '')))))); mount(host, el('div', { class: 'dv-hd' },