Skip to content

Releases: Muthukumar-Subramaniam/tux2lab

v1.2.1

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 02 Jul 10:52

📢 Release Notes - v1.2.1

Released: July 02, 2026

🐛 Bug Fixes

• Fixed deployed VMs writing new syslog messages with the golden-image hostname instead of the assigned VM hostname

• Fixed golden-image-phase log messages leaking into deployed VMs' /var/log/messages

• Fixed netplan cleanup failing on subdirectories in Ubuntu (/etc/netplan/old)

• Fixed lab-rootfs-extender failing on openSUSE Leap 16+ where hostname command is not available

• Fixed tux2lab golden-image list silently aborting when a disk file is locked by a running VM

✨ Enhancements

• Added tux2lab golden-image rebuild subcommand — single-step workflow to remove and recreate an existing golden image


Full Changelog: v1.2.0...v1.2.1

v1.2.0

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 24 Jun 12:27

📢 Release Notes - v1.2.0

Released: June 24, 2026

✨ Enhancements

openSUSE KVM host supportsetup-qemu-kvm.sh now detects zypper and installs all required packages for openSUSE Leap (tested on 16.0), expanding host support beyond RHEL-based and Ubuntu

Host mode restricted to RHEL-based systemstux2lab deploy now blocks host mode on non-RHEL systems with a clear error, preventing misconfiguration on Ubuntu/openSUSE hosts

tux2lab info command — display lab deployment details (mode, hostname, domain, IPs, status) at a glance

tux2lab sync enhanced — version check with confirmation prompt before syncing, plus automatic re-configuration of the infra server after file sync


Full Changelog: v1.1.0...v1.2.0

v1.1.0

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 22 Jun 02:58

📢 Release Notes - v1.1.0

Released: June 22, 2026

✨ Enhancements

Removed Ansible dependency — entire lab infrastructure configuration replaced with pure Bash (configure-lab-infra-server.sh), eliminating the need for Python, pip, and Ansible on the host

Host-driven VM configuration via SSH — infra server VM is now configured from the KVM host using rsync + SSH, replacing the previous in-VM bootstrap approach

Added tux2lab sync command — push configuration updates to a running infra server VM without full redeploy

SELinux Enforcing mode in host mode — proper targeted contexts applied; SELinux no longer needs to be disabled for lab services to function

DNS zone files relocated to /var/named/ — system-standard path with native SELinux policy, no manual context workarounds required

Bundled git-prompt.sh locally — removed runtime dependency on downloading from GitHub during setup

Modernized output formatting — consistent TASK / INFO / SUCCESS output throughout all scripts

OVMF firmware selection — prefers system-installed firmware path, removed incompatible 4M fallback

🔧 Technical Details

configure-lab-infra-server/ restructured: Ansible playbooks and roles replaced by a single configure-lab-infra-server.sh with modular Bash functions

• DNS zone directory at /var/named/dnsbinder-managed-zone-files/, owned by named:named

• systemd units use /usr/bin/bash for SELinux-compatible execution

httpd_sys_content_t applied to /tux2lab-data and /tux2lab in host mode


Full Changelog: v1.0.0...v1.1.0

v1.0.0

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 03 Jun 04:05

📢 Release Notes - v1.0.0

Released: June 3, 2026

The first stable release of tux2lab — a ground-up rewrite and successor to server-hub.

🚀 What is tux2lab?

tux2lab transforms your Linux workstation into an automated virtual datacenter powered by QEMU/KVM. Deploy, break, and rebuild VMs effortlessly — with PXE boot provisioning, golden image cloning, dynamic DNS, and full lifecycle management through a single CLI.

🔄 Why a New Project?

server-hub (70 releases, v2.1.6) delivered the same core capability — automated VM provisioning with PXE boot, golden images, multi-distro support, DNS management, and full VM lifecycle control. But its internal architecture accumulated limitations that warranted a clean slate rather than incremental fixes:

Naming — "server-hub" was generic and easily confused with other projects. "tux2lab" is distinctive and captures the purpose: Linux (Tux) to Lab.

CLI — server-hub used separate commands (qlabvmctl, qlabstart, qlabhealth, qlabdnsbinder) with no unified entry point. tux2lab consolidates everything under a single tux2lab command with consistent subcommand structure (tux2lab <verb> [noun] [options]).

Directory layout — server-hub scattered state across /server-hub, /kvm-hub, and /iso-files. tux2lab cleanly separates code (/tux2lab) from data (/tux2lab-data).

Host mode — server-hub only supported VM mode. tux2lab adds Host mode for running the lab infrastructure directly on the KVM host — useful for systems with limited RAM.

Lab lifecycle — server-hub had no deploy, destroy, or rebuild commands. tux2lab provides complete lifecycle management with tux2lab deploy, tux2lab destroy, and tux2lab rebuild, plus tux2lab start, tux2lab stop, tux2lab enable, and tux2lab disable for controlling the lab as a unit.

DNS management — server-hub's dnsbinder was basic and fragile. tux2lab ships a significantly improved dnsbinder with file locking, CNAME support, comma-separated bulk operations, --inline mode for scripted use, -q/--query with CNAME target resolution, long-form CLI options, proper exit codes, and race condition fixes.

Guest VM provisioning — server-hub had limited distro selection logic with hardcoded paths. tux2lab introduces centralized version management (distro-versions.conf), automatic PXE-readiness detection, per-distro checksum verification, Ubuntu ISO point-release auto-detection, openSUSE Leap 16.0 Agama installer support, and intelligent menus that only show PXE-ready distros during install. Supported guest distributions: RHEL-based (AlmaLinux, Rocky, Oracle Linux, CentOS Stream, RHEL) versions 10, 9, 8 — Ubuntu Server LTS 26.04, 24.04, 22.04 — openSUSE Leap 16.0, 15.6, 15.5.

VM snapshots — server-hub had no snapshot capability. tux2lab provides full snapshot management — create, list, info, delete, and revert with interactive shutdown handling and auto-start after revert.

VM validation — server-hub had no post-install verification. tux2lab adds tux2lab vm validate which runs real functional tests over SSH — HTTPS CA cert, DNS lookup, sudo, package repos, NTP, and IPv4/IPv6 connectivity.

Concurrency — server-hub had no protection against parallel operations. tux2lab uses atomic directory-based locks with stale PID detection across all critical paths (MAC generation, DNS updates, golden-image builds, VM installs).

Tab completion — server-hub had basic completion. tux2lab provides context-aware per-subcommand completion with positional argument tracking, option deduplication, value-flag suppression, and VM name completion after -H.

Download reliability — server-hub used wget without retry logic. tux2lab uses curl with automatic retry, resume support, checksum verification, and per-distro disk space validation before downloads begin.

Deploy experience — server-hub required manual console exit and two reboots. tux2lab deploys end-to-end unattended — waits for SSH, monitors bootstrap, configures host DNS resolution on the KVM host, and runs a health check automatically.

Deterministic configuration — server-hub prompted for hostname and domain interactively. tux2lab fixes the hostname to tux2lab-engine with domain <user>.internal — zero ambiguity, reproducible deploys.

Stability — 443 commits across 18 releases (v0.1.0 through v0.15.0) followed by three release candidates (v1.0.0-rc1, v1.0.0-rc2, v1.0.0-rc3) — extensive testing and bug fixing across every command covering exit code handling, variable scoping, race conditions, signal traps, error paths, and edge cases that server-hub carried silently.

Lab cleanup — server-hub had no proper destroy or cleanup logic. Removing the lab meant manually stopping services, deleting VMs, unmounting filesystems, and cleaning fstab/environment variables. tux2lab provides a comprehensive tux2lab destroy that handles everything — VMs, storage pools, mounts, services, firewall rules, DNS, fstab entries, environment variables — with idempotent execution and clear [DONE]/[SKIP]/[FAIL] output on every run.

🔧 Technical Highlights

• 100% Bash for all CLI tooling and VM management — Ansible handles configuration management of lab infrastructure services

• Dual-stack networking (IPv4 10.28.28.0/22 + IPv6 ULA fd28:2808:2020:3000::/64) out of the box

• Centralized distro version configuration — add new OS versions in one file

• Lab services: BIND, Kea DHCPv4/v6, radvd, nginx, chrony, NFS, TFTP/iPXE

• Seamless migration from server-hub — automatically detected and cleaned up during deployment

📖 Getting Started

See the README for installation, quick start guide, system requirements, and full CLI reference.


Full Changelog: v0.15.0...v1.0.0

v1.0.0-rc3

v1.0.0-rc3 Pre-release
Pre-release

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 31 May 02:03

📢 Release Notes - v1.0.0-rc3

Released: May 31, 2026

🐛 Bug Fixes

• Fix tab completion failing to show distro names on repeated TAB press
• Fix OVMF NVRAM format issue on libvirt >= 11.6 (raw format now declared explicitly)
• Fix dnsbinder task message formatting in bulk operations
• Fix timer line clearing and skip indicator in setup/deploy output
• Fix dnsbinder exit codes with comma-separated record support

✨ Enhancements

• Add --inline flag to dnsbinder to suppress TUI during bulk operations (used by deploy/setup)
• Add -q/--query option to dns with CNAME target resolution
• Add dns --inline forwarding in VM mode with extra argument validation
• Idempotent package installs with diagnostics in setup/deploy
• Standardised task output and elapsed time display across VM and host mode
• Simplified existing-deployment check in deploy script

📝 Documentation

• Rewrite README intro (no first person, punchier delivery)
• Accurate bullet lists for setup and deploy workflows
• Fix Step 4 deploy description (no longer requires manual console exit)
• Drop outdated health check sample output


Full Changelog: v1.0.0-rc2...v1.0.0-rc3

v1.0.0-rc2

v1.0.0-rc2 Pre-release
Pre-release

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 27 May 03:38

📢 Release Notes - v1.0.0-rc2

Released: May 27, 2026

Release Candidate 2 — Bug fixes and stability improvements discovered during RC1 testing. Comprehensive validation across all tux2lab commands (deploy, destroy, golden-image, dns, vm — including multi-VM operations) with zero regressions. No new features; only bug fixes and polish.

🐛 Bug Fixes

• Fix readonly variable crash when distro-versions.conf is sourced multiple times — added source guard to prevent re-declaration of readonly arrays

• Fix install-golden polluting DHCP/hosts state before verifying golden image exists — added early existence check before any provisioning work begins

• Fix wrong hint syntax in reimage-golden error message — corrected to tux2lab golden-image build <distro> -v <version> (positional arg, not -d)

• Fix snapshot-list exiting 0 when specified VMs don't exist — added has_errors tracking with proper exit 1 on failure

• Fix golden-image build failing on invalid distro/version without clear feedback — added shared validate_distro_version() function used by all install/reimage commands

• Fix enable/disable not handling libvirtd socket units alongside main service

• Fix dnsbinder infinite loop on invalid IPv4 input in bulk-with-IP mode

• Fix tab completion destroy option dedup using substring match instead of exact word matching

• Fix tab completion rebuild option dedup using substring match instead of exact word matching

• Fix tab completion rebuild not deduplicating already-used options

• Fix deploy failing with stale ISO mount — restore ISO mount for --location, add stale mount cleanup and error reporting

• Fix deploy ISO validation skipped — validate infra server ISO before setup work in VM mode

• Fix destroy failing on systems with existing storage pools — remove all storage pools before stopping libvirtd

• Fix destroy host-mode detection and add early exit for clean systems

✨ Enhancements

• Deploy wait loop: add clear-to-EOL escape in printf to prevent text bleed on terminal resize

• Deploy wait loop: show elapsed time during SSH and bootstrap wait

• Deploy mode selection menu: use print_yellow for visual consistency

• Deploy: add inst.stage2=cdrom and inst.repo=cdrom to virt-install extra-args for reliable CDROM boot

🔧 Technical Details

• 17 commits since v1.0.0-rc1

• Full validation sweep: deploy, destroy, golden-image build, all tux2lab vm lifecycle/resize/disk/NIC/snapshot/reimage/remove commands tested in both single-VM and multi-VM configurations

• New shared function: validate_distro_version() in functions/validate-distro-version.sh — centralized distro/version validation used by 5 scripts

• Source guard pattern: [[ -n "${_DISTRO_VERSIONS_CONF_LOADED:-}" ]] && return 0 2>/dev/null || true

• Version bump: 1.0.0-rc1 → 1.0.0-rc2


Full Changelog: v1.0.0-rc1...v1.0.0-rc2

v1.0.0-rc1

v1.0.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 26 May 02:53

📢 Release Notes - v1.0.0-rc1

Released: May 26, 2026

Release Candidate 1 — This is the first release candidate for tux2lab v1.0.0. It represents a feature-complete milestone intended for final validation before the stable release. No new features will be added past this point; only bug fixes discovered during testing will be incorporated into subsequent release candidates (if needed) or the final v1.0.0 release.

✨ New Features

• Full per-subcommand tab completion for all CLI options and flags

• VM name tab completion after -H for existing-VM commands (filesystem-based, no virsh delay)

• Deep validation in health check — all checks now run on the infra server itself

• Service recovery added to tux2lab start in VM mode

• One-shot VM force restart on SSH timeout during start

• Long-form CLI options (--yes, --force, --help) for dnsbinder and dns wrapper

--help added to ksmanager

• GiB value arguments accept trailing g/G suffix (memory, disk sizes)

• VM resize refactored to standard flags (-m/--memory, -c/--cpu, -d/--disk)

golden-image now takes distro as a positional argument (consistent with tux2lab distro)

• Kea DHCP service-sockets-max-retries for PXE boot race fix

🐛 Bug Fixes

• Tab completion blocked after subcommands due to -* guard — removed

• SSH pre-check (ConnectTimeout=5) added to run-ksmanager to fail fast on unreachable server

• Security & correctness fixes across kvm-* scripts (variable quoting, error paths, unset traps)

• DHCPv6 socket detection: replaced grep word-boundary with ss sport filter

• DNS exit code handling: || exit_code pattern replaced swallowed returns

--yes flag not forwarded in dns.sh file-based SSH path

kvm-validate.sh excluded infra server by short name instead of FQDN

• Workflow bugs: temp file leaks, SSH readiness race, virsh hang, state cleanup

reboot_vm task pattern and resize indentation fixes

• Kea service-sockets-max-retries placement corrected

✨ Enhancements

• Renamed tux2lab-lab-infra.servicetux2lab.service

• Renamed "KVM Lab Infra" → "tux2lab Infra" consistently across all scripts

• Centralized Ubuntu codename mapping in distro-versions.conf

• Tab completion sources distro-versions.conf as single source of truth for distros and versions

• Completion preserves newest-first version order with compopt -o nosort

• Value-flag suppression refactored to whitelist boolean flags only

• UI consistency pass: standardized messages, prompts, and formatting across all commands

• Restructured health check: deep validation first, dual-stack port checks second

start delegates port checks and recovery to health

start/stop: standardized success messages

destroy: rejects duplicate flags, filters used flags from completion, cleaned up summary output

rebuild: consolidated print calls into multi-line strings, uses print_cyan for data

health: improved curl failure diagnostics, removed dead nc check

🔧 Technical Details

• 42 commits since v0.15.0

• Tab completion system completely overhauled — context-aware per-subcommand with positional argument tracking

• All kvm-* scripts audited for unquoted variables, missing error checks, and inconsistent patterns

• Version bump: 0.15.0 → 1.0.0-rc1


Full Changelog: v0.15.0...v1.0.0-rc1

v0.15.0

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 22 May 22:32

📢 Release Notes - v0.15.0

Released: May 23, 2026

✨ New Features

• Lab DNS resolves on the KVM host immediately after VM-mode deploy — no more need to run tux2lab dns separately

  • resolvectl dns and resolvectl domain configured on labbr0 after bootstrap completes

• Bootstrap wait now shows expected duration so users know the deploy isn't stuck

🐛 Bug Fixes

• VMs now receive their correct reserved IP during PXE boot instead of a random pool address

  • Kea Control Agent password was randomly generated by Ansible each run but ksmanager used a hardcoded value — config-set API returned 401 silently
  • Fixed: deterministic password (localhost-only socket, no security impact)
  • Fixed: curl -f flag added so HTTP errors are detected instead of swallowed

tux2lab distro setup ubuntu-lts no longer fails with garbled download URLs

  • print_info inside fn_get_iso_url wrote to stdout, which $() captured and concatenated into the URL
  • Fixed: all messages in that function redirected to stderr (>&2)

✨ Enhancements

tux2lab destroy in VM mode no longer shows 12+ irrelevant [SKIP] lines for host-mode services

  • Entire host-mode block suppressed when no host-mode artifacts detected (checks services, dummy-vnet, chrony drop-in, named.conf, /etc/environment)

• Kea DHCP temp config directory no longer grows unbounded

  • Previous run's timestamped files purged at start of fn_update_kea_dhcp_reservations; last run's pair retained for debugging

Full Changelog: v0.14.0...v0.15.0

v0.14.0

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 22 May 14:56

📢 Release Notes - v0.14.0

Released: May 22, 2026

✨ New Features

• Auto-detect Ubuntu ISO point release at download time — prepare-distro-for-ksmanager.sh now scrapes the Ubuntu release directory and picks the latest point release ISO automatically, eliminating hardcoded filenames that break on Ubuntu's rolling point releases

• Show lab info banner and run health check after host-mode deploy — matches VM-mode post-deployment experience with hostname, domain, IPs, subnets, gateways, and health.sh verification

🐛 Bug Fixes

• Fix host-mode tux2lab destroy failing with "read-only file system" — the read-only bind mount at /tux2lab-data/tux2lab was never unmounted before rm -rf, and its fstab entry was never cleaned

• Fix /etc/named.conf not cleaned during destroy — older dnsbinder releases used different marker formats; now unconditionally removes the file (entirely generated by dnsbinder, recreated fresh on next deploy)

• Fix dnsbinder.sh crashing on fresh deploy after destroy — cp of non-existent named.conf failed under set -euo pipefail; backup step is now conditional

• Fix /etc/environment polluted after destroy — dnsbinder_*, mgmt_super_user, and mgmt_interface_name variables persisted across destroy/deploy cycles, causing stale configuration

• Fix host-mode cleanup entirely skipped on repeated destroy runs — service stop/disable block was gated on lab_infra_server_mode_is_host sourced from an env vars file that previous runs already wiped

• Fix fstab cleanup only removing iso9660 entries — bind mount entries (/tux2lab-data/tux2lab ... bind,ro) were left behind; now removes all /tux2lab-data/ fstab entries unconditionally

✨ Enhancements

• Destroy script is now fully idempotent with transparent output — every step shows [DONE], [FAIL], or [SKIP] on every run; no more silent skipping or false "completed" counts

• Context-aware destroy summary: "Lab is already clean — nothing left to destroy" when all steps are skipped, vs "Lab has been completely destroyed" on first run, vs warning message when failures occur

• Firewalld cleanup only marks completed if trusted sources were actually removed

/tux2lab-data/ wipe only marks completed if directory has content beyond iso-files/

🔧 Technical Details

• All destroy cleanup (named.conf, /etc/environment, fstab, mounts) moved to unconditional pre-wipe section — immune to missing lab_environment_vars from partial previous runs

• Host-mode service detection removed entirely — service loop runs unconditionally, checking each service individually via systemctl is-enabled / is-active

findmnt --list --output TARGET with deepest-first sort for safe recursive unmount of nested mounts under /tux2lab-data/

• Ubuntu ISO auto-detection uses curl + regex ubuntu-${version}(\.[0-9]+)?-live-server-amd64\.iso with sort -V | tail -1 to pick the highest point release


Full Changelog: v0.13.0...v0.14.0

v0.13.0

Choose a tag to compare

@Muthukumar-Subramaniam Muthukumar-Subramaniam released this 22 May 12:34

📢 Release Notes - v0.13.0

Released: May 22, 2026

✨ Enhancements

• Hardcoded infra server hostname to tux2lab-engine with domain ${USER}.internal — deterministic FQDN, no user prompts, removes all CNAME aliases
• Deploy now calls setup-qemu-kvm.sh --yes automatically when libvirtd or the tux2lab network is unavailable, eliminating manual pre-deploy setup
setup-qemu-kvm.sh accepts --yes flag for non-interactive invocation
vm validate "Lab yum repo" check now matches domain-derived repo names (e.g., musubram-internal-almalinux-baseos)

🐛 Bug Fixes

• Fix tux2lab distro download-infra-iso failing when run before first deploy — command dispatch order restructured
• Fix Anaconda installer hanging at "Trying to detect CD-ROM automatically" on AlmaLinux 10 — dracut's inst.repo=cdrom pre-mount conflicted with Anaconda's source module re-mount; replaced with kickstart cdrom directive
• Fix deploy failing with "Failed to connect socket to libvirt-sock" after destroy — setup-qemu-kvm.sh now uses systemctl restart with socket readiness polling instead of enable --now
• Fix stale SSL certs and chrony markers left by predecessor project (server-hub) cleanup

🔧 Technical Details

• Anaconda 40.x (RHEL 10) source module deadlock: dracut mounts CDROM at /run/install/repo via inst.repo=cdrom, then Anaconda's payload module tries to mount the same device at /run/install/sources/mount-0000-cdrom and hangs on auto-detection; kickstart cdrom directive bypasses auto-detection entirely
setup-qemu-kvm.sh polls virsh version up to 30 seconds after restart to confirm socket is accepting connections before defining networks
• Hostname simplification removes all interactive prompts from deploy configuration — FQDN is always tux2lab-engine.${USER}.internal
kvm-validate.sh derives repo grep pattern from lab_infra_domain_name via ${lab_infra_domain_name//./-} (e.g., musubram.internalmusubram-internal)


Full Changelog: v0.12.0...v0.13.0