Prv8 Shell
Server : Apache
System : Linux ecngx264.inmotionhosting.com 4.18.0-553.77.1.lve.el8.x86_64 #1 SMP Wed Oct 8 14:21:00 UTC 2025 x86_64
User : lonias5 ( 3576)
PHP Version : 7.3.33
Disable Function : NONE
Directory :  /proc/self/root/proc/thread-self/root/opt/sharedrads/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //proc/self/root/proc/thread-self/root/opt/sharedrads/backup_scan.sh
#!/bin/bash
# Shared RADS Tools, written by Erik Soroka (eriks@imhadmin.net, ext 834)
# This tool is used to generate reports of and purge old cPanel backups on shared servers.

############################
## load functions + banners
############################
# shellcheck disable=SC1091
source /opt/sharedrads/radsfunctions.sh

	if [ "$1" != "--api" ]; then
		clear
		radsbanner
	fi

###########################
## SCRIPT FUNCTIONS
###########################

function help() {
	echo
	echo "This tool can be used to scan/report or automatically remove backups."
	echo
	echo "Usage:"
	echo
	echo "REPORT: backup_scan --list    : per account, lists # of backups and size"
	echo "        backup_scan --full    : full output, lists actual file locations"
	echo "        backup_scan --total   : total # of backups in # accounts @ $(hostname -s)"
	echo "        backup_scan --api     : Application programming interface (T3 use only)"
	echo
	echo "REMOVE: backup_scan --dryrun  : shows users w/ >500MB of backups to be removed"
	echo "        backup_scan --purge   : automatically removes >500MB of backups"
	echo
	exit 0
}

function getage() {
	BACKUP_DATE=$(/usr/bin/stat "$backup" --format=%X)
	CURRENT_DATE=$(date +%s)
	DAYSOLD=$(echo "$BACKUP_DATE" "$CURRENT_DATE" | awk '{ print ($2 - $1)/86400 }')
	DAYSOLDINT="$(echo "$DAYSOLD" | cut -d. -f1)"
}


function pleasewait {
echo
echo -n 'Scanning is in progress...'

	while kill -0 "$myPID" 2>/dev/null; do
		sleep 0.3
	echo -n "."
	done
	echo ; echo
}

function overload {
	echo "Pausing due to server conditions...  (Load Average: ${lavg1%%.*}  I/O Wait: $iowait)"
	sleep 10;
}

function loadcheck {
	read lavg1 junk < /proc/loadavg
	iowait=$(/usr/bin/vmstat -S M 2 2 | tail -1 | awk '{print $16}')

	while [[ ${lavg1%%.*} -gt 20 ]] || [[ $iowait -gt 40 ]] ;
	do
		overload
		read lavg1 junk < /proc/loadavg
		iowait=$(/usr/bin/vmstat -S M 2 2 | tail -1 | awk '{print $16}')
	done

}

#############################
## CHECK ARGUMENTS RECEIVED
#############################

	if [ "$1" == "--help" ]; then
		help
	fi

	if [ -z "$1" ]; then
		help
	fi


	if [ "$1" == "--full" ]; then
		echo "Please wait while I search the /home/ partition for any archived cPanel backups."
	fi

	if [ "$1" == "--list" ]; then
		echo "Please wait while I search the /home/ partition for any archived cPanel backups."
		echo " tip: to display results w/full path & directory listings, add the --full flag"
	fi


##########################
##SET A UNIQUE SESSION ID
##########################

SESSIONID=$(date +%s)
RAWLIST="/tmp/.bkpscan.$SESSIONID.raw"
USERLIST="/tmp/.bkpscan.$SESSIONID.user"
UNIQUSERLIST="/tmp/.bkpscan.$SESSIONID.uniquser"

#########################################################
## lets list out the directories and wait for completion
##########################################################

	if [ "$1" != "--api" ];	then
		ls /home/*/backup-*.tar.gz -la | sort -nk5 > "$RAWLIST" &
		myPID=$!
		pleasewait
	else
		ls /home/*/backup-*.tar.gz -la | sort -nk5 > "$RAWLIST"
	fi

######################################
## GET AND SORT UNIQUE USERS
######################################

# shellcheck disable=SC2013
for user in $(cat "$RAWLIST" | awk '{print $9}' | awk -F_ '{print $3}' | cut -d. -f1)
 	do
		NOTHERE=FALSE
		id "$user" >> /dev/null || NOTHERE=TRUE

	if [ "$NOTHERE" == "FALSE" ]; then
		echo "$user"
	fi

done  > "$USERLIST"

#cleanup user list, make unique
cat "$USERLIST" | sort | uniq > "$UNIQUSERLIST"

# shellcheck disable=SC2013
for uniquser in $(cat "$UNIQUSERLIST")
	do

		if [ "$1" == "--api" ]; then
			BACKUPCOUNT=$(grep -c "^$uniquser$" "$USERLIST")
			TOTALDISKMB=$(grep \/$uniquser\/ "$RAWLIST" | awk '{ TOTAL += $5 } END { print TOTAL/1024/1024 }' | cut -d. -f1)
			echo "$uniquser,$BACKUPCOUNT,$TOTALDISKMB"
			continue
		fi

		if [ "$1" == "--total" ]; then
			BACKUPCOUNT=$(cat "$USERLIST" | wc -l)
			TOTALDISKMB=$(cat "$RAWLIST" | awk '{ TOTAL += $5 } END { print TOTAL/1024/1024 }')
			UNIQUSERS=$(cat "$UNIQUSERLIST" | wc -l)
			echo "[*] Found $BACKUPCOUNT cPanel backups in $UNIQUSERS accounts occupying a total of $TOTALDISKMB MB."
			echo
			exit 0
		fi


#############################################
## SHOW WHAT WE WOULD PURGE, NO ACTION TAKEN
#############################################

		if [ "$1" == "--dryrun" ]; then
			BACKUPCOUNT=$(grep -c "^$uniquser$" "$USERLIST")
			TOTALDISKMB=$(grep \/$uniquser\/ "$RAWLIST" | awk '{ TOTAL += $5 } END { print TOTAL/1024/1024 }')
			TOTALDISKINT=$(echo "$TOTALDISKMB" | cut -d. -f1)

		for backup in $(grep \/$uniquser\/ "$RAWLIST" | awk '{print $9}')
			do
				if [ "$TOTALDISKINT" -gt "500" ]; then
					echo "[*] $uniquser has more than 500MB of backups."

					if [ -f "$backup" ]; then
						getage

							if [ "$DAYSOLDINT" -gt "7" ]; then
								echo "[*] Large backup found >7 days old. This would be removed."
								echo "nice -n 19 ionice -c2 -n7 rm -rfv $backup"
								continue
							else
								echo "[*] Large backup found, but is not yet 7 days old - skipping."
								continue
							fi
					else
						echo "ERROR: could not find $backup"
						continue
					fi
				else
					continue
				fi
		done

		fi

#########################################
## LETS ACTUALLY PURGE OLD BACKUPS >500M
#########################################

		if [ "$1" == "--purge" ]; then
			BACKUPCOUNT=$(grep "^$uniquser$" "$USERLIST" | wc -l)
			TOTALDISKMB=$(grep \/$uniquser\/ "$RAWLIST" | awk '{ TOTAL += $5 } END { print TOTAL/1024/1024 }')
			TOTALDISKINT=$(echo "$TOTALDISKMB" | cut -d. -f1)

		for backup in $(grep \/$uniquser\/ "$RAWLIST" | awk '{print $9}')
			do
				if [ "$TOTALDISKINT" -gt "500" ]; then
					echo "[*] $uniquser has more than 500MB of backups."

					if [ -f "$backup" ]; then
						getage

							if [ "$DAYSOLDINT" -gt "7" ]; then
								loadcheck #check to make sure the server is stable before removal
								echo "[*] Large backup found, automatically removing >7 day old backup."
								logger -t IMH-backups "$TOTALDISKMB MB of backup(s) found and removed: $backup "
								nice -n 19 ionice -c2 -n7 rm -rfv "$backup"
								continue
							else
								echo "[*] Large backup found, but is not yet 7 days old - skipping."
								continue
							fi
					else
						echo "ERROR: could not find $backup"
						continue
					fi
				else
					continue
				fi
		done

		fi


###########################
## FULL REPORT, NO ACTION
###########################

		if [ "$1" == "--full" ]; then

			BACKUPCOUNT=$(grep "^$uniquser$" "$USERLIST" | wc -l)
			TOTALDISKMB=$(grep \/$uniquser\/ "$RAWLIST" | awk '{ TOTAL += $5 } END { print TOTAL/1024/1024 }')
			echo "[*] Found the following $BACKUPCOUNT archived cPanel backups in /home/$uniquser occupying a total of $TOTALDISKMB MB:"
			grep \/$uniquser\/ "$RAWLIST"
			echo
			echo "-----------------------------------------------------------------------------------------------------------"
			echo
		fi

		if [ "$1" == "--list" ]; then
			BACKUPCOUNT=$(grep -c "^$uniquser$" "$USERLIST")
			TOTALDISKMB=$(grep \/$uniquser\/ "$RAWLIST" | awk '{ TOTAL += $5 } END { print TOTAL/1024/1024 }' | cut -d. -f1)
			echo "[*] Found $BACKUPCOUNT cPanel backups in /home/$uniquser occupying a total of $TOTALDISKMB MB."
		fi

done


#cleanup our mess
rm -f "$RAWLIST"
rm -f "$USERLIST"
rm -f "$UNIQUSERLIST"


if [ "$1" != "--api" ]; then
	echo
	echo "Scanning complete."
	echo
fi

@StableExploit - 2025