File Coverage

lib/Rex/CMDB/YAML.pm
Criterion Covered Total %
statement 80 88 90.9
branch 15 18 83.3
condition 1 3 33.3
subroutine 14 20 70.0
pod 0 2 0.0
total 110 131 83.9


line stmt bran cond sub pod time code
1             #
2             # (c) Jan Gehring
3             #
4              
5             package Rex::CMDB::YAML;
6              
7 6     6   103 use v5.12.5;
  6         39  
8 6     6   36 use warnings;
  6         12  
  6         306  
9              
10             our $VERSION = '1.14.3'; # VERSION
11              
12 6     6   45 use base qw(Rex::CMDB::Base);
  6         14  
  6         266  
13              
14 6     6   43 use Rex::Commands -no => [qw/get/];
  6         21  
  6         81  
15 6     6   59 use Rex::Logger;
  6         19  
  6         63  
16 6     6   316 use YAML;
  6         23  
  6         535  
17 6     6   55 use Data::Dumper;
  6         13  
  6         397  
18 6     6   77 use Hash::Merge qw/merge/;
  6         31538  
  6         5665  
19              
20             require Rex::Commands::File;
21              
22             sub new {
23 10     10 0 45 my $that = shift;
24 10   33     92 my $proto = ref($that) || $that;
25 10         48 my $self = {@_};
26              
27 10         144 $self->{merger} = Hash::Merge->new();
28              
29 10 100       1821 if ( !defined $self->{merge_behavior} ) {
30             $self->{merger}->specify_behavior(
31             {
32             SCALAR => {
33 22     22   1093 SCALAR => sub { $_[0] },
34 0     0   0 ARRAY => sub { $_[0] },
35 0     0   0 HASH => sub { $_[0] },
36             },
37             ARRAY => {
38 0     0   0 SCALAR => sub { $_[0] },
39 11     11   628 ARRAY => sub { $_[0] },
40 0     0   0 HASH => sub { $_[0] },
41             },
42             HASH => {
43 0     0   0 SCALAR => sub { $_[0] },
44 0     0   0 ARRAY => sub { $_[0] },
45 123     123   12546 HASH => sub { Hash::Merge::_merge_hashes( $_[0], $_[1] ) },
46             },
47             },
48 8         263 'REX_DEFAULT',
49             ); # first found value always wins
50              
51 8         475 $self->{merger}->set_behavior('REX_DEFAULT');
52             }
53             else {
54 2 50       16 if ( ref $self->{merge_behavior} eq 'HASH' ) {
55             $self->{merger}
56 0         0 ->specify_behavior( $self->{merge_behavior}, 'USER_DEFINED' );
57 0         0 $self->{merger}->set_behavior('USER_DEFINED');
58             }
59             else {
60 2         11 $self->{merger}->set_behavior( $self->{merge_behavior} );
61             }
62             }
63              
64 10         627 bless( $self, $proto );
65              
66 10         837 return $self;
67             }
68              
69             sub get {
70 43     43 0 223 my ( $self, $item, $server ) = @_;
71              
72 43         263 $server = $self->__get_hostname_for($server);
73              
74 43         134 my $result = {};
75              
76 43 100       228 if ( $self->__cache->valid( $self->__cache_key() ) ) {
77 10         30 $result = $self->__cache->get( $self->__cache_key() );
78             }
79             else {
80              
81 33         260 my @files = $self->_get_cmdb_files( $item, $server );
82              
83 33         711 Rex::Logger::debug( Dumper( \@files ) );
84              
85             # configuration variables
86 33         537 my $config_values = Rex::Config->get_all;
87 33         197 my %template_vars;
88 33         92 for my $key ( keys %{$config_values} ) {
  33         414  
89 37 50       203 if ( !exists $template_vars{$key} ) {
90 37         356 $template_vars{$key} = $config_values->{$key};
91             }
92             }
93 33         183 $template_vars{environment} = Rex::Commands::environment();
94              
95 33         125 for my $file (@files) {
96 132         5045 Rex::Logger::debug("CMDB - Opening $file");
97 132 100       2767 if ( -f $file ) {
98              
99 94         321 my $content = eval { local ( @ARGV, $/ ) = ($file); <>; };
  94         956  
  94         7680  
100 94         916 my $t = Rex::Config->get_template_function();
101 94         486 $content .= "\n"; # for safety
102 94         301 $content = $t->( $content, \%template_vars );
103              
104 94         700 my $ref = YAML::Load($content);
105              
106 94         527828 $result = $self->{merger}->merge( $result, $ref );
107             }
108             }
109             }
110              
111 43 100       2971 if ( defined $item ) {
112 17         270 return $result->{$item};
113             }
114             else {
115 26         276 return $result;
116             }
117              
118             }
119              
120             sub _get_cmdb_files {
121 39     39   8174 my ( $self, $item, $server ) = @_;
122              
123 39         172 $server = $self->__get_hostname_for($server);
124              
125 39         121 my @files;
126              
127 39 100       258 if ( !ref $self->{path} ) {
    100          
    50          
128 35         336 my $env = Rex::Commands::environment();
129 35         169 my $server_file = "$server.yml";
130 35         198 my $default_file = 'default.yml';
131             @files = (
132             File::Spec->join( $self->{path}, $env, $server_file ),
133             File::Spec->join( $self->{path}, $env, $default_file ),
134             File::Spec->join( $self->{path}, $server_file ),
135 35         2322 File::Spec->join( $self->{path}, $default_file ),
136             );
137             }
138             elsif ( ref $self->{path} eq "CODE" ) {
139 2         32 @files = $self->{path}->( $self, $item, $server );
140             }
141             elsif ( ref $self->{path} eq "ARRAY" ) {
142 2         12 @files = @{ $self->{path} };
  2         34  
143             }
144              
145 39         844 my $os = Rex::Hardware::Host->get_operating_system();
146              
147             @files = map {
148 39         306 $self->_parse_path( $_, { hostname => $server, operatingsystem => $os, } )
  156         1865  
149             } @files;
150              
151 39         566 return @files;
152             }
153              
154             1;
155              
156             __END__