A data-center rack elevation and cable-management tool. Visualize racks, devices, and cabling as realistic SVG diagrams — no build step, no framework, just Python/Flask and vanilla JS.
Just want to try it? Grab the Windows desktop build — no Python or install needed:
⬇ Download RackView.zip — unzip, run RackView.exe, it opens in your browser automatically with demo data.
(Unsigned .exe — Windows SmartScreen may warn "Unknown publisher" on first run; click More info → Run anyway.)
Tracking what's plugged into what in a data center usually means a spreadsheet, a Visio file nobody updates, or a trip to the DC. RackView keeps rack elevations, cabling, and device details in one place, browsable and searchable.
- Realistic rack elevations — 220+ real device models (Dell, HPE, Cisco, Arista, Juniper, Fortinet, Palo Alto, Brocade, …) across switch, SAN switch, router, firewall, server, and storage categories, front/rear views, drag-and-drop placement, and empty U's auto-collapse so long gaps don't eat the screen. A port with a real cable on it gets a small breathing LED; a device flagged by drift detection gets a quiet colored outline; fan icons actually spin — all driven by the same data the rest of the app already pulls, nothing simulated
- Live hover info — hovering any port shows its cable's medium and far end (same info a cable's own tooltip shows, now reachable from either side), plus a warning line if that device's latest pull found drift
- Smart cabling — automatic front/rear port matching, medium-aware color/dash styles (fiber, DAC, Cat6a, power, SAS), routes that never cross over other ports; a run through one or more patch panels shows as a single logical connection in the device panel instead of separate raw segments
- Configurable server rear panels — pick FC/NIC port counts and speeds, LOM, and iDRAC per device instead of a fixed template; warns before deleting cables on ports you remove
- Right-click actions — jump to a cable's other end or delete it, show only one device's cabling, delete a device, rename a port/device/group label, drag labels out of the way
- Search (Ctrl+K) — find devices by IP, MAC, serial, port, or VLAN across every rack
- Impact analysis — "what breaks if this device goes down," including redundancy loss, across the whole customer's infrastructure
- LLDP Discovery — paste switch LLDP output; it's saved as an informational note on each port (surfaced in the device panel) without ever touching cabling
- LLDP Auto-Cabling — a separate tool that matches LLDP neighbors against existing cabling and creates/updates/removes cables, with a review step per link and a picker/shortcut for neighbors that aren't in the rack yet
- Unmanaged-device badge — a small counter on the Tools menu flags neighbors the latest LLDP pull saw on the wire with no matching device in RackView, so drift is visible without opening the full Auto-Cabling review
- SAN Switch Mapping — pick a SAN switch already placed in a rack, enter its IP and login, and pull live port/zoning info over SSH (Brocade FOS or Cisco MDS); the username/password are used once and never saved. Each pull is also classified against RackView's own cabling (matched/conflict/new/removed, using the switch's live WWN login data) and diffed against the previous pull so you can see exactly what changed
- Storage Mapping — same idea for Dell PowerVault/ME and HPE MSA storage arrays (same underlying controller CLI): pulls live FC port status and WWNs over SSH, each port cross-referenced against RackView's own cabling. Same drift check as SAN, scoped honestly to presence/absence (documented/new/missing) since array ports don't report a connected host's identity the way a switch's FLOGI table does, plus the same "what changed since last pull" diff
- ESXi NIC Verification — pulls physical NIC link status and vSwitch mapping over the vSphere API (no SSH needed), matched to the device's
vmnic_mapto confirm each recorded cable against reality. Can also pull one host at a time or, with vCenter credentials, every host vCenter manages in one go — each matched to a rack device by mgmt IP/name, unmatched hosts are skipped. ESXi's own version is tracked in Firmware Status/List as its own product, separate from the server's BMC firmware - iDRAC / iLO — pulls BIOS/BMC firmware version, health (PSUs, fans), and the full component firmware inventory (NICs, RAID/HBA, CPLDs, etc.) from a Dell iDRAC or HPE iLO over Redfish (HTTPS), the out-of-band management controller rather than the hypervisor; credentials used once and never saved. Also surfaces the BMC's own persistent event log (Dell's Lifecycle Log / HPE's IML) as a per-device timeline — history that lives on the box itself and survives an OS reinstall
- Activity Log — every device/cable create, update, and delete is timestamped with a before/after diff, filterable by rack
- Mgmt IP conflict check — flags a device whose management IP is already recorded on another device in the same customer's racks
- Devices view — a flat, sortable/filterable table of every device across every rack, with firmware/version pulled live where available (SAN/Storage/ESXi mapping); click a row to jump to that device in its rack
- Firmware Status — groups every deployed device by vendor/model, shows what firmware is actually running next to a hand-entered "latest known" version, and flags mismatches as outdated; no internet access, so "latest known" is maintained by hand
- Firmware List — the full catalog reference lookup, every firmware-bearing model whether deployed or not, for checking "what's current for the X" without needing one in a rack; edits update the same table Firmware Status compares against
- Multi-rack / floor view — customer-isolated racks, a hall-level view, inter-rack cabling
- Excel export — download a rack's or a device's cabling as
.xlsx
Requires Python 3.11+.
git clone https://github.com/kursatbal/rackview.git
cd rackview
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # macOS/Linux
pip install -r requirements.txt
python seed.py # first run only — creates and seeds the demo database
python app.pyThen open http://127.0.0.1:5000 in your browser.
app.py Flask app + REST API
models.py SQLAlchemy models (Rack, Device, Cable, ...)
seed.py Demo data generator
static/ Frontend — HTML/CSS + vanilla JS, rendered as inline SVG
- Backend: Python, Flask, SQLAlchemy, SQLite
- Frontend: vanilla JavaScript + inline SVG — no React/Vue, no build step
- Export: openpyxl
A rack that looks like it's actually doing something
- Live port LEDs — a port's little status LED used to be purely decorative (its on/off state hardcoded per stencil call site, no connection to any real data). A thin overlay pass now draws a small breathing green dot on top of any port that's a real Cable endpoint, using the exact coordinates the cabling renderer already captures — the hundreds of existing stencil draw calls weren't touched, so there's zero risk to the existing artwork
- Drift shown on the rack itself, not just the tool pages — a device whose latest LLDP/SAN/Storage pull found a conflict or an undocumented neighbor now gets a quiet dashed outline directly on the rack elevation (red for conflict, amber for new/missing) — a new
/api/racks/<id>/device-driftendpoint, reading the samedrift_summary/LldpDiscovery.summarydata the SAN/Storage pages already compute, nothing re-pulled - Richer hover tooltips — hovering a port now shows what it's actually cabled to (medium + far-end device/port, the same info a cable's own hover already gives, now reachable from either side) and a drift warning if the device has one, reusing the cabling/drift data already loaded for the page — no extra requests
- Fan icons actually spin (a slow CSS rotation on the existing blade artwork, not a new drawing)
- All of it strictly reflects data RackView already has — no simulated/randomized state, no sound effects, no fake sensor readings
Physical-layer drift detection, BMC event log, config diff, patch-panel tracing
- Drift detection — SAN Switch Mapping and Storage Mapping now classify every pulled port against RackView's own documented cabling on each pull, not just display it. SAN uses the switch's live FLOGI/WWN data for a real matched/conflict/new/removed classification (something is logged in where it should be, or isn't); storage arrays don't report a connected host's identity at all, so that side is scoped honestly to documented/new/missing — a presence check, not a conflict check, and the UI says so rather than overclaiming
- Config diff — SAN/Storage snapshots were already being saved on every pull but never compared; a new "what changed since last pull" panel diffs the latest pull against the previous one (or any earlier one, via a picker), reporting added/removed/changed ports and top-level fields like firmware version — the Oxidized/RANCID pattern (SSH-pull, version, diff), applied to gear RackView already talks to, with nothing (not even a config, just the pulled state) persisted beyond what was already being kept
- Unmanaged-device badge — a small counter on the Tools ▾ menu, sourced from the latest LLDP Discovery pull per switch, flags neighbors seen on the wire with no matching device in RackView — the quick, no-click-through version of the same drift idea
- iDRAC/iLO event log — pulls the BMC's own persistent event log (Dell's Lifecycle Log, HPE's IML) over the same Redfish session already used for firmware/health, and renders it as a reverse-chronological timeline per device. This history lives on the box itself, independent of anything RackView has pulled before, and survives an OS reinstall
- Patch-panel tracing — a device's Connections tab used to show a cable that ends at a patch panel as a dead end at the panel itself; it now walks the paired front/rear port (derived from the panel's own port list, since there's no explicit pairing field) to the cable on the other side, up to 4 hops, and renders the whole run as one logical connection with the intermediate patch panel(s) shown as small chips — an incomplete trace is shown as such rather than silently cut short
- None of this needed a new database table or a migration — every addition rides in the existing JSON columns the live-pull snapshots and metadata already use
vCenter bulk ESXi pull, ESXi tracked in Firmware Status/List
- ESXi NIC Verification can now pull from vCenter instead of one host at a time — one login enumerates every host vCenter manages, each matched against a RackView device by mgmt IP (falling back to name) so only hosts actually placed in a rack get a snapshot saved; unmatched hosts are reported, not silently ignored or guessed at
- ESXi itself is now tracked in Firmware Status and Firmware List as its own product ("VMware ESXi"), independent of the server hardware it runs on — a host's hypervisor build is a different release train from its BMC firmware, so it needed its own row rather than being folded into the server's BIOS/BMC comparison
iDRAC/iLO full component firmware inventory
- BIOS and BMC firmware alone don't tell the whole story on a rack server — NICs, RAID/HBA controllers, PSUs, CPLDs, and more all carry their own firmware, and each varies by exact configuration (which RAID card, how many NIC ports) rather than by model, so there's no per-model "latest known" to compare against like there is for BIOS/BMC
- Pulls the full list via Redfish's
UpdateService/FirmwareInventory(every DMTF-compliant BMC exposes this) and shows it as a searchable list on the iDRAC/iLO page — purely "what's on this specific box right now," not a status comparison
Firmware List
- New page: a full-catalog firmware reference lookup, separate from Firmware Status — every firmware-bearing model RackView knows about (210 of them), whether or not anyone has one deployed, so you can check "what's the latest for the ME5024" without needing one in a rack
- Same editable version-history table as Firmware Status, same underlying data — a save here updates the reference Firmware Status compares deployed devices against
- Firmware Status stays scoped to what's actually deployed ("is what's running okay"); this page is the product-level lookup ("what do we know about model X")
Firmware Status
- New page: groups every placed device by vendor/model and shows the firmware actually seen on it (from the same live-pull snapshots Devices view uses: SAN Switch Mapping, Storage Mapping, iDRAC/iLO) next to a hand-entered "latest known" version per model, flagging a model as Outdated when they don't match
- RackView doesn't reach the internet, so there's no automatic vendor release feed — "latest known" is a small per-vendor/model reference table, tracking the last 3-4 releases with dates, not just the newest one; a model with nothing entered shows "Latest unknown", not "Outdated", so it's never a false alarm
- Pre-seeded with real researched data for all 210 firmware-bearing catalog models (every switch/router/firewall/SAN-switch/storage/server) — ships with the demo data so a fresh install already has a useful baseline. Meant to be refreshed by hand every month or so as new firmware ships; each row is independently editable from the page
- For servers, the comparison uses the BMC (iDRAC/iLO) firmware specifically, not the combined BIOS+BMC string Devices view displays — that's what a vendor security advisory actually version-pins
Tools menu, bordered Devices table
- The top bar had grown to nine separate buttons as live-pull tools were added one at a time — LLDP Discovery, LLDP Auto-Cabling, SAN Switch Mapping, Storage Mapping, ESXi NIC Verification, iDRAC/iLO, and Activity Log are now grouped under a single Tools ▾ dropdown
- Devices table now has full cell borders (a proper grid) instead of just row underlines
- Added a help-overlay card pointing at the new Tools menu
HPE MSA support in Storage Mapping
- Added HPE MSA 2050/2060 SAN (SFF and LFF variants) to the device catalog
- Storage Mapping's collector already spoke the right protocol for this without changes — Dell PowerVault/ME and HPE MSA run the same OEM controller firmware and the same SSH/XML CLI command set, confirmed by cross-checking a sibling project's separate MSA and ME adapters, which turned out to be near-identical
- Not yet verified against real MSA hardware — only the Dell ME4024 has been tested end-to-end so far
iDRAC / iLO
- New page: pulls BIOS version and BMC (iDRAC/iLO) firmware version, plus health/PSU/fan status, from a Dell or HPE server's out-of-band management controller over Redfish (HTTPS) — separate from ESXi NIC Verification, which pulls the hypervisor side, not the BMC
- Ported from a sibling project's Redfish collector, scoped down to identity + firmware + health/PSU/fans (no disk/RAID/memory inventory) to match the lighter tier of RackView's other live-pull tools
- iDRAC/iLO BMCs typically negotiate older TLS cipher sets than OpenSSL 3.x's default security level accepts, causing a handshake failure — worked around with a custom TLS adapter that lowers the cipher security level and re-enables legacy renegotiation for that connection only
- Same credential rule as every other live-pull tool here: username/password are used for one pull and never written to disk; only the IP/vendor/port and the BMC's own reported state are kept
- The Devices view's firmware column now prefers BIOS/BMC firmware from an iDRAC/iLO pull over the ESXi hypervisor build for server-category devices, since that's what a vendor security advisory actually means by "firmware"
Devices view
- New page: a flat table of every device across every rack — name, category, vendor/model, rack, mgmt IP, firmware/version, serial, owner — sortable by column, filterable by category/customer, searchable across name/IP/serial/model
- Firmware/version is resolved per device from whichever source actually knows it: the latest live pull for SAN switches/storage/servers (SAN Switch Mapping, Storage Mapping, ESXi NIC Verification), falling back to the manually-entered field for everything else
- Click any row to jump straight to that device in its rack
Brocade 300 port layout and cable routing fixes
- The port groups were drawn column-by-column instead of row-major, confirmed wrong against a real unit — real port numbering goes top row 0-3, bottom row 4-7 within each group of 8; fixed, and the inter-group gap (previously nearly invisible) now actually reads as 3 separate blocks like the real chassis
- Fixed cable routing choosing an unnecessarily long "bridge over the top of the rack" path for cables where one end sits on a wide multi-port device's right half and the other on a narrower device's left half, even when the two devices are directly stacked — it now compares the cost of routing both ends through the same side against the natural pairing and picks whichever is actually shorter; found and confirmed fixed against a real customer rack built from live-pulled SAN/storage/server data
ESXi NIC Verification
- New page: pulls physical NIC link status, speed, and vSwitch mapping from an ESXi host — over the vSphere API (HTTPS/443), not SSH, since SSH is disabled by default on ESXi and the real hosts tested against here had it off; the vSphere API needs nothing enabled on the host and returns structured data instead of esxcli text tables
- Also queries CDP/LLDP neighbor info per NIC where the connected switch port has it enabled — came back empty on the real hosts tested (switch-side CDP/LLDP wasn't on), so this degrades to "no neighbor data" rather than erroring
- Each NIC is translated from its vmnic name (vmnic0, vmnic1, ...) to the physical port label actually used in cabling via the device's existing
metadata_json.vmnic_map(already used by LLDP matching), then cross-referenced against RackView's own Cable records — confirmed working against two real ESXi 6.7 hosts, correctly resolving vmnic0/vmnic1 to their real LOM ports and the switches they're actually cabled to
Storage Mapping
- New page, same pattern as SAN Switch Mapping: pick a storage array already placed in a rack, enter its IP and login, and pull its live FC port status/WWNs over SSH — verified against a real Dell ME4024, whose CLI replies with structured XML per command rather than a text table, parsed directly instead of guessing at column widths
- Each port shows where it's cabled to, cross-referenced against RackView's own cabling for that array (same idea as the SAN switch cross-reference, but a different port-naming scheme: the array's own port ids ("A0", "B1", ...) map straight across with no offset to the rear stencil's port names, unlike the switch side's +1 offset)
- Credentials are never saved — same rule as SAN Switch Mapping
Activity Log
- Every device and cable create/update/delete is now recorded with a timestamp and a before/after diff of what changed, filterable by rack or by device/cable
- There's no login system in RackView, so this tracks what changed and when, not who — in the same spirit as NetBox's change log, scaled to what actually fits a tool with no auth
- Manual cable-routing drags don't spam the log — only the port/medium/label fields are tracked, not waypoints
Brocade firmware version fix
- Verified SAN Switch Mapping against a real Brocade 300 — port/zone parsing matched exactly, but the firmware version came back empty because that particular FOS release (7.4.2h) doesn't print a "Fabric OS:" line in
switchshowat all; now falls back to reading it fromversioninstead
Mgmt IP conflict warning
- A device's General tab now flags it if its management IP is also recorded on another device in the same customer's racks — a static check against RackView's own data, nothing is polled live
SAN Switch Mapping
- New page: select a SAN switch that's already placed in a rack, enter its IP and SSH login, and pull its live port list and active zoning over SSH (Brocade FOS
switchshow/zoneshow, or Cisco MDSshow interface brief/show flogi database/show zoneset active) — read-only commands only, nothing on the switch is ever changed - The username and password are used for that one pull and never written to disk; only the IP/vendor/port and the switch's own reported state are kept, so the last pull is still there to view next time without re-entering credentials
- Each pull is timestamped and kept as a snapshot, similar to LLDP Discovery's history
- Each port also shows where its cable actually goes, cross-referenced against RackView's own cabling for that switch (not an external host inventory) — alongside the raw connected WWN
LLDP Discovery / Auto-Cabling split
- LLDP Discovery no longer touches cabling at all — it only saves what LLDP reports on each port as an informational note, shown in the device panel next to any ports without a recorded cable
- A new, separate LLDP Auto-Cabling page is the one that actually creates/updates/removes cables from LLDP output, with a per-link review step before anything is applied
- Neighbors whose reported hostname doesn't match any device in the rack (typo, FQDN vs. short name, case) can now be resolved by hand from a dropdown of existing devices, or via a "Create device →" shortcut that jumps into edit mode with the neighbor's name pre-filled for the add-device prompt
SAN switch category & Brocade datasheet accuracy
- Storage-fabric switches (Cisco MDS, Brocade) now have their own SAN Switch category instead of being lumped in with Ethernet switches, with a matching color and a filter chip in the catalog
- The Brocade 300 (previously catalogued under an invented model name with a guessed port layout) now has a dedicated, datasheet-accurate panel: 24 FC SFP+ ports in three groups of 8, with console/mgmt/USB and the power inlet on the port side and only fans on the non-port side — a real deviation from the generic switch template that the other SAN switches use
- Corrected the Brocade G620: 48 SFP+ ports plus 4 QSFP Q-Flex uplinks (previously recorded with 0 uplinks), and its dual PSUs have integrated cooling fans rather than a separate fan tray
Router port fidelity
- Port counts, NIM/module slot counts, and chassis heights corrected against real datasheets for the Cisco ISR 4000, ASR 1000, and Catalyst 8200/8300/8500 series, and the Juniper MX204/MX10003
- Fixed a template bug where a router's onboard "gig" ports always rendered as SFP even on models that are wired for RJ45 (several ISR/Catalyst models), and one where a legitimately-zero NIM slot count silently fell back to a nonzero default
- Fixed a rendering bug where an odd NIM slot count (e.g. 5) produced a fractional slot label instead of a clean grid
- Fixed the 2U router template ignoring the model's actual configured gig/10-gig port counts and always drawing 4+4 regardless of the real config
Switch family port fidelity
- Corrected chassis specs against Cisco/Arista datasheets: Nexus 9508 (6→8 power supplies), Nexus 9516 (20→21 rack units, 8→10 power supplies), Arista 7508R3 (6→8 power supplies)
- Corrected Dell PowerSwitch S5248F-ON's uplink count (4→6, matching its real 4×100GbE + 2×100GbE QSFP28-DD config)
- Verified against datasheets and left unchanged where already correct: the Nexus 9300 EX/FX family, Nexus 9504, Catalyst 9200/9300/9500/9400/9600 series, Cisco MDS 9148T, Dell PowerSwitch S5200/Z9432F/Z9664F, and Arista 7050X3/7280R3/7504R3
UX & readability
- Contrast pass on faint text (rail U-numbers, device labels, secondary text) to meet WCAG AA
- Long runs of empty U's collapse into a single "N U empty (click to expand)" row instead of eating the whole screen
- Blank panel fields (Owner team, Warranty, etc.) are hidden instead of shown as
- - Tighter side-panel and general spacing
Configurable server rear panels
- Server rear ports are now per-device configurable instead of a fixed template: FC (0/2/4/6 ports, 16/32/64Gb), NIC (0/2/4/6, 10/25/100GbE), LOM, and iDRAC can each be set independently
- The three port types are visually distinct (FC green, NIC dark, LOM copper) and each gets the right cable medium automatically
- Devices left on the model default render exactly as before — nothing already placed changes
LLDP-based cable change detection
- Comparing pasted LLDP output against recorded cabling now reports four states: changed (red), new (green), removed (yellow), and matched (silent)
- Changed ports are marked on the rack itself with a thin colored outline — not a big circle, so dense/two-row port layouts stay readable
- A summary panel lists every difference with an action (update/ignore/delete) per item
- Every comparison is saved to a discovery history: pick a past run from the list to see its results again without re-pasting, and each entry tracks whether its changes were applied or are still pending
Cable-creation flow
- Port click targets are slightly larger so an edge click still registers, without overlapping neighboring ports
- After the first click, the cable end follows the cursor to the second port instead of giving no feedback
- Step-by-step hints, dimmed invalid targets, ESC to cancel, and a confirmation toast on success
Cable routing rewrite
- Cables now enter/exit every port vertically (from above for the top row, from below for the bottom row) instead of cutting across the row
- Fixed a routing bug where a cable to a dense multi-row switch could sweep straight across every other port on the way to its target
- Fixed a routing bug where rack units stacked with zero U of gap between them (the common case) could cause a cable to sweep across the neighboring device
- Parallel cables get more breathing room in the side lanes so they no longer visually overlap
- Fiber/LC connector artwork always renders horizontal, even though the cable itself still enters the port vertically
Manual cable routing
- Grab any point along a selected cable and drag to override its auto-routed path with your own bend point
- Existing bend points can be dragged again to fine-tune, or right-clicked to remove just that one
- "Reset routing" in the cable's right-click menu discards the manual override and returns to the auto-routed path
- Dragging snaps to nearby corners of any other cable (auto-routed or manually routed), with a small on-screen readout of the current position — a soft magnet only, never blocks the drag
- Manual routes are always orthogonal — every segment is purely horizontal or vertical, an automatic right-angle corner is inserted between any two points that aren't aligned, so a cable can never render as a diagonal line
FortiGate port artwork
- Copper (RJ45) and fiber (SFP/SFP+/SFP28) ports now render with a clearly different tone — dark gray with a gold pin for copper, dark navy with a blue accent for fiber — instead of looking identical
- QSFP ports (on 2U models, and the 1000F's QSFP+ uplinks) render visibly larger than SFP, in the same fiber tone
- 1U models split their copper ports into two rows (top/bottom) instead of one long strip, matching real hardware and roughly halving the device's apparent width
- Port counts per model now match vendor datasheets (previously approximate placeholders) — e.g. the 3500F is fiber-heavy (2 copper + 32 SFP28 + 6 QSFP28) while the 1000F carries 2 QSFP+ uplinks alongside its RJ45/SFP28 ports
Exact-match firewall front panels
- All 10 FortiGate models (90G through 3500F) and the Palo Alto PA-1400/PA-3400 series now render a hand-matched replica of their real front panel — exact port grouping, position, and labeling (e.g.
x1-x8,ha1/ha2,mgmt1/mgmt2) taken directly from each vendor's official datasheet, down to details like FortiGate's odd-top/even-bottom port numbering and the 90G's shared copper/SFP+ media ports - Corrected the FortiGate 1000F's rack height (it's a 2U chassis, not 1U as previously listed) and its port counts, which were off from the real hardware
- Port counts for Cisco Firepower/Secure Firewall, Juniper SRX, and Check Point Quantum models were corrected against their datasheets (no dedicated front-panel diagram was available for these, so they stay on the parametric layout for now)
- Fixed a bug in the parametric firewall templates where a model with legitimately zero of a port type (e.g. Check Point 16600 has no SFP ports) would silently fall back to a default count instead of drawing none
- A dense layout (e.g. the 2600F's 18 copper + 16 SFP + 4 QSFP in 2U) scales down proportionally if needed so ports never overlap or run into the LCD/management panel
MIT — see LICENSE.