#!/bin/sh


if [ -f /etc/image_features ] ; then
    . /etc/image_features
    else
    echo
    echo
    echo Fatal error: Could not find 'image_features' file
    echo
    exit 1
fi

if [ -f /mnt/epdocker/features ]; then
    . /mnt/epdocker/features
fi

if [ "$FEATURE_CLOUD_IPPBX_OWN_SERVICE" = "1" ] ; then
    COLLECTING_INTERVAL=60
else
    COLLECTING_INTERVAL=15
fi

echo $$ > /var/run/logcollector.pid

DRIVE=$(blkid -s LABEL | grep "LOG" | awk -F':' '{print$1}')
LOGGER="/bin/logger -t $0"

if [ ! -b $DRIVE ]; then
	rm -f /var/run/logcollector.pid
	echo "There is no device with LABEL=LOG, exit ..."
	$LOGGER "There is no device with LABEL=LOG, exit ..."
	exit 1
fi

DO_LOOP=true

case "$1" in
	"-1")
		DO_LOOP=false
		;;
	*)
esac

if [ $DO_LOOP = true  ]; then
	/bin/sleep $COLLECTING_INTERVAL
fi


##########################################################
# this function does copy ( append ) the text between markers ($2 and $3) from file ($3) to file ($4)
##########################################################

copybetweenmarkers()
{
if [ "$1" = "all" ]; then
  nbcat $3 | sed -n '{/'$2'/{d;};p}' >> $4
else
  nbcat $3 | sed -n '/'$1'/,/'$2'/{/'$1'/{d;};/'$2'/{d;};p}' >> $4
fi  
}

##########################################################
# this function marks and copy all logs into archive directory
##########################################################

collect()
{

local dest_dir=$2

for log in $( find $1 -maxdepth 1 -type f \( -name '*.log' -o -name 'messages' -o -name '*-log' \) -o -type c \( -name '*.log' -o -name 'messages' -o -name '*-log' \) )
	do

		# if the file is a character special file and is not a directory and is not a symbolic link
		if ([ -d $log ] || [ -L $log ]); then
		    continue
		fi 
		
	        # Mark the log
			#
			echo $THE_MARK >> $log
        
	        # Find the previous marker in the log
	        #
	        FPM=""
			if [ "$LOG_PREV_MARKER_TIMESTAMP" != "" ]; then
				FPM=$(nbcat $log | grep "$LOG_PREV_MARKER_TIMESTAMP" | head -1)
			fi

			if [ "$FPM" != "" ]; then
				# If the current and the previous markers are there, copy the log between markers into archive dir
				#
				copybetweenmarkers $FPM "$THE_MARK" "$log" "$dest_dir$(basename $log)" #&
				#wait
			else
				# If the previous marker is missing copy, the whole log into archive dir
				#
				echo "" >> $dest_dir$(basename $log)
				echo $THE_GAP >> $dest_dir$(basename $log)
				echo "" >> $dest_dir$(basename $log)
				copybetweenmarkers "all" "$THE_MARK" "$log" "$dest_dir$(basename $log)" #&
				#wait
				# if the size of updated log file is equal to the GAP size then clear the file
				#
				size=$(stat -c %s $dest_dir$(basename $log))

				if [ $size -eq 6 ];then
				  :> $dest_dir$(basename $log)
				fi
			fi #[ "$FPM" != "" ]

		# if the size of updated log file is equal to 0 then remove it 
		size=$(stat -c %s $dest_dir$(basename $log))
		if [ $size -eq 0 ]; then
			rm -f $dest_dir$(basename $log)
		fi
		
		if [ "$DISABLE_KERNEL_MODULES" = "yes" ]; then
			logsize=$(stat -c %s $log)
			if [ $logsize -ge 8912896 ]; then #8M + 512KB, in case of no logstream
			    delbytes=$(($logsize/3))
			    tail -c +$delbytes "$log" > "$log.tmp" && cat "$log.tmp" > "$log" && rm -f "$log.tmp"
			fi
		fi
	done #for
}


main()
{

	while true
	
	do 
	
	# do some initializations
	#
	before="$(date +%s)"
	
	LOG_DATE=$(date +"%0d-%0b-%Y/")
	LOG_HOUR=$(date +"%0k:00/")

	LOG_PREV_MARKER_TIMESTAMP=""
	LOG_PREV_DATE_DIR=""
	LOG_MARKER="|><>MARKER<><|"
	LOG_MARKER_DATE=$(date +"%Y-%0m-%0d-%0k:%M:%S")
	LOG_MARKER_TIMESTAMP=$LOG_MARKER$(date +%s)
	#THE_MARK=$LOG_MARKER_TIMESTAMP"|"$LOG_MARKER_DATE"|"
	THE_MARK=$LOG_MARKER_TIMESTAMP
	THE_GAP="..."
	LOGS_DIR=/var/log/
	LOGS_DIR1=/tmp/logs/
	LOG_ARCHIVE_DIR="Archive/"
	LOG_ARCHIVE_DIR_PATH=$LOGS_DIR$LOG_ARCHIVE_DIR
	
	STATUS_FILE=/mnt/flashfs/logcollector.status
	
	# read the previous marker and the directory path from status file
	#
	if [ -f $STATUS_FILE ];then
		LOG_PREV_MARKER_TIMESTAMP=$(sed -n 1p $STATUS_FILE)
		LOG_PREV_DATE_DIR=$(sed -n 2p $STATUS_FILE)
	fi

	# create the archive root dir if does not exist
	#
	if [ ! -d $LOG_ARCHIVE_DIR_PATH ]; then
		mkdir $LOG_ARCHIVE_DIR_PATH
	fi

	# space management
	#
	PERCENT_USED=$(df -h $DRIVE | awk '{print$5}' | awk -F'Use%' '{print$1}' | sed "s/%//")
	
	if [ $PERCENT_USED -ge 90 ]; then
	
	    $LOGGER "Logs archive: used "$PERCENT_USED" %"
	    while [ $PERCENT_USED -gt 70 ]
	    do
		find $LOG_ARCHIVE_DIR_PATH -mindepth 2 -type d | xargs stat -c "%Y %n" | sort -n | head -n 1 | cut -d ' ' -f 1 --complement | xargs -d '\n' rm -r
		PERCENT_USED=$(df -h $DRIVE | awk '{print$5}' | awk -F'Use%' '{print$1}' | sed "s/%//")
	    done
	    
	    # delete empty directories (date dirs.)
	    find $LOG_ARCHIVE_DIR_PATH -maxdepth 1 -type d -exec rmdir {} + 2>/dev/null
#	    find $LOG_ARCHIVE_DIR_PATH -maxdepth 1 -type d -empty -delete
	    $LOGGER "Logs archive: used "$PERCENT_USED" %"
	fi

	# create date and hour dirs if they do not exist
	#
	LOG_DATE=$(date +"%0d-%0b-%Y/")
	LOG_HOUR=$(date +"%0k:00/")
	LOG_ARCHIVE_DATE_DIR=$LOG_ARCHIVE_DIR_PATH$LOG_DATE
	
	if [ ! -d $LOG_ARCHIVE_DATE_DIR ]; then
		mkdir $LOG_ARCHIVE_DATE_DIR
	fi
	
	local change_collect_dir=1
	if [ "$LOG_PREV_DATE_DIR" != "" ]; then
	  {
	  local collect_dir=$(echo $LOG_PREV_DATE_DIR | sed 's/\(.*\)./\1/')
	  local new_collect_dir=$(echo $LOG_ARCHIVE_DIR_PATH$LOG_DATE$LOG_HOUR | sed 's/\(.*\)./\1/')
	  case $collect_dir in
	  $new_collect_dir* )
	  change_collect_dir=0
	  ;;
	  esac
	  }
	fi	
	
	if [ $change_collect_dir -eq 1 ]; then
	  LOG_ARCHIVE_DATE_HOUR_DIR_PATH=$LOG_ARCHIVE_DIR_PATH$LOG_DATE$LOG_HOUR
	else
	  LOG_ARCHIVE_DATE_HOUR_DIR_PATH=$LOG_PREV_DATE_DIR
	fi

	# mark the directory to not collect into it
	#
	if ([ "$LOG_PREV_DATE_DIR" != "" ] && [ -d $LOG_PREV_DATE_DIR ] && [ "$LOG_PREV_DATE_DIR" != "$LOG_ARCHIVE_DATE_HOUR_DIR_PATH" ]); then
	  touch $LOG_PREV_DATE_DIR/z
	  # compress directory entry
	  tar -czf $LOG_PREV_DATE_DIR/logs.tar.gz -C $LOG_PREV_DATE_DIR $(ls $LOG_PREV_DATE_DIR)
	  if [ $? -eq 0 ]; then
		find $LOG_PREV_DATE_DIR -type f \( -not -name 'logs.tar.gz' -not -name 'z' \) -print0 | xargs -0 -I {} rm {}
	  fi
	fi
	
	# if the destination directory is marked then create the new one
	#
	if [ -f $LOG_ARCHIVE_DATE_HOUR_DIR_PATH/z ]; then
	{
	  local dir=$(echo $LOG_ARCHIVE_DATE_HOUR_DIR_PATH | sed 's/\(.*\)./\1/')
	  local index=$(find $dir* -type d | wc -l)
  	  LOG_ARCHIVE_DATE_HOUR_DIR_PATH=$dir"-"$index"/"
  	}
	fi
	
	if [ ! -d $LOG_ARCHIVE_DATE_HOUR_DIR_PATH ]; then
		mkdir $LOG_ARCHIVE_DATE_HOUR_DIR_PATH
	fi

	
	# collect logs from LOGS_DIR and LOGS_DIR1 into LOG_ARCHIVE_DATE_HOUR_DIR_PATH
	#
	collect $LOGS_DIR $LOG_ARCHIVE_DATE_HOUR_DIR_PATH
	collect $LOGS_DIR1 $LOG_ARCHIVE_DATE_HOUR_DIR_PATH
	
	# update the status file
	#
	rm -f $STATUS_FILE
	echo $THE_MARK >> $STATUS_FILE
	echo $LOG_ARCHIVE_DATE_HOUR_DIR_PATH >> $STATUS_FILE
	
	# calculate the elapsed time for job
	#
	after="$(date +%s)"
	elapsed_seconds="$(expr $after - $before)"
	if [ $elapsed_seconds -gt 10 ]; then
	    $LOGGER "Elapsed time for collecting of logs: "$elapsed_seconds "sec."
	fi
	
	# If we should do the collecting job just once, exit the loop otherwise sleep for COLLECTING_INTERVAL seconds and do it again
	#
	if [ $DO_LOOP = false  ]; then
		break
	else
		/bin/sleep $COLLECTING_INTERVAL
	fi
	
	done

# remove the pid file
#
rm -f /var/run/logcollector.pid
}

#######################################################
# Main function
#######################################################

main

exit 0
