Merge branch 'master' into psgi
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Script / FastCGI.pm
1 package Catalyst::Script::FastCGI;
2 use Moose;
3 use MooseX::Types::Moose qw/Str Bool Int/;
4 use Data::OptList;
5 use namespace::autoclean;
6
7 sub _plack_engine_name { 'FCGI' }
8
9 with 'Catalyst::ScriptRole';
10
11 has listen => (
12     traits        => [qw(Getopt)],
13     cmd_aliases   => 'l',
14     isa           => Str,
15     is            => 'ro',
16     documentation => 'Specify a listening port/socket',
17 );
18
19 has pidfile => (
20     traits        => [qw(Getopt)],
21     cmd_aliases   => [qw/pid p/],
22     isa           => Str,
23     is            => 'ro',
24     documentation => 'Specify a pidfile',
25 );
26
27 has daemon => (
28     traits        => [qw(Getopt)],
29     isa           => Bool,
30     is            => 'ro',
31     cmd_aliases   => [qw/d detach/], # Eww, detach is here as we fucked it up.. Deliberately not documented
32     documentation => 'Daemonize (go into the background)',
33 );
34
35 has manager => (
36     traits        => [qw(Getopt)],
37     isa           => Str,
38     is            => 'ro',
39     cmd_aliases   => 'M',
40     documentation => 'Use a different FastCGI process manager class',
41 );
42
43 has keeperr => (
44     traits        => [qw(Getopt)],
45     cmd_aliases   => 'e',
46     isa           => Bool,
47     is            => 'ro',
48     documentation => 'Log STDERR',
49 );
50
51 has nproc => (
52     traits        => [qw(Getopt)],
53     cmd_aliases   => 'n',
54     isa           => Int,
55     is            => 'ro',
56     documentation => 'Specify a number of child processes',
57 );
58
59 has title => (
60     traits        => [qw(Getopt)],
61     cmd_aliases   => 't',
62     isa           => Str,
63     is            => 'ro',
64     lazy          => 1,
65     builder       => '_build_proc_title',
66     documentation => 'Set the process title',
67 );
68
69 sub _build_proc_title {
70     my ($self) = @_;
71     return sprintf 'perl-fcgi-pm [%s]', $self->application_name;
72 }
73
74 sub BUILD {
75     my ($self) = @_;
76     $self->title;
77 }
78
79 sub _plack_loader_args {
80     my ($self) = shift;
81     return (
82         map { $_->[0] => $self->${ \($_->[1] ? $_->[1]->[0] : $_->[0]) } }
83         Data::OptList::mkopt([
84             qw/pidfile listen manager nproc keep_stderr/,
85             detach     => [ 'daemon' ],
86             proc_title => [ 'title'  ],
87         ])
88     );
89 }
90
91 sub _application_args {
92     my ($self) = shift;
93     return (
94         $self->listen,
95         {
96             nproc       => $self->nproc,
97             pidfile     => $self->pidfile,
98             manager     => $self->manager,
99             detach      => $self->daemon,
100             keep_stderr => $self->keeperr,
101             title       => $self->title,
102         }
103     );
104 }
105
106 __PACKAGE__->meta->make_immutable;
107
108 =head1 NAME
109
110 Catalyst::Script::FastCGI - The FastCGI Catalyst Script
111
112 =head1 SYNOPSIS
113
114   myapp_fastcgi.pl [options]
115
116  Options:
117    -? --help      display this help and exits
118    -l --listen    Socket path to listen on
119                   (defaults to standard input)
120                   can be HOST:PORT, :PORT or a
121                   filesystem path
122    -n --nproc     specify number of processes to keep
123                   to serve requests (defaults to 1,
124                   requires -listen)
125    -p --pidfile   specify filename for pid file
126                   (requires -listen)
127    -d --daemon    daemonize (requires -listen)
128    -M --manager   specify alternate process manager
129                   (FCGI::ProcManager sub-class)
130                   or empty string to disable
131    -e --keeperr   send error messages to STDOUT, not
132                   to the webserver
133    -t --title     set the process title
134
135 =head1 DESCRIPTION
136
137 Run a Catalyst application as fastcgi.
138
139 =head1 AUTHORS
140
141 Catalyst Contributors, see Catalyst.pm
142
143 =head1 COPYRIGHT
144
145 This library is free software. You can redistribute it and/or modify it under
146 the same terms as Perl itself.
147
148 =cut