FusionInventory-Agent
view release on metacpan or search on metacpan
bin/fusioninventory-injector view on Meta::CPAN
open (my $handle, '<', $file) or die "can't open file $file: $ERRNO\n";
## no critic (ProhibitBitwise)
flock ($handle, LOCK_EX | LOCK_NB) or die "can't lock file $file: $ERRNO\n";
local $RS;
my $content = <$handle>;
close $handle or die "Can't close file $file: $ERRNO\n";
my $success = sendContent($content);
if ($success && $options->{remove}) {
unlink $file or warn "Can't remove $file: $ERRNO\n";
}
push @failedFiles, $file unless $success;
}
sub loaddirectory {
my ($directory) = @_;
die "directory $directory does not exist\n" unless -d $directory;
die "directory $directory is not readable\n" unless -r $directory;
opendir (my $handle, $directory)
or die "can't open directory $directory: $ERRNO\n";
foreach my $file (sort readdir($handle)) {
next if $file =~ /^..?$/ ;
if (-d "$directory/$file") {
loaddirectory("$directory/$file") if ($options->{recursive});
} else {
loadfile("$directory/$file") if $file =~ /\.(?:ocs|xml)$/;
}
}
closedir $handle;
}
sub loadstdin {
my $content;
undef $RS;
$content = <STDIN>;
push @failedFiles, 'STDIN DATA' unless sendContent($content);
}
sub sendContent {
my $content = shift;
my $useragent = $options->{useragent};
if (uncompress($content)) {
$content = uncompress($content);
}
if ($options->{"xml-ua"}) {
my $tpp = XML::TreePP->new();
my $tree = $tpp->parse( $content );
$useragent = $tree->{REQUEST}->{CONTENT}->{VERSIONCLIENT}
if $tree && $tree->{REQUEST} && $tree->{REQUEST}->{CONTENT} &&
$tree->{REQUEST}->{CONTENT}->{VERSIONCLIENT};
}
my $ua = LWP::UserAgent->new(
agent => $useragent,
parse_head => 0, # No need to parse HTML
keep_alive => 1,
requests_redirectable => ['POST', 'GET', 'HEAD']
);
my $request = HTTP::Request->new( POST => $options->{url} );
my $info = "";
if ($options->{"no-ssl-check"}) {
my $url = $request->uri();
if ($url->scheme() eq 'https') {
if ($ua->can('ssl_opts')) {
$ua->ssl_opts(verify_hostname => 0, SSL_verify_mode => 0);
$info = " (ssl check disabled)";
} else {
$info = " (unsupported ssl options)";
}
}
}
$request->header(
'Pragma' => 'no-cache',
'Content-type', $options->{"no-compression"} ? 'Application/xml' : 'Application/x-compress'
);
$request->content($options->{"no-compression"} ? $content : compress($content));
my $res = $ua->request($request);
my $error;
eval {
$content = $res->content;
$content = uncompress($content) if $res->header('Content-type') =~ /x-compress-zlib/;
my $tpp = XML::TreePP->new();
my $tree = $tpp->parse($content);
$error = $tree->{REPLY}->{ERROR}
if ref($tree->{REPLY}) eq 'HASH' && exists($tree->{REPLY}->{ERROR});
};
if ($options->{verbose}) {
print $error ? "ERROR: $error" :
$res->is_success() ? "OK" :
"ERROR: ".$res->status_line(), "$info\n";
}
return $res->is_success() && ! $error ;
}
__END__
=head1 NAME
fusioninventory-injector - A tool to push inventory in an OCS Inventory or compatible server.
=head1 SYNOPSIS
fusioninventory-injector [options] [--file <file>|--directory <directory>|--stdin|--useragent <user-agent>]
Options:
-h --help this menu
-d --directory load every .ocs files from a directory
-R --recursive recursively load .ocs files from <directory>
-f --file load a specific file
-u --url server URL
-r --remove remove succesfuly injected files
( run in 2.787 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )