#!/bin/busybox ash
# (c) Jason Williams 2015

. /etc/init.d/tc-functions

TCEDIR=/etc/sysconfig/tcedir
SCEDIR="$TCEDIR/sce"
checknotroot
[ -f /tmp/.debpurgedsize ] && sudo rm /tmp/.debpurgedsize
[ -f /tmp/.debpurged ] && sudo rm /tmp/.debpurged
echo 0 > /tmp/.debpurgedsize
sudo chown "$TCUSER":staff /tmp > /dev/null 2>&1
sudo chmod 1777 /tmp > /dev/null 2>&1
BUILD=`getBuild`
if [ "$BUILD" == "x86" ]; then
	DEBBUILD="i386"
elif [ "$BUILD" == "armv7" ]; then
	DEBBUILD="armhf"
elif [ "$BUILD" == "x86_64" ]; then
	DEBBUILD="amd64"
fi

if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
	echo " "
	echo "${YELLOW}sce-debpurge -   Purge deprecated, unneeded or all DEB files (Debian *.deb"
	echo "                 and *.tar.gz files) from /etc/sysconfig/tcedir/import/debs/.${NORMAL}"
	echo "                 May update DEBINX (Debian Index) files located in:"
	echo "                   /etc/sysconfig/tcedir/import/debinx/."
	echo "                 Primary purpose is to reclaim drive space."
	echo "                 Removed files listed in /tmp/.debpurged."
	echo " "
	echo "Usage:"
	echo " "
	echo "${YELLOW}"sce-debpurge"${NORMAL}     Update DEBINX files, purge deprecated DEBs."
	echo "${YELLOW}"sce-debpurge -a"${NORMAL}  Purge all files, will need to re-download to re-import SCEs."
	echo "${YELLOW}"sce-debpurge -n"${NORMAL}  Purge files not needed to re-import SCEs."
	echo "${YELLOW}"sce-debpurge -p"${NORMAL}  Preserve DEBINX files, purge deprecated DEBs based on existing,"
	echo "                 potentially outdated DEBINX information."
	echo " "
exit 1
fi

cleanup () {
[ -f /tmp/.debpurgelist ] && sudo rm /tmp/.debpurgelist
[ -f /tmp/.debpurged ] && sudo rm /tmp/.debpurged
[ -f /tmp/.deblist ] && sudo rm /tmp/.deblist
[ -f /tmp/.debpurgedsize ] && sudo rm /tmp/.debpurgedsize
}

cleanup


if [ -f /tmp/.scelock ]; then
	LOCK=`cat /tmp/.scelock`
	if /bb/ps -o pid | sed -e 's/^[ \t]*//'| grep "^$LOCK$" | /bb/grep -v grep > /dev/null 2>&1; then
		echo "${YELLOW}Warning:${NORMAL} Another SCE utility is presently in use, exiting.."
		exit 1
	fi
fi

echo "$$" > /tmp/.scelock

while getopts pan OPTION
do
	case ${OPTION} in
		n) NOTNEEDED=TRUE ;;
		p) PRESERVEDEBINXMODE=TRUE ;;
		a) PURGEALL=TRUE ;;
		*) echo "Run  sce-debpurge --help  for usage information."
                   exit 1 ;;
	esac
done

shift `expr $OPTIND - 1`

if ls /etc/sysconfig/tcedir/import/debs/*.deb > /dev/null 2>&1 ||  ls /etc/sysconfig/tcedir/import/debs/*.tar.gz > /dev/null 2>&1; then
	:
else
	echo "No packages to be removed, exiting.."
	exit 0
fi

if [ "$PURGEALL" == "TRUE" ]; then
	echo " "
	echo "${YELLOW}Warning:${NORMAL} This will purge all files from /etc/sysconfig/tcedir/import/debs/."
        echo "         Although this will not affect installed SCEs, many files will"
        echo "         need re-downloading later to re-import SCEs during updates."
        echo " "
        echo -n "Press Enter to proceed, (q)uit exits: "
        read ans
	if [ "$ans" == "q" ] || [ "$ans" == "quit" ]; then
		exit 1
	else
		:
	fi
	echo " "
        cd /etc/sysconfig/tcedir/import/debs
	echo -n "* Purging all files." && sleep 2 && echo " "
	if ls *.deb > /dev/null 2>&1; then
		for I in `ls *.deb`; do
			ls -l "$I" | cut -f5 -d" " >> /tmp/.debpurgedsize
			## Clear previous terminal echo:
			echo -ne "\033[2K"
			echo -ne "\r  "$I""
			sudo rm "$I"
			echo "$I" >> /tmp/.debpurged
		done
	fi
	if ls *.tar.gz > /dev/null 2>&1; then
		for I in `ls *.tar.gz`; do
			ls -l "$I" | cut -f5 -d" " >> /tmp/.debpurgedsize
			## Clear previous terminal echo:
			echo -ne "\033[2K"
			echo -ne "\r  "$I""
			sudo rm "$I"
			echo "$I" >> /tmp/.debpurged
		done
	fi

	## Clear previous terminal echo:
	echo -ne "\033[2K"
	DPURGESIZEFINAL=$(echo `awk 'BEGIN{total=0};{total += $1};END{print total/1024/1024}' /tmp/.debpurgedsize` | awk '{printf("%.2f\n", $1)}')
	NUMPURGED=`cat /tmp/.debpurged | wc -l`
	echo -ne "\r* Removed "$NUMPURGED" files from /etc/sysconfig/tcedir/import/debs/." && echo " "
	echo "* Reclaimed drive space: "$DPURGESIZEFINAL" MB."
	cleanup
	exit 0
fi

if [ "$NOTNEEDED" == "TRUE" ]; then
echo -n "* Removing any unneeded DEB files." && sleep 2 && echo " "
	for I in `ls "$SCEDIR"/*.sce`; do
		E=`basename "$I" .sce`
		debPurge "$E"
	done

	ls /etc/sysconfig/tcedir/import/debs/ | cut -f1 -d_ | sed 's:.tar.gz::' | sed 's:-data::' | sort | uniq > /tmp/.debpurgelist
	for I in `cat /tmp/.debpurgelist`; do
		grep "^$I$" /tmp/.deblist > /dev/null 2>&1 && sed -i "/^$I$/d" /tmp/.debpurgelist
	done

        cd /etc/sysconfig/tcedir/import/debs

	for I in `cat /tmp/.debpurgelist`; do		
		if ls "$I"_*deb > /dev/null 2>&1; then
			ls -l "$I"_*deb | cut -f5 -d" " >> /tmp/.debpurgedsize
			echo "  "$I"_*deb"
			sudo rm "$I"_*deb
			echo "$I" >> /tmp/.debpurged
		fi
		if ls "$I"*.tar.gz > /dev/null 2>&1; then
			ls -l "$I"*.tar.gz | cut -f5 -d" " >> /tmp/.debpurgedsize
			echo "  "$I"*.tar.gz"
			sudo rm "$I"*.tar.gz
			echo "$I" >> /tmp/.debpurged	
		fi
		
	done
	
	DPURGESIZEFINAL=$(echo `awk 'BEGIN{total=0};{total += $1};END{print total/1024/1024}' /tmp/.debpurgedsize` | awk '{printf("%.2f\n", $1)}') > /dev/null 2>&1

	if [ "$DPURGESIZEFINAL" == "0.00" ]; then
		echo "* No unneeded files found."
	else
		NUMPURGED=`cat /tmp/.debpurged | wc -l`
		echo "* Removed "$NUMPURGED" unneeded file(s) from /etc/sysconfig/tcedir/import/debs/."
		echo "* Reclaimed drive space: "$DPURGESIZEFINAL" MB."
	fi
	cleanup
	exit 0
fi


getName() {
> /tmp/"$1".pkglist
sudo grep -B 1 -A 10 "^Package: $1$" "$DEBINX" |  grep -B10 "^$" > /tmp/"$1".pkglist
DEBINX=/tmp/"$1".pkglist
getName1 $1
rm /tmp/"$1".pkglist
}

getName1() {
	awk -v package="Package: $1" -v build="$DEBBUILD" '
	BEGIN {
		RS=""
		FS="\n"
	}
	{
		if ($1 == package) {
			for (i=2; i <= NF; i++) {
				split($i,f,": ")
			
		
				if ( f[1] == "Architecture" ) {
					if ( f[2] == "all" )
						{}
					else if ( f[2] == build )
						{}
					else
						break
					}
		
				if ( f[1] == "Filename" )
					{ print f[2]; exit; }
						   
			
		}

		}
		
	} ' < "$DEBINX"

}

> /tmp/.debpurged

if [ "$PRESERVEDEBINXMODE" != "TRUE" ]; then
	sudo debGetEnv
	if [ "$?" != "0" ]; then
		echo " "
		echo "${YELLOW}Warning:${NORMAL} Error updating DEBINX files, exiting.."
		exit 1
	fi
fi

if [ "$PRESERVEDEBINXMODE" = "TRUE" ]; then
	echo "* Preserving local DEBINX."
	[ -s /etc/sysconfig/tcedir/import/debinx/debinx ] || sudo debGetEnv "$2"
	if [ "$?" != "0" ]; then
		echo "* Error updating DEBINX files, exiting.."
	fi
fi

echo -n "* Removing any deprecated DEB files." && sleep 2 && echo " "

read IMPORTMIRROR < /opt/tcemirror
PREBUILTMIRROR="${IMPORTMIRROR%/}/dCore/"$BUILD"/import"
IMPORTMIRROR="${IMPORTMIRROR%/}/dCore/import"
read DEBINX_SECURITY < /etc/sysconfig/tcedir/import/debinx/debinx_security
DEBINX_SECURITY="/etc/sysconfig/tcedir/import/debinx/"$DEBINX_SECURITY""

cd /etc/sysconfig/tcedir/import/debs

if ls *.deb > /dev/null 2>&1; then
 for I in `ls *.deb`; do
 DEBINFO=`echo "$I" | cut -f1 -d_`

    if sudo grep "^Package: $DEBINFO$" "$TCEDIR"/import/debinx/debinx.* > /dev/null 2>&1 ; then
	DEBINX=`sudo grep "^Package: $DEBINFO$" "$TCEDIR"/import/debinx/debinx.* /dev/null | head -n 1 | cut -f1 -d:`		
	NAMENEW=$(getName "$DEBINFO")
	NAMENEW="${NAMENEW##*/}"
	NAMEOLD="$I"
	if [ "$NAMENEW" != "$NAMEOLD" ]; then
		echo "  "$NAMEOLD""
		ls -l "$NAMEOLD" | cut -f5 -d" " >> /tmp/.debpurgedsize
		sudo rm "$NAMEOLD"
		echo "$I" >> /tmp/.debpurged
	else
		: #echo ""$DEBINFO" package files are up to date."
	fi			
    elif sudo grep "^Package: $DEBINFO$" "$DEBINX_SECURITY" > /dev/null 2>&1 ; then
	DEBINX="$DEBINX_SECURITY"	
	NAMENEW=$(getName "$DEBINFO")
	NAMENEW="${NAMENEW##*/}"
	NAMEOLD="$I"
	if [ "$NAMENEW" != "$NAMEOLD" ]; then
		echo "  "$NAMEOLD""
		ls -l "$NAMEOLD" | cut -f5 -d" " >> /tmp/.debpurgedsize
		sudo rm "$NAMEOLD"
		echo "$I" >> /tmp/.debpurged
	else
		: #echo ""$DEBINFO" package files are up to date."
	fi	
    else
 	read DEBINX < /etc/sysconfig/tcedir/import/debinx/debinx
	DEBINX="/etc/sysconfig/tcedir/import/debinx/$DEBINX"	
	NAMENEW=$(getName "$DEBINFO")
	NAMENEW="${NAMENEW##*/}"
	NAMEOLD="$I"
	if [ "$NAMENEW" != "$NAMEOLD" ]; then
		echo "  "$NAMEOLD""
		ls -l "$NAMEOLD" | cut -f5 -d" " >> /tmp/.debpurgedsize
		sudo rm "$NAMEOLD"
		echo "$I" >> /tmp/.debpurged
	else
		: #echo ""$DEBINFO" package files are up to date."
	fi
    fi

 done
fi
if ls *.tar.gz > /dev/null 2>&1; then
 for I in `ls *.tar.gz`; do
	DEBINFO=`echo "$I" | sed 's:-data.tar.gz::' | sed 's:.tar.gz::'`
	if grep "$DEBINFO:" "$DEBINXDIR"/PREBUILTMD5SUMLIST > /dev/null 2>&1; then
		MD5OLD=$(/bb/md5sum "$I" | cut -f1 -d" ")
		MD5NEW=$(grep "$DEBINFO:" "$DEBINXDIR"/PREBUILTMD5SUMLIST | cut -f2 -d" ")
		if [ "$MD5NEW" != "$MD5OLD" ]; then
			echo "  "$I""
			ls -l "$I" | cut -f5 -d" " >> /tmp/.debpurgedsize
			sudo rm "$I"
			echo "$I" >> /tmp/.debpurged
		elif [ ! -n "$MD5NEW" ] || [ ! -n "$MD5OLD" ]; then
			echo "* Md5sum data for "$I" cannot be found, leaving in place." && sleep 3
		else
			: #echo ""$DEBINFO" package files are up to date."
		fi
	elif grep "$DEBINFO:" "$DEBINXDIR"/PKGDATAFILEMD5SUMLIST > /dev/null 2>&1; then
		MD5OLD=$(/bb/md5sum "$I" | cut -f1 -d" ")
		MD5NEW=$(grep "$DEBINFO:" "$DEBINXDIR"/PKGDATAFILEMD5SUMLIST | cut -f2 -d" ")
		if [ "$MD5NEW" != "$MD5OLD" ]; then
			echo "  "$I""
			ls -l "$I" | cut -f5 -d" " >> /tmp/.debpurgedsize
			sudo rm "$I"
			echo "$I" >> /tmp/.debpurged
		elif [ ! -n "$MD5NEW" ] || [ ! -n "$MD5OLD" ]; then
			echo "  * Md5sum data for "$I" cannot be found, leaving in place." && sleep 3
		else
			: #echo ""$DEBINFO" package files are up to date."
		fi
	fi
 done
fi

DPURGESIZEFINAL=$(echo `awk 'BEGIN{total=0};{total += $1};END{print total/1024/1024}' /tmp/.debpurgedsize` | awk '{printf("%.2f\n", $1)}') > /dev/null 2>&1

if [ "$DPURGESIZEFINAL" == "0.00" ]; then
	echo "* No deprecated files found."
else
	NUMPURGED=`cat /tmp/.debpurged | wc -l`
	echo "* Removed "$NUMPURGED" deprecated file(s) from /etc/sysconfig/tcedir/import/debs/."
	echo "* Reclaimed drive space: "$DPURGESIZEFINAL" MB."
fi

cleanup

exit 0
