lemonldap-ng/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Init.pm

126 lines
3.9 KiB
Perl
Raw Normal View History

package Lemonldap::NG::Handler::Main::Init;
2017-02-08 23:18:52 +01:00
our $VERSION = '2.0.0';
package Lemonldap::NG::Handler::Main;
use strict;
use Lemonldap::NG::Common::Conf;
our $statusInit = 1;
## @imethod void init(hashRef args)
# Read parameters and build the Lemonldap::NG::Common::Conf object.
# @param $args hash containing parameters
sub init($$) {
my ( $class, $args ) = @_;
# According to doc, localStorage can be declared in $args root,
# but it must be in $args->{configStorage}
foreach (qw(localStorage localStorageOptions)) {
$args->{configStorage}->{$_} ||= $args->{$_};
}
my $tmp = Lemonldap::NG::Common::Conf->new( $args->{configStorage} );
2016-03-24 07:23:37 +01:00
unless ( $class->confAcc($tmp) ) {
die( "$class : unable to build configuration: "
. "$Lemonldap::NG::Common::Conf::msg" );
}
# Merge local configuration parameters so that params defined in
# startup parameters have precedence over lemonldap-ng.ini params
$class->localConfig(
2016-03-24 07:23:37 +01:00
{ %{ $class->confAcc->getLocalConf('handler') }, %{$args} } );
$class->checkTime( $class->localConfig->{checkTime} || $class->checkTime );
# Few actions that must be done at server startup:
# * set log level for Lemonldap::NG logs
2017-02-12 21:19:39 +01:00
$class->logLevelInit();
# * set server signature
$class->serverSignatureInit unless ( $class->localConfig->{hideSignature} );
# * launch status process
2018-06-12 21:00:10 +02:00
$class->statusInit();
1;
}
# @method void logLevelInit
# Set log level for Lemonldap::NG logs
sub logLevelInit {
2017-02-12 21:19:39 +01:00
my ($class) = @_;
2017-02-12 21:09:46 +01:00
my $logger = $class->localConfig->{logger} ||= $class->defaultLogger;
2017-02-12 21:19:39 +01:00
eval "require $logger";
die $@ if ($@);
2017-02-13 12:58:39 +01:00
$class->logger( $logger->new( $class->localConfig ) );
2017-02-21 07:41:50 +01:00
$class->logger->debug("Logger $logger loaded");
2017-02-13 12:58:39 +01:00
$logger = $class->localConfig->{userLogger} || $logger;
eval "require $logger";
die $@ if ($@);
$class->userLogger( $logger->new( $class->localConfig ), user => 1 );
2017-02-21 07:41:50 +01:00
$class->logger->debug("User logger $logger loaded");
}
# @method void serverSignatureInit
# adapt server signature
sub serverSignatureInit {
my $class = shift;
$class->setServerSignature("Lemonldap::NG/$VERSION");
}
## @ifn protected void statusInit()
# Launch the status process
sub statusInit {
my ($class) = @_;
2018-06-12 21:00:10 +02:00
return unless ( $class->localConfig->{status} and $statusInit );
$statusInit = 0;
return if ( $class->tsv->{statusPipe} );
if ( $ENV{LLNGSTATUSHOST} ) {
require IO::Socket::INET;
$class->tsv->{statusPipe} = IO::Socket::INET->new(
Proto => 'udp',
PeerAddr => $ENV{LLNGSTATUSHOST}
);
$class->tsv->{statusOut} = undef;
}
else {
2018-06-12 21:00:10 +02:00
require IO::Pipe;
my $statusPipe = IO::Pipe->new;
my $statusOut = IO::Pipe->new;
if ( my $pid = fork() ) {
$class->logger->debug("Status collector launched ($pid)");
$statusPipe->writer();
$statusOut->reader();
$statusPipe->autoflush(1);
( $class->tsv->{statusPipe}, $class->tsv->{statusOut} ) =
( $statusPipe, $statusOut );
}
else {
$statusPipe->reader();
$statusOut->writer();
my $fdin = $statusPipe->fileno;
my $fdout = $statusOut->fileno;
open STDIN, "<&$fdin";
open STDOUT, ">&$fdout";
my $perl_exec = ( $^X =~ /perl/ ) ? $^X : 'perl';
exec $perl_exec, '-MLemonldap::NG::Handler::Lib::Status',
# Insert @INC in Perl path
2018-10-12 10:04:03 +02:00
map( {"-I$_"} @INC ),
2018-06-12 21:00:10 +02:00
# Command to launch
'-e', '&Lemonldap::NG::Handler::Lib::Status::run()',
# Optional arg: UDP socket to listen to
(
$ENV{LLNGSTATUSLISTEN}
? ( '--', '--udp', $ENV{LLNGSTATUSLISTEN} )
: ()
);
}
}
}
1;