From cd9afc78b9d62277a6ad6533b72cf11d240c2da3 Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Fri, 16 Apr 2010 08:37:12 -0500 Subject: [PATCH] fix some WebGUI::Paths stuff, multi-site plackup --- app.psgi | 79 ++++++++------------------------ lib/WebGUI.pm | 12 +---- lib/WebGUI/Middleware/Session.pm | 4 +- lib/WebGUI/Paths.pm | 7 +-- var/site.psgi | 34 ++++++++++++++ 5 files changed, 60 insertions(+), 76 deletions(-) create mode 100644 var/site.psgi diff --git a/app.psgi b/app.psgi index dc644af78..b18377b1b 100644 --- a/app.psgi +++ b/app.psgi @@ -1,66 +1,25 @@ use strict; use Plack::Builder; -use lib '/data/WebGUI/lib'; -use WebGUI; +use WebGUI::Paths -inc; +use WebGUI::Config; +use File::Spec; -my $root = '/data/WebGUI'; +my $standard_psgi = File::Spec->catfile(WebGUI::Paths->var, 'site.psgi'); builder { - mount "http://dev.localhost.localdomain/" => builder { - - my $wg = WebGUI->new( root => $root, site => 'dev.localhost.localdomain.conf' ); - my $config = $wg->config; - enable 'Log4perl', category => 'mysite', conf => "$root/etc/log.conf"; - - # Reproduce URL handler functionality with middleware - enable '+WebGUI::Middleware::Snoop'; - enable 'Static', root => $root, path => sub {s{^/\*give-credit-where-credit-is-due\*$}{docs/credits.txt}}; - enable 'Status', path => qr{^/uploads/dictionaries}, status => 401; - - # For PassThru, use Plack::Builder::mount - - # Extras fallback (you should be using something else to serve static files in production) - my ( $extrasURL, $extrasPath ) = ( $config->get('extrasURL'), $config->get('extrasPath') ); - enable 'Static', root => "$extrasPath/", path => sub {s{^$extrasURL/}{}}; - - # Open/close the WebGUI::Session at the outer-most onion layer - enable '+WebGUI::Middleware::Session', - config => $config, - error_docs => { 500 => "$root/www/maintenance.html" }; - - # This one uses the Session object, so it comes after WebGUI::Middleware::Session - enable '+WebGUI::Middleware::WGAccess', config => $config; - - # Return the app - $wg->psgi_app; - }; - - mount "http://dev2.localhost.localdomain/" => builder { - - my $wg = WebGUI->new( root => $root, site => 'dev2.localhost.localdomain.conf' ); - my $config = $wg->config; - enable 'Log4perl', category => 'mysite', conf => "$root/etc/log.conf"; - - # Reproduce URL handler functionality with middleware - enable '+WebGUI::Middleware::Snoop'; - enable 'Static', root => $root, path => sub {s{^/\*give-credit-where-credit-is-due\*$}{docs/credits.txt}}; - enable 'Status', path => qr{^/uploads/dictionaries}, status => 401; - - # For PassThru, use Plack::Builder::mount - - # Extras fallback (you should be using something else to serve static files in production) - my ( $extrasURL, $extrasPath ) = ( $config->get('extrasURL'), $config->get('extrasPath') ); - enable 'Static', root => "$extrasPath/", path => sub {s{^$extrasURL/}{}}; - - # Open/close the WebGUI::Session at the outer-most onion layer - enable '+WebGUI::Middleware::Session', - config => $config, - error_docs => { 500 => "$root/www/maintenance.html" }; - - # This one uses the Session object, so it comes after WebGUI::Middleware::Session - enable '+WebGUI::Middleware::WGAccess', config => $config; - - # Return the app - $wg->psgi_app; - }; + my $first_app; + for my $config_file (WebGUI::Paths->siteConfigs) { + my $config = WebGUI::Config->new($config_file); + my $psgi = $config->get('psgiFile') || $standard_psgi; + my $app = do { + $ENV{WEBGUI_CONFIG} = $config_file; + Plack::Util::load_psgi($psgi); + }; + $first_app ||= $app; + for my $sitename ( @{ $config->get('sitename') } ) { + mount "http://$sitename/" => $app; + } + } + mount '/' => $first_app; }; + diff --git a/lib/WebGUI.pm b/lib/WebGUI.pm index 742f342f9..88ead5ff6 100644 --- a/lib/WebGUI.pm +++ b/lib/WebGUI.pm @@ -48,7 +48,6 @@ These subroutines are available from this package: =cut -has root => ( is => 'ro', isa => 'Str', default => '/data/WebGUI' ); has site => ( is => 'ro', isa => 'Str', default => 'dev.localhost.localdomain.conf' ); has config => ( is => 'rw', isa => 'WebGUI::Config' ); @@ -75,7 +74,7 @@ sub BUILD { $self->config($config); } -sub psgi_app { +sub to_app { my $self = shift; return $self->{psgi_app} ||= $self->compile_psgi_app; } @@ -83,10 +82,6 @@ sub psgi_app { sub compile_psgi_app { my $self = shift; - # Preload all modules in the master (parent) thread before the Server does any - # child forking. This should save a lot of memory in copy-on-write friendly environments. - $self->preload; - # WebGUI is a PSGI app is a Perl code reference. Let's create one. # Each web request results in a call to this sub return sub { @@ -143,11 +138,6 @@ sub compile_psgi_app { }; } - -sub preload { - WebGUI::Paths->preloadAll; -} - sub handle { my ( $session ) = @_; diff --git a/lib/WebGUI/Middleware/Session.pm b/lib/WebGUI/Middleware/Session.pm index 76444a5e5..15fbecd25 100644 --- a/lib/WebGUI/Middleware/Session.pm +++ b/lib/WebGUI/Middleware/Session.pm @@ -37,7 +37,7 @@ sub call { my $app = $self->app; weaken $self->{config}; - + my $config = $self->config or die 'Mandatory config parameter missing'; # Logger fallback @@ -46,7 +46,7 @@ sub call { } my $session = try { - $env->{'webgui.session'} = WebGUI::Session->open( $config->getWebguiRoot, $config, $env ); + $env->{'webgui.session'} = WebGUI::Session->open( $config, $env ); } catch { # We don't have a logger object, so for now just warn() the error warn "Unable to instantiate WebGUI::Session - $_"; diff --git a/lib/WebGUI/Paths.pm b/lib/WebGUI/Paths.pm index eeac57101..ef2dfc446 100644 --- a/lib/WebGUI/Paths.pm +++ b/lib/WebGUI/Paths.pm @@ -201,7 +201,7 @@ Returns the list of modules to exclude from preloading as an array. sub preloadExclude { my $class = shift; - my @excludes = _readTextLines($class->preloadExclude); + my @excludes = _readTextLines($class->preloadExclusions); return @excludes; } @@ -217,8 +217,9 @@ sub preloadAll { require WebGUI::Pluggable; + my @exclusions = $class->preloadExclude; WebGUI::Pluggable::findAndLoad( 'WebGUI', { - exclude => \( $class->preloadExclude ), + exclude => \@exclusions, onLoadFail => sub { warn sprintf "Error loading %s: %s\n", @_ }, }); } @@ -226,7 +227,7 @@ sub preloadAll { sub _readTextLines { my $file = shift; my @lines; - open my $fh, '<', $file or croak "Cannot open $file: $!"; + open my $fh, '<', $file or return; while (my $line = <$fh>) { $line =~ s/#.*//; $line =~ s/^\s+//; diff --git a/var/site.psgi b/var/site.psgi new file mode 100644 index 000000000..b899357a5 --- /dev/null +++ b/var/site.psgi @@ -0,0 +1,34 @@ +use strict; +use Plack::Builder; +use WebGUI; +use WebGUI::Paths; + +my $config = $ENV{WEBGUI_CONFIG}; +builder { + my $wg = WebGUI->new( site => $ENV{WEBGUI_CONFIG} ); + my $config = $wg->config; + + enable 'Log4perl', category => $config->getFilename, conf => WebGUI::Paths->logConfig; + + # Reproduce URL handler functionality with middleware + enable '+WebGUI::Middleware::Snoop'; + enable 'Status', path => qr{^/uploads/dictionaries}, status => 401; + + # For PassThru, use Plack::Builder::mount + + # Extras fallback (you should be using something else to serve static files in production) + my ( $extrasURL, $extrasPath ) = ( $config->get('extrasURL'), $config->get('extrasPath') ); + enable 'Static', root => "$extrasPath/", path => sub {s{^$extrasURL/}{}}; + + # Open/close the WebGUI::Session at the outer-most onion layer + enable '+WebGUI::Middleware::Session', + config => $config, + error_docs => { 500 => $config->get('maintenancePage') }; + + # This one uses the Session object, so it comes after WebGUI::Middleware::Session + enable '+WebGUI::Middleware::WGAccess', config => $config; + + # Return the app + $wg->to_app; +}; +