]> Frank Brehm's Git Trees - scripts/solaris.git/commitdiff
Zu komprimierende Logdateien ermittelt
authorFrank Brehm <frank@brehm-online.com>
Thu, 30 Mar 2006 16:29:07 +0000 (16:29 +0000)
committerFrank Brehm <frank@brehm-online.com>
Thu, 30 Mar 2006 16:29:07 +0000 (16:29 +0000)
LogRotate.pm

index b4a0286377d1d3ca68f9293f6073404294958823..bb0b2c1d6317feb08477188f4567e2b268a0e5f7 100644 (file)
@@ -122,7 +122,8 @@ sub new {
   chomp $t;
   $self->{'template'}{'machine'}  = $t;
 
-  #return undef unless $self->check_state_file();
+  $self->{'files_delete'} = {};
+  $self->{'files_compress'} = {};
 
   return $res;
 
@@ -244,6 +245,89 @@ sub collect_files_delete($$) {
 
 #------------------------------------------------------------------------------------------
 
+=head2 collect_compress_logfiles( $file )
+
+Ermittelt alle alte Logdateien, die zu komprimieren sind sind.
+
+Von Einfluss darauf ist der Konfig-Parameter C<delaycompress>, der aussagt,
+wieviele der rotierten Logdateien I<NICHT> komprimiert bleiben sollen.
+
+Die Rueckgabe erfolgt als Hash-Ref
+
+=cut
+
+sub collect_compress_logfiles($$) {
+
+  my $self = shift;
+  my $file = shift;
+  my $p = verbose() ? __PACKAGE__ . "::collect_compress_logfiles(): " : "";
+
+  unless ( $file ) {
+    carp( $p . "Keine Logdatei uebergeben!\n" );
+    return undef;
+  }
+  print $p . "Ermittle alte Logdateien zum Loeschen fuer '$file'.\n" if verbose() > 1;
+  my $f = $self->{'c'}{'logfiles'}{$file};
+
+  my $candidates = {};
+  my $of = $f->{'oldfiles'};
+
+  unless ( $f->{'compress'} ) {
+    print $p . "Es werden keine Logdateien komprimiert.\n" if verbose() > 2;
+    return $candidates;
+  }
+
+  my $behalten = $f->{'delaycompress'} || 0;
+
+  # Compress-Endung ermitteln ...
+  my $ce = $self->{'c'}->compressext();
+  if ( not defined($ce) or $ce =~ /^\s*$/ ) {
+    $ce = ".gz";
+  }
+  $ce = "." . $ce if $ce ne "" and $ce !~ /^\./;
+
+  unless ( defined $of and scalar( keys %$of ) ) {
+    print $p . "Keine alten Logdateien vorhanden.\n" if verbose() > 2;
+    return $candidates;
+  }
+
+  my ( $oldfile, $count );
+
+  # Nach Alter sortiert die Liste abklappern ...
+  $count = scalar( keys %$of );
+  foreach $oldfile ( sort { $of->{$a} <=> $of->{$b} } keys %$of ) {
+    $count--;
+    if ( $oldfile =~ /$ce$/i ) {
+      print $p . "Logdatei '$oldfile' scheint schon komprimiert zu sein.\n" if verbose() > 2;
+      next;
+    }
+    if ( $self->{'files_delete'}{$oldfile} ) {
+      print $p . "Logdatei '$oldfile' ist zum Loeschen vorgesehen.\n" if verbose() > 2;
+      next;
+    }
+    $candidates->{$oldfile} = $of->{$oldfile};
+  }
+
+  if ( $behalten and scalar( keys %$candidates ) ) {
+    my $files_behalten = {};
+    my $i = 0;
+    foreach $oldfile ( sort { $candidates->{$b} <=> $candidates->{$a} } keys %$candidates ) {
+      $i++;
+      last if $i > $behalten;
+      $files_behalten->{$oldfile} = 1;
+    }
+    foreach $oldfile ( keys %$files_behalten ) {
+      delete $candidates->{$oldfile};
+    }
+    $files_behalten = undef;
+  }
+
+  return $candidates;
+
+}
+
+#------------------------------------------------------------------------------------------
+
 =head2 collect_old_logfiles( $file )
 
 Ermittelt alle alten, bisher rotierten Logdateien zu der uebergebenen Logdatei und gibt diese
@@ -401,12 +485,15 @@ sub collect_old_logfiles($$) {
   push @Pattern, $olddir . "/" . $basename . ".[0-9][0-9]" . $ext;
   push @Pattern, $olddir . "/" . $basename . ".[0-9][0-9][0-9]" . $ext;
   push @Pattern, $olddir . "/" . $basename . ".[0-9][0-9][0-9][0-9]" . $ext;
+  push @Pattern, $olddir . "/" . $basename . ".[0-9][0-9][0-9][0-9][0-9]" . $ext;
+
   if ( $f->{'compress'} ) {
     push @Pattern, $olddir . "/" . $basename . $ext_ohne;
     push @Pattern, $olddir . "/" . $basename . ".[0-9]" . $ext_ohne;
     push @Pattern, $olddir . "/" . $basename . ".[0-9][0-9]" . $ext_ohne;
     push @Pattern, $olddir . "/" . $basename . ".[0-9][0-9][0-9]" . $ext_ohne;
     push @Pattern, $olddir . "/" . $basename . ".[0-9][0-9][0-9][0-9]" . $ext_ohne;
+    push @Pattern, $olddir . "/" . $basename . ".[0-9][0-9][0-9][0-9][0-9]" . $ext_ohne;
   }
 
 #  $pattern = '"' . join( '" "', @Pattern ) . '"';
@@ -1095,7 +1182,7 @@ sub rotate_file($$) {
     return undef;
   }
   print $p . "Insgesamt " . scalar( keys %$old_logfiles ) . " bisher rotierte Logdateie" . (scalar( keys %$old_logfiles ) == 1 ? "" : "n") . ".\n" if verbose();
-  print $p . "Liste aller bisher rotierten Logfiles: " . Dumper($old_logfiles) if verbose() > 2;
+  print $p . "Liste aller bisher rotierten Logdateien: " . Dumper($old_logfiles) if verbose() > 2;
   $f->{'oldfiles'} = $old_logfiles;
 
   if ( scalar( keys %$old_logfiles ) ) {
@@ -1111,6 +1198,21 @@ sub rotate_file($$) {
     }
   }
 
+  # Ermittlung der zu komprimierenden Logdateien ...
+  if ( $f->{'compress'} and scalar( keys %$old_logfiles ) ) {
+    my $files_compress = $self->collect_compress_logfiles($file);
+    unless ( $files_compress ) {
+      warn $p . "Fehler beim Ermitteln der zu komprimierenden Logdateien.\n";
+      return undef;
+    }
+    print $p . "Insgesamt " . scalar( keys %$files_compress ) . " Logdateie" . (scalar( keys %$files_compress ) == 1 ? "" : "n") . " zu komprimieren.\n" if verbose();
+    print $p . "Liste aller zu komprimierenden Logdateien: " . Dumper($files_compress) if verbose() > 2;
+
+    for ( keys %$files_compress ) {
+      $self->{'files_compress'}{$_} = 1;
+    }
+  }
+
   return 1;
 
 }