76 lines
1.8 KiB
Perl
76 lines
1.8 KiB
Perl
#!/usr/bin/env perl
|
|
|
|
use Plack::Runner;
|
|
use strict;
|
|
use warnings;
|
|
use POSIX;
|
|
use Getopt::Std;
|
|
|
|
our %opts;
|
|
my %_apps;
|
|
|
|
getopts( 'n:p:s:u:g:', \%opts );
|
|
|
|
$opts{n} ||= $ENV{NPROC} || 7;
|
|
$opts{p} ||= $ENV{PID} || '/run/llng-fastcgi.pid';
|
|
$opts{s} ||= $ENV{SOCKET} || '/run/llng-fastcgi.sock';
|
|
$opts{a} ||= $ENV{PORTAL_PATH} || '/var/lib/lemonldap-ng/portal';
|
|
$opts{u} ||= $ENV{USER};
|
|
$opts{g} ||= $ENV{GROUP};
|
|
|
|
if ( $opts{g} ) {
|
|
my $grp = getgrnam( $opts{g} ) or warn "Can't change uid to $opts{g}";
|
|
POSIX::setuid($grp);
|
|
}
|
|
|
|
if ( $opts{u} ) {
|
|
my $uid = getpwnam( $opts{u} ) or warn "Can't change uid to $opts{u}";
|
|
POSIX::setuid($uid);
|
|
}
|
|
|
|
my %builder = (
|
|
handler => sub {
|
|
require Lemonldap::NG::Handler::Nginx;
|
|
return Lemonldap::NG::Handler::Nginx->run( {} );
|
|
},
|
|
manager => sub {
|
|
require Lemonldap::NG::Manager;
|
|
return Lemonldap::NG::Manager->run( {} );
|
|
},
|
|
auth => sub {
|
|
require CGI::Emulate::PSGI;
|
|
require CGI::Compile;
|
|
return CGI::Emulate::PSGI->handler(
|
|
CGI::Compile->compile("$opts{a}/index.pl") );
|
|
},
|
|
);
|
|
|
|
unless ($>) {
|
|
die "Refuse to run as root. Aborting";
|
|
}
|
|
|
|
my $app = sub {
|
|
my $type = $_[0]->{LLTYPE} || 'handler';
|
|
return $_apps{$type}->(@_) if ( defined $_apps{$type} );
|
|
if ( defined $builder{$type} ) {
|
|
$_apps{$type} = $builder{$type}->();
|
|
return $_apps{$type}->(@_);
|
|
}
|
|
die "Unknown PSGI type $type";
|
|
};
|
|
|
|
my $server = Plack::Runner->new();
|
|
$server->parse_options(
|
|
'-s' => 'FCGI',
|
|
'-E' => 'deployment',
|
|
'--pid' => $opts{p},
|
|
'--nproc' => $opts{n},
|
|
'--listen' => [ $opts{s} ],
|
|
'--proc-title' => 'llng-fastcgi-server',
|
|
'--daemonize',
|
|
'--no-default-middleware',
|
|
);
|
|
|
|
$server->run($app);
|
|
|