97 lines
2.5 KiB
Bash
97 lines
2.5 KiB
Bash
#!/bin/bash
|
|
MOUNT_BASE="$HOME/SYM"
|
|
declare -A REMOTES
|
|
|
|
while IFS= read -r remote; do
|
|
remote="${remote%:}"
|
|
REMOTES["$remote"]="$MOUNT_BASE/$remote"
|
|
done < <(rclone listremotes)
|
|
|
|
if [[ ${#REMOTES[@]} -eq 0 ]]; then
|
|
echo "Keine rclone-Remotes gefunden. Abbruch."
|
|
exit 1
|
|
fi
|
|
|
|
is_mounted() {
|
|
mountpoint -q "${REMOTES[$1]}"
|
|
}
|
|
|
|
status_dot() {
|
|
is_mounted "$1" && echo "🟢" || echo "🔴"
|
|
}
|
|
|
|
mount_remote() {
|
|
local remote=$1
|
|
local mount_path="${REMOTES[$remote]}"
|
|
|
|
if is_mounted "$remote"; then
|
|
gum style --foreground 212 "⚠️ ${remote} ist bereits gemountet unter ${mount_path}"
|
|
return 0
|
|
fi
|
|
|
|
mkdir -p "$mount_path"
|
|
gum spin --title "Mounting ${remote}..." -- rclone mount \
|
|
--vfs-cache-mode full \
|
|
--dir-cache-time 1h \
|
|
--daemon \
|
|
"$remote": "$mount_path"
|
|
|
|
if is_mounted "$remote"; then
|
|
gum style --foreground 10 "✅ ${remote} wurde erfolgreich gemountet unter ${mount_path}"
|
|
else
|
|
gum style --foreground 9 "❌ Fehler beim Mounten von ${remote}. Bitte rclone-Log prüfen."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
unmount_remote() {
|
|
local remote=$1
|
|
local mount_path="${REMOTES[$remote]}"
|
|
|
|
if ! is_mounted "$remote"; then
|
|
gum style --foreground 212 "⚠️ ${remote} ist nicht gemountet."
|
|
return 0
|
|
fi
|
|
|
|
gum spin --title "Unmounting ${remote}..." -- fusermount -z "$mount_path"
|
|
sleep 1 # kurz warten bis der lazy unmount sich gesetzt hat
|
|
|
|
if ! is_mounted "$remote"; then
|
|
gum style --foreground 10 "✅ ${remote} wurde erfolgreich getrennt."
|
|
else
|
|
gum style --foreground 9 "❌ Fehler beim Trennen von ${remote}."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
unmount_all() {
|
|
local any_mounted=false
|
|
for remote in "${!REMOTES[@]}"; do
|
|
if is_mounted "$remote"; then
|
|
any_mounted=true
|
|
unmount_remote "$remote"
|
|
fi
|
|
done
|
|
if ! $any_mounted; then
|
|
gum style --foreground 212 "⚠️ Keine Remotes gemountet."
|
|
fi
|
|
}
|
|
|
|
while true; do
|
|
menu_items=()
|
|
for remote in "${!REMOTES[@]}"; do
|
|
menu_items+=("$(status_dot "$remote") ${remote}")
|
|
done
|
|
menu_items+=("⏏️ Alle Remotes trennen" "Beenden")
|
|
|
|
choice=$(gum choose --header "🚀 rclone Mount-Menü" "${menu_items[@]}")
|
|
|
|
case "$choice" in
|
|
"⏏️ Alle Remotes trennen") unmount_all ;;
|
|
"Beenden") exit 0 ;;
|
|
*)
|
|
selected="${choice#* }"
|
|
is_mounted "$selected" && unmount_remote "$selected" || mount_remote "$selected"
|
|
;;
|
|
esac
|
|
done |