lemonldap-ng/fastcgi-server/sbin/llng-fastcgi-server
2016-02-04 22:10:17 +00:00

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);