package Bric::Dist::Handler;
=head1 NAME
Bric::Dist::Handler - Apache/mod_perl handler for executing distribution jobs.
=head1 VERSION
$LastChangedRevision$
=cut
# Grab the Version Number.
require Bric; our $VERSION = Bric->VERSION;
=head1 DATE
$LastChangedDate: 2006-09-16 02:41:14 +0200 (Sat, 16 Sep 2006) $
=head1 SYNOPSIS
SetHandler perl-script
PerlHandler Bric::Dist::Handler
=head1 DESCRIPTION
This module is a simple Apache/mod_perl handler for executing Bricolage
distribution jobs. It responds to a request with the headers "execute" and/or
"expire", where the values are a comma-separated list of Bric::Util::Job IDs.
Bric::Dist::Handler will instantiate and execute and/or expire each of those
jobs in turn. See Bric::Dist::Client for an interface to send those headers.
=cut
################################################################################
# Dependencies
################################################################################
# Standard Dependencies
use strict;
################################################################################
# Programmatic Dependences
use Bric::Util::Fault qw(:all);
use Bric::App::Event qw(log_event clear_events);
use Bric::App::Util qw(:pref);
use Bric::Util::Job;
use Bric::Util::Time qw(:all);
use Apache::Constants qw(HTTP_OK);
use Apache::Log;
################################################################################
# Inheritance
################################################################################
################################################################################
# Function and Closure Prototypes
################################################################################
################################################################################
# Constants
################################################################################
use constant DEBUG => 0;
################################################################################
# Fields
################################################################################
# Public Class Fields
################################################################################
# Private Class Fields
################################################################################
################################################################################
# Instance Fields
################################################################################
# Class Methods
################################################################################
=head1 INTERFACE
=head2 Constructors
NONE.
=head2 Destructors
=over 4
=item $h->DESTROY
Dummy method to prevent wasting time trying to AUTOLOAD DESTROY.
B NONE.
B NONE.
B NONE.
=back
=cut
sub DESTROY {}
################################################################################
=head2 Public Class Methods
NONE.
=head2 Public Instance Methods
NONE.
=head1 PRIVATE
=head2 Private Class Methods
NONE.
=head2 Private Instance Methods
NONE.
=head2 Private Functions
=over 4
=item my $ret_code = handler($r)
Handles the HTTP request.
B NONE. All exceptions are logged to the Apache error log.
B NONE.
B NONE.
=cut
sub handler {
my $r = shift;
eval {
$r->content_type('text/plain');
$r->header_out(BricolageDist => 1);
$r->send_http_header;
# Set up the language object and handle the request.
Bric::Util::Language->get_handle(get_pref('Language'));
# Execute all the jobs.
for my $job (Bric::Util::Job->list({
sched_time => [undef, strfdate()],
comp_time => undef,
failed => 0,
executing => 0,
})) {
$job->execute_me;
log_event("job_exec", $job);
}
};
# Log any errors.
log_err($r, $@, "Error processing jobs") if $@;
return HTTP_OK;
}
##############################################################################
=item my $bool = log_err($r, $err, $msg)
Logs an error to the Apache error log. Will handle both standard error
messages as well as Bric::Util::Fault objects.
B NONE.
B NONE.
B NONE.
=cut
sub log_err {
my ($r, $err, $msg) = @_;
$err = Bric::Util::Fault::Exception::AP->new(
error => "Error processing Mason elements.",
payload => $err,
) unless isa_exception($err);
# Clear out events so that they won't be logged.
clear_events();
# Send the error to the client.
$r->print($err->full_message);
# Send the error(s) to the apache error log.
$r->log->crit($err->full_message);
# Exception::Class::Base provides trace->as_string, but trace_as_text is
# not guaranteed. Use print STDERR to avoid escaping newlines.
print STDERR $err->can('trace_as_text')
? $err->trace_as_text
: join ("\n",
map {sprintf " [%s:%d]", $_->filename, $_->line }
$err->trace->frames),
"\n";
}
1;
__END__
=back
=head1 NOTES
NONE.
=head1 AUTHOR
David Wheeler
=head1 SEE ALSO
L,
L
=cut