Mini Shell

Direktori : /opt/sharedrads/
Upload File :
Current File : //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
############################
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
######################################

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

for uniquser in `cat $UNIQUSERLIST`
	do

                if [ "$1" == "--api" ]; then
 	                BACKUPCOUNT=`grep "^$uniquser$" $USERLIST | wc -l`
                   	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 "^$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
								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 "^$uniquser$" $USERLIST | wc -l`
                        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

Zerion Mini Shell 1.0