From: Frank Brehm Date: Thu, 30 Mar 2006 16:29:07 +0000 (+0000) Subject: Zu komprimierende Logdateien ermittelt X-Git-Url: https://git.uhu-banane.net/?a=commitdiff_plain;h=100b6c309a1180ec24472ffdbe9e1f52f716940a;p=scripts%2Fsolaris.git Zu komprimierende Logdateien ermittelt --- diff --git a/LogRotate.pm b/LogRotate.pm index b4a0286..bb0b2c1 100644 --- a/LogRotate.pm +++ b/LogRotate.pm @@ -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, der aussagt, +wieviele der rotierten Logdateien I 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; }