Rex
view release on metacpan or search on metacpan
lib/Rex/CMDB/YAML.pm view on Meta::CPAN
ARRAY => sub { $_[0] },
HASH => sub { $_[0] },
},
HASH => {
SCALAR => sub { $_[0] },
ARRAY => sub { $_[0] },
HASH => sub { Hash::Merge::_merge_hashes( $_[0], $_[1] ) },
},
},
'REX_DEFAULT',
); # first found value always wins
$self->{merger}->set_behavior('REX_DEFAULT');
}
else {
if ( ref $self->{merge_behavior} eq 'HASH' ) {
$self->{merger}
->specify_behavior( $self->{merge_behavior}, 'USER_DEFINED' );
$self->{merger}->set_behavior('USER_DEFINED');
}
else {
$self->{merger}->set_behavior( $self->{merge_behavior} );
}
}
bless( $self, $proto );
return $self;
}
sub get {
my ( $self, $item, $server ) = @_;
$server = $self->__get_hostname_for($server);
my $result = {};
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;
my %template_vars;
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 = YAML::Load($content);
$result = $self->{merger}->merge( $result, $ref );
}
}
}
if ( defined $item ) {
return $result->{$item};
}
else {
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.yml";
my $default_file = 'default.yml';
@files = (
File::Spec->join( $self->{path}, $env, $server_file ),
File::Spec->join( $self->{path}, $env, $default_file ),
File::Spec->join( $self->{path}, $server_file ),
File::Spec->join( $self->{path}, $default_file ),
);
}
elsif ( ref $self->{path} eq "CODE" ) {
@files = $self->{path}->( $self, $item, $server );
}
elsif ( ref $self->{path} eq "ARRAY" ) {
@files = @{ $self->{path} };
}
my $os = Rex::Hardware::Host->get_operating_system();
@files = map {
$self->_parse_path( $_, { hostname => $server, operatingsystem => $os, } )
} @files;
return @files;
}
1;
__END__
=head1 NAME
( run in 1.690 second using v1.01-cache-2.11-cpan-364913b4093 )