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 )