Skip to content

Commit ac022a1

Browse files
yasinBursaliclaude
andcommitted
feat(cli): add dream purge command and data-aware disable messages
Add cmd_purge() for permanent service data deletion with type-to-confirm safety gate. Handles root-owned Docker files via Alpine container fallback. Update cmd_disable() to show preserved data size and hint about purge. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c6796cb commit ac022a1

File tree

1 file changed

+90
-1
lines changed

1 file changed

+90
-1
lines changed

dream-server/dream-cli

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1347,7 +1347,94 @@ cmd_disable() {
13471347
docker compose "${flags[@]}" stop "$service_id" 2>/dev/null || true
13481348
[[ -f "$cf" ]] && mv "$cf" "${cf}.disabled"
13491349
_regenerate_compose_flags
1350-
success "$service_id disabled."
1350+
local _data_dir="$INSTALL_DIR/data/$service_id"
1351+
if [[ -d "$_data_dir" ]]; then
1352+
local _data_size
1353+
_data_size=$(du -sh "$_data_dir" 2>/dev/null | cut -f1)
1354+
success "$service_id disabled. Data preserved (${_data_size} in data/$service_id). Use 'dream purge $service_id' to delete."
1355+
else
1356+
success "$service_id disabled."
1357+
fi
1358+
}
1359+
1360+
cmd_purge() {
1361+
check_install
1362+
sr_load
1363+
1364+
if [[ $# -lt 1 ]]; then
1365+
error "Usage: dream purge <service>"
1366+
fi
1367+
1368+
local service_id
1369+
service_id=$(sr_resolve "$1")
1370+
1371+
# Validate against known service IDs
1372+
local _found=false
1373+
for _sid in "${SERVICE_IDS[@]}"; do
1374+
if [[ "$_sid" == "$service_id" ]]; then
1375+
_found=true
1376+
break
1377+
fi
1378+
done
1379+
if ! $_found; then
1380+
error "Unknown service: $service_id"
1381+
fi
1382+
1383+
# Block core services
1384+
local _cat="${SERVICE_CATEGORIES[$service_id]:-optional}"
1385+
if [[ "$_cat" == "core" ]]; then
1386+
error "Cannot purge core service data: $service_id"
1387+
fi
1388+
1389+
# Check if service is still enabled (compose.yaml exists = enabled)
1390+
local _cf="$INSTALL_DIR/extensions/services/$service_id/compose.yaml"
1391+
if [[ -f "$_cf" ]]; then
1392+
error "$service_id is still enabled. Run 'dream disable $service_id' first."
1393+
fi
1394+
1395+
# Check if container is still running
1396+
local _container="${SERVICE_CONTAINERS[$service_id]:-dream-$service_id}"
1397+
if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^${_container}$"; then
1398+
error "$service_id container is still running. Run 'dream stop $service_id' first."
1399+
fi
1400+
1401+
# Check data directory exists
1402+
local _data_dir="$INSTALL_DIR/data/$service_id"
1403+
if [[ ! -d "$_data_dir" ]]; then
1404+
log "No data directory found for $service_id."
1405+
return 0
1406+
fi
1407+
1408+
# Show size and confirm
1409+
local _data_size
1410+
_data_size=$(du -sh "$_data_dir" 2>/dev/null | cut -f1)
1411+
warn "This will permanently delete all data for $service_id (${_data_size})."
1412+
warn "Directory: $_data_dir"
1413+
log ""
1414+
1415+
local _confirm
1416+
read -p " Type '$service_id' to confirm deletion: " -r _confirm
1417+
if [[ "$_confirm" != "$service_id" ]]; then
1418+
log "Purge cancelled."
1419+
return 0
1420+
fi
1421+
1422+
# Delete data — try direct rm first, fall back to docker for root-owned files
1423+
rm -rf "$_data_dir" 2>/dev/null || true
1424+
if [[ -d "$_data_dir" ]]; then
1425+
log "Some files are owned by root (created by Docker). Removing via container..."
1426+
if command -v docker &>/dev/null; then
1427+
docker run --rm -v "$_data_dir:/purge-target" alpine \
1428+
sh -c 'rm -rf /purge-target/* /purge-target/.[!.]* 2>/dev/null; true' 2>/dev/null \
1429+
|| warn "Docker cleanup failed (non-fatal)"
1430+
rm -rf "$_data_dir" 2>/dev/null || true
1431+
fi
1432+
if [[ -d "$_data_dir" ]]; then
1433+
error "Could not fully remove $_data_dir. Try: sudo rm -rf $_data_dir"
1434+
fi
1435+
fi
1436+
1437+
success "Purged $service_id data (${_data_size} freed)."
13511438
}
13521439

13531440
cmd_list() {
@@ -2720,6 +2807,7 @@ ${CYAN}Commands:${NC}
27202807
list List all services and their status
27212808
enable <service> Enable an extension service
27222809
disable <service> Disable an extension service
2810+
purge <service> Permanently delete service data
27232811
preset <action> Save/load/list/delete/export/import presets
27242812
mode [local|cloud|hybrid]
27252813
Switch between local/cloud/hybrid modes
@@ -2836,6 +2924,7 @@ case "${1:-help}" in
28362924
list|ls) cmd_list ;;
28372925
enable) shift; cmd_enable "$@" ;;
28382926
disable) shift; cmd_disable "$@" ;;
2927+
purge) shift; cmd_purge "$@" ;;
28392928
preset|p) shift; cmd_preset "$@" ;;
28402929
mode|m) shift; cmd_mode "$@" ;;
28412930
model) shift; cmd_model "$@" ;;

0 commit comments

Comments
 (0)