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   99 use v5.12.5;
  6         34  
8 6     6   48 use warnings;
  6         14  
  6         353  
9              
10             our $VERSION = '1.14.2.3'; # TRIAL VERSION
11              
12 6     6   56 use base qw(Rex::CMDB::Base);
  6         15  
  6         293  
13              
14 6     6   53 use Rex::Commands -no => [qw/get/];
  6         20  
  6         73  
15 6     6   55 use Rex::Logger;
  6         18  
  6         72  
16 6     6   238 use YAML;
  6         22  
  6         475  
17 6     6   43 use Data::Dumper;
  6         15  
  6         361  
18 6     6   77 use Hash::Merge qw/merge/;
  6         30917  
  6         5734  
19              
20             require Rex::Commands::File;
21              
22             sub new {
23 10     10 0 61 my $that = shift;
24 10   33     90 my $proto = ref($that) || $that;
25 10         58 my $self = {@_};
26              
27 10         162 $self->{merger} = Hash::Merge->new();
28              
29 10 100       1818 if ( !defined $self->{merge_behavior} ) {
30             $self->{merger}->specify_behavior(
31             {
32             SCALAR => {
33 22     22   919 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   610 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   12195 HASH => sub { Hash::Merge::_merge_hashes( $_[0], $_[1] ) },
46             },
47             },
48 8         261 'REX_DEFAULT',
49             ); # first found value always wins
50              
51 8         754 $self->{merger}->set_behavior('REX_DEFAULT');
52             }
53             else {
54 2 50       11 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         9 $self->{merger}->set_behavior( $self->{merge_behavior} );
61             }
62             }
63              
64 10         625 bless( $self, $proto );
65              
66 10         1001 return $self;
67             }
68              
69             sub get {
70 43     43 0 200 my ( $self, $item, $server ) = @_;
71              
72 43         208 $server = $self->__get_hostname_for($server);
73              
74 43         159 my $result = {};
75              
76 43 100       285 if ( $self->__cache->valid( $self->__cache_key() ) ) {
77 10         36 $result = $self->__cache->get( $self->__cache_key() );
78             }
79             else {
80              
81 33         355 my @files = $self->_get_cmdb_files( $item, $server );
82              
83 33         684 Rex::Logger::debug( Dumper( \@files ) );
84              
85             # configuration variables
86 33         659 my $config_values = Rex::Config->get_all;
87 33         105 my %template_vars;
88 33         92 for my $key ( keys %{$config_values} ) {
  33         383  
89 37 50       229 if ( !exists $template_vars{$key} ) {
90 37         348 $template_vars{$key} = $config_values->{$key};
91             }
92             }
93 33         198 $template_vars{environment} = Rex::Commands::environment();
94              
95 33         130 for my $file (@files) {
96 132         5230 Rex::Logger::debug("CMDB - Opening $file");
97 132 100       2865 if ( -f $file ) {
98              
99 94         304 my $content = eval { local ( @ARGV, $/ ) = ($file); <>; };
  94         1010  
  94         7992  
100 94         1032 my $t = Rex::Config->get_template_function();
101 94         503 $content .= "\n"; # for safety
102 94         446 $content = $t->( $content, \%template_vars );
103              
104 94         694 my $ref = YAML::Load($content);
105              
106 94         546174 $result = $self->{merger}->merge( $result, $ref );
107             }
108             }
109             }
110              
111 43 100       2995 if ( defined $item ) {
112 17         199 return $result->{$item};
113             }
114             else {
115 26         264 return $result;
116             }
117              
118             }
119              
120             sub _get_cmdb_files {
121 39     39   9374 my ( $self, $item, $server ) = @_;
122              
123 39         168 $server = $self->__get_hostname_for($server);
124              
125 39         167 my @files;
126              
127 39 100       295 if ( !ref $self->{path} ) {
    100          
    50          
128 35         340 my $env = Rex::Commands::environment();
129 35         162 my $server_file = "$server.yml";
130 35         232 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         2427 File::Spec->join( $self->{path}, $default_file ),
136             );
137             }
138             elsif ( ref $self->{path} eq "CODE" ) {
139 2         42 @files = $self->{path}->( $self, $item, $server );
140             }
141             elsif ( ref $self->{path} eq "ARRAY" ) {
142 2         15 @files = @{ $self->{path} };
  2         37  
143             }
144              
145 39         926 my $os = Rex::Hardware::Host->get_operating_system();
146              
147             @files = map {
148 39         292 $self->_parse_path( $_, { hostname => $server, operatingsystem => $os, } )
  156         1930  
149             } @files;
150              
151 39         1089 return @files;
152             }
153              
154             1;
155              
156             __END__