X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=htetc%2Fhandler.pl;h=2fe5d376e5aa809386bab34302a7ab4c20290e69;hp=145529a0651e3f2559d322ffa3e579b32bb636c5;hb=681a340f6be4184b1472a8e1fa9cd5d074f6f325;hpb=31157731e271ad7c672ec09e756a73304f646b62 diff --git a/htetc/handler.pl b/htetc/handler.pl index 145529a06..2fe5d376e 100644 --- a/htetc/handler.pl +++ b/htetc/handler.pl @@ -1,13 +1,40 @@ #!/usr/bin/perl -# -# This is a basic, fairly fuctional Mason handler.pl. -# -# For something a little more involved, check out session_handler.pl package HTML::Mason; -# Bring in main Mason package. -use HTML::Mason; +use strict; +use warnings; +use FS::Mason qw( mason_interps ); +use FS::Trace; +use FS::access_user_log; +use FS::Conf; + +$FS::Conf::conf_cache_enabled = 1; # enable FS::Conf caching for performance + +# Preload to share in mod_perl parent for performance +use FS::UID qw(load_schema); +load_schema(); +use FS::Record qw(fk_methods_init); +fk_methods_init; + +if ( %%%RT_ENABLED%%% ) { + + require RT; + + $> = scalar(getpwnam('freeside')); + + RT::LoadConfig(); + RT::Init(); + + # disconnect DB before fork: + # (avoid 'prepared statement "dbdpg_p\d+_\d+" already exists' errors?) + $RT::Handle->dbh(undef); + undef $RT::Handle; + + $> = $<; +} + +#use vars qw($r); # Bring in ApacheHandler, necessary for mod_perl integration. # Uncomment the second line (and comment the first) to use @@ -15,35 +42,50 @@ use HTML::Mason; use HTML::Mason::ApacheHandler; # use HTML::Mason::ApacheHandler (args_method=>'mod_perl'); -# Uncomment the next line if you plan to use the Mason previewer. -#use HTML::Mason::Preview; +###use Module::Refresh;### -use strict; +# Create Mason objects -# List of modules that you want to use from components (see Admin -# manual for details) -#{ package HTML::Mason::Commands; -# use CGI; -#} +my( $fs_interp, $rt_interp ) = mason_interps('apache'); -# Create Mason objects -# -my $parser = new HTML::Mason::Parser; -my $interp = new HTML::Mason::Interp (parser=>$parser, - comp_root=>'/var/www/masondocs', - data_dir=>'/home/ivan/freeside_current/masondata', - out_mode=>'stream', - ); -my $ah = new HTML::Mason::ApacheHandler (interp=>$interp); +my $ah = new HTML::Mason::ApacheHandler ( + interp => $fs_interp, + request_class => 'FS::Mason::Request', + args_method => 'CGI', #(and FS too) +); # Activate the following if running httpd as root (the normal case). # Resets ownership of all files created by Mason at startup. # -chown (Apache->server->uid, Apache->server->gid, $interp->files_written); +#chown (Apache->server->uid, Apache->server->gid, $interp->files_written); + +my $protect_fds; sub handler { - my ($r) = @_; + #($r) = @_; + my $r = shift; + + my $start_time = time; + + FS::Trace->log('protecting fds'); + + #from rt/bin/webmux.pl(.in) + if ( !$protect_fds && $ENV{'MOD_PERL'} && exists $ENV{'MOD_PERL_API_VERSION'} + && $ENV{'MOD_PERL_API_VERSION'} >= 2 + ) { + # under mod_perl2, STDIN and STDOUT get closed and re-opened, + # however they are not on FD 0 and 1. In this case, the next + # socket that gets opened will occupy one of these FDs, and make + # all system() and open "|-" calls dangerous; for example, the + # DBI handle can get this FD, which later system() calls will + # close by putting garbage into the socket. + $protect_fds = []; + push @{$protect_fds}, IO::Handle->new_from_fd(0, "r") + if fileno(STDIN) != 0; + push @{$protect_fds}, IO::Handle->new_from_fd(1, "w") + if fileno(STDOUT) != 1; + } # If you plan to intermix images in the same directory as # components, activate the following to prevent Mason from @@ -51,28 +93,98 @@ sub handler # #return -1 if $r->content_type && $r->content_type !~ m|^text/|i; - #rar - { package HTML::Mason::Commands; - use strict; - use vars qw( $cgi $p ); - use CGI; - #use CGI::Carp qw(fatalsToBrowser); - use FS::UID qw(cgisuidsetup); - use FS::Record qw(qsearch qsearchs fields); - use FS::part_svc; - use FS::CGI qw(header menubar popurl table); - - $cgi = new CGI; - #&cgisuidsetup($cgi); - &cgisuidsetup($r); - $p = popurl(2); - } - $r->content_type('text/html'); + ###Module::Refresh->refresh;### + + FS::Trace->log('setting content_type / headers'); + + $r->content_type('text/html; charset=utf-8'); + #$r->content_type('text/html; charset=iso-8859-1'); #eorar - - my $status = $ah->handle_request($r); - - return $status; + + my $headers = $r->headers_out; + $headers->{'Cache-control'} = 'no-cache'; + #$r->no_cache(1); + $headers->{'Expires'} = '0'; + +# $r->send_http_header; + + if ( $r->filename =~ /\/rt\// ) { #RT + + FS::Trace->log('handling RT file'); + + # We don't need to handle non-text, non-xml items + return -1 if defined( $r->content_type ) + && $r->content_type !~ m!(^text/|\bxml\b)!io; + + local $SIG{__WARN__}; + local $SIG{__DIE__}; + + FS::Trace->log('initializing RT'); + my_rt_init(); + + FS::Trace->log('setting RT interpreter'); + $ah->interp($rt_interp); + + } else { + + FS::Trace->log('handling Freeside file'); + + local $SIG{__WARN__}; + local $SIG{__DIE__}; + + FS::Trace->log('initializing RT'); + my_rt_init(); + + #we don't want the RT error handlers under FS + { + no warnings 'uninitialized'; + undef($SIG{__WARN__}) if defined($SIG{__WARN__}); + undef($SIG{__DIE__}) if defined($SIG{__DIE__} ); + } + + FS::Trace->log('setting Freeside interpreter'); + $ah->interp($fs_interp); + + } + + FS::Trace->log('handling request'); + my %session; + my $status; + eval { $status = $ah->handle_request($r); }; +#!! +# if ( $@ ) { +# $RT::Logger->crit($@); +# } + warn $@ if $@; + + undef %session; + +#!! +# if ($RT::Handle->TransactionDepth) { +# $RT::Handle->ForceRollback; +# $RT::Logger->crit( +#"Transaction not committed. Usually indicates a software fault. Data loss may have occurred" +# ); +# } + + FS::access_user_log->insert_new_path( $r->filename, time-$start_time ); + + FS::Trace->log('done'); + + FS::Trace->dumpfile( "%%%FREESIDE_EXPORT%%%/profile/$$.".time, + FS::Trace->total. ' '. $r->filename + ) + if FS::Trace->total > 5; #10? + + FS::Trace->reset; + + $status; +} + +sub my_rt_init { + return unless $RT::VERSION; + RT::ConnectToDatabase(); + RT::InitSignalHandlers(); } 1;