The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#
# (c) Jan Gehring <jan.gehring@gmail.com>
#
# vim: set ts=2 sw=2 tw=0:
# vim: set expandtab:

package Rex::CMDB;

use strict;
use warnings;

use Rex::Commands;
use Rex::Value;

require Exporter;
use base qw(Exporter);
use vars qw(@EXPORT);
@EXPORT = qw(cmdb);

my $CMDB_PROVIDER;

Rex::Config->register_set_handler(
  "cmdb" => sub {
    my ($option) = @_;
    $CMDB_PROVIDER = $option;
  }
);

=item cmdb([$item, $server])

Function to query a CMDB. If this function is called without $item it should return a hash containing all the information for the requested server. If $item is given it should return only the value for $item.

 task "prepare", "server1", sub {
   my $virtual_host = cmdb("vhost");
   my %all_information = cmdb;
 };

=cut

sub cmdb {
  my ( $item, $server ) = @_;
  $server ||= connection->server;

  my $klass = $CMDB_PROVIDER->{type};
  if ( $klass !~ m/::/ ) {
    $klass = "Rex::CMDB::$klass";
  }

  eval "use $klass";
  if ($@) {
    die("CMDB provider ($klass) not found: $@");
  }

  my $cmdb = $klass->new( %{$CMDB_PROVIDER} );
  return Rex::Value->new( value => $cmdb->get( $item, $server ) );
}

1;