| #!/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 |