xref: /titanic_50/usr/src/cmd/logadm/tester (revision e1d3217b9afde782c4d3e946fda0e6ef36a61306)
1#!/usr/bin/perl -w
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22#
23# Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
24# Copyright (c) 2013, Joyent, Inc. All rights reserved.
25#
26#
27# tester - run logadm tests
28#
29# requires a <bindir> argument to say where the various logadm
30# binaries live (conftest, globtest, kwtest, luttest, optstest, and
31# logadm itself).
32#
33# to run all the tests:
34# 	tester [-f] <bindir>
35#
36# to run just a few tests, given their names:
37# 	tester [-f] <bindir> globtest1 luttest1
38#
39# to setup a test and stop so you can run it by hand:
40# 	tester [-f] -s globtest1 <bindir>
41#
42# 	tester will tell you what tmp directory it created for
43# 	the test.  to run it, cd there and run:
44# 		sh runtest
45# 	to check the results, run:
46# 		sh checktest
47#
48# -f means "fast" -- without it, watchmalloc(3MALLOC) is setup for
49# each test and they run a zillion times slower and produce core
50# dumps when malloc/free problems are detected.
51#
52$watchmalloc=1;		# default is to use watchmalloc
53${ENV} = "/bin";
54umask 002;
55
56# list of tests we run by default
57@tests = (
58	"conftest1",
59	"conftest2",
60	"globtest1",
61	"globtest2",
62	"kwtest1",
63	"kwtest2",
64	"luttest1",
65	"optstest1",
66	"optstest2",
67	"logadmV1",
68	"logadmV2",
69	"logadmr",
70	"logadmw",
71	"logadm1",
72	"logadm1c",
73	"logadm2",
74	"logadm3",
75	"logadm4",
76	"logadm5",
77	"logadm6",
78	"logadm7",
79	"logadm8",
80	"logadm9",
81	"logadm9d",
82	"logadm10",
83	"logadm11",
84	"logadm12",
85	"logadm13",
86	"logadm14",
87	"logadm15",
88	"logadm16",
89	"logadm17",
90	"logadm18",
91	"logadm19",
92	"logadm20",
93);
94
95use Getopt::Std;
96use File::Find;
97
98$usage_summary = '[-s test-name] [-d dir] bindir [test-name...]';
99$usage_getopts = 'fd:s:';
100%usage = (
101	d=>'use dir for tests rather than creating one in /tmp',
102	s=>'setup only, do not run test');
103
104# spew usage message, plus any given message, and exit
105sub usage {
106	my $msg = shift;
107
108	if ($msg) {
109		chomp $msg;
110		warn "$0: $msg\n" if $msg;
111	}
112	warn "Usage: $0 $usage_summary\n";
113	foreach (sort keys %usage) {
114		warn "       -$_ $usage{$_}\n";
115	}
116	exit 1;
117}
118
119#
120# basic argument processing
121#
122$myname = $0;
123$myname =~ s/.*\///;	# just show last component in error mesages
124getopts($usage_getopts) or usage;
125$bindir = shift or usage;
126usage("$bindir does not exist") unless -d $bindir;
127usage("cannot list more than one test with -s option") if $opt_s && @ARGV;
128@tests = @ARGV if @ARGV;
129print "Fast mode\n" if $opt_f;
130$watchmalloc = 0 if $opt_f;
131
132$mydir=`pwd`;
133chomp $mydir;
134
135$dir = $opt_d;
136$dir = "/tmp/logadmtest$$" unless $dir = $opt_d;
137
138if (!-d $dir) {
139	mkdir $dir, 0777 or die "$myname: mkdir $dir: $!\n";
140	$needrmdir = 1;
141}
142
143chdir $dir or die "$myname: $dir: $!\n";
144
145# common commands in runtest by tests
146if ($watchmalloc) {
147	$envsetup =
148		"HOME=$dir export HOME; " .
149		"LD_PRELOAD=watchmalloc.so.1 export LD_PRELOAD; " .
150		"MALLOC_DEBUG=RW export MALLOC_DEBUG";
151} else {
152	$envsetup = "HOME=$dir export HOME; ";
153}
154
155$| = 1;		# a.k.a. setbuf(stdout, NULL)
156
157if ($opt_s) {
158	#
159	# just setup the test, explain how to use it, and exit
160	#
161	$testname = $opt_s;
162	eval "&$opt_s";
163	die "$myname: ERROR: $@" if $@;
164	print "$myname: $testname setup complete, to run, cd to:\n";
165	print "    $dir\n";
166	print "and run the command:\n";
167	print "    sh runtest\n";
168	print "to check the results, run the command:\n";
169	print "    sh checktest\n";
170	exit 0;
171} else {
172	#
173	# run all the tests
174	#
175	foreach (@tests) {
176		$testname = $_;
177		print "Running $testname...";
178		eval "&$_";
179		if ($@) {
180			print " SETUP FAILURE\n";
181			print STDERR "$myname: ERROR: $@";
182			exit 1;
183		}
184		eval "runner('runtest')";
185		if ($@) {
186			print " RUNTEST FAILURE\n";
187			print STDERR "$myname: ERROR: $@";
188			print STDERR "results captured in directory $dir\n";
189			print STDERR "  or use: $myname -s $testname $bindir\n";
190			print STDERR "  to do a fresh setup of this test.\n";
191			exit 1;
192		}
193		eval "runner('checktest', '-x', '> checktest.out 2>&1')";
194		if ($@) {
195			print " CHECKTEST FAILURE\n";
196			print STDERR "$myname: ERROR: $@";
197			print STDERR "results captured in file $dir/checktest.out\n";
198			print STDERR "  or use: $myname -s $testname $bindir\n";
199			print STDERR "  to do a fresh setup of this test.\n";
200			exit 1;
201		}
202		print "pass\n";
203		# sanity...
204		die "unexpected dir $dir" unless $dir =~ m,/.+/,;
205		system("/bin/rm -rf $dir/*");
206	}
207}
208
209# if we were the ones who created $dir, remove it
210if ($needrmdir) {
211	chdir $mydir;
212	rmdir $dir || die "$myname: rmdir $dir: $!\n";
213}
214
215exit 0;
216
217#
218# run a shell script and check for failure
219#
220# the shell scripts generated by this program always "exec" the binary
221# under test so checking here are for exit code, signals, and core dump
222# is actually checking the program under test and not /bin/sh
223#
224sub runner {
225	my ($cmd, $prefix, $suffix) = (@_, '', '');
226
227	my $fullcmd = "/bin/sh $prefix $cmd $suffix";
228	my $rc = 0xffff & system("$fullcmd");
229
230	if ($rc == 0) {
231		return;		# cmd completed normally
232	} elsif ($rc == 0xff00) {
233		die "command \"$cmd\" failed: $!\n";
234	} elsif (($rc & 0xff) == 0) {
235		$rc >>= 8;
236		die "command \"$cmd\" exit $rc\n";
237	} else {
238		my $coremsg;
239		$coremsg = " (core dumped)" if ($rc & 0x80);
240		$rc &= ~0x80;
241		die "command \"$cmd\" signal $rc$coremsg\n" ;
242	}
243}
244
245#
246# set_file(filename [, contents]) -- create a file, optionally with contents
247#
248sub set_file {
249	my $file = shift;
250	my $contents = shift;
251
252	open SF, ">$file" or die "create \"$file\": $!\n";
253	print SF $contents if defined($contents);
254	close SF;
255}
256
257#############
258#############
259#############    THE TESTS START AFTER HERE...
260#############
261#############
262
263# common setup step -- create a testfile.conf
264sub set_testconffile {
265	my $fname = shift;
266	$fname = 'testfile.conf' unless defined($fname);
267
268	set_file($fname, <<'EOF');
269#
270# logadm.conf
271#
272# Default settings for system log file management.
273# The -w option to logadm(1M) is the preferred way to write to this file,
274# but if you do edit it by hand, use "logadm -V" to check it for errors.
275#
276# The format of lines in this file is:
277#       <logname> <options>
278# For each logname listed here, the default options to logadm
279# are given.  Options given on the logadm command line override
280# the defaults contained in this file.
281#
282# logadm typically runs early every morning via an entry in
283# root's crontab (see crontab(1)).
284#
285/var/adm/messages -C 4 -P 'Thu Nov  1 16:56:42 2001' -a 'kill -HUP `cat /var/run/*syslog*pid`'
286/var/cron/log -s 512k -t /var/cron/olog
287/var/lp/logs/lpsched -C 2 -N -t '$file.$N'
288#
289# The entry below is used by turnacct(1M)
290#
291/var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
292apache -C 24 -a '/usr/apache/bin/apachectl graceful' -p 1m -t '/var/apache/old-logs/$basename.%Y-%m' '/var/apache/logs/*{access,error}_log'
293/var/log/syslog -C 8 -P 'Thu Nov  1 09:16:38 2001' -a 'kill -HUP `cat /var/run/*syslog*pid`'
294/var/apache/logs/access_log -P 'Thu Nov  1 08:27:56 2001'
295/var/apache/logs/error_log -P 'Thu Nov  1 08:27:56 2001'
296/var/apache/logs/suexec_log -P 'Thu Nov  1 08:27:56 2001'
297/var/apache/logs/mod_jserv.log -P 'Thu Nov  1 08:27:56 2001'
298/var/apache/logs/jserv.log -P 'Thu Nov  1 08:27:56 2001'
299EOF
300}
301
302
303###########################################################################
304#
305#	conftest1 -- minimal basic test of the conf.c code
306#
307###########################################################################
308sub conftest1 {
309	set_testconffile;
310
311	set_file('checktest', <<'EOF');
312[ -s std.err ] && { cat std.err; exit 1; }
313/bin/sed '/^conffile <testfile.conf>:$/d' <std.out >sed.out
314exec /bin/diff testfile.conf sed.out
315EOF
316
317	set_file('runtest', <<"EOF");
318# test "conftest1"
319$envsetup
320exec $bindir/conftest testfile.conf >std.out 2>std.err
321EOF
322}
323
324###########################################################################
325#
326#	conftest2 -- error path through conf.c
327#
328###########################################################################
329sub conftest2 {
330	set_file('testfile.conf', 'line fragment');
331
332	set_file('std.err.expect', <<'EOF');
333conftest: Warning: file testfile.conf doesn't end with newline, last line ignored.
334EOF
335
336	set_file('checktest', <<'EOF');
337exec /bin/diff std.err.expect std.err
338EOF
339
340	set_file('runtest', <<"EOF");
341# test "conftest2"
342$envsetup
343$bindir/conftest testfile.conf >std.out 2>std.err || exit 0
344exit 1
345EOF
346}
347
348###########################################################################
349#
350#	globtest1 -- minimal basic test of the glob.c code
351#
352###########################################################################
353sub globtest1 {
354	set_file('fileBname12');
355	sleep 2;	# ensure above name is odler than below name
356	set_file('fileAname12');
357	set_file('fileAname1');
358	set_file('fileAname3');
359	set_file('fileAname5');
360	set_file('fileAname7');
361	set_file('fileAname9');
362	set_file('fileAname11');
363	set_file('fileBname0');
364	set_file('fileBname2');
365	set_file('fileBname4');
366	set_file('fileBname6');
367	set_file('fileBname8');
368	set_file('fileBname10');
369	mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
370	mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
371	mkdir 'dir3', 0777 or die "mkdir dir3: $!\n";
372	mkdir 'dir1/dirA', 0777 or die "mkdir dir1/dirA: $!\n";
373	mkdir 'dir1/dirB', 0777 or die "mkdir dir1/dirB: $!\n";
374	mkdir 'dir1/dirC', 0777 or die "mkdir dir1/dirC: $!\n";
375	mkdir 'dir2/dirA', 0777 or die "mkdir dir2/dirA: $!\n";
376	mkdir 'dir2/dirB', 0777 or die "mkdir dir2/dirB: $!\n";
377	mkdir 'dir2/dirC', 0777 or die "mkdir dir2/dirC: $!\n";
378	set_file('dir1/fileAname1');
379	set_file('dir1/fileAname2');
380	set_file('dir1/fileAname3');
381	set_file('dir1/fileAname4');
382	set_file('dir1/fileAname5');
383	set_file('dir1/fileBname1');
384	set_file('dir1/fileBname2');
385	set_file('dir1/fileBname3');
386	set_file('dir1/fileBname4');
387	set_file('dir1/fileBname5');
388	# supply some varying sizes to produce different total size values
389	set_file('dir1/dirA/fileAname4', '4444');
390	sleep 2;	# ensure above file is oldest in dirA
391	set_file('dir1/dirA/fileAname1', '1');
392	set_file('dir1/dirA/fileAname2', '22');
393	set_file('dir1/dirA/fileAname3', '333');
394	set_file('dir1/dirA/fileAname5', '55555');
395	set_file('dir1/dirA/fileBname1', '1');
396	set_file('dir1/dirA/fileBname2', '22');
397	set_file('dir1/dirA/fileBname3', '333');
398	set_file('dir1/dirA/fileBname4', '4444');
399	set_file('dir1/dirA/fileBname5', '55555');
400	set_file('dir1/dirB/fileAname1', '1');
401	set_file('dir1/dirB/fileAname2', '22');
402	set_file('dir1/dirB/fileAname3', '333');
403	set_file('dir1/dirB/fileAname4', '4444');
404	set_file('dir1/dirB/fileAname5', '55555');
405	set_file('dir1/dirB/fileBname1', '1');
406	set_file('dir1/dirB/fileBname2', '22');
407	set_file('dir1/dirB/fileBname3', '333');
408	set_file('dir1/dirB/fileBname4', '4444');
409	set_file('dir1/dirB/fileBname5', '55555');
410	set_file('dir1/dirC/fileAname10', '12345678901');
411	set_file('dir1/dirC/fileAname20', '123456789022');
412	set_file('dir1/dirC/fileAname30', '1234567890333');
413	set_file('dir1/dirC/fileAname40', '12345678904444');
414	set_file('dir1/dirC/fileAname50', '123456789055555');
415	set_file('dir1/dirC/fileBname10', '12345678901');
416	set_file('dir1/dirC/fileBname20', '123456789022');
417	set_file('dir1/dirC/fileBname30', '1234567890333');
418	set_file('dir1/dirC/fileBname40', '12345678904444');
419	set_file('dir1/dirC/fileBname50', '123456789055555');
420
421	set_file('std.out.expect', <<'EOF');
422<file{A,B,C}name*>:
423    <./fileAname12>
424    <./fileAname1>
425    <./fileAname3>
426    <./fileAname5>
427    <./fileAname7>
428    <./fileAname9>
429    <./fileAname11>
430    <./fileBname12>
431    <./fileBname0>
432    <./fileBname2>
433    <./fileBname4>
434    <./fileBname6>
435    <./fileBname8>
436    <./fileBname10>
437total size: 0
438    oldest <./fileBname12>
439    oldest <./fileBname8>
440    oldest <./fileBname6>
441    oldest <./fileBname4>
442    oldest <./fileBname2>
443    oldest <./fileBname10>
444    oldest <./fileBname0>
445    oldest <./fileAname9>
446    oldest <./fileAname7>
447    oldest <./fileAname5>
448    oldest <./fileAname3>
449    oldest <./fileAname12>
450    oldest <./fileAname11>
451    oldest <./fileAname1>
452<file{A,B,C}name>:
453    <fileAname>
454    <fileBname>
455    <fileCname>
456total size: 0
457    oldest <fileCname>
458    oldest <fileBname>
459    oldest <fileAname>
460<dir1/dirA/file*>:
461    <./dir1/dirA/fileAname4>
462    <./dir1/dirA/fileAname1>
463    <./dir1/dirA/fileAname2>
464    <./dir1/dirA/fileAname3>
465    <./dir1/dirA/fileAname5>
466    <./dir1/dirA/fileBname1>
467    <./dir1/dirA/fileBname2>
468    <./dir1/dirA/fileBname3>
469    <./dir1/dirA/fileBname4>
470    <./dir1/dirA/fileBname5>
471total size: 30
472    oldest <./dir1/dirA/fileAname4>
473    oldest <./dir1/dirA/fileBname5>
474    oldest <./dir1/dirA/fileBname4>
475    oldest <./dir1/dirA/fileBname3>
476    oldest <./dir1/dirA/fileBname2>
477    oldest <./dir1/dirA/fileBname1>
478    oldest <./dir1/dirA/fileAname5>
479    oldest <./dir1/dirA/fileAname3>
480    oldest <./dir1/dirA/fileAname2>
481    oldest <./dir1/dirA/fileAname1>
482<dir[13]/[e-z]*>:
483    <./dir1/fileAname1>
484    <./dir1/fileAname2>
485    <./dir1/fileAname3>
486    <./dir1/fileAname4>
487    <./dir1/fileAname5>
488    <./dir1/fileBname1>
489    <./dir1/fileBname2>
490    <./dir1/fileBname3>
491    <./dir1/fileBname4>
492    <./dir1/fileBname5>
493total size: 0
494    oldest <./dir1/fileBname5>
495    oldest <./dir1/fileBname4>
496    oldest <./dir1/fileBname3>
497    oldest <./dir1/fileBname2>
498    oldest <./dir1/fileBname1>
499    oldest <./dir1/fileAname5>
500    oldest <./dir1/fileAname4>
501    oldest <./dir1/fileAname3>
502    oldest <./dir1/fileAname2>
503    oldest <./dir1/fileAname1>
504<dir?/dir[AC]/fileBname[2-9]>:
505    <./dir1/dirA/fileBname2>
506    <./dir1/dirA/fileBname3>
507    <./dir1/dirA/fileBname4>
508    <./dir1/dirA/fileBname5>
509total size: 14
510    oldest <./dir1/dirA/fileBname5>
511    oldest <./dir1/dirA/fileBname4>
512    oldest <./dir1/dirA/fileBname3>
513    oldest <./dir1/dirA/fileBname2>
514<file[A-Z]n.*e([0-9]+)$0>:
515    <./fileBname12>
516    <./fileAname12>
517    <./fileAname1>
518    <./fileAname3>
519    <./fileAname5>
520    <./fileAname7>
521    <./fileAname9>
522    <./fileAname11>
523    <./fileBname0>
524    <./fileBname2>
525    <./fileBname4>
526    <./fileBname6>
527    <./fileBname8>
528    <./fileBname10>
529total size: 0
530    oldest <./fileBname12>
531    oldest <./fileAname12>
532    oldest <./fileAname11>
533    oldest <./fileBname10>
534    oldest <./fileAname9>
535    oldest <./fileBname8>
536    oldest <./fileAname7>
537    oldest <./fileBname6>
538    oldest <./fileAname5>
539    oldest <./fileBname4>
540    oldest <./fileAname3>
541    oldest <./fileBname2>
542    oldest <./fileAname1>
543    oldest <./fileBname0>
544EOF
545
546	set_file('checktest', <<'EOF');
547[ -s std.err ] && { cat std.err; exit 1; }
548exec /bin/diff std.out.expect std.out
549EOF
550
551	$testglobs='\'file{A,B,C}name*\' \'file{A,B,C}name\' \'dir1/dirA/file*\' \'dir[13]/[e-z]*\' \'dir?/dir[AC]/fileBname[2-9]\' -r \'file[A-Z]n.*e([0-9]+)$0\'';
552
553	set_file('runtest', <<"EOF");
554# test "globtest1"
555$envsetup
556exec $bindir/globtest $testglobs >std.out 2>std.err
557EOF
558}
559
560###########################################################################
561#
562#	globtest2 -- error path through glob.c
563#
564###########################################################################
565sub globtest2 {
566	set_file('std.err.expect', <<'EOF');
567globtest: Error: Missing }
568EOF
569
570	set_file('checktest', <<'EOF');
571exec /bin/diff std.err.expect std.err
572EOF
573
574	set_file('runtest', <<"EOF");
575# test "globtest2"
576$envsetup
577$bindir/globtest 'hello{there' >std.out 2>std.err || exit 0
578exit 1
579EOF
580}
581
582###########################################################################
583#
584#	kwtest1 -- minimal basic test of the kw.c code
585#
586###########################################################################
587sub kwtest1 {
588	$domainname = `/bin/domainname`; chomp $domainname;
589	$isa = `/bin/uname -p`; chomp $isa;
590	$platform = `/bin/uname -i`; chomp $platform;
591	$nodename = `/bin/uname -n`; chomp $nodename;
592	$machine = `/bin/uname -m`; chomp $machine;
593	$release = `/bin/uname -r`; chomp $release;
594	# /bin/zonename is in SUNWzoneu and so may not be present
595	if (-f "/bin/zonename") {
596		$zonename = `/bin/zonename`; chomp $zonename;
597	} else {
598		$zonename = "global";
599	}
600$secondblob=<<'EOF';
601expand<$file.$n> n -1 hasn 1 result </var/log/syslog\.([0-9]+)$0>
602expand<$file.$n> n 0 hasn 1 result </var/log/syslog.0>
603expand<$file.$n> n 1 hasn 1 result </var/log/syslog.1>
604expand<moose%d.$n> n -1 hasn 1 result <moose[0-9]+\.([0-9]+)$0>
605expand<moose%d.$n> n 0 hasn 1 result <moose%d.0>
606expand<moose%d.$n> n 1 hasn 1 result <moose%d.1>
607expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n -1 hasn 1 result </var/logs-[0-9]+/moose-ISAporklips[0-9]+\.([0-9]+)$0>
608expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n 0 hasn 1 result </var/logs-%Y/moose-ISAporklips%d.0>
609expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n 1 hasn 1 result </var/logs-%Y/moose-ISAporklips%d.1>
610EOF
611	$percentd = `/bin/env TZ=UTC /bin/date +%d`; chomp $percentd;
612	$percentY = `/bin/env TZ=UTC /bin/date +%Y`; chomp $percentY;
613	$secondblob =~ s/%d/$percentd/mg;
614	$secondblob =~ s/%Y/$percentY/mg;
615	$secondblob =~ s/ISA/$isa/mg;
616	$utcenv = "TZ=UTC export TZ";
617	chomp $secondblob;
618	set_file('sed.out.expect', <<"EOF");
619            basename syslog
620             dirname /var/log
621              domain $domainname
622                file /var/log/syslog
623                home $dir
624                 isa $isa
625             logname $ENV{LOGNAME}
626             machine $machine
627               nfile
628            nodename $nodename
629            platform $platform
630             release $release
631                user $ENV{USER}
632            zonename $zonename
633$secondblob
634EOF
635
636	set_file('checktest', <<'EOF');
637[ -s std.err ] && { cat std.err; exit 1; }
638/bin/sed -e '/^ *secs [0-9][0-9]*$/d'\
639	-e "s/%d/`/bin/env TZ=UTC /bin/date +%d`/g"\
640	-e "s/%Y/`/bin/env TZ=UTC /bin/date +%Y`/g"\
641	<std.out >sed.out
642exec /bin/diff sed.out.expect sed.out
643EOF
644
645	$kwtest='kwtest /var/log/syslog \'$file.$n\' \'moose%d.$n\' \'/var/logs-%Y/moose-$isa$#porklips%d.$n\'';
646	set_file('runtest', <<"EOF");
647# test "kwtest1"
648$envsetup
649$utcenv
650exec $bindir/$kwtest >std.out 2>std.err
651EOF
652}
653
654###########################################################################
655#
656#	kwtest2 -- NULL environment variables test of the kw.c code
657#
658###########################################################################
659sub kwtest2 {
660	$domainname = `/bin/domainname`; chomp $domainname;
661	$isa = `/bin/uname -p`; chomp $isa;
662	$platform = `/bin/uname -i`; chomp $platform;
663	$nodename = `/bin/uname -n`; chomp $nodename;
664	$machine = `/bin/uname -m`; chomp $machine;
665	$release = `/bin/uname -r`; chomp $release;
666	# /bin/zonename is in SUNWzoneu and so may not be present
667	if (-f "/bin/zonename") {
668		$zonename = `/bin/zonename`; chomp $zonename;
669	} else {
670		$zonename = "global";
671	}
672$secondblob=<<'EOF';
673expand<$file.$n> n -1 hasn 1 result </var/log/syslog\.([0-9]+)$0>
674expand<$file.$n> n 0 hasn 1 result </var/log/syslog.0>
675expand<$file.$n> n 1 hasn 1 result </var/log/syslog.1>
676expand<moose%d.$n> n -1 hasn 1 result <moose[0-9]+\.([0-9]+)$0>
677expand<moose%d.$n> n 0 hasn 1 result <moose%d.0>
678expand<moose%d.$n> n 1 hasn 1 result <moose%d.1>
679expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n -1 hasn 1 result </var/logs-[0-9]+/moose-ISAporklips[0-9]+\.([0-9]+)$0>
680expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n 0 hasn 1 result </var/logs-%Y/moose-ISAporklips%d.0>
681expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n 1 hasn 1 result </var/logs-%Y/moose-ISAporklips%d.1>
682EOF
683	$percentd = `/bin/env TZ=UTC /bin/date +%d`; chomp $percentd;
684	$percentY = `/bin/env TZ=UTC /bin/date +%Y`; chomp $percentY;
685	$secondblob =~ s/%d/$percentd/mg;
686	$secondblob =~ s/%Y/$percentY/mg;
687	$secondblob =~ s/ISA/$isa/mg;
688	chomp $secondblob;
689	set_file('sed.out.expect', <<"EOF");
690            basename syslog
691             dirname /var/log
692              domain $domainname
693                file /var/log/syslog
694                home
695                 isa $isa
696             logname
697             machine $machine
698               nfile
699            nodename $nodename
700            platform $platform
701             release $release
702                user
703            zonename $zonename
704$secondblob
705EOF
706
707	set_file('checktest', <<'EOF');
708[ -s std.err ] && { cat std.err; exit 1; }
709/bin/sed -e '/^ *secs [0-9][0-9]*$/d'\
710	-e "s/%d/`/bin/env TZ=UTC /bin/date +%d`/g"\
711	-e "s/%Y/`/bin/env TZ=UTC /bin/date +%Y`/g"\
712	<std.out >sed.out
713exec /bin/diff sed.out.expect sed.out
714EOF
715
716	$kwtest='kwtest /var/log/syslog \'$file.$n\' \'moose%d.$n\' \'/var/logs-%Y/moose-$isa$#porklips%d.$n\'';
717	set_file('runtest', <<"EOF");
718# test "kwtest2"
719$envsetup
720LOGNAME=
721export LOGNAME
722HOME=
723export HOME
724USER=
725export USER
726TZ=UTC
727export TZ
728exec $bindir/$kwtest >std.out 2>std.err
729EOF
730}
731
732###########################################################################
733#
734#	luttest1 -- minimal basic test of the lut.c code
735#
736###########################################################################
737sub luttest1 {
738	set_file('std.out.expect', <<'EOF');
739lut contains:
740<fix> <NULL> (<NULL>)
741<one> <two> (<two>)
742<seven> <eight> (<eight>)
743<six> <NULL> (<NULL>)
744<three> <four> (<four>)
745dup lut contains:
746<fix> <NULL> (<NULL>)
747<one> <two> (<two>)
748<seven> <eight> (<eight>)
749<six> <NULL> (<NULL>)
750<three> <four> (<four>)
751EOF
752
753	set_file('checktest', <<'EOF');
754[ -s std.err ] && { cat std.err; exit 1; }
755exec /bin/diff std.out.expect std.out
756EOF
757
758	set_file('runtest', <<"EOF");
759# test "luttest1"
760$envsetup
761exec $bindir/luttest one=two three=four fix six seven=eight >std.out 2>std.err
762EOF
763}
764
765###########################################################################
766#
767#	optstest1 -- minimal basic test of the opts.c code
768#
769###########################################################################
770sub optstest1 {
771	$options="-a -b moose -c 1h -d 'Fri Nov  2 13:19:55 2001' -e 1k -f 2 one two three";
772	set_file('std.out.expect', <<"EOF");
773options: $options
774EOF
775
776	set_file('checktest', <<'EOF');
777[ -s std.err ] && { cat std.err; exit 1; }
778exec /bin/diff std.out.expect std.out
779EOF
780
781	set_file('runtest', <<"EOF");
782# test "optstest1"
783$envsetup
784exec $bindir/optstest $options >std.out 2>std.err
785EOF
786}
787
788###########################################################################
789#
790#	optstest2 -- error path through opts.c code
791#
792###########################################################################
793sub optstest2 {
794	$options="-a -b -c 1h -d 'Fri Nov  2 13:19:55 2001' -e 1k -f 2 one two three";
795	set_file('std.err.expect', <<'EOF');
796optstest: Error: Option 'b' requires an argument
797optstest: Error: opts parsing failed
798EOF
799
800	set_file('checktest', <<'EOF');
801[ -s std.out ] && exit 1
802exec /bin/diff std.err.expect std.err
803EOF
804
805	set_file('runtest', <<"EOF");
806# test "optstest2"
807$envsetup
808$bindir/optstest $options >std.out 2>std.err || exit 0
809exit 1
810EOF
811}
812
813###########################################################################
814#
815#	logadmV1 -- test of "logadm -V"
816#
817###########################################################################
818sub logadmV1 {
819	set_testconffile;
820
821	set_file('std.out.expect', <<'EOF');
822/var/adm/messages -C 4 -P 'Thu Nov  1 16:56:42 2001' -a 'kill -HUP `cat /var/run/*syslog*pid`'
823/var/cron/log -s 512k -t /var/cron/olog
824/var/lp/logs/lpsched -C 2 -N -t '$file.$N'
825/var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
826apache -C 24 -a '/usr/apache/bin/apachectl graceful' -p 1m -t '/var/apache/old-logs/$basename.%Y-%m' '/var/apache/logs/*{access,error}_log'
827/var/log/syslog -C 8 -P 'Thu Nov  1 09:16:38 2001' -a 'kill -HUP `cat /var/run/*syslog*pid`'
828/var/apache/logs/access_log -P 'Thu Nov  1 08:27:56 2001'
829/var/apache/logs/error_log -P 'Thu Nov  1 08:27:56 2001'
830/var/apache/logs/suexec_log -P 'Thu Nov  1 08:27:56 2001'
831/var/apache/logs/mod_jserv.log -P 'Thu Nov  1 08:27:56 2001'
832/var/apache/logs/jserv.log -P 'Thu Nov  1 08:27:56 2001'
833EOF
834
835	set_file('checktest', <<'EOF');
836[ -s std.err ] && { cat std.err; exit 1; }
837exec /bin/diff std.out.expect std.out
838EOF
839
840	set_file('runtest', <<"EOF");
841# test "logadmV1"
842$envsetup
843exec $bindir/logadm -f testfile.conf -F testfile.conf -V >std.out 2>std.err
844EOF
845}
846
847###########################################################################
848#
849#	logadmV2 -- test of "logadm -V <entry>"
850#
851###########################################################################
852sub logadmV2 {
853	set_testconffile;
854
855	set_file('std.out.expect', <<'EOF');
856/var/cron/log -s 512k -t /var/cron/olog
857/var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
858EOF
859
860	set_file('checktest', <<'EOF');
861[ -s std.err ] && { cat std.err; exit 1; }
862exec /bin/diff std.out.expect std.out
863EOF
864
865	set_file('runtest', <<"EOF");
866# test "logadmV2"
867$envsetup
868exec $bindir/logadm -f testfile.conf -F testfile.conf -V /var/cron/log /var/adm/pacct >std.out 2>std.err
869EOF
870}
871
872###########################################################################
873#
874#	logadmr -- test of "logadm -r <entry>"
875#
876###########################################################################
877sub logadmr {
878	set_testconffile;
879	set_testconffile('testfile.conf.orig');
880
881	set_file('diff.out.expect', <<'EOF');
88218d17
883< /var/cron/log -s 512k -t /var/cron/olog
88423d21
885< /var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
886EOF
887
888	set_file('checktest', <<'EOF');
889[ -s std.err ] && { cat std.err; exit 1; }
890/bin/diff testfile.conf.orig testfile.conf > diff.out
891exec /bin/diff diff.out.expect diff.out
892EOF
893
894	set_file('runtest', <<"EOF");
895# test "logadmr"
896$envsetup
897exec $bindir/logadm -f testfile.conf -F testfile.conf -r /var/cron/log /var/adm/pacct >std.out 2>std.err
898EOF
899}
900
901###########################################################################
902#
903#	logadmw -- test of "logadm -w <entry>"
904#
905###########################################################################
906sub logadmw {
907	set_testconffile;
908	set_testconffile('testfile.conf.orig');
909
910	set_file('diff.out.expect', <<'EOF');
91130a31
912> moose -C 20 -a moose_after_cmd -g pig -m 664 -o cow -p never /moose/file
913EOF
914
915	set_file('checktest', <<'EOF');
916[ -s std.err ] && { cat std.err; exit 1; }
917/bin/diff testfile.conf.orig testfile.conf > diff.out
918exec /bin/diff diff.out.expect diff.out
919EOF
920
921	set_file('runtest', <<"EOF");
922# test "logadmw"
923$envsetup
924exec $bindir/logadm -f testfile.conf -F testfile.conf -w moose -C 20 -a moose_after_cmd -g pig -m 664 -o cow -p never /moose/file >std.out 2>std.err
925EOF
926}
927
928###########################################################################
929#
930#	logadm1 -- minimal basic test of logadm rotation
931#
932###########################################################################
933sub logadm1 {
934	set_file('logfile', 'initially logfile');
935	set_file('logfile.0', 'initially logfile.0');
936	my ($stdev, $stino, $stmode, $stnlink, $stuid, $stgid, $strdev,
937		$stsize, $statime, $stmtime, $stctime, $stblksize, $stblocks) =
938		lstat 'logfile' or die "lstat logfile: $!\n";
939
940	set_file('checktest', <<"EOF");
941[ -s std.err ] && { cat std.err; exit 1; }
942[ -s std.out ] && exit 1
943[ -s logfile ] && exit 1
944[ -f logfile.0 ] || exit 1
945[ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
946[ "`/bin/ls -i logfile.0 | /bin/awk '{ print \$1; }'`" = "$stino" ] || exit 1
947[ -f logfile.1 ] || exit 1
948[ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
949exit 0
950EOF
951
952	set_file('runtest', <<"EOF");
953# test "logadm1"
954$envsetup
955exec $bindir/logadm -f /dev/null -p now logfile >std.out 2>std.err
956EOF
957}
958
959###########################################################################
960#
961#	logadm1c -- same as logadm1 but with -c option
962#
963###########################################################################
964sub logadm1c {
965	set_file('logfile', 'initially logfile');
966	set_file('logfile.0', 'initially logfile.0');
967	my ($stdev, $stino, $stmode, $stnlink, $stuid, $stgid, $strdev,
968		$stsize, $statime, $stmtime, $stctime, $stblksize, $stblocks) =
969		lstat 'logfile' or die "lstat logfile: $!\n";
970
971	set_file('checktest', <<"EOF");
972[ -s std.err ] && { cat std.err; exit 1; }
973[ -s std.out ] && exit 1
974[ -s logfile ] && exit 1
975[ -f logfile.0 ] || exit 1
976[ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
977[ "`/bin/ls -i logfile.0 | /bin/awk '{ print \$1; }'`" = "$stino" ] && exit 1
978[ -f logfile.1 ] || exit 1
979[ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
980exit 0
981EOF
982
983	set_file('runtest', <<"EOF");
984# test "logadm1c"
985$envsetup
986exec $bindir/logadm -f /dev/null -p now -c logfile >std.out 2>std.err
987EOF
988}
989
990###########################################################################
991#
992#	logadm2 -- minimal basic test of logadm expiration
993#
994###########################################################################
995sub logadm2 {
996	set_file('logfile', 'initially logfile');
997	set_file('logfile.0', 'initially logfile.0');
998	set_file('logfile.1', 'initially logfile.1');
999
1000	set_file('checktest', <<'EOF');
1001[ -s std.err ] && { cat std.err; exit 1; }
1002[ -s std.out ] && exit 1
1003[ -s logfile ] && exit 1
1004[ -f logfile.0 ] || exit 1
1005[ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
1006[ -f logfile.1 ] || exit 1
1007[ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
1008[ -f logfile.2 ] && exit 1
1009exit 0
1010EOF
1011
1012	set_file('runtest', <<"EOF");
1013# test "logadm2"
1014$envsetup
1015exec $bindir/logadm -f /dev/null -p now logfile -C2 >std.out 2>std.err
1016EOF
1017}
1018
1019###########################################################################
1020#
1021#	logadm3 -- minimal basic test of logadm pre/post-commands
1022#
1023###########################################################################
1024sub logadm3 {
1025	set_file('logfile', 'initially logfile');
1026	set_file('logfile.0', 'initially logfile.0');
1027	set_file('logfile.1', 'initially logfile.1');
1028
1029	set_file('checktest', <<'EOF');
1030[ -s std.err ] && { cat std.err; exit 1; }
1031[ -s std.out ] && exit 1
1032[ -s logfile ] && exit 1
1033[ -f logfile.0 ] || exit 1
1034[ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
1035[ -f logfile.1 ] || exit 1
1036[ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
1037[ -f logfile.2 ] && exit 1
1038[ -f pre.out ] || exit 1
1039[ "xpre-command-stuff" = "x`/bin/cat pre.out`" ] || exit 1
1040[ -f post.out ] || exit 1
1041[ "xpost-command-stuff" = "x`/bin/cat post.out`" ] || exit 1
1042exit 0
1043EOF
1044
1045	set_file('runtest', <<"EOF");
1046# test "logadm3"
1047$envsetup
1048exec $bindir/logadm -f /dev/null -p now logfile -C2 -b 'echo pre-command-stuff > pre.out' -a 'echo post-command-stuff > post.out' >std.out 2>std.err
1049EOF
1050}
1051
1052###########################################################################
1053#
1054#	logadm4 -- test of -t template
1055#
1056###########################################################################
1057sub logadm4 {
1058	set_file('logfile', 'initially logfile');
1059
1060	set_file('checktest', <<'EOF');
1061[ -s std.err ] && { cat std.err; exit 1; }
1062[ -s std.out ] && exit 1
1063[ -s logfile ] && exit 1
1064TZ=UTC export TZ
1065d=`/bin/date +%d`
1066[ -f logfile.$d ] || exit 1
1067[ "xinitially logfile" = "x`/bin/cat logfile.$d`" ] || exit 1
1068exit 0
1069EOF
1070
1071	set_file('runtest', <<"EOF");
1072# test "logadm4"
1073$envsetup
1074exec $bindir/logadm -f /dev/null -p now logfile -t '\$file.\%d' >std.out 2>std.err
1075EOF
1076}
1077
1078###########################################################################
1079#
1080#	logadm5 -- test of -R cmd and -E cmd
1081#
1082###########################################################################
1083sub logadm5 {
1084	set_file('logfile', 'initially logfile');
1085	set_file('logfile.0', 'initially logfile.0');
1086
1087	set_file('cmd.out.expect', <<'EOF');
1088just rotated: initially logfile
1089just expired: initially logfile.0
1090EOF
1091
1092	set_file('checktest', <<'EOF');
1093[ -s std.err ] && { cat std.err; exit 1; }
1094[ -s std.out ] && exit 1
1095[ -s logfile ] && exit 1
1096[ -f logfile.0 ] || exit 1
1097[ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
1098[ -f logfile.1 ] || exit 1
1099[ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
1100exec /bin/diff cmd.out.expect cmd.out
1101EOF
1102
1103	set_file('runtest', <<"EOF");
1104# test "logadm5"
1105$envsetup
1106exec $bindir/logadm -f /dev/null -p now logfile -C1 -R 'echo just rotated: `/bin/cat \$file` >>cmd.out' -E 'echo just expired: `/bin/cat \$file` >>cmd.out' >std.out 2>std.err
1107EOF
1108}
1109
1110###########################################################################
1111#
1112#	logadm6 -- test of -m, -o, -g
1113#
1114###########################################################################
1115sub logadm6 {
1116        set_file('logfile', 'initially logfile');
1117
1118        set_file('std.err.expect', <<'EOF');
1119logadm: Warning: command failed: /bin/chown _nonexistentuser_:_nonexistentgroup_ logfile
1120chown: unknown group id _nonexistentgroup_
1121EOF
1122
1123        set_file('checktest', <<'EOF');
1124[ -s std.err ] || exit 1;
1125[ -s std.out ] && exit 1
1126[ -s logfile ] && exit 1
1127[ -f logfile.0 ] || exit 1
1128[ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
1129[ "`/bin/ls -l logfile | /bin/awk '{ print $1; }'`" = "-r----x--x" ] || exit 1
1130exec /bin/diff std.err.expect std.err
1131EOF
1132
1133        set_file('runtest', <<"EOF");
1134# test "logadm6"
1135$envsetup
1136exec $bindir/logadm -f /dev/null -p now logfile -m 411 -o _nonexistentuser_ -g _nonexistentgroup_ >std.out 2>std.err
1137EOF
1138}
1139
1140###########################################################################
1141#
1142#       logadm7 -- test running through a conffile
1143#
1144###########################################################################
1145sub logadm7 {
1146	mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1147	set_file('dir1/syslog', 'initially dir1/syslog');
1148	set_file('dir1/syslog.0', 'initially dir1/syslog.0');
1149	set_file('dir1/syslog.1', 'initially dir1/syslog.1');
1150	set_file('dir1/syslog.2', 'initially dir1/syslog.2');
1151	set_file('dir1/syslog.3', 'initially dir1/syslog.3');
1152	set_file('dir1/syslog.4', 'initially dir1/syslog.4');
1153	set_file('dir1/syslog.5', 'initially dir1/syslog.5');
1154	set_file('dir1/syslog.6', 'initially dir1/syslog.6');
1155	set_file('dir1/syslog.7', 'initially dir1/syslog.7');
1156	mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1157	set_file('dir2/messages', 'initially dir2/messages');
1158	set_file('dir2/messages.0', 'initially dir2/messages.0');
1159	set_file('dir2/messages.1', 'initially dir2/messages.1');
1160	set_file('dir2/messages.2', 'initially dir2/messages.2');
1161	set_file('dir2/messages.3', 'initially dir2/messages.3');
1162
1163	set_file('logadm.conf', <<'EOF');
1164#
1165# logadm.conf
1166#
1167#	this comment # has at least another #-sign in it #...
1168#
1169# Default settings for system log file management.
1170# The -w option to logadm(1M) is the preferred way to write to this file,
1171# but if you do edit it by hand, use "logadm -V" to check it for errors.
1172# but if you do edit it by hand, use "logadm -V" to check it for errors.
1173#
1174# The format of lines in this file is:
1175#       <logname> <options>
1176# For each logname listed here, the default options to logadm
1177# are given.  Options given on the logadm command line override
1178# the defaults contained in this file.
1179#
1180# logadm typically runs early every morning via an entry in
1181# root's crontab (see crontab(1)).
1182#
1183dir1/syslog -C 8 -a 'echo kill -HUP `cat /var/run/*syslog*pid` >> cmd.out'
1184dir2/messages -C 4 -a 'echo kill -HUP `cat /var/run/*syslog*pid` >> cmd.out'
1185#
1186# The entry below is used by turnacct(1M)
1187#
1188/var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
1189EOF
1190
1191	system("/bin/cp logadm.conf logadm.conf.orig");
1192
1193	$pid=`cat /var/run/*syslog*pid`;
1194	chomp $pid;
1195	set_file('cmd.out.expect', <<"EOF");
1196kill -HUP $pid
1197second kill -HUP $pid
1198EOF
1199
1200	set_file('sed.out.expect', <<'EOF');
1201# This file holds internal data for logadm(1M).
1202# Do not edit.
1203dir1/syslog
1204dir2/messages
1205EOF
1206
1207	set_file('checktest', <<'EOF');
1208[ -s std.err ] && { cat std.err; exit 1; }
1209[ -s std.out ] && exit 1
1210[ -s logadm.timestamps ] || exit 1
1211[ -s std.err2 ] && exit 1
1212[ -s std.out2 ] && exit 1
1213[ -s std.err3 ] && exit 1
1214[ -s std.out3 ] && exit 1
1215[ -s std.err4 ] && exit 1
1216[ -s std.out4 ] && exit 1
1217[ -f dir1/syslog ] || exit 1
1218[ "xsomething" = "x`/bin/cat dir1/syslog`" ] || exit 1
1219[ -f dir1/syslog.0 ] || exit 1
1220[ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1221[ -f dir1/syslog.1 ] || exit 1
1222[ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1223[ -f dir1/syslog.2 ] || exit 1
1224[ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1225[ -f dir1/syslog.3 ] || exit 1
1226[ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1227[ -f dir1/syslog.4 ] || exit 1
1228[ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1229[ -f dir1/syslog.5 ] || exit 1
1230[ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1231[ -f dir1/syslog.6 ] || exit 1
1232[ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1233[ -f dir1/syslog.7 ] || exit 1
1234[ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1235[ -f dir1/syslog.8 ] && exit 1
1236
1237[ -s dir2/messages ] && exit 1
1238[ -f dir2/messages.0 ] || exit 1
1239[ "xsomething" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1240[ -f dir2/messages.1 ] || exit 1
1241[ "xinitially dir2/messages" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1242[ -f dir2/messages.2 ] || exit 1
1243[ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1244[ -f dir2/messages.3 ] || exit 1
1245[ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1246[ -f dir2/messages.4 ] && exit 1
1247/bin/sed "s/ -P '[^']*' *//" < logadm.timestamps > sed.out
1248/bin/diff sed.out.expect sed.out || exit 1
1249exec /bin/diff logadm.conf.orig logadm.conf
1250EOF
1251
1252        # first logadm call will rotate both syslog and messages
1253        # second one won't because size is zero
1254        # third one won't because of -P timestamps stored in conffile
1255        # fourth one will do messages because of -p now on command line
1256        set_file('runtest', <<"EOF");
1257# test "logadm7"
1258$envsetup
1259$bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err || exit 1
1260$bindir/logadm -f logadm.conf -F logadm.timestamps dir1/syslog dir2/messages >std.out2 2>std.err2 || exit 1
1261echo something > dir1/syslog
1262echo something > dir2/messages
1263$bindir/logadm -f logadm.conf -F logadm.timestamps >std.out3 2>std.err3 || exit 1
1264exec $bindir/logadm -f logadm.conf -F logadm.timestamps dir2/messages -p now -a 'echo second kill -HUP `cat /var/run/*syslog*pid` >> cmd.out' >std.out4 2>std.err4
1265EOF
1266}
1267
1268###########################################################################
1269#
1270#       logadm8 -- test of -z
1271#
1272###########################################################################
1273sub logadm8 {
1274	mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1275	set_file('dir1/syslog', 'initially dir1/syslog');
1276	set_file('dir1/syslog.0', 'initially dir1/syslog.0');
1277	set_file('dir1/syslog.1', 'initially dir1/syslog.1');
1278	set_file('dir1/syslog.2', 'initially dir1/syslog.2');
1279	system("/bin/gzip dir1/syslog.2");
1280	die "gzip dir1/syslog.2 didn't work\n" unless -f 'dir1/syslog.2.gz';
1281	set_file('dir1/syslog.3', 'initially dir1/syslog.3');
1282	system("/bin/gzip dir1/syslog.3");
1283	die "gzip dir1/syslog.3 didn't work\n" unless -f 'dir1/syslog.3.gz';
1284	set_file('dir1/syslog.4', 'initially dir1/syslog.4');
1285	system("/bin/gzip dir1/syslog.4");
1286	die "gzip dir1/syslog.4 didn't work\n" unless -f 'dir1/syslog.4.gz';
1287	set_file('dir1/syslog.5', 'initially dir1/syslog.5');
1288	system("/bin/gzip dir1/syslog.5");
1289	die "gzip dir1/syslog.5 didn't work\n" unless -f 'dir1/syslog.5.gz';
1290	set_file('dir1/syslog.6', 'initially dir1/syslog.6');
1291	system("/bin/gzip dir1/syslog.6");
1292	die "gzip dir1/syslog.6 didn't work\n" unless -f 'dir1/syslog.6.gz';
1293	set_file('dir1/syslog.7', 'initially dir1/syslog.7');
1294	system("/bin/gzip dir1/syslog.7");
1295	die "gzip dir1/syslog.7 didn't work\n" unless -f 'dir1/syslog.7.gz';
1296
1297	set_file('checktest', <<'EOF');
1298[ -s std.err ] && { cat std.err; exit 1; }
1299[ -s std.out ] && exit 1
1300[ -f dir1/syslog ] || exit 1
1301[ -s dir1/syslog ] && exit 1
1302[ -f dir1/syslog.0 ] || exit 1
1303[ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1304[ -f dir1/syslog.1 ] || exit 1
1305[ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1306[ -f dir1/syslog.2.gz ] || exit 1
1307[ "xinitially dir1/syslog.1" = "x`/bin/gzcat dir1/syslog.2.gz`" ] || exit 1
1308[ -f dir1/syslog.3.gz ] || exit 1
1309[ "xinitially dir1/syslog.2" = "x`/bin/gzcat dir1/syslog.3.gz`" ] || exit 1
1310[ -f dir1/syslog.4.gz ] || exit 1
1311[ "xinitially dir1/syslog.3" = "x`/bin/gzcat dir1/syslog.4.gz`" ] || exit 1
1312[ -f dir1/syslog.5.gz ] || exit 1
1313[ "xinitially dir1/syslog.4" = "x`/bin/gzcat dir1/syslog.5.gz`" ] || exit 1
1314[ -f dir1/syslog.6.gz ] || exit 1
1315[ "xinitially dir1/syslog.5" = "x`/bin/gzcat dir1/syslog.6.gz`" ] || exit 1
1316[ -f dir1/syslog.7.gz ] || exit 1
1317[ "xinitially dir1/syslog.6" = "x`/bin/gzcat dir1/syslog.7.gz`" ] || exit 1
1318[ -f dir1/syslog.8 ] && exit 1
1319[ -f dir1/syslog.8.gz ] && exit 1
1320exit 0
1321EOF
1322
1323        set_file('runtest', <<"EOF");
1324# test "logadm8"
1325$envsetup
1326exec $bindir/logadm -f /dev/null dir1/syslog -z 2 -C 8 >std.out 2>std.err
1327EOF
1328}
1329
1330###########################################################################
1331#
1332#       logadm9 -- test of age check
1333#
1334###########################################################################
1335sub logadm9 {
1336	mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1337	set_file('dir1/syslog', 'initially dir1/syslog');
1338	set_file('dir1/syslog.0', 'initially dir1/syslog.0');
1339	set_file('dir1/syslog.1', 'initially dir1/syslog.1');
1340	set_file('dir1/syslog.2', 'initially dir1/syslog.2');
1341	set_file('dir1/syslog.3', 'initially dir1/syslog.3');
1342	set_file('dir1/syslog.4', 'initially dir1/syslog.4');
1343	set_file('dir1/syslog.5', 'initially dir1/syslog.5');
1344	set_file('dir1/syslog.6', 'initially dir1/syslog.6');
1345	set_file('dir1/syslog.7', 'initially dir1/syslog.7');
1346	set_file('dir1/notes', 'initially dir1/notes');
1347	mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1348	set_file('dir2/messages', 'initially dir2/messages');
1349	set_file('dir2/messages.0', 'initially dir2/messages.0');
1350	set_file('dir2/messages.1', 'initially dir2/messages.1');
1351	set_file('dir2/messages.2', 'initially dir2/messages.2');
1352	set_file('dir2/messages.3', 'initially dir2/messages.3');
1353	set_file('dir2/log', 'initially dir2/log');
1354
1355	$now = time;
1356	$nowstr = gmtime($now);
1357	# a week minus 30 seconds ago...
1358	# technically not a full week, but the heuristic used by logadm
1359	# should think this is "close enough" to a full week
1360	$closetoweeksecs = $now - (60 * 60 * 24 * 7 - 30);
1361	$closetoweek = gmtime($closetoweeksecs);
1362	# a week minus six hours ago...
1363	$lessthanweeksecs = $now - (60 * 60 * 24 * 7 - 60 * 60 * 6);
1364	$lessthanweek = gmtime($lessthanweeksecs);
1365
1366	set_file('logadm.conf', <<"EOF");
1367# now: $nowstr is $now
1368# $closetoweek is $closetoweeksecs
1369dir1/syslog -C 8 -P '$closetoweek'
1370dir2/log -C 4
1371# $lessthanweek is $lessthanweeksecs
1372dir1/notes -C 2 -P '$lessthanweek'
1373dir2/messages -C 4
1374EOF
1375	set_file('logadm.timestamps', <<"EOF");
1376dir2/log -P '$closetoweek'
1377dir2/messages -P '$lessthanweek'
1378EOF
1379
1380	set_file('sed.out.expect', <<"EOF");
1381# This file holds internal data for logadm(1M).
1382# Do not edit.
1383dir1/syslog
1384dir2/log
1385dir1/notes
1386dir2/messages
1387EOF
1388
1389	set_file('checktest', <<'EOF');
1390[ -s std.err ] && { cat std.err; exit 1; }
1391[ -s std.out ] && exit 1
1392[ -f dir1/syslog ] || exit 1
1393[ -s dir1/syslog ] && exit 1
1394[ -f dir1/syslog.0 ] || exit 1
1395[ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1396[ -f dir1/syslog.1 ] || exit 1
1397[ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1398[ -f dir1/syslog.2 ] || exit 1
1399[ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1400[ -f dir1/syslog.3 ] || exit 1
1401[ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1402[ -f dir1/syslog.4 ] || exit 1
1403[ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1404[ -f dir1/syslog.5 ] || exit 1
1405[ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1406[ -f dir1/syslog.6 ] || exit 1
1407[ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1408[ -f dir1/syslog.7 ] || exit 1
1409[ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1410[ -f dir1/syslog.8 ] && exit 1
1411
1412[ -s dir1/notes ] || exit 1
1413[ "xinitially dir1/notes" = "x`/bin/cat dir1/notes`" ] || exit 1
1414[ -f dir1/notes.0 ] && exit 1
1415
1416[ -f dir2/messages ] || exit 1
1417[ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1418[ -f dir2/messages.0 ] || exit 1
1419[ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1420[ -f dir2/messages.1 ] || exit 1
1421[ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1422[ -f dir2/messages.2 ] || exit 1
1423[ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1424[ -f dir2/messages.3 ] || exit 1
1425[ "xinitially dir2/messages.3" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1426[ -f dir2/messages.4 ] && exit 1
1427
1428[ -f dir2/log ] || exit 1
1429[ -s dir2/log ] && exit 1
1430[ -f dir2/log.0 ] || exit 1
1431[ "xinitially dir2/log" = "x`/bin/cat dir2/log.0`" ] || exit 1
1432[ -f dir2/log.1 ] && exit 1
1433
1434/bin/sed "s/ -P '[^']*' *//" < logadm.timestamps > sed.out
1435/bin/diff sed.out.expect sed.out || exit 1
1436/bin/sed -n "s/ -P '[^']*' */<&>/p" < logadm.conf > sed.out
1437[ -s sed.out ] && exit 1
1438exit 0
1439EOF
1440
1441        set_file('runtest', <<"EOF");
1442# test "logadm9"
1443$envsetup
1444exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1445EOF
1446}
1447
1448###########################################################################
1449#
1450#       logadm9d -- test of age check like logadm9, but age is a couple days
1451#
1452###########################################################################
1453sub logadm9d {
1454	mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1455	set_file('dir1/syslog', 'initially dir1/syslog');
1456	set_file('dir1/syslog.0', 'initially dir1/syslog.0');
1457	set_file('dir1/syslog.1', 'initially dir1/syslog.1');
1458	set_file('dir1/syslog.2', 'initially dir1/syslog.2');
1459	set_file('dir1/syslog.3', 'initially dir1/syslog.3');
1460	set_file('dir1/syslog.4', 'initially dir1/syslog.4');
1461	set_file('dir1/syslog.5', 'initially dir1/syslog.5');
1462	set_file('dir1/syslog.6', 'initially dir1/syslog.6');
1463	set_file('dir1/syslog.7', 'initially dir1/syslog.7');
1464	mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1465	set_file('dir2/messages', 'initially dir2/messages');
1466	set_file('dir2/messages.0', 'initially dir2/messages.0');
1467	set_file('dir2/messages.1', 'initially dir2/messages.1');
1468	set_file('dir2/messages.2', 'initially dir2/messages.2');
1469	set_file('dir2/messages.3', 'initially dir2/messages.3');
1470
1471	$now = time;
1472	$nowstr = gmtime($now);
1473	# a day minus 30 seconds ago...
1474	$closetodaysecs = $now - (60 * 60 * 24 - 30);
1475	$closetoday = gmtime($closetodaysecs);
1476	# a day minus six hours ago...
1477	$lessthandaysecs = $now - (60 * 60 * 24 - 60 * 60 * 6);
1478	$lessthanday = gmtime($lessthandaysecs);
1479
1480	set_file('logadm.conf', <<"EOF");
1481# now: $nowstr is $now
1482# $closetoday is $closetodaysecs
1483dir1/syslog -p 1d -C 8 -P '$closetoday'
1484# $lessthanday is $lessthandaysecs
1485dir2/messages -p 1d -C 4 -P '$lessthanday'
1486EOF
1487
1488	set_file('checktest', <<'EOF');
1489[ -s std.err ] && { cat std.err; exit 1; }
1490[ -s std.out ] && exit 1
1491[ -f dir1/syslog ] || exit 1
1492[ -s dir1/syslog ] && exit 1
1493[ -f dir1/syslog.0 ] || exit 1
1494[ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1495[ -f dir1/syslog.1 ] || exit 1
1496[ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1497[ -f dir1/syslog.2 ] || exit 1
1498[ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1499[ -f dir1/syslog.3 ] || exit 1
1500[ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1501[ -f dir1/syslog.4 ] || exit 1
1502[ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1503[ -f dir1/syslog.5 ] || exit 1
1504[ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1505[ -f dir1/syslog.6 ] || exit 1
1506[ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1507[ -f dir1/syslog.7 ] || exit 1
1508[ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1509[ -f dir1/syslog.8 ] && exit 1
1510
1511[ -f dir2/messages ] || exit 1
1512[ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1513[ -f dir2/messages.0 ] || exit 1
1514[ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1515[ -f dir2/messages.1 ] || exit 1
1516[ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1517[ -f dir2/messages.2 ] || exit 1
1518[ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1519[ -f dir2/messages.3 ] || exit 1
1520[ "xinitially dir2/messages.3" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1521[ -f dir2/messages.4 ] && exit 1
1522exit 0
1523EOF
1524
1525        set_file('runtest', <<"EOF");
1526# test "logadm9d"
1527$envsetup
1528exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1529EOF
1530}
1531
1532###########################################################################
1533#
1534#       logadm10 -- test of size-based rotation check
1535#
1536###########################################################################
1537sub logadm10 {
1538	mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1539	set_file('dir1/syslog', 'initially dir1/syslogXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
1540	set_file('dir1/syslog.0', 'initially dir1/syslog.0');
1541	set_file('dir1/syslog.1', 'initially dir1/syslog.1');
1542	set_file('dir1/syslog.2', 'initially dir1/syslog.2');
1543	set_file('dir1/syslog.3', 'initially dir1/syslog.3');
1544	set_file('dir1/syslog.4', 'initially dir1/syslog.4');
1545	set_file('dir1/syslog.5', 'initially dir1/syslog.5');
1546	set_file('dir1/syslog.6', 'initially dir1/syslog.6');
1547	set_file('dir1/syslog.7', 'initially dir1/syslog.7');
1548	mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1549	set_file('dir2/messages', 'initially dir2/messages');
1550	set_file('dir2/messages.0', 'initially dir2/messages.0');
1551	set_file('dir2/messages.1', 'initially dir2/messages.1');
1552	set_file('dir2/messages.2', 'initially dir2/messages.2');
1553	set_file('dir2/messages.3', 'initially dir2/messages.3');
1554
1555	set_file('logadm.conf', <<"EOF");
1556dir1/syslog -C 8 -s 30b
1557dir2/messages -C 4 -s 30b
1558EOF
1559
1560	set_file('checktest', <<'EOF');
1561[ -s std.err ] && { cat std.err; exit 1; }
1562[ -s std.out ] && exit 1
1563[ -f dir1/syslog ] || exit 1
1564[ -s dir1/syslog ] && exit 1
1565[ -f dir1/syslog.0 ] || exit 1
1566[ "xinitially dir1/syslogXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1567[ -f dir1/syslog.1 ] || exit 1
1568[ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1569[ -f dir1/syslog.2 ] || exit 1
1570[ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1571[ -f dir1/syslog.3 ] || exit 1
1572[ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1573[ -f dir1/syslog.4 ] || exit 1
1574[ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1575[ -f dir1/syslog.5 ] || exit 1
1576[ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1577[ -f dir1/syslog.6 ] || exit 1
1578[ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1579[ -f dir1/syslog.7 ] || exit 1
1580[ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1581[ -f dir1/syslog.8 ] && exit 1
1582
1583[ -f dir2/messages ] || exit 1
1584[ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1585[ -f dir2/messages.0 ] || exit 1
1586[ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1587[ -f dir2/messages.1 ] || exit 1
1588[ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1589[ -f dir2/messages.2 ] || exit 1
1590[ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1591[ -f dir2/messages.3 ] || exit 1
1592[ "xinitially dir2/messages.3" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1593[ -f dir2/messages.4 ] && exit 1
1594exit 0
1595EOF
1596
1597        set_file('runtest', <<"EOF");
1598# test "logadm10"
1599$envsetup
1600exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1601EOF
1602}
1603
1604###########################################################################
1605#
1606#       logadm11 -- test of size-based expiration check
1607#
1608###########################################################################
1609sub logadm11 {
1610	mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1611	set_file('dir1/syslog', 'initially dir1/syslog');
1612	set_file('dir1/syslog.0', 'initially dir1/syslog.0');
1613	set_file('dir1/syslog.1', 'initially dir1/syslog.1');
1614	set_file('dir1/syslog.2', 'initially dir1/syslog.2');
1615	set_file('dir1/syslog.3', 'initially dir1/syslog.3');
1616	set_file('dir1/syslog.4', 'initially dir1/syslog.4');
1617	set_file('dir1/syslog.5', 'initially dir1/syslog.5');
1618	set_file('dir1/syslog.6', 'initially dir1/syslog.6');
1619	set_file('dir1/syslog.7', 'initially dir1/syslog.7');
1620	mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1621	set_file('dir2/messages', 'initially dir2/messages');
1622	set_file('dir2/messages.0', 'initially dir2/messages.0');
1623	set_file('dir2/messages.1', 'initially dir2/messages.1');
1624	set_file('dir2/messages.2', 'initially dir2/messages.2');
1625	set_file('dir2/messages.3', 'initially dir2/messages.3');
1626
1627	set_file('logadm.conf', <<"EOF");
1628dir1/syslog -C 8 -s 30b -S 75b
1629dir2/messages -C 4 -s 30b -S 75b
1630EOF
1631
1632	set_file('checktest', <<'EOF');
1633[ -s std.err ] && { cat std.err; exit 1; }
1634[ -s std.out ] && exit 1
1635[ -f dir1/syslog ] || exit 1
1636[ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog`" ] || exit 1
1637[ -f dir1/syslog.0 ] || exit 1
1638[ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1639[ -f dir1/syslog.1 ] || exit 1
1640[ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1641[ -f dir1/syslog.2 ] || exit 1
1642[ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1643[ -f dir1/syslog.3 ] && exit 1
1644[ -f dir1/syslog.4 ] && exit 1
1645[ -f dir1/syslog.5 ] && exit 1
1646[ -f dir1/syslog.6 ] && exit 1
1647[ -f dir1/syslog.7 ] && exit 1
1648[ -f dir1/syslog.8 ] && exit 1
1649
1650[ -f dir2/messages ] || exit 1
1651[ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1652[ -f dir2/messages.0 ] || exit 1
1653[ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1654[ -f dir2/messages.1 ] || exit 1
1655[ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1656[ -f dir2/messages.2 ] || exit 1
1657[ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1658[ -f dir2/messages.3 ] && exit 1
1659[ -f dir2/messages.4 ] && exit 1
1660exit 0
1661EOF
1662
1663        set_file('runtest', <<"EOF");
1664# test "logadm11"
1665$envsetup
1666exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1667EOF
1668}
1669
1670###########################################################################
1671#
1672#	logadm12 -- ENOENT error path
1673#
1674###########################################################################
1675sub logadm12 {
1676	set_file('std.err.expect', <<'EOF');
1677logadm: Warning: logfile: No such file or directory
1678EOF
1679
1680	set_file('checktest', <<"EOF");
1681[ -s std.out ] && exit 1
1682exec /bin/diff std.err.expect std.err
1683EOF
1684
1685	set_file('runtest', <<"EOF");
1686# test "logadm12"
1687$envsetup
1688exec $bindir/logadm -f /dev/null logfile >std.out 2>std.err
1689EOF
1690}
1691
1692###########################################################################
1693#
1694#	logadm13 -- ENOENT error path with -N flag
1695#
1696###########################################################################
1697sub logadm13 {
1698	set_file('checktest', <<"EOF");
1699[ -s std.err ] && { cat std.err; exit 1; }
1700[ -s std.out ] && exit 1
1701exit 0
1702EOF
1703
1704	set_file('runtest', <<"EOF");
1705# test "logadm13"
1706$envsetup
1707exec $bindir/logadm -N -f /dev/null logfile >std.out 2>std.err
1708EOF
1709}
1710
1711###########################################################################
1712#
1713#       logadm14 -- test of -n and -v flags
1714#
1715###########################################################################
1716sub logadm14 {
1717	mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1718	set_file('dir1/syslog', 'initially dir1/syslog');
1719	set_file('dir1/syslog.0', 'initially dir1/syslog.0');
1720	set_file('dir1/syslog.1', 'initially dir1/syslog.1');
1721	set_file('dir1/syslog.2', 'initially dir1/syslog.2');
1722	set_file('dir1/syslog.3', 'initially dir1/syslog.3');
1723	set_file('dir1/syslog.4', 'initially dir1/syslog.4');
1724	set_file('dir1/syslog.5', 'initially dir1/syslog.5');
1725	set_file('dir1/syslog.6', 'initially dir1/syslog.6');
1726	set_file('dir1/syslog.7', 'initially dir1/syslog.7');
1727	mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1728	set_file('dir2/messages', 'initially dir2/messages');
1729	set_file('dir2/messages.0', 'initially dir2/messages.0');
1730	set_file('dir2/messages.1', 'initially dir2/messages.1');
1731	set_file('dir2/messages.2', 'initially dir2/messages.2');
1732	set_file('dir2/messages.3', 'initially dir2/messages.3');
1733
1734	set_file('logadm.conf', <<'EOF');
1735#
1736# logadm.conf
1737#
1738# Default settings for system log file management.
1739# The -w option to logadm(1M) is the preferred way to write to this file,
1740# but if you do edit it by hand, use "logadm -V" to check it for errors.
1741# but if you do edit it by hand, use "logadm -V" to check it for errors.
1742#
1743# The format of lines in this file is:
1744#       <logname> <options>
1745# For each logname listed here, the default options to logadm
1746# are given.  Options given on the logadm command line override
1747# the defaults contained in this file.
1748#
1749# logadm typically runs early every morning via an entry in
1750# root's crontab (see crontab(1)).
1751#
1752dir1/syslog -C 8 -a 'echo kill -HUP `cat /var/run/*syslog*pid` >> cmd.out'
1753dir2/messages -C 4 -a 'echo kill -HUP `cat /var/run/*syslog*pid` >> cmd.out'
1754#
1755# The entry below is used by turnacct(1M)
1756#
1757/var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
1758EOF
1759
1760	$gid = $);
1761	$gid =~ s/ .*//;
1762	set_file('grep.out.expect', <<'EOF'.<<"EOF".<<'EOF'.<<"EOF".<<'EOF');
1763# loading logadm.conf
1764# processing logname: dir1/syslog
1765#     using default rotate rules: -s1b -p1w
1766#     using default template: $file.$n
1767mkdir -p dir1 # verify directory exists
1768mv -f dir1/syslog.7 dir1/syslog.8 # rotate log file
1769mkdir -p dir1 # verify directory exists
1770mv -f dir1/syslog.6 dir1/syslog.7 # rotate log file
1771mkdir -p dir1 # verify directory exists
1772mv -f dir1/syslog.5 dir1/syslog.6 # rotate log file
1773mkdir -p dir1 # verify directory exists
1774mv -f dir1/syslog.4 dir1/syslog.5 # rotate log file
1775mkdir -p dir1 # verify directory exists
1776mv -f dir1/syslog.3 dir1/syslog.4 # rotate log file
1777mkdir -p dir1 # verify directory exists
1778mv -f dir1/syslog.2 dir1/syslog.3 # rotate log file
1779mkdir -p dir1 # verify directory exists
1780mv -f dir1/syslog.1 dir1/syslog.2 # rotate log file
1781mkdir -p dir1 # verify directory exists
1782mv -f dir1/syslog.0 dir1/syslog.1 # rotate log file
1783mkdir -p dir1 # verify directory exists
1784mv -f dir1/syslog dir1/syslog.0 # rotate log file
1785touch dir1/syslog
1786EOF
1787chown $>:$gid dir1/syslog
1788EOF
1789chmod 664 dir1/syslog
1790# processing logname: dir2/messages
1791#     using default rotate rules: -s1b -p1w
1792#     using default template: $file.$n
1793mkdir -p dir2 # verify directory exists
1794mv -f dir2/messages.3 dir2/messages.4 # rotate log file
1795mkdir -p dir2 # verify directory exists
1796mv -f dir2/messages.2 dir2/messages.3 # rotate log file
1797mkdir -p dir2 # verify directory exists
1798mv -f dir2/messages.1 dir2/messages.2 # rotate log file
1799mkdir -p dir2 # verify directory exists
1800mv -f dir2/messages.0 dir2/messages.1 # rotate log file
1801mkdir -p dir2 # verify directory exists
1802mv -f dir2/messages dir2/messages.0 # rotate log file
1803touch dir2/messages
1804EOF
1805chown $>:$gid dir2/messages
1806EOF
1807chmod 664 dir2/messages
1808# processing logname: /var/adm/pacct
1809#     using default template: $file.$n
1810sh -c echo kill -HUP `cat /var/run/*syslog*pid` >> cmd.out # -a cmd
1811# logadm.conf and logadm.timestamps unchanged
1812EOF
1813
1814	set_file('checktest', <<'EOF');
1815[ -s std.err ] && { cat std.err; exit 1; }
1816[ -f std.out ] || exit 1
1817[ -f dir1/syslog ] || exit 1
1818[ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog`" ] || exit 1
1819[ -f dir1/syslog.0 ] || exit 1
1820[ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1821[ -f dir1/syslog.1 ] || exit 1
1822[ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1823[ -f dir1/syslog.2 ] || exit 1
1824[ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1825[ -f dir1/syslog.3 ] || exit 1
1826[ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1827[ -f dir1/syslog.4 ] || exit 1
1828[ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1829[ -f dir1/syslog.5 ] || exit 1
1830[ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1831[ -f dir1/syslog.6 ] || exit 1
1832[ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1833[ -f dir1/syslog.7 ] || exit 1
1834[ "xinitially dir1/syslog.7" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1835[ -f dir1/syslog.8 ] && exit 1
1836
1837[ -f dir2/messages ] || exit 1
1838[ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1839[ -f dir2/messages.0 ] || exit 1
1840[ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1841[ -f dir2/messages.1 ] || exit 1
1842[ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1843[ -f dir2/messages.2 ] || exit 1
1844[ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1845[ -f dir2/messages.3 ] || exit 1
1846[ "xinitially dir2/messages.3" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1847[ -f dir2/messages.4 ] && exit 1
1848/bin/grep -v 'recording rotation date' std.out > grep.out
1849exec /bin/diff grep.out.expect grep.out
1850EOF
1851
1852        set_file('runtest', <<"EOF");
1853# test "logadm14"
1854$envsetup
1855exec $bindir/logadm -nv -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1856EOF
1857}
1858
1859###########################################################################
1860#
1861#	logadm15 -- test of -T
1862#
1863###########################################################################
1864sub logadm15 {
1865	set_file('logfile', '');
1866	set_file('logfile.0', 'initially logfile.0');
1867	set_file('logfile.1', 'initially logfile.1');
1868	set_file('logfile.2', 'initially logfile.2');
1869	set_file('logfile.3', 'initially logfile.3');
1870	set_file('logfile.4', 'initially logfile.4');
1871	set_file('logfile.5', 'initially logfile.5');
1872	set_file('logfile.6', 'initially logfile.6');
1873	set_file('logfile.7', 'initially logfile.7');
1874	set_file('logfile.8', 'initially logfile.8');
1875	set_file('logfile.9', 'initially logfile.9');
1876
1877	set_file('checktest', <<'EOF');
1878[ -s std.err ] && { cat std.err; exit 1; }
1879[ -s std.out ] && exit 1
1880[ -f logfile ] || exit 1
1881[ "x" = "x`/bin/cat logfile`" ] || exit 1
1882[ -f logfile.0 ] || exit 1
1883[ "xinitially logfile.0" = "x`/bin/cat logfile.0`" ] || exit 1
1884[ -f logfile.1 ] || exit 1
1885[ "xinitially logfile.1" = "x`/bin/cat logfile.1`" ] || exit 1
1886[ -f logfile.2 ] || exit 1
1887[ "xinitially logfile.2" = "x`/bin/cat logfile.2`" ] || exit 1
1888[ -f logfile.3 ] && exit 1
1889[ -f logfile.4 ] || exit 1
1890[ "xinitially logfile.4" = "x`/bin/cat logfile.4`" ] || exit 1
1891[ -f logfile.5 ] && exit 1
1892[ -f logfile.6 ] || exit 1
1893[ "xinitially logfile.6" = "x`/bin/cat logfile.6`" ] || exit 1
1894[ -f logfile.7 ] && exit 1
1895[ -f logfile.8 ] || exit 1
1896[ "xinitially logfile.8" = "x`/bin/cat logfile.8`" ] || exit 1
1897[ -f logfile.9 ] && exit 1
1898[ -f logfile.10 ] && exit 1
1899exit 0
1900EOF
1901
1902	set_file('runtest', <<"EOF");
1903# test "logadm15"
1904$envsetup
1905exec $bindir/logadm -f /dev/null logfile -C1 -T '*.[13579]'>std.out 2>std.err
1906EOF
1907}
1908
1909###########################################################################
1910#
1911#	logadm16 -- test of -h
1912#
1913###########################################################################
1914sub logadm16 {
1915	set_file('std.err.expect', <<'EOF');
1916Usage: logadm [options]
1917       (processes all entries in /etc/logadm.conf or conffile given by -f)
1918   or: logadm [options] logname...
1919       (processes the given lognames)
1920
1921General options:
1922        -e mailaddr     mail errors to given address
1923        -F timestamps   use timestamps instead of /var/logadm/timestamps
1924        -f conffile     use conffile instead of /etc/logadm.conf
1925        -h              display help
1926        -N              not an error if log file nonexistent
1927        -n              show actions, don't perform them
1928        -r              remove logname entry from conffile
1929        -V              ensure conffile entries exist, correct
1930        -v              print info about actions happening
1931        -w entryname    write entry to config file
1932
1933Options which control when a logfile is rotated:
1934(default is: -s1b -p1w if no -s or -p)
1935        -p period       only rotate if period passed since last rotate
1936        -P timestamp    used to store rotation date in conffile
1937        -s size         only rotate if given size or greater
1938
1939Options which control how a logfile is rotated:
1940(default is: -t '$file.$n', owner/group/mode taken from log file)
1941        -a cmd          execute cmd after taking actions
1942        -b cmd          execute cmd before taking actions
1943        -c              copy & truncate logfile, don't rename
1944        -g group        new empty log file group
1945        -l              rotate log file with local time rather than UTC
1946        -m mode         new empty log file mode
1947        -M cmd          execute cmd to rotate the log file
1948        -o owner        new empty log file owner
1949        -R cmd          run cmd on file after rotate
1950        -t template     template for naming old logs
1951        -z count        gzip old logs except most recent count
1952
1953Options which control the expiration of old logfiles:
1954(default is: -C10 if no -A, -C, or -S)
1955        -A age          expire logs older than age
1956        -C count        expire old logs until count remain
1957        -E cmd          run cmd on file to expire
1958        -S size         expire until space used is below size
1959        -T pattern      pattern for finding old logs
1960EOF
1961
1962	set_file('checktest', <<'EOF');
1963[ -s std.out ] && exit 1
1964exec /bin/diff std.err.expect std.err
1965EOF
1966
1967	set_file('runtest', <<"EOF");
1968# test "logadm16"
1969$envsetup
1970exec $bindir/logadm -h >std.out 2>std.err
1971EOF
1972}
1973
1974###########################################################################
1975#
1976#       logadm17 -- test that mkdir -p happens as necessary
1977#
1978###########################################################################
1979sub logadm17 {
1980	set_file('logfile', 'initially logfile');
1981
1982	set_file('checktest', <<'EOF');
1983[ -s std.err ] && { cat std.err; exit 1; }
1984[ -s std.out ] && exit 1
1985[ -f dir1/dir2/logfile ] || exit 1
1986[ -f logfile ] || exit 1
1987[ "xinitially logfile" = "x`/bin/cat dir1/dir2/logfile`" ] || exit 1
1988exit 0
1989EOF
1990
1991        set_file('runtest', <<"EOF");
1992# test "logadm17"
1993$envsetup
1994exec $bindir/logadm -f /dev/null -t 'dir1/dir2/\$basename' logfile -p now >std.out 2>std.err
1995EOF
1996}
1997
1998###########################################################################
1999#
2000#       logadm18 -- test of -M option
2001#
2002###########################################################################
2003sub logadm18 {
2004	mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
2005	set_file('dir1/syslog', 'initially dir1/syslog');
2006	set_file('dir1/syslog.0', 'initially dir1/syslog.0');
2007	set_file('dir1/syslog.1', 'initially dir1/syslog.1');
2008	set_file('dir1/syslog.2', 'initially dir1/syslog.2');
2009	set_file('dir1/syslog.3', 'initially dir1/syslog.3');
2010	set_file('dir1/syslog.4', 'initially dir1/syslog.4');
2011	set_file('dir1/syslog.5', 'initially dir1/syslog.5');
2012	set_file('dir1/syslog.6', 'initially dir1/syslog.6');
2013	set_file('dir1/syslog.7', 'initially dir1/syslog.7');
2014
2015	set_file('logadm.conf', <<"EOF");
2016dir1/syslog -C 8 -s 1b -M '/bin/tr [a-z] [A-Z] < \$file > \$nfile; /bin/rm -f \$file'
2017EOF
2018
2019	set_file('checktest', <<'EOF');
2020[ -s std.err ] && { cat std.err; exit 1; }
2021[ -s std.out ] && exit 1
2022[ -f dir1/syslog ] || exit 1
2023[ -s dir1/syslog ] && exit 1
2024[ -f dir1/syslog.0 ] || exit 1
2025[ "xINITIALLY DIR1/SYSLOG" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
2026[ -f dir1/syslog.1 ] || exit 1
2027[ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
2028[ -f dir1/syslog.2 ] || exit 1
2029[ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
2030[ -f dir1/syslog.3 ] || exit 1
2031[ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
2032[ -f dir1/syslog.4 ] || exit 1
2033[ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
2034[ -f dir1/syslog.5 ] || exit 1
2035[ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
2036[ -f dir1/syslog.6 ] || exit 1
2037[ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
2038[ -f dir1/syslog.7 ] || exit 1
2039[ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
2040[ -f dir1/syslog.8 ] && exit 1
2041
2042exit 0
2043EOF
2044
2045        set_file('runtest', <<"EOF");
2046# test "logadm18"
2047$envsetup
2048exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
2049EOF
2050}
2051
2052#############################################################################
2053#
2054#         logadm19 -- test of  -l
2055#
2056#############################################################################
2057sub logadm19 {
2058        set_file('logfile', 'initially logfile');
2059
2060        set_file('checktest', <<'EOF');
2061[ -s std.err ] && { cat std.err; exit 1; }
2062[ -s std.out ] && exit 1
2063[ -s logfile ] && exit 1
2064TZ= export TZ
2065d=`/bin/date +\%d\%H\%M`
2066[ -f logfile.$d ] || exit 1
2067[ "xinitially logfile" = "x`/bin/cat logfile.$d`" ] || exit 1
2068exit 0
2069EOF
2070
2071        set_file('runtest', <<"EOF");
2072# test "logadm19"
2073$envsetup
2074exec $bindir/logadm -f /dev/null -l -p now logfile -t '\$file.\%d\%H\%M' >std.out 2>std.err
2075EOF
2076}
2077
2078#############################################################################
2079#
2080#         logadm20 -- test of unquotables/error handling
2081#
2082#############################################################################
2083sub logadm20 {
2084	set_file('logadm.conf', <<'EOF');
2085# non-trivial entry
2086/var/log/syslog -C 8 -a 'kill -HUP `cat /var/run/*syslog*pid`'
2087EOF
2088
2089	set_file('std.err.expect', <<'EOF');
2090logadm: Error: Can't protect quotes in </bin/echo "She can't take anymore, Cap'n!">
2091logadm: Error: unsafe to update configuration file or timestamps
2092logadm: Error: bailing out due to command line errors
2093Use "logadm -h" for help.
2094exit=1
2095EOF
2096
2097        set_file('checktest', <<'EOF');
2098[ -s std.err ] || exit 1
2099[ -s std.out ] && exit 1
2100[ -f logadm.conf????? ] && exit 1
2101[ -f logadm.timestamps????? ] && exit 1
2102exec /bin/diff std.err.expect std.err
2103EOF
2104
2105        set_file('runtest', <<"EOF");
2106# test "logadm20"
2107$envsetup
2108$bindir/logadm -f logadm.conf -F logadm.timestamps -w /a/b/c -p 1w -l -b "/bin/echo \\"She can't take anymore, Cap'n!\\"" >std.out 2>std.err
2109echo exit=\$? >>std.err
2110EOF
2111}
2112