App-CELL
view release on metacpan or search on metacpan
lib/App/CELL/Load.pm view on Meta::CPAN
=back
=cut
our $sharedir = '';
our $sharedir_loaded = 0;
our @sitedir = ();
=head1 MODULES
=head2 init
Idempotent initialization function.
Optionally takes a PARAMHASH. The following arguments are recognized:
=over
=item C<sitedir> -- full path to the/a site dir
=item C<enviro> -- name of environment variable containing sitedir path
=item C<verbose> -- increase logging verbosity of the load routine
=back
E.g.:
my $status = App::CELL::Load::init(
sitedir => '/etc/foo',
verbose => 1
);
See L<App::CELL::Guide> for details.
=cut
sub init {
my %ARGS = validate( @_, {
enviro => { type => SCALAR, optional => 1 },
sitedir => { type => SCALAR, optional => 1 },
verbose => { type => SCALAR, default => 0 },
} );
# determine verbosity level
my $args_string;
if ( %ARGS ) {
$args_string = "with arguments: " . stringify_args( \%ARGS );
} else {
$args_string = "without arguments";
}
$meta->set('CELL_META_LOAD_VERBOSE', $ARGS{'verbose'} || 0);
$log->info(
"Entering App::CELL::Load::init from " . (caller)[0] . " $args_string",
cell => 1
) if $meta->CELL_META_LOAD_VERBOSE;
# check for taint mode
if ( ${^TAINT} != 0 ) {
return App::CELL::Status->new( level => "FATAL",
code => "Attempt to load while in taint mode (-T)" );
}
# look up sharedir
if ( not $sharedir ) {
my $tmp_sharedir = File::ShareDir::dist_dir('App-CELL');
if ( ! is_directory_viable( $tmp_sharedir ) ) {
return App::CELL::Status->new(
level => 'ERR',
code => 'CELL_SHAREDIR_NOT_VIABLE',
args => [ $tmp_sharedir, $App::CELL::Util::not_viable_reason ],
);
}
$log->info( "Found viable CELL configuration directory " .
$tmp_sharedir . " in App::CELL distro", cell => 1 ) if $meta->CELL_META_LOAD_VERBOSE;
$site->set( 'CELL_SHAREDIR_FULLPATH', $tmp_sharedir );
$sharedir = $tmp_sharedir;
}
# walk sharedir
if ( $sharedir and not $sharedir_loaded ) {
my $status = message_files( $sharedir );
my $load_status = _report_load_status( $sharedir, 'sharedir', 'message', $status );
return $load_status if $load_status->not_ok;
$status = meta_core_site_files( $sharedir );
$load_status = _report_load_status( $sharedir, 'sharedir', 'config params', $status );
return $load_status if $load_status->not_ok;
$site->set( 'CELL_SHAREDIR_LOADED', 1 );
$sharedir_loaded = 1;
}
if ( $meta->CELL_META_LOAD_VERBOSE ) {
if ( @sitedir ) {
$log->debug( "sitedir package variable contains ->" .
join( ':', @sitedir ) . "<-", cell => 1 );
} else {
$log->debug( "sitedir package variable is empty", cell => 1 );
}
}
# get sitedir from args or environment
my $status = get_sitedir( %ARGS );
return $status unless $status->ok;
my $sitedir_candidate = $status->payload;
# walk sitedir
if ( $sitedir_candidate ) {
my $status = message_files( $sitedir_candidate );
my $messages_loaded = _report_load_status( $sitedir_candidate, 'sitedir', 'message', $status );
$status = meta_core_site_files( $sitedir_candidate );
my $params_loaded = _report_load_status( $sitedir_candidate, 'sitedir', 'config params', $status );
#
# sitedir candidate is accepted only if something is actually
# loaded
#
if ( $messages_loaded->ok or $params_loaded->ok ) {
$meta->set( 'CELL_META_SITEDIR_LOADED',
( $meta->CELL_META_SITEDIR_LOADED + 1 ) );
push @sitedir, $sitedir_candidate;
$meta->set( 'CELL_META_SITEDIR_LIST', \@sitedir );
}
( run in 0.639 second using v1.01-cache-2.11-cpan-39bf76dae61 )