382 lines
12 KiB
Bash
Executable File
382 lines
12 KiB
Bash
Executable File
#!/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
|