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 exists.
101	chk_ifexists INIT tst_resm  || return $RC
102	chk_ifexists INIT logrotate || return $RC
103	chk_ifexists INIT awk       || return $RC
104
105	return $RC
106}
107
108
109# Function: 	cleanup
110#
111# Description:  - remove temporaty files and directories. Stop all jobs stated
112#                 by this testcase.
113#
114# Return:		- zero on success.
115# 				- non-zero on failure.
116cleanup()
117{
118	#remove all cronjobs that were installed.
119	tst_resm TINFO "CLEAN: removing all cron jobs."
120	crontab -r > /dev/null 2>&1
121
122	# remove all the temporary files created by this test.
123	tst_resm TINFO "CLEAN: removing $LTPTMP"
124	rm -fr $LTPTMP
125}
126
127
128# Function: 	test01
129#
130# Description:  - Test that logrotate logrotate will rotate the logfile
131#                 according to the specifications in the config file.
132#               - create a config file that will rotate the /var/log/tst_logfile
133#                 file.
134#               - use force option to force logrotate to cause the log file to
135#                 be rotated.
136#               - compress the file after rotation.
137#
138# Return:		- zero on success.
139# 				- non-zero on failure.
140test01()
141{
142	count=0
143	files=" "
144	filesize=0
145
146	TCID=logrotate01
147	TST_COUNT=1
148
149	tst_resm TINFO "Test #1: create a configfile $LTPTMP/var_mesg.config"
150	tst_resm TINFO "Test #1: use logrotate -f <config> to force rotation"
151	tst_resm TINFO "Test #1: this will rotate the log file according to"
152	tst_resm TINFO "Test #1: the specification in the configfile."
153	tst_resm TINFO "Test #1: 1. rotate /var/log/tst_logfile file."
154	tst_resm TINFO "Test #1: 2. compresses it."
155
156	# create config file.
157	cat >$LTPTMP/tst_logrotate.conf <<-EOF
158	#****** Begin Config file *******
159	# create new (empty) log files after rotating old ones
160	create
161
162	# compress the log files
163	compress
164
165	/var/log/tst_logfile {
166		rotate 5
167		weekly
168	}
169	#****** End Config file *******
170	EOF
171
172	# create a log file in /var/log/
173	cat >/var/log/tst_logfile <<-EOF
174	#****** Begin Log File ********
175	# This is a dummy log file.
176	#****** End Log File ********
177	EOF
178
179	while [ $count -lt 10 ]
180	do
181		echo "This a dummy log file used to test logrotate command." >> \
182			/var/log/tst_logfile
183		 		 count=$(( $count+1 ))
184	done
185
186	# remove all old-n-stale logfiles.
187	for files in /var/log/tst_logfile.*
188	do
189		rm -f $files > /dev/null 2>&1
190	done
191
192	chmod 644 $LTPTMP/tst_logrotate.conf
193	logrotate -fv $LTPTMP/tst_logrotate.conf > $LTPTMP/tst_logrotate.out 2>&1 \
194		|| RC=$?
195	if [ $RC -eq 0 ]
196	then
197		# check if config file $LTPTMP/tst_logrotate.conf is read
198		# check if  /etc/logrotate.d is included/
199		# check if 5 rotations are forced.
200        # check if compression is done.
201		grep "reading config file $LTPTMP/tst_logrotate.conf" \
202			$LTPTMP/tst_logrotate.out   > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
203		grep "forced from command line (5 rotations)" \
204			$LTPTMP/tst_logrotate.out   > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
205		egrep "compressing new|log with" \
206			$LTPTMP/tst_logrotate.out   > $LTPTMP/tst_logrotate.err 2>&1 || RC=$?
207		if [ $RC -ne 0 ]
208		then
209			tst_res TFAIL > $LTPTMP/tst_logrotate.err 2>&1 \
210				"Test #1: logrotate command failed. Reason:"
211		else
212			# Check if compressed log file is created.
213			if [ -f /var/log/tst_logfile.1.gz ]
214			then
215				file /var/log/tst_logfile.1.gz | grep "gzip compressed data" \
216					> $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
217				if [ $RC -eq 0 ]
218				then
219					tst_resm TPASS \
220						"Test #1: logrotate created a compressed file."
221				else
222					tst_res TFAIL $LTPTMP/tst_logrotate.out \
223						"Test #1: Failed to create a compressed file. Reason:"
224				fi
225				return $RC
226			else
227				 tst_res TFAIL  $LTPTMP/tst_logrotate.out \
228				  "Test #1: Failed create /var/log/tst_logfile.1.gz. Reason:"
229				return $RC
230			fi
231		fi
232	else
233		tst_res TFAIL $LTPTMP/tst_logrotate.out \
234		"Test #1: logrotate command exited with $RC return code. Output:"
235	fi
236	return $RC
237}
238
239
240test02()
241{
242# Test #2
243# Test that logrotate logrotate will rotate the logfile if the logfile
244# exceeds a certain size.
245#     - create a config file that will rotate the /var/log/tst_largelogfile.
246#     - run logrotate in a cron job that runs every minute.
247#     - add messages to the logfile until it gets rotated when a re-dittermined
248#        size is reached.
249
250export TCID=logrotate02
251export TST_COUNT=2
252RC=0
253
254tst_resm TINFO "Test #2: create a configfile $LTPTMP/tst_largelog.conf"
255tst_resm TINFO "Test #2: logrotate $LTPTMP/tst_largelog.conf - cronjob"
256tst_resm TINFO "Test #2: set to rotate tst_largelogfile when size > 2K"
257
258
259# create config file.
260cat >$LTPTMP/tst_largelog.conf <<EOF
261# create new (empty) log files after rotating old ones
262create
263
264# compress the log files
265compress
266
267# RPM packages drop log rotation information into this directory
268include /etc/logrotate.d
269
270/var/log/tst_largelogfile {
271    rotate 5
272    size=2k
273}
274EOF
275
276# create the pseudo-log file.
277cat >/var/log/tst_largelogfile <<EOF
278# This is a psuedo-log file. This file will grow to a 2k size before
279# getting rotated.
280EOF
281
282# create logrotate cron job.
283cat >$LTPTMP/tst_logrotate.cron <<EOF
284* * * * * logrotate $LTPTMP/tst_largelog.conf
285EOF
286
287chmod 777 $LTPTMP/tst_logrotate.cron > /dev/null 2>&1
288
289tst_resm TINFO "Test #2: Installing cron job to run logrotate"
290crontab $LTPTMP/tst_logrotate.cron > $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
291if [ $RC -ne 0 ]
292then
293    echo "Exit status of crontab command: $RC" >> tst_logrotate.out 2>/dev/null
294    tst_brk TBROK $LTPTMP/tst_logrotate.out NULL \
295        "Test #2: crontab Broke while installing cronjob. Reason:"
296    TFAILCNT=$(( $TFAILCN+1 ))
297else
298    tst_resm TINFO "Test #2: Cronjob installed successfully"
299fi
300
301# cron job to increase the log file size.
302cat >$LTPTMP/tst_addtolog.cron <<EOF
303
304* * * * * echo "To Err Is Human, To Really Screw Up You Need A Computer."  >>/var/log/tst_largelogfile 2>/dev/null
305EOF
306
307tst_resm TINFO "Test #2: Installing cron job to increase logsize"
308crontab $LTPTMP/tst_addtolog.cron > $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
309if [ $RC -ne 0 ]
310then
311    echo "Exit status of crontab command: $RC" >> tst_logrotate.out 2>/dev/null
312    tst_brk TBROK $LTPTMP/tst_logrotate.out NULL \
313        "Test #2: crontab Broke while installing cronjob. Reason:"
314    TFAILCNT=$(( $TFAILCN+1 ))
315else
316    tst_resm TINFO "Test #2: Cronjob installed successfully"
317fi
318
319# let cron jobs get started.
320sleep 10s
321
322# increase the log file size.
323
324# wait for the /var/log/tst_largelogfile to be filled to a size greater than 2k
325tst_resm TINFO "Test #2: Checking if file size is > 2k"
326tst_resm TINFO "Test #2: Pls be patient this will take some time."
327tst_resm TINFO "Test #2: or killall -9 logrotate02 to skip.."
328if [ -f `which awk` ]
329then
330    while [ $filesize -lt 2046 ]
331    do
332        filesize=`ls -l /var/log/tst_largelogfile | awk '{print $5}'`
333    done
334	# wait for 1m  and check if logrotate has rotated the logfile. The cron job
335	# that does a logrotate runs every 1 minute so give the cron a minute...
336	sleep 1m
337else
338	tst_resm TINFO "Test #2: No AWK installed ... sleeping for 10mts"
339	sleep 10m
340fi
341
342
343if [ -f /var/log/tst_largelogfile.1.gz ]
344then
345    file /var/log/tst_largelogfile.1.gz | grep "gzip compressed data" \
346        > $LTPTMP/tst_logrotate.out 2>&1 || RC=$?
347    if [ $RC -eq 0 ]
348    then
349        tst_resm TPASS \
350            "Test #1: logrotate worked as cron, created a compressed file."
351    else
352        tst_res TFAIL $LTPTMP/tst_logrotate.out \
353            "Test #1: Failed to create a compressed file. Reason:"
354    fi
355else
356    tst_res TFAIL  $LTPTMP/tst_logrotate.out \
357        "Test #1: Failed to create /var/log/tst_largelogfile.1.gz. Reason:"
358    TFAILCNT=$(( $TFAILCNT+1 ))
359fi
360
361}
362
363# Function:	main
364#
365# Description:	- Execute all tests and report results.
366#
367# Exit:			- zero on success
368#               - non-zero on failure.
369
370RC=0
371init || exit $?
372
373test01 || RC=$?
374
375exit $RC
376