diff --git a/lib/jobs/workers/discover.js b/lib/jobs/workers/discover.js index d300091..3145b43 100644 --- a/lib/jobs/workers/discover.js +++ b/lib/jobs/workers/discover.js @@ -1,9 +1,18 @@ import net from 'node:net'; import * as services from '../../db/repos/monitored_services.js'; +import * as devices from '../../db/repos/lan_devices.js'; import { log } from '../../log.js'; export const NAME = 'discover.lan'; +// Well-known homelab ports → likely service, so candidates get a real name. +const PORT_SVC = { + 2424: 'Void', 5055: 'Overseerr', 6767: 'Bazarr', 7878: 'Radarr', 8006: 'Proxmox VE', + 8096: 'Jellyfin', 8123: 'Home Assistant', 8265: 'Tdarr', 8384: 'Syncthing', 8989: 'Sonarr', + 9000: 'Portainer', 9090: 'Cockpit', 9696: 'Prowlarr', 11434: 'Ollama', 19999: 'Netdata', + 32400: 'Plex' +}; + // Common homelab web/service ports to probe. const PORTS = [80, 81, 443, 2424, 3000, 3001, 5000, 5055, 6767, 6875, 7878, 8000, 8006, 8080, 8081, 8096, 8123, 8265, 8384, 8443, 8989, 9000, 9090, 9696, 11434, 19999, 32400, 60072]; @@ -55,13 +64,18 @@ export async function handler(job) { // 1) TCP sweep → live host:ports const open = (await mapPool(targets, 120, async (t) => (await _tcp(t.host, t.port)) ? t : null)).filter(Boolean); - // 2) HTTP-probe each, build + upsert discovered candidates (no-clobber in the repo) + // 2) HTTP-probe each, build + upsert discovered candidates (no-clobber in the repo). + // Cross-reference the Network Devices band so candidates are named by service+device. + const deviceByIp = Object.fromEntries( + (await devices.listKnown()).filter(d => d.ip).map(d => [d.ip, d.name])); let added = 0; for (const { host, port } of open) { const scheme = HTTPS_PORTS.has(port) ? 'https' : 'http'; const url = `${scheme}://${host}:${port}`; const probe = await _http(url); - const name = (probe && probe.title) || `${host}:${port}`; + const dev = deviceByIp[host]; + const svc = PORT_SVC[port] || (probe && probe.title) || null; + const name = svc ? (dev ? `${svc} · ${dev}` : svc) : (dev ? `${dev} :${port}` : `${host}:${port}`); const id = `disc-${host.replace(/\./g, '-')}-${port}`; const check = scheme === 'https' ? { type: 'tcp' } : { type: 'http' }; const r = await services.upsertDiscovered({ id, name, category: 'other', host, url, check }); diff --git a/package-lock.json b/package-lock.json index d44326b..b062247 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "void-server", - "version": "2.6.5", + "version": "2.6.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "void-server", - "version": "2.6.5", + "version": "2.6.6", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", "@mozilla/readability": "^0.6.0", diff --git a/package.json b/package.json index 9ff0118..17d04c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "void-server", - "version": "2.6.5", + "version": "2.6.6", "type": "module", "private": true, "scripts": {