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

(-)a/C4/Installer/PerlDependencies.pm (-10 lines)
Lines 284-294 our $PERL_DEPS = { Link Here
284
        'required' => '1',
284
        'required' => '1',
285
        'min_ver'  => '3.15'
285
        'min_ver'  => '3.15'
286
    },
286
    },
287
    'Starman' => {
288
	'usage' => 'preforking PSGI/PLACK web server',
289
	'required' => '0',
290
	'min_ver' => '0.300'
291
     },
292
    'CGI::Emulate::PSGI' => {
287
    'CGI::Emulate::PSGI' => {
293
	'usage' => 'PLACK',
288
	'usage' => 'PLACK',
294
	'required' => '0',
289
	'required' => '0',
Lines 299-309 our $PERL_DEPS = { Link Here
299
	'required' => '0',
294
	'required' => '0',
300
	'min_ver' => '0.15'
295
	'min_ver' => '0.15'
301
    },
296
    },
302
    'Plack::Middleware::Debug' => {
303
	'usage' => 'PLACK Debugging',
304
	'required' => '0',
305
	'min_ver' => '0.1'
306
    },
307
    'Class::Factory::Util' => {
297
    'Class::Factory::Util' => {
308
        'usage'    => 'Core',
298
        'usage'    => 'Core',
309
        'required' => '1',
299
        'required' => '1',
(-)a/Makefile.PL (-1 / +14 lines)
Lines 196-201 Directory for Zebra's data files. Link Here
196
196
197
Directory for Zebra's UNIX-domain sockets.
197
Directory for Zebra's UNIX-domain sockets.
198
198
199
=item PLACK_LOCK_DIR
200
201
Directory for Plack's lock files.
202
203
=item PLACK_RUN_DIR
204
205
Directory for Plack's UNIX-domain sockets.
206
199
=item MISC_DIR
207
=item MISC_DIR
200
208
201
Directory for for miscellaenous scripts, among other
209
Directory for for miscellaenous scripts, among other
Lines 298-304 my $target_map = { Link Here
298
  './skel'                      => 'NONE',
306
  './skel'                      => 'NONE',
299
  './skel/var/log/koha'         => { target => 'LOG_DIR', trimdir => -1 },
307
  './skel/var/log/koha'         => { target => 'LOG_DIR', trimdir => -1 },
300
  './skel/var/spool/koha'       => { target => 'BACKUP_DIR', trimdir => -1 },
308
  './skel/var/spool/koha'       => { target => 'BACKUP_DIR', trimdir => -1 },
301
  './skel/var/run/koha/plack' => { target => 'PLACK_RUN_DIR', trimdir => -1 },
309
  './skel/var/run/koha/plack'   => { target => 'PLACK_RUN_DIR', trimdir => -1 },
310
  './skel/var/lock/koha/plack'  => { target => 'PLACK_LOCK_DIR', trimdir => 6 },
302
  './skel/var/run/koha/zebradb' => { target => 'ZEBRA_RUN_DIR', trimdir => -1 },
311
  './skel/var/run/koha/zebradb' => { target => 'ZEBRA_RUN_DIR', trimdir => -1 },
303
  './skel/var/lock/koha/zebradb/authorities' => { target => 'ZEBRA_LOCK_DIR', trimdir => 6 },
312
  './skel/var/lock/koha/zebradb/authorities' => { target => 'ZEBRA_LOCK_DIR', trimdir => 6 },
304
  './skel/var/lib/koha/zebradb/authorities/key'  => { target => 'ZEBRA_DATA_DIR', trimdir => 6 },
313
  './skel/var/lib/koha/zebradb/authorities/key'  => { target => 'ZEBRA_DATA_DIR', trimdir => 6 },
Lines 583-588 my %test_suite_override_dirs = ( Link Here
583
    ZEBRA_LOCK_DIR => ['var', 'lock', 'zebradb'],
592
    ZEBRA_LOCK_DIR => ['var', 'lock', 'zebradb'],
584
    ZEBRA_DATA_DIR => ['var', 'lib', 'zebradb'],
593
    ZEBRA_DATA_DIR => ['var', 'lib', 'zebradb'],
585
    ZEBRA_RUN_DIR  => ['var', 'run', 'zebradb'],
594
    ZEBRA_RUN_DIR  => ['var', 'run', 'zebradb'],
595
    PLACK_LOCK_DIR => ['var', 'lock', 'plack'],
586
    PLACK_RUN_DIR  => ['var', 'run', 'plack'],
596
    PLACK_RUN_DIR  => ['var', 'run', 'plack'],
587
);
597
);
588
598
Lines 1289-1294 sub get_target_directories { Link Here
1289
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'spool');
1299
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'spool');
1290
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
1300
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
1291
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
1301
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
1302
        $dirmap{'PLACK_LOCK_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lock', 'plack');
1292
        $dirmap{'PLACK_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'plack');
1303
        $dirmap{'PLACK_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'plack');
1293
    } elsif ($mode eq 'dev') {
1304
    } elsif ($mode eq 'dev') {
1294
        my $curdir = File::Spec->rel2abs(File::Spec->curdir());
1305
        my $curdir = File::Spec->rel2abs(File::Spec->curdir());
Lines 1320-1325 sub get_target_directories { Link Here
1320
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'spool');
1331
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'spool');
1321
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
1332
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
1322
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
1333
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
1334
        $dirmap{'PLACK_LOCK_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lock', 'plack');
1323
        $dirmap{'PLACK_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'plack');
1335
        $dirmap{'PLACK_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'plack');
1324
    } else {
1336
    } else {
1325
        # mode is standard, i.e., 'fhs'
1337
        # mode is standard, i.e., 'fhs'
Lines 1343-1348 sub get_target_directories { Link Here
1343
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'spool', $package);
1355
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'spool', $package);
1344
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'lib', $package, 'zebradb');
1356
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'lib', $package, 'zebradb');
1345
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'run', $package, 'zebradb');
1357
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'run', $package, 'zebradb');
1358
        $dirmap{'PLACK_LOCK_DIR'} = File::Spec->catdir(File::Spec->rootdir(), 'var', 'lock', $package, 'plack');
1346
        $dirmap{'PLACK_RUN_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'run', $package, 'plack');
1359
        $dirmap{'PLACK_RUN_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'run', $package, 'plack');
1347
    }
1360
    }
1348
1361
(-)a/debian/control (-9 / +10 lines)
Lines 6-17 Standards-Version: 3.8.4 Link Here
6
# NOTA BENE: Build dependencies end up as runtime dependencies as well.
6
# NOTA BENE: Build dependencies end up as runtime dependencies as well.
7
# See debian/rules, the override_dh_gencontrol rules. 
7
# See debian/rules, the override_dh_gencontrol rules. 
8
# There are some exceptions.
8
# There are some exceptions.
9
Build-Depends: EEEK: unknown package for AnyEvent::HTTP,
9
Build-Depends: EEEK: unknown package for Data::Pagination,
10
 EEEK: unknown package for Data::Pagination,
11
 EEEK: unknown package for Data::Paginator,
12
 EEEK: unknown package for Plack::Middleware::Debug,
13
 EEEK: unknown package for Starman,
14
 libalgorithm-checkdigits-perl,
10
 libalgorithm-checkdigits-perl,
11
 libanyevent-http-perl,
15
 libanyevent-perl,
12
 libanyevent-perl,
16
 libauthen-cas-client-perl,
13
 libauthen-cas-client-perl,
17
 libbiblio-endnotestyle-perl,
14
 libbiblio-endnotestyle-perl,
Lines 49-54 Build-Depends: EEEK: unknown package for AnyEvent::HTTP, Link Here
49
 libgravatar-url-perl,
46
 libgravatar-url-perl,
50
 libhtml-format-perl,
47
 libhtml-format-perl,
51
 libhtml-scrubber-perl,
48
 libhtml-scrubber-perl,
49
 libhttp-cookies-perl,
50
 libhttp-message-perl,
52
 libhttp-oai-perl,
51
 libhttp-oai-perl,
53
 libjson-any-perl,
52
 libjson-any-perl,
54
 libjson-perl,
53
 libjson-perl,
Lines 88-93 Build-Depends: EEEK: unknown package for AnyEvent::HTTP, Link Here
88
 libtemplate-perl,
87
 libtemplate-perl,
89
 libtemplate-plugin-htmltotext-perl,
88
 libtemplate-plugin-htmltotext-perl,
90
 libtest-deep-perl,
89
 libtest-deep-perl,
90
 libtest-harness-perl | perl-modules,
91
 libtest-mockmodule-perl,
91
 libtest-mockmodule-perl,
92
 libtest-simple-perl | perl-modules,
92
 libtest-simple-perl | perl-modules,
93
 libtest-strict-perl,
93
 libtest-strict-perl,
Lines 189-200 Description: Other dep. for koha Link Here
189
 daemon, debconf, etc.).
189
 daemon, debconf, etc.).
190
190
191
Package: koha-perldeps
191
Package: koha-perldeps
192
Depends: EEEK: unknown package for AnyEvent::HTTP,
192
Depends: EEEK: unknown package for Data::Pagination,
193
 EEEK: unknown package for Data::Pagination,
194
 EEEK: unknown package for Data::Paginator,
193
 EEEK: unknown package for Data::Paginator,
195
 EEEK: unknown package for Plack::Middleware::Debug,
196
 EEEK: unknown package for Starman,
197
 libalgorithm-checkdigits-perl,
194
 libalgorithm-checkdigits-perl,
195
 libanyevent-http-perl,
198
 libanyevent-perl,
196
 libanyevent-perl,
199
 libauthen-cas-client-perl,
197
 libauthen-cas-client-perl,
200
 libbiblio-endnotestyle-perl,
198
 libbiblio-endnotestyle-perl,
Lines 232-237 Depends: EEEK: unknown package for AnyEvent::HTTP, Link Here
232
 libgravatar-url-perl,
230
 libgravatar-url-perl,
233
 libhtml-format-perl,
231
 libhtml-format-perl,
234
 libhtml-scrubber-perl,
232
 libhtml-scrubber-perl,
233
 libhttp-cookies-perl,
234
 libhttp-message-perl,
235
 libhttp-oai-perl,
235
 libhttp-oai-perl,
236
 libjson-any-perl,
236
 libjson-any-perl,
237
 libjson-perl,
237
 libjson-perl,
Lines 271-276 Depends: EEEK: unknown package for AnyEvent::HTTP, Link Here
271
 libtemplate-perl,
271
 libtemplate-perl,
272
 libtemplate-plugin-htmltotext-perl,
272
 libtemplate-plugin-htmltotext-perl,
273
 libtest-deep-perl,
273
 libtest-deep-perl,
274
 libtest-harness-perl | perl-modules,
274
 libtest-mockmodule-perl,
275
 libtest-mockmodule-perl,
275
 libtest-simple-perl | perl-modules,
276
 libtest-simple-perl | perl-modules,
276
 libtest-strict-perl,
277
 libtest-strict-perl,
(-)a/etc/koha-nginx.conf (+5 lines)
Lines 1-3 Link Here
1
#USE THIS AT YOUR OWN RISK#
2
#DEVELOPMENT ONLY#
3
#NOT RECOMMENDED FOR PRODUCTION#
4
#02/06/2013
5
1
upstream backendurl {
6
upstream backendurl {
2
      server unix:__PLACK_RUN_DIR__/plack.sock;
7
      server unix:__PLACK_RUN_DIR__/plack.sock;
3
}
8
}
(-)a/misc/bin/koha-plack.sh (-44 / +104 lines)
Lines 1-4 Link Here
1
#!/bin/sh -e
1
#!/bin/bash
2
2
3
# This file is part of Koha.
3
# This file is part of Koha.
4
#
4
#
Lines 15-73 Link Here
15
# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
15
# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
16
# Suite 330, Boston, MA  02111-1307 USA
16
# Suite 330, Boston, MA  02111-1307 USA
17
17
18
### BEGIN INIT INFO# Provides:          koha-plack
18
### BEGIN INIT INFO
19
# Provides:          koha-plack-daemon
19
# Required-Start:    $syslog $remote_fs
20
# Required-Start:    $syslog $remote_fs
20
# Required-Stop:     $syslog $remote_fs# Default-Start:     2 3 4 5
21
# Required-Stop:     $syslog $remote_fs
21
# Default-Stop:      0 1 6# Short-Description: Plack server for Koha
22
# Default-Start:     2 3 4 5
23
# Default-Stop:      0 1 6
24
# Short-Description: Plack server daemon for Koha
22
### END INIT INFO
25
### END INIT INFO
23
26
24
export KOHA_CONF=__KOHA_CONF_DIR__/koha-conf.xml
27
export KOHA_CONF=__KOHA_CONF_DIR__/koha-conf.xml
25
#export OPACDIR=__OPAC_WWW_DIR__
28
NAME=KOHA
26
#export INTRANETDIR=__OPAC_WWW_DIR__
29
LOGDIR=__LOG_DIR__
27
export LOGDIR=__LOG_DIR__
30
USER=www-data
28
USER=__KOHA_USER__
31
GROUP=www-data
29
GROUP=__KOHA_GROUP__
30
RUNDIR=__PLACK_RUN_DIR__
32
RUNDIR=__PLACK_RUN_DIR__
31
PIDFILE=$RUNDIR/plack.pid
33
LOCKDIR=__PLACK_LOCK_DIR__
34
PIDFILE=$LOCKDIR/plack.pid
35
APP_PSGI=__SCRIPT_DIR__/koha.psgi
36
FCGI_LISTEN=$RUNDIR/plack.sock
37
#FCGI_LISTEN=127.0.0.1:5000
38
OPTIONS="--listen $FCGI_LISTEN --access-log $LOGDIR/koha-access.log --error-log $LOGDIR/koha-error.log -M FindBin --max-requests 50 -E deployment $APP_PSGI"
39
DAEMON=$(which starman)
40
 if [ ! -x "$DAEMON" ] ; then
41
     OPTIONS="-s FCGI --listen $FCGI_LISTEN -E production --app $APP_PSGI --access-log $LOGDIR/koha-access.log --error-log $LOGDIR/koha-error.log"
42
     DAEMON=$(which plackup)
43
 fi
32
44
33
# Use one of these lines to choose between TCP port and UNIX socket listeners
45
[ -f /lib/lsb/init-functions ] && . /lib/lsb/init-functions
34
SOCKET=$RUNDIR/plack.sock
35
#PORT=5000
36
46
37
case "$1" in
47
start()
38
    start)
48
{
39
	echo "Starting Koha Plack Daemon"
49
    log_daemon_msg "Starting plack server" "$NAME"
50
    start-stop-daemon -b -m --start --quiet --pidfile "$PIDFILE" --exec $DAEMON -- $OPTIONS
51
    sleep 3
52
    chown -R $USER:$GROUP $FCGI_LISTEN
53
    chown -R $USER:$GROUP $LOCKDIR
54
    if [ $? != 0 ]; then
55
        log_end_msg 1
56
        exit 1
57
    else
58
        log_end_msg 0
59
    fi
60
}
40
61
41
      # create run and lock directories if needed;
62
signal()
42
      # /var/run and /var/lock are completely cleared at boot
63
{
43
      # on some platforms
44
      if [ ! -d $RUNDIR ]; then
45
        umask 022
46
        mkdir -p $RUNDIR
47
        if [ $EUID -eq 0 ]; then
48
            chown $USER:$GROUP $RUNDIR
49
        fi
50
      fi
51
64
52
        opt="$opt --access-log $LOGDIR/koha-access.log --error-log $LOGDIR/koha-error.log"
65
    if [ "$1" = "stop" ]; then
53
        opt="$opt -M FindBin --max-requests 50 --workers 2 -E deployment"
66
    SIGNAL="TERM"
54
        if [ $SOCKET ]; then
67
        log_daemon_msg "Stopping plack server" "$NAME"
55
            opt="$opt --listen $SOCKET -D --pid $PIDFILE"
68
    else
56
        elif [ $PORT ]; then
69
    if [ "$1" = "reload" ]; then
57
            opt="$opt --port $PORT -D --pid $PIDFILE"
70
        SIGNAL="HUP"
71
            log_daemon_msg "Reloading plack server" "$NAME"
72
    else
73
        echo "ERR: wrong parameter given to signal()"
74
        exit 1
75
    fi
76
    fi
77
    if [ -f "$PIDFILE" ]; then
78
        start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile "$PIDFILE"
79
     if [ $? = 0 ]; then
80
            log_end_msg 0
81
        else
82
        SIGNAL="KILL"
83
        start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile "$PIDFILE"
84
            if [ $? != 0 ]; then
85
                log_end_msg 1
86
                [ $2 != 0 ] || exit 0
87
            else
88
            rm "$PIDFILE"
89
                log_end_msg 0
90
            fi
58
        fi
91
        fi
59
        starman $opt __SCRIPT_DIR__/koha.psgi
92
    if [ "$SIGNAL" = "KILL" ]; then
60
93
        rm -f "$PIDFILE"
61
        if [ $SOCKET ]; then
62
            chown $USER:$GROUP $SOCKET
63
	    chmod 660 $SOCKET
64
        fi
94
        fi
65
        ;;
95
    else
96
        log_end_msg 0
97
    fi
98
}
99
100
case "$1" in
101
    start)
102
    start
103
    ;;
104
105
    force-start)
106
    start
107
    ;;
108
66
    stop)
109
    stop)
67
        start-stop-daemon --stop --pidfile $PIDFILE
110
        signal stop 0
68
        ;;
111
    ;;
112
113
    force-stop)
114
    signal stop 0
115
    ;;
116
117
    reload)
118
    signal reload 0
119
    ;;
120
121
    force-reload|restart)
122
    signal stop 1
123
    sleep 2
124
    start
125
    ;;
126
69
    *)
127
    *)
70
        echo "Usage: koha-plack {start|stop}"
128
    echo "Usage: /etc/init.d/$NAME {start|force-start|stop|force-stop|reload|restart|force-reload}"
71
        exit 1
129
    exit 1
72
        ;;
130
    ;;
73
esac
131
esac
132
133
exit 0
(-)a/misc/bin/koha.psgi (-3 / +10 lines)
Lines 10-16 use lib("__PERL_MODULE_DIR__/installer"); Link Here
10
use Plack::Builder;
10
use Plack::Builder;
11
use Plack::App::CGIBin;
11
use Plack::App::CGIBin;
12
use Plack::App::Directory;
12
use Plack::App::Directory;
13
use Plack::Middleware::Debug;
14
use Plack::App::URLMap;
13
use Plack::App::URLMap;
15
use C4::Context;
14
use C4::Context;
16
use C4::Languages;
15
use C4::Languages;
Lines 22-37 use C4::Koha; Link Here
22
use C4::XSLT;
21
use C4::XSLT;
23
use C4::Branch;
22
use C4::Branch;
24
use C4::Category;
23
use C4::Category;
24
use Module::Load::Conditional qw[can_load check_install requires];
25
26
my $use_list = {
27
28
};
29
30
if(can_load( modules => { Plack::Middleware::Debug => undef} ) && $ENV{KOHA_DEBUG}){
31
    my $panels = Plack::Middleware::Debug->default_panels;
32
}
25
33
26
C4::Context->disable_syspref_cache();
34
C4::Context->disable_syspref_cache();
27
35
28
my $intra=Plack::App::CGIBin->new(root => "__INTRANET_CGI_DIR__" );
36
my $intra=Plack::App::CGIBin->new(root => "__INTRANET_CGI_DIR__" );
29
37
30
my $opac = Plack::App::CGIBin->new(root => "__OPAC_CGI_DIR__");
38
my $opac = Plack::App::CGIBin->new(root => "__OPAC_CGI_DIR__");
31
my $panels = Plack::Middleware::Debug->default_panels;
32
builder {
39
builder {
33
    enable_if{
40
    enable_if{
34
	$ENV{DEBUG}
41
	$ENV{KOHA_DEBUG}
35
    } 'Debug',  panels => [[ 'DBITrace', level => 1 ], @$panels ];
42
    } 'Debug',  panels => [[ 'DBITrace', level => 1 ], @$panels ];
36
43
37
    enable "Plack::Middleware::Static";
44
    enable "Plack::Middleware::Static";
(-)a/rewrite-config.PL (+1 lines)
Lines 124-129 $prefix = $ENV{'INSTALL_BASE'} || "/usr"; Link Here
124
  '__ZEBRA_LOCK_DIR__' => "$prefix/var/lock/zebradb",
124
  '__ZEBRA_LOCK_DIR__' => "$prefix/var/lock/zebradb",
125
  '__ZEBRA_DATA_DIR__' => "$prefix/var/lib/zebradb",
125
  '__ZEBRA_DATA_DIR__' => "$prefix/var/lib/zebradb",
126
  '__ZEBRA_RUN_DIR__' => "$prefix/var/run/zebradb",
126
  '__ZEBRA_RUN_DIR__' => "$prefix/var/run/zebradb",
127
  '__PLACK_LOCK_DIR__' => "$prefix/var/lock/plack",
127
  '__PLACK_RUN_DIR__' => "$prefix/var/run/plack",
128
  '__PLACK_RUN_DIR__' => "$prefix/var/run/plack",
128
  '__ZEBRA_MARC_FORMAT__' => 'marc21',
129
  '__ZEBRA_MARC_FORMAT__' => 'marc21',
129
  '__ZEBRA_LANGUAGE__' => 'en',
130
  '__ZEBRA_LANGUAGE__' => 'en',
(-)a/skel/var/lock/koha/plack/README (+1 lines)
Line 0 Link Here
1
Plack lock dir
(-)a/skel/var/run/koha/plack/README (-1 / +1 lines)
Line 0 Link Here
0
- 
1
Plack Unix-domain sockets

Return to bug 9316