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.
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.
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]
23 # Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
24 # Copyright (c) 2013, Joyent, Inc. All rights reserved.
27 # tester - run logadm tests
29 # requires a <bindir> argument to say where the various logadm
30 # binaries live (conftest, globtest, kwtest, luttest, optstest, and
33 # to run all the tests:
34 # tester [-f] <bindir>
36 # to run just a few tests, given their names:
37 # tester [-f] <bindir> globtest1 luttest1
39 # to setup a test and stop so you can run it by hand:
40 # tester [-f] -s globtest1 <bindir>
42 # tester will tell you what tmp directory it created for
43 # the test. to run it, cd there and run:
45 # to check the results, run:
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.
52 $watchmalloc=1; # default is to use watchmalloc
56 # list of tests we run by default
99 $usage_summary = '[-s test-name] [-d dir] bindir [test-name...]';
100 $usage_getopts = 'fd:s:';
102 d
=>'use dir for tests rather than creating one in /tmp',
103 s
=>'setup only, do not run test');
105 # spew usage message, plus any given message, and exit
111 warn "$0: $msg\n" if $msg;
113 warn "Usage: $0 $usage_summary\n";
114 foreach (sort keys %usage) {
115 warn " -$_ $usage{$_}\n";
121 # basic argument processing
124 $myname =~ s/.*\///; # just show last component in error mesages
125 getopts
($usage_getopts) or usage
;
126 $bindir = shift or usage
;
127 usage
("$bindir does not exist") unless -d
$bindir;
128 usage
("cannot list more than one test with -s option") if $opt_s && @ARGV;
129 @tests = @ARGV if @ARGV;
130 print "Fast mode\n" if $opt_f;
131 $watchmalloc = 0 if $opt_f;
137 $dir = "/tmp/logadmtest$$" unless $dir = $opt_d;
140 mkdir $dir, 0777 or die "$myname: mkdir $dir: $!\n";
144 chdir $dir or die "$myname: $dir: $!\n";
146 # common commands in runtest by tests
149 "HOME=$dir export HOME; " .
150 "LD_PRELOAD=watchmalloc.so.1 export LD_PRELOAD; " .
151 "MALLOC_DEBUG=RW export MALLOC_DEBUG";
153 $envsetup = "HOME=$dir export HOME; ";
156 $| = 1; # a.k.a. setbuf(stdout, NULL)
160 # just setup the test, explain how to use it, and exit
164 die "$myname: ERROR: $@" if $@
;
165 print "$myname: $testname setup complete, to run, cd to:\n";
167 print "and run the command:\n";
168 print " sh runtest\n";
169 print "to check the results, run the command:\n";
170 print " sh checktest\n";
178 print "Running $testname...";
181 print " SETUP FAILURE\n";
182 print STDERR
"$myname: ERROR: $@";
185 eval "runner('runtest')";
187 print " RUNTEST FAILURE\n";
188 print STDERR
"$myname: ERROR: $@";
189 print STDERR
"results captured in directory $dir\n";
190 print STDERR
" or use: $myname -s $testname $bindir\n";
191 print STDERR
" to do a fresh setup of this test.\n";
194 eval "runner('checktest', '-x', '> checktest.out 2>&1')";
196 print " CHECKTEST FAILURE\n";
197 print STDERR
"$myname: ERROR: $@";
198 print STDERR
"results captured in file $dir/checktest.out\n";
199 print STDERR
" or use: $myname -s $testname $bindir\n";
200 print STDERR
" to do a fresh setup of this test.\n";
205 die "unexpected dir $dir" unless $dir =~ m
,/.+/,;
206 system("/bin/rm -rf $dir/*");
210 # if we were the ones who created $dir, remove it
213 rmdir $dir || die "$myname: rmdir $dir: $!\n";
219 # run a shell script and check for failure
221 # the shell scripts generated by this program always "exec" the binary
222 # under test so checking here are for exit code, signals, and core dump
223 # is actually checking the program under test and not /bin/sh
226 my ($cmd, $prefix, $suffix) = (@_, '', '');
228 my $fullcmd = "/bin/sh $prefix $cmd $suffix";
229 my $rc = 0xffff & system("$fullcmd");
232 return; # cmd completed normally
233 } elsif ($rc == 0xff00) {
234 die "command \"$cmd\" failed: $!\n";
235 } elsif (($rc & 0xff) == 0) {
237 die "command \"$cmd\" exit $rc\n";
240 $coremsg = " (core dumped)" if ($rc & 0x80);
242 die "command \"$cmd\" signal $rc$coremsg\n" ;
247 # set_file(filename [, contents]) -- create a file, optionally with contents
251 my $contents = shift;
253 open SF
, ">$file" or die "create \"$file\": $!\n";
254 print SF
$contents if defined($contents);
260 ############# THE TESTS START AFTER HERE...
264 # common setup step -- create a testfile.conf
265 sub set_testconffile
{
267 $fname = 'testfile.conf' unless defined($fname);
269 set_file
($fname, <<'EOF');
273 # Default settings for system log file management.
274 # The -w option to logadm(1M) is the preferred way to write to this file,
275 # but if you do edit it by hand, use "logadm -V" to check it for errors.
277 # The format of lines in this file is:
278 # <logname> <options>
279 # For each logname listed here, the default options to logadm
280 # are given. Options given on the logadm command line override
281 # the defaults contained in this file.
283 # logadm typically runs early every morning via an entry in
284 # root's crontab (see crontab(1)).
286 /var/adm/messages -C 4 -P 'Thu Nov 1 16:56:42 2001' -a 'kill -HUP `cat /var/run/*syslog*pid`'
287 /var/cron/log -s 512k -t /var/cron/olog
288 /var/lp/logs/lpsched -C 2 -N -t '$file.$N'
290 # The entry below is used by turnacct(1M)
292 /var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
293 apache -C 24 -a '/usr/apache/bin/apachectl graceful' -p 1m -t '/var/apache/old-logs/$basename.%Y-%m' '/var/apache/logs/*{access,error}_log'
294 /var/log/syslog -C 8 -P 'Thu Nov 1 09:16:38 2001' -a 'kill -HUP `cat /var/run/*syslog*pid`'
295 /var/apache/logs/access_log -P 'Thu Nov 1 08:27:56 2001'
296 /var/apache/logs/error_log -P 'Thu Nov 1 08:27:56 2001'
297 /var/apache/logs/suexec_log -P 'Thu Nov 1 08:27:56 2001'
298 /var/apache/logs/mod_jserv.log -P 'Thu Nov 1 08:27:56 2001'
299 /var/apache/logs/jserv.log -P 'Thu Nov 1 08:27:56 2001'
304 ###########################################################################
306 # conftest1 -- minimal basic test of the conf.c code
308 ###########################################################################
312 set_file
('checktest', <<'EOF');
313 [ -s std.err ] && { cat std.err; exit 1; }
314 /bin/sed '/^conffile <testfile.conf>:$/d' <std.out >sed.out
315 exec /bin/diff testfile.conf sed.out
318 set_file
('runtest', <<"EOF");
321 exec $bindir/conftest testfile.conf >std.out 2>std.err
325 ###########################################################################
327 # conftest2 -- error path through conf.c
329 ###########################################################################
331 set_file
('testfile.conf', 'line fragment');
333 set_file
('std.err.expect', <<'EOF');
334 conftest: Warning: file testfile.conf doesn't end with newline, last line ignored.
337 set_file
('checktest', <<'EOF');
338 exec /bin/diff std.err.expect std.err
341 set_file
('runtest', <<"EOF");
344 $bindir/conftest testfile.conf >std.out 2>std.err || exit 0
349 ###########################################################################
351 # globtest1 -- minimal basic test of the glob.c code
353 ###########################################################################
355 set_file
('fileBname12');
356 sleep 2; # ensure above name is odler than below name
357 set_file
('fileAname12');
358 set_file
('fileAname1');
359 set_file
('fileAname3');
360 set_file
('fileAname5');
361 set_file
('fileAname7');
362 set_file
('fileAname9');
363 set_file
('fileAname11');
364 set_file
('fileBname0');
365 set_file
('fileBname2');
366 set_file
('fileBname4');
367 set_file
('fileBname6');
368 set_file
('fileBname8');
369 set_file
('fileBname10');
370 mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
371 mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
372 mkdir 'dir3', 0777 or die "mkdir dir3: $!\n";
373 mkdir 'dir1/dirA', 0777 or die "mkdir dir1/dirA: $!\n";
374 mkdir 'dir1/dirB', 0777 or die "mkdir dir1/dirB: $!\n";
375 mkdir 'dir1/dirC', 0777 or die "mkdir dir1/dirC: $!\n";
376 mkdir 'dir2/dirA', 0777 or die "mkdir dir2/dirA: $!\n";
377 mkdir 'dir2/dirB', 0777 or die "mkdir dir2/dirB: $!\n";
378 mkdir 'dir2/dirC', 0777 or die "mkdir dir2/dirC: $!\n";
379 set_file
('dir1/fileAname1');
380 set_file
('dir1/fileAname2');
381 set_file
('dir1/fileAname3');
382 set_file
('dir1/fileAname4');
383 set_file
('dir1/fileAname5');
384 set_file
('dir1/fileBname1');
385 set_file
('dir1/fileBname2');
386 set_file
('dir1/fileBname3');
387 set_file
('dir1/fileBname4');
388 set_file
('dir1/fileBname5');
389 # supply some varying sizes to produce different total size values
390 set_file
('dir1/dirA/fileAname4', '4444');
391 sleep 2; # ensure above file is oldest in dirA
392 set_file
('dir1/dirA/fileAname1', '1');
393 set_file
('dir1/dirA/fileAname2', '22');
394 set_file
('dir1/dirA/fileAname3', '333');
395 set_file
('dir1/dirA/fileAname5', '55555');
396 set_file
('dir1/dirA/fileBname1', '1');
397 set_file
('dir1/dirA/fileBname2', '22');
398 set_file
('dir1/dirA/fileBname3', '333');
399 set_file
('dir1/dirA/fileBname4', '4444');
400 set_file
('dir1/dirA/fileBname5', '55555');
401 set_file
('dir1/dirB/fileAname1', '1');
402 set_file
('dir1/dirB/fileAname2', '22');
403 set_file
('dir1/dirB/fileAname3', '333');
404 set_file
('dir1/dirB/fileAname4', '4444');
405 set_file
('dir1/dirB/fileAname5', '55555');
406 set_file
('dir1/dirB/fileBname1', '1');
407 set_file
('dir1/dirB/fileBname2', '22');
408 set_file
('dir1/dirB/fileBname3', '333');
409 set_file
('dir1/dirB/fileBname4', '4444');
410 set_file
('dir1/dirB/fileBname5', '55555');
411 set_file
('dir1/dirC/fileAname10', '12345678901');
412 set_file
('dir1/dirC/fileAname20', '123456789022');
413 set_file
('dir1/dirC/fileAname30', '1234567890333');
414 set_file
('dir1/dirC/fileAname40', '12345678904444');
415 set_file
('dir1/dirC/fileAname50', '123456789055555');
416 set_file
('dir1/dirC/fileBname10', '12345678901');
417 set_file
('dir1/dirC/fileBname20', '123456789022');
418 set_file
('dir1/dirC/fileBname30', '1234567890333');
419 set_file
('dir1/dirC/fileBname40', '12345678904444');
420 set_file
('dir1/dirC/fileBname50', '123456789055555');
422 set_file
('std.out.expect', <<'EOF');
439 oldest <./fileBname12>
440 oldest <./fileBname8>
441 oldest <./fileBname6>
442 oldest <./fileBname4>
443 oldest <./fileBname2>
444 oldest <./fileBname10>
445 oldest <./fileBname0>
446 oldest <./fileAname9>
447 oldest <./fileAname7>
448 oldest <./fileAname5>
449 oldest <./fileAname3>
450 oldest <./fileAname12>
451 oldest <./fileAname11>
452 oldest <./fileAname1>
462 <./dir1/dirA/fileAname4>
463 <./dir1/dirA/fileAname1>
464 <./dir1/dirA/fileAname2>
465 <./dir1/dirA/fileAname3>
466 <./dir1/dirA/fileAname5>
467 <./dir1/dirA/fileBname1>
468 <./dir1/dirA/fileBname2>
469 <./dir1/dirA/fileBname3>
470 <./dir1/dirA/fileBname4>
471 <./dir1/dirA/fileBname5>
473 oldest <./dir1/dirA/fileAname4>
474 oldest <./dir1/dirA/fileBname5>
475 oldest <./dir1/dirA/fileBname4>
476 oldest <./dir1/dirA/fileBname3>
477 oldest <./dir1/dirA/fileBname2>
478 oldest <./dir1/dirA/fileBname1>
479 oldest <./dir1/dirA/fileAname5>
480 oldest <./dir1/dirA/fileAname3>
481 oldest <./dir1/dirA/fileAname2>
482 oldest <./dir1/dirA/fileAname1>
495 oldest <./dir1/fileBname5>
496 oldest <./dir1/fileBname4>
497 oldest <./dir1/fileBname3>
498 oldest <./dir1/fileBname2>
499 oldest <./dir1/fileBname1>
500 oldest <./dir1/fileAname5>
501 oldest <./dir1/fileAname4>
502 oldest <./dir1/fileAname3>
503 oldest <./dir1/fileAname2>
504 oldest <./dir1/fileAname1>
505 <dir?/dir[AC]/fileBname[2-9]>:
506 <./dir1/dirA/fileBname2>
507 <./dir1/dirA/fileBname3>
508 <./dir1/dirA/fileBname4>
509 <./dir1/dirA/fileBname5>
511 oldest <./dir1/dirA/fileBname5>
512 oldest <./dir1/dirA/fileBname4>
513 oldest <./dir1/dirA/fileBname3>
514 oldest <./dir1/dirA/fileBname2>
515 <file[A-Z]n.*e([0-9]+)$0>:
531 oldest <./fileBname12>
532 oldest <./fileAname12>
533 oldest <./fileAname11>
534 oldest <./fileBname10>
535 oldest <./fileAname9>
536 oldest <./fileBname8>
537 oldest <./fileAname7>
538 oldest <./fileBname6>
539 oldest <./fileAname5>
540 oldest <./fileBname4>
541 oldest <./fileAname3>
542 oldest <./fileBname2>
543 oldest <./fileAname1>
544 oldest <./fileBname0>
547 set_file
('checktest', <<'EOF');
548 [ -s std.err ] && { cat std.err; exit 1; }
549 exec /bin/diff std.out.expect std.out
552 $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\'';
554 set_file
('runtest', <<"EOF");
557 exec $bindir/globtest $testglobs >std.out 2>std.err
561 ###########################################################################
563 # globtest2 -- error path through glob.c
565 ###########################################################################
567 set_file
('std.err.expect', <<'EOF');
568 globtest: Error: Missing }
571 set_file
('checktest', <<'EOF');
572 exec /bin/diff std.err.expect std.err
575 set_file
('runtest', <<"EOF");
578 $bindir/globtest 'hello{there' >std.out 2>std.err || exit 0
583 ###########################################################################
585 # kwtest1 -- minimal basic test of the kw.c code
587 ###########################################################################
589 $domainname = `/bin/domainname`; chomp $domainname;
590 $isa = `/bin/uname -p`; chomp $isa;
591 $platform = `/bin/uname -i`; chomp $platform;
592 $nodename = `/bin/uname -n`; chomp $nodename;
593 $machine = `/bin/uname -m`; chomp $machine;
594 $release = `/bin/uname -r`; chomp $release;
595 # /bin/zonename is in SUNWzoneu and so may not be present
596 if (-f
"/bin/zonename") {
597 $zonename = `/bin/zonename`; chomp $zonename;
599 $zonename = "global";
602 expand<$file.$n> n -1 hasn 1 result </var/log/syslog\.([0-9]+)$0>
603 expand<$file.$n> n 0 hasn 1 result </var/log/syslog.0>
604 expand<$file.$n> n 1 hasn 1 result </var/log/syslog.1>
605 expand<moose%d.$n> n -1 hasn 1 result <moose[0-9]+\.([0-9]+)$0>
606 expand<moose%d.$n> n 0 hasn 1 result <moose%d.0>
607 expand<moose%d.$n> n 1 hasn 1 result <moose%d.1>
608 expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n -1 hasn 1 result </var/logs-[0-9]+/moose-ISAporklips[0-9]+\.([0-9]+)$0>
609 expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n 0 hasn 1 result </var/logs-%Y/moose-ISAporklips%d.0>
610 expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n 1 hasn 1 result </var/logs-%Y/moose-ISAporklips%d.1>
612 $percentd = `/bin/env TZ=UTC /bin/date +%d`; chomp $percentd;
613 $percentY = `/bin/env TZ=UTC /bin/date +%Y`; chomp $percentY;
614 $secondblob =~ s/%d/$percentd/mg;
615 $secondblob =~ s/%Y/$percentY/mg;
616 $secondblob =~ s/ISA/$isa/mg;
617 $utcenv = "TZ=UTC export TZ";
619 set_file
('sed.out.expect', <<"EOF");
626 logname $ENV{LOGNAME}
637 set_file
('checktest', <<'EOF');
638 [ -s std.err ] && { cat std.err; exit 1; }
639 /bin/sed -e '/^ *secs [0-9][0-9]*$/d'\
640 -e "s/%d/`/bin/env TZ=UTC /bin/date +%d`/g"\
641 -e "s/%Y/`/bin/env TZ=UTC /bin/date +%Y`/g"\
643 exec /bin/diff sed.out.expect sed.out
646 $kwtest='kwtest /var/log/syslog \'$file.$n\' \'moose%d.$n\' \'/var/logs-%Y/moose-$isa$#porklips%d.$n\'';
647 set_file
('runtest', <<"EOF");
651 exec $bindir/$kwtest >std.out 2>std.err
655 ###########################################################################
657 # kwtest2 -- NULL environment variables test of the kw.c code
659 ###########################################################################
661 $domainname = `/bin/domainname`; chomp $domainname;
662 $isa = `/bin/uname -p`; chomp $isa;
663 $platform = `/bin/uname -i`; chomp $platform;
664 $nodename = `/bin/uname -n`; chomp $nodename;
665 $machine = `/bin/uname -m`; chomp $machine;
666 $release = `/bin/uname -r`; chomp $release;
667 # /bin/zonename is in SUNWzoneu and so may not be present
668 if (-f
"/bin/zonename") {
669 $zonename = `/bin/zonename`; chomp $zonename;
671 $zonename = "global";
674 expand<$file.$n> n -1 hasn 1 result </var/log/syslog\.([0-9]+)$0>
675 expand<$file.$n> n 0 hasn 1 result </var/log/syslog.0>
676 expand<$file.$n> n 1 hasn 1 result </var/log/syslog.1>
677 expand<moose%d.$n> n -1 hasn 1 result <moose[0-9]+\.([0-9]+)$0>
678 expand<moose%d.$n> n 0 hasn 1 result <moose%d.0>
679 expand<moose%d.$n> n 1 hasn 1 result <moose%d.1>
680 expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n -1 hasn 1 result </var/logs-[0-9]+/moose-ISAporklips[0-9]+\.([0-9]+)$0>
681 expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n 0 hasn 1 result </var/logs-%Y/moose-ISAporklips%d.0>
682 expand</var/logs-%Y/moose-$isa$#porklips%d.$n> n 1 hasn 1 result </var/logs-%Y/moose-ISAporklips%d.1>
684 $percentd = `/bin/env TZ=UTC /bin/date +%d`; chomp $percentd;
685 $percentY = `/bin/env TZ=UTC /bin/date +%Y`; chomp $percentY;
686 $secondblob =~ s/%d/$percentd/mg;
687 $secondblob =~ s/%Y/$percentY/mg;
688 $secondblob =~ s/ISA/$isa/mg;
690 set_file
('sed.out.expect', <<"EOF");
708 set_file
('checktest', <<'EOF');
709 [ -s std.err ] && { cat std.err; exit 1; }
710 /bin/sed -e '/^ *secs [0-9][0-9]*$/d'\
711 -e "s/%d/`/bin/env TZ=UTC /bin/date +%d`/g"\
712 -e "s/%Y/`/bin/env TZ=UTC /bin/date +%Y`/g"\
714 exec /bin/diff sed.out.expect sed.out
717 $kwtest='kwtest /var/log/syslog \'$file.$n\' \'moose%d.$n\' \'/var/logs-%Y/moose-$isa$#porklips%d.$n\'';
718 set_file
('runtest', <<"EOF");
729 exec $bindir/$kwtest >std.out 2>std.err
733 ###########################################################################
735 # luttest1 -- minimal basic test of the lut.c code
737 ###########################################################################
739 set_file
('std.out.expect', <<'EOF');
741 <fix> <NULL> (<NULL>)
743 <seven> <eight> (<eight>)
744 <six> <NULL> (<NULL>)
745 <three> <four> (<four>)
747 <fix> <NULL> (<NULL>)
749 <seven> <eight> (<eight>)
750 <six> <NULL> (<NULL>)
751 <three> <four> (<four>)
754 set_file
('checktest', <<'EOF');
755 [ -s std.err ] && { cat std.err; exit 1; }
756 exec /bin/diff std.out.expect std.out
759 set_file
('runtest', <<"EOF");
762 exec $bindir/luttest one=two three=four fix six seven=eight >std.out 2>std.err
766 ###########################################################################
768 # optstest1 -- minimal basic test of the opts.c code
770 ###########################################################################
772 $options="-a -b moose -c 1h -d 'Fri Nov 2 13:19:55 2001' -e 1k -f 2 one two three";
773 set_file
('std.out.expect', <<"EOF");
777 set_file
('checktest', <<'EOF');
778 [ -s std.err ] && { cat std.err; exit 1; }
779 exec /bin/diff std.out.expect std.out
782 set_file
('runtest', <<"EOF");
785 exec $bindir/optstest $options >std.out 2>std.err
789 ###########################################################################
791 # optstest2 -- error path through opts.c code
793 ###########################################################################
795 $options="-a -b -c 1h -d 'Fri Nov 2 13:19:55 2001' -e 1k -f 2 one two three";
796 set_file
('std.err.expect', <<'EOF');
797 optstest: Error: Option 'b' requires an argument
798 optstest: Error: opts parsing failed
801 set_file
('checktest', <<'EOF');
802 [ -s std.out ] && exit 1
803 exec /bin/diff std.err.expect std.err
806 set_file
('runtest', <<"EOF");
809 $bindir/optstest $options >std.out 2>std.err || exit 0
814 ###########################################################################
816 # logadmV1 -- test of "logadm -V"
818 ###########################################################################
822 set_file
('std.out.expect', <<'EOF');
823 /var/adm/messages -C 4 -P 'Thu Nov 1 16:56:42 2001' -a 'kill -HUP `cat /var/run/*syslog*pid`'
824 /var/cron/log -s 512k -t /var/cron/olog
825 /var/lp/logs/lpsched -C 2 -N -t '$file.$N'
826 /var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
827 apache -C 24 -a '/usr/apache/bin/apachectl graceful' -p 1m -t '/var/apache/old-logs/$basename.%Y-%m' '/var/apache/logs/*{access,error}_log'
828 /var/log/syslog -C 8 -P 'Thu Nov 1 09:16:38 2001' -a 'kill -HUP `cat /var/run/*syslog*pid`'
829 /var/apache/logs/access_log -P 'Thu Nov 1 08:27:56 2001'
830 /var/apache/logs/error_log -P 'Thu Nov 1 08:27:56 2001'
831 /var/apache/logs/suexec_log -P 'Thu Nov 1 08:27:56 2001'
832 /var/apache/logs/mod_jserv.log -P 'Thu Nov 1 08:27:56 2001'
833 /var/apache/logs/jserv.log -P 'Thu Nov 1 08:27:56 2001'
836 set_file
('checktest', <<'EOF');
837 [ -s std.err ] && { cat std.err; exit 1; }
838 exec /bin/diff std.out.expect std.out
841 set_file
('runtest', <<"EOF");
844 exec $bindir/logadm -f testfile.conf -F testfile.conf -V >std.out 2>std.err
848 ###########################################################################
850 # logadmV2 -- test of "logadm -V <entry>"
852 ###########################################################################
856 set_file
('std.out.expect', <<'EOF');
857 /var/cron/log -s 512k -t /var/cron/olog
858 /var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
861 set_file
('checktest', <<'EOF');
862 [ -s std.err ] && { cat std.err; exit 1; }
863 exec /bin/diff std.out.expect std.out
866 set_file
('runtest', <<"EOF");
869 exec $bindir/logadm -f testfile.conf -F testfile.conf -V /var/cron/log /var/adm/pacct >std.out 2>std.err
873 ###########################################################################
875 # logadmr -- test of "logadm -r <entry>"
877 ###########################################################################
880 set_testconffile
('testfile.conf.orig');
882 set_file
('diff.out.expect', <<'EOF');
884 < /var/cron/log -s 512k -t /var/cron/olog
886 < /var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
889 set_file
('checktest', <<'EOF');
890 [ -s std.err ] && { cat std.err; exit 1; }
891 /bin/diff testfile.conf.orig testfile.conf > diff.out
892 exec /bin/diff diff.out.expect diff.out
895 set_file
('runtest', <<"EOF");
898 exec $bindir/logadm -f testfile.conf -F testfile.conf -r /var/cron/log /var/adm/pacct >std.out 2>std.err
902 ###########################################################################
904 # logadmw -- test of "logadm -w <entry>"
906 ###########################################################################
909 set_testconffile
('testfile.conf.orig');
911 set_file
('diff.out.expect', <<'EOF');
913 > moose -C 20 -a moose_after_cmd -g pig -m 664 -o cow -p never /moose/file
916 set_file
('checktest', <<'EOF');
917 [ -s std.err ] && { cat std.err; exit 1; }
918 /bin/diff testfile.conf.orig testfile.conf > diff.out
919 exec /bin/diff diff.out.expect diff.out
922 set_file
('runtest', <<"EOF");
925 exec $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
929 ###########################################################################
931 # logadm1 -- minimal basic test of logadm rotation
933 ###########################################################################
935 set_file
('logfile', 'initially logfile');
936 set_file
('logfile.0', 'initially logfile.0');
937 my ($stdev, $stino, $stmode, $stnlink, $stuid, $stgid, $strdev,
938 $stsize, $statime, $stmtime, $stctime, $stblksize, $stblocks) =
939 lstat 'logfile' or die "lstat logfile: $!\n";
941 set_file
('checktest', <<"EOF");
942 [ -s std.err ] && { cat std.err; exit 1; }
943 [ -s std.out ] && exit 1
944 [ -s logfile ] && exit 1
945 [ -f logfile.0 ] || exit 1
946 [ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
947 [ "`/bin/ls -i logfile.0 | /bin/awk '{ print \$1; }'`" = "$stino" ] || exit 1
948 [ -f logfile.1 ] || exit 1
949 [ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
953 set_file
('runtest', <<"EOF");
956 exec $bindir/logadm -f /dev/null -p now logfile >std.out 2>std.err
960 ###########################################################################
962 # logadm1c -- same as logadm1 but with -c option
964 ###########################################################################
966 set_file
('logfile', 'initially logfile');
967 set_file
('logfile.0', 'initially logfile.0');
968 my ($stdev, $stino, $stmode, $stnlink, $stuid, $stgid, $strdev,
969 $stsize, $statime, $stmtime, $stctime, $stblksize, $stblocks) =
970 lstat 'logfile' or die "lstat logfile: $!\n";
972 set_file
('checktest', <<"EOF");
973 [ -s std.err ] && { cat std.err; exit 1; }
974 [ -s std.out ] && exit 1
975 [ -s logfile ] && exit 1
976 [ -f logfile.0 ] || exit 1
977 [ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
978 [ "`/bin/ls -i logfile.0 | /bin/awk '{ print \$1; }'`" = "$stino" ] && exit 1
979 [ -f logfile.1 ] || exit 1
980 [ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
984 set_file
('runtest', <<"EOF");
987 exec $bindir/logadm -f /dev/null -p now -c logfile >std.out 2>std.err
991 ###########################################################################
993 # logadm2 -- minimal basic test of logadm expiration
995 ###########################################################################
997 set_file
('logfile', 'initially logfile');
998 set_file
('logfile.0', 'initially logfile.0');
999 set_file
('logfile.1', 'initially logfile.1');
1001 set_file
('checktest', <<'EOF');
1002 [ -s std.err ] && { cat std.err; exit 1; }
1003 [ -s std.out ] && exit 1
1004 [ -s logfile ] && exit 1
1005 [ -f logfile.0 ] || exit 1
1006 [ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
1007 [ -f logfile.1 ] || exit 1
1008 [ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
1009 [ -f logfile.2 ] && exit 1
1013 set_file
('runtest', <<"EOF");
1016 exec $bindir/logadm -f /dev/null -p now logfile -C2 >std.out 2>std.err
1020 ###########################################################################
1022 # logadm3 -- minimal basic test of logadm pre/post-commands
1024 ###########################################################################
1026 set_file
('logfile', 'initially logfile');
1027 set_file
('logfile.0', 'initially logfile.0');
1028 set_file
('logfile.1', 'initially logfile.1');
1030 set_file
('checktest', <<'EOF');
1031 [ -s std.err ] && { cat std.err; exit 1; }
1032 [ -s std.out ] && exit 1
1033 [ -s logfile ] && exit 1
1034 [ -f logfile.0 ] || exit 1
1035 [ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
1036 [ -f logfile.1 ] || exit 1
1037 [ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
1038 [ -f logfile.2 ] && exit 1
1039 [ -f pre.out ] || exit 1
1040 [ "xpre-command-stuff" = "x`/bin/cat pre.out`" ] || exit 1
1041 [ -f post.out ] || exit 1
1042 [ "xpost-command-stuff" = "x`/bin/cat post.out`" ] || exit 1
1046 set_file
('runtest', <<"EOF");
1049 exec $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
1053 ###########################################################################
1055 # logadm4 -- test of -t template
1057 ###########################################################################
1059 set_file
('logfile', 'initially logfile');
1061 set_file
('checktest', <<'EOF');
1062 [ -s std.err ] && { cat std.err; exit 1; }
1063 [ -s std.out ] && exit 1
1064 [ -s logfile ] && exit 1
1067 [ -f logfile.$d ] || exit 1
1068 [ "xinitially logfile" = "x`/bin/cat logfile.$d`" ] || exit 1
1072 set_file
('runtest', <<"EOF");
1075 exec $bindir/logadm -f /dev/null -p now logfile -t '\$file.\%d' >std.out 2>std.err
1079 ###########################################################################
1081 # logadm5 -- test of -R cmd and -E cmd
1083 ###########################################################################
1085 set_file
('logfile', 'initially logfile');
1086 set_file
('logfile.0', 'initially logfile.0');
1088 set_file
('cmd.out.expect', <<'EOF');
1089 just rotated: initially logfile
1090 just expired: initially logfile.0
1093 set_file
('checktest', <<'EOF');
1094 [ -s std.err ] && { cat std.err; exit 1; }
1095 [ -s std.out ] && exit 1
1096 [ -s logfile ] && exit 1
1097 [ -f logfile.0 ] || exit 1
1098 [ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
1099 [ -f logfile.1 ] || exit 1
1100 [ "xinitially logfile.0" = "x`/bin/cat logfile.1`" ] || exit 1
1101 exec /bin/diff cmd.out.expect cmd.out
1104 set_file
('runtest', <<"EOF");
1107 exec $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
1111 ###########################################################################
1113 # logadm6 -- test of -m, -o, -g
1115 ###########################################################################
1117 set_file
('logfile', 'initially logfile');
1119 set_file
('std.err.expect', <<'EOF');
1120 logadm: Warning: command failed: /bin/chown _nonexistentuser_:_nonexistentgroup_ logfile
1121 chown: unknown group id _nonexistentgroup_
1124 set_file
('checktest', <<'EOF');
1125 [ -s std.err ] || exit 1;
1126 [ -s std.out ] && exit 1
1127 [ -s logfile ] && exit 1
1128 [ -f logfile.0 ] || exit 1
1129 [ "xinitially logfile" = "x`/bin/cat logfile.0`" ] || exit 1
1130 [ "`/bin/ls -l logfile | /bin/awk '{ print $1; }'`" = "-r----x--x" ] || exit 1
1131 exec /bin/diff std.err.expect std.err
1134 set_file
('runtest', <<"EOF");
1137 exec $bindir/logadm -f /dev/null -p now logfile -m 411 -o _nonexistentuser_ -g _nonexistentgroup_ >std.out 2>std.err
1141 ###########################################################################
1143 # logadm7 -- test running through a conffile
1145 ###########################################################################
1147 mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1148 set_file
('dir1/syslog', 'initially dir1/syslog');
1149 set_file
('dir1/syslog.0', 'initially dir1/syslog.0');
1150 set_file
('dir1/syslog.1', 'initially dir1/syslog.1');
1151 set_file
('dir1/syslog.2', 'initially dir1/syslog.2');
1152 set_file
('dir1/syslog.3', 'initially dir1/syslog.3');
1153 set_file
('dir1/syslog.4', 'initially dir1/syslog.4');
1154 set_file
('dir1/syslog.5', 'initially dir1/syslog.5');
1155 set_file
('dir1/syslog.6', 'initially dir1/syslog.6');
1156 set_file
('dir1/syslog.7', 'initially dir1/syslog.7');
1157 mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1158 set_file
('dir2/messages', 'initially dir2/messages');
1159 set_file
('dir2/messages.0', 'initially dir2/messages.0');
1160 set_file
('dir2/messages.1', 'initially dir2/messages.1');
1161 set_file
('dir2/messages.2', 'initially dir2/messages.2');
1162 set_file
('dir2/messages.3', 'initially dir2/messages.3');
1164 set_file
('logadm.conf', <<'EOF');
1168 # this comment # has at least another #-sign in it #...
1170 # Default settings for system log file management.
1171 # The -w option to logadm(1M) is the preferred way to write to this file,
1172 # but if you do edit it by hand, use "logadm -V" to check it for errors.
1173 # but if you do edit it by hand, use "logadm -V" to check it for errors.
1175 # The format of lines in this file is:
1176 # <logname> <options>
1177 # For each logname listed here, the default options to logadm
1178 # are given. Options given on the logadm command line override
1179 # the defaults contained in this file.
1181 # logadm typically runs early every morning via an entry in
1182 # root's crontab (see crontab(1)).
1184 dir1/syslog -C 8 -a 'echo kill -HUP `cat /var/run/*syslog*pid` >> cmd.out'
1185 dir2/messages -C 4 -a 'echo kill -HUP `cat /var/run/*syslog*pid` >> cmd.out'
1187 # The entry below is used by turnacct(1M)
1189 /var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
1192 system("/bin/cp logadm.conf logadm.conf.orig");
1194 $pid=`cat /var/run/*syslog*pid`;
1196 set_file
('cmd.out.expect', <<"EOF");
1198 second kill -HUP $pid
1201 set_file
('sed.out.expect', <<'EOF');
1202 # This file holds internal data for logadm(1M).
1208 set_file
('checktest', <<'EOF');
1209 [ -s std.err ] && { cat std.err; exit 1; }
1210 [ -s std.out ] && exit 1
1211 [ -s logadm.timestamps ] || exit 1
1212 [ -s std.err2 ] && exit 1
1213 [ -s std.out2 ] && exit 1
1214 [ -s std.err3 ] && exit 1
1215 [ -s std.out3 ] && exit 1
1216 [ -s std.err4 ] && exit 1
1217 [ -s std.out4 ] && exit 1
1218 [ -f dir1/syslog ] || exit 1
1219 [ "xsomething" = "x`/bin/cat dir1/syslog`" ] || exit 1
1220 [ -f dir1/syslog.0 ] || exit 1
1221 [ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1222 [ -f dir1/syslog.1 ] || exit 1
1223 [ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1224 [ -f dir1/syslog.2 ] || exit 1
1225 [ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1226 [ -f dir1/syslog.3 ] || exit 1
1227 [ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1228 [ -f dir1/syslog.4 ] || exit 1
1229 [ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1230 [ -f dir1/syslog.5 ] || exit 1
1231 [ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1232 [ -f dir1/syslog.6 ] || exit 1
1233 [ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1234 [ -f dir1/syslog.7 ] || exit 1
1235 [ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1236 [ -f dir1/syslog.8 ] && exit 1
1238 [ -s dir2/messages ] && exit 1
1239 [ -f dir2/messages.0 ] || exit 1
1240 [ "xsomething" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1241 [ -f dir2/messages.1 ] || exit 1
1242 [ "xinitially dir2/messages" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1243 [ -f dir2/messages.2 ] || exit 1
1244 [ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1245 [ -f dir2/messages.3 ] || exit 1
1246 [ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1247 [ -f dir2/messages.4 ] && exit 1
1248 /bin/sed "s/ -P '[^']*' *//" < logadm.timestamps > sed.out
1249 /bin/diff sed.out.expect sed.out || exit 1
1250 exec /bin/diff logadm.conf.orig logadm.conf
1253 # first logadm call will rotate both syslog and messages
1254 # second one won't because size is zero
1255 # third one won't because of -P timestamps stored in conffile
1256 # fourth one will do messages because of -p now on command line
1257 set_file
('runtest', <<"EOF");
1260 $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err || exit 1
1261 $bindir/logadm -f logadm.conf -F logadm.timestamps dir1/syslog dir2/messages >std.out2 2>std.err2 || exit 1
1262 echo something > dir1/syslog
1263 echo something > dir2/messages
1264 $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out3 2>std.err3 || exit 1
1265 exec $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
1269 ###########################################################################
1271 # logadm8 -- test of -z
1273 ###########################################################################
1275 mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1276 set_file
('dir1/syslog', 'initially dir1/syslog');
1277 set_file
('dir1/syslog.0', 'initially dir1/syslog.0');
1278 set_file
('dir1/syslog.1', 'initially dir1/syslog.1');
1279 set_file
('dir1/syslog.2', 'initially dir1/syslog.2');
1280 system("/bin/gzip dir1/syslog.2");
1281 die "gzip dir1/syslog.2 didn't work\n" unless -f
'dir1/syslog.2.gz';
1282 set_file
('dir1/syslog.3', 'initially dir1/syslog.3');
1283 system("/bin/gzip dir1/syslog.3");
1284 die "gzip dir1/syslog.3 didn't work\n" unless -f
'dir1/syslog.3.gz';
1285 set_file
('dir1/syslog.4', 'initially dir1/syslog.4');
1286 system("/bin/gzip dir1/syslog.4");
1287 die "gzip dir1/syslog.4 didn't work\n" unless -f
'dir1/syslog.4.gz';
1288 set_file
('dir1/syslog.5', 'initially dir1/syslog.5');
1289 system("/bin/gzip dir1/syslog.5");
1290 die "gzip dir1/syslog.5 didn't work\n" unless -f
'dir1/syslog.5.gz';
1291 set_file
('dir1/syslog.6', 'initially dir1/syslog.6');
1292 system("/bin/gzip dir1/syslog.6");
1293 die "gzip dir1/syslog.6 didn't work\n" unless -f
'dir1/syslog.6.gz';
1294 set_file
('dir1/syslog.7', 'initially dir1/syslog.7');
1295 system("/bin/gzip dir1/syslog.7");
1296 die "gzip dir1/syslog.7 didn't work\n" unless -f
'dir1/syslog.7.gz';
1298 set_file
('checktest', <<'EOF');
1299 [ -s std.err ] && { cat std.err; exit 1; }
1300 [ -s std.out ] && exit 1
1301 [ -f dir1/syslog ] || exit 1
1302 [ -s dir1/syslog ] && exit 1
1303 [ -f dir1/syslog.0 ] || exit 1
1304 [ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1305 [ -f dir1/syslog.1 ] || exit 1
1306 [ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1307 [ -f dir1/syslog.2.gz ] || exit 1
1308 [ "xinitially dir1/syslog.1" = "x`/bin/gzcat dir1/syslog.2.gz`" ] || exit 1
1309 [ -f dir1/syslog.3.gz ] || exit 1
1310 [ "xinitially dir1/syslog.2" = "x`/bin/gzcat dir1/syslog.3.gz`" ] || exit 1
1311 [ -f dir1/syslog.4.gz ] || exit 1
1312 [ "xinitially dir1/syslog.3" = "x`/bin/gzcat dir1/syslog.4.gz`" ] || exit 1
1313 [ -f dir1/syslog.5.gz ] || exit 1
1314 [ "xinitially dir1/syslog.4" = "x`/bin/gzcat dir1/syslog.5.gz`" ] || exit 1
1315 [ -f dir1/syslog.6.gz ] || exit 1
1316 [ "xinitially dir1/syslog.5" = "x`/bin/gzcat dir1/syslog.6.gz`" ] || exit 1
1317 [ -f dir1/syslog.7.gz ] || exit 1
1318 [ "xinitially dir1/syslog.6" = "x`/bin/gzcat dir1/syslog.7.gz`" ] || exit 1
1319 [ -f dir1/syslog.8 ] && exit 1
1320 [ -f dir1/syslog.8.gz ] && exit 1
1324 set_file
('runtest', <<"EOF");
1327 exec $bindir/logadm -f /dev/null dir1/syslog -z 2 -C 8 >std.out 2>std.err
1331 ###########################################################################
1333 # logadm9 -- test of age check
1335 ###########################################################################
1337 mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1338 set_file
('dir1/syslog', 'initially dir1/syslog');
1339 set_file
('dir1/syslog.0', 'initially dir1/syslog.0');
1340 set_file
('dir1/syslog.1', 'initially dir1/syslog.1');
1341 set_file
('dir1/syslog.2', 'initially dir1/syslog.2');
1342 set_file
('dir1/syslog.3', 'initially dir1/syslog.3');
1343 set_file
('dir1/syslog.4', 'initially dir1/syslog.4');
1344 set_file
('dir1/syslog.5', 'initially dir1/syslog.5');
1345 set_file
('dir1/syslog.6', 'initially dir1/syslog.6');
1346 set_file
('dir1/syslog.7', 'initially dir1/syslog.7');
1347 set_file
('dir1/notes', 'initially dir1/notes');
1348 mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1349 set_file
('dir2/messages', 'initially dir2/messages');
1350 set_file
('dir2/messages.0', 'initially dir2/messages.0');
1351 set_file
('dir2/messages.1', 'initially dir2/messages.1');
1352 set_file
('dir2/messages.2', 'initially dir2/messages.2');
1353 set_file
('dir2/messages.3', 'initially dir2/messages.3');
1354 set_file
('dir2/log', 'initially dir2/log');
1357 $nowstr = gmtime($now);
1358 # a week minus 30 seconds ago...
1359 # technically not a full week, but the heuristic used by logadm
1360 # should think this is "close enough" to a full week
1361 $closetoweeksecs = $now - (60 * 60 * 24 * 7 - 30);
1362 $closetoweek = gmtime($closetoweeksecs);
1363 # a week minus six hours ago...
1364 $lessthanweeksecs = $now - (60 * 60 * 24 * 7 - 60 * 60 * 6);
1365 $lessthanweek = gmtime($lessthanweeksecs);
1367 set_file
('logadm.conf', <<"EOF");
1368 # now: $nowstr is $now
1369 # $closetoweek is $closetoweeksecs
1370 dir1/syslog -C 8 -P '$closetoweek'
1372 # $lessthanweek is $lessthanweeksecs
1373 dir1/notes -C 2 -P '$lessthanweek'
1376 set_file
('logadm.timestamps', <<"EOF");
1377 dir2/log -P '$closetoweek'
1378 dir2/messages -P '$lessthanweek'
1381 set_file
('sed.out.expect', <<"EOF");
1382 # This file holds internal data for logadm(1M).
1390 set_file
('checktest', <<'EOF');
1391 [ -s std.err ] && { cat std.err; exit 1; }
1392 [ -s std.out ] && exit 1
1393 [ -f dir1/syslog ] || exit 1
1394 [ -s dir1/syslog ] && exit 1
1395 [ -f dir1/syslog.0 ] || exit 1
1396 [ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1397 [ -f dir1/syslog.1 ] || exit 1
1398 [ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1399 [ -f dir1/syslog.2 ] || exit 1
1400 [ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1401 [ -f dir1/syslog.3 ] || exit 1
1402 [ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1403 [ -f dir1/syslog.4 ] || exit 1
1404 [ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1405 [ -f dir1/syslog.5 ] || exit 1
1406 [ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1407 [ -f dir1/syslog.6 ] || exit 1
1408 [ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1409 [ -f dir1/syslog.7 ] || exit 1
1410 [ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1411 [ -f dir1/syslog.8 ] && exit 1
1413 [ -s dir1/notes ] || exit 1
1414 [ "xinitially dir1/notes" = "x`/bin/cat dir1/notes`" ] || exit 1
1415 [ -f dir1/notes.0 ] && exit 1
1417 [ -f dir2/messages ] || exit 1
1418 [ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1419 [ -f dir2/messages.0 ] || exit 1
1420 [ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1421 [ -f dir2/messages.1 ] || exit 1
1422 [ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1423 [ -f dir2/messages.2 ] || exit 1
1424 [ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1425 [ -f dir2/messages.3 ] || exit 1
1426 [ "xinitially dir2/messages.3" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1427 [ -f dir2/messages.4 ] && exit 1
1429 [ -f dir2/log ] || exit 1
1430 [ -s dir2/log ] && exit 1
1431 [ -f dir2/log.0 ] || exit 1
1432 [ "xinitially dir2/log" = "x`/bin/cat dir2/log.0`" ] || exit 1
1433 [ -f dir2/log.1 ] && exit 1
1435 /bin/sed "s/ -P '[^']*' *//" < logadm.timestamps > sed.out
1436 /bin/diff sed.out.expect sed.out || exit 1
1437 /bin/sed -n "s/ -P '[^']*' */<&>/p" < logadm.conf > sed.out
1438 [ -s sed.out ] && exit 1
1442 set_file
('runtest', <<"EOF");
1445 exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1449 ###########################################################################
1451 # logadm9d -- test of age check like logadm9, but age is a couple days
1453 ###########################################################################
1455 mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1456 set_file
('dir1/syslog', 'initially dir1/syslog');
1457 set_file
('dir1/syslog.0', 'initially dir1/syslog.0');
1458 set_file
('dir1/syslog.1', 'initially dir1/syslog.1');
1459 set_file
('dir1/syslog.2', 'initially dir1/syslog.2');
1460 set_file
('dir1/syslog.3', 'initially dir1/syslog.3');
1461 set_file
('dir1/syslog.4', 'initially dir1/syslog.4');
1462 set_file
('dir1/syslog.5', 'initially dir1/syslog.5');
1463 set_file
('dir1/syslog.6', 'initially dir1/syslog.6');
1464 set_file
('dir1/syslog.7', 'initially dir1/syslog.7');
1465 mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1466 set_file
('dir2/messages', 'initially dir2/messages');
1467 set_file
('dir2/messages.0', 'initially dir2/messages.0');
1468 set_file
('dir2/messages.1', 'initially dir2/messages.1');
1469 set_file
('dir2/messages.2', 'initially dir2/messages.2');
1470 set_file
('dir2/messages.3', 'initially dir2/messages.3');
1473 $nowstr = gmtime($now);
1474 # a day minus 30 seconds ago...
1475 $closetodaysecs = $now - (60 * 60 * 24 - 30);
1476 $closetoday = gmtime($closetodaysecs);
1477 # a day minus six hours ago...
1478 $lessthandaysecs = $now - (60 * 60 * 24 - 60 * 60 * 6);
1479 $lessthanday = gmtime($lessthandaysecs);
1481 set_file
('logadm.conf', <<"EOF");
1482 # now: $nowstr is $now
1483 # $closetoday is $closetodaysecs
1484 dir1/syslog -p 1d -C 8 -P '$closetoday'
1485 # $lessthanday is $lessthandaysecs
1486 dir2/messages -p 1d -C 4 -P '$lessthanday'
1489 set_file
('checktest', <<'EOF');
1490 [ -s std.err ] && { cat std.err; exit 1; }
1491 [ -s std.out ] && exit 1
1492 [ -f dir1/syslog ] || exit 1
1493 [ -s dir1/syslog ] && exit 1
1494 [ -f dir1/syslog.0 ] || exit 1
1495 [ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1496 [ -f dir1/syslog.1 ] || exit 1
1497 [ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1498 [ -f dir1/syslog.2 ] || exit 1
1499 [ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1500 [ -f dir1/syslog.3 ] || exit 1
1501 [ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1502 [ -f dir1/syslog.4 ] || exit 1
1503 [ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1504 [ -f dir1/syslog.5 ] || exit 1
1505 [ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1506 [ -f dir1/syslog.6 ] || exit 1
1507 [ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1508 [ -f dir1/syslog.7 ] || exit 1
1509 [ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1510 [ -f dir1/syslog.8 ] && exit 1
1512 [ -f dir2/messages ] || exit 1
1513 [ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1514 [ -f dir2/messages.0 ] || exit 1
1515 [ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1516 [ -f dir2/messages.1 ] || exit 1
1517 [ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1518 [ -f dir2/messages.2 ] || exit 1
1519 [ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1520 [ -f dir2/messages.3 ] || exit 1
1521 [ "xinitially dir2/messages.3" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1522 [ -f dir2/messages.4 ] && exit 1
1526 set_file
('runtest', <<"EOF");
1529 exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1533 ###########################################################################
1535 # logadm10 -- test of size-based rotation check
1537 ###########################################################################
1539 mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1540 set_file
('dir1/syslog', 'initially dir1/syslogXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
1541 set_file
('dir1/syslog.0', 'initially dir1/syslog.0');
1542 set_file
('dir1/syslog.1', 'initially dir1/syslog.1');
1543 set_file
('dir1/syslog.2', 'initially dir1/syslog.2');
1544 set_file
('dir1/syslog.3', 'initially dir1/syslog.3');
1545 set_file
('dir1/syslog.4', 'initially dir1/syslog.4');
1546 set_file
('dir1/syslog.5', 'initially dir1/syslog.5');
1547 set_file
('dir1/syslog.6', 'initially dir1/syslog.6');
1548 set_file
('dir1/syslog.7', 'initially dir1/syslog.7');
1549 mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1550 set_file
('dir2/messages', 'initially dir2/messages');
1551 set_file
('dir2/messages.0', 'initially dir2/messages.0');
1552 set_file
('dir2/messages.1', 'initially dir2/messages.1');
1553 set_file
('dir2/messages.2', 'initially dir2/messages.2');
1554 set_file
('dir2/messages.3', 'initially dir2/messages.3');
1556 set_file
('logadm.conf', <<"EOF");
1557 dir1/syslog -C 8 -s 30b
1558 dir2/messages -C 4 -s 30b
1561 set_file
('checktest', <<'EOF');
1562 [ -s std.err ] && { cat std.err; exit 1; }
1563 [ -s std.out ] && exit 1
1564 [ -f dir1/syslog ] || exit 1
1565 [ -s dir1/syslog ] && exit 1
1566 [ -f dir1/syslog.0 ] || exit 1
1567 [ "xinitially dir1/syslogXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1568 [ -f dir1/syslog.1 ] || exit 1
1569 [ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1570 [ -f dir1/syslog.2 ] || exit 1
1571 [ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1572 [ -f dir1/syslog.3 ] || exit 1
1573 [ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1574 [ -f dir1/syslog.4 ] || exit 1
1575 [ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1576 [ -f dir1/syslog.5 ] || exit 1
1577 [ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1578 [ -f dir1/syslog.6 ] || exit 1
1579 [ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1580 [ -f dir1/syslog.7 ] || exit 1
1581 [ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1582 [ -f dir1/syslog.8 ] && exit 1
1584 [ -f dir2/messages ] || exit 1
1585 [ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1586 [ -f dir2/messages.0 ] || exit 1
1587 [ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1588 [ -f dir2/messages.1 ] || exit 1
1589 [ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1590 [ -f dir2/messages.2 ] || exit 1
1591 [ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1592 [ -f dir2/messages.3 ] || exit 1
1593 [ "xinitially dir2/messages.3" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1594 [ -f dir2/messages.4 ] && exit 1
1598 set_file
('runtest', <<"EOF");
1601 exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1605 ###########################################################################
1607 # logadm11 -- test of size-based expiration check
1609 ###########################################################################
1611 mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1612 set_file
('dir1/syslog', 'initially dir1/syslog');
1613 set_file
('dir1/syslog.0', 'initially dir1/syslog.0');
1614 set_file
('dir1/syslog.1', 'initially dir1/syslog.1');
1615 set_file
('dir1/syslog.2', 'initially dir1/syslog.2');
1616 set_file
('dir1/syslog.3', 'initially dir1/syslog.3');
1617 set_file
('dir1/syslog.4', 'initially dir1/syslog.4');
1618 set_file
('dir1/syslog.5', 'initially dir1/syslog.5');
1619 set_file
('dir1/syslog.6', 'initially dir1/syslog.6');
1620 set_file
('dir1/syslog.7', 'initially dir1/syslog.7');
1621 mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1622 set_file
('dir2/messages', 'initially dir2/messages');
1623 set_file
('dir2/messages.0', 'initially dir2/messages.0');
1624 set_file
('dir2/messages.1', 'initially dir2/messages.1');
1625 set_file
('dir2/messages.2', 'initially dir2/messages.2');
1626 set_file
('dir2/messages.3', 'initially dir2/messages.3');
1628 set_file
('logadm.conf', <<"EOF");
1629 dir1/syslog -C 8 -s 30b -S 75b
1630 dir2/messages -C 4 -s 30b -S 75b
1633 set_file
('checktest', <<'EOF');
1634 [ -s std.err ] && { cat std.err; exit 1; }
1635 [ -s std.out ] && exit 1
1636 [ -f dir1/syslog ] || exit 1
1637 [ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog`" ] || exit 1
1638 [ -f dir1/syslog.0 ] || exit 1
1639 [ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1640 [ -f dir1/syslog.1 ] || exit 1
1641 [ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1642 [ -f dir1/syslog.2 ] || exit 1
1643 [ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1644 [ -f dir1/syslog.3 ] && exit 1
1645 [ -f dir1/syslog.4 ] && exit 1
1646 [ -f dir1/syslog.5 ] && exit 1
1647 [ -f dir1/syslog.6 ] && exit 1
1648 [ -f dir1/syslog.7 ] && exit 1
1649 [ -f dir1/syslog.8 ] && exit 1
1651 [ -f dir2/messages ] || exit 1
1652 [ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1653 [ -f dir2/messages.0 ] || exit 1
1654 [ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1655 [ -f dir2/messages.1 ] || exit 1
1656 [ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1657 [ -f dir2/messages.2 ] || exit 1
1658 [ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1659 [ -f dir2/messages.3 ] && exit 1
1660 [ -f dir2/messages.4 ] && exit 1
1664 set_file
('runtest', <<"EOF");
1667 exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1671 ###########################################################################
1673 # logadm12 -- ENOENT error path
1675 ###########################################################################
1677 set_file
('std.err.expect', <<'EOF');
1678 logadm: Warning: logfile: No such file or directory
1681 set_file
('checktest', <<"EOF");
1682 [ -s std.out ] && exit 1
1683 exec /bin/diff std.err.expect std.err
1686 set_file
('runtest', <<"EOF");
1689 exec $bindir/logadm -f /dev/null logfile >std.out 2>std.err
1693 ###########################################################################
1695 # logadm13 -- ENOENT error path with -N flag
1697 ###########################################################################
1699 set_file
('checktest', <<"EOF");
1700 [ -s std.err ] && { cat std.err; exit 1; }
1701 [ -s std.out ] && exit 1
1705 set_file
('runtest', <<"EOF");
1708 exec $bindir/logadm -N -f /dev/null logfile >std.out 2>std.err
1712 ###########################################################################
1714 # logadm14 -- test of -n and -v flags
1716 ###########################################################################
1718 mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
1719 set_file
('dir1/syslog', 'initially dir1/syslog');
1720 set_file
('dir1/syslog.0', 'initially dir1/syslog.0');
1721 set_file
('dir1/syslog.1', 'initially dir1/syslog.1');
1722 set_file
('dir1/syslog.2', 'initially dir1/syslog.2');
1723 set_file
('dir1/syslog.3', 'initially dir1/syslog.3');
1724 set_file
('dir1/syslog.4', 'initially dir1/syslog.4');
1725 set_file
('dir1/syslog.5', 'initially dir1/syslog.5');
1726 set_file
('dir1/syslog.6', 'initially dir1/syslog.6');
1727 set_file
('dir1/syslog.7', 'initially dir1/syslog.7');
1728 mkdir 'dir2', 0777 or die "mkdir dir2: $!\n";
1729 set_file
('dir2/messages', 'initially dir2/messages');
1730 set_file
('dir2/messages.0', 'initially dir2/messages.0');
1731 set_file
('dir2/messages.1', 'initially dir2/messages.1');
1732 set_file
('dir2/messages.2', 'initially dir2/messages.2');
1733 set_file
('dir2/messages.3', 'initially dir2/messages.3');
1735 set_file
('logadm.conf', <<'EOF');
1739 # Default settings for system log file management.
1740 # The -w option to logadm(1M) is the preferred way to write to this file,
1741 # but if you do edit it by hand, use "logadm -V" to check it for errors.
1742 # but if you do edit it by hand, use "logadm -V" to check it for errors.
1744 # The format of lines in this file is:
1745 # <logname> <options>
1746 # For each logname listed here, the default options to logadm
1747 # are given. Options given on the logadm command line override
1748 # the defaults contained in this file.
1750 # logadm typically runs early every morning via an entry in
1751 # root's crontab (see crontab(1)).
1753 dir1/syslog -C 8 -a 'echo kill -HUP `cat /var/run/*syslog*pid` >> cmd.out'
1754 dir2/messages -C 4 -a 'echo kill -HUP `cat /var/run/*syslog*pid` >> cmd.out'
1756 # The entry below is used by turnacct(1M)
1758 /var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
1763 set_file
('grep.out.expect', <<'EOF'.<<"EOF".<<'EOF'.<<"EOF".<<'EOF');
1764 # loading logadm.conf
1765 # processing logname: dir1/syslog
1766 # using default rotate rules: -s1b -p1w
1767 # using default template: $file.$n
1768 mkdir -p dir1 # verify directory exists
1769 mv -f dir1/syslog.7 dir1/syslog.8 # rotate log file
1770 mkdir -p dir1 # verify directory exists
1771 mv -f dir1/syslog.6 dir1/syslog.7 # rotate log file
1772 mkdir -p dir1 # verify directory exists
1773 mv -f dir1/syslog.5 dir1/syslog.6 # rotate log file
1774 mkdir -p dir1 # verify directory exists
1775 mv -f dir1/syslog.4 dir1/syslog.5 # rotate log file
1776 mkdir -p dir1 # verify directory exists
1777 mv -f dir1/syslog.3 dir1/syslog.4 # rotate log file
1778 mkdir -p dir1 # verify directory exists
1779 mv -f dir1/syslog.2 dir1/syslog.3 # rotate log file
1780 mkdir -p dir1 # verify directory exists
1781 mv -f dir1/syslog.1 dir1/syslog.2 # rotate log file
1782 mkdir -p dir1 # verify directory exists
1783 mv -f dir1/syslog.0 dir1/syslog.1 # rotate log file
1784 mkdir -p dir1 # verify directory exists
1785 mv -f dir1/syslog dir1/syslog.0 # rotate log file
1788 chown $>:$gid dir1
/syslog
1790 chmod 664 dir1
/syslog
1791 # processing logname: dir2/messages
1792 # using default rotate rules: -s1b -p1w
1793 # using default template: $file.$n
1794 mkdir -p dir2
# verify directory exists
1795 mv
-f dir2
/messages.3 dir2/messages
.4 # rotate log file
1796 mkdir -p dir2
# verify directory exists
1797 mv
-f dir2
/messages.2 dir2/messages
.3 # rotate log file
1798 mkdir -p dir2
# verify directory exists
1799 mv
-f dir2
/messages.1 dir2/messages
.2 # rotate log file
1800 mkdir -p dir2
# verify directory exists
1801 mv
-f dir2
/messages.0 dir2/messages
.1 # rotate log file
1802 mkdir -p dir2
# verify directory exists
1803 mv
-f dir2
/messages dir2/messages
.0 # rotate log file
1806 chown $>:$gid dir2
/messages
1808 chmod 664 dir2
/messages
1809 # processing logname: /var/adm/pacct
1810 # using default template: $file.$n
1811 sh
-c echo
kill -HUP
`cat /var/run/*syslog*pid` >> cmd
.out
# -a cmd
1812 # logadm.conf and logadm.timestamps unchanged
1815 set_file
('checktest', <<'EOF');
1816 [ -s std.err ] && { cat std.err; exit 1; }
1817 [ -f std.out ] || exit 1
1818 [ -f dir1/syslog ] || exit 1
1819 [ "xinitially dir1/syslog" = "x`/bin/cat dir1/syslog`" ] || exit 1
1820 [ -f dir1/syslog.0 ] || exit 1
1821 [ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
1822 [ -f dir1/syslog.1 ] || exit 1
1823 [ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
1824 [ -f dir1/syslog.2 ] || exit 1
1825 [ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
1826 [ -f dir1/syslog.3 ] || exit 1
1827 [ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
1828 [ -f dir1/syslog.4 ] || exit 1
1829 [ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
1830 [ -f dir1/syslog.5 ] || exit 1
1831 [ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
1832 [ -f dir1/syslog.6 ] || exit 1
1833 [ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
1834 [ -f dir1/syslog.7 ] || exit 1
1835 [ "xinitially dir1/syslog.7" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
1836 [ -f dir1/syslog.8 ] && exit 1
1838 [ -f dir2/messages ] || exit 1
1839 [ "xinitially dir2/messages" = "x`/bin/cat dir2/messages`" ] || exit 1
1840 [ -f dir2/messages.0 ] || exit 1
1841 [ "xinitially dir2/messages.0" = "x`/bin/cat dir2/messages.0`" ] || exit 1
1842 [ -f dir2/messages.1 ] || exit 1
1843 [ "xinitially dir2/messages.1" = "x`/bin/cat dir2/messages.1`" ] || exit 1
1844 [ -f dir2/messages.2 ] || exit 1
1845 [ "xinitially dir2/messages.2" = "x`/bin/cat dir2/messages.2`" ] || exit 1
1846 [ -f dir2/messages.3 ] || exit 1
1847 [ "xinitially dir2/messages.3" = "x`/bin/cat dir2/messages.3`" ] || exit 1
1848 [ -f dir2/messages.4 ] && exit 1
1849 /bin/grep -v 'recording rotation date' std.out > grep.out
1850 exec /bin/diff grep.out.expect grep.out
1853 set_file
('runtest', <<"EOF");
1856 exec $bindir/logadm -nv -f logadm.conf -F logadm.timestamps >std.out 2>std.err
1860 ###########################################################################
1862 # logadm15 -- test of -T
1864 ###########################################################################
1866 set_file
('logfile', '');
1867 set_file
('logfile.0', 'initially logfile.0');
1868 set_file
('logfile.1', 'initially logfile.1');
1869 set_file
('logfile.2', 'initially logfile.2');
1870 set_file
('logfile.3', 'initially logfile.3');
1871 set_file
('logfile.4', 'initially logfile.4');
1872 set_file
('logfile.5', 'initially logfile.5');
1873 set_file
('logfile.6', 'initially logfile.6');
1874 set_file
('logfile.7', 'initially logfile.7');
1875 set_file
('logfile.8', 'initially logfile.8');
1876 set_file
('logfile.9', 'initially logfile.9');
1878 set_file
('checktest', <<'EOF');
1879 [ -s std.err ] && { cat std.err; exit 1; }
1880 [ -s std.out ] && exit 1
1881 [ -f logfile ] || exit 1
1882 [ "x" = "x`/bin/cat logfile`" ] || exit 1
1883 [ -f logfile.0 ] || exit 1
1884 [ "xinitially logfile.0" = "x`/bin/cat logfile.0`" ] || exit 1
1885 [ -f logfile.1 ] || exit 1
1886 [ "xinitially logfile.1" = "x`/bin/cat logfile.1`" ] || exit 1
1887 [ -f logfile.2 ] || exit 1
1888 [ "xinitially logfile.2" = "x`/bin/cat logfile.2`" ] || exit 1
1889 [ -f logfile.3 ] && exit 1
1890 [ -f logfile.4 ] || exit 1
1891 [ "xinitially logfile.4" = "x`/bin/cat logfile.4`" ] || exit 1
1892 [ -f logfile.5 ] && exit 1
1893 [ -f logfile.6 ] || exit 1
1894 [ "xinitially logfile.6" = "x`/bin/cat logfile.6`" ] || exit 1
1895 [ -f logfile.7 ] && exit 1
1896 [ -f logfile.8 ] || exit 1
1897 [ "xinitially logfile.8" = "x`/bin/cat logfile.8`" ] || exit 1
1898 [ -f logfile.9 ] && exit 1
1899 [ -f logfile.10 ] && exit 1
1903 set_file
('runtest', <<"EOF");
1906 exec $bindir/logadm -f /dev/null logfile -C1 -T '*.[13579]'>std.out 2>std.err
1910 ###########################################################################
1912 # logadm16 -- test of -h
1914 ###########################################################################
1916 set_file
('std.err.expect', <<'EOF');
1917 Usage: logadm [options]
1918 (processes all entries in /etc/logadm.conf or conffile given by -f)
1919 or: logadm [options] logname...
1920 (processes the given lognames)
1923 -e mailaddr mail errors to given address
1924 -F timestamps use timestamps instead of /var/logadm/timestamps
1925 -f conffile use conffile instead of /etc/logadm.conf
1927 -N not an error if log file nonexistent
1928 -n show actions, don't perform them
1929 -r remove logname entry from conffile
1930 -V ensure conffile entries exist, correct
1931 -v print info about actions happening
1932 -w entryname write entry to config file
1934 Options which control when a logfile is rotated:
1935 (default is: -s1b -p1w if no -s or -p)
1936 -p period only rotate if period passed since last rotate
1937 -P timestamp used to store rotation date in conffile
1938 -s size only rotate if given size or greater
1940 Options which control how a logfile is rotated:
1941 (default is: -t '$file.$n', owner/group/mode taken from log file)
1942 -a cmd execute cmd after taking actions
1943 -b cmd execute cmd before taking actions
1944 -c copy & truncate logfile, don't rename
1945 -g group new empty log file group
1946 -l rotate log file with local time rather than UTC
1947 -m mode new empty log file mode
1948 -M cmd execute cmd to rotate the log file
1949 -o owner new empty log file owner
1950 -R cmd run cmd on file after rotate
1951 -t template template for naming old logs
1952 -z count gzip old logs except most recent count
1954 Options which control the expiration of old logfiles:
1955 (default is: -C10 if no -A, -C, or -S)
1956 -A age expire logs older than age
1957 -C count expire old logs until count remain
1958 -E cmd run cmd on file to expire
1959 -S size expire until space used is below size
1960 -T pattern pattern for finding old logs
1963 set_file
('checktest', <<'EOF');
1964 [ -s std.out ] && exit 1
1965 exec /bin/diff std.err.expect std.err
1968 set_file
('runtest', <<"EOF");
1971 exec $bindir/logadm -h >std.out 2>std.err
1975 ###########################################################################
1977 # logadm17 -- test that mkdir -p happens as necessary
1979 ###########################################################################
1981 set_file
('logfile', 'initially logfile');
1983 set_file
('checktest', <<'EOF');
1984 [ -s std.err ] && { cat std.err; exit 1; }
1985 [ -s std.out ] && exit 1
1986 [ -f dir1/dir2/logfile ] || exit 1
1987 [ -f logfile ] || exit 1
1988 [ "xinitially logfile" = "x`/bin/cat dir1/dir2/logfile`" ] || exit 1
1992 set_file
('runtest', <<"EOF");
1995 exec $bindir/logadm -f /dev/null -t 'dir1/dir2/\$basename' logfile -p now >std.out 2>std.err
1999 ###########################################################################
2001 # logadm18 -- test of -M option
2003 ###########################################################################
2005 mkdir 'dir1', 0777 or die "mkdir dir1: $!\n";
2006 set_file
('dir1/syslog', 'initially dir1/syslog');
2007 set_file
('dir1/syslog.0', 'initially dir1/syslog.0');
2008 set_file
('dir1/syslog.1', 'initially dir1/syslog.1');
2009 set_file
('dir1/syslog.2', 'initially dir1/syslog.2');
2010 set_file
('dir1/syslog.3', 'initially dir1/syslog.3');
2011 set_file
('dir1/syslog.4', 'initially dir1/syslog.4');
2012 set_file
('dir1/syslog.5', 'initially dir1/syslog.5');
2013 set_file
('dir1/syslog.6', 'initially dir1/syslog.6');
2014 set_file
('dir1/syslog.7', 'initially dir1/syslog.7');
2016 set_file
('logadm.conf', <<"EOF");
2017 dir1/syslog -C 8 -s 1b -M '/bin/tr [a-z] [A-Z] < \$file > \$nfile; /bin/rm -f \$file'
2020 set_file
('checktest', <<'EOF');
2021 [ -s std.err ] && { cat std.err; exit 1; }
2022 [ -s std.out ] && exit 1
2023 [ -f dir1/syslog ] || exit 1
2024 [ -s dir1/syslog ] && exit 1
2025 [ -f dir1/syslog.0 ] || exit 1
2026 [ "xINITIALLY DIR1/SYSLOG" = "x`/bin/cat dir1/syslog.0`" ] || exit 1
2027 [ -f dir1/syslog.1 ] || exit 1
2028 [ "xinitially dir1/syslog.0" = "x`/bin/cat dir1/syslog.1`" ] || exit 1
2029 [ -f dir1/syslog.2 ] || exit 1
2030 [ "xinitially dir1/syslog.1" = "x`/bin/cat dir1/syslog.2`" ] || exit 1
2031 [ -f dir1/syslog.3 ] || exit 1
2032 [ "xinitially dir1/syslog.2" = "x`/bin/cat dir1/syslog.3`" ] || exit 1
2033 [ -f dir1/syslog.4 ] || exit 1
2034 [ "xinitially dir1/syslog.3" = "x`/bin/cat dir1/syslog.4`" ] || exit 1
2035 [ -f dir1/syslog.5 ] || exit 1
2036 [ "xinitially dir1/syslog.4" = "x`/bin/cat dir1/syslog.5`" ] || exit 1
2037 [ -f dir1/syslog.6 ] || exit 1
2038 [ "xinitially dir1/syslog.5" = "x`/bin/cat dir1/syslog.6`" ] || exit 1
2039 [ -f dir1/syslog.7 ] || exit 1
2040 [ "xinitially dir1/syslog.6" = "x`/bin/cat dir1/syslog.7`" ] || exit 1
2041 [ -f dir1/syslog.8 ] && exit 1
2046 set_file
('runtest', <<"EOF");
2049 exec $bindir/logadm -f logadm.conf -F logadm.timestamps >std.out 2>std.err
2053 #############################################################################
2055 # logadm19 -- test of -l
2057 #############################################################################
2059 set_file
('logfile', 'initially logfile');
2061 set_file
('checktest', <<'EOF');
2062 [ -s std.err ] && { cat std.err; exit 1; }
2063 [ -s std.out ] && exit 1
2064 [ -s logfile ] && exit 1
2066 d=`/bin/date +\%d\%H\%M`
2067 [ -f logfile.$d ] || exit 1
2068 [ "xinitially logfile" = "x`/bin/cat logfile.$d`" ] || exit 1
2072 set_file
('runtest', <<"EOF");
2075 exec $bindir/logadm -f /dev/null -l -p now logfile -t '\$file.\%d\%H\%M' >std.out 2>std.err
2079 #############################################################################
2081 # logadm20 -- test of unquotables/error handling
2083 #############################################################################
2085 set_file
('logadm.conf', <<'EOF');
2087 /var/log/syslog -C 8 -a 'kill -HUP `cat /var/run/*syslog*pid`'
2090 set_file
('std.err.expect', <<'EOF');
2091 logadm: Error: Can't protect quotes in </bin/echo "She can't take anymore, Cap'n!">
2092 logadm: Error: unsafe to update configuration file or timestamps
2093 logadm: Error: bailing out due to command line errors
2094 Use "logadm -h" for help.
2098 set_file
('checktest', <<'EOF');
2099 [ -s std.err ] || exit 1
2100 [ -s std.out ] && exit 1
2101 [ -f logadm.conf????? ] && exit 1
2102 [ -f logadm.timestamps????? ] && exit 1
2103 exec /bin/diff std.err.expect std.err
2106 set_file
('runtest', <<"EOF");
2109 $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
2110 echo exit=\$? >>std.err
2114 #############################################################################
2116 # logadm21 -- test of busted configuration file
2118 #############################################################################
2120 set_file
('logadm.conf', <<'EOF');
2123 set_file
('checktest', <<'EOF');
2124 [ -s std.err ] || exit 1
2125 grep Warning std.err > /dev/null
2128 set_file
('runtest', <<"EOF");
2131 $bindir/logadm -f logadm.conf 2>std.err