#!/bin/bash # sync-keyence.sh - Push Keyence per-model bootstrap bundles to the PXE share. # # Mirrors sync-waxtrace.sh / sync-cmm.sh pattern. For each Keyence model # (vr3000, vr5000, vr6000) ships the manifest + installer payload (MSI + cabs # + drivers) from the local workstation to # /srv/samba/enrollment/installers-post/keyence// on the PXE server. # # This becomes visible as \\172.16.9.1\enrollment\installers-post\keyence\ # so startnet.cmd can selectively xcopy the chosen model bundle onto the # target disk during WinPE phase (W:\KeyenceInstall, becomes C:\KeyenceInstall # post-reboot). # # Run on the workstation any time: # - A per-model manifest changes # - Big installer payloads (Data1.cab, etc) change # # Big payloads (Data1.cab, Data11.cab, MSIs) live in the repo under # playbook/shopfloor-setup/gea-shopfloor-keyence//installers/ but # are gitignored. Stage them locally from the ripped ISOs in # /home/camp/pxe-images/iso/keyence/ before running this script. # # Requires: sshpass, scp, ssh 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}" KEYENCE_DIR="$PROJECT_ROOT/playbook/shopfloor-setup/gea-shopfloor-keyence" REMOTE_DIR="/srv/samba/enrollment/installers-post/keyence" REMOTE_TEMP="/tmp/keyence-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 for f in 09-Setup-Keyence.ps1 vr3000/manifest.json vr5000/manifest.json vr6000/manifest.json; do test -f "$KEYENCE_DIR/$f" || { echo "Missing $KEYENCE_DIR/$f"; exit 1; } done echo "==> Staging tree locally" STAGE="$(mktemp -d -p /tmp keyence-stage.XXXXXX)" trap "rm -rf $STAGE" EXIT for model in vr3000 vr5000 vr6000; do mkdir -p "$STAGE/$model/installers" cp "$KEYENCE_DIR/$model/manifest.json" "$STAGE/$model/" if [ -d "$KEYENCE_DIR/$model/installers" ]; then cp -a "$KEYENCE_DIR/$model/installers/." "$STAGE/$model/installers/" 2>/dev/null || true fi if [ -d "$KEYENCE_DIR/$model/drivers" ]; then mkdir -p "$STAGE/$model/drivers" cp -a "$KEYENCE_DIR/$model/drivers/." "$STAGE/$model/drivers/" fi sz=$(du -sh "$STAGE/$model" | cut -f1) echo " $model: $sz" done echo "==> Local stage size: $(du -sh $STAGE | cut -f1)" 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 Keyence PC picks up the new bundles."