Handler: remove useless call to defaultValuesInit at server startup, move

remaining methods of LocalInit into SharedConf and remove LocalInit.pm (#630)
This commit is contained in:
François-Xavier Deltombe 2014-06-27 16:20:51 +00:00
parent 7cfff88ac5
commit 6aa06d2d40
6 changed files with 59 additions and 236 deletions

View File

@ -12,7 +12,6 @@ lib/Lemonldap/NG/Handler/API/CGI.pm
lib/Lemonldap/NG/Handler/API/Nginx.pm
lib/Lemonldap/NG/Handler/CGI.pm
lib/Lemonldap/NG/Handler/Initialization/GlobalInit.pm
lib/Lemonldap/NG/Handler/Initialization/LocalInit.pm
lib/Lemonldap/NG/Handler/Main.pm
lib/Lemonldap/NG/Handler/Main/Headers.pm
lib/Lemonldap/NG/Handler/Main/Jail.pm
@ -33,7 +32,6 @@ META.yml
README
t/01-Lemonldap-NG-Handler-Main.t
t/02-Lemonldap-NG-Handler-Main-Portal.t
t/04-Lemonldap-NG-Handler-Initialization-LocalInit.t
t/05-Lemonldap-NG-Handler-Initialization-GlobalInit.t
t/10-Lemonldap-NG-Handler-SharedConf.t
t/12-Lemonldap-NG-Handler-Jail.t

View File

@ -222,7 +222,7 @@ sub localSessionStorageInit {
my $params = "";
if ($localSessionStorage) {
require Data::Dumper;
$params = " $self->{localStorage},"
$params = " $self->{localSessionStorage},"
. Data::Dumper->new( [ $localSessionStorageOptions ] )->Terse(1)->Indent(0)->Dump; # To send cache params on one line
}
#print { $tsv->{statusPipe} } "RELOADCACHE$params";

View File

@ -1,60 +0,0 @@
# Methods run at server startup / reload
package Lemonldap::NG::Handler::Initialization::LocalInit;
use Lemonldap::NG::Handler::SharedConf; # Needed to get VERSION
use Lemonldap::NG::Handler::Main::Logger;
use Lemonldap::NG::Handler::API qw(:httpCodes);
our $VERSION = '1.4.0';
my ( $statusPipe, $statusOut );
## @imethod void localInit(hashRef args)
# Launch the status process (statusProcess()) if wanted
# @param $args reference to the initialization hash
sub localInit($$) {
my ( $class, $args ) = splice @_;
$class->statusInit if ($args->{status});
$class->serverSignatureInit unless ($args->{hideSignature});
return ( $statusPipe, $statusOut );
}
sub serverSignatureInit {
my $class = shift;
Lemonldap::NG::Handler::API->setServerSignature(
"Lemonldap::NG::Handler/" . $Lemonldap::NG::Handler::VERSION
) if ( $Lemonldap::NG::Handler::VERSION );
}
## @ifn protected void statusInit()
# Launch the status process
sub statusInit {
my $class = shift;
require IO::Pipe;
$statusPipe = IO::Pipe->new;
$statusOut = IO::Pipe->new;
if ( my $pid = fork() ) {
$statusPipe->writer();
$statusOut->reader();
$statusPipe->autoflush(1);
}
else {
$statusPipe->reader();
$statusOut->writer();
my $fdin = $statusPipe->fileno;
my $fdout = $statusOut->fileno;
open STDIN, "<&$fdin";
open STDOUT, ">&$fdout";
my @tmp = ();
push @tmp, "-I$_" foreach (@INC);
exec 'perl', '-MLemonldap::NG::Handler::Status',
@tmp,
'-e',
"&Lemonldap::NG::Handler::Status::run()";
}
}
1;

View File

@ -1,24 +1,9 @@
## @file
# Base file for Lemonldap::NG handlers
## @class
# Base class for Lemonldap::NG handlers.
# All methods in handler are class methods: in ModPerl environment, handlers
# are always launched without object created.
#
# The main method is run() who is called by Apache for each requests (using
# handler() wrapper).
#
# The main initialization subroutine is init() who launch localInit() and
# globalInit().
# Methods run at request serving
package Lemonldap::NG::Handler::Main;
#use strict;
use MIME::Base64;
use Exporter 'import';
#use AutoLoader 'AUTOLOAD';
use Lemonldap::NG::Common::Crypto;
use Lemonldap::NG::Common::Session;
require POSIX;
@ -79,7 +64,6 @@ BEGIN {
Lemonldap::NG::Handler::API->thread_share($tsv);
}
use Lemonldap::NG::Handler::Initialization::LocalInit;
use Lemonldap::NG::Handler::Initialization::GlobalInit;
use Lemonldap::NG::Handler::Main::Jail;
use Lemonldap::NG::Handler::Main::Headers;
@ -482,14 +466,6 @@ sub initLocalStorage {
return 1;
}
## @imethod void localInit(hashRef args)
# launch localInit method which launch the status process
# @param $args reference to the initialization hash
sub localInit($$) {
my ( $class, $args ) = splice @_;
( $tsv->{statusPipe}, $tsv->{statusOut} ) = Lemonldap::NG::Handler::Initialization::LocalInit->localInit($args);
}
## @imethod void globalInit(hashRef args)
# instanciate a GlobalInit object with variables:
# customFunctions, useSafeJail, and safe
@ -670,7 +646,6 @@ sub status($$) {
'debug', $r );
return $class->abort( $r, "$class: status page can not be displayed" )
unless ( $tsv->{statusPipe} and $tsv->{statusOut} );
$r->handler("perl-script");
print { $tsv->{statusPipe} } "STATUS"
. (
Lemonldap::NG::Handler::API->args($r)

View File

@ -23,7 +23,6 @@ use Lemonldap::NG::Handler::API qw(:httpCodes);
use Lemonldap::NG::Handler::Initialization::GlobalInit;
use Lemonldap::NG::Common::Conf; #link protected lmConf
use Lemonldap::NG::Common::Conf::Constants; #inherits
use Cache::Cache qw($EXPIRES_NEVER);
use Lemonldap::NG::Handler::Main::Logger;
use base qw(Lemonldap::NG::Handler::Main);
@ -55,74 +54,74 @@ BEGIN {
# INIT PROCESS
## @imethod void init(hashRef args)
# Load parameters and build the Lemonldap::NG::Common::Conf object.
# Read parameters and build the Lemonldap::NG::Common::Conf object.
# @param $args hash containing parameters
sub init($$) {
my ( $class, $args ) = splice @_;
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->{$_};
}
$lmConf = Lemonldap::NG::Common::Conf->new($args->{configStorage});
die( "$class : unable to build configuration: "
. "$Lemonldap::NG::Common::Conf::msg" ) unless ($lmConf);
# Get local configuration parameters
my $localconf = $lmConf->getLocalConf(HANDLERSECTION);
if ($localconf) {
$args->{$_} ||= $localconf->{$_} foreach ( keys %$localconf );
}
# Merge local configuration parameters so that params defined in
# startup parameters have precedence over lemonldap-ng.ini params
$localConfig = {
%{ $lmConf->getLocalConf(HANDLERSECTION) },
%{ $args }
};
# Store in localConfig global variable
$localConfig = $args;
$checkTime = $localConfig->{checkTime} || $checkTime;
# localStorage can be declared in configStorage or at the root or both
foreach (qw(localStorage localStorageOptions)) {
$args->{$_} ||= $args->{configStorage}->{$_} || $lmConf->{$_};
$args->{configStorage}->{$_} ||= $args->{$_};
}
$checkTime = $args->{checkTime} || $checkTime;
$class->defaultValuesInit($args);
$class->localInit($args);
# Few actions that must be done at server startup:
# * set server signature
$class->serverSignatureInit unless ($localConfig->{hideSignature});
# * launch status process
( $tsv->{statusPipe}, $tsv->{statusOut} ) = $class->statusInit
if ($localConfig->{status});
}
## @imethod protected void defaultValuesInit(hashRef args)
# Set default values for non-customized variables
# @param $args hash containing parameters
# @return boolean
sub defaultValuesInit {
my ( $class, $args ) = splice @_;
# Local configuration overrides global configuration
my %h = ( %$args, %$localConfig );
#return $class->SUPER::defaultValuesInit( \%h );
my $globalinit = Lemonldap::NG::Handler::Initialization::GlobalInit->new(
customFunctions => $tsv->{customFunctions},
useSafeJail => $tsv->{useSafeJail},
);
(
@$tsv{
qw( cookieName securedCookie whatToTrace
https port customFunctions
timeoutActivity useRedirectOnError useRedirectOnForbidden
useSafeJail key maintenance
cda httpOnly cookieExpiration
cipher )
}
)
= $globalinit->defaultValuesInit(
@$tsv{
qw( cookieName securedCookie whatToTrace
https port customFunctions
timeoutActivity useRedirectOnError useRedirectOnForbidden
useSafeJail key maintenance
cda httpOnly cookieExpiration
cipher )
},
\%h
);
# @method void serverSignatureInit
# adapt server signature
sub serverSignatureInit {
my $class = shift;
Lemonldap::NG::Handler::API->setServerSignature(
"Lemonldap::NG::Handler/" . $Lemonldap::NG::Handler::VERSION
) if ( $Lemonldap::NG::Handler::VERSION );
}
## @ifn protected void statusInit()
# Launch the status process
sub statusInit {
my $class = shift;
require IO::Pipe;
$statusPipe = IO::Pipe->new;
$statusOut = IO::Pipe->new;
if ( my $pid = fork() ) {
$statusPipe->writer();
$statusOut->reader();
$statusPipe->autoflush(1);
return ( $statusPipe, $statusOut );
}
else {
$statusPipe->reader();
$statusOut->writer();
my $fdin = $statusPipe->fileno;
my $fdout = $statusOut->fileno;
open STDIN, "<&$fdin";
open STDOUT, ">&$fdout";
my @tmp = ();
push @tmp, "-I$_" foreach (@INC);
exec 'perl', '-MLemonldap::NG::Handler::Status',
@tmp,
'-e',
"&Lemonldap::NG::Handler::Status::run()";
}
}
# MAIN

View File

@ -1,89 +0,0 @@
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl Lemonldap-NG-Handler-Vhost.t'
#########################
# change 'tests => 1' to 'tests => last_test_to_print';
package My::Package;
use Test::More tests => 2;
BEGIN {
use_ok('Lemonldap::NG::Handler::Initialization::LocalInit');
}
#########################
# Insert your test code below, the Test::More module is use()ed here so read
# its man page ( perldoc Test::More ) for help writing this test script.
ok(
Lemonldap::NG::Handler::Initialization::LocalInit->localInit({
status => 1,
hideSignature => 0,
}),
'localInit method'
);
__END__
ok(
my (
$localStorage, $localStorageOptions,
$statusPipe, $statusOut
)
= $localinit->localInit(
{
localStorage => 'Cache::FileCache',
localStorageOptions => { 'namespace' => 'lemonldap-ng-sessions', },
status => 1,
}
),
'LocalInit methods: localInit'
);
ok(
(
$localStorage eq 'Cache::FileCache'
and $localStorageOptions->{'namespace'} eq 'lemonldap-ng-sessions'
),
'LocalInit methods: localInit values'
);
ok( $localinit->statusProcess == 0, 'LocalInit methods: statusProcess' );
ok( $statusPipe->isa('IO::Pipe::End'), 'status pipe: In pipe' );
ok( $statusOut->isa('IO::Pipe::End'), 'status pipe: Out pipe' );
ok( print( $statusPipe "uid => / OK\nuid => / OK\nuid => /no REJECT\n" ),
'status pipe: New requests' );
ok( print( $statusPipe "STATUS\n" ), 'status pipe: Status request' );
ok( &read, 'status pipe: Status result' );
ok( close($statusOut), 'status pipe: close out pipe' );
ok( close($statusPipe), 'status pipe: close in pipe' );
sub read {
my $ok = 0;
#open LOG, '>/tmp/log';
while (<$statusOut>) {
#print LOG $_;
$ok++ if (/^OK\s+:\s*2\s*\(2\.00\s*\/\s*mn\)$/);
$ok++ if (/^REJECT\s+:\s*1\s*\(1\.00\s*\/\s*mn\)$/);
if (/^END$/) {
$ok++;
last;
}
}
#print LOG "$ok\n";
#close LOG;
return ( $ok == 3 );
}