#!/bin/sh
################################################################################
##                                                                            ##
## Copyright (c) International Business Machines  Corp., 2001                 ##
##                                                                            ##
## This program is free software;  you can redistribute it and#or modify      ##
## it under the terms of the GNU General Public License as published by       ##
## the Free Software Foundation; either version 2 of the License, or          ##
## (at your option) any later version.                                        ##
##                                                                            ##
## This program is distributed in the hope that it will be useful, but        ##
## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
## for more details.                                                          ##
##                                                                            ##
## You should have received a copy of the GNU General Public License          ##
## along with this program;  if not, write to the Free Software               ##
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
##                                                                            ##
################################################################################
#
# File :        logrotate_tests.sh
#
# Description:    Test Basic functionality of logrotate command.
#                Test #1: Test that logrotate -f <file.conf> rotates the logfile
#                as per the specifications in the conf file. Create a file
#                tst_logfile in /var/log/. Create a conf file such that this
#                logfile is set for rotation every week. Execute the command
#                logrotate -f <file.conf>, check to see if it forced rotation.
#                Test #2: Check if logrotate running as a cronjob will rotate a
#                logfile when it exceeds a specific size. Create two cronjobs
#                1. runs a command to log a string to a logfile. 2. runs
#                logrotate <file.conf> every minute. The conf file specifies
#                that the rotation happen only if the log file exceeds 2k file
#                size.
#
# Author:        Manoj Iyer, manjo@mail.utexas.edu
#
# History:       Dec 23 2002 - Created - Manoj Iyer.
#                Dec 24 2002 - Added   - Test #2 - Test to run logrotate as a
#                                        cron job.
#                Feb 28 2003 - Fixed   - Modified testcase to use functions.
#
# Function: 	chk_ifexists
#
# Description:  - Check if command required for this test exits.
#
# Input:        - $1 - calling test case.
#               - $2 - command that needs to be checked.
#
# Return:		- zero on success.
# 				- non-zero on failure.
chk_ifexists()
{
	RC=0

	which $2 > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
	if [ $RC -ne 0 ]
	then
		tst_brkm TBROK NULL "$1: command $2 not found."
	fi
	return $RC
}


# Function: init
#
# Description:  - Check if command required for this test exits.
#               - Create temporary directories required for this test.
#               - Initialize global variables.
#
# Return:		- zero on success.
# 				- non-zero on failure.
init()
{
	# Initialize global variables.
	export RC=0
	export TST_TOTAL=2
	export TCID="logrotate"
	export TST_COUNT=0

	# Inititalize cleanup function.
	trap "cleanup" 0

	# create the temporary directory used by this testcase
	if [ -z $TMP ]
	then
		LTPTMP=/tmp/tst_logrotate.$$
	else
		LTPTMP=$TMP/tst_logrotate.$$
	fi

	mkdir -p $LTPTMP > /dev/null 2>&1 || RC=$?
	if [ $RC -ne 0 ]
	then
		 tst_brkm TBROK "INIT: Unable to create temporary directory"
		 return $RC
	fi

	# check if commands tst_*, logrotate, awk and file exists.
	chk_ifexists INIT tst_resm  || return $RC
	chk_ifexists INIT logrotate || return $RC
	chk_ifexists INIT awk       || return $RC
	chk_ifexists INIT file      || return $RC

	return $RC
}


# Function: 	cleanup
#
# Description:  - remove temporaty files and directories. Stop all jobs stated
#                 by this testcase.
#
# Return:		- zero on success.
# 				- non-zero on failure.
cleanup()
{
	#remove all cronjobs that were installed.
	tst_resm TINFO "CLEAN: removing all cron jobs."
	crontab -r > /dev/null 2>&1

	# remove all the temporary files created by this test.
	tst_resm TINFO "CLEAN: removing $LTPTMP"
	rm -fr $LTPTMP
}


# Function: 	test01
#
# Description:  - Test that logrotate logrotate will rotate the logfile
#                 according to the specifications in the config file.
#               - create a config file that will rotate the /var/log/tst_logfile
#                 file.
#               - use force option to force logrotate to cause the log file to
#                 be rotated.
#               - compress the file after rotation.
#
# Return:		- zero on success.
# 				- non-zero on failure.
test01()
{
	count=0
	files=" "
	filesize=0

	TCID=logrotate01
	TST_COUNT=1

	tst_resm TINFO "Test #1: create a configfile $LTPTMP/var_mesg.config"
	tst_resm TINFO "Test #1: use logrotate -f <config> to force rotation"
	tst_resm TINFO "Test #1: this will rotate the log file according to"
	tst_resm TINFO "Test #1: the specification in the configfile."
	tst_resm TINFO "Test #1: 1. rotate /var/log/tst_logfile file."
	tst_resm TINFO "Test #1: 2. compresses it."

	# Check if syslog group exists
	local group="syslog"
	grep -q $group /etc/group || group="root"

	# create config file.
	cat >$LTPTMP/tst_logrotate.conf <<-EOF
	#****** Begin Config file *******
	# create new (empty) log files after rotating old ones
	create

	# compress the log files
	compress

	/var/log/tst_logfile {
		su root $group
		rotate 5
		weekly
	}
	#****** End Config file *******
	EOF

	# create a log file in /var/log/
	cat >/var/log/tst_logfile <<-EOF
	#****** Begin Log File ********
	# This is a dummy log file.
	#****** End Log File ********
	EOF

	while [ $count -lt 10 ]
	do
		echo "This a dummy log file used to test logrotate command." >> \
			/var/log/tst_logfile
		 		 count=$(( $count+1 ))
	done

	# remove all old-n-stale logfiles.
	for files in /var/log/tst_logfile.*
	do
		rm -f $files > /dev/null 2>&1
	done

	chmod 644 $LTPTMP/tst_logrotate.conf
	logrotate -fv $LTPTMP/tst_logrotate.conf > $LTPTMP/tst_logrotate.out 2>&1 \
		|| RC=$?
	if [ $RC -eq 0 ]
	then
		# check if config file $LTPTMP/tst_logrotate.conf is read
		# check if  /etc/logrotate.d is included/
		# check if 5 rotations are forced.
        # check if compression is done.
		grep "reading config file $LTPTMP/tst_logrotate.conf" \
			$LTPTMP/tst_logrotate.out   > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
		grep "forced from command line (5 rotations)" \
			$LTPTMP/tst_logrotate.out   > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
		egrep "compressing new|log with" \
			$LTPTMP/tst_logrotate.out   > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
		if [ $RC -ne 0 ]
		then
			tst_res TFAIL $LTPTMP/tst_logrotate.err \
				"Test #1: logrotate command failed. Reason:"
		else
			# Check if compressed log file is created.
			if [ -f /var/log/tst_logfile.1.gz ]
			then
				file /var/log/tst_logfile.1.gz | grep "gzip compressed data" \
					> $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
				if [ $RC -eq 0 ]
				then
					tst_resm TPASS \
						"Test #1: logrotate created a compressed file."
				else
					tst_res TFAIL $LTPTMP/tst_logrotate.out \
						"Test #1: Failed to create a compressed file. Reason:"
				fi
				return $RC
			else
				 tst_res TFAIL  $LTPTMP/tst_logrotate.out \
				  "Test #1: Failed create /var/log/tst_logfile.1.gz. Reason:"
				return $RC
			fi
		fi
	else
		tst_res TFAIL $LTPTMP/tst_logrotate.out \
		"Test #1: logrotate command exited with $RC return code. Output:"
	fi
	return $RC
}


test02()
{
# Test #2
# Test that logrotate logrotate will rotate the logfile if the logfile
# exceeds a certain size.
#     - create a config file that will rotate the /var/log/tst_largelogfile.
#     - run logrotate in a cron job that runs every minute.
#     - add messages to the logfile until it gets rotated when a re-dittermined
#        size is reached.

export TCID=logrotate02
export TST_COUNT=2
RC=0

tst_resm TINFO "Test #2: create a configfile $LTPTMP/tst_largelog.conf"
tst_resm TINFO "Test #2: logrotate $LTPTMP/tst_largelog.conf - cronjob"
tst_resm TINFO "Test #2: set to rotate tst_largelogfile when size > 2K"


# create config file.
cat >$LTPTMP/tst_largelog.conf <<EOF
# create new (empty) log files after rotating old ones
create

# compress the log files
compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

/var/log/tst_largelogfile {
    rotate 5
    size=2k
}
EOF

# create the pseudo-log file.
cat >/var/log/tst_largelogfile <<EOF
# This is a psuedo-log file. This file will grow to a 2k size before
# getting rotated.
EOF

# create logrotate cron job.
cat >$LTPTMP/tst_logrotate.cron <<EOF
* * * * * logrotate $LTPTMP/tst_largelog.conf
EOF

chmod 777 $LTPTMP/tst_logrotate.cron > /dev/null 2>&1

tst_resm TINFO "Test #2: Installing cron job to run logrotate"
crontab $LTPTMP/tst_logrotate.cron > $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
if [ $RC -ne 0 ]
then
    echo "Exit status of crontab command: $RC" >> tst_logrotate.out 2>/dev/null
    tst_brk TBROK $LTPTMP/tst_logrotate.out NULL \
        "Test #2: crontab Broke while installing cronjob. Reason:"
    TFAILCNT=$(( $TFAILCN+1 ))
else
    tst_resm TINFO "Test #2: Cronjob installed successfully"
fi

# cron job to increase the log file size.
cat >$LTPTMP/tst_addtolog.cron <<EOF

* * * * * echo "To Err Is Human, To Really Screw Up You Need A Computer."  >>/var/log/tst_largelogfile 2>/dev/null
EOF

tst_resm TINFO "Test #2: Installing cron job to increase logsize"
crontab $LTPTMP/tst_addtolog.cron > $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
if [ $RC -ne 0 ]
then
    echo "Exit status of crontab command: $RC" >> tst_logrotate.out 2>/dev/null
    tst_brk TBROK $LTPTMP/tst_logrotate.out NULL \
        "Test #2: crontab Broke while installing cronjob. Reason:"
    TFAILCNT=$(( $TFAILCN+1 ))
else
    tst_resm TINFO "Test #2: Cronjob installed successfully"
fi

# let cron jobs get started.
sleep 10s

# increase the log file size.

# wait for the /var/log/tst_largelogfile to be filled to a size greater than 2k
tst_resm TINFO "Test #2: Checking if file size is > 2k"
tst_resm TINFO "Test #2: Pls be patient this will take some time."
tst_resm TINFO "Test #2: or killall -9 logrotate02 to skip.."
if [ -f `which awk` ]
then
    while [ $filesize -lt 2046 ]
    do
        filesize=`ls -l /var/log/tst_largelogfile | awk '{print $5}'`
    done
	# wait for 1m  and check if logrotate has rotated the logfile. The cron job
	# that does a logrotate runs every 1 minute so give the cron a minute...
	sleep 1m
else
	tst_resm TINFO "Test #2: No AWK installed ... sleeping for 10mts"
	sleep 10m
fi


if [ -f /var/log/tst_largelogfile.1.gz ]
then
    file /var/log/tst_largelogfile.1.gz | grep "gzip compressed data" \
        > $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
    if [ $RC -eq 0 ]
    then
        tst_resm TPASS \
            "Test #1: logrotate worked as cron, created a compressed file."
    else
        tst_res TFAIL $LTPTMP/tst_logrotate.out \
            "Test #1: Failed to create a compressed file. Reason:"
    fi
else
    tst_res TFAIL  $LTPTMP/tst_logrotate.out \
        "Test #1: Failed to create /var/log/tst_largelogfile.1.gz. Reason:"
    TFAILCNT=$(( $TFAILCNT+1 ))
fi

}

# Function:	main
#
# Description:	- Execute all tests and report results.
#
# Exit:			- zero on success
#               - non-zero on failure.

RC=0
init || exit $?

test01 || RC=$?

exit $RC