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