175 lines
6.1 KiB
Bash
Executable File
175 lines
6.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Parse command line arguments
|
|
INSTALL_MODE=false
|
|
SCHEMATIC_ID_OVERRIDE=""
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--install)
|
|
INSTALL_MODE=true
|
|
shift
|
|
;;
|
|
--schematic-id)
|
|
SCHEMATIC_ID_OVERRIDE="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
echo "Usage: $0 [--install] [--schematic-id SCHEMATIC_ID]"
|
|
echo " --install Copy bundle to DNSMasq server and run installation"
|
|
echo " --schematic-id ID Use specific schematic ID instead of config default"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Initialize Wild Cloud environment
|
|
if [ -z "${WC_ROOT}" ]; then
|
|
print "WC_ROOT is not set."
|
|
exit 1
|
|
else
|
|
source "${WC_ROOT}/scripts/common.sh"
|
|
init_wild_env
|
|
fi
|
|
|
|
# ---
|
|
|
|
SOURCE_DIR="${WC_ROOT}/setup/dnsmasq"
|
|
DNSMASQ_SETUP_DIR="${WC_HOME}/setup/dnsmasq"
|
|
BUNDLE_DIR="${DNSMASQ_SETUP_DIR}/setup-bundle"
|
|
mkdir -p "${BUNDLE_DIR}"
|
|
|
|
|
|
# Create local templates.
|
|
|
|
if [ -d "${DNSMASQ_SETUP_DIR}" ]; then
|
|
echo "Warning: ${DNSMASQ_SETUP_DIR} already exists"
|
|
read -p "Overwrite? (y/N): " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
echo "Skipping dnsmasq setup"
|
|
else
|
|
rm -rf "${DNSMASQ_SETUP_DIR}"
|
|
cp -r "${SOURCE_DIR}" "${DNSMASQ_SETUP_DIR}"
|
|
find "${DNSMASQ_SETUP_DIR}" -type f \( -name "*.yaml" -o -name "*.ipxe" -o -name "*.conf" \) | while read -r file; do
|
|
echo "Processing: ${file}"
|
|
wild-compile-template < "${file}" > "${file}.tmp" && mv "${file}.tmp" "${file}"
|
|
done
|
|
echo "Successfully created dnsmasq setup files from templates."
|
|
fi
|
|
else
|
|
cp -r "${SOURCE_DIR}" "${DNSMASQ_SETUP_DIR}"
|
|
find "${DNSMASQ_SETUP_DIR}" -type f \( -name "*.yaml" -o -name "*.ipxe" -o -name "*.conf" \) | while read -r file; do
|
|
echo "Processing: ${file}"
|
|
wild-compile-template < "${file}" > "${file}.tmp" && mv "${file}.tmp" "${file}"
|
|
done
|
|
echo "Successfully created dnsmasq setup files from templates."
|
|
fi
|
|
|
|
# Create setup bundle.
|
|
|
|
# Copy iPXE bootloader to ipxe-web from cached assets.
|
|
echo "Copying Talos PXE assets from cache..."
|
|
PXE_WEB_ROOT="${BUNDLE_DIR}/ipxe-web"
|
|
mkdir -p "${PXE_WEB_ROOT}/amd64"
|
|
cp "${DNSMASQ_SETUP_DIR}/boot.ipxe" "${PXE_WEB_ROOT}/boot.ipxe"
|
|
|
|
# Get schematic ID from override or config
|
|
if [ -n "$SCHEMATIC_ID_OVERRIDE" ]; then
|
|
SCHEMATIC_ID="$SCHEMATIC_ID_OVERRIDE"
|
|
echo "Using schematic ID from command line: $SCHEMATIC_ID"
|
|
else
|
|
SCHEMATIC_ID=$(wild-config cluster.nodes.talos.schematicId)
|
|
if [ -z "$SCHEMATIC_ID" ] || [ "$SCHEMATIC_ID" = "null" ]; then
|
|
echo "Error: No schematic ID found in config"
|
|
echo "Please run 'wild-setup' first to configure your cluster"
|
|
echo "Or specify one with --schematic-id option"
|
|
exit 1
|
|
fi
|
|
echo "Using schematic ID from config: $SCHEMATIC_ID"
|
|
fi
|
|
|
|
# Define cache directories using new structure
|
|
CACHE_DIR="${WC_HOME}/.wildcloud"
|
|
SCHEMATIC_CACHE_DIR="${CACHE_DIR}/node-boot-assets/${SCHEMATIC_ID}"
|
|
PXE_CACHE_DIR="${SCHEMATIC_CACHE_DIR}/pxe"
|
|
IPXE_CACHE_DIR="${SCHEMATIC_CACHE_DIR}/ipxe"
|
|
|
|
# Check if cached assets exist
|
|
KERNEL_CACHE_PATH="${PXE_CACHE_DIR}/amd64/vmlinuz"
|
|
INITRAMFS_CACHE_PATH="${PXE_CACHE_DIR}/amd64/initramfs.xz"
|
|
|
|
if [ ! -f "${KERNEL_CACHE_PATH}" ] || [ ! -f "${INITRAMFS_CACHE_PATH}" ]; then
|
|
echo "Error: Talos PXE assets not found in cache for schematic ID: ${SCHEMATIC_ID}"
|
|
echo "Expected locations:"
|
|
echo " Kernel: ${KERNEL_CACHE_PATH}"
|
|
echo " Initramfs: ${INITRAMFS_CACHE_PATH}"
|
|
echo ""
|
|
echo "Please run 'wild-cluster-node-image-create' first to download and cache the assets."
|
|
exit 1
|
|
fi
|
|
|
|
# Copy Talos PXE assets from cache
|
|
echo "Copying Talos kernel from cache..."
|
|
cp "${KERNEL_CACHE_PATH}" "${PXE_WEB_ROOT}/amd64/vmlinuz"
|
|
echo "✅ Talos kernel copied from cache"
|
|
|
|
echo "Copying Talos initramfs from cache..."
|
|
cp "${INITRAMFS_CACHE_PATH}" "${PXE_WEB_ROOT}/amd64/initramfs.xz"
|
|
echo "✅ Talos initramfs copied from cache"
|
|
|
|
# Copy iPXE bootloader files from cache
|
|
echo "Copying iPXE bootloader files from cache..."
|
|
FTPD_DIR="${BUNDLE_DIR}/pxe-ftpd"
|
|
mkdir -p "${FTPD_DIR}"
|
|
|
|
# Check if iPXE assets exist in cache
|
|
IPXE_EFI_CACHE="${IPXE_CACHE_DIR}/ipxe.efi"
|
|
IPXE_BIOS_CACHE="${IPXE_CACHE_DIR}/undionly.kpxe"
|
|
IPXE_ARM64_CACHE="${IPXE_CACHE_DIR}/ipxe-arm64.efi"
|
|
|
|
if [ ! -f "${IPXE_EFI_CACHE}" ] || [ ! -f "${IPXE_BIOS_CACHE}" ] || [ ! -f "${IPXE_ARM64_CACHE}" ]; then
|
|
echo "Error: iPXE bootloader assets not found in cache for schematic ID: ${SCHEMATIC_ID}"
|
|
echo "Expected locations:"
|
|
echo " iPXE EFI: ${IPXE_EFI_CACHE}"
|
|
echo " iPXE BIOS: ${IPXE_BIOS_CACHE}"
|
|
echo " iPXE ARM64: ${IPXE_ARM64_CACHE}"
|
|
echo ""
|
|
echo "Please run 'wild-cluster-node-image-create' first to download and cache the assets."
|
|
exit 1
|
|
fi
|
|
|
|
# Copy iPXE assets from cache
|
|
cp "${IPXE_EFI_CACHE}" "${FTPD_DIR}/ipxe.efi"
|
|
cp "${IPXE_BIOS_CACHE}" "${FTPD_DIR}/undionly.kpxe"
|
|
cp "${IPXE_ARM64_CACHE}" "${FTPD_DIR}/ipxe-arm64.efi"
|
|
echo "✅ iPXE bootloader files copied from cache"
|
|
|
|
|
|
cp "${DNSMASQ_SETUP_DIR}/nginx.conf" "${BUNDLE_DIR}/nginx.conf"
|
|
cp "${DNSMASQ_SETUP_DIR}/dnsmasq.conf" "${BUNDLE_DIR}/dnsmasq.conf"
|
|
cp "${DNSMASQ_SETUP_DIR}/setup.sh" "${BUNDLE_DIR}/setup.sh"
|
|
|
|
# Copy setup bundle to DNSMasq server and install (only if --install flag is provided)
|
|
if [ "$INSTALL_MODE" = true ]; then
|
|
echo "Installing DNSMasq setup on remote server..."
|
|
|
|
SERVER_HOST=$(wild-config cloud.dns.ip) || exit 1
|
|
SETUP_DIR="${WC_HOME}/setup/dnsmasq/setup-bundle"
|
|
DESTINATION_DIR="~/dnsmasq-setup"
|
|
|
|
echo "Copying DNSMasq setup files to ${SERVER_HOST}:${DESTINATION_DIR}..."
|
|
scp -r ${SETUP_DIR}/* root@${SERVER_HOST}:${DESTINATION_DIR}
|
|
|
|
# Run setup script on the DNSMasq server.
|
|
echo "Running setup script on ${SERVER_HOST}..."
|
|
ssh root@${SERVER_HOST} "cd ${DESTINATION_DIR} && ./setup.sh" || {
|
|
echo "Error: Failed to run setup script on ${SERVER_HOST}"
|
|
exit 1
|
|
}
|
|
|
|
echo "DNSMasq installation completed successfully on ${SERVER_HOST}"
|
|
else
|
|
echo "DNSMasq setup bundle created successfully at ${BUNDLE_DIR}"
|
|
echo "Run with --install flag to copy bundle to server and install"
|
|
fi |