]> Frank Brehm's Git Trees - scripts/solaris.git/commitdiff
Logdateien, die geloescht werden sollen, zusammengesammelt
authorFrank Brehm <frank@brehm-online.com>
Wed, 29 Mar 2006 16:21:22 +0000 (16:21 +0000)
committerFrank Brehm <frank@brehm-online.com>
Wed, 29 Mar 2006 16:21:22 +0000 (16:21 +0000)
LogRotate.pm

index 7bd4a5abb7d52a6e648d72ac6a10713d33f8c1c5..b4a0286377d1d3ca68f9293f6073404294958823 100644 (file)
@@ -161,7 +161,89 @@ sub check_state($) {
 }
 
 #------------------------------------------------------------------------------------------
-    
+
+=head2 collect_files_delete( $file )
+
+Ermittelt alle alte Logdateien, die zu loeschen sind.
+
+Dabei sind zwei Konfigparameter entscheidend:
+
+=over 4
+
+=item C<maxage>
+
+Dieser Parameter gibt das maximale Alter einer rotierten Logdatei in Tagen an.
+
+Man kann aber bei dieser Angabe auch andere Masseinheiten, wie Jahre, Monate usw.
+verwenden (Siehe Konfigparameter C<period>).
+
+Alte Logdateien, die aelter als dieser Wert sind, werden geloescht.
+
+Ein Wert von 0 oder die Angabe von C<nomaxage> bedeutet, dass es kein Maximalalter
+fuer alte Logdateien gibt.
+
+=item C<rotate>
+
+Gibt die Maximalzahl an rotierten Dateien fuer diese Logdatei an.
+
+Wenn diese Zahl 0 ist, wird keine rotierte Logdatei aufbewahrt, sondern sofort geloescht.
+
+Wenn diese Zahl -1 oder kleiner ist, gibt es keine Beschraenkung fuer die Maximalzahl.
+
+=back
+
+=cut
+
+sub collect_files_delete($$) {
+
+  my $self = shift;
+  my $file = shift;
+  my $p = verbose() ? __PACKAGE__ . "::collect_files_delete(): " : "";
+
+  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'};
+  my $maxage = (defined $f->{'maxage'} ? $f->{'maxage'} : 0 ) * 24 * 60 * 60;
+
+  unless ( defined $of and scalar( keys %$of ) ) {
+    print $p . "Keine alten Logdateien vorhanden.\n" if verbose() > 2;
+    return $candidates;
+  }
+
+  my ( $oldfile, $age, $count );
+
+  # Nach Alter sortiert die Liste abklappern ...
+  $count = scalar( keys %$of );
+  foreach $oldfile ( sort { $of->{$a} <=> $of->{$b} } keys %$of ) {
+    $count--;
+    $age = time() - $of->{$oldfile};
+    print $p . "Untersuche, ob '$oldfile' weggeschmissen werden soll ...\n" if verbose() > 2;
+
+    # Erst mal alles weg, was mehr als die Zahl von "rotate" aussagt ...
+    if ( $f->{'rotate'} >= 0  and $count >= $f->{'rotate'} ) {
+      print $p . "Loesche '$oldfile' wegen zuviel (" . $count . " >= " . $f->{'rotate'} . ").\n" if verbose() > 2;
+      $candidates->{$oldfile} = 1;
+      next;
+    }
+
+    if ( $maxage and $age >= $maxage ) {
+      print $p . "Loesche '$oldfile' wegen zu alt (" . $age . " >= " . $maxage . ").\n" if verbose() > 2;
+      $candidates->{$oldfile} = 1;
+    }
+  }
+
+  return $candidates;
+
+}
+
+#------------------------------------------------------------------------------------------
+
 =head2 collect_old_logfiles( $file )
 
 Ermittelt alle alten, bisher rotierten Logdateien zu der uebergebenen Logdatei und gibt diese
@@ -189,7 +271,7 @@ sub collect_old_logfiles($$) {
     carp( $p . "Keine Logdatei uebergeben!\n" );
     return undef;
   }
-  print $p . "Ermittle alten Logdateien fuer '$file'.\n" if verbose();
+  print $p . "Ermittle alte Logdateien fuer '$file'.\n" if verbose() > 1;
   my $f = $self->{'c'}{'logfiles'}{$file};
 
   my $ext = defined $f->{'extension'} ? $f->{'extension'} : "";
@@ -1009,14 +1091,26 @@ sub rotate_file($$) {
   # Ermittlung aller bisherigen Logfiles ...
   my $old_logfiles = $self->collect_old_logfiles( $file );
   unless ( $old_logfiles ) {
-    warn $p . "Fehler beim Ermitteln der bisher rotierten Logfiles.\n";
+    warn $p . "Fehler beim Ermitteln der bisher rotierten Logdateien.\n";
     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;
-  
   $f->{'oldfiles'} = $old_logfiles;
 
+  if ( scalar( keys %$old_logfiles ) ) {
+    my $files_delete = $self->collect_files_delete($file);
+    unless ( $files_delete ) {
+      warn $p . "Fehler beim Ermitteln der bisher zu loeschenden alten Logdateien.\n";
+      return undef;
+    }
+    print $p . "Insgesamt " . scalar( keys %$files_delete ) . " alte Logdateie" . (scalar( keys %$files_delete ) == 1 ? "" : "n") .
+               " zum Loeschen ermittelt.\n" if verbose() > 1;
+    for ( keys %$files_delete ) {
+      $self->{'files_delete'}{$_} = 1;
+    }
+  }
+
   return 1;
 
 }