Rex-CMDB-TOML
view release on metacpan or search on metacpan
lib/Rex/CMDB/TOML.pm view on Meta::CPAN
}
# set the default role path ro 'cmdb/roles'
if ( !defined( $self->{roles_path} ) ) {
$self->{roles_path} = File::Spec->join( $self->{path},'roles');
}
# if parsing failure should be fatal
# default true
if ( !defined( $self->{parse_error_fatal} ) ) {
$self->{parse_error_fatal} = 1;
}
# die if the role does not exist
# default true
if ( !defined( $self->{missing_role_fatal} ) ) {
$self->{missing_role_fatal} = 1;
}
# default to false, config overwrites role settings
if ( !defined( $self->{roles_merge_after} ) ) {
$self->{roles_merge_after} = 0;
}
return $self;
}
sub get {
my ( $self, $item, $server ) = @_;
$server = $self->__get_hostname_for($server);
my $result = {};
# keep this out here so generated when the files are loaded
# keep it around later for role processing
my %template_vars;
if ( $self->__cache->valid( $self->__cache_key() ) ) {
$result = $self->__cache->get( $self->__cache_key() );
}
else {
my @files = $self->_get_cmdb_files( $item, $server );
Rex::Logger::debug( Dumper( \@files ) );
# configuration variables
my $config_values = Rex::Config->get_all;
for my $key ( keys %{$config_values} ) {
if ( !exists $template_vars{$key} ) {
$template_vars{$key} = $config_values->{$key};
}
}
$template_vars{environment} = Rex::Commands::environment();
for my $file (@files) {
Rex::Logger::debug("CMDB - Opening $file");
if ( -f $file ) {
my $content = eval { local ( @ARGV, $/ ) = ($file); <>; };
my $t = Rex::Config->get_template_function();
$content .= "\n"; # for safety
$content = $t->( $content, \%template_vars );
my ( $ref, $parse_error ) = from_toml($content);
# only merge it if we have a actual result
if ( defined($ref) ) {
$result = $self->{merger}->merge( $result, $ref );
}
else {
my $error = 'Failed to parse TOML config file "' . $file . '" with error... ' . $parse_error;
if ( $self->{parse_error_fatal} ) {
die($error);
}
else {
warn($error);
}
}
}
}
}
# if use_roles is true, process the roles variablesif set
# the item has roles and that the roles is a array
if ( $self->{use_roles}
&& ( defined( $result->{roles} ) )
&& ( ref( $result->{roles} ) eq 'ARRAY' ) )
{
Rex::Logger::debug("CMDB - Starting role processing");
# load each role
foreach my $role ( @{ $result->{roles} } ) {
Rex::Logger::debug( "CMDB - Processing role '" . $role . "'" );
my $role_file = File::Spec->join( $self->{roles_path}, $role . '.toml' );
# if the file exists, load it
if ( -f $role_file ) {
my $content = eval { local ( @ARGV, $/ ) = ($role_file); <>; };
my $t = Rex::Config->get_template_function();
$content .= "\n"; # for safety
$content = $t->( $content, \%template_vars );
my ( $ref, $parse_error ) = from_toml($content);
# only merge it if we have a actual result
# undef causes the merge feature to wipe it all out
# that and it did error... so we need to handle the error
if ( defined($ref) ) {
# don't let host variables override the role if
# roles_merge_after is true
if ( $self->{roles_merge_after} ) {
$result = $self->{merger}->merge( $ref, $result );
}
else {
$result = $self->{merger}->merge( $result, $ref );
}
}
else {
my $error = 'Failed to parse TOML role file "' . $role_file . '" with error... ' . $parse_error;
if ( $self->{parse_error_fatal} ) {
die($error);
}
else {
warn($error);
}
}
}
else {
my $error = "The role '" . $role . "' is specified by the file '" . $role_file . "' does not eixst";
if ( $self->{missing_role_fatal} ) {
die($error);
}
else {
warn($error);
}
}
}
}
if ( defined $item ) {
return $result->{$item};
}
return $result;
}
sub _get_cmdb_files {
my ( $self, $item, $server ) = @_;
$server = $self->__get_hostname_for($server);
my @files;
if ( !ref $self->{path} ) {
my $env = Rex::Commands::environment();
my $server_file = "$server.toml";
my $default_file = 'default.toml';
@files = (
( run in 0.530 second using v1.01-cache-2.11-cpan-8dfa8b56332 )