Files
bobbanandClaude Sonnet 5 236b1da0dc Add a Network > Ports page: agent-reported ports plus manual openings
Summarizes every server's agent-reported listening ports in one
cross-server table (grouped by protocol+port, addresses merged,
loopback-only flagged) - previously this only existed per-server on
each server's own detail page.

Adds a second table for ports this app has no way to see on its own:
manually-recorded openings on a router, edge firewall, or cloud
security group, each with a label, external port/protocol, an optional
link to a tracked server (with its own internal port when NAT changes
it) or a freeform destination, a free-text source, and a comment.
Viewer-readable; adding/editing/deleting needs operator or admin.

The agent-port grouping logic (dedupe by protocol+port, detect
loopback-only sockets) was shared with the existing per-server Ports
card via a new agentPorts.ts service instead of duplicating it.

Verified with a real HTTP-level test: a genuine Express app with the
actual routers, a scratch SQLite DB, and forged admin/viewer sessions,
covering grouping correctness, the server-name join, input validation,
and role enforcement - the real dev DB was confirmed untouched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 23:48:35 +02:00

111 lines
2.2 KiB
JSON

{
"version": "7",
"dialect": "sqlite",
"entries": [
{
"idx": 0,
"version": "6",
"when": 1789419241921,
"tag": "0000_colossal_violations",
"breakpoints": true
},
{
"idx": 1,
"version": "6",
"when": 1789468464784,
"tag": "0001_yummy_luke_cage",
"breakpoints": true
},
{
"idx": 2,
"version": "6",
"when": 1789506601790,
"tag": "0002_motionless_lord_hawal",
"breakpoints": true
},
{
"idx": 3,
"version": "6",
"when": 1789673523898,
"tag": "0003_fantastic_randall",
"breakpoints": true
},
{
"idx": 4,
"version": "6",
"when": 1789677988329,
"tag": "0004_brown_gambit",
"breakpoints": true
},
{
"idx": 5,
"version": "6",
"when": 1789759852933,
"tag": "0005_bent_violations",
"breakpoints": true
},
{
"idx": 6,
"version": "6",
"when": 1790103102037,
"tag": "0006_aberrant_darkhawk",
"breakpoints": true
},
{
"idx": 7,
"version": "6",
"when": 1790372043652,
"tag": "0007_secret_madripoor",
"breakpoints": true
},
{
"idx": 8,
"version": "6",
"when": 1790381917814,
"tag": "0008_thin_boom_boom",
"breakpoints": true
},
{
"idx": 9,
"version": "6",
"when": 1790382571470,
"tag": "0009_sharp_magus",
"breakpoints": true
},
{
"idx": 10,
"version": "6",
"when": 1790384497980,
"tag": "0010_magenta_alice",
"breakpoints": true
},
{
"idx": 11,
"version": "6",
"when": 1790385846612,
"tag": "0011_strange_mongoose",
"breakpoints": true
},
{
"idx": 12,
"version": "6",
"when": 1790388232273,
"tag": "0012_cool_harry_osborn",
"breakpoints": true
},
{
"idx": 13,
"version": "6",
"when": 1790449897833,
"tag": "0013_sturdy_bloodstorm",
"breakpoints": true
},
{
"idx": 14,
"version": "6",
"when": 1790718056783,
"tag": "0014_empty_gabe_jones",
"breakpoints": true
}
]
}