#!/bin/bash
#
# Post-Transfer Cleanup Script for cPanel Live Migration
# Clears mail contents and document root files while preserving account structure
#
# Usage: ./post_transfer_cleanup.sh <username> [--dry-run]
# Nikolay Ilchev 09/01/2026
CPUSER="${1:-}"
DRY_RUN=0
[[ "${2:-}" == "--dry-run" ]] && DRY_RUN=1
if [[ -z "$CPUSER" ]]; then
echo "Usage: $0 <username> [--dry-run]"
exit 1
fi
if [[ ! -f "/var/cpanel/users/$CPUSER" ]]; then
echo "Error: $CPUSER is not a valid cPanel account"
exit 1
fi
BACKUP_FOUND=0
if [[ -d "/var/backuply" ]]; then
BACKUPLY=$(find /var/backuply/backups/$CPUSER -name "*_backup_*_[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_*.json" -mtime -7 -type f 2>/dev/null | head -1)
if [[ -n "$BACKUPLY" ]]; then
BACKUP_FOUND=1
echo "Backuply: $(basename "$BACKUPLY")"
else
echo "Backuply: No backup found, checking JetBackup..."
fi
else
echo "Backuply: Not installed, checking JetBackup..."
fi
if [[ $BACKUP_FOUND -eq 0 ]] && command -v jetbackup5api &>/dev/null; then
JB_DATA=$(jetbackup5api -F listAccounts -D "limit=1000" -O json 2>/dev/null | jq -r ".data.accounts[] | select(.username==\"$CPUSER\")")
if [[ -n "$JB_DATA" ]]; then
JB_ID=$(echo "$JB_DATA" | jq -r '._id')
JB_FULL=$(echo "$JB_DATA" | jq -r '.backup_stats["511"]')
if [[ -n "$JB_FULL" && "$JB_FULL" -gt 0 ]]; then
BACKUP_FOUND=1
JB_LATEST=$(jetbackup5api -F listBackups -D "account_id=$JB_ID&type=1&contains=511&limit=200" -O json 2>/dev/null | jq -r '.data.backups | last | .created')
echo "JetBackup: $JB_FULL full backups, latest: $JB_LATEST"
fi
fi
fi
if [[ $BACKUP_FOUND -eq 0 ]]; then
echo "Error: No backup found for $CPUSER"
exit 1
fi
if [[ ! -f "/var/cpanel/suspended/$CPUSER" ]]; then
echo "Error: Account $CPUSER is not suspended"
exit 1
fi
SUSPEND_REASON=$(cat "/var/cpanel/suspended/$CPUSER" 2>/dev/null)
if [[ "$SUSPEND_REASON" != "User transferred to another server" ]]; then
echo "Error: Wrong suspension reason: $SUSPEND_REASON"
exit 1
fi
HOMEDIR=$(grep "^$CPUSER:" /etc/passwd | cut -d: -f6)
if [[ -z "$HOMEDIR" || ! -d "$HOMEDIR" ]]; then
echo "Error: Cannot find home directory"
exit 1
fi
du -sh "$HOMEDIR" 2>/dev/null | awk '{print "Current usage: "$1}'
DOCROOTS=$(grep DocumentRoot /etc/apache2/conf/httpd.conf | grep "/home/$CPUSER" | awk '{print $2}' | tr -d '"' | sort -u)
echo "Cleaning document roots..."
for docroot in $DOCROOTS; do
[[ -d "$docroot" ]] && echo " $docroot"
done
echo "Cleaning mail directory..."
[[ -d "$HOMEDIR/mail" ]] && echo " $HOMEDIR/mail"
if [[ $DRY_RUN -eq 1 ]]; then
echo "[DRY RUN] No changes made"
exit 0
fi
read -p "Proceed with deletion? (y/n): " CONFIRM
if [[ "$CONFIRM" != "y" ]]; then
echo "Aborted."
exit 1
fi
echo "Deleting..."
for docroot in $DOCROOTS; do
if [[ -d "$docroot" ]]; then
su - "$CPUSER" -s /bin/bash -c "find '$docroot' -type f ! -name '.htaccess' -delete 2>/dev/null"
su - "$CPUSER" -s /bin/bash -c "find '$docroot' -mindepth 1 -type d -empty -delete 2>/dev/null"
fi
done
if [[ -d "$HOMEDIR/mail" ]]; then
su - "$CPUSER" -s /bin/bash -c "find '$HOMEDIR/mail' -type f -delete 2>/dev/null"
fi
du -sh "$HOMEDIR" 2>/dev/null | awk '{print "New usage: "$1}'
echo "Done."