#!/bin/ksh
#===============================================================================
#       file:           log/rotatelog
#       author:         Balage
#                       
#       description:    Rename log files.
#       NOTE:           If you add/remove a log file here, please check log/ziplog, too!
#                       (that makes the zip + move, but not only for 1-1 file,
#                       but multiple ones if present in different times, to be more robust) 
#
#       usage:          rotatelog
#
#===============================================================================

# setup environment


. $HOME/etc/setenv.sh

# environment variables

ENVVARS="HOME LOGS_DATED LOG_FACILITY ASROOT"

export ENVVARS

HOST=`hostname -s`

export HOST

ERR=/tmp/ziplog.err.$$

export ERR

# current date in YYYY-MM-DD format
today=`date +"%Y-%m-%d"`
yesterday=`date -d "-1 day" +"%Y-%m-%d"`

#collect tomcat log files
TOMCAT_LOG_FILES=""
for tf in `ls $TOMCAT_LOGS/ 2>/dev/null` ; do
	if [ "${tf#localhost.$today}" != "$tf" -o "${tf#localhost.$yesterday}" != "$tf" ] ; then
		# localhost.<today>.<something>_log or localhost.<yesterday>.<something>_log
		# Do not rotate these files, theu will be rotated on the next day(s)
		:
	elif [ "${tf#localhost.}" != "$tf" ] ; then
		# localhost.<otherday>.<something>_log
		TOMCAT_LOG_FILES="$TOMCAT_LOG_FILES $TOMCAT_LOGS/$tf"
	fi
done
		

# Files to be copy truncated:
COPYTRUNCATE_FILES="$APACHE_LOGS/jserv.log $APACHE_LOGS/mod_jserv.log $TOMCAT_LOGS/catalina.out $LOG/taskd.log $LOG/javataskd.log $LOG/dicom.log $LOG/hl7messages.log $LOG/hl7outgoing.log $LOG/checkStudy.log $LOG/epws.log $LOG/mcs.log $LOG/queryGuard.log"


# is a file to be copy truncated
#
# $1 filename
is_copy_truncate()
{
	for cf in $COPYTRUNCATE_FILES ; do
		[ "$cf" = "$1" ] && return 0
	done

	return 1
}


#
# log			create log entry
#
# $1	- type of log (error | info)
# $2	- message
log()
{
	logger -i -p ${LOG_FACILITY}.$1 -t "rotatelog" $2
}

#
# check_env		check environment
#
check_env()
{
	let err=0
	for var in $ENVVARS ; do
		eval value=$`echo $var`
		if [ -z "$value" ] ; then
			echo "Variable $var must be set !" 1>&2
			log error "Variable $var must be set !"
			let err=err+1
		fi
	done
	[ $err -ne 0 ] && exit 1
}


#
# getpar		get parameters
#
getpar()
{
	# set base file name

	TIME=`date +%Y-%m-%d.%H:%M`

	# set output files

	FOREVER_FILES=""
	WEEK_FILES=""
	DAY_FILES=""

	if [ $# -ne 0 ] ; then
		FOREVER_FILES="$*"
		NEEDHUP=""
	else
		FOREVER_FILES="$APACHE_LOGS/access_log $APACHE_LOGS/error_log"
		FOREVER_FILES="$FOREVER_FILES $APACHE_LOGS/jserv.log $APACHE_LOGS/mod_jserv.log"
		FOREVER_FILES="$FOREVER_FILES $APACHE_LOGS/ssl_engine_log $APACHE_LOGS/ssl_request_log"
		FOREVER_FILES="$FOREVER_FILES $LOG/oper_info.log $LOG/oper_error.log $LOG/streaminfo.log"
		FOREVER_FILES="$FOREVER_FILES $LOG/streamer.log $LOG/rc.log"
		WEEK_FILES="$LOG/info.log $LOG/error.log $APACHE_LOGS/mod_jk.log $APACHE_LOGS/access_heartbeat_log"
		[ -f "$LOG/debug.log" ] && DAY_FILES="$LOG/debug.log"

		# rotate tomcat logs
		[ -n "$TOMCAT_LOG_FILES" ] && DAY_FILES="$DAY_FILES $TOMCAT_LOG_FILES"

		[ -f "$TOMCAT_LOGS/catalina.out" ] && WEEK_FILES="$WEEK_FILES $TOMCAT_LOGS/catalina.out"
		[ -f "$LOG/monitor.log" ] && WEEK_FILES="$WEEK_FILES $LOG/monitor.log"
		[ -f "$LOG/capture.log" ] && WEEK_FILES="$WEEK_FILES $LOG/capture.log"
		[ -f "$LOG/viewerinfo.log" ] && WEEK_FILES="$WEEK_FILES $LOG/viewerinfo.log"
		[ -f "$LOG/epws.log" ] && WEEK_FILES="$WEEK_FILES $LOG/epws.log"
		[ -f "$LOG/mcs.log" ] && WEEK_FILES="$WEEK_FILES $LOG/mcs.log"
		
		# taskd log files
		[ -f "$LOG/taskd.log" ] && WEEK_FILES="$WEEK_FILES $LOG/taskd.log" 
		[ -f "$LOG/javataskd.log" ] && WEEK_FILES="$WEEK_FILES $LOG/javataskd.log" 

		# dicom (pb-scp) log file
		[ -f "$LOG/dicom.log" ] && WEEK_FILES="$WEEK_FILES $LOG/dicom.log" 
		[ -f "$LOG/sendman.log" ] && WEEK_FILES="$WEEK_FILES $LOG/sendman.log" 

		# HL7 (receiveMessage) log file
		[ -f "$LOG/hl7messages.log" ] && WEEK_FILES="$WEEK_FILES $LOG/hl7messages.log"
		[ -f "$LOG/hl7outgoing.log" ] && WEEK_FILES="$WEEK_FILES $LOG/hl7outgoing.log"

		# checkintegrity log file
		[ -f "$LOG/checkStudy.log" ] && WEEK_FILES="$WEEK_FILES $LOG/checkStudy.log"

		# utility logs
		[ -f "$LOG/queryGuard.log" ] && WEEK_FILES="$WEEK_FILES $LOG/queryGuard.log"

		NEEDHUP="yes"
	fi

	FILES="$FOREVER_FILES $WEEK_FILES $DAY_FILES"
	export FILES NEED_HUP
}


#
# do_rename		rename files and send HUP to start logging into new files
#
do_rename()
{
	# log
	log info "Rename file(s): $FILES"

	>$ERR

	# rename files

	for f in $FILES; do
		if [ -f $f ] ; then
			if is_copy_truncate "$f" ; then
				# copy/truncate file
				cp -f $f $( dirname "$f" )/$HOST.$TIME.$( basename "$f" ) 2>>$ERR
				>$f
			else 
				mv -f $f $( dirname "$f")/$HOST.$TIME.$( basename "$f" ) 2>>$ERR
			fi
		fi
	done

	# send HUP signal to apache
	# and send USR2 signal to tomcat's vm to trigger 'HUP' behavior for streamer.log
	if [ -n "$NEEDHUP" ] ; then
		$ASROOT hup.asr syslog
		$ASROOT hup.asr apache
		if [ -f $CATALINA_PID ] ; then
			kill -USR2 $(cat $CATALINA_PID)
		fi
		
		if [ -f $RUN/streamserver.pid ] ; then
			kill -SIGHUP $(cat $RUN/streamserver.pid)
		fi
	fi

	sleep 15

	# log errors
	if [ -s $ERR ] ; then
		log error <$ERR
		cat $ERR 1>&2
	fi
	rm -f $ERR

	return 0
}

# ==============================================================================
#				M A I N
# ==============================================================================

# log
log info "Started"

# check environment
check_env

# read parameters
getpar $*

# do rename
do_rename

# log
log info "Finished"

exit 0
