DriveStage/CHANGELOG.md

123 lines
7.4 KiB
Markdown
Executable File

# Changelog
All notable changes to this project are documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [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<String> (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