123 lines
7.4 KiB
Markdown
Executable File
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
|