DriveStage/CHANGELOG.md

7.4 KiB
Executable File

Changelog

All notable changes to this project are documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

[0.4.0] - 2026-08-29

Added

  • DriveStage project naming — the prior codename carried a trademark conflict; the rename is deliberate and complete across source, docs, install paths, partition labels, GRUB cfg identifiers, env vars, lock files, and git remote URL
  • BlkStage is the formal name for the internal bash backend (the blkstage.sh engine)
  • Internal PAYLOAD_CATEGORIES table in the bash engine — single source of truth for both list_payloads and scan_payloads summary (eliminates 4 near-duplicate if-compgen+for blocks)
  • is_critical_mount() helper in the bash engine — single case statement replaces the inner for cm in $critical_mounts; do if [[ ... ]]; fi; done loop in guard_root_disk
  • install_grub2() and resolve_install_argv() helpers in gui/src/core/bootloader.rs — step-down dispatch replaces the nested if-then-return + match-with-inline-early-return pattern
  • Iterator-chain form of is_disk_safe_to_wipe() in gui/src/core/disk.rs — single expression replaces nested for-loop+if

Changed

  • Public project name: BootPrep → DriveStage
  • Internal backend name: (informal) → BlkStage (formal)
  • Engine file: scripts/bootprep.sh → scripts/blkstage.sh (and gui/assets/blkstage.sh)
  • GUI binary: bootprep-gui → drivestage-gui
  • Install path: /usr/local/lib/bootprep/ → /usr/local/lib/drivestage/
  • Mount base: /mnt/bootprep → /mnt/drivestage
  • Config file: /etc/bootprep.conf → /etc/drivestage.conf
  • Lock file: /var/lock/bootprep.lock → /var/lock/drivestage.lock
  • Env var: BOOTPREP_SH → DRIVESTAGE_SH
  • Partition labels: BOOTPREP / BOOTPREP-EFI → DRIVESTAGE / DRIVESTAGE-EFI
  • GRUB cfg identifiers: mb_iso_entry / mb_rootfs_entry / mb_payload_uuid → ds_iso_entry / ds_rootfs_entry / ds_payload_uuid
  • Extraction marker: .mb_extracted → .ds_extracted
  • iced application id: dev.bootprep.gui → dev.drivestage.gui
  • Git remote URL: dcosnet/BootPrep → dcosnet/DriveStage
  • check_commands GRUB binary check uses step-down command -v ... || command -v ... || missing+=(...) instead of an if ! cmd1 && ! cmd2; then block
  • grub_install_cmd uses step-down command -v ... && { printf ...; return; } instead of if/elif/else cascade
  • unmount_all consolidates inline p1/p3 resolution into a single for p in step-down
  • bootloader.rs::install reordered to a clean step-down sequence: GRUB2 dispatch → resolve argv → run → generate configs
  • is_disk_safe_to_wipe rewritten as a single iterator-chain expression with flat_map().any() instead of nested for c in &disk.children { for m in &c.mountpoints { if critical_mounts.iter().any(...) { return false; } } }
  • LICENSE extended with a Project Naming section documenting DriveStage + BlkStage
  • Author email info@dcos.net added to all author references (docs, source comments, Cargo manifests, LICENSE, GUI about panel)
  • BLOG.md phrasing updated: "accumulated workarounds" → "accumulated design constraints of that era"

Removed

  • Stale reference to emit_iso_menuentry function in README.md (the function was removed in v0.2.0 per QA-8)
  • Stale "v0.2.0 experimental" warning in README.md (superseded by v0.4.0)

Security

  • No new findings. The trademark conflict motivating the rename did not involve any code-execution or privilege-escalation vector.

[0.3.0] - 2026-08-14

Added

  • Bootloader config generation for non-GRUB2 bootloaders — systemd-boot (loader.conf + entry stubs), Limine (limine.conf), and rEFInd (refind.conf) are now automatically generated from discovered payloads after binary install
  • New gui/src/core/config_gen.rs module — table-driven config generation with distro detection and filename sanitization
  • Loop device smoke test (scripts/test_loop_device.sh) — end-to-end test on a sparse loop device covering setup → list → clean with partition, mount, grub.cfg, and BOOTX64.EFI verification
  • cargo-audit step in CI workflow — security vulnerability scanning via rustsec/audit-check
  • Expanded Rust unit test suite — 16 tests across disk.rs, payload.rs, and config_gen.rs covering parse_lsblk_size, NVMe JSON parsing, is_disk_safe_to_wipe, is_tarball_ext, kind_rank ordering, payload size formatting, config generation, and distro detection

Changed

  • Bootloader install now generates config files automatically after binary install for non-GRUB2 bootloaders
  • BootloaderPage UI shows config generation status in the install completion message
  • GRUB2 install message clarifies it uses boot-time auto-scan (no host-side config needed)

Fixed

  • Non-GRUB2 bootloaders previously installed binaries but generated no config files — now fully functional

[0.2.0] - 2026-08-14

Added

  • Boot-time auto-scan grub.cfg — GRUB discovers payloads at boot, no host-side scan required for ISOs
  • Bootloader switcher in GUI (GRUB2, systemd-boot, Limine, rEFInd)
  • Custom menuentry editor in GUI
  • Drive diagnostics tab (SMART, partition table, filesystem info)
  • --version flag on the bash script
  • grub_install_cmd() resolver — handles grub-install vs grub2-install naming
  • LVM/LUKS/mdadm detection in guard_root_disk via lsblk PKNAME chain
  • Cleanup trap on EXIT/INT/TERM
  • Flock-based concurrent invocation protection
  • Free-space check before rsync in deploy_payload
  • .mb_extracted idempotency marker for tarball extraction
  • test_distro_detection.sh — 30 distro pattern tests
  • CI/CD pipeline (GitHub Actions)
  • CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, CODEOWNERS
  • Makefile with dist/release targets
  • Root Cargo.toml workspace manifest

Changed

  • GRUB install failures are now fatal (prevents unbootable drives)
  • GRUB regexp cascade is now case-insensitive (--ignore-case)
  • unmount_all is now recursive (umount -R)
  • ESP no longer sets LegacyBIOSBootable GPT attribute
  • check_commands now verifies wipefs, blockdev, partprobe, udevadm
  • CONF_FILE sourcing now validates ownership and mode
  • Fedora install instructions: added grub2-tools, grub2-common
  • Arch install instructions: replaced non-existent pcboot with efibootmgr
  • Cargo.toml repository URL corrected to dcosnet/BootPrep (renamed to dcosnet/DriveStage in v0.4.0)
  • Rust list_payloads refactored to table-driven approach
  • Rust PayloadKind now derives Copy, PartialEq, Eq

Fixed

  • LICENSE typo "grantsofar" → "granted, free of charge"
  • GRUB --checkpoint=.100 → --checkpoint=100 --checkpoint-action=dot
  • Cargo.toml placeholder repo URL
  • Missing test_distro_detection.sh (was referenced in README but didn't exist)

Security

  • guard_root_disk now detects LVM/LUKS/mdadm-backed root filesystems
  • CONF_FILE now requires root ownership and mode 0644 or stricter
  • Sudo password wrapped in Zeroizing (zeroized on drop)

[0.1.0] - 2026-08-14

Added

  • Initial release
  • Single-file bash engine (bootprep.sh at the time; renamed to blkstage.sh in v0.4.0) with 6 subcommands: setup, deploy, scan, list, shell, clean
  • GPT partition layout: ESP (FAT32) + BIOS Boot (1MB) + Payloads (ext4)
  • Dual-target GRUB2 install (x86_64-efi + i386-pc)
  • Boot-time auto-scan grub.cfg with 30+ distro patterns
  • Rust + Iced GUI companion app (experimental)
  • Dark tech utility theme
  • README.md, QUICKSTART.md, BLOG.md, LICENSE