diff --git a/playbook/pxe_server_setup.yml b/playbook/pxe_server_setup.yml index cf7934c..daa3ca2 100644 --- a/playbook/pxe_server_setup.yml +++ b/playbook/pxe_server_setup.yml @@ -332,6 +332,7 @@ - 80 - 4433 - 445 + - 9009 - name: "Enable UFW firewall" ufw: @@ -409,8 +410,8 @@ content: | ProxyPreserveHost On - ProxyPass /manage http://127.0.0.1:5000/ - ProxyPassReverse /manage http://127.0.0.1:5000/ + ProxyPass /manage http://127.0.0.1:9009/ + ProxyPassReverse /manage http://127.0.0.1:9009/ - name: "Enable Apache proxy modules" diff --git a/test-vm.sh b/test-vm.sh new file mode 100755 index 0000000..81a2e6e --- /dev/null +++ b/test-vm.sh @@ -0,0 +1,174 @@ +#!/bin/bash +# +# test-vm.sh — Create a test VM to validate the PXE server setup +# +# This script: +# 1. Builds a CIDATA ISO with autoinstall config, packages, playbook, and webapp +# 2. Creates an isolated libvirt network (pxe-test, 10.9.100.0/24) +# 3. Launches an Ubuntu 24.04 Server VM that auto-installs and configures itself +# +# Usage: +# ./test-vm.sh /path/to/ubuntu-24.04-live-server-amd64.iso +# +# After install completes (~10-15 min), access the webapp at: +# http://10.9.100.1:9009 +# +# To watch progress: +# virsh console pxe-test +# +# To clean up: +# ./test-vm.sh --destroy + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +VM_NAME="pxe-test" +NET_NAME="pxe-test" +VM_DISK="/var/lib/libvirt/images/${VM_NAME}.qcow2" +CIDATA_ISO="/tmp/${VM_NAME}-cidata.iso" +VM_RAM=4096 +VM_CPUS=2 +VM_DISK_SIZE=40 # GB + +# --- Handle --destroy flag --- +if [ "${1:-}" = "--destroy" ]; then + echo "Destroying test environment..." + virsh destroy "$VM_NAME" 2>/dev/null || true + virsh undefine "$VM_NAME" --remove-all-storage 2>/dev/null || true + virsh net-destroy "$NET_NAME" 2>/dev/null || true + virsh net-undefine "$NET_NAME" 2>/dev/null || true + rm -f "$CIDATA_ISO" + echo "Done." + exit 0 +fi + +# --- Validate Ubuntu ISO argument --- +UBUNTU_ISO="${1:-}" +if [ -z "$UBUNTU_ISO" ] || [ ! -f "$UBUNTU_ISO" ]; then + echo "Usage: $0 /path/to/ubuntu-24.04-live-server-amd64.iso" + echo "" + echo "Download from: https://ubuntu.com/download/server" + echo "" + echo "Other commands:" + echo " $0 --destroy Remove the test VM and network" + exit 1 +fi + +echo "============================================" +echo "PXE Server Test VM Setup" +echo "============================================" +echo "" + +# --- Step 1: Build CIDATA ISO --- +echo "[1/4] Building CIDATA ISO..." +CIDATA_DIR=$(mktemp -d) + +# Autoinstall config +cp "$SCRIPT_DIR/autoinstall/user-data" "$CIDATA_DIR/user-data" +touch "$CIDATA_DIR/meta-data" + +# Offline .deb packages +if [ -d "$SCRIPT_DIR/offline-packages" ]; then + mkdir -p "$CIDATA_DIR/packages" + cp "$SCRIPT_DIR/offline-packages/"*.deb "$CIDATA_DIR/packages/" 2>/dev/null || true + echo " Copied $(ls -1 "$CIDATA_DIR/packages/"*.deb 2>/dev/null | wc -l) .deb packages" +else + echo " WARNING: No offline-packages/ directory. Run download-packages.sh first." +fi + +# Ansible playbook +mkdir -p "$CIDATA_DIR/playbook" +cp "$SCRIPT_DIR/playbook/"* "$CIDATA_DIR/playbook/" 2>/dev/null || true +echo " Copied playbook/" + +# Webapp +if [ -d "$SCRIPT_DIR/webapp" ]; then + mkdir -p "$CIDATA_DIR/webapp" + cp "$SCRIPT_DIR/webapp/app.py" "$SCRIPT_DIR/webapp/requirements.txt" "$CIDATA_DIR/webapp/" + cp -r "$SCRIPT_DIR/webapp/templates" "$SCRIPT_DIR/webapp/static" "$CIDATA_DIR/webapp/" + echo " Copied webapp/" +fi + +# Pip wheels +if [ -d "$SCRIPT_DIR/pip-wheels" ]; then + cp -r "$SCRIPT_DIR/pip-wheels" "$CIDATA_DIR/pip-wheels" + echo " Copied pip-wheels/" +fi + +# Boot tools +if [ -d "$SCRIPT_DIR/boot-tools" ]; then + cp -r "$SCRIPT_DIR/boot-tools" "$CIDATA_DIR/boot-tools" + echo " Copied boot-tools/" +fi + +# Generate the CIDATA ISO +genisoimage -output "$CIDATA_ISO" -volid CIDATA -joliet -rock "$CIDATA_DIR" 2>/dev/null +CIDATA_SIZE=$(du -sh "$CIDATA_ISO" | cut -f1) +echo " CIDATA ISO: $CIDATA_ISO ($CIDATA_SIZE)" +rm -rf "$CIDATA_DIR" + +# --- Step 2: Create isolated network --- +echo "" +echo "[2/4] Setting up isolated network ($NET_NAME)..." + +# Check if network already exists +if virsh net-info "$NET_NAME" &>/dev/null; then + echo " Network $NET_NAME already exists, reusing." +else + cat > /tmp/${NET_NAME}-net.xml < + ${NET_NAME} + + + +NETEOF + virsh net-define /tmp/${NET_NAME}-net.xml + virsh net-start "$NET_NAME" + rm -f /tmp/${NET_NAME}-net.xml + echo " Created isolated network 10.9.100.0/24 (no DHCP, no NAT)" +fi + +# --- Step 3: Create VM disk --- +echo "" +echo "[3/4] Creating VM disk (${VM_DISK_SIZE}GB)..." +if [ -f "$VM_DISK" ]; then + echo " Disk already exists. Destroy first with: $0 --destroy" + exit 1 +fi +qemu-img create -f qcow2 "$VM_DISK" "${VM_DISK_SIZE}G" + +# --- Step 4: Launch VM --- +echo "" +echo "[4/4] Launching VM ($VM_NAME)..." +virt-install \ + --name "$VM_NAME" \ + --memory "$VM_RAM" \ + --vcpus "$VM_CPUS" \ + --disk path="$VM_DISK",format=qcow2 \ + --cdrom "$UBUNTU_ISO" \ + --disk path="$CIDATA_ISO",device=cdrom \ + --network network="$NET_NAME" \ + --os-variant ubuntu24.04 \ + --graphics none \ + --console pty,target_type=serial \ + --extra-args "console=ttyS0,115200n8 autoinstall" \ + --noautoconsole + +echo "" +echo "============================================" +echo "VM launched! The autoinstall will take ~10-15 minutes." +echo "============================================" +echo "" +echo "Watch progress:" +echo " virsh console $VM_NAME" +echo " (Press Ctrl+] to detach)" +echo "" +echo "After install + first boot:" +echo " SSH: ssh pxe@10.9.100.1" +echo " Webapp: http://10.9.100.1:9009" +echo "" +echo "Manage:" +echo " virsh start $VM_NAME" +echo " virsh shutdown $VM_NAME" +echo " $0 --destroy (remove everything)" +echo "" diff --git a/webapp/app.py b/webapp/app.py index 4820709..b282f13 100644 --- a/webapp/app.py +++ b/webapp/app.py @@ -929,4 +929,4 @@ def inject_globals(): # --------------------------------------------------------------------------- if __name__ == "__main__": - app.run(host="0.0.0.0", port=5000, debug=False) + app.run(host="0.0.0.0", port=9009, debug=False)