@@ -, +, @@ plackup.sh site-name [intranet] http://wiki.koha-community.org/wiki/Plack to http://localhost:5001/cgi-bin/koha/mainpage.pl http://localhost:5000/cgi-bin/koha/opac-main.pl debug modules, save file and reload page (plackup will reload code automatically) --- misc/plack/README.plack | 42 +++++++++++++++++++++++ misc/plack/koha.psgi | 86 +++++++++++++++++++++++++++++++++++++++++++++++ misc/plack/plackup.sh | 54 +++++++++++++++++++++++++++++ 3 files changed, 182 insertions(+) create mode 100644 misc/plack/README.plack create mode 100644 misc/plack/koha.psgi create mode 100755 misc/plack/plackup.sh --- a/misc/plack/README.plack +++ a/misc/plack/README.plack @@ -0,0 +1,42 @@ +Bug 7844 - plack intranet tooling for developers + +koha.psgi example and plackup.sh script to run any Koha site +intranet or opac interface under plack with optional multi-process +Starman server + + plackup.sh site-name [intranet] + +site-name is used to find config /etc/koha/sites/site-name/koha-conf.xml + +All configuration is specified in koha.psgi, which you are welcomed to edit +and tune according to your development needs (enable memcache, enable/disable +debugging modules for plack and so on). + +For deployment of opac or intranet you would probably want to take a look +in plackup.sh and enable starman as web server (which is pre-forking server +written in perl) and put some web server in front of it to serve static web +files (e.g. ngnix, apache) + +When you are happy with it, rename koha.psgi and plackup.sh it to site name +and save it for safe-keeping. + +This commit message is included in patch as README.plack because it includes +useful information for people using plack for first time. + +Test scenario: +1. install plack and dependencies, as documented at + http://wiki.koha-community.org/wiki/Plack + +2. start ./plackup.sh sitename i[ntranet] + +3. open intranet page http://localhost:5001/ and verify that it redirects + to http://localhost:5001/cgi-bin/koha/mainpage.pl + +4. start ./plackup.sh sitename + +5. open OPAC http://localhost:5000/ and verify that it redirects to + http://localhost:5000/cgi-bin/koha/opac-main.pl + +6. next step is to take a look into koha.psgi and enable additional + debug modules, save file and reload page (plackup will reload + code automatically) --- a/misc/plack/koha.psgi +++ a/misc/plack/koha.psgi @@ -0,0 +1,86 @@ +#!/usr/bin/perl +use Plack::Builder; +use Plack::App::CGIBin; +use lib qw( ./lib ); +use Plack::Middleware::Debug; +use Plack::App::Directory; + +BEGIN { + +# override configuration from startup script below: +# (requires --reload option) + +$ENV{PLACK_DEBUG} = 1; # toggle debugging + +# memcache change requires restart +$ENV{MEMCACHED_SERVERS} = "localhost:11211"; +#$ENV{MEMCACHED_DEBUG} = 0; + +$ENV{PROFILE_PER_PAGE} = 1; # reset persistant and profile counters after each page, like CGI +#$ENV{INTRANET} = 1; # usually passed from script + +#$ENV{DBI_AUTOPROXY}='dbi:Gofer:transport=null;cache=DBI::Util::CacheMemory' + +} # BEGIN + +use C4::Context; +use C4::Languages; +use C4::Members; +use C4::Dates; +use C4::Boolean; +use C4::Letters; +use C4::Koha; +use C4::XSLT; +use C4::Branch; +use C4::Category; +=for preload +use C4::Tags; # FIXME +=cut + +use Devel::Size 0.77; # 0.71 doesn't work for Koha +my $watch_capture_regex = '(C4|Koha)'; + +sub watch_for_size { + my @watch = + map { s/^.*$watch_capture_regex/$1/; s/\//::/g; s/\.pm$//; $_ } # fix paths + grep { /$watch_capture_regex/ } + keys %INC + ; + warn "# watch_for_size ",join(' ',@watch); + return @watch; +}; + +my $CGI_ROOT = $ENV{INTRANET} ? $ENV{INTRANETDIR} : $ENV{OPACDIR}; +warn "# using Koha ", $ENV{INTRANET} ? 'intranet' : 'OPAC', " CGI from $CGI_ROOT\n"; +my $app=Plack::App::CGIBin->new(root => $CGI_ROOT); +my $home = sub { + return [ 302, [ Location => '/cgi-bin/koha/' . ( $ENV{INTRANET} ? 'mainpage.pl' : 'opac-main.pl' ) ] ]; +}; + +builder { + + # please don't use plugins which are under enable_if $ENV{PLACK_DEBUG} in production! + # they are known to leek memory + enable_if { $ENV{PLACK_DEBUG} } 'Debug', panels => [ + qw(Environment Response Timer Memory), + # optional plugins (uncomment to enable) are sorted according to performance implact +# [ 'Devel::Size', for => \&watch_for_size ], # https://github.com/dpavlin/p5-plack-devel-debug-devel-size +# [ 'DBIProfile', profile => 2 ], +# [ 'DBITrace', level => 1 ], # a LOT of fine-graded SQL trace +# [ 'Profiler::NYTProf', exclude => [qw(.*\.css .*\.png .*\.ico .*\.js .*\.gif)] ], + ]; + + # don't enable this plugin in production, since stack traces reveal too much information + # about system to potential attackers! + enable_if { $ENV{PLACK_DEBUG} } 'StackTrace'; + + # this enables plackup or starman to serve static files and provide working plack + # setup without need for front-end web server to serve static files + enable_if { $ENV{INTRANETDIR} } "Plack::Middleware::Static", + path => qr{^/(intranet|opac)-tmpl/}, + root => "$ENV{INTRANETDIR}/koha-tmpl/"; + + mount "/cgi-bin/koha" => $app; + mount "/" => $home; + +}; --- a/misc/plack/plackup.sh +++ a/misc/plack/plackup.sh @@ -0,0 +1,54 @@ +#!/bin/sh -e + +# This is plack startup script for Koha + +# ./plackup.sh [site] [intranet] + +site=$1 +test ! -z "$site" && shift || ( echo "usage: $0 [site] [i[tranet]]" ; exit 1 ) + +# extract useful paths from koha-conf.xml +export KOHA_CONF=/etc/koha/sites/$site/koha-conf.xml +export LOGDIR="$( sudo -u $site-koha xmlstarlet sel -t -v 'yazgfs/config/logdir' $KOHA_CONF )" +export INTRANETDIR="$( sudo -u $site-koha xmlstarlet sel -t -v 'yazgfs/config/intranetdir' $KOHA_CONF )" +export OPACDIR="$( sudo -u $site-koha xmlstarlet sel -t -v 'yazgfs/config/opacdir' $KOHA_CONF | sed 's,/cgi-bin/opac,,' )" + +dir=`dirname $0` + +# enable memcache - it's safe even on installation which don't have it +# since Koha has check on C4::Context +#export MEMCACHED_SERVERS=localhost:11211 +# pass site name as namespace to perl code +export MEMCACHED_NAMESPACE=$site +#export MEMCACHED_DEBUG=1 + +if [ ! -e "$INTRANETDIR/C4" ] ; then + echo "intranetdir in $KOHA_CONF doesn't point to Koha git checkout" + exit 1 +fi + +if [ -z "$1" ] ; then # type anything after site name for intranet! + INTRANET=0 + PORT=5000 +else + INTRANET=1 + PORT=5001 + shift # pass rest of arguments to plackup +fi +export INTRANET # pass to plack + +# uncomment to enable logging +#opt="$opt --access-log $LOGDIR/opac-access.log --error-log $LOGDIR/opac-error.log" + +# --max-requests 50 decreased from 1000 to keep memory usage sane +# --workers 4 number of cores on machine +#test "$INTRANET" != 1 && \ # don't use Starman for intranet +opt="$opt --server Starman -M FindBin --max-requests 50 --workers 4" + +# -E deployment turn off access log on STDOUT +opt="$opt -E deployment" + +# comment out reload in production! +opt="$opt --reload -R $INTRANETDIR/C4 -R $INTRANETDIR/Koha" + +sudo -E -u $site-koha plackup --port $PORT -I $INTRANETDIR -I $INTRANETDIR/installer $opt $* $dir/koha.psgi --