Monitoring-Icinga2-Client-REST
view release on metacpan or search on metacpan
lib/Monitoring/Icinga2/Client/REST.pm view on Meta::CPAN
package Monitoring::Icinga2::Client::REST;
use strict;
use warnings;
use 5.010_001;
use Carp;
use LWP::UserAgent;
use HTTP::Request;
use URI::Escape;
use JSON;
use Encode qw( encode_utf8 );
use Scalar::Util 'looks_like_number';
use version 0.77; our $VERSION = version->declare('2.0.4');
sub new {
my ($class, $hostname, $port, $path, $version, $insecure) = @_;
my $cafile;
defined $hostname
or croak "hostname argument is required";
unless( looks_like_number($port) ) {
# enable hash-style arg passing
my %args = @_[2..$#_];
$port = $args{port};
$path = $args{path};
$version = $args{version};
$insecure = $args{insecure};
if(defined $args{cacert}) {
# Set ENV variable in case we're using Net::SSL for LWP's HTTPS
$cafile = $ENV{HTTPS_CA_FILE} = $args{cacert};
}
}
my $self = bless {
hostname => $hostname,
port => $port // 5665,
path => $path // '/',
version => $version // 1,
}, $class;
$self->{path} .= "/" unless $self->{path} =~ /\/$/;
$self->{url} = sprintf(
"https://%s:%d%sv%d",
@$self{qw/ hostname port path version /}
);
$self->{ua} = LWP::UserAgent->new(
$insecure ? (
ssl_opts => {
# Don't verify certs with either SSL module used by LWP
verify_hostname => 0,
SSL_verify_callback => sub { 1 },
# Set ca_file for IO::Socket::SSL
defined $cafile ? ( SSL_ca_file => $cafile) : (),
},
) : (),
);
$self->{ua}->default_header( 'Accept' => 'application/json' );
$self->{login_status} = "not logged in";
return $self;
}
sub do_request {
my ( $self, $method, $uri, $params, $data, $plaintext ) = @_;
my $request_url = "$self->{url}/$uri";
$request_url .= '?' . _encode_params($params) if $params;
my $req = HTTP::Request->new( $method => $request_url );
if ($data) {
$data = encode_json($data);
$req->content($data);
}
$self->{res} = $self->{ua}->request($req);
return unless $self->{res}->is_success;
# Try with first plaintext if plaintext is set
if ($plaintext) {
my $str = encode_utf8( $self->{res}->content );
if ($str) {
return $str;
}
}
# Handle non utf8 chars
my $json_result = decode_json( encode_utf8( $self->{res}->content ) );
if ($json_result) {
return $json_result;
}
return;
}
sub _encode_params {
return join '&', map { _encode_param($_) } split /&/, shift;
}
sub _encode_param {
return join '=', map { uri_escape( $_ ) } split /=/, shift;
}
{
my %type2keys = (
CheckCommand => [
[ qw/ arguments command env vars timeout / ],
[ qw/ templates zone / ],
],
Downtime => [
[ qw/ author comment duration end_time entry_time fixed
( run in 1.362 second using v1.01-cache-2.11-cpan-5735350b133 )