1 #!/usr/bin/perl -w
   2 #
   3 # CDDL HEADER START
   4 #
   5 # The contents of this file are subject to the terms of the
   6 # Common Development and Distribution License (the "License").
   7 # You may not use this file except in compliance with the License.
   8 #
   9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10 # or http://www.opensolaris.org/os/licensing.
  11 # See the License for the specific language governing permissions
  12 # and limitations under the License.
  13 #
  14 # When distributing Covered Code, include this CDDL HEADER in each
  15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16 # If applicable, add the following below this CDDL HEADER, with the
  17 # fields enclosed by brackets "[]" replaced with your own identifying
  18 # information: Portions Copyright [yyyy] [name of copyright owner]
  19 #
  20 # CDDL HEADER END
  21 #
  22 #
  23 # Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
  24 # Copyright (c) 2013, Joyent, Inc. All rights reserved.
  25 #
  26 #
  27 # tester - run logadm tests
  28 #
  29 # requires a <bindir> argument to say where the various logadm
  30 # binaries live (conftest, globtest, kwtest, luttest, optstest, and
  31 # logadm itself).
  32 #
  33 # to run all the tests:
  34 #       tester [-f] <bindir>
  35 #
  36 # to run just a few tests, given their names:
  37 #       tester [-f] <bindir> globtest1 luttest1
  38 #
  39 # to setup a test and stop so you can run it by hand:
  40 #       tester [-f] -s globtest1 <bindir>
  41 #
  42 #       tester will tell you what tmp directory it created for
  43 #       the test.  to run it, cd there and run:
  44 #               sh runtest
  45 #       to check the results, run:
  46 #               sh checktest
  47 #
  48 # -f means "fast" -- without it, watchmalloc(3MALLOC) is setup for
  49 # each test and they run a zillion times slower and produce core
  50 # dumps when malloc/free problems are detected.
  51 #
  52 $watchmalloc=1;         # default is to use watchmalloc
  53 ${ENV} = "/bin";
  54 umask 002;
  55 
  56 # list of tests we run by default
  57 @tests = (
  58         "conftest1",
  59         "conftest2",
  60         "globtest1",
  61         "globtest2",
  62         "kwtest1",
  63         "kwtest2",
  64         "luttest1",
  65         "optstest1",
  66         "optstest2",
  67         "logadmV1",
  68         "logadmV2",
  69         "logadmr",
  70         "logadmw",
  71         "logadm1",
  72         "logadm1c",
  73         "logadm2",
  74         "logadm3",
  75         "logadm4",
  76         "logadm5",
  77         "logadm6",
  78         "logadm7",
  79         "logadm8",
  80         "logadm9",
  81         "logadm9d",
  82         "logadm10",
  83         "logadm11",
  84         "logadm12",
  85         "logadm13",
  86         "logadm14",
  87         "logadm15",
  88         "logadm16",
  89         "logadm17",
  90         "logadm18",
  91         "logadm19",
  92         "logadm20",
  93 );
  94 
  95 use Getopt::Std;
  96 use File::Find;
  97 
  98 $usage_summary = '[-s test-name] [-d dir] bindir [test-name...]';
  99 $usage_getopts = 'fd:s:';
 100 %usage = (
 101         d=>'use dir for tests rather than creating one in /tmp',
 102         s=>'setup only, do not run test');
 103 
 104 # spew usage message, plus any given message, and exit
 105 sub usage {
 106         my $msg = shift;
 107 
 108         if ($msg) {
 109                 chomp $msg;
 110                 warn "$0: $msg\n" if $msg;
 111         }
 112         warn "Usage: $0 $usage_summary\n";
 113         foreach (sort keys %usage) {
 114                 warn "       -$_ $usage{$_}\n";
 115         }
 116         exit 1;
 117 }
 118 
 119 #
 120 # basic argument processing
 121 #
 122 $myname = $0;
 123 $myname =~ s/.*\///;    # just show last component in error mesages
 124 getopts($usage_getopts) or usage;
 125 $bindir = shift or usage;
 126 usage("$bindir does not exist") unless -d $bindir;
 127 usage("cannot list more than one test with -s option") if $opt_s && @ARGV;
 128 @tests = @ARGV if @ARGV;
 129 print "Fast mode\n" if $opt_f;
 130 $watchmalloc = 0 if $opt_f;
 131 
 132 $mydir=`pwd`;
 133 chomp $mydir;
 134 
 135 $dir = $opt_d;
 136 $dir = "/tmp/logadmtest$$" unless $dir = $opt_d;
 137 
 138 if (!-d $dir) {
 139         mkdir $dir, 0777 or die "$myname: mkdir $dir: $!\n";
 140         $needrmdir = 1;
 141 }
 142 
 143 chdir $dir or die "$myname: $dir: $!\n";
 144 
 145 # common commands in runtest by tests
 146 if ($watchmalloc) {
 147         $envsetup =
 148                 "HOME=$dir export HOME; " .
 149                 "LD_PRELOAD=watchmalloc.so.1 export LD_PRELOAD; " .
 150                 "MALLOC_DEBUG=RW export MALLOC_DEBUG";
 151 } else {
 152         $envsetup = "HOME=$dir export HOME; ";
 153 }
 154 
 155 $| = 1;         # a.k.a. setbuf(stdout, NULL)
 156 
 157 if ($opt_s) {
 158         #
 159         # just setup the test, explain how to use it, and exit
 160         #
 161         $testname = $opt_s;
 162         eval "&$opt_s";
 163         die "$myname: ERROR: $@" if $@;
 164         print "$myname: $testname setup complete, to run, cd to:\n";
 165         print "    $dir\n";
 166         print "and run the command:\n";
 167         print "    sh runtest\n";
 168         print "to check the results, run the command:\n";
 169         print "    sh checktest\n";
 170         exit 0;
 171 } else {
 172         #
 173         # run all the tests
 174         #
 175         foreach (@tests) {
 176                 $testname = $_;
 177                 print "Running $testname...";
 178                 eval "&$_";
 179                 if ($@) {
 180                         print " SETUP FAILURE\n";
 181                         print STDERR "$myname: ERROR: $@";
 182                         exit 1;
 183                 }
 184                 eval "runner('runtest')";
 185                 if ($@) {
 186                         print " RUNTEST FAILURE\n";
 187                         print STDERR "$myname: ERROR: $@";
 188                         print STDERR "results captured in directory $dir\n";
 189                         print STDERR "  or use: $myname -s $testname $bindir\n";
 190                         print STDERR "  to do a fresh setup of this test.\n";
 191                         exit 1;
 192                 }
 193                 eval "runner('checktest', '-x', '> checktest.out 2>&1')";
 194                 if ($@) {
 195                         print " CHECKTEST FAILURE\n";
 196                         print STDERR "$myname: ERROR: $@";
 197                         print STDERR "results captured in file $dir/checktest.out\n";
 198                         print STDERR "  or use: $myname -s $testname $bindir\n";
 199                         print STDERR "  to do a fresh setup of this test.\n";
 200                         exit 1;
 201                 }
 202                 print "pass\n";
 203                 # sanity...
 204                 die "unexpected dir $dir" unless $dir =~ m,/.+/,;
 205                 system("/bin/rm -rf $dir/*");
 206         }
 207 }
 208 
 209 # if we were the ones who created $dir, remove it
 210 if ($needrmdir) {
 211         chdir $mydir;
 212         rmdir $dir || die "$myname: rmdir $dir: $!\n";
 213 }
 214 
 215 exit 0;
 216 
 217 #
 218 # run a shell script and check for failure
 219 #
 220 # the shell scripts generated by this program always "exec" the binary
 221 # under test so checking here are for exit code, signals, and core dump
 222 # is actually checking the program under test and not /bin/sh
 223 #
 224 sub runner {
 225         my ($cmd, $prefix, $suffix) = (@_, '', '');
 226 
 227         my $fullcmd = "/bin/sh $prefix $cmd $suffix";
 228         my $rc = 0xffff & system("$fullcmd");
 229 
 230         if ($rc == 0) {
 231                 return;         # cmd completed normally
 232         } elsif ($rc == 0xff00) {
 233                 die "command \"$cmd\" failed: $!\n";
 234         } elsif (($rc & 0xff) == 0) {
 235                 $rc >>= 8;
 236                 die "command \"$cmd\" exit $rc\n";
 237         } else {
 238                 my $coremsg;
 239                 $coremsg = " (core dumped)" if ($rc & 0x80);
 240                 $rc &= ~0x80;
 241                 die "command \"$cmd\" signal $rc$coremsg\n" ;
 242         }
 243 }
 244 
 245 #
 246 # set_file(filename [, contents]) -- create a file, optionally with contents
 247 #
 248 sub set_file {
 249         my $file = shift;
 250         my $contents = shift;
 251 
 252         open SF, ">$file" or die "create \"$file\": $!\n";
 253         print SF $contents if defined($contents);
 254         close SF;
 255 }
 256 
 257 #############
 258 #############
 259 #############    THE TESTS START AFTER HERE...
 260 #############
 261 #############
 262 
 263 # common setup step -- create a testfile.conf
 264 sub set_testconffile {
 265         my $fname = shift;
 266         $fname = 'testfile.conf' unless defined($fname);
 267 
 268         set_file($fname, <<'EOF');
 269 #
 270 # logadm.conf
 271 #
 272 # Default settings for system log file management.
 273 # The -w option to logadm(1M) is the preferred way to write to this file,
 274 # but if you do edit it by hand, use "logadm -V" to check it for errors.
 275 # 
 276 # The format of lines in this file is:
 277 #       <logname> <options>
 278 # For each logname listed here, the default options to logadm
 279 # are given.  Options given on the logadm command line override
 280 # the defaults contained in this file.
 281 #
 282 # logadm typically runs early every morning via an entry in
 283 # root's crontab (see crontab(1)).
 284 #
 285 /var/adm/messages -C 4 -P 'Thu Nov  1 16:56:42 2001' -a 'kill -HUP `cat /var/run/*syslog*pid`'
 286 /var/cron/log -s 512k -t /var/cron/olog
 287 /var/lp/logs/lpsched -C 2 -N -t '$file.$N'
 288 #
 289 # The entry below is used by turnacct(1M)
 290 #
 291 /var/adm/pacct -C 0 -a '/usr/lib/acct/accton pacct' -g adm -m 664 -o adm -p never
 292 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'
 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 /var/run/*syslog*pid` >> cmd.out'
1183 dir2/messages -C 4 -a 'echo kill -HUP `cat /var/run/*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 /var/run/*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 /var/run/*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 /var/run/*syslog*pid` >> cmd.out'
1752 dir2/messages -C 4 -a 'echo kill -HUP `cat /var/run/*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 /var/run/*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 }