#!/bin/bash # sync-waxtrace.sh - Push Wax/Trace (Mitutoyo FormTracePak) bootstrap bundle # to the PXE server enrollment share. # # Copies waxtrace-manifest.json + 09-Setup-WaxAndTrace.ps1 (from the # gea-shopfloor-waxtrace/ tree) plus the big binary payload (captured master # zip + reg + HASP + VC++ redists + per-machine cal ISOs) from the local # workstation to /srv/samba/enrollment/installers-post/waxtrace on the PXE # server. That directory becomes visible as # \\172.16.9.1\enrollment\installers-post\waxtrace so startnet.cmd can xcopy # it onto the target disk during WinPE phase (W:\WaxTrace-Install, becomes # C:\WaxTrace-Install post-reboot). # # Run this on the workstation any time: # - waxtrace-manifest.json changes # - 09-Setup-WaxAndTrace.ps1 changes # - A new cal ISO is added under /home/camp/pxe-images/iso/mitutoyo-cal/ # - Prereqs (VC++, HASP) are updated # - FormTracePak vendor ISO is bumped (default v6.213, override with $FTPAK_ISO) # # Usage: # ./playbook/sync-waxtrace.sh # # Requires: sshpass, scp, ssh, gzip (already in captured/reg/). set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" PXE_HOST="${PXE_HOST:-172.16.9.1}" PXE_USER="${PXE_USER:-pxe}" PXE_PASS="${PXE_PASS:-pxe}" WAXTRACE_DIR="$PROJECT_ROOT/playbook/shopfloor-setup/gea-shopfloor-waxtrace" CAL_ISO_DIR="${MITUTOYO_CAL_DIR:-/home/camp/pxe-images/iso/mitutoyo-cal}" REMOTE_DIR="/srv/samba/enrollment/installers-post/waxtrace" REMOTE_TEMP="/tmp/waxtrace-stage-$$" ssh_run() { sshpass -p "$PXE_PASS" ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR "$PXE_USER@$PXE_HOST" "$@" } scp_to() { sshpass -p "$PXE_PASS" scp -o StrictHostKeyChecking=no -o LogLevel=ERROR "$@" } # Sanity check test -f "$WAXTRACE_DIR/waxtrace-manifest.json" || { echo "Missing $WAXTRACE_DIR/waxtrace-manifest.json"; exit 1; } test -f "$WAXTRACE_DIR/09-Setup-WaxAndTrace.ps1" || { echo "Missing 09-Setup-WaxAndTrace.ps1"; exit 1; } test -d "$WAXTRACE_DIR/captured-binary/prereqs" || { echo "Missing $WAXTRACE_DIR/captured-binary/prereqs (VC++/HASP installers)"; exit 1; } echo "==> Staging tree locally" STAGE="$(mktemp -d -p /tmp waxtrace-stage.XXXXXX)" trap "rm -rf $STAGE" EXIT mkdir -p "$STAGE/prereqs" "$STAGE/calibrations" "$STAGE/formtracepak" cp "$WAXTRACE_DIR/waxtrace-manifest.json" "$STAGE/" cp "$WAXTRACE_DIR/09-Setup-WaxAndTrace.ps1" "$STAGE/" # Arrow-key picker invoked from startnet.cmd. Reads INDEX.csv to build the # menu, falls back to free-text prompt if it errors. Lives next to the # calibrations dir since it depends on INDEX.csv being adjacent. if [ -f "$WAXTRACE_DIR/select-waxtrace-asset.ps1" ]; then cp "$WAXTRACE_DIR/select-waxtrace-asset.ps1" "$STAGE/" fi # Bay-config CSV + resolver. startnet.cmd invokes resolve-bay-config.ps1 in # WinPE to pick the right FTPak version per bay. resolver reads bay-config.csv # from this share (or W:\WaxTrace-Install\) and writes # W:\Enrollment\waxtrace\{version,model,userid}.txt. if [ -f "$WAXTRACE_DIR/bay-config.csv" ]; then cp "$WAXTRACE_DIR/bay-config.csv" "$STAGE/" fi if [ -f "$WAXTRACE_DIR/resolve-bay-config.ps1" ]; then cp "$WAXTRACE_DIR/resolve-bay-config.ps1" "$STAGE/" fi cp "$WAXTRACE_DIR/captured-binary/prereqs/"*.exe "$STAGE/prereqs/" # FormTracePak vendor installer ISOs - all available versions get pushed. # startnet.cmd cherry-picks the matching FORMTRACEPAK-V.iso based on # bay-config.csv lookup, xcopies just that one to the local disk (~2 GB). # Total on PXE share: ~12 GB; per-bay xcopy: ~2 GB. FTPAK_ISO_DIR="${FTPAK_ISO_DIR:-/home/camp/pxe-images/iso}" FTPAK_COUNT=0 for iso in "$FTPAK_ISO_DIR"/FORMTRACEPAK-V*.iso; do [ -f "$iso" ] || continue cp "$iso" "$STAGE/formtracepak/" FTPAK_COUNT=$((FTPAK_COUNT+1)) done if [ "$FTPAK_COUNT" -eq 0 ]; then echo "WARNING: no FORMTRACEPAK-V*.iso in $FTPAK_ISO_DIR - bays cannot install at imaging time." else echo "Staged $FTPAK_COUNT FormTracePak version ISO(s) from $FTPAK_ISO_DIR" fi # Cal ISOs - one per wax/trace bay if [ -d "$CAL_ISO_DIR" ]; then cp "$CAL_ISO_DIR"/CAL-*.iso "$STAGE/calibrations/" 2>/dev/null || true cp "$CAL_ISO_DIR/INDEX.csv" "$STAGE/calibrations/" 2>/dev/null || true fi echo "==> Local stage size: $(du -sh $STAGE | cut -f1)" ls "$STAGE/" ls "$STAGE/prereqs/" ls "$STAGE/formtracepak/" 2>/dev/null || echo "(no FormTracePak ISO)" ls "$STAGE/calibrations/" 2>/dev/null || echo "(no cal ISOs)" echo "==> Pushing to $PXE_USER@$PXE_HOST:$REMOTE_TEMP" ssh_run "rm -rf '$REMOTE_TEMP' && mkdir -p '$REMOTE_TEMP'" scp_to -r "$STAGE/." "$PXE_USER@$PXE_HOST:$REMOTE_TEMP/" echo "==> Atomic move into $REMOTE_DIR" ssh_run "echo $PXE_PASS | sudo -S bash -c ' mkdir -p $(dirname $REMOTE_DIR) if [ -d $REMOTE_DIR ]; then mv $REMOTE_DIR ${REMOTE_DIR}.pre-\$(date +%Y%m%d-%H%M%S) fi mv $REMOTE_TEMP $REMOTE_DIR chown -R pxe:pxe $REMOTE_DIR ls -la $REMOTE_DIR '" echo "==> Done. Next imaged Wax/Trace PC picks up the new bundle."