#!/usr/bin/perl

use strict;
use warnings;

use lib './lib';
use setup;

use English qw(-no_match_vars) ;
use Getopt::Long;
use Pod::Usage;

use FusionInventory::Agent::Task::ESX;
use FusionInventory::Agent::Logger;
use FusionInventory::Agent::Version;

my $options = {
};

GetOptions(
    $options,
    'host=s',
    'user=s',
    'password=s',
    'directory=s',
    'tag=s',
    'help',
    'version',
) or pod2usage(-verbose => 0);

pod2usage(-verbose => 0, -exitstatus => 0) if $options->{help};

if ($options->{version}) {
    my $PROVIDER = $FusionInventory::Agent::Version::PROVIDER;
    map { print $_."\n" }
        "fusioninventory-esx $FusionInventory::Agent::Task::ESX::VERSION",
        "based on $PROVIDER Agent v$FusionInventory::Agent::Version::VERSION",
        @{$FusionInventory::Agent::Version::COMMENTS};
    exit 0;
}

pod2usage(-verbose => 0) unless
    $options->{host}      and
    $options->{user}      and
    $options->{password}  and
    $options->{directory};

my $esx = FusionInventory::Agent::Task::ESX->new(
    target => {},
);

if (!$esx->connect(
    host     => $options->{host},
    user     => $options->{user},
    password => $options->{password},
)) {
    die "Connection failure: ".$esx->lastError()."\n";
}

my $hasError = 0;
my $hostIds = $esx->getHostIds();
foreach my $hostId (@$hostIds) {
    my $inventory = $esx->createInventory($hostId, $options->{tag});

    my $file =  $options->{directory} . '/' . $inventory->getDeviceId() . ".ocs";

    if (open my $handle, '>', $file) {
        my $tpp = XML::TreePP->new(indent => 2);
        print $handle $tpp->write({
            REQUEST  => {
                CONTENT  => $inventory->getContent(),
                DEVICEID => $inventory->getDeviceId(),
                QUERY    => "INVENTORY",
            }
        });

        close $handle;
        print("Inventory saved in $file\n");
    } else {
        $hasError = 1;
        print("Can't write to $file: $ERRNO\n");
    }

}
exit($hasError);
__END__

=head1 NAME

fusioninventory-esx - vCenter/ESX/ESXi remote inventory from command line

=head1 SYNOPSIS

fusioninventory-esx --host <host> --user <user> --password <password> --directory <directory>

  Options:
    --help                 this menu
    --host hostname        ESX server hostname
    --user username        user name
    --password xxxx        user password
    --directory directory  output directory
    --tag tag              tag for the inventoried machine

=head1 EXAMPLES

    % fusioninventory-esx --host myesx --user foo --password bar --directory /tmp


You can import the .ocs file in your inventory server with the fusioninventory-injector tool.

    %fusioninventory-injector -v --file /tmp/*.ocs -u https://myserver/plugins/fusioninventory/

=head1 DESCRIPTION

F<fusioninventory-esx> creates inventory of remote ESX/ESXi and vCenter VMware.
It uses the SOAP interface of the remote server.

Supported systems:

=over 4

=item F<ESX and ESXi 3.5>

=item F<ESX and ESXi 4.1>

=item F<ESXi 5.0>

=item F<vCenter 4.1>

=item F<vCenter 5.0>

=back


Active Directory users, please note the AD authentication doesn't work. You must
create a account on the VMware server.

=head1 LIMITATION

So far, ESX serial number are not collected.

=head1 SECURITY

The SSL hostname check of the server is disabled.
