<?xml version="1.0" encoding="iso-8859-1"?>

<spooler>

  <config>

    <jobs>

      <job name       = "scheduler_rotate_log"
           title      = "Rotate and compress logfiles"
           spooler_id = "">

        <description>
          <include file = "jobs/JobSchedulerRotateLog.xml"/>
        </description>
  
        <params>
          <!-- store archive with compressed log files in this directory, otherwise the current log directory is used -->
          <param name = "file_path" value = "c:/tmp"/>
          <!-- compress log files with the given file specification, otherwise compress all files with the suffixs .log -->
          <!--<param name = "file_specification" value = "^(scheduler)([0-9\-]+)(" + spooler.id + "\.log)$"/>-->
          <!-- compress log files older than the given number of days -->
          <param name = "file_age" value = "14"/>
        </params>
        
        <script language   = "PerlScript"
                use_engine = "task"><![CDATA[
        
          ############################################################################
          # compress and rotate scheduler log files
          # SOS Berlin GmbH
          # Author: Ghassan Beydoun
          # eMail: ghassan.beydoun@sos-berlin.com
          # 
          # $Id: job_scheduler_rotate_log.pl 2062 2006-06-30 07:34:44Z gb $
          ############################################################################
          
          
          
            use File::stat;
            use File::Path;
            use Compress::Zlib;
          
              sub spooler_process {
                eval {


                  # give a path for files to remove
                  my $file_path = $spooler->log_dir(); 
                
                  # give the number of days, defaults to 14 days
                  my $file_age = 14;
                
                  # give a regular expression as file specification
                  $file_spec = "^(scheduler)([0-9\\-]+)";
                  if ( defined $spooler->id() && length( $spooler->id() ) > 0 ) {
                    $file_spec .=  "(\\." . $spooler->id() . ")";
                  }
                  $file_spec .= "(\\.log)\$";
          
                  eval {

                    if ( defined $spooler_task->params->var("file_path") && length ( $spooler_task->params->var("file_path") ) > 0) {
                      $file_path = $spooler_task->params->var("file_path");
                      $spooler_log->debug5(".. job parameter [file_path]: " . $file_path);
                    }
                  };
                  if($@) {
                    die("an error occured while retreiving job parameter 'file_path': $@");
                  }
          
                  eval {
                    if ( defined $spooler_task->params->var("file_specification") && length ( $spooler_task->params->var("file_specification") ) > 0) {
                      $file_spec = $spooler_task->params->var("file_specification");
                      $spooler_log->debug5(".. job parameter [file_specification]: " . $file_spec);
                    }
                  };
                  if($@) {
                    die("an error occured while retreiving job parameter 'file_specification': $@");
                  }
          
                  eval {
                    if ( defined $spooler_task->params->var("file_age") && length( $spooler_task->params->var("file_age") ) > 0 ) {
                      $file_age =  $spooler_task->params->var("file_age");
                      $spooler_log->debug5(".. job parameter [file_age]: " . $file_age);
                    }
                  };
                  if($@) {
                    die("an error occured while retreiving job parameter 'file_age': $@");
                  }
            
                  eval {
                    $spooler->{log}->start_new_file();
                  };
                  if($@) {
                    $spooler_log->warn("an error occurred rotating log file: " . $@);
                    return 0;
                  }
          
                  $counter = 0;
          
                  if ( $file_path !~ m/\/$/ ) {
                    $file_path .= "/";
                  }
          
                 # check if $file_path it does not exist
                 if (!-d $file_path ) {
                   die("Please make sure that  " . $file_path . " does exist!!");
                 } 
               
                  my @filelist = get_file_list($spooler->log_dir(), $file_spec);
          
                  my $time = time();
          
                  my $source_dir = $spooler->log_dir();
          
                  if ( $source_dir !~ m/\/$/ ) {
                    $source_dir .= "/";
                  }
          
                  my $source_file = "";
                  foreach my $temp_file (@filelist) {
                    $source_file = $source_dir . $temp_file;
                    my $mtime    = stat( $source_file )->mtime;
                    my $age_days = (($time - $mtime) / 3600) / 24;
          
                    if ( (-w $source_file) && ($age_days > $file_age) ) {
          
                      eval {
                          $counter++;
                          $gzip_filename = $file_path . $temp_file . ".gz";
                          gzip( $source_file, $gzip_filename );
                          unless ( unlink( $source_file ) ) {
                            $spooler_log->warn("could not delete file [" . $source_file . "][" . __FILE__ . ", line " . __LINE__ . "]: ");
                          }
                          $spooler_log->debug5( ".. log file [" . $source_file . "] compressed to: " . $gzip_filename);
                        };
                        if($@) {
                          $spooler_log->warn("an error occurred compressing log file [" . $source_file . "] to gzip file: " . $@);
                          last;
                        }
                    }
                  } # foreach
                  
                  if ($counter > 0) {
                    $spooler_log->info($counter . " log files compressed");
                  }
                };
                if($@) {
                  $spooler_log->warn("an error occurred cleaning up log files: " . $@);
                }
                
                return 0;
              } # spooler_process
          
          
              ###################################################
              # return the filelist of the corresponding patterns
              ###################################################
              sub get_file_list {
                my ($dir,$patterns) = @_;
                my @files_list = ();
                my @patterns = split(/,/,$patterns);
                opendir(DIR,"$dir") || return @files_list;
                foreach $_ (grep(! /^\.|~/,readdir(DIR))) {
                  foreach my $pattern (@patterns) {
                    if ( $_ =~ m/$pattern/ ) {
                      push(@files_list,$_);
                    }
                  }
                }
                close(DIR);
                return @files_list;
              } # get_file_list
          
          
              ############################
              # gzip
              ############################    
              sub gzip {
                my ( $source, $target ) = @_;
                my $line = ();
              
                # openning source for reading
                my $rw = open(FILE,$source);
                if(not defined($rw)) {
                  die "Fehler beim Öffnen der Datei: $!\n";
                }
              
                # openning target for writing
                my $gz   = gzopen( $target, 'wb' ) or die "An error occured on creating the gzip file: $gzerrno.";
                while( defined($line = <FILE>) ) {
                  $gz->gzwrite( $line )
                      or die "An error occuerd on writing gzipped data to $target: $gzerrno\n";
                }
                $gz->gzclose();
                close(FILE);
              } # gzip
          
          
          1;
        ]]></script>

        <!-- rotate log files every day of the week at the given hour -->
        <!--
        <run_time let_run = "yes"
                  begin   = "00:00"
                  end     = "24:00">
           <period single_start = "00:00"/>
        </run_time>
        -->

      </job>


      <job name       = "scheduler_dequeue_mail" 
           title      = "Send buffered mails from mail queue">

        <description>
           <include file = "jobs/JobSchedulerDequeueMailJob.xml"/>
        </description>

        <script language   = "PerlScript"
                use_engine = "task"><![CDATA[
 
          sub spooler_open
          {
            eval
            {
              $count = $spooler_log->mail->dequeue();
              $spooler_log->info( "$count buffered mails were sent, mail queue is empty" )  if $count;
            };
            if( $@ ) { $spooler_log->warn( "mail queue could not be processed: $@" ); }
            0;
          }

        ]]></script>

        <!-- repeat dequeueing in the given interval of seconds (1/2 hour) -->
        <!--
        <run_time let_run = "yes"
                  repeat  = "1800"/>
        -->

      </job>


      <job name       = "scheduler_restart"
           title      = "Restart Job Scheduler">

        <description>
           <include file = "jobs/JobSchedulerRestart.xml"/>
        </description>

        <script language   = "PerlScript"
                use_engine = "task"><![CDATA[
                
                $spooler->terminate_and_restart(600);

        ]]></script>

        <!-- restart scheduler every day of the week at the given hour -->
        <!--
        <run_time let_run = "yes"
                  begin   = "00:00"
                  end     = "24:00">
           <period single_start = "04:00"/>
        </run_time>
        -->

      </job>
      
    </jobs>
        
  </config>
  
</spooler>