#!/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"