100 Commits
Author SHA1 Message Date
jaredandClaude Opus 4.8 d5e476fb72 driveAtlas: redraw large1 as a Rosewill RSV-L4500U cutaway
Lint / Shell (shellcheck) (push) Successful in 9s
large1 lives in a Rosewill RSV-L4500U 4U case, not a generic "3x5 grid".
The old render was a plain placeholder that said little about the machine.

This chassis is awkward to draw honestly: the drives are NOT visible from
the front. The full-width perforated door drops down to reveal a wall of
120mm fans, and the 15 bays sit behind it in three removable 5-drive
modules serviced by taking the TOP COVER off. So a literal front elevation
would show zero drives.

Draw a front elevation with the fan wall and dust door CUT AWAY instead:
the chassis silhouette stays recognisable - rack ears carrying the big
vertical D-handles, the perforated drop-down door with its centred barrel
lock, the slim right-hand I/O strip - while the cutaway (dashed tear edges,
ghosted arcs of the outer two 120mm fans) exposes all 15 bays.

Geometry per Rosewill's manual: 3 modules side by side, 5 drives stacked
FLAT in each, long axis front-to-back with connectors facing the rear. So
from the front every bay is a WIDE, SHORT slot and the grid reads 5 rows x
3 columns - the inverse of the Sliger's tall on-edge slots.

The chassis documents no bay numbering and has no backplane and no per-bay
LEDs, so numbering is stated in the output as a driveAtlas LOCAL convention
(1-5 left module top->bottom, 6-10 middle, 11-15 right) with a reminder to
identify a drive by serial, plus a note that service is top-cover-off.

Fixed 96-column canvas, identical display width on every line in monochrome
and colour, colour runs coalesced (max 17 escapes per line, never changing
inside a repeated glyph run), SAFE width-1 glyphs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 22:55:16 -04:00
jaredandClaude Opus 4.8 e474ec546c driveAtlas: redraw the Sliger CX4712 as a real front elevation
Lint / Shell (shellcheck) (push) Successful in 10s
The old 10-bay render was a 138-column strip of ten wide horizontal boxes,
which is not what this chassis looks like. Sliger's own photos and CAD show
the ten 3.5" bays are a SINGLE ROW of ten with the drives mounted ON EDGE,
so from the front each bay is a tall narrow slot - ten thin vertical bars in
a row is the signature of the case. Drawn as stacked horizontal trays it was
simply wrong.

Redraw it as a true front elevation at the real proportions (4U, 431.8 x
176.8 mm, ~2.75:1 with rack ears):
  - two 5.25" filler blanks side by side directly above the bay row, spanning
    the same width (these are unused on all three nodes)
  - one row of ten vertical bay slots, solid when occupied, dim ghost when not
  - the narrow front I/O strip at the right: power ring, 2x USB-A, USB-C, and
    the drive-lock key cylinder
  - rack ears with vertical handles bracketing both edges
There are no front fans, no reset button, no badge and no per-bay LEDs on
this chassis, so none are drawn.

All text is pushed out of the picture into BAY/DEV caption rows column-aligned
under the slots, keeping the chassis a clean silhouette. M.2 and internal
drives are not on the front face, so they are listed as a legend beneath.

Also surface the two facts that actually matter for using this map: the case
has NO backplane (each bay is an individually hand-cabled SFF-8482 to SATA
adapter) and NO per-bay LEDs, so bay numbering is a LOCAL left-to-right
convention rather than a vendor one, and a drive can only be identified
physically by its serial - there is no bay LED to blink.

Fixed 88-column canvas, identical display width on every line in monochrome
and colour, colour runs coalesced per run of like bays to keep escape churn
low, SAFE width-1 glyphs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 21:42:49 -04:00
jaredandClaude Opus 4.8 6b40ec801b driveAtlas: cut ANSI escape churn in the ZimaBoard heatsink
Lint / Shell (shellcheck) (push) Successful in 28s
The fin ramp alternated colour keys every two glyphs (█▓ bright, ▒░ mid),
so the run-length colour encoder emitted a new escape roughly every 2.6
characters: 25 escapes per fin line, inflating a 66-glyph line to 334
bytes and 206 escapes for the drawing as a whole.

The █▓▒░ ramp already carries the fin relief through glyph ink density,
so alternating colour across it adds nothing visible. Paint the whole fin
field one steel key instead: fin lines drop to 5 escapes / 114 bytes and
the drawing to 134 escapes total, with byte-identical monochrome output
and no visual change in colour. Gentler on terminals that cope poorly
with dense escape/multibyte interleaving.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 10:26:48 -04:00
jaredandClaude Opus 4.8 a55fa85875 driveAtlas: make ZimaBoard front-panel connectors recognisable
Lint / Shell (shellcheck) (push) Successful in 17s
The four front ports were identical 2-char stubs under one lumped
"GbE/USB" label, so they read as anonymous blobs. Draw them as the
hardware actually is and give each connector type its own silhouette:

  RJ45   ██▄██   solid jack with a notch cut into the top centre (latch slot)
  USB-A  █▀▀▀█   side walls plus a tongue bar filling the upper half
  mDP    ╱██╲    chamfered slot
  DC     (█)     round barrel with a centre pin

The 2x GbE and 2x USB now share ONE housing with the ethernet row sitting
directly on top of the USB row and no divider between them, matching the
physical stacked connector module. Each jack stays one row tall by using
half-block glyphs to get two vertical pixels per cell. GbE and USB get
separate labels; mDP and DC 12V sit beneath their own connectors.

Front-face height HC grows 3 -> 5 for the room. Knock-on: HC feeds FB,
which decides where the left side face stops being a vertical edge, so the
PCIe row now lands on the last vertical row and its card edge makes a real
T-junction into the chassis (▐▓▓┤) instead of floating. HC and the PCIe row
are therefore coupled if this is tuned further.

Still a fixed 66-column canvas, identical display width on every line in
monochrome and colour, SAFE width-1 glyphs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 02:58:04 -04:00
jaredandClaude Opus 4.8 6a26feb9e9 driveAtlas: add ZimaBoard 832 layout for micro1 / monitor-02
Lint / Shell (shellcheck) (push) Successful in 13s
Both micro hosts are ZimaBoard 832 (Celeron N3450, 8G LPDDR4, 32G eMMC).
Add a dedicated "zimaboard" chassis type + generate_zimaboard_layout() and
route micro1/monitor-02 to it, replacing the generic 2-bay "micro" render.

Physical layout confirmed against the actual unit (not just vendor specs):
FRONT face is two-tier - the 2x GbE sit directly ABOVE the 2x USB 3.0, with
the Mini-DisplayPort left of that block and the DC 12V barrel right. The
open-ended PCIe 2.0 x4 card edge exits the LEFT side. The REAR edge carries
the 2x SATA data connectors with the single mini-4-pin SATA power header in
the CENTRE between them, so two drives need a Y power cable. No drive bay
(drives cable out and lie beside the board) and no M.2/mSATA.

Map the two rear SATA ports via AHCI 00:12.0 (ata1/ata2) as sata-1/sata-2;
the soldered eMMC has no by-path entry so it is probed directly at
/dev/mmcblk0 and shown as the OS/boot slot.

The render is a fanless finned-heatsink hero: an oblique brick whose lid is
a corrugated block-element fin ramp lit from upper-left, with the front-left
notch and the badge inset in the bevel, over three drive slots (solid+green
when occupied, dashed ghost when empty). Drawn onto a fixed 66-column
glyph/colour-key canvas and emitted with run-length colour, so every line is
exactly the same display width in monochrome and colour; SAFE width-1 glyphs
only (no ambiguous-width chars that smear under CJK locales).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 02:39:50 -04:00
jaredandClaude Opus 4.8 93aaa63b18 driveAtlas: silence SC2059 in generate_nuc_layout (ANSI-art printfs)
Lint / Shell (shellcheck) (push) Successful in 13s
The NUC layout printfs intentionally embed our own DA_* ANSI colour vars and
literal box-drawing in the format string (no '%', device names passed as %s
args), so SC2059 is a false positive here. Scope a shellcheck disable to the
function to restore a green lint run.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 02:34:07 -04:00
jared 51fb4cd3a9 Merge feature/pbs-nuc-drive-map: revamped PBS/NUC art + post-outage bay remap
Lint / Shell (shellcheck) (push) Failing after 6s
2026-07-18 15:45:39 -04:00
jaredandClaude Opus 4.8 c018611959 driveAtlas: revamp PBS/NUC layout + fix post-outage drive map
Lint / Shell (shellcheck) (push) Failing after 10s
Remap the pbs (NUC5i5RYB/RYH) USB bays after a power outage: the ...615
NVMe dropped to 0B/hardware-error in the hot stacked rear-top bay and was
moved to the cooler front-left port. Slot keys are now position-explicit
(usb-fl/usb-fr/usb-rt/usb-rb) keyed by USB port path, with the front-left
= 3-2 (usb-0:2) move recorded and the root cause (rear-stack thermals,
exhaust vent directly above the rear USB pair) documented.

Rebuild generate_nuc_layout() as a cabinet-projection schematic: 88-col,
metal-shaded isometric chassis + rear panel with the USB pair stacked under
the fan vents and a red "bakes in CPU exhaust" callout, dashed ghost boxes
for empty ports, and green LED bars on occupied drives.

Add reusable helpers: da_color_init (capability-gated 256/truecolor/16
"hardware schematic" palette, honors NO_COLOR/tty/tput/COLORTERM; structure
grey, color encodes state only so it reads in monochrome), da_repeat, and
da_gauge (eighth-block capacity gauge). Every line is a uniform 88 display
columns in mono and color; only SAFE width-1 glyphs used.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 15:43:11 -04:00
jared 61cd7bd7bf Merge pull request 'feat: add pbs (Intel NUC5i5RYB) drive map + USB-NVMe SMART & root support' (#26) from feature/pbs-nuc-drive-map into main
Lint / Shell (shellcheck) (push) Successful in 7s
Reviewed-on: #26
2026-07-16 10:08:10 -04:00
jaredandClaude Opus 4.8 028e7bf1bb feat: add pbs (Intel NUC5i5RYB) drive map + USB-NVMe SMART & root support
Lint / Shell (shellcheck) (push) Successful in 7s
Lint / Shell (shellcheck) (pull_request) Successful in 7s
Adds a `nuc` chassis type and a `pbs` mapping: one internal 2.5" SATA (OS/boot)
plus two rear USB 3.0 ports (stacked top/bottom) carrying USB-attached NVMe.

The two JMicron USB bridges report an identical serial, so the drives are keyed
by USB *port path* (usb-0:N), not by-id. Physical top/bottom was confirmed with
an LED blink test: TOP = port 3-4 (usb-0:4), BOTTOM = port 3-3 (usb-0:3).

Supporting changes so it works on the NUC:
- maybe_sudo(): run privileged commands directly when already root (PBS/minimal
  Debian may not have sudo installed at all).
- smart_collect(): auto-select a smartctl -d for USB bridges (sntjmicron/
  sntrealtek/sntasmedia/sat); plain calls can't read NVMe behind a bridge and
  were mislabeling the drives (wrong type, false failed-health ✗).
- Detect NVMe reported via a USB bridge (device is sdX) for correct TYPE.
- Render usb-* bays in the drive table; align the nuc controller line.

Verified live on pbs: correct top/bottom map + full SMART (type/temp/health/
model/serial) for the internal SATA and both USB NVMe drives.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 22:34:15 -04:00
jaredandClaude Sonnet 4.6 f8046546cc Fix large1 bay mappings based on physical audit
Lint / Shell (shellcheck) (push) Successful in 11s
Complete remap of large1 after physical inspection. All 14 bay-to-PCI
assignments were wrong; corrected using serial number cross-referencing
against live /dev/disk/by-path and a previous script run with known serials.

Key findings:
- HBA Slim-SAS #0 (blue cables): ports map in reverse to phys 3,2,1,0
- HBA Slim-SAS #1 (silver cables): port 1=phy7, 2=phy6 (stuck B5), 3=phy5, 4=phy4
- Orange SATA bottom-left (B1) is ASMedia 25:00.0-ata-2, not AMD
- Orange SATA top-middle (C2) is AMD 16:00.1-ata-8, not ASMedia
- Slot 5 of all stacks must remain empty (near-impossible to remove drives)
- B5 (bay 14, WD-CA19PTMK) and C5 (bay 15, unknown) are permanently stuck

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 15:42:16 -04:00
jaredandClaude Sonnet 4.6 baff8b9c3d Add storage-01 bay 7 mapping (phy13, 2TB drive)
Lint / Shell (shellcheck) (push) Successful in 12s
phy13=bay7 verified by physical insertion. Also notes phy11 (23.6T)
is present but bay assignment still unknown.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 20:26:38 -04:00
jaredandClaude Sonnet 4.6 400945e1f7 Fix compute-storage-gpu-01 bay order using serial number verification
Lint / Shell (shellcheck) (push) Successful in 13s
Corrected via sticker serial matching:
  ata-4 → bay 2 (OOS12000G 12TB, serial 000KFN2Q)
  ata-5 → bay 3 (WDC 14TB, serial 9MGHTBMU, bay 3 label "LJ3 204" is a lot code)
  ata-3 → bay 4 (MG08ACP16TE 16TB, serial Z1C0A84SFWXG ✓)
  ata-2 → bay 5 (WD1003FBYX 1TB, serial WD-WCAW32341354 ✓)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 19:44:49 -04:00
jaredandClaude Sonnet 4.6 4e249322f9 Fix compute-storage-gpu-01 mapping: correct PCI address and bay order
Lint / Shell (shellcheck) (push) Successful in 9s
- SATA controller is at 05:00.1, not 02:00.1 (all bays showed EMPTY)
- SATA ports run in reverse order: ata-5=bay2, ata-4=bay3, ata-3=bay4, ata-2=bay5
- Boot SSD (ata-1) sits loose inside chassis; mapped as int-1 instead of a hot-swap bay
- Add int- bay type support: shown in 10bay layout header and included in drive table

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 19:36:43 -04:00
jaredandClaude Sonnet 4.6 cb173aa864 Add CI badge and CI section to README
Lint / Shell (shellcheck) (push) Successful in 13s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 13:07:10 -04:00
jaredandClaude Sonnet 4.6 ae63b45307 ci: add shellcheck lint workflow; fix 6 violations
Lint / Shell (shellcheck) (push) Successful in 14s
Removes unused drive_width variable (SC2034). Splits local+assign
for emmc_size, host, drive (SC2155). Uses ${var#...} instead of sed
for PCI desc parsing (SC2001). Pipes smartctl through sudo tee to fix
redirect privilege (SC2024).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 23:40:41 -04:00
jaredandClaude Opus 4.6 c6ea28c5d6 Add --diagnose flag, remove obsolete helper scripts, fix docs
- Add --diagnose option that shows all PCI paths, storage controllers,
  block devices, and validates current mappings. Replaces the separate
  diagnose-drives.sh script.
- Remove diagnose-drives.sh (incorporated into --diagnose).
- Remove get-serials.sh (redundant with SMART data in main table).
- Remove test-paths.sh (referenced non-existent 0c:00.0 controller).
- Remove todo.md (massively outdated).
- Fix storage controller text overflowing box borders in large1 and
  micro layouts by adding truncation (%-69.69s, %-57.57s).
- Fix chassis name to CX4712 in README.
- Update server mapping statuses from "Requires mapping" to actual
  partially-mapped states.
- Add ⚠ health indicator to README output column docs.
- Update Claude.md metrics to match current state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 18:50:37 -05:00
jaredandClaude Opus 4.6 555ecd54b2 Fix 10-bay ASCII box alignment
Border was 130 columns wide but bay lines were 138. Widened border
and all interior format strings to match the bay content width (136
interior = 138 total). Long controller descriptions are now truncated
to prevent overflow.

Ref #25

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 18:27:33 -05:00
jaredandClaude Opus 4.6 4a98a6f6f8 Add storage-01 HBA bay 5 mapping (phy9)
Verified via ls -la /dev/disk/by-path/ and physical inspection
that HBA SAS3416 phy9 maps to bay 5 (C0 SATA breakout).
Remaining C0 bays 6-8 and C1 bays 9-10 still need drives to verify.

Ref #25

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 18:20:44 -05:00
jaredandClaude Opus 4.6 2177ae9092 Fix local keyword used outside function, document storage-01 HBA layout
- Remove `local` from max_parallel_jobs/job_count (not inside a function)
- Document storage-01 physical layout: mobo SATA ports, HBA Mini-SAS HD
  ports C0-C3, U.2 NVMe serial numbers

Ref #25

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 18:15:45 -05:00
jaredandClaude Opus 4.6 71f83e82c5 Add robustness improvements: bash version check, cleanup trap, hostname sanitization, parallel job limit
- Add bash 4.2+ version check since script uses declare -g -A
- Add cleanup trap (EXIT/INT/TERM) for SMART_CACHE_DIR temp directory
- Sanitize hostname to strip unexpected characters
- Limit parallel SMART collection to 10 concurrent jobs

Fixes #25

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 18:09:40 -05:00
jaredandClaude Opus 4.5 b79c69be99 Fix OSD header regex to match double-digit OSD numbers
The ceph-volume lvm list output varies the number of trailing equals
signs based on OSD number length:
- Single digit: "====== osd.5 =======" (7 equals)
- Double digit: "====== osd.19 ======" (6 equals)

Changed regex to require exactly 6 trailing equals, which matches
both formats.

Fixes: #17

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 20:23:10 -05:00
jaredandClaude Opus 4.5 eb73e03495 Fix temperature parsing with parenthetical data
SMART output for Temperature_Celsius often includes extra sensor data
in parentheses like "26 (0 14 0 0 0)". The previous awk command was
finding "0" from the parenthetical instead of the actual temperature.

Now strips parenthetical content with sed before extracting the last
numeric value.

Fixes: #11

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 20:19:24 -05:00
jaredandClaude Opus 4.5 f3785c13bc Fix temperature parsing for SAS drives
Added support for SAS drive temperature format "Current Drive Temperature:"
and made temperature extraction more robust by:
- Removing ^ anchor that was preventing matches with leading whitespace
- Using awk to find the first numeric value in the line
- Adding explicit SAS drive temperature format handling

Fixes: #11

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 20:14:23 -05:00
jaredandClaude Opus 4.5 7579f371d7 Fix Ceph device parsing to use devices line
The "block device" line in ceph-volume output shows LVM paths like
ceph-xxx/osd-block-xxx, not physical device names. Changed to parse
the "devices" line which contains the actual physical device path
like /dev/sda.

Also reset current_osd after match to avoid duplicate matches.

Fixes: #17

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 20:10:46 -05:00
jaredandClaude Opus 4.5 e6cc9a3853 Fix Rotation Rate regex to handle leading whitespace
The smartctl output has leading whitespace before field names:
  "Rotation Rate:    7200 rpm"

Removed the ^ anchor from the regex so it matches lines with
leading whitespace. This fixes HDD detection for drives that
have proper Rotation Rate fields in their SMART data.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 20:07:35 -05:00
jaredandClaude Opus 4.5 51cc739da5 Add debug logging for Ceph OSD detection
Added log_info messages to show:
- Count of OSDs found
- Each device-to-OSD mapping as discovered

Also fixed array subscript quoting in CEPH_DEVICE_TO_OSD.

Run with --verbose to see Ceph detection diagnostics.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 20:04:49 -05:00
jaredandClaude Opus 4.5 2b9871d887 Fix HDD/SSD detection to be more accurate
Improved device type detection:
- Use anchored regex (^Rotation Rate:) to avoid false matches
- Check for actual RPM values (e.g., "7200 rpm") to confirm HDD
- Only match SSD in model name field, not anywhere in output
- Default to HDD when Rotation Rate field is missing

This fixes drives like WDC WD80EFZZ being incorrectly detected
as SSDs when the Rotation Rate field wasn't being matched.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 20:02:25 -05:00
jaredandClaude Opus 4.5 4a86cdd167 Refactor SMART parsing for parallel collection compatibility
Split SMART data handling into two functions:
- parse_smart_data(): Parses raw smartctl output (no I/O)
- get_drive_smart_info(): Fetches and parses (wrapper)

Changed parallel collection to save raw smartctl output to cache
files, then parse during the display loop. This avoids issues
with function availability in background subshells when running
from process substitution (bash <(curl ...)).

Also fixed:
- Removed orphan code that was outside function scope
- Fixed lsblk caching to use separate calls for SIZE and MOUNTPOINT

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 19:57:37 -05:00
jaredandClaude Opus 4.5 58897b1f3a Fix lsblk caching to properly parse SIZE and MOUNTPOINT
Split lsblk queries into two separate calls:
1. lsblk -dn for disk sizes (whole disk only, simpler parsing)
2. lsblk -rn for mount points (handles partition-to-parent mapping)

This fixes issues where:
- SIZE was empty due to delimiter confusion
- Mount points with spaces caused parsing errors

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 19:54:41 -05:00
jaredandClaude Opus 4.5 fbd9965fb1 Fix 'local' used outside function context
Removed 'local' keyword from colored_warnings variable assignment
in the main script body. The 'local' keyword can only be used
inside functions in bash.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 19:53:22 -05:00
jaredandClaude Opus 4.5 7db30a7bbf Replace hardcoded paths with constants
Added path constant for disk-by-path location:
  DISK_BY_PATH="/dev/disk/by-path"

Updated build_drive_map() to use the constant instead of
hardcoded path strings.

Note: LOG_DIR not added as the script does not currently use
logging to files. Can be added if logging feature is implemented.

Fixes: #24

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 12:18:46 -05:00
jaredandClaude Opus 4.5 6dc0b00efd Add shell safety options (pipefail)
Added 'set -o pipefail' to ensure pipe failures are detected.

Not using -e (errexit) as the script is designed for graceful
degradation when optional tools (smartctl, ceph) are missing.
Many commands intentionally redirect stderr to /dev/null.

Not using -u (nounset) as the script uses ${var:-default}
patterns extensively for optional variables.

Fixes: #23

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 12:18:02 -05:00
jaredandClaude Opus 4.5 09cba482d4 Fix inconsistent variable quoting
Improved quoting consistency throughout the script:
- Array subscripts now quoted: DEVICE_TO_BAY["$device"]="$bay"
- Command substitution quoted: all_bays="$(cmd)"
- Function arguments already fixed in earlier commits

Most variable assignments were already properly quoted. The
remaining unquoted uses (like 'for x in $var') are intentional
for word-splitting on whitespace-separated lists.

Fixes: #22

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 12:17:27 -05:00
jaredandClaude Opus 4.5 11fc60b38b Magic numbers already addressed in earlier fixes
The magic numbers mentioned have been addressed:

- grep -B 20 for Ceph: Fixed in issue #9 with proper block parsing
  in build_ceph_cache() that reads structured output

- awk column 10 for temperature: Fixed in issue #2 with dynamic
  last-numeric-field extraction that doesn't rely on column position

- SMART thresholds: Added as named constants in issue #12:
  SMART_TEMP_WARN, SMART_TEMP_CRIT, SMART_REALLOCATED_WARN, etc.

Fixes: #21

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:47:42 -05:00
jaredandClaude Opus 4.5 3edaafa007 Add documentation for layout generator functions
Added comprehensive docstrings for chassis layout functions:
- generate_10bay_layout(): Sliger CX4712 10-bay chassis
- generate_micro_layout(): Micro SBC (ZimaBoard) layout
- generate_large1_layout(): Rosewill RSV-L4500U 15-bay chassis

Each docstring includes:
- Brief description of what the layout shows
- Arguments with descriptions
- Side effects (build_drive_map call)

Also fixed inconsistent variable quoting in functions.

Fixes: #20

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:47:23 -05:00
jaredandClaude Opus 4.5 7450d79f01 Replace echo -e with printf for portability
Converted all echo -e commands to printf for better portability
across different systems and shells. Printf is POSIX-compliant
and behaves consistently.

Updated functions:
- colorize_health(): Uses printf %b for escape sequences
- colorize_temp(): Uses printf %b for escape sequences
- colorize_header(): Uses printf with newline
- log_error(), log_warn(), log_info(): Uses printf for stderr

Also simplified header output by calling colorize_header directly
since it now handles its own newline.

Fixes: #19

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:45:56 -05:00
jaredandClaude Opus 4.5 6436e9fbb4 Ceph query optimization already implemented in issue #9
The build_ceph_cache() function added in commit 9d39332 already
addresses this issue by:
- Querying ceph-volume lvm list once, building CEPH_DEVICE_TO_OSD map
- Querying ceph osd tree once, building CEPH_OSD_STATUS and CEPH_OSD_IN maps
- Eliminating per-device Ceph queries in the main loop

Fixes: #18

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:42:23 -05:00
jaredandClaude Opus 4.5 59ecb3998b Cache lspci output in get_storage_controllers
The lspci command is now called only once on first invocation of
get_storage_controllers, with results cached in LSPCI_CACHE.

Subsequent calls from different layout generators (10bay, large1,
micro) reuse the cached output, reducing subprocess overhead.

Also added function documentation.

Fixes: #17

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:42:12 -05:00
jaredandClaude Opus 4.5 b61a9305ab Cache lsblk output to reduce redundant calls
Instead of calling lsblk twice per device (once for size, once for
mount points), now performs a single lsblk call at start and caches:
- LSBLK_SIZE: Device sizes
- LSBLK_MOUNTS: Mount points (accumulated for partitions)

This reduces the number of subprocess calls significantly,
especially on systems with many drives.

Fixes: #16

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:41:31 -05:00
jaredandClaude Opus 4.5 05d7fa7e37 Implement parallel SMART data collection for faster execution
SMART queries are now run in parallel using background jobs:
1. First pass launches background jobs for all devices
2. Each job writes to a temp file in SMART_CACHE_DIR
3. Wait for all jobs to complete
4. Second pass reads cached data for display

This significantly reduces script runtime when multiple drives
are present, as SMART queries can take 1-2 seconds each.

Cache directory is automatically cleaned up after use.

Fixes: #15

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:40:20 -05:00
jaredandClaude Opus 4.5 fa7fa296db Add verbose mode for detailed error messages
Added --verbose flag that enables detailed logging:
- log_error(): Always shown, critical errors
- log_warn(): Shown in verbose mode, potential issues
- log_info(): Shown in verbose mode, informational messages

Now provides helpful feedback for:
- SMART query failures with specific error messages
- Missing drive mappings for the current host
- Empty bays (no device at configured PCI path)
- Ceph command availability and query status
- Drive mapping statistics (mapped vs empty)

Color-coded output when using --color with --verbose.

Fixes: #14

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:39:12 -05:00
jaredandClaude Opus 4.5 0eb3e30dba PCI path display already added in issue #10
The --show-pci flag was added in commit 71a4e3b which displays
the PCI path for each drive in the output table.

Fixes: #13

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:36:15 -05:00
jaredandClaude Opus 4.5 2a23a17072 Add SMART threshold warnings for drive health monitoring
New warning detection for concerning SMART values:
- Temperature: Warning at 50°C, Critical at 60°C
- Reallocated sectors: Warning at >= 1
- Pending sectors: Warning at >= 1
- UDMA CRC errors: Warning at >= 100
- Power-on hours: Warning at >= 43800 (5 years)

Health indicator now shows ⚠ when SMART passed but has warnings.
Added WARNINGS column to output showing codes like:
TEMP_WARN, TEMP_CRIT, REALLOC:5, PENDING:2, CRC:150, HOURS:50000

Thresholds are configurable via constants at top of script.

Fixes: #12

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:36:06 -05:00
jaredandClaude Opus 4.5 2befe710d5 Add colored output support with -c/--color flag
When enabled, colors are applied to:
- Headers: Blue/bold for section titles
- Health status: Green for ✓ (passed), Red for ✗ (failed)
- Temperature: Green (<50°C), Yellow (50-59°C), Red (≥60°C)

Added colorize_health, colorize_temp, and colorize_header helper
functions that respect the USE_COLOR flag.

Fixes: #11

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:33:43 -05:00
jaredandClaude Opus 4.5 71a4e3b1fb Add usage/help message and CLI argument parsing
Added comprehensive command-line interface with:
- -h, --help: Show usage information
- -v, --version: Show version
- -d, --debug: Enable debug output
- -s, --skip-smart: Skip SMART data collection (faster)
- --no-ceph: Skip Ceph OSD information
- --show-pci: Display PCI paths for debugging

The script now properly respects these flags throughout execution.

Fixes: #10

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:31:05 -05:00
jaredandClaude Opus 4.5 9d39332df3 Improve Ceph OSD parsing reliability with caching
Replace fragile per-device ceph-volume parsing (grep -B 20) with a
single upfront query that builds lookup tables.

New build_ceph_cache function:
- Parses ceph-volume lvm list output using proper block detection
- Extracts OSD IDs by matching "====== osd.X =======" headers
- Maps block devices to their corresponding OSDs
- Queries ceph osd tree once for all status info
- Creates CEPH_DEVICE_TO_OSD, CEPH_OSD_STATUS, CEPH_OSD_IN arrays

This is both more reliable and more efficient.

Fixes: #9

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:29:04 -05:00
jaredandClaude Opus 4.5 6b4a985b95 Fix mount point detection to include partitions
Use lsblk instead of mount command to detect mount points. This
properly detects mounts on partitions (e.g., /dev/sda1) rather
than only whole-device mounts.

- Shows multiple mount points (up to 3) comma-separated
- Correctly identifies BOOT drives with root partition
- Handles NVMe partition naming (nvme0n1p1, etc.)

Fixes: #8

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:27:43 -05:00
jaredandClaude Opus 4.5 3e74a5a047 Device type detection already fixed in issue #2
The device type detection was updated in commit 90055be to:
- Check for NVMe devices by name prefix first
- Handle "Solid State" and "0 rpm" in Rotation Rate field
- Fall back to checking for SSD/Solid State in SMART output

Fixes: #7

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:27:21 -05:00
jaredandClaude Opus 4.5 b3cf164cc7 Serial number parsing already fixed in issue #2
The serial number parsing was updated in commit 90055be to use
'cut -d: -f2 | xargs' which captures the full serial including
spaces, instead of 'awk {print $3}' which only got the first word.

Fixes: #6

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:27:04 -05:00
jaredandClaude Opus 4.5 16d9280a38 Show NVMe drives with bay mappings in main table
NVMe drives mapped to m2-1, m2-2 slots now appear in the main drive
table with their bay position, instead of in a separate unmapped
section.

- Extended bay loop to include m2-* slots after numeric bays
- NVMe section now only shows truly unmapped NVMe drives
- Mapped NVMe drives show full SMART data like other drives

Fixes: #5

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:26:37 -05:00
jaredandClaude Opus 4.5 ff1486dfe2 Replace bc with awk for floating point comparison
Use awk BEGIN block for comparing Ceph OSD reweight values instead
of bc. Awk is more universally available and the previous fallback
to "echo 0" could incorrectly evaluate to true.

Fixes: #4

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:25:56 -05:00
jaredandClaude Opus 4.5 d104616861 Add dependency checks with helpful error messages
Script now verifies required (lsblk, lspci, etc.) and optional
(smartctl, ceph, bc, nvme) dependencies at startup.

- Exits with clear error if required dependencies are missing
- Warns about missing optional dependencies with reduced functionality
- Directs users to freshStartScript for easy installation
- Checks for sudo access needed for SMART operations

Fixes: #3

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:25:22 -05:00
jaredandClaude Opus 4.5 90055bec81 Fix temperature parsing to handle multiple SMART formats
Temperature parsing now correctly handles:
- SATA Temperature_Celsius attribute (extracts last numeric value)
- Simple "Temperature: XX Celsius" format
- "Current Temperature: XX Celsius" format
- NVMe temperature reporting

Also improved device type detection for NVMe, SSD (including 0 RPM),
and fixed serial number parsing to capture full serial with spaces.

Fixes: #2

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:24:54 -05:00
jaredandClaude Opus 4.5 94c5c7c3b3 Fix inefficient DRIVE_MAP declaration pattern
Declare DRIVE_MAP as global at function start and populate directly,
instead of creating a local array and copying to global. Also added
proper variable quoting and function documentation.

Fixes: #1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 11:23:29 -05:00
jaredandClaude Opus 4.5 f5638cad84 Add storage controller (HBA) info to chassis layout output
Added get_storage_controllers() function that detects SAS, SATA, RAID,
and NVMe controllers via lspci. Updated all layout functions (10bay,
large1, micro) to display detected storage controllers with their
PCI address and model info.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 21:24:23 -05:00
jaredandClaude Opus 4.5 07f7a1d0af Add actual chassis model names
- large1: Rosewill RSV-L4500U (15x 3.5" bays)
- 10-bay servers: Sliger CX4712 (10x 3.5" hot-swap)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 21:16:31 -05:00
jaredandClaude Opus 4.5 01f8d3e692 Update large1 layout to 3x5 front bay grid
- Reflects actual physical layout: 3 stacks x 5 rows (15 bays)
- Added note that physical bay mapping is TBD
- Shows Stack A, B, C columns
- Keeps 2x M.2 NVMe slots

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 21:13:27 -05:00
jaredandClaude Opus 4.5 f159b10de1 Add large1 mappings and update layout
- Add PCI path mappings for large1 (12 SATA/SAS + 2 NVMe drives)
- Update large1 layout to show actual drive assignments
- Controllers: LSI SAS2008 (7), AMD SATA (3), ASMedia SATA (2), NVMe (2)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 21:10:56 -05:00
jaredandClaude Opus 4.5 766d92251e Add micro1 ZimaBoard 832 to mappings
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 21:07:51 -05:00
jaredandClaude Opus 4.5 93aeb84c65 Add micro chassis layout for ZimaBoard and similar SBCs
- Implement generate_micro_layout() for single board computers
- Shows onboard eMMC storage if present
- Shows 2 rear SATA ports
- Add monitor-02 entry (ZimaBoard 832)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 21:05:53 -05:00
jaredandClaude Opus 4.5 d5dbdd7869 Add storage-01 mapping and fix NVMe serial display
- Add PCI path mappings for storage-01 (4 SATA drives on AMD controller)
- Fix NVMe serial: use smartctl instead of nvme list for accurate serial numbers
- NVMe now shows actual serial number instead of /dev/ng device path

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 17:31:05 -05:00
jaredandClaude Opus 4.5 982d3f5c05 Add compute-storage-gpu-01 mapping and fix output formatting
- Add PCI path mappings for compute-storage-gpu-01 (5 SATA + 1 NVMe)
- Fix NVMe drives output formatting (use lsblk for size, parse columns properly)
- Fix Ceph RBD devices output formatting (proper column alignment)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 17:27:08 -05:00
jared 7e1a88ad41 rename 2026-01-07 19:57:09 -05:00
jaredandClaude Sonnet 4.5 40ab528f40 Comprehensive documentation update and AI development notes
Updated README.md:
- Added feature list with emojis for visual clarity
- Documented all output columns with descriptions
- Added Ceph integration details
- Included troubleshooting for common issues
- Updated example output with current format
- Added status indicators ( ⚠️) for server mapping status

Created CLAUDE.md:
- Documented AI-assisted development process
- Chronicled evolution from basic script to comprehensive tool
- Detailed technical challenges and solutions
- Listed all phases of development
- Provided metrics and future enhancement ideas
- Lessons learned for future AI collaboration

This documents the complete journey from broken PCI paths to a
production-ready storage infrastructure management tool.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 16:34:22 -05:00
jaredandClaude Sonnet 4.5 418d4d4170 Fix Ceph OSD status parsing to correctly read up/down and in/out
Fixed parsing of ceph osd tree output:
- Column 5 is STATUS (up/down) not column 6
- Column 6 is REWEIGHT (1.0 = in, 0 = out)
- Now correctly shows up/in for active OSDs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 16:30:21 -05:00
jaredandClaude Sonnet 4.5 1800b59a25 Add Ceph OSD status and boot drive detection
New features:
- Added STATUS column showing Ceph OSD up/down and in/out status
  Format: "up/in", "up/out", "down/in", etc.
- Added USAGE column to identify boot drives and mount points
  Shows "BOOT" for root filesystem, mount point for others, "-" for OSDs
- Improved table layout with all relevant drive information

Now you can see at a glance:
- Which drives are boot drives
- Which OSDs are up and in the cluster
- Any problematic OSDs that are down or out

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 16:28:44 -05:00
jaredandClaude Sonnet 4.5 5430a9242f Add bay-sorted drive table and Ceph OSD tracking
Major enhancements:
- Drive details now sorted by physical bay position (1-10) instead of alphabetically
- Added BAY column to show physical location
- Added CEPH OSD column to show which OSD each drive hosts
- Fixed ASCII art right border alignment (final fix)
- Drives now display in logical order matching physical layout

This makes it much easier to correlate physical drives with their Ceph OSDs
and understand the layout at a glance.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 16:25:56 -05:00
jaredandClaude Sonnet 4.5 fd587eca64 Correct HBA PHY to bay mappings based on verified serial numbers
Fixed bay mappings for HBA-connected drives (5-10):
- Bay 5: phy6 -> sde (serial Z4Y6MJ2Q)
- Bay 6: phy7 -> sdf (serial WD-WCAW37306731) ✓ verified
- Bay 7: phy5 -> sdd (serial WD-WCAW32312416)
- Bay 8: phy2 -> sda (serial ZL2L59XD, 16TB)
- Bay 9: phy4 -> sdc (serial ZL2KE9CM, 16TB)
- Bay 10: phy3 -> sdb (serial WD-WCC4N2FYYCXP) ✓ verified

Mappings verified by matching visible drive serial numbers on
physical bay labels with SMART serial number output.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 16:21:56 -05:00
jaredandClaude Sonnet 4.5 03cb9e3ea8 Fix ASCII art right border alignment
Added extra spacing to align the right border of the chassis box correctly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 16:17:38 -05:00
jaredandClaude Sonnet 4.5 d5c784033e Add serial numbers to drive details output
Changes:
- Added SERIAL column to SATA/SAS drive details table
- Added SERIAL column to NVMe drive details table
- Updated get_drive_smart_info() to extract and return serial numbers
- Widened output format to accommodate serial numbers
- NVMe serials now display correctly from nvme list output

This makes it much easier to match drives to their physical locations
by comparing visible serial numbers on drive labels with the output.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 16:16:04 -05:00
jaredandClaude Sonnet 4.5 be541cba97 Fix ASCII art rendering and correct bay 1 mapping
Fixed issues:
- ASCII art boxes now render correctly with fixed-width layout
- Corrected bay 1 mapping: ata-2 -> bay 1 (sdh SSD confirmed)
- Adjusted mobo SATA port mappings based on physical verification
- Simplified layout to use consistent 10-character wide bay boxes

Bay 1 is confirmed to contain sdh (Crucial SSD boot drive) which maps
to pci-0000:0d:00.0-ata-2, so the mapping has been corrected.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 16:13:17 -05:00
jaredandClaude Sonnet 4.5 1b35db6723 Fix PCI path mappings and line endings for compute-storage-01
Hardware discovered:
- LSI SAS3008 HBA at 01:00.0 (bays 5-10 via mini-SAS HD cables)
- AMD SATA controller at 0d:00.0 (bays 1-4)
- NVMe at 0e:00.0 (M.2 slot)

Changes:
- Updated SERVER_MAPPINGS with correct PCI paths based on actual hardware
- Fixed diagnose-drives.sh CRLF line endings (was causing script errors)
- Updated README with accurate controller information
- Mapped all 10 bays plus M.2 NVMe slot
- Added detailed cable mapping comments from user documentation

The old mapping referenced non-existent controller 0c:00.0. Now uses
actual SAS PHY paths and ATA port numbers that match physical bays.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 16:04:15 -05:00
jaredandClaude Sonnet 4.5 38c3dc910e Refactor Drive Atlas with modular chassis templates and PCI path mapping
Major improvements:
- Separated chassis types from server hostnames for better reusability
- Implemented template-based layout system (10bay, large1)
- Renamed medium2 to compute-storage-01 for clarity
- All three Sliger CX471225 servers now use unified 10bay layout
- Added comprehensive PCI path-based drive mapping system
- Created diagnose-drives.sh helper script for mapping new servers
- Added DEBUG mode for troubleshooting drive mappings

Technical changes:
- Replaced DRIVE_MAPPINGS with separate SERVER_MAPPINGS and CHASSIS_TYPES
- Removed spare-10bay layout (all Sliger chassis use same template)
- Improved drive detection and SMART data collection
- Better error handling for missing drives and unmapped servers
- Cleaner code structure with sectioned comments

Documentation:
- Complete rewrite of README with setup guide and troubleshooting
- Added detailed todo.txt with action plan and technical notes
- Documented Sliger CX471225 4U chassis specifications
- Included step-by-step instructions for mapping new servers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 15:54:53 -05:00
jaredandClaude Sonnet 4.5 657b7d9a2d Refactor Drive Atlas with modular chassis templates and PCI path mapping
Major improvements:
- Separated chassis types from server hostnames for better reusability
- Implemented template-based layout system (10bay, large1, spare-10bay)
- Renamed medium2 to compute-storage-01 for clarity
- Added comprehensive PCI path-based drive mapping system
- Created diagnose-drives.sh helper script for mapping new servers
- Added DEBUG mode for troubleshooting drive mappings
- Documented Sliger CX471225 4U chassis model

Technical changes:
- Replaced DRIVE_MAPPINGS with separate SERVER_MAPPINGS and CHASSIS_TYPES
- Improved drive detection and SMART data collection
- Better error handling for missing drives and unmapped servers
- Cleaner code structure with sectioned comments

Documentation:
- Complete rewrite of README with setup guide and troubleshooting
- Added detailed todo.txt with action plan and technical notes
- Included step-by-step instructions for mapping new servers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-06 15:52:24 -05:00
jared 585240b03f Updated hostnames 2025-07-24 20:28:00 -04:00
jared 94c5311404 more debug 2025-03-03 15:55:26 -05:00
jared 918536e4df more padding 2025-03-01 14:33:42 -05:00
jared 6b93173d9b dynamic box widths 2025-03-01 14:32:10 -05:00
jared f8d5cfa1d4 adjusting spacing on boxes 2025-03-01 14:27:08 -05:00
jared 03d61f284d ascii formatting 2025-03-01 14:25:32 -05:00
jared 8d36842ee4 addjusted collon to space 2025-03-01 14:22:23 -05:00
jared 37ebd0c23f testing change 2025-03-01 14:17:41 -05:00
jared 762be270d5 Reduced code base 2025-03-01 13:53:08 -05:00
jared d3673f022d Updated git_bay_number 2025-03-01 13:40:31 -05:00
jared 9877377bbf updated drive mapping 2025-03-01 13:39:03 -05:00
jared d2b14ed43a added get bay number 2025-03-01 13:34:53 -05:00
jared 54c5955f32 changed physical mapping 2025-03-01 13:31:59 -05:00
jared de1e6148c4 added smart monitoring 2025-03-01 13:22:51 -05:00
jared aa6eca3713 usbs are split 2025-03-01 13:11:59 -05:00
jared 628111f477 added bay numbers 2025-03-01 13:08:32 -05:00
jared ab30387714 /dev/disk/by-path/ mapping 2025-03-01 13:00:53 -05:00
jared 9d29708b64 just drive letters 2025-03-01 12:39:53 -05:00
jared 96b5afae12 sata markdown 2025-03-01 12:35:06 -05:00
jared f592783359 dynamic usb and sata? 2025-03-01 12:28:18 -05:00
jared 351270b886 dynamic ascii art med 2 2025-03-01 12:23:33 -05:00
jared d9a7a13bcd added physical mapping 2025-03-01 12:22:15 -05:00
jared 81d7d17370 added nvme and usb back 2025-03-01 12:17:43 -05:00
jared a6cb3400be Vertical Drive Bays 2025-03-01 12:15:51 -05:00
jared 07e64d50fc sata detection logic 2025-03-01 12:14:14 -05:00