]> Frank Brehm's Git Trees - scripts/solaris.git/commitdiff
Weitergemacht
authorFrank Brehm <frank@brehm-online.com>
Tue, 21 Mar 2006 17:54:45 +0000 (17:54 +0000)
committerFrank Brehm <frank@brehm-online.com>
Tue, 21 Mar 2006 17:54:45 +0000 (17:54 +0000)
LogRotate.pm
logrotate.pl

index b0a86ea0af6d9b058c6843fdd179a3b6a705f2b1..e5dcaf3b83cc713cafc2f3fa7b8b978f1847e208 100644 (file)
@@ -24,9 +24,20 @@ use Data::Dumper;
 use POSIX;
 use File::Copy;
 
+my $MainVersion = "2.0";
+
+my $Revis = <<'ENDE';
+  $Revision$
+ENDE
+$Revis =~ s/^.*:\s*(\S+)\s*\$.*/$1/s;
+our $VERSION = $MainVersion . "." . $Revis;
+
+$Data::Dumper::Indent = 1;
+$Data::Dumper::Sortkeys = 1;
+
 use LogRotate::Conf;
+use LogRotate::StateFile;
 
-use constant default_firstline_statusfile => "Logrotate State -- Version 2";
 use constant default_buffer_size          => 4096;
 use constant max_rotate                   => 100000;
 
@@ -43,7 +54,7 @@ sub new {
     verbose         => 0,
     test            => 0,
     force           => 0,
-    statusfile      => '/var/lib/logrotate.pl.status',
+    statusfile      => '/var/lib/logrotate.status',
     scripts         => {},
     logfiles        => {},
     rotatet_files   => {},
@@ -87,6 +98,38 @@ sub read_config($$) {
 
 #------------------------------------------------------------------------------------------
 
+=head2 check_state() 
+
+
+
+=cut
+
+sub check_state($) {
+
+  my $self = shift;
+  my $p = $self->verbose() ? __PACKAGE__ . "::check_state: " : "";
+
+  my $state_file = new LogRotate::StateFile( 
+       'verbose'       => $self->{'verbose'},
+       'test'          => $self->{'test'},
+  );
+  $state_file->file($self->{'statusfile'});
+
+  my $states = $state_file->check();
+
+  if ( $states ) {
+    $self->{'state_file'} = $state_file;
+    $self->{'states'} = $states;
+    return 1;
+  }
+
+  warn $p . "Statusdatei '" . $self->{'statusfile'} . " ist nicht verwendungsfaehig.\n";
+  return undef;
+
+}
+
+#------------------------------------------------------------------------------------------
+
 =head2 verbose()
 
 Setzt bzw. gibt den Verbose-Level dieses Moduls zurueck.
index ff4f384a9884468ce9776b9393a1bc304f14892f..4d1fb8d0b216b293ba46da74fcf544af8c9a329b 100755 (executable)
@@ -63,7 +63,18 @@ use Data::Dumper;
 
 use LogRotate;
 
-our $VERSION = "2.0";
+my $MainVersion = "2.0";
+my $Revis = <<'ENDE';
+  $Revision$
+ENDE
+$Revis =~ s/^.*:\s*(\S+)\s*\$.*/$1/s;
+our $VERSION = $MainVersion . "." . $Revis;
+
+$Data::Dumper::Indent = 1;
+$Data::Dumper::Sortkeys = 1;
+
+sub write_pidfile($$);
+sub check_pidfile($);
 
 my $DefConfigFile = "/etc/logrotate.conf";
 my $ConfigFile    = $DefConfigFile;
@@ -82,7 +93,7 @@ my @ActDate = localtime();
 $| = 1;
 
 my ( @ConfigFiles, @InvalidConfigFiles  );
-my ( $res );
+my ( $res, $delete_pidfile, $pidfile );
 
 Getopt::Long::Configure("bundling");
 Getopt::Long::Configure("no_ignore_case");
@@ -120,8 +131,6 @@ if ( $Debug ) {
 
 $test = 1 if $config_check;
 
-$test = 1;
-
 unless ( $test ) {
   print "\n" . ( "#" x 80 ) . "\n" if $verbose;
   print "$0 beginnt mit Logrotation um: " . localtime() . "\n\n";
@@ -170,6 +179,8 @@ if ( $StateFile ) {
 } else {
   $lr->{'statusfile'} = $lr->{'c'}{'statusfile'} if $lr->{'c'}{'statusfile'};
 }
+$pidfile = $lr->{'c'}{'pidfile'} || "/var/run/logrotate.pid";
+$delete_pidfile = $test ? 0 : 1;
 
 unless ( $lr->{'statusfile'} ) {
   warn "Keine Statusdatei gegeben.\n";
@@ -177,10 +188,50 @@ unless ( $lr->{'statusfile'} ) {
 }
 print "Statusdatei ist: '" . $lr->{'statusfile'} . "'.\n" if $verbose;
 
+unless ( $test ) {
+
+  if ( check_pidfile $pidfile ) {
+    print $p . "Pidfile okay.\n" if $verbose > 1;
+  } else {
+    $delete_pidfile = undef;
+    exit 9;
+  }
+
+  unless ( write_pidfile $pidfile, $$ ) {
+    $delete_pidfile = undef;
+    exit 10;
+  }
+
+}
+
+exit 11 unless $lr->check_state();
+
 print "\n" . $p . "Gelesene Konfiguration: " . Dumper( $lr ) if $verbose > 3;
 
+
+$lr = undef;
+
+print "\n$0 beendet Logrotation um: " . localtime() . "\n" unless $test;
 exit 0;
 
+#----------------------------------------------------------------------
+
+END {
+
+  my $p = $verbose ? __PACKAGE__ . "::END(): " : "";
+  if ( $delete_pidfile and -f $pidfile ) {
+    print $p . "Loesche PID-File '" . $pidfile . "' ...\n" if $verbose > 1;
+    unless ( unlink $pidfile ) {
+      warn $p . "Konnte PID-File '" . $pidfile . "' nicht loeschen: $!\n";
+    }
+  }
+
+}
+
+#----------------------------------------------------------------------
+
+=pod
+
 $lr->read_state_file();
 
 print Dumper( $lr ) if $verbose > 2;
@@ -198,9 +249,10 @@ $lr->write_status();
 
 $lr->compress_files();
 
-print "\n$0 ends with logrotation at: " . localtime() . "\n" if $verbose and not $test;
 exit 0;
 
+=cut
+
 
 #------------------------------------------------------------------------------------------
 
@@ -226,6 +278,70 @@ ENDE
 
 }
 
+#------------------------------------------------------------------------------------------
+
+=head2 B<check_pidfile($pidfile)>
+
+Inspiziert das übergebene PID-File.
+
+=cut
+
+sub check_pidfile($) {
+
+  my $file = shift;
+  my ( $pid );
+  my $p = $verbose ? __PACKAGE__ . "::check_pidfile(): " : "";
+
+  if ( -f $file ) {
+    unless ( open PID, "<", $file ) {
+      warn $p . "Konnte PID file '" . $file. "' nicht lesend oeffnen: $!\n";
+      return undef;
+    }
+    $pid = <PID>;
+    close PID;
+    if ( $pid =~ /^\d+$/ ) {
+      if ( kill( 0, $pid ) ) {
+        warn $p . "Es laeuft schon ein '$0'-Script mit pid $pid!\n";
+        return undef;
+      }
+      warn $p . "Altes Pidfile gefunden, Prozess aber unbekannt verstorben...\n";
+    } else {
+      warn $p . "Nichts Verwendungsfaehiges im Pidfile gefunden, exit ...\n";
+      return undef;
+    }
+
+  }
+
+  return 1;
+
+}
+
+#------------------------------------------------------------------------------------------
+
+=head2 B<write_pidfile($pidfile, $pid)>
+
+Schreib die uebergebene PID in das uebergebene PID-File.
+
+=cut
+
+sub write_pidfile($$) {
+
+  my ( $pidfile, $pid ) = @_;
+  my $p = $verbose ? __PACKAGE__ . "::write_pidfile(): " : "";
+
+  print $p . "Schreibe PID-File '$pidfile' ...\n";
+  unless ( open PID, ">", $pidfile ) {
+    warn $p . "Konnte PID-file '" . $pidfile . "' nicht schreiben: $!\n";
+    return undef;
+  }
+  print PID "$pid\n";
+  close PID;
+
+  return 1;
+
+}
+
+
 #------------------------------------------------------------------------------------
 
 __END__