Files
appfactory-tools/maintenance/delete-orphan-services.sh

106 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
APPFACTORY_ROOT="/opt/appfactory"
DB_FILE="$APPFACTORY_ROOT/data/appfactory/appfactory.db"
WORKSPACE_DIR="$APPFACTORY_ROOT/workspace"
DELETE_SCRIPT="$WORKSPACE_DIR/appfactory-tools/scripts/delete-app.sh"
DRY_RUN="${DRY_RUN:-0}"
MIN_AGE_HOURS="${MIN_AGE_HOURS:-24}"
MIN_AGE_MINUTES=$((MIN_AGE_HOURS * 60))
PROTECTED_WORKSPACES=(
appfactory-infrastructure
appfactory-monitor
appfactory-portal
appfactory-tools
appfactory-webhook
appfactory-worker
python-fastapi-template
)
log() {
printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*"
}
is_protected() {
local candidate="$1"
local protected
for protected in "${PROTECTED_WORKSPACES[@]}"; do
if [ "$candidate" = "$protected" ]; then
return 0
fi
done
return 1
}
is_registered() {
local candidate="$1"
sqlite3 "$DB_FILE" \
"SELECT 1 FROM apps WHERE id = '$candidate' LIMIT 1;" |
grep -qx 1
}
if [ ! -f "$DB_FILE" ]; then
log "ERROR: Databáze neexistuje: $DB_FILE"
exit 1
fi
if [ ! -x "$DELETE_SCRIPT" ]; then
log "ERROR: Mazací skript není spustitelný: $DELETE_SCRIPT"
exit 1
fi
found=0
deleted=0
failed=0
while IFS= read -r app_dir; do
app_id="$(basename "$app_dir")"
if is_protected "$app_id"; then
continue
fi
if is_registered "$app_id"; then
continue
fi
if ! find "$app_dir" -maxdepth 0 -mmin "+$MIN_AGE_MINUTES" | grep -q .; then
log "SKIP fresh orphan candidate: $app_id"
continue
fi
found=$((found + 1))
log "ORPHAN: $app_id"
if [ "$DRY_RUN" = "1" ]; then
log "DRY-RUN: spustil by se delete-app.sh $app_id"
continue
fi
if "$DELETE_SCRIPT" "$app_id"; then
deleted=$((deleted + 1))
log "DELETED: $app_id"
else
failed=$((failed + 1))
log "FAILED: $app_id"
fi
done < <(
find "$WORKSPACE_DIR" \
-mindepth 1 \
-maxdepth 1 \
-type d \
-print |
sort
)
log "Finished. Found=$found Deleted=$deleted Failed=$failed DryRun=$DRY_RUN"
if [ "$failed" -gt 0 ]; then
exit 1
fi