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