• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2################################################################################
3##                                                                            ##
4## Copyright (c) International Business Machines  Corp., 2001                 ##
5##                                                                            ##
6## This program is free software;  you can redistribute it and#or modify      ##
7## it under the terms of the GNU General Public License as published by       ##
8## the Free Software Foundation; either version 2 of the License, or          ##
9## (at your option) any later version.                                        ##
10##                                                                            ##
11## This program is distributed in the hope that it will be useful, but        ##
12## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
13## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
14## for more details.                                                          ##
15##                                                                            ##
16## You should have received a copy of the GNU General Public License          ##
17## along with this program;  if not, write to the Free Software               ##
18## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
19##                                                                            ##
20################################################################################
21#
22# File :        logrotate_tests.sh
23#
24# Description:    Test Basic functionality of logrotate command.
25#                Test #1: Test that logrotate -f <file.conf> rotates the logfile
26#                as per the specifications in the conf file. Create a file
27#                tst_logfile in /var/log/. Create a conf file such that this
28#                logfile is set for rotation every week. Execute the command
29#                logrotate -f <file.conf>, check to see if it forced rotation.
30#                Test #2: Check if logrotate running as a cronjob will rotate a
31#                logfile when it exceeds a specific size. Create two cronjobs
32#                1. runs a command to log a string to a logfile. 2. runs
33#                logrotate <file.conf> every minute. The conf file specifies
34#                that the rotation happen only if the log file exceeds 2k file
35#                size.
36#
37# Author:        Manoj Iyer, manjo@mail.utexas.edu
38#
39# History:       Dec 23 2002 - Created - Manoj Iyer.
40#                Dec 24 2002 - Added   - Test #2 - Test to run logrotate as a
41#                                        cron job.
42#                Feb 28 2003 - Fixed   - Modified testcase to use functions.
43#
44# Function: 	chk_ifexists
45#
46# Description:  - Check if command required for this test exits.
47#
48# Input:        - $1 - calling test case.
49#               - $2 - command that needs to be checked.
50#
51# Return:		- zero on success.
52# 				- non-zero on failure.
53chk_ifexists()
54{
55	RC=0
56
57	which $2 > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
58	if [ $RC -ne 0 ]
59	then
60		tst_brkm TBROK NULL "$1: command $2 not found."
61	fi
62	return $RC
63}
64
65
66# Function: init
67#
68# Description:  - Check if command required for this test exits.
69#               - Create temporary directories required for this test.
70#               - Initialize global variables.
71#
72# Return:		- zero on success.
73# 				- non-zero on failure.
74init()
75{
76	# Initialize global variables.
77	export RC=0
78	export TST_TOTAL=2
79	export TCID="logrotate"
80	export TST_COUNT=0
81
82	# Inititalize cleanup function.
83	trap "cleanup" 0
84
85	# create the temporary directory used by this testcase
86	if [ -z $TMP ]
87	then
88		LTPTMP=/tmp/tst_logrotate.$$
89	else
90		LTPTMP=$TMP/tst_logrotate.$$
91	fi
92
93	mkdir -p $LTPTMP > /dev/null 2>&1 || RC=$?
94	if [ $RC -ne 0 ]
95	then
96		 tst_brkm TBROK "INIT: Unable to create temporary directory"
97		 return $RC
98	fi
99
100	# check if commands tst_*, logrotate, awk and file exists.
101	chk_ifexists INIT tst_resm  || return $RC
102	chk_ifexists INIT logrotate || return $RC
103	chk_ifexists INIT awk       || return $RC
104	chk_ifexists INIT file      || return $RC
105
106	return $RC
107}
108
109
110# Function: 	cleanup
111#
112# Description:  - remove temporaty files and directories. Stop all jobs stated
113#                 by this testcase.
114#
115# Return:		- zero on success.
116# 				- non-zero on failure.
117cleanup()
118{
119	#remove all cronjobs that were installed.
120	tst_resm TINFO "CLEAN: removing all cron jobs."
121	crontab -r > /dev/null 2>&1
122
123	# remove all the temporary files created by this test.
124	tst_resm TINFO "CLEAN: removing $LTPTMP"
125	rm -fr $LTPTMP
126}
127
128
129# Function: 	test01
130#
131# Description:  - Test that logrotate logrotate will rotate the logfile
132#                 according to the specifications in the config file.
133#               - create a config file that will rotate the /var/log/tst_logfile
134#                 file.
135#               - use force option to force logrotate to cause the log file to
136#                 be rotated.
137#               - compress the file after rotation.
138#
139# Return:		- zero on success.
140# 				- non-zero on failure.
141test01()
142{
143	count=0
144	files=" "
145	filesize=0
146
147	TCID=logrotate01
148	TST_COUNT=1
149
150	tst_resm TINFO "Test #1: create a configfile $LTPTMP/var_mesg.config"
151	tst_resm TINFO "Test #1: use logrotate -f <config> to force rotation"
152	tst_resm TINFO "Test #1: this will rotate the log file according to"
153	tst_resm TINFO "Test #1: the specification in the configfile."
154	tst_resm TINFO "Test #1: 1. rotate /var/log/tst_logfile file."
155	tst_resm TINFO "Test #1: 2. compresses it."
156
157	# Check if syslog group exists
158	local group="syslog"
159	grep -q $group /etc/group || group="root"
160
161	# create config file.
162	cat >$LTPTMP/tst_logrotate.conf <<-EOF
163	#****** Begin Config file *******
164	# create new (empty) log files after rotating old ones
165	create
166
167	# compress the log files
168	compress
169
170	/var/log/tst_logfile {
171		su root $group
172		rotate 5
173		weekly
174	}
175	#****** End Config file *******
176	EOF
177
178	# create a log file in /var/log/
179	cat >/var/log/tst_logfile <<-EOF
180	#****** Begin Log File ********
181	# This is a dummy log file.
182	#****** End Log File ********
183	EOF
184
185	while [ $count -lt 10 ]
186	do
187		echo "This a dummy log file used to test logrotate command." >> \
188			/var/log/tst_logfile
189		 		 count=$(( $count+1 ))
190	done
191
192	# remove all old-n-stale logfiles.
193	for files in /var/log/tst_logfile.*
194	do
195		rm -f $files > /dev/null 2>&1
196	done
197
198	chmod 644 $LTPTMP/tst_logrotate.conf
199	logrotate -fv $LTPTMP/tst_logrotate.conf > $LTPTMP/tst_logrotate.out 2>&1 \
200		|| RC=$?
201	if [ $RC -eq 0 ]
202	then
203		# check if config file $LTPTMP/tst_logrotate.conf is read
204		# check if  /etc/logrotate.d is included/
205		# check if 5 rotations are forced.
206        # check if compression is done.
207		grep "reading config file $LTPTMP/tst_logrotate.conf" \
208			$LTPTMP/tst_logrotate.out   > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
209		grep "forced from command line (5 rotations)" \
210			$LTPTMP/tst_logrotate.out   > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
211		egrep "compressing new|log with" \
212			$LTPTMP/tst_logrotate.out   > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
213		if [ $RC -ne 0 ]
214		then
215			tst_res TFAIL $LTPTMP/tst_logrotate.err \
216				"Test #1: logrotate command failed. Reason:"
217		else
218			# Check if compressed log file is created.
219			if [ -f /var/log/tst_logfile.1.gz ]
220			then
221				file /var/log/tst_logfile.1.gz | grep "gzip compressed data" \
222					> $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
223				if [ $RC -eq 0 ]
224				then
225					tst_resm TPASS \
226						"Test #1: logrotate created a compressed file."
227				else
228					tst_res TFAIL $LTPTMP/tst_logrotate.out \
229						"Test #1: Failed to create a compressed file. Reason:"
230				fi
231				return $RC
232			else
233				 tst_res TFAIL  $LTPTMP/tst_logrotate.out \
234				  "Test #1: Failed create /var/log/tst_logfile.1.gz. Reason:"
235				return $RC
236			fi
237		fi
238	else
239		tst_res TFAIL $LTPTMP/tst_logrotate.out \
240		"Test #1: logrotate command exited with $RC return code. Output:"
241	fi
242	return $RC
243}
244
245
246test02()
247{
248# Test #2
249# Test that logrotate logrotate will rotate the logfile if the logfile
250# exceeds a certain size.
251#     - create a config file that will rotate the /var/log/tst_largelogfile.
252#     - run logrotate in a cron job that runs every minute.
253#     - add messages to the logfile until it gets rotated when a re-dittermined
254#        size is reached.
255
256export TCID=logrotate02
257export TST_COUNT=2
258RC=0
259
260tst_resm TINFO "Test #2: create a configfile $LTPTMP/tst_largelog.conf"
261tst_resm TINFO "Test #2: logrotate $LTPTMP/tst_largelog.conf - cronjob"
262tst_resm TINFO "Test #2: set to rotate tst_largelogfile when size > 2K"
263
264
265# create config file.
266cat >$LTPTMP/tst_largelog.conf <<EOF
267# create new (empty) log files after rotating old ones
268create
269
270# compress the log files
271compress
272
273# RPM packages drop log rotation information into this directory
274include /etc/logrotate.d
275
276/var/log/tst_largelogfile {
277    rotate 5
278    size=2k
279}
280EOF
281
282# create the pseudo-log file.
283cat >/var/log/tst_largelogfile <<EOF
284# This is a psuedo-log file. This file will grow to a 2k size before
285# getting rotated.
286EOF
287
288# create logrotate cron job.
289cat >$LTPTMP/tst_logrotate.cron <<EOF
290* * * * * logrotate $LTPTMP/tst_largelog.conf
291EOF
292
293chmod 777 $LTPTMP/tst_logrotate.cron > /dev/null 2>&1
294
295tst_resm TINFO "Test #2: Installing cron job to run logrotate"
296crontab $LTPTMP/tst_logrotate.cron > $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
297if [ $RC -ne 0 ]
298then
299    echo "Exit status of crontab command: $RC" >> tst_logrotate.out 2>/dev/null
300    tst_brk TBROK $LTPTMP/tst_logrotate.out NULL \
301        "Test #2: crontab Broke while installing cronjob. Reason:"
302    TFAILCNT=$(( $TFAILCN+1 ))
303else
304    tst_resm TINFO "Test #2: Cronjob installed successfully"
305fi
306
307# cron job to increase the log file size.
308cat >$LTPTMP/tst_addtolog.cron <<EOF
309
310* * * * * echo "To Err Is Human, To Really Screw Up You Need A Computer."  >>/var/log/tst_largelogfile 2>/dev/null
311EOF
312
313tst_resm TINFO "Test #2: Installing cron job to increase logsize"
314crontab $LTPTMP/tst_addtolog.cron > $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
315if [ $RC -ne 0 ]
316then
317    echo "Exit status of crontab command: $RC" >> tst_logrotate.out 2>/dev/null
318    tst_brk TBROK $LTPTMP/tst_logrotate.out NULL \
319        "Test #2: crontab Broke while installing cronjob. Reason:"
320    TFAILCNT=$(( $TFAILCN+1 ))
321else
322    tst_resm TINFO "Test #2: Cronjob installed successfully"
323fi
324
325# let cron jobs get started.
326sleep 10s
327
328# increase the log file size.
329
330# wait for the /var/log/tst_largelogfile to be filled to a size greater than 2k
331tst_resm TINFO "Test #2: Checking if file size is > 2k"
332tst_resm TINFO "Test #2: Pls be patient this will take some time."
333tst_resm TINFO "Test #2: or killall -9 logrotate02 to skip.."
334if [ -f `which awk` ]
335then
336    while [ $filesize -lt 2046 ]
337    do
338        filesize=`ls -l /var/log/tst_largelogfile | awk '{print $5}'`
339    done
340	# wait for 1m  and check if logrotate has rotated the logfile. The cron job
341	# that does a logrotate runs every 1 minute so give the cron a minute...
342	sleep 1m
343else
344	tst_resm TINFO "Test #2: No AWK installed ... sleeping for 10mts"
345	sleep 10m
346fi
347
348
349if [ -f /var/log/tst_largelogfile.1.gz ]
350then
351    file /var/log/tst_largelogfile.1.gz | grep "gzip compressed data" \
352        > $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
353    if [ $RC -eq 0 ]
354    then
355        tst_resm TPASS \
356            "Test #1: logrotate worked as cron, created a compressed file."
357    else
358        tst_res TFAIL $LTPTMP/tst_logrotate.out \
359            "Test #1: Failed to create a compressed file. Reason:"
360    fi
361else
362    tst_res TFAIL  $LTPTMP/tst_logrotate.out \
363        "Test #1: Failed to create /var/log/tst_largelogfile.1.gz. Reason:"
364    TFAILCNT=$(( $TFAILCNT+1 ))
365fi
366
367}
368
369# Function:	main
370#
371# Description:	- Execute all tests and report results.
372#
373# Exit:			- zero on success
374#               - non-zero on failure.
375
376RC=0
377init || exit $?
378
379test01 || RC=$?
380
381exit $RC
382