Commit graph

102 commits

Author SHA1 Message Date
s8n
09f7c1f753 build: wire 30-apply-v03-theme.sh into ks %post + SSH key auto-inject in run-vm.sh (#1)
Co-authored-by: veilor-org <admin@veilor.org>
2026-05-02 04:38:23 +01:00
s8n
408a0e4862 feat(installer): pre-stage gum-based UX assets for v0.5.1 (#7)
Drops in branded assets the v0.5.1 installer rewrite (whiptail -> gum)
will consume: ASCII banner, sourceable GUM_* env-var palette matching
the veilor-black KDE color scheme, and an INSTALLER.md walkthrough.

The existing v0.5.0 veilor-installer script is intentionally untouched
so the swap can land in a separate, focused PR.

Co-authored-by: s8n-ru <279801990+s8n-ru@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-02 04:38:18 +01:00
s8n
d543e71f74 v0.5.1 build: vendor gum + graft /veilor/ onto ISO (#8)
* v0.5.1 build: vendor gum binary + graft /veilor/ onto ISO

- gum 0.17.0 pinned by sha256, downloaded into overlay/usr/local/bin/
  so installer can use Charm.sh TUI primitives.
- After livecd-creator produces ISO, extract+re-pack with /veilor/
  containing overlay+scripts+assets so installer-generated ks can
  copy them into target system at install time.

* fix: extract original ISO boot stanza programmatically (no hardcoded paths)

Reviewer found `-e images/efiboot.img` was wrong — Fedora livecd-creator
places efiboot.img in isolinux/ not images/. Plus missing
--mbr-force-bootable + -partition_* flags would produce hybrid MBR/GPT
mismatch refused by some BIOS firmwares.

Fix: extract original ISO's exact boot stanza via
`xorriso -report_el_torito as_mkisofs` and replay it via eval.
Guarantees exact match, immune to upstream Fedora layout changes.

---------

Co-authored-by: veilor-org <admin@veilor.org>
2026-05-02 04:33:44 +01:00
s8n
2d6f6b07f6 ci: quote $@ in tuned profile scripts (SC2068) (#10)
Pre-existing shellcheck failure blocking all PR merges. Standard
"double-quote array expansions" fix. No behavior change.

Co-authored-by: veilor-org <admin@veilor.org>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-02 04:17:22 +01:00
s8n
b4b5d7c007 ci: scope brand-leak lint to source dirs only (#6)
Lint flagged false positives on audit reports + CHANGELOG that
self-reference forbidden strings as findings. Restrict scan to
kickstart/, overlay/, scripts/, assets/, build/ — actual ship state.

Co-authored-by: veilor-org <admin@veilor.org>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-02 04:07:03 +01:00
s8n
a7e7d6e10c docs: CHANGELOG v0.2.0-v0.2.5, README rewrite, ROADMAP, release notes update (#5)
Co-authored-by: veilor-org <admin@veilor.org>
2026-05-02 03:42:39 +01:00
veilor-org
fc7c3f858b v0.5.0-beta: fix 4 installer blockers found during lint
Bugs found by agent linter on v0.5.0-alpha:

1. logvol missing --size: ksvalidator rejected. Added --size=8192 --grow.
2. bootloader --location=mbr on UEFI: conflicts with /boot/efi part.
   Switched to --location=none (anaconda auto-detects EFI vs BIOS).
3. lsblk awk truncated multi-word disk models ("WD PC SN740" → "WD").
   Now collapses model spaces to underscores, preserves full string.
   Also added mmcblk to disk regex (eMMC support).
4. Heredoc with $VAR expansion + passwords containing $/`/" corrupted
   generated ks. Now: single-quoted heredoc + sed placeholder
   substitution. Plus input validator rejects "$\` chars in passwords.

ksvalidator clean on sample generated ks.
bash -n clean.

CI build still in flight (3328ffb). This pushes a new commit; CI will
run again with these fixes. Net delay: zero (3328ffb's installer was
broken anyway, so its ISO unusable for install path).
2026-05-02 03:42:15 +01:00
veilor-org
3328ffb460 v0.5.0-alpha: TTY1 installer (omarchy/archinstall-style)
Adds:
- overlay/usr/local/sbin/veilor-installer — bash+whiptail TUI
- overlay/etc/systemd/system/getty@tty1.service.d/veilor-installer.conf
  → replaces tty1 login with installer
- ks: newt + parted + cryptsetup + lvm2 + btrfs-progs packages
- ks: systemctl set-default multi-user.target (TTY1 lands first; user
  picks "Try live — desktop" from menu to isolate graphical.target)
- ks: chmod +x veilor-installer in chroot %post

Flow:
1. Boot ISO → TTY1 → ASCII banner + menu:
   1) Install to disk    2) Try live — desktop   3) Try live — shell
   4) Reboot             5) Power off
2. Install path: collects disk/hostname/LUKS/admin pw/locale via whiptail,
   generates /run/install/veilor-generated.ks, execs anaconda --kickstart=
3. Reboots into hardened install with full init_on_alloc/free cmdline

Known limitations (v0.5.0-alpha):
- Generated ks doesn't yet copy overlay/scripts into target (anaconda
  installs base Fedora, missing veilor branding/hardening). Fix in v0.5.1.
- whiptail = ugly. v0.5.1 swaps to gum (Go TUI) for omarchy-tier UX.
- No mid-install progress bar; anaconda runs unattended in same tty.
2026-05-02 03:20:42 +01:00
veilor-org
ebf0032559 v0.2.7: fix SDDM autostart + blank-pw login
- display-manager.service symlink: livecd-creator skips alias creation
  vs Anaconda installer; without it sddm stays inactive at graphical.target
- admin user: replace `passwd -d` with throwaway pw `veilor` + chage -d 0
  (SDDM rejects blank pw by default, breaks first-login flow)

Tested in QEMU v0.2.5: confirmed sddm enabled but inactive after boot,
and blank-pw login at SDDM returns "Login Failed".
2026-05-02 03:08:08 +01:00
veilor-org
d5d3fdd89b chore: gitignore agent worktrees + un-track accidental embedded repos 2026-05-02 01:08:14 +01:00
veilor-org
22928b0a83 v0.2.6: drop '(Fedora 43 base)' from PRETTY_NAME; chown -R 0:0 overlay (cp -a preserved CI uid 1001 → sudo refused sudoers.d) 2026-05-02 01:08:03 +01:00
veilor-org
8515bdbe38 ks: drop init_on_alloc/init_on_free from live cmdline (5x boot time on KVM)
Live ISO stalled at dracut for 5+min on KVM with init_on_alloc=1
init_on_free=1 — kernel zeroes every page on alloc/free, brutal in
virtualized memory. Keep slab_nomerge + lockdown=integrity +
randomize_kstack + vsyscall=none for live (cheap). Re-add memory
init flags on installed system via veilor-firstboot post-install
GRUB edit (planned v0.3).
2026-05-01 23:23:35 +01:00
veilor-org
a23ce6310a ci: patch livecd-creator __get_efi_image_stanza LABEL → CDLABEL
Upstream bug in /usr/lib/python3.14/site-packages/imgcreate/live.py:
  if self._isDracut:
      args["rootlabel"] = "live:LABEL=%(fslabel)s"   # WRONG
  else:
      args["rootlabel"] = "CDLABEL=%(fslabel)s"

For dracut path on EFI grub it writes `root=live:LABEL=...` but
dracut needs `live:CDLABEL=...` to look up ISO9660 by CD volume id.
Result: parse-livenet hook stalls indefinitely.

CI now sed-patches the file in-place before build. Reported upstream
livecd-tools as separate task.
2026-05-01 21:26:34 +01:00
veilor-org
ef54a246f0 v0.2.3: os-release branding + admin user creation in %post
- kde-theme-apply.sh: search /etc/os-release.d/veilor (where overlay
  put it) before falling back to $REPO/overlay path. Rewire symlinks
  cleanly: /etc/os-release → ../usr/lib/os-release.
- Kickstart: useradd admin in chroot %post since livecd-creator skips
  the `user` directive (no installer phase). Blank pw + expired = forced
  reset at first login same as before.
2026-05-01 18:25:57 +01:00
veilor-org
3408841822 ks: %post --nochroot loosened error handling + nochroot trace log
Found via debugfs: overlay copy succeeds (veilor-power, tuned profiles,
sshd-hardening, sudoers, systemd units all present in v0.2.1 rootfs) but
`mkdir + cp assets/scripts` aborted with set -eu — leaves /usr/share/
veilor-os missing → all chroot %post scripts fail. Switch to set +e on cp
plus persist trace log to /var/log/veilor-nochroot.log for next debug.
2026-05-01 15:21:22 +01:00
veilor-org
9c6136f01f ks: %post --nochroot uses $INSTALL_ROOT (livecd-creator) — was hardcoded /mnt/sysimage
Bug confirmed by inspecting v0.2.0 ISO: rootfs symlinks /etc/os-release →
../usr/lib/os-release (stock Fedora), no /usr/share/veilor-os, no overlay
files, /var/log/veilor-install.log shows %post chroot couldn't find any
script because %post --nochroot copy targeted /mnt/sysimage (livemedia-creator
path) instead of livecd-creator's INSTALL_ROOT.
2026-05-01 11:48:30 +01:00
veilor-org
7c4a94d763 ci: tmpdir on /var (host ext4, 80GB+) instead of /tmp tmpfs (16GB cap)
POSTTRANS ldconfig hit ENOSPC/ROFS — KDE install + dnf cache + scriptlet
working set exceeds 16G tmpfs. Move livecd-creator tmpdir to /var/lmc on
runner's host ext4 disk.
2026-04-30 17:55:08 +01:00
veilor-org
eeb54942a9 ks: switch fedora/updates repos to direct baseurl (mirrorlist 404s during CDN sync) 2026-04-30 17:24:43 +01:00
veilor-org
1daaefd857 v0.3 theme: strip onyx refs from comments (use 'reference system'); lint: filter self-referencing grep patterns 2026-04-30 17:19:12 +01:00
veilor-org
d2649fb335 v0.3 theme: match onyx exactly — solid black wallpaper, Linux Konsole scheme, Breeze_Light cursor
Onyx uses Plasma's org.kde.color plugin for solid #000000 (no SVG/image),
default Konsole 'Linux' palette, Breeze_Light cursor, IAX kwin buttons.
Removed wallpaper SVG (not used). Added plasma-desktop.conf snippet +
kdedefaults override for new users.
2026-04-30 17:18:14 +01:00
veilor-org
084582e0e5 ks: add upstream live plumbing + explicit base repo
Agent A: missing livesys-scripts + anaconda-live = lorax can't build EFI/BOOT.
Agent B: livecd-creator ignores url=, only reads repo.repoList — added
explicit repo --name=fedora to feed it the base.

Both Fedora's own pipeline + livecd-creator now have what they need.
Live image plumbing in %post: enable livesys.service livesys-late.service
tmp.mount, reset machine-id.
2026-04-30 17:07:24 +01:00
veilor-org
3e6cd79f81 ci: switch livemedia-creator → livecd-creator (purpose-built for live ISOs, handles EFI/BOOT) 2026-04-30 16:38:49 +01:00
veilor-org
314a24f584 ks: add grub2-efi-x64-modules + xorriso for EFI/BOOT grafting
Past grub2-mkimage. Failed at xorrisofs final ISO assembly because EFI/BOOT
dir not built — needs grub2-efi-x64-modules to compile standalone grubx64.efi.
2026-04-30 15:48:57 +01:00
veilor-org
5dea325a0c ks: add grub2-pc + grub2-pc-modules + tools-extra + syslinux + isomd5sum
CI made it through full install, configure, %post, squashfs build,
initrd rebuild — failed at final boot.iso wrap because grub2-mkimage
needed /usr/lib/grub/i386-pc/moddep.lst (BIOS legacy boot modules).
Hybrid BIOS+UEFI ISO requires both grub variants.
2026-04-30 15:07:04 +01:00
veilor-org
5f650d45d8 ks: %post --nochroot — multi-path overlay source detection (/work CI, /run/install/repo virt, kickstart-relative no-virt) 2026-04-30 14:14:07 +01:00
veilor-org
c62a5489f2 ci: pre-create /tmp/veilor-lmc, strip fix-repo line for CI run
Local builds need fix-repo because host has stale libselinux vs newer pcre2.
CI fresh container has matched libs, fix-repo unnecessary and refs invalid
(file:///tmp/veilor-fix-repo not present in CI). sed strips that ks line.
2026-04-30 14:04:18 +01:00
veilor-org
86b3a6fa7a ci: switch refs from veilorveilor-org (GH org slug); domain veilor.org 2026-04-30 13:59:20 +01:00
veilor
d44e9bbdd9 ci: github actions workflow (build-iso + lint), CONTRIBUTING, CODEOWNERS, PR template
CI builds in fresh Fedora 43 container — matched pcre2/libselinux/selinux-policy
versions, no fix-repo hack needed. Container starts every run from clean
state, no zombie collisions. Fastest path to first green ISO.
2026-04-30 13:56:03 +01:00
veilor
b3ddf7040a ks: drop veilor-firstboot/veilor-modules-lock from services line — enabled in %post after overlay 2026-04-30 13:44:51 +01:00
veilor
1e595a8d38 build: revert to --no-virt (kernel modules locked); host anaconda patched to ignore non-fatal RC=5 2026-04-30 13:11:50 +01:00
veilor
e1e392098f ks: add local fix-repo (file:///tmp/veilor-fix-repo) — pcre2 10.47 + selinux-policy 43.7 paired, cost=1 forces selection 2026-04-30 12:04:49 +01:00
veilor
8e851406d0 ks: includepkgs on updates repo (selinux-policy/pcre2/libselinux only) + cost=10 2026-04-30 11:16:30 +01:00
veilor
b3b5ce0b08 ks: swap install source to updates repo (base has pcre2/selinux-policy version skew) 2026-04-30 11:07:35 +01:00
veilor
10ee8d33e4 ks: updates repo cost=500 vs base default 1000 — force latest selinux-policy + pcre2 2026-04-30 10:45:58 +01:00
veilor
31c1af4aec ks: hardcode releasever=43, add --install on updates repo, add updates-testing — base ships outdated selinux-policy 2026-04-30 10:07:58 +01:00
veilor
e965b148f5 ks: SELinux permissive at build (PCRE2 mismatch); enforcing+relabel at first boot 2026-04-30 09:43:33 +01:00
veilor
238e461553 ks: keep KDE deps (cups/geoclue2/MM/PackageKit) — mask daemons at runtime instead 2026-04-30 04:31:49 +01:00
veilor
ec79dc1746 ks: keep avahi-libs/pcsc-lite — daemons disabled at runtime, libs broadly required 2026-04-30 04:24:20 +01:00
veilor
b5a11f5eab build: stop pre-deleting /tmp/veilor-lmc — let livemedia-creator own its tmp 2026-04-30 04:21:12 +01:00
veilor
8176f117cd build: pivot to host-native lorax — container fight btrfs+netavark, host clean path 2026-04-30 04:18:37 +01:00
veilor
4e1ccdbb1a build: switch ISO run to rootful podman — rootless can't losetup (host CAP_SYS_ADMIN rejection) 2026-04-30 04:16:07 +01:00
veilor
d5c8638de5 build: bind /dev + disable selinux relabel — losetup needs host loop devices 2026-04-30 04:14:28 +01:00
veilor
1d5147ba11 ks: simplify to live rootfs partitioning — installer ks (LUKS) split planned v0.2.1 2026-04-30 04:12:26 +01:00
veilor
3b5341c77a ks: drop text display mode — livemedia-creator forbids 2026-04-30 04:11:46 +01:00
veilor
671b0dc38a build: rm stale resultdir + tmp before each run (livemedia-creator refuses dirty dest) 2026-04-30 04:08:49 +01:00
veilor
3c2fec042f ks: add dracut-live + grub2/shim/efibootmgr — required by livemedia-creator --make-iso 2026-04-30 04:08:08 +01:00
veilor
ff3a8297ae build: replace invalid --title flag with --volid VEILOR_OS 2026-04-30 04:07:18 +01:00
veilor
33a0673126 test: add VM runner — qemu+OVMF wrapper for fast iso iteration loop 2026-04-30 04:06:19 +01:00
veilor
f6a89d16f1 ks: drop removed auth cmd, collapse multiline part/logvol, drop unsupported --hash flag 2026-04-30 04:03:10 +01:00
veilor
f1b44bc218 fonts: swap DuckSans → Fira Code (Fedora fira-code-fonts, SIL OFL 1.1) 2026-04-30 03:57:17 +01:00