diff --git a/bindmounts.sh b/bindmounts.sh new file mode 100644 index 0000000..cd6338d --- /dev/null +++ b/bindmounts.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +CONFIG_FILE="/etc/proxmox-bindmounts.conf" + +# Function to create config file +create_config() { + echo "First run detected. Setting up configuration..." + + read -p "Enter mount source path (e.g., /z/media): " MNT_SOURCE + read -p "Enter mount target path (e.g., /media): " MNT_TARGET + read -p "Enter container base path (e.g., /z/pve): " CT_BASE + read -p "Enter container IDs (space-separated): " -a CT_IDS + + # Save to config file + cat > "$CONFIG_FILE" << EOF +MNT_SOURCE="$MNT_SOURCE" +MNT_TARGET="$MNT_TARGET" +CT_BASE="$CT_BASE" +CT_IDS=(${CT_IDS[@]}) +EOF + + chmod 600 "$CONFIG_FILE" + echo "Configuration saved to $CONFIG_FILE" +} + +# Check if config exists, if not create it +if [ ! -f "$CONFIG_FILE" ]; then + create_config +fi + +# Source the config file +source "$CONFIG_FILE" + +# Set signal traps +trap "exit 1" INT TERM KILL +trap "exit 0" QUIT HUP + +# Function to validate paths +validate_paths() { + if [ ! -d "$MNT_SOURCE" ]; then + echo "Error: Source directory $MNT_SOURCE does not exist!" + exit 1 + fi + if [ ! -d "$CT_BASE" ]; then + echo "Error: Container base directory $CT_BASE does not exist!" + exit 1 + fi +} + +# Function to mount +mount_containers() { + for ID in "${CT_IDS[@]}"; do + TARGET_PATH="${CT_BASE}/subvol-${ID}-disk-1${MNT_TARGET}" + + # Try unmounting first + if mountpoint -q "$TARGET_PATH"; then + umount -v "$TARGET_PATH" && rm -rf "${TARGET_PATH:?}"/* + fi + + # Create target directory if needed + mkdir -p "$TARGET_PATH" + + # Perform the bind mount + mount -v -o bind "$MNT_SOURCE" "$TARGET_PATH" + + if [ $? -eq 0 ]; then + echo "Successfully mounted for container $ID" + else + echo "Failed to mount for container $ID" + fi + done +} + +# Function to unmount +unmount_containers() { + for ID in "${CT_IDS[@]}"; do + TARGET_PATH="${CT_BASE}/subvol-${ID}-disk-1${MNT_TARGET}" + if mountpoint -q "$TARGET_PATH"; then + umount -v "$TARGET_PATH" + fi + done +} + +# Main logic +case "$1" in + up) + validate_paths + mount_containers + # Keep service running for systemd + exec /bin/sleep infinity + ;; + down) + unmount_containers + ;; + reconfigure) + create_config + ;; + *) + echo "Usage: $0 {up|down|reconfigure}" + echo " up - Mount all containers" + echo " down - Unmount all containers" + echo " reconfigure - Reset configuration" + exit 1 + ;; +esac \ No newline at end of file