The cat heredoc inside cloud-init runcmd was indented, causing the
shebang line to become " #!/bin/bash" (with leading spaces) which
makes the script fail to execute as a proper interpreter.
Fixed by removing indentation from the heredoc body. Also improved
the error message to explain that the clone likely failed during
provisioning and show the manual clone command.
Added tmux kill-session before starting new session to avoid
"duplicate session" errors on re-run.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Arch Linux cloud image ignores Proxmox's --ciuser/--cipassword
and the cloud-init chpasswd module depending on version. The previous
approach had three conflicting methods fighting each other.
Fixed by:
- Removed --ciuser/--cipassword from qm set (they conflict with snippet)
- Removed chpasswd cloud-init module (unreliable on Arch)
- Set users: [] to disable cloud-init's default user module
- ALL user setup now done via runcmd (runs as root, always works):
- Sets root password to 'darkforge' as fallback
- Creates darkforge user via useradd + chpasswd
- Grants passwordless sudo via /etc/sudoers.d/
- Enables PermitRootLogin yes as safety net
- Package install via explicit pacman commands instead of packages: module
(Arch cloud-init packages module can be unreliable)
- Added pacman-key --init/--populate before package install
Login credentials:
user: darkforge password: darkforge
user: root password: darkforge (fallback)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Arch Linux cloud images disable SSH password authentication by default.
Added cloud-init directives to:
- Enable ssh_pwauth
- Set the darkforge user password via chpasswd (plaintext, non-expiring)
- Write /etc/ssh/sshd_config.d/99-darkforge.conf enabling PasswordAuthentication
- Restart sshd after config is written
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests now run inside a tmux session so you can disconnect and
reconnect without interrupting multi-hour test runs.
Changes:
- create-vm.sh: cloud-init no longer auto-runs tests, just provisions
packages and clones the repo. Installs a `darkforge-test` command
in /usr/local/bin that wraps run-in-vm.sh in tmux.
- run-in-vm.sh: detects when called as `darkforge-test` and re-execs
inside a tmux session named "darkforge". --tmux flag for internal use.
- README updated with tmux workflow (detach/reattach instructions).
Workflow:
ssh darkforge@<ip>
darkforge-test --quick # starts in tmux
Ctrl+B D # detach, go do other things
tmux attach -t darkforge # come back later
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dpack fixes:
- Fixed missing SourceInfo fields in CRUX/Gentoo converters (git, branch,
tag, commit, update_check fields added to struct initializers)
- Added 'sign' command: downloads source tarballs and computes real SHA256
checksums, updating .toml definitions in-place. Replaces placeholder
checksums. Usage: dpack sign zlib or dpack sign all
Testing:
- tests/run-tests.sh: comprehensive integration test runner for Arch Linux
host. 7 test suites covering host env, dpack build/tests, package defs,
toolchain scripts, kernel config, init system, and QEMU boot.
Generates JSON + text reports for automated debugging.
Usage: bash tests/run-tests.sh [--quick]
ISO builders:
- src/iso/build-iso-arch.sh: builds live ISO from Arch Linux host
Creates rootfs from pre-built base system or busybox fallback,
includes installer + dpack + package repos, UEFI-only boot
- src/iso/build-iso-darkforge.sh: builds live ISO from running DarkForge
Snapshots the live system via rsync, creates redistributable ISO
Package repository (submodule updated):
- 14 new self-hosting packages: qemu, edk2-ovmf, squashfs-tools,
xorriso, mtools, efibootmgr, efivar, rsync, lz4, nasm,
neovim, htop, tmux, libevent
- Total: 138 packages across 4 repos
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>