--- /dev/null
+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)
--- /dev/null
+#!/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;
+
+};
--- /dev/null
+#!/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