View | Details | Raw Unified | Return to bug 20393
Collapse All | Expand All

(-)a/misc/plack/README.plack (-42 lines)
Lines 1-42 Link Here
1
Bug 7844 - plack intranet tooling for developers
2
3
koha.psgi example and plackup.sh script to run any Koha site
4
intranet or opac interface under plack with optional multi-process
5
Starman server
6
7
  plackup.sh site-name [intranet]
8
9
site-name is used to find config /etc/koha/sites/site-name/koha-conf.xml
10
11
All configuration is specified in koha.psgi, which you are welcomed to edit
12
and tune according to your development needs (enable memcache, enable/disable
13
debugging modules for plack and so on).
14
15
For deployment of opac or intranet you would probably want to take a look
16
in plackup.sh and enable starman as web server (which is pre-forking server
17
written in perl) and put some web server in front of it to serve static web
18
files (e.g. ngnix, apache)
19
20
When you are happy with it, rename koha.psgi and plackup.sh it to site name
21
and save it for safe-keeping.
22
23
This commit message is included in patch as README.plack because it includes
24
useful information for people using plack for first time.
25
26
Test scenario:
27
1. install plack and dependencies, as documented at
28
   http://wiki.koha-community.org/wiki/Plack
29
30
2. start ./plackup.sh sitename i[ntranet]
31
32
3. open intranet page http://localhost:5001/ and verify that it redirects
33
   to http://localhost:5001/cgi-bin/koha/mainpage.pl
34
35
4. start ./plackup.sh sitename
36
37
5. open OPAC http://localhost:5000/ and verify that it redirects to
38
   http://localhost:5000/cgi-bin/koha/opac-main.pl
39
40
6. next step is to take a look into koha.psgi and enable additional
41
   debug modules, save file and reload page (plackup will reload
42
   code automatically)
(-)a/misc/plack/koha.psgi (-113 lines)
Lines 1-113 Link Here
1
#!/usr/bin/perl
2
use Plack::Builder;
3
use Plack::App::CGIBin;
4
use lib qw( ./lib );
5
use Plack::Middleware::Debug;
6
use Plack::App::Directory;
7
8
#BZ 16357, add timestamps to warnings
9
use Log::Log4perl qw(:easy);
10
Log::Log4perl->easy_init({ level => $WARN, utf8 => 1 });
11
my $logger = Log::Log4perl->get_logger(); # use the default logger style
12
$SIG{__WARN__} = sub {
13
    my $message = shift;
14
    $logger->warn($message);
15
};
16
17
use CGI qw(-utf8 ); # we will lose -utf8 under plack
18
{
19
    no warnings 'redefine';
20
    my $old_new = \&CGI::new;
21
    *CGI::new = sub {
22
        my $q = $old_new->( @_ );
23
        $CGI::PARAM_UTF8 = 1;
24
        Koha::Caches->flush_L1_caches();
25
        Koha::Cache::Memory::Lite->flush();
26
        return $q;
27
    };
28
}
29
30
BEGIN {
31
32
# override configuration from startup script below:
33
# (requires --reload option)
34
35
$ENV{PLACK_DEBUG} = 1; # toggle debugging
36
37
# memcache change requires restart
38
$ENV{MEMCACHED_SERVERS} = "localhost:11211";
39
#$ENV{MEMCACHED_DEBUG} = 0;
40
41
$ENV{PROFILE_PER_PAGE} = 1; # reset persistent and profile counters after each page, like CGI
42
#$ENV{INTRANET} = 1; # usually passed from script
43
44
#$ENV{DBI_AUTOPROXY}='dbi:Gofer:transport=null;cache=DBI::Util::CacheMemory'
45
46
} # BEGIN
47
48
use C4::Context;
49
use C4::Languages;
50
use C4::Members;
51
use C4::Boolean;
52
use C4::Letters;
53
use C4::Koha;
54
use C4::XSLT;
55
use Koha::DateUtils;
56
use Koha::Caches;
57
use Koha::Cache::Memory::Lite;
58
use Koha::Patron::Categories;
59
60
=for preload
61
use C4::Tags; # FIXME
62
=cut
63
64
use Devel::Size 0.77; # 0.71 doesn't work for Koha
65
my $watch_capture_regex = '(C4|Koha)';
66
67
sub watch_for_size {
68
	my @watch =
69
	map { s/^.*$watch_capture_regex/$1/; s/\//::/g; s/\.pm$//; $_ } # fix paths
70
	grep { /$watch_capture_regex/ }
71
	keys %INC
72
	;
73
	warn "# watch_for_size ",join(' ',@watch);
74
	return @watch;
75
};
76
77
my $CGI_ROOT = $ENV{INTRANET} ? $ENV{INTRANETDIR} : $ENV{OPACDIR};
78
warn "# using Koha ", $ENV{INTRANET} ? 'intranet' : 'OPAC', " CGI from $CGI_ROOT\n";
79
my $app=Plack::App::CGIBin->new(root => $CGI_ROOT)->to_app;
80
my $home = sub {
81
	return [ 302, [ Location => '/cgi-bin/koha/' . ( $ENV{INTRANET} ? 'mainpage.pl' : 'opac-main.pl' ) ] ];
82
};
83
84
builder {
85
86
	# please don't use plugins which are under enable_if $ENV{PLACK_DEBUG} in production!
87
	# they are known to leek memory
88
	enable_if { $ENV{PLACK_DEBUG} } 'Debug',  panels => [
89
		qw(Environment Response Timer Memory),
90
		# optional plugins (uncomment to enable) are sorted according to performance implact
91
#		[ 'Devel::Size', for => \&watch_for_size ], # https://github.com/dpavlin/p5-plack-devel-debug-devel-size
92
#		[ 'DBIProfile', profile => 2 ],
93
#		[ 'DBITrace', level => 1 ], # a LOT of fine-graded SQL trace
94
#		[ 'Profiler::NYTProf', exclude => [qw(.*\.css .*\.png .*\.ico .*\.js .*\.gif)] ],
95
	];
96
97
	# don't enable this plugin in production, since stack traces reveal too much information
98
	# about system to potential attackers!
99
	enable_if { $ENV{PLACK_DEBUG} } 'StackTrace';
100
101
	# this enables plackup or starman to serve static files and provide working plack
102
	# setup without need for front-end web server to serve static files
103
	enable_if { $ENV{INTRANETDIR} } "Plack::Middleware::Static",
104
		path => qr{^/(intranet|opac)-tmpl/},
105
		root => "$ENV{INTRANETDIR}/koha-tmpl/";
106
107
    # + is required so Plack doesn't try to prefix Plack::Middleware::
108
    enable "+Koha::Middleware::SetEnv";
109
110
	mount "/cgi-bin/koha" => $app;
111
	mount "/" => $home;
112
113
};
(-)a/misc/plack/plackup.sh (-55 lines)
Lines 1-54 Link Here
1
#!/bin/sh -e
2
3
# This is plack startup script for Koha
4
5
# ./plackup.sh [site] [intranet]
6
7
site=$1
8
test ! -z "$site" && shift || ( echo "usage: $0 [site] [i[tranet]]" ; exit 1 )
9
10
# extract useful paths from koha-conf.xml
11
export KOHA_CONF=/etc/koha/sites/$site/koha-conf.xml
12
export LOGDIR="$( sudo -u $site-koha xmlstarlet sel -t -v 'yazgfs/config/logdir' $KOHA_CONF )"
13
export INTRANETDIR="$( sudo -u $site-koha xmlstarlet sel -t -v 'yazgfs/config/intranetdir' $KOHA_CONF )"
14
export OPACDIR="$( sudo -u $site-koha xmlstarlet sel -t -v 'yazgfs/config/opacdir' $KOHA_CONF | sed 's,/cgi-bin/opac,,' )"
15
16
dir=`dirname $0`
17
18
# enable memcache - it's safe even on installation which don't have it
19
# since Koha has check on C4::Context
20
#export MEMCACHED_SERVERS=localhost:11211
21
# pass site name as namespace to perl code
22
export MEMCACHED_NAMESPACE=$site
23
#export MEMCACHED_DEBUG=1
24
25
if [ ! -e "$INTRANETDIR/C4" ] ; then
26
	echo "intranetdir in $KOHA_CONF doesn't point to Koha git checkout"
27
	exit 1
28
fi
29
30
if [ -z "$1" ] ; then # type anything after site name for intranet!
31
	INTRANET=0
32
	PORT=5000
33
else
34
	INTRANET=1
35
	PORT=5001
36
	shift # pass rest of arguments to plackup
37
fi
38
export INTRANET # pass to plack
39
40
# uncomment to enable logging
41
#opt="$opt --access-log $LOGDIR/opac-access.log --error-log $LOGDIR/opac-error.log"
42
43
# --max-requests 50 decreased from 1000 to keep memory usage sane
44
# --workers 4       number of cores on machine
45
#test "$INTRANET" != 1 && \ # don't use Starman for intranet
46
opt="$opt --server Starman -M FindBin --max-requests 50 --workers 4"
47
48
# -E deployment     turn off access log on STDOUT
49
opt="$opt -E deployment"
50
51
# comment out reload in production!
52
opt="$opt --reload -R $INTRANETDIR/C4 -R $INTRANETDIR/Koha"
53
54
sudo -E -u $site-koha plackup --port $PORT -I $INTRANETDIR -I $INTRANETDIR/installer $opt $* $dir/koha.psgi
55
- 

Return to bug 20393