#!/bin/bash
###############################################################################
##
##      Copyright (c) 2019 Avaya Inc All Rights Reserved
##      THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AVAYA INC
##
##      The copyright notice above does not evidence any
##      actual or intended publication of such source code.
##
###############################################################################
#
# This script/utility is used for listing & deleting logs (configured for log retention)
# prior to a certain timestamp. 
#
#

[ $UID -eq 0 ] || exec sudo $0 "$@"
usage(){
	echo "usage : $(basename $0)  -l <yyyy-mm-dd>| -d <yyyy-mm-dd>"
	echo "        -l Display list of log retention enabled logfiles prior to mentioned date (yyyy-mm-dd format)"
        echo "        -d Delete log retention enabled logfiles prior to mentioned date"
        echo "        -h See usage"
}


if [ $# -eq 0 ]
then
        usage
        exit 1
fi

LOG_DIR='/var/log'
LIST='/opt/avaya/common_services/logretention_filelist'
LOGLIST=`sed -n '3,$ p' $LIST | cut -d'(' -f1`
ENABLED_LOGLIST=`sed -n '3,$ p' $LIST | grep ENABLED | cut -d'(' -f1`
FORMATTED_LOGLIST=`echo $ENABLED_LOGLIST | sed 's/ /\\\|/g'`

validate_date(){
	date "+%Y/%m/%d" -d "${1//-//}" > /dev/null 2>&1
	IS_VALID=$?
	if [ $IS_VALID -ne 0 ]
	then
		echo "Invalid date. Required date format - yyyy-mm-dd ."
		exit 0
	fi
	CURRENT_DATE=`date +%Y%m%d`
	USER_PROVIDED_DATE=`date "+%Y%m%d" -d ${1//-//}`
	DIFF=`echo $(( USER_PROVIDED_DATE - CURRENT_DATE ))`
	if [ $DIFF -gt 0 ]
	then
		echo "Invalid date. Future date is not allowed."
		exit 0
	fi
}

list_logs(){
	DATE=$1
	#Increment date by 1 day so as to list present day's log also.
	#FORMATTED_DATE=`echo "$DATE" | sed -n -e "s_\(..\)-\(..\)-\(....\)_\3/\1/\2_p"`
	INCREMENTED_DATE=$(date +%Y-%m-%d -d "$DATE + 1 day")
	LIST_OF_LOGFILES=` find  $LOG_DIR ! -newermt "$INCREMENTED_DATE" -type f | grep "$FORMATTED_LOGLIST"`
	if [[ -n "$LIST_OF_LOGFILES" ]] && [[ -n "$FORMATTED_LOGLIST" ]]
	then
		echo "List of log retention enabled logfiles till(including) $DATE (yyyy-mm-dd) date :"
		echo "$LIST_OF_LOGFILES"
	else
		
		echo "None of the `echo $LOGLIST | sed 's/ /, /g'` logfiles is present till(including) $DATE. "
	fi
}

delete_logs(){
	DATE=$1	
	RESULT=`list_logs $DATE`
        if [ $? -eq 0 ]
        then
                if [[ "$RESULT" != *No* ]]
                then
                        LIST_OF_FILES=`echo "$RESULT" | cut -d':' -f2`
                        echo "List of log retention enabled logfiles to be deleted : $LIST_OF_FILES"
                        read -p "Do you want to continue (Files will not be retained) y/n : " RESPONSE
			RESPONSE=${RESPONSE,,}
			if [[ "$RESPONSE" == "y" ]] || [[ "$RESPONSE" == "yes" ]]
		        then
				#If user entered today's/future date, currently writing logs will also get deleted.
                                #Hence, rsyslog service needs to be restarted to get empty log files created.
                                CURRENT_DATE=`date +%Y%m%d`
                                USER_PROVIDED_DATE=`date "+%Y%m%d" -d ${1//-//}`
                                DIFF=`echo $(( USER_PROVIDED_DATE - CURRENT_DATE ))`
                                if [ $DIFF -ge 0 ]
                                then
					read -p "Today's logfiles will also get deleted. Are you sure? " RESPONSE
		                        RESPONSE=${RESPONSE,,}
                		        if [[ "$RESPONSE" == "n" ]] || [[ "$RESPONSE" == "no" ]]
                        		then
						echo "Aborting..."
						exit 0
					fi
                                fi
                        	for logfile in $LIST_OF_FILES
                        	do
                                	 rm -f $logfile >/dev/null 2>&1
                        	done
                        	#check if files got deleted
                        	for file in $LIST_OF_FILES
                        	do
                                	if [ -e $file ]
                                	then
                                        	echo "Deletion of mentioned logfiles till(including) $DATE failed."
                                        	exit 1
                                	fi
                        	done
                        	echo "Successfully deleted."
                                #If user entered today's/future date, currently writing logs will also get deleted.
                                #Hence, rsyslog service needs to be restarted to get empty log files created.
                                if [ $DIFF -ge 0 ]
                                then
                                        /sbin/service rsyslog restart >/dev/null 2>&1
                                        if [ $? -ne 0 ]
                                        then
                                                echo "Restart rsyslog service."
                                        fi
                                fi
			elif [[ "$RESPONSE" == "n" ]] || [[ "$RESPONSE" == "no" ]]
        		then
				echo "Aborting.."
				exit 0
			else
				echo "Invalid response."
			fi
                else
                        echo "Logfiles (`echo $ENABLED_LOGLIST | sed 's/ /, /g'`) till(including) $DATE (yyyy-mm-dd) are not present. Hence nothing to delete."
                fi
        else
                echo "$RESULT"
    		exit 1
	fi
}

##main

if [[ "$1" == "-l" ]]
then
        if [ -n "$2" ] && [ ${#2} -eq 10 ]
        then
		validate_date $2
		list_logs $2
        else
                echo "Insufficient argument. Please see usage ."
                exit 1
        fi
elif [[ "$1" == "-d" ]]
then
	if [ -n "$2" ] && [ ${#2} -eq 10 ]
        then
		validate_date $2
		delete_logs $2
	else
                echo "Insufficient argument. Please see usage."
                exit 1
        fi
elif [[ "$1" == "-h" ]]
then
	usage
	exit 0
else
        echo "Invalid argument."
        usage
        exit 1
fi
