also delete symlinked directories

This commit is contained in:
goldsquid
2025-12-19 13:42:28 +07:00
parent 8d29690279
commit 8e7c8057bd

View File

@@ -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"
volume_path="/var/lib/docker/volumes/rpc_$key"
docker volume rm "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