diff --git a/delete-volumes.sh b/delete-volumes.sh index 13657eba..f0f21231 100755 --- a/delete-volumes.sh +++ b/delete-volumes.sh @@ -1,12 +1,75 @@ #!/bin/bash +# Function to find and delete symlinked directories +delete_symlinked_dirs() { + local volume_path=$1 + local key=$2 + + if [[ ! -d "$volume_path/_data" ]]; then + return 0 + fi + + # Find all symlinks in the volume's _data directory + find "$volume_path/_data" -type l -print0 2>/dev/null | while IFS= read -r -d '' symlink; do + # Get the target of the symlink (resolve to absolute path) + local target=$(readlink -f "$symlink" 2>/dev/null) + + if [[ -n "$target" ]] && [[ -d "$target" ]]; then + echo " Found symlink: $symlink -> $target" + + # Verify the target path matches expected patterns (safety check) + # Allow /slowdisk and other common backup/storage locations + local safe_to_delete=false + + if [[ "$target" =~ ^/slowdisk/rpc_${key}__data_ ]]; then + safe_to_delete=true + echo " Target is in /slowdisk, will delete" + elif [[ "$target" =~ ^/backup/ ]] || [[ "$target" =~ ^/storage/ ]] || [[ "$target" =~ ^/data/ ]]; then + # Additional safety: only delete if it matches the volume pattern + if [[ "$target" =~ rpc_${key} ]]; then + safe_to_delete=true + echo " Target matches volume pattern, will delete" + fi + else + # For other locations, be more cautious - only delete if explicitly matches pattern + if [[ "$target" =~ rpc_${key}__data_ ]]; then + safe_to_delete=true + echo " Target matches expected pattern, will delete" + else + echo " Warning: Target doesn't match expected pattern, skipping: $target" + fi + fi + + if [[ "$safe_to_delete" == "true" ]]; then + echo " Deleting symlinked directory: $target" + if rm -rf "$target" 2>/dev/null; then + echo " ✓ Deleted successfully" + else + echo " ✗ Failed to delete (may require root or may not exist)" + fi + fi + fi + done +} + # Read the JSON input and extract the list of keys keys=$(cat /root/rpc/$1.yml | yaml2json - | jq '.volumes' | jq -r 'keys[]') # Iterate over the list of keys for key in $keys; do - echo "removing: /var/lib/docker/volumes/rpc_$key" - - docker volume rm "rpc_$key" + volume_path="/var/lib/docker/volumes/rpc_$key" + + echo "removing: $volume_path" + + # Before removing the volume, check for and delete symlinked directories + if [[ -d "$volume_path/_data" ]]; then + echo " Checking for symlinked directories..." + delete_symlinked_dirs "$volume_path" "$key" + else + echo " Volume _data directory not found, skipping symlink check" + fi + + # Remove the docker volume + docker volume rm "rpc_$key" 2>/dev/null done