From reed@bsdtoday.com Thu Jun  1 16:36:12 2000
Date: Wed, 31 May 2000 23:50:11 -0700 (PDT)
From: Jeremy C. Reed <reed@bsdtoday.com>
To: reed@bsdtoday.com
Subject: rotate_web_logs

#!/usr/bin/perl

# jcr

# 31/May/2000
#  abort if .0 file exists
# updated: 2/Mar/2000
# updated: 9/Dec/1999

# usage idea:
# find -L /web/logs -type d -exec echo /root/scripts/rotate_web_logs --verbose "{}" \;
# remove above "echo" once you check it

use Getopt::Long;

$ok = GetOptions(\%Options, "verbose");

$log_directory = $ARGV[0];

if (! $log_directory) {
  die "usage: $0 [--verbose] /path/to/log/files\n\n";
}

$save_amount = 9;
$mv = '/bin/mv';
$gzip = '/usr/bin/gzip';
$cp = '/bin/cp';

if (@Options{'verbose'}) { $verbose = '1'; }

if ($verbose) {
  print "Rotating logs in $log_directory\n";
}

chdir ($log_directory);

@files = glob("*");

#@files = <*>;

#foreach $filename (split (/\n/, $files)) {
foreach $filename (@files) {

  if (($filename !~ /\.pid/) &&
      ($filename !~ /.*\.gz/) &&
      ($filename !~ /\.lock/) &&
#      ($filename =~ /log/) &&
      (-f "$log_directory/$filename")) {

    if ($verbose) { print "$count - Processing $filename...\n"; }
    
    &rotate_old ($filename);
    &gzip_current ($filename);
    $count++;
  }
}

#end

sub rotate_old {

  $data = '';
  $loop = $save_amount - 1;
  for (; $loop >= 0; $loop--) {
    if (-e "$log_directory/$_[0].$loop.gz") {
      $new = $loop + 1;

      if ($verbose) { print "\tmoving $_[0]\.$loop\.gz to $_[0]\.$new\.gz\n"; }

      $data = `$mv $log_directory/$_[0]\.$loop\.gz $log_directory/$_[0]\.$new\.gz 2>&1`;
      if ($data) {
        print "$data";
        $error = 1;
      }
    }
  }
}

sub gzip_current {

  if (-e "$log_directory/$_[0]\.0") {
    die ("Aborted! Didn't copy $_[0] to $_[0]\.0.\n" .
         " $log_directory/$_[0]\.0 exists.\n");
  }

  if ($verbose) { print "\tcopying $_[0] to $_[0]\.0\n"; }
  $data = `$cp $log_directory/$_[0] $log_directory/$_[0]\.0 2>&1`;
  if ($data) {
    print "$data";
    $error = 1;
  }

  if ($verbose) { print "\tcopying /dev/null to $_[0]\n"; }
  $data = `$cp /dev/null $log_directory/$_[0] 2>&1`;
  if ($data) {
    print "$data";
    $error = 1;
  }

  if ($verbose) { print "\tgzipping $_[0]\.0 (creating $_[0]\.0\.gz)\n"; }
  $data = `$gzip $log_directory/$_[0]\.0 2>&1`;
  if ($data) {
    print "$data";
    $error = 1;
  }
}

