#! /bin/bash
#echo "$0 $*"
naptime="0"
depth="6"
simulate="no"
option="$1"
admin_mail=""
log_file=""
download_source="http://download.sisalp.net/scripts/RM"
case "$option" in
-h|--help)
	echo "$0 : slow delete of directory"
	$0 --version
	echo "	Usage	: $0 [-s|--simulate] [log_file=</path>] [admin_mail@domain.fqdn] [<nap_time>ms] [depth] directory_path_list"
	echo "		: </path> is an alternative file for logging"
	echo "		: admin_mail@domain.fqdn default is none"
	echo "		: <nap_time> between 1 and 999, 0 means default, default is set upon number of RM processes running"
	echo "		: depth between 1 and 9, default is 6"
	echo "	Usage: $0 --help	: print this help"
	echo "	--version		: print version and exit"
	echo "	--update		: update from $download_source and exit"
	exit 0
	;;
-v|--version)
	echo "$0 version 1 revision 11 - 10 may 2022"
	exit 0
	;;
-u|--update)
	CURRENTUSER=`whoami`
	case "$CURRENTUSER" in
	root)
		OLDVERSION=`$0 --version`
		cd /usr/local/bin
		mv $0 $0.old
		if wget -q $download_source ; then
			chmod 755 $0
			diff $0.old $0
			rm $0.old
			NEWVERSION=`$0 --version`
			case "$NEWVERSION" in
			$OLDVERSION)
				echo "$0 is uptodate $NEWVERSION"
				;;
			*)
				echo "$0 downloaded new version from $download_source"
				;;
			esac
		else
			echo "cannot download new version of $0 from $download_source"
			rm $0
			mv $0.old $0
		fi
		exit 0
		;;
	*)
		echo "You must get administration priviledges root to succeed, please consider sudo"
		exit 1
		;;
	esac
	;;
--exec|-s|--simulate)
	shift
	;;
esac
case "$1" in
log_file=*)
	log_file=`echo "$1" | cut -d= -f2`
	shift
	;;
esac
case "$1" in
*@*)
	admin_mail="$1"
	shift
	;;
esac
case "$1" in
[0-9]*ms)
	naptime=`echo "$1" | cut -d"m" -f1`
	shift
	;;
esac
case "$1" in
[1-9])
	depth="$1"
	shift
	;;
esac
directory_list="$*"
if [ -z "$directory_list" ] ; then
	$0 --help
	exit 1
fi
first=`basename $1`
if [ -z "$log_file" ] ; then
	log_file="/tmp/RM_remove_${first}.$$.log"
fi
case "$naptime" in
0)
	NUMBER_WORKING_PROCESS=`ps axo pid,cmd | grep "$0 " | wc -l`
	sleeptime=`echo "0.1 * $NUMBER_WORKING_PROCESS" | bc`
	;;
*)
	naptime=`echo "\`expr $naptime \+ 1000\`" | cut -b2-`
	sleeptime="0.$naptime"
	;;
esac
case "$option" in
--exec)
SLEEPTIME ()
{
if [ -z "$indx" ] ; then
	indx=100
fi 
indx=$((indx+1))
if [ $indx -ge 100 ] ; then
	case "$naptime" in
	0)
		WORKING_PROCESS=`ps axo pid,cmd`
		NUMBER_WORKING_PROCESS=`echo "$WORKING_PROCESS" | grep "$0 $option" | wc -l`
		sleeptime=`echo "0.1 * $NUMBER_WORKING_PROCESS" | bc`
		echo -n " sleeptime is $sleeptime " >> $log_file
		;;
	esac
	indx=0
fi
sleep $sleeptime
}
	ionice -c 3 -p $$
	current_directory=`pwd`
	echo "$$" > $log_file
	for directory in $directory_list ; do
		directory=`echo "$directory" | sed "s,/\$,,"`
		if [ -h $directory ] ; then
			directory=`readlink $directory`
		fi
		if [ -d $directory ] ; then
			mv $directory $directory.removed
		fi
		if [ -d $directory.removed ] ; then
			echo "`date` $0 deleting content of $directory.removed" >> $log_file
			cd $directory.removed
			for vserver in `ls` ; do
				ToBeRemovedList=`find $vserver -maxdepth $depth -type d | sort -r | xargs`
				ToBeRemovedNumber=`echo "$ToBeRemovedList" | wc -w`
				echo -n "$LINENO `date` Archive directory $directory.removed/$vserver is to be slowly removed $ToBeRemovedNumber directories :" >> $log_file
				for ToBeRemoved in $ToBeRemovedList ; do
					if [ -e $ToBeRemoved ] ; then
						rm -rf $ToBeRemoved
						echo -n "." >> $log_file
						SLEEPTIME
					else
						echo -n "?" >> $log_file
					fi
				done
				echo ".done" >> $log_file
			done
			cd $current_directory
			rm -rf $directory.removed
			echo "$LINENO `date` Archive directory $directory.removed is removed" >> $log_file
		else
			echo "$LINENO `date` Archive directory $directory.removed is not found and won't be removed" >> $log_file
		fi
	done
	if [ ! -z "$admin_mail" ] ; then
		cat $log_file | mail -s "script $0 $directory_list completed" $admin_mail ;
		echo "$LINENO `date` Report is sent to $admin_mail" >> $log_file
	fi
	;;
-s|--simulate)
	ionice -c 3 -p $$
	current_directory=`pwd`
	totaldir=0
	totalwait=0
	echo "wait time between directory deletion: $sleeptime"
	echo "depth of directory analysis: $depth"
	for directory in $directory_list ; do
		if [ -h $directory ] ; then
			directory=`readlink $directory`
		fi
		if [ -d $directory ] ; then
			echo "$0 deleting slowly content of $directory"
			cd $directory
			for vserver in `ls` ; do
				ToBeRemovedNumber=`find $vserver -maxdepth $depth -type d | wc -l`
				dirwait=`expr $ToBeRemovedNumber \* $sleeptime`
				totaldir=`expr $totaldir \+ $ToBeRemovedNumber`
				totalwait=`expr $totalwait \+ $dirwait`
				echo "$directory/$vserver:	remove $ToBeRemovedNumber directories	wait $dirwait s"
			done

		else
			echo "Archive directory $directory is not found"
		fi
	done
	echo "directory list $directory_list is removed, $totaldir directories	wait $totalwait ms"
	;;
*)
	#echo "nohup $0 --exec log_file=$log_file $admin_mail ${naptime}ms $depth $directory_list"
	nohup $0 --exec log_file=$log_file $admin_mail ${naptime}ms $depth $directory_list >> $log_file 2>&1 &
	sleep 1
	subprocess=`head -n 1 $log_file | xargs`
	echo "Follow tail -f $log_file, Cancel kill -9 $subprocess"
	echo -n "Remove ${first} is started, Follow progress, Cancel , Exit with any other key F|C|exit ? "
	read -n 1 follow_cancel
	echo ""
	case "$follow_cancel" in
	F|f)
		tail -f $log_file
		;;
	C|c)
		kill -9 $subprocess
		;;
	esac
	;; 
esac
exit 0
