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   123 use v5.12.5;
  6         34  
8 6     6   45 use warnings;
  6         18  
  6         349  
9              
10             our $VERSION = '1.14.2.2'; # TRIAL VERSION
11              
12 6     6   38 use base qw(Rex::CMDB::Base);
  6         18  
  6         333  
13              
14 6     6   64 use Rex::Commands -no => [qw/get/];
  6         13  
  6         73  
15 6     6   64 use Rex::Logger;
  6         19  
  6         57  
16 6     6   273 use YAML;
  6         17  
  6         522  
17 6     6   62 use Data::Dumper;
  6         25  
  6         348  
18 6     6   93 use Hash::Merge qw/merge/;
  6         31435  
  6         5634  
19              
20             require Rex::Commands::File;
21              
22             sub new {
23 10     10 0 42 my $that = shift;
24 10   33     102 my $proto = ref($that) || $that;
25 10         45 my $self = {@_};
26              
27 10         96 $self->{merger} = Hash::Merge->new();
28              
29 10 100       1874 if ( !defined $self->{merge_behavior} ) {
30             $self->{merger}->specify_behavior(
31             {
32             SCALAR => {
33 22     22   1065 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   667 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   11873 HASH => sub { Hash::Merge::_merge_hashes( $_[0], $_[1] ) },
46             },
47             },
48 8         286 'REX_DEFAULT',
49             ); # first found value always wins
50              
51 8         443 $self->{merger}->set_behavior('REX_DEFAULT');
52             }
53             else {
54 2 50       14 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         13 $self->{merger}->set_behavior( $self->{merge_behavior} );
61             }
62             }
63              
64 10         639 bless( $self, $proto );
65              
66 10         983 return $self;
67             }
68              
69             sub get {
70 43     43 0 208 my ( $self, $item, $server ) = @_;
71              
72 43         236 $server = $self->__get_hostname_for($server);
73              
74 43         122 my $result = {};
75              
76 43 100       240 if ( $self->__cache->valid( $self->__cache_key() ) ) {
77 10         31 $result = $self->__cache->get( $self->__cache_key() );
78             }
79             else {
80              
81 33         334 my @files = $self->_get_cmdb_files( $item, $server );
82              
83 33         670 Rex::Logger::debug( Dumper( \@files ) );
84              
85             # configuration variables
86 33         553 my $config_values = Rex::Config->get_all;
87 33         103 my %template_vars;
88 33         72 for my $key ( keys %{$config_values} ) {
  33         354  
89 37 50       243 if ( !exists $template_vars{$key} ) {
90 37         332 $template_vars{$key} = $config_values->{$key};
91             }
92             }
93 33         179 $template_vars{environment} = Rex::Commands::environment();
94              
95 33         102 for my $file (@files) {
96 132         4917 Rex::Logger::debug("CMDB - Opening $file");
97 132 100       2684 if ( -f $file ) {
98              
99 94         285 my $content = eval { local ( @ARGV, $/ ) = ($file); <>; };
  94         983  
  94         7587  
100 94         977 my $t = Rex::Config->get_template_function();
101 94         502 $content .= "\n"; # for safety
102 94         320 $content = $t->( $content, \%template_vars );
103              
104 94         657 my $ref = YAML::Load($content);
105              
106 94         532246 $result = $self->{merger}->merge( $result, $ref );
107             }
108             }
109             }
110              
111 43 100       3040 if ( defined $item ) {
112 17         242 return $result->{$item};
113             }
114             else {
115 26         253 return $result;
116             }
117              
118             }
119              
120             sub _get_cmdb_files {
121 39     39   10786 my ( $self, $item, $server ) = @_;
122              
123 39         203 $server = $self->__get_hostname_for($server);
124              
125 39         104 my @files;
126              
127 39 100       281 if ( !ref $self->{path} ) {
    100          
    50          
128 35         387 my $env = Rex::Commands::environment();
129 35         192 my $server_file = "$server.yml";
130 35         223 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         2297 File::Spec->join( $self->{path}, $default_file ),
136             );
137             }
138             elsif ( ref $self->{path} eq "CODE" ) {
139 2         33 @files = $self->{path}->( $self, $item, $server );
140             }
141             elsif ( ref $self->{path} eq "ARRAY" ) {
142 2         14 @files = @{ $self->{path} };
  2         48  
143             }
144              
145 39         924 my $os = Rex::Hardware::Host->get_operating_system();
146              
147             @files = map {
148 39         263 $self->_parse_path( $_, { hostname => $server, operatingsystem => $os, } )
  156         1883  
149             } @files;
150              
151 39         650 return @files;
152             }
153              
154             1;
155              
156             __END__