#!/usr/bin/perl

use strict;
use warnings;
use lib './lib';

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

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

my $options = {
};

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

pod2usage(-verbose => 2) if $options->{help};

if ($options->{version}) {
    print "fusioninventory-esx $FusionInventory::Agent::Task::ESX::VERSION\n";
    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},
)) {
    exit 1;
}

my $logger = FusionInventory::Agent::Logger->new();

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

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

    if (open my $handle, '>', $file) {
        my $tpp = XML::TreePP->new(indent => 2);
        print $handle $tpp->write({
            REQUEST  => {
                CONTENT  => $inventory->{content},
                DEVICEID => $inventory->{deviceid},
                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> --tag <tag>

  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/ocsinventory

=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.
