The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use Plack::Runner;


sub version {
    require Starman;
    print "Starman $Starman::VERSION\n";
}

my $preload_app;
		

require Getopt::Long;
Getopt::Long::Configure("no_ignore_case", "no_auto_abbrev", "pass_through");
Getopt::Long::GetOptions(
    "preload-app"      => \$preload_app,
);

my @args = (server => 'Starman::ModCluster', env => 'deployment', version_cb => \&version);
if (!$preload_app) {
    push @args, 'loader' => 'Delayed';
}

my @argv = @ARGV;

my $runner = Plack::Runner->new(@args);
$runner->parse_options(@argv);

if ($runner->{loader} eq 'Restarter') {
    warn <<WARN;
!!
!! Using restarter with -r or -R options is known to cause issues with process supervisor
!! such as start_server, and it is STRONGLY discouraged to use with Starman. You have been warned.
!!
WARN
}

$runner->set_options(argv => \@argv);
$runner->run;

__END__

=head1 NAME

starman-modcluster - Starman launcher with mod_cluster support

=head1 SYNOPSIS

  starman-modcluster --mc-node-name=MyApp1 --mc-uri=http://127.0.0.1:6666 --mc-context="/myapp" --mc-alias="myapp1" --mc-host=127.0.0.1 

=head1 OPTIONS

=over 4

=item --mc-uri (required)

	--mc-uri http://modclusterserver1.example.com:6666,http://modclusterserver2.example.com:6666
	
mod_cluster address

=item --mc-node-name (required)

	--mc-node-name UniqueNameOfMyNode

Specified unique name of you server instance, in mod_cluster it is equivalent to JvmRoute. Max site 80 characters

=item --mc-context (required)

	--mc-context /foo,/bar,/baz/foo
	
Contexts that your application can server.

=item --mc-host (required)
	
	--mc-host 10.0.0.5

Specifies the hostname/IP address of a node

=item --mc-port (optional)

	--mc-port 5000

Specifies the port that application is hosted on, if not specified, will attempt to figure it out.

=item --mc-type (optional)

	--mc-type http
	
Specifies scheme that is used for your node (http/https), if not specified, will attempt to figure it out.

=item --mc-alias (optional)
 
 	--mc-alias MyAppServer1,AppServer1
 	
Virtual host alias that will be added to httpd. Defaults to StarmanServer

=item --mc-domain (optional)

	--mc-domain MyGroup
	
Domain/Load balancer name

=item --mc-status-interval (optional)

	--mc-status-interval 10
	
How often in seconds server is going to communicate its status to mod_cluster. Defaults to 30 seconds.

=item --mc-multicast-enable 

	--mc-multicast-enable 
	
Allow Starman to listen for mod_clusters multicast traffic for dynamic subscription

=item --mc-multicast-address (optional)

	--mc-multicase-address 224.0.1.105

Address to listen multicast traffic on. Defaults to 224.0.1.105

=item --mc-multicast-port (optional)

	--mc-multicase-port 23364

Port that mod_cluster is broadcasting its information. Defaults to 23364

=item --mc-sticky-session (optional)

	--mc-sticky-session no

Stick a request to a node "yes"/"no" (Defaults to "yes")

=item --mc-sticky-session-cookie (optional)

	--mc-sticky-session-cookie CookieName

Name of the cookie containing the session id (Defaults to "JSESSIONID")

=item --mc-sticky-session-remove (optional)

	--mc-sticky-session-remove yes

remove the session id (cookie or parameter) when the request can't be routed to the right node "yes"/"no" (Defaults to "no")

=item --mc-sticky-session-force (optional)

	--mc-sticky-session-force no

Return an error if the request can't be routed according to JVMRoute (Defaults to "yes")

=item --mc-wait-worker (optional)

	--mc-wait-worker 10

time in seconds to wait for an available worker. (Defaults to 0, no wait)

=item --mc-max-attempts (optional)

	--mc-max-attempts 5

number of attemps to send the request to the backend server (Defaults to 1)

=item --mc-flush-packets (optional)

	--mc-flush-packets on

Tell how to flush the packets. On: Send immediately, Auto wait for flushwait time before sending, Off don't flush. (Defaults to "off")

=item --mc-flush-wait (optional)

	--mc-flush-packets 5

Time to wait before flushing. Value in seconds (Defaults to 10)

=item --mc-ping (optional)

	--mc-ping 5

Time to wait for a pong answer to a ping. 0 means we don't try to ping before sending. Value in secondes (Defaults to 10)

=item --mc-smax (optional)

	--mc-smax 5

soft max inactive connection over that limit after ttl are closed. Default depends on the mpm configuration

=item --mc-ttl (optional)

	--mc-ttl 120

max time in seconds to life for connection above smax. (Defaults to 60)

=item --mc-timeout (optional)

	--mc-timeout 60

Max time httpd will wait for the backend connection. (Defaults to 0, no timeout)

=item --mc-debug (optional)

	--mc-debug 1

Display L<Net::MCMP> debug information, and show configuration options of mod_cluster in the logs.

=item Other Options

Other options are available as described in L<starman> and L<plackup>

=back

Starman::ModCluster passes through other options given to L<Starman> and L<Plack::Runner>, the
common backend that L<starmna> and L<plackup> uses, so the most options explained in
C<plackup -h> such as C<--access-log> or C<--daemonize> works fine in
starman-modcluster too.

=cut

=back

=head1 SEE ALSO

L<starman> L<Starman> L<plackup>

=cut