ecda528b90
Build scripts, configuration, and launch scripts for the Hermes Portable Rescue runtime. Includes: - build-hermes-runtime.sh — Main build script (venv, config, tools) - bootstrap-venv.sh — Standalone Python venv builder - config.yaml — Agent configuration for rescue mode - launch.sh/launch.ps1 — Linux and Windows entry points - agent/hermes — Entry point for autorun.sh compatibility - tool-manifest.json — Tool registry for diagnostic binaries - scripts/ — check-env.sh, mount-storage.sh helpers - autorun.inf — Windows USB auto-launch - README — Build and runtime documentation Part of the Hermes Portable Rescue project board. Task: t_c816e37d
86 lines
3.0 KiB
Bash
Executable File
86 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# Hermes Portable Rescue — Storage Mount Helper
|
|
# =============================================================================
|
|
# Mounts NTFS/BTRFS/ext4 partitions for diagnostic access.
|
|
# Usage: ./scripts/mount-storage.sh [--all | --probe]
|
|
# =============================================================================
|
|
set -euo pipefail
|
|
|
|
MOUNT_BASE="/mnt/hermes-data"
|
|
PROBE_ONLY=false
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--probe) PROBE_ONLY=true; shift ;;
|
|
--all) PROBE_ONLY=false; shift ;;
|
|
*) echo "Usage: $0 [--all | --probe]"; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
mkdir -p "$MOUNT_BASE"
|
|
|
|
echo "[hermes:mount] Probing storage devices…"
|
|
|
|
# List all block devices
|
|
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,LABEL 2>/dev/null | grep -v loop | head -20
|
|
|
|
if [[ "$PROBE_ONLY" = true ]]; then
|
|
echo ""
|
|
echo "[hermes:mount] Probe complete — use --all to mount"
|
|
exit 0
|
|
fi
|
|
|
|
# Mount all unmounted NTFS, ext4, btrfs partitions (excluding live system)
|
|
echo ""
|
|
echo "[hermes:mount] Mounting accessible partitions…"
|
|
echo ""
|
|
|
|
MOUNT_COUNT=0
|
|
while IFS= read -r line; do
|
|
DEVICE=$(echo "$line" | awk '{print $1}')
|
|
FSTYPE=$(echo "$line" | awk '{print $2}')
|
|
MOUNTPOINT=$(echo "$line" | awk '{print $3}')
|
|
LABEL=$(echo "$line" | awk '{print $4}')
|
|
|
|
# Skip: already mounted, swap, live system root
|
|
if [[ "$MOUNTPOINT" != "(not mounted)" ]]; then continue; fi
|
|
if [[ "$FSTYPE" = "swap" ]]; then continue; fi
|
|
if [[ "$DEVICE" =~ (sr|loop|ram) ]]; then continue; fi
|
|
|
|
MOUNT_PATH="$MOUNT_BASE/$DEVICE"
|
|
mkdir -p "$MOUNT_PATH"
|
|
|
|
case "$FSTYPE" in
|
|
ntfs)
|
|
if command -v ntfs-3g &>/dev/null; then
|
|
ntfs-3g -o ro,noatime "/dev/$DEVICE" "$MOUNT_PATH" 2>/dev/null && \
|
|
echo " [✓] /dev/$DEVICE (NTFS${LABEL:+: $LABEL}) → $MOUNT_PATH" && \
|
|
((MOUNT_COUNT++)) || \
|
|
echo " [✗] /dev/$DEVICE mount failed"
|
|
else
|
|
echo " [ ] /dev/$DEVICE (NTFS — ntfs-3g not available)"
|
|
fi
|
|
;;
|
|
ext4|ext3|ext2|xfs|btrfs)
|
|
mount -o ro,noatime "/dev/$DEVICE" "$MOUNT_PATH" 2>/dev/null && \
|
|
echo " [✓] /dev/$DEVICE (${FSTYPE}${LABEL:+: $LABEL}) → $MOUNT_PATH" && \
|
|
((MOUNT_COUNT++)) || \
|
|
echo " [✗] /dev/$DEVICE mount failed"
|
|
;;
|
|
vfat|exfat)
|
|
mount -o ro,noatime,uid=1000 "/dev/$DEVICE" "$MOUNT_PATH" 2>/dev/null && \
|
|
echo " [✓] /dev/$DEVICE (${FSTYPE}${LABEL:+: $LABEL}) → $MOUNT_PATH" && \
|
|
((MOUNT_COUNT++)) || \
|
|
echo " [✗] /dev/$DEVICE mount failed"
|
|
;;
|
|
*)
|
|
echo " [ ] /dev/$DEVICE ($FSTYPE — unsupported)"
|
|
;;
|
|
esac
|
|
done < <(lsblk -nlo NAME,FSTYPE,MOUNTPOINT,LABEL 2>/dev/null)
|
|
|
|
echo ""
|
|
echo "[hermes:mount] $MOUNT_COUNT partitions mounted under $MOUNT_BASE"
|
|
echo "[hermes:mount] Use 'umount $MOUNT_BASE/*' when done"
|