diff --git a/nodejs/config/inventory.sqlite b/nodejs/config/inventory.sqlite index dba0c22..53b93fe 100644 Binary files a/nodejs/config/inventory.sqlite and b/nodejs/config/inventory.sqlite differ diff --git a/nodejs/plugins/discovery/docker.js b/nodejs/plugins/discovery/docker.js index c90cc24..9fd3eb0 100644 --- a/nodejs/plugins/discovery/docker.js +++ b/nodejs/plugins/discovery/docker.js @@ -78,6 +78,8 @@ module.exports = { const ports = (c.Ports || []).map(p => p.PublicPort ? `${p.PublicPort}:${p.PrivatePort}` : `${p.PrivatePort}`).join(', '); const isOwnStack = !!(stackProject && composeProject === stackProject); + const isIgnored = name.includes('openbao') || name.includes('bao-renewer') || composeService.includes('openbao') || composeService.includes('bao-renewer'); + resources.push({ kind: 'container', name: composeService || name, @@ -87,13 +89,15 @@ module.exports = { state: c.State, status: c.Status, ports: ports, + subType: 'docker', composeProject: composeProject || undefined, composeService: composeService || undefined, containerName: name, sourceId: stableKey, + ignored: isIgnored ? true : undefined, // Part of the deployment we are running inside: already // accounted for, not something to promote. - managed: isOwnStack ? true : undefined + managed: (isOwnStack || isIgnored) ? true : undefined } }); diff --git a/nodejs/utils/agent_manager.js b/nodejs/utils/agent_manager.js index 9cd39c7..4f4d924 100644 --- a/nodejs/utils/agent_manager.js +++ b/nodejs/utils/agent_manager.js @@ -290,11 +290,30 @@ class AgentManager { }; } - // Find connected/enrolled agent bound to a resource ID. + // Find connected/enrolled agent bound to a resource ID (or inherited from parent Host). async getAgentForResource(resourceId) { if (!resourceId) return null; const rows = await Agent.list().catch(() => []); - const agent = rows.find(a => a.resourceId === resourceId); + let agent = rows.find(a => a.resourceId === resourceId); + if (!agent) { + try { + const { Resource } = require('../models/resource'); + const { ResourceEdge } = require('../models/resource'); + const res = await Resource.get(resourceId); + if (res && res.kind === 'service') { + const edges = await ResourceEdge.list({ where: { childId: resourceId } }); + for (const edge of edges) { + const parentRes = await Resource.get(edge.parentId); + if (parentRes && parentRes.kind === 'host') { + agent = rows.find(a => a.resourceId === parentRes.id || (parentRes.metadata && parentRes.metadata.agentId === a.id)); + if (agent) break; + } + } + } + } catch (err) { + console.error('[AgentManager] parent agent lookup error:', err.message); + } + } if (!agent) return null; return agent.toPublic(this.liveState(agent.id)); } diff --git a/nodejs/views/directory.ejs b/nodejs/views/directory.ejs index b18d849..a812af2 100644 --- a/nodejs/views/directory.ejs +++ b/nodejs/views/directory.ejs @@ -94,11 +94,11 @@ {{{indentHtml}}} {{{caretHtml}}} {{#isHost}}{{/isHost}} - - {{name}} + + {{displayName}} - {{kind}}{{#metadata.subType}} ({{metadata.subType}}){{/metadata.subType}} {{#hasSecret}}Secret{{/hasSecret}} + {{kind}}{{#metadata.subType}} ({{metadata.subType}}){{/metadata.subType}} {{#metadata.isProduction}}Prod{{/metadata.isProduction}} {{^metadata.isProduction}}Dev{{/metadata.isProduction}} @@ -304,8 +304,20 @@
| Mount | Type | FS | Usage | Total |
|---|
| Device | Mount | Type | FS | Usage | Used / Total | ||
|---|---|---|---|---|---|---|---|
${esc(dk.device || dk.mountpoint)} |
${esc(dk.mountpoint)} |
${esc(dk.drivetype || 'Disk')} | ${esc(dk.fstype || 'N/A')} | -${fmtNum(dk.usage_percent)}% | -${fmtSize(dk.total_bytes)} | +
+
+ ${fmtNum(dk.usage_percent)}%
+
+
+ |
+ ${fmtSize(dk.used_bytes || (dk.total_bytes * (dk.usage_percent || 0) / 100))} / ${fmtSize(dk.total_bytes)} |
${esc(hd.machine_id || 'N/A')}${esc(hd.boot_id || 'N/A')}Select an existing Directory resource to merge IP addresses, network interfaces, and OS telemetry into:
+Search and select an existing Directory resource to merge IP addresses, network interfaces, and OS telemetry into: