[Rt-commit] r9747 - in rt/branches/3.999-DANGEROUS: bin

jesse at bestpractical.com jesse at bestpractical.com
Mon Nov 26 14:12:02 EST 2007


Author: jesse
Date: Mon Nov 26 14:12:00 2007
New Revision: 9747

Added:
   rt/branches/3.999-DANGEROUS/bin/mason_handler.fcgi   (contents, props changed)
   rt/branches/3.999-DANGEROUS/bin/mason_handler.scgi   (contents, props changed)
   rt/branches/3.999-DANGEROUS/bin/mason_handler.svc
   rt/branches/3.999-DANGEROUS/bin/rt-crontool   (contents, props changed)
   rt/branches/3.999-DANGEROUS/bin/rt-mailgate   (contents, props changed)
   rt/branches/3.999-DANGEROUS/bin/standalone_httpd   (contents, props changed)
   rt/branches/3.999-DANGEROUS/bin/webmux.pl
Removed:
   rt/branches/3.999-DANGEROUS/bin/mason_handler.fcgi.in
   rt/branches/3.999-DANGEROUS/bin/mason_handler.scgi.in
   rt/branches/3.999-DANGEROUS/bin/mason_handler.svc.in
   rt/branches/3.999-DANGEROUS/bin/rt-crontool.in
   rt/branches/3.999-DANGEROUS/bin/rt-mailgate.in
   rt/branches/3.999-DANGEROUS/bin/standalone_httpd.in
   rt/branches/3.999-DANGEROUS/bin/webmux.pl.in
Modified:
   rt/branches/3.999-DANGEROUS/   (props changed)
   rt/branches/3.999-DANGEROUS/bin/   (props changed)

Log:
 r72349 at pinglin:  jesse | 2007-11-26 14:09:21 -0500
 * oops


Added: rt/branches/3.999-DANGEROUS/bin/mason_handler.fcgi
==============================================================================
--- (empty file)
+++ rt/branches/3.999-DANGEROUS/bin/mason_handler.fcgi	Mon Nov 26 14:12:00 2007
@@ -0,0 +1,86 @@
+#!/opt/local/bin/perl
+# BEGIN BPS TAGGED BLOCK {{{
+# 
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
+#                                          <jesse at bestpractical.com>
+# 
+# (Except where explicitly superseded by other copyright notices)
+# 
+# 
+# LICENSE:
+# 
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+# 
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/copyleft/gpl.html.
+# 
+# 
+# CONTRIBUTION SUBMISSION POLICY:
+# 
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+# 
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+# 
+# END BPS TAGGED BLOCK }}}
+package RT::Mason;
+
+use strict;
+use vars '$Handler';
+use File::Basename;
+require ('/home/jesse/svk/3.999-DANGEROUS/bin/webmux.pl');
+
+# Enter CGI::Fast mode, which should also work as a vanilla CGI script.
+require CGI::Fast;
+
+RT::Init();
+
+while ( my $cgi = CGI::Fast->new ) {
+    # the whole point of fastcgi requires the env to get reset here..
+    # So we must squash it again
+    $ENV{'PATH'}   = '/bin:/usr/bin';
+    $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'};
+    $ENV{'SHELL'}  = '/bin/sh' if defined $ENV{'SHELL'};
+    $ENV{'ENV'}    = '' if defined $ENV{'ENV'};
+    $ENV{'IFS'}    = '' if defined $ENV{'IFS'};
+
+    Module::Refresh->refresh if RT->Config->Get('DevelMode');
+    RT::connect_to_database();
+
+    if ( ( !$Handler->interp->comp_exists( $cgi->path_info ) )
+        && ( $Handler->interp->comp_exists( $cgi->path_info . "/index.html" ) ) ) {
+        $cgi->path_info( $cgi->path_info . "/index.html" );
+    }
+
+    eval { $Handler->handle_cgi_object($cgi); };
+    if ($@) {
+        $RT::Logger->crit($@);
+    }
+    RT::Interface::Web::Handler->CleanupRequest(); 
+
+}
+
+1;

Added: rt/branches/3.999-DANGEROUS/bin/mason_handler.scgi
==============================================================================
--- (empty file)
+++ rt/branches/3.999-DANGEROUS/bin/mason_handler.scgi	Mon Nov 26 14:12:00 2007
@@ -0,0 +1,67 @@
+#!/usr/local/bin/speedy
+# BEGIN BPS TAGGED BLOCK {{{
+# 
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
+#                                          <jesse at bestpractical.com>
+# 
+# (Except where explicitly superseded by other copyright notices)
+# 
+# 
+# LICENSE:
+# 
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+# 
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/copyleft/gpl.html.
+# 
+# 
+# CONTRIBUTION SUBMISSION POLICY:
+# 
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+# 
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+# 
+# END BPS TAGGED BLOCK }}}
+package RT::Mason;
+
+use strict;
+use vars '$Handler';
+require ('/home/jesse/svk/3.999-DANGEROUS/bin/webmux.pl');
+
+require CGI;
+
+RT::Init();
+
+my $cgi = CGI->new;
+if ( ( !$Handler->interp->comp_exists( $cgi->path_info ) )
+    && ( $Handler->interp->comp_exists( $cgi->path_info . "/index.html" ) ) ) {
+    $cgi->path_info( $cgi->path_info . "/index.html" );
+}
+
+$Handler->handle_cgi_object($cgi);
+RT::Interface::Web::Handler->CleanupRequest();
+1;

Added: rt/branches/3.999-DANGEROUS/bin/mason_handler.svc
==============================================================================
--- (empty file)
+++ rt/branches/3.999-DANGEROUS/bin/mason_handler.svc	Mon Nov 26 14:12:00 2007
@@ -0,0 +1,261 @@
+#!/opt/local/bin/perl
+# BEGIN BPS TAGGED BLOCK {{{
+# 
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
+#                                          <jesse at bestpractical.com>
+# 
+# (Except where explicitly superseded by other copyright notices)
+# 
+# 
+# LICENSE:
+# 
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+# 
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/copyleft/gpl.html.
+# 
+# 
+# CONTRIBUTION SUBMISSION POLICY:
+# 
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+# 
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+# 
+# END BPS TAGGED BLOCK }}}
+=head1 NAME
+
+mason_handler.svc - Win32 IIS Service handler for RT
+
+=head1 SYNOPSIS
+
+    perl mason_handler.svc --install	# install as service
+    perl mason_handler.svc --deinstall	# deinstall this service
+    perl mason_handler.svc --help	# show this help
+    perl mason_handler.svc 		# launch handler from command line
+
+=head1 DESCRIPTION
+
+This script manages a stand-alone FastCGI server, and populates the necessary
+registry settings to run it with Microsoft IIS Server 4.0 or above.
+
+Before running it, you need to install the B<FCGI> module from CPAN, as well as
+B<Win32::Daemon> from L<http://www.roth.net/perl/Daemon/> if you want to install
+itself as a service.
+
+This script will automatically create a virtual directory under the IIS root;
+its name is taken from C<$WebPath> in the F<RT_Config.pm> file.  Additionally,
+please install the ISAPI binary from L<http://www.caraveo.com/fastcgi/> and set
+up an ISAPI Script Map that maps F<.html> files to F<isapi_fcgi.dll>.
+
+Once the service is launched (either via C<net start RTFastCGI> or by running
+C<perl mason_handler.svc>), a FCGI server will start and bind to port C<8284>
+(mnemonics: the ASCII value of C<R> and C<T>); the ISAPI handler's C<BindPath>
+registry setting will also be automatically populated.
+
+=cut
+
+package RT::Mason;
+
+use strict;
+use File::Basename;
+use vars '$Handler';
+require (dirname(__FILE__) . '/webmux.pl');
+
+use Cwd;
+use File::Spec;
+
+use Win32;
+use Win32::Process;
+use Win32::Service;
+use Win32::TieRegistry;
+
+my $ProcessObj;
+
+BEGIN {
+    my $runsvc = sub {
+	Win32::Process::Create(
+	    $ProcessObj, $^X, "$^X $0 --run", 0, NORMAL_PRIORITY_CLASS, "."
+	) or do {
+	    die Win32::FormatMessage( Win32::GetLastError() );
+	};
+
+	chdir File::Basename::dirname($0);
+	my $path = Cwd::cwd();
+	$path =~ s|/|\\|g;
+	$path =~ s|bin$|share\\html|;
+
+	$Win32::TieRegistry::Registry->{
+	    'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\\'.
+	    'W3SVC\Parameters\Virtual Roots\\'
+	}->{RT->Config->Get('WebPath') || '/'} = "$path,,205";
+	    
+	$Win32::TieRegistry::Registry->{
+	    'HKEY_LOCAL_MACHINE\Software\FASTCGI\.html\\'
+	}->{'BindPath'} = $ENV{'FCGI_SOCKET_PATH'};
+
+	Win32::Service::StartService(Win32::NodeName, 'W3SVC');
+    };
+    
+    if ($ARGV[0] eq '--deinstall') {
+	chdir File::Basename::dirname($0);
+	my $path = Cwd::cwd();
+	$path =~ s|/|\\|g;
+
+	require Win32::Daemon;
+	Win32::Daemon::DeleteService('RTFastCGI');
+	warn "Service 'RTFastCGI' successfully deleted.\n";
+	exit;
+    }
+    elsif ($ARGV[0] eq '--install') {
+	chdir File::Basename::dirname($0);
+	my $path = Cwd::cwd();
+	$path =~ s|/|\\|g;
+
+	require Win32::Daemon;
+	Win32::Daemon::DeleteService('RTFastCGI');
+	
+	my $rv = Win32::Daemon::CreateService( {
+	    machine =>  '',
+	    name    =>  'RTFastCGI',
+	    display =>  'RT FastCGI Handler',
+	    path    =>  $^X,
+	    user    =>  '',
+	    pwd     =>  $path,
+	    description => 'Enables port 8284 as the RT FastCGI handler.',
+	    parameters  => File::Spec->catfile(
+		    $path, File::Basename::basename($0)
+	    ) . ' --service',
+	} );
+    
+	if ($rv) {
+	    warn "Service 'RTFastCGI' successfully Created.\n";
+	}
+	else {
+	    warn "Failed to add service: " . Win32::FormatMessage(
+		Win32::Daemon::GetLastError()
+	    ) . "\n";
+	}
+	exit;
+    }
+    elsif ($ARGV[0] eq '--service') {
+	require Win32::Daemon;
+
+	my $PrevState = Win32::Daemon::SERVICE_START_PENDING();
+	Win32::Daemon::StartService() or die $^E;
+
+	while ( 1 ) {
+	    my $State = Win32::Daemon::State();
+	    last if $State == Win32::Daemon::SERVICE_STOPPED();
+	    
+	    if ( $State == Win32::Daemon::SERVICE_START_PENDING() ) {
+		$runsvc->();
+		Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() );
+		$PrevState = Win32::Daemon::SERVICE_RUNNING();
+	    }
+	    elsif ( $State == Win32::Daemon::SERVICE_CONTINUE_PENDING() ) {
+		$ProcessObj->Resume;
+		Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() );
+		$PrevState = Win32::Daemon::SERVICE_RUNNING();
+	    }
+	    elsif ( $State == Win32::Daemon::SERVICE_STOP_PENDING() ) {
+	    $ProcessObj->Kill(0);
+		Win32::Daemon::State( Win32::Daemon::SERVICE_STOPPED() );
+		$PrevState = Win32::Daemon::SERVICE_STOPPED();
+	    }
+	    elsif ( $State == Win32::Daemon::SERVICE_RUNNING() ) {
+		my $Message = Win32::Daemon::QueryLastMessage(1);
+		if ( $Message == Win32::Daemon::SERVICE_CONTROL_INTERROGATE() ) {
+		    Win32::Daemon::State( $PrevState );
+		}
+		elsif ( $Message == Win32::Daemon::SERVICE_CONTROL_SHUTDOWN() ) {
+		    Win32::Daemon::State( Win32::Daemon::SERVICE_STOP_PENDING(), 15000 );
+		}
+		elsif ( $Message != Win32::Daemon::SERVICE_CONTROL_NONE() ) {
+		    Win32::Daemon::State( $PrevState );
+		}
+	    }
+	    
+	    Win32::Sleep( 1000 );
+	}
+		
+	Win32::Daemon::StopService();
+	exit;
+    }
+    elsif ($ARGV[0] eq '--help') {
+	system("perldoc $0");
+	exit;
+    }
+    elsif ($ARGV[0] ne '--run') {
+	$SIG{__DIE__} = sub { $ProcessObj->Kill(0) if $ProcessObj };
+	$runsvc->();
+	warn "RT FastCGI Handler launched. Press [Enter] to terminate...\n";
+	<STDIN>;
+	exit;
+    }
+}
+
+###############################################################################
+
+warn "Begin listening on $ENV{'FCGI_SOCKET_PATH'}\n";
+
+require CGI::Fast;
+
+RT::Init();
+
+# Response loop
+while( my $cgi = CGI::Fast->new ) {
+    my $comp = $ENV{'PATH_INFO'};
+
+    $comp = $1 if ($comp =~ /^(.*)$/);
+    my $web_path = RT->Config->Get('WebPath');
+    $comp =~ s|^\Q$web_path\E\b||i;
+    $comp .= "index.html" if ($comp =~ /\/$/);
+    $comp =~ s/.pl$/.html/g;
+    
+    warn "Serving $comp\n";
+
+    $Handler->handle_cgi($comp);
+    RT::Interface::Web::Handler->CleanupRequest();
+    # _should_ always be tied
+}
+
+1;
+
+=head1 AUTHORS
+
+Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>
+
+=head1 COPYRIGHT
+
+Copyright 2002 by Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>.
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut

Added: rt/branches/3.999-DANGEROUS/bin/rt-crontool
==============================================================================
--- (empty file)
+++ rt/branches/3.999-DANGEROUS/bin/rt-crontool	Mon Nov 26 14:12:00 2007
@@ -0,0 +1,298 @@
+#!/opt/local/bin/perl
+# BEGIN BPS TAGGED BLOCK {{{
+# 
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
+#                                          <jesse at bestpractical.com>
+# 
+# (Except where explicitly superseded by other copyright notices)
+# 
+# 
+# LICENSE:
+# 
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+# 
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/copyleft/gpl.html.
+# 
+# 
+# CONTRIBUTION SUBMISSION POLICY:
+# 
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+# 
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+# 
+# END BPS TAGGED BLOCK }}}
+use strict;
+use Carp;
+
+use lib ("/home/jesse/svk/3.999-DANGEROUS/local/lib", "/home/jesse/svk/3.999-DANGEROUS/lib");
+
+package RT;
+
+use Getopt::Long;
+
+use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
+use RT::Model::TicketCollection;
+use RT::Model::Template;
+
+#Clean out all the nasties from the environment
+CleanEnv();
+
+# Load the config file
+RT::load_config();
+
+#Connect to the database and get RT::system_user and RT::Nobody loaded
+RT::Init();
+
+#Get the current user all loaded
+my $CurrentUser = GetCurrentUser();
+
+unless ( $CurrentUser->id ) {
+    print loc("No RT user found. Please consult your RT administrator.\n");
+    exit(1);
+}
+
+my ( $search, $condition, $action, $search_arg, $condition_arg, $action_arg,
+     $template_id, $transaction, $transaction_type, $help, $verbose );
+GetOptions( "search=s"           => \$search,
+            "search-arg=s"       => \$search_arg,
+            "condition=s"        => \$condition,
+            "condition-arg=s"    => \$condition_arg,
+            "action-arg=s"       => \$action_arg,
+            "action=s"           => \$action,
+            "template-id=s"      => \$template_id,
+            "transaction=s"      => \$transaction,
+            "transaction-type=s" => \$transaction_type,
+            "help"               => \$help,
+            "verbose|v"          => \$verbose );
+
+help() if $help or not $search or not $action;
+
+$transaction ||= 'first';
+unless ( $transaction =~ /^(first|last)$/i ) {
+    print STDERR loc("--transaction argument could be only 'first' or 'last'");
+    exit 1;
+}
+$transaction = lc($transaction) eq 'first'? 'ASC': 'DESC';
+
+# We _must_ have a search object
+load_module($search);
+load_module($action)    if ($action);
+load_module($condition) if ($condition);
+
+# load template if specified
+my $template_obj;
+if ($template_id) {
+    $template_obj = RT::Model::Template->new($CurrentUser);
+    $template_obj->load($template_id);
+}
+my $void_scrip = RT::Model::Scrip->new( $CurrentUser );
+my $void_scrip_action = RT::Model::ScripAction->new( $CurrentUser );
+
+#At the appointed time:
+
+#find a bunch of tickets
+my $tickets = RT::Model::TicketCollection->new($CurrentUser);
+my $search  = $search->new(
+    TicketsObj  => $tickets,
+    Argument    => $search_arg,
+    CurrentUser => $CurrentUser
+);
+
+$search->prepare();
+
+# TicketsFound is an RT::Model::TicketCollection object
+my $tickets = $search->TicketsObj;
+
+#for each ticket we've found
+while ( my $ticket = $tickets->next() ) {
+    print $ticket->id() . ": " if ($verbose);
+
+    my $transaction = get_transaction($ticket);
+    print loc("Using transaction #[_1]...", $transaction->id)
+        if $verbose && $transaction;
+
+    # perform some more advanced check
+    if ($condition) {
+        my $condition_obj = $condition->new(
+            TransactionObj => $transaction,
+            TicketObj      => $ticket,
+            ScripObj       => $void_scrip,
+            TemplateObj    => $template_obj,
+            Argument       => $condition_arg,
+            CurrentUser    => $CurrentUser,
+        );
+
+        # if the condition doesn't apply, get out of here
+
+        next unless ( $condition_obj->IsApplicable );
+        print loc("Condition matches...") if ($verbose);
+    }
+
+    #prepare our action
+    my $action_obj = $action->new(
+        TicketObj      => $ticket,
+        TransactionObj => $transaction,
+        TemplateObj    => $template_obj,
+        Argument       => $action_arg,
+        ScripObj       => $void_scrip,
+        ScripActionObj => $void_scrip_action,
+        CurrentUser    => $CurrentUser,
+    );
+
+    #if our preparation, move onto the next ticket
+    next unless ( $action_obj->prepare );
+    print loc("Action prepared...") if ($verbose);
+
+    #commit our action.
+    next unless ( $action_obj->commit );
+    print loc("Action committed.\n") if ($verbose);
+}
+
+=head2 get_transaction
+
+Takes ticket and returns its transaction acording to command
+line arguments C<--transaction> and <--transaction-type>.
+
+=cut
+
+sub get_transaction {
+    my $ticket = shift;
+    my $txns = $ticket->Transactions;
+    $txns->order_by(
+        { column => 'Created', order => $transaction },
+        { column => 'id', order => $transaction },
+    );
+    $txns->limit( column => 'Type', value => $transaction_type )
+        if $transaction_type;
+    $txns->rows_per_page(1);
+    return $txns->first;
+}
+
+# {{{ load_module 
+
+=head2 load_module
+
+Loads a perl module, dying nicely if it can't find it.
+
+=cut
+
+sub load_module {
+    my $modname = shift;
+    eval "require $modname";
+    if ($@) {
+        die loc( "Failed to load module [_1]. ([_2])", $modname, $@ );
+    }
+
+}
+
+# }}}
+
+# {{{ loc 
+
+=head2 loc LIST
+
+Localize this string, with the current user's currentuser object
+
+=cut
+
+sub loc {
+    $CurrentUser->loc(@_);
+}
+
+# }}}
+
+sub help {
+
+    print loc( "[_1] is a tool to act on tickets from an external scheduling tool, such as cron.", $0 )
+      . "\n";
+    print loc("It takes several arguments:") . "\n\n";
+
+    print "	"
+      . loc( "[_1] - Specify the search module you want to use", "--search" )
+      . "\n";
+    print "	"
+      . loc( "[_1] - An argument to pass to [_2]", "--search-argument", "--search" )
+      . "\n";
+
+    print "	"
+      . loc( "[_1] - Specify the condition module you want to use", "--condition" )
+      . "\n";
+    print "	"
+      . loc( "[_1] - An argument to pass to [_2]", "--condition-argument", "--condition" )
+      . "\n";
+    print "	"
+      . loc( "[_1] - Specify the action module you want to use", "--action" )
+      . "\n";
+    print "	"
+      . loc( "[_1] - An argument to pass to [_2]", "--action-argument", "--action" )
+      . "\n";
+    print "	"
+      . loc( "[_1] - Specify id of the template you want to use", "--template-id" )
+      . "\n";
+    print "	"
+      . loc( "[_1] - Specify if you want to use either 'first' or 'last' transaction", "--transaction" )
+      . "\n";
+    print "	"
+      . loc( "[_1] - Specify the type of a transaction you want to use", "--transaction-type" )
+      . "\n";
+    print "	"
+      . loc( "[_1] - Output status updates to STDOUT", "--verbose" ) . "\n";
+    print "\n";
+    print "\n";
+    print loc("Security:")."\n";
+    print loc("This tool allows the user to run arbitrary perl modules from within RT.")." ". 
+        loc("If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT.")." ".
+        loc("It is incredibly important that nonprivileged users not be allowed to run this tool."). " " . 
+        loc("It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool.")."\n";
+    print "\n";
+    print loc("Example:");
+    print "\n";
+    print " "
+      . loc( "The following command will find all active tickets in the queue 'general' and set their priority to 99 if they haven't been touched in 4 hours:"
+      )
+      . "\n\n";
+
+    print " bin/rt-crontool \\\n";
+    print "  --search RT::Search::ActiveTicketsInQueue  --search-arg general \\\n";
+    print "  --condition RT::Condition::UntouchedInHours --condition-arg 4 \\\n";
+    print "  --action RT::ScripAction::SetPriority --action-arg 99 \\\n";
+    print "  --verbose\n";
+
+    print "\n";
+    print loc("Escalate tickets"). "\n";
+    print " bin/rt-crontool \\\n";
+    print "  --search RT::Search::ActiveTicketsInQueue  --search-arg general \\\n";
+    print "  --action RT::ScripAction::EscalatePriority\n";
+ 
+ 
+ 
+
+
+
+    exit(0);
+}

Added: rt/branches/3.999-DANGEROUS/bin/rt-mailgate
==============================================================================
--- (empty file)
+++ rt/branches/3.999-DANGEROUS/bin/rt-mailgate	Mon Nov 26 14:12:00 2007
@@ -0,0 +1,411 @@
+#!/usr/sbin/perl -w
+# BEGIN BPS TAGGED BLOCK {{{
+# 
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
+#                                          <jesse at bestpractical.com>
+# 
+# (Except where explicitly superseded by other copyright notices)
+# 
+# 
+# LICENSE:
+# 
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+# 
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/copyleft/gpl.html.
+# 
+# 
+# CONTRIBUTION SUBMISSION POLICY:
+# 
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+# 
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+# 
+# END BPS TAGGED BLOCK }}}
+=head1 NAME
+
+rt-mailgate - Mail interface to RT3.
+
+=cut
+
+use strict;
+use warnings;
+
+use Getopt::Long;
+use LWP::UserAgent;
+use HTTP::Request::Common qw($DYNAMIC_FILE_UPLOAD);
+$DYNAMIC_FILE_UPLOAD = 1;
+
+use constant EX_TEMPFAIL => 75;
+use constant BUFFER_SIZE => 8192;
+
+my %opts;
+GetOptions( \%opts, "queue=s", "action=s", "url=s", "jar=s", "help", "debug", "extension=s", "timeout=i" );
+
+if ( $opts{'help'} ) {
+    require Pod::Usage;
+    import Pod::Usage;
+    pod2usage("RT Mail Gateway\n");
+    exit 1;    # Don't want to succeed if this is really an email!
+}
+
+unless ( $opts{'url'} ) {
+    print STDERR "$0 invoked improperly\n\nNo 'url' provided to mail gateway!\n";
+    exit 1;
+}
+
+my $ua = new LWP::UserAgent;
+$ua->cookie_jar( { file => $opts{'jar'} } ) if $opts{'jar'};
+
+my %args = (
+    SessionType => 'REST', # Surpress login box
+);
+foreach ( qw(queue action) ) {
+    $args{$_} = $opts{$_} if defined $opts{$_};
+};
+
+if ( ($opts{'extension'} || '') =~ /^(?:action|queue|ticket)$/i ) {
+    $args{ lc $opts{'extension'} } = $ENV{'EXTENSION'};
+} elsif ( $opts{'extension'} && $ENV{'EXTENSION'} ) {
+    print STDERR "Value of the --extension argument is not action, queue or ticket"
+        .", but environment variable EXTENSION is also defined. The former is ignored.\n";
+}
+
+# add ENV{'EXTENSION'} as X-RT-MailExtension to the message header
+if ( my $value = ( $ENV{'EXTENSION'} || $opts{'extension'} ) ) {
+    # prepare value to avoid MIME format breakage
+    # strip trailing newline symbols
+    $value =~ s/(\r*\n)+$//;
+    # make a correct multiline header field,
+    # with tabs in the beginning of each line
+    $value =~ s/(\r*\n)/$1\t/g;
+    $opts{'headers'} .= "X-RT-Mail-Extension: $value\n";
+}
+
+# Read the message in from STDIN
+my %message = write_down_message();
+unless( $message{'filename'} ) {
+    $args{'message'} = [
+        undef, '',
+        'Content-Type' => 'application/octet-stream',
+        Content => ${ $message{'content'} },
+    ];
+} else {
+    $args{'message'} = [
+        $message{'filename'}, '',
+        'Content-Type' => 'application/octet-stream',
+    ];
+}
+
+my $full_url = $opts{'url'}. "/REST/1.0/NoAuth/mail-gateway";
+print STDERR "$0: connecting to $full_url\n" if $opts{'debug'};
+
+$ua->timeout( exists( $opts{'timeout'} )? $opts{'timeout'}: 180 );
+my $r = $ua->post( $full_url, \%args, Content_Type => 'form-data' );
+check_failure($r);
+
+my $content = $r->content;
+print STDERR $content ."\n" if $opts{'debug'};
+
+if ( $content !~ /^(ok|not ok)/ ) {
+
+    # It's not the server's fault if the mail is bogus. We just want to know that
+    # *something* came out of the server.
+    print STDERR <<EOF;
+RT server error.
+
+The RT server which handled your email did not behave as expected. It
+said:
+
+$content
+EOF
+
+    exit EX_TEMPFAIL;
+}
+
+exit;
+
+END {
+    unlink $message{'filename'} if $message{'filename'};
+}
+
+
+sub check_failure {
+    my $r = shift;
+    return if $r->is_success;
+
+    # This ordinarily oughtn't to be able to happen, suggests a bug in RT.
+    # So only load these heavy modules when they're needed.
+    require HTML::TreeBuilder;
+    require HTML::FormatText;
+
+    my $error = $r->error_as_HTML;
+    my $tree  = HTML::TreeBuilder->new->parse( $error );
+    $tree->eof;
+
+    # It'll be a cold day in hell before RT sends out bounces in HTML
+    my $formatter = HTML::FormatText->new(
+        leftmargin  => 0,
+        rightmargin => 50,
+    );
+    print STDERR $formatter->format( $tree );
+    print STDERR "\n$0: undefined server error\n" if $opts{'debug'};
+    exit EX_TEMPFAIL;
+}
+
+sub write_down_message {
+    use File::Temp qw(tempfile);
+
+    local $@;
+    my ($fh, $filename) = eval { tempfile() };
+    if ( !$fh || $@ ) {
+        print STDERR "$0: Couldn't create temp file, using memory\n";
+        print STDERR "error: $@\n" if $@;
+
+        my $message = \do { local (@ARGV, $/); <> };
+        unless ( $$message =~ /\S/ ) {
+            print STDERR "$0: no message passed on STDIN\n";
+            exit 0;
+        }
+        $$message = $opts{'headers'} . $$message if $opts{'headers'};
+        return ( content => $message );
+    }
+
+    binmode $fh;
+    binmode \*STDIN;
+    
+    print $fh $opts{'headers'} if $opts{'headers'};
+
+    my $buf; my $empty = 1;
+    while(1) {
+        my $status = read \*STDIN, $buf, BUFFER_SIZE;
+        unless ( defined $status ) {
+            print STDERR "$0: couldn't read message: $!\n";
+            exit EX_TEMPFAIL;
+        } elsif ( !$status ) {
+            last;
+        }
+        $empty = 0 if $buf =~ /\S/;
+        print $fh $buf;
+    };
+    close $fh;
+
+    if ( $empty ) {
+        print STDERR "$0: no message passed on STDIN\n";
+        exit 0;
+    }
+    print STDERR "$0: temp file is '$filename'\n" if $opts{'debug'};
+    return (filename => $filename);
+}
+
+
+=head1 SYNOPSIS
+
+    rt-mailgate --help : this text
+
+Usual invocation (from MTA):
+
+    rt-mailgate --action (correspond|comment|...) --queue queuename
+                --url http://your.rt.server/
+                [ --debug ]
+                [ --extension (queue|action|ticket) ]
+                [ --timeout seconds ]
+
+
+
+See C<man rt-mailgate> for more.
+
+=head1 OPTIONS
+
+=over 3
+
+=item C<--action>
+
+Specifies what happens to email sent to this alias.  The avaliable
+basic actions are: C<correspond>, C<comment>.
+
+
+If you've set the RT configuration variable B<< C<UnsafeEmailCommands> >>,
+C<take> and C<resolve> are also available.  You can execute two or more
+actions on a single message using a C<-> separated list.  RT will execute
+the actions in the listed order.  For example you can use C<take-comment>,
+C<correspond-resolve> or C<take-comment-resolve> as actions.
+
+Note that C<take> and C<resolve> actions ignore message text if used
+alone.  Include a  C<comment> or C<correspond> action if you want RT
+to record the incoming message.
+
+The default action is C<correspond>.
+
+=item C<--queue>
+
+This flag determines which queue this alias should create a ticket in if no ticket identifier
+is found.
+
+=item C<--url>
+
+This flag tells the mail gateway where it can find your RT server. You should 
+probably use the same URL that users use to log into RT.
+
+
+=item C<--extension> OPTIONAL
+
+Some MTAs will route mail sent to user-foo at host or user+foo at host to user at host
+and present "foo" in the environment variable $EXTENSION. By specifying
+the value "queue" for this parameter, the queue this message should be
+submitted to will be set to the value of $EXTENSION. By specifying
+"ticket", $EXTENSION will be interpreted as the id of the ticket this message
+is related to.  "action" will allow the user to specify either "comment" or
+"correspond" in the address extension.
+
+=item C<--debug> OPTIONAL
+
+Print debugging output to standard error
+
+
+=item C<--timeout> OPTIONAL
+
+Configure the timeout for posting the message to the web server.  The
+default timeout is 3 minutes (180 seconds).
+
+
+=head1 DESCRIPTION
+
+The RT mail gateway is the primary mechanism for communicating with RT
+via email. This program simply directs the email to the RT web server,
+which handles filing correspondence and sending out any required mail.
+It is designed to be run as part of the mail delivery process, either
+called directly by the MTA or C<procmail>, or in a F<.forward> or
+equivalent.
+
+=head1 SETUP
+
+Much of the set up of the mail gateway depends on your MTA and mail
+routing configuration. However, you will need first of all to create an
+RT user for the mail gateway and assign it a password; this helps to
+ensure that mail coming into the web server did originate from the
+gateway.
+
+Next, you need to route mail to C<rt-mailgate> for the queues you're
+monitoring. For instance, if you're using F</etc/aliases> and you have a
+"bugs" queue, you will want something like this:
+
+    bugs:         "|/opt/rt3/bin/rt-mailgate --queue bugs --action correspond
+              --url http://rt.mycorp.com/"
+
+    bugs-comment: "|/opt/rt3/bin/rt-mailgate --queue bugs --action comment
+              --url http://rt.mycorp.com/"
+
+Note that you don't have to run your RT server on your mail server, as
+the mail gateway will happily relay to a different machine.
+
+=head1 CUSTOMIZATION
+
+By default, the mail gateway will accept mail from anyone. However,
+there are situations in which you will want to authenticate users
+before allowing them to communicate with the system. You can do this
+via a plug-in mechanism in the RT configuration.
+
+You can set the array C<@MailPlugins> to be a list of plugins. The
+default plugin, if this is not given, is C<Auth::MailFrom> - that is,
+authentication of the person is done based on the C<From> header of the
+email. If you have additional filters or authentication mechanisms, you
+can list them here and they will be called in order:
+
+    Set( @MailPlugins =>
+        "Filter::SpamAssassin",
+        "Auth::LDAP",
+        # ...
+    );
+
+See the documentation for any additional plugins you have.
+
+You may also put Perl subroutines into the C<@MailPlugins> array, if
+they behave as described below.
+
+=head1 WRITING PLUGINS
+
+What's actually going on in the above is that C<@MailPlugins> is a
+list of Perl modules; RT prepends C<RT::Interface::Email::> to the name,
+to form a package name, and then C<use>'s this module. The module is
+expected to provide a C<GetCurrentUser> subroutine, which takes a hash of
+several parameters:
+
+=over 4
+
+=item Message
+
+A C<MIME::Entity> object representing the email
+
+=item CurrentUser
+
+An C<RT::CurrentUser> object
+
+=item AuthStat
+
+The authentication level returned from the previous plugin.
+
+=item Ticket [OPTIONAL]
+
+The ticket under discussion
+
+=item Queue [OPTIONAL]
+
+If we don't already have a ticket id, we need to know which queue we're talking about
+
+=item Action
+
+The action being performed. At the moment, it's one of "comment" or "correspond"
+
+=back 4
+
+It returns two values, the new C<RT::CurrentUser> object, and the new
+authentication level. The authentication level can be zero, not allowed
+to communicate with RT at all, (a "permission denied" error is mailed to
+the correspondent) or one, which is the normal mode of operation.
+Additionally, if C<-1> is returned, then the processing of the plug-ins
+stops immediately and the message is ignored.
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item EXTENSION
+
+Some MTAs will route mail sent to user-foo at host or user+foo at host to user at host
+and present "foo" in the environment variable C<EXTENSION>. Mailgate adds value
+of this variable to message in the C<X-RT-Mail-Extension> field of the message
+header.
+
+See also C<--extension> option. Note that value of the environment variable is
+always added to the message header when it's not empty even if C<--extension>
+option is not provided.
+
+=back 4
+
+=cut
+

Added: rt/branches/3.999-DANGEROUS/bin/standalone_httpd
==============================================================================
--- (empty file)
+++ rt/branches/3.999-DANGEROUS/bin/standalone_httpd	Mon Nov 26 14:12:00 2007
@@ -0,0 +1,67 @@
+#!/opt/local/bin/perl -w
+# BEGIN BPS TAGGED BLOCK {{{
+# 
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
+#                                          <jesse at bestpractical.com>
+# 
+# (Except where explicitly superseded by other copyright notices)
+# 
+# 
+# LICENSE:
+# 
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+# 
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/copyleft/gpl.html.
+# 
+# 
+# CONTRIBUTION SUBMISSION POLICY:
+# 
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+# 
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+# 
+# END BPS TAGGED BLOCK }}}
+use warnings;
+use strict;
+
+BEGIN {
+    use lib( "/home/jesse/svk/3.999-DANGEROUS/local/lib", "/home/jesse/svk/3.999-DANGEROUS/lib");
+    use RT;
+    RT::load_config();
+    if (RT->Config->Get('DevelMode')) { require Module::Refresh; }
+}
+
+RT::Init();
+
+my $port = shift @ARGV || RT->Config->Get('WebPort') || '8080';
+use RT::Interface::Web::Standalone;
+my $server = RT::Interface::Web::Standalone->new;
+$server->port($port);
+$server->run();
+
+

Added: rt/branches/3.999-DANGEROUS/bin/webmux.pl
==============================================================================
--- (empty file)
+++ rt/branches/3.999-DANGEROUS/bin/webmux.pl	Mon Nov 26 14:12:00 2007
@@ -0,0 +1,137 @@
+#!/opt/local/bin/perl
+# BEGIN BPS TAGGED BLOCK {{{
+# 
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
+#                                          <jesse at bestpractical.com>
+# 
+# (Except where explicitly superseded by other copyright notices)
+# 
+# 
+# LICENSE:
+# 
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+# 
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/copyleft/gpl.html.
+# 
+# 
+# CONTRIBUTION SUBMISSION POLICY:
+# 
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+# 
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+# 
+# END BPS TAGGED BLOCK }}}
+use strict;
+
+BEGIN {
+    $ENV{'PATH'}   = '/bin:/usr/bin';                     # or whatever you need
+    $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'};
+    $ENV{'SHELL'}  = '/bin/sh' if defined $ENV{'SHELL'};
+    $ENV{'ENV'}    = '' if defined $ENV{'ENV'};
+    $ENV{'IFS'}    = '' if defined $ENV{'IFS'};
+
+    use CGI qw(-private_tempfiles);    #bring this in before mason, to make sure we
+                                   #set private_tempfiles
+
+    die "RT does not support mod_perl 1.99. Please upgrade to mod_perl 2.0"
+      if $ENV{'MOD_PERL'}
+      and $ENV{'MOD_PERL'} =~ m{mod_perl/(?:1\.9)};
+
+}
+
+use lib ( "/home/jesse/svk/3.999-DANGEROUS/local/lib", "/home/jesse/svk/3.999-DANGEROUS/lib" );
+use RT;
+
+package RT::Mason;
+
+use vars qw($Nobody $system_user $Handler $r);
+
+#This drags in RT's config.pm
+BEGIN {
+    RT::load_config();
+    if (RT->Config->Get('DevelMode')) { require Module::Refresh; }
+}
+
+
+{
+
+    package HTML::Mason::Commands;
+    use vars qw(%session);
+}
+
+use RT::Interface::Web;
+use RT::Interface::Web::Handler;
+$Handler = RT::Interface::Web::Handler->new(RT->Config->Get('MasonParameters'));
+
+if ($ENV{'MOD_PERL'} && !RT->Config->Get('DevelMode')) {
+    # Under static_source, we need to purge the component cache
+    # each time we restart, so newer components may be reloaded.
+    #
+    # We can't do this in FastCGI or we'll blow away the component root _every_ time a new server starts
+    # which happens every few hits.
+    
+    use File::Path qw( rmtree );
+    use File::Glob qw( bsd_glob );
+    my @files = bsd_glob("$RT::MasonDataDir/obj/*");
+    rmtree([ @files ], 0, 1) if @files;
+}
+
+sub handler {
+    ($r) = @_;
+
+    local $SIG{__WARN__};
+    local $SIG{__DIE__};
+
+    if ($r->content_type =~ m/^httpd\b.*\bdirectory/i) {
+        use File::Spec::Unix;
+        # Our DirectoryIndex is always index.html, regardless of httpd settings
+        $r->filename( File::Spec::Unix->catfile( $r->filename, 'index.html' ) );
+    }
+#    elsif (defined( $r->content_type )) {
+        #$r->content_type !~ m!(^text/|\bxml\b)!i or return -1;
+#    }
+
+    Module::Refresh->refresh if RT->Config->Get('DevelMode');
+
+    RT::Init();
+
+    my %session;
+    my $status;
+    eval { $status = $Handler->handle_request($r) };
+    if ($@) {
+        $RT::Logger->crit($@);
+    }
+
+    undef(%session);
+
+    RT::Interface::Web::Handler->CleanupRequest();
+
+    return $status;
+}
+
+1;


More information about the Rt-commit mailing list