# vim:set sw=4 ts=4 sts=4 ft=perl expandtab: package Healthchecks; # ABSTRACT: interact with Healthchecks API use Mojo::Base -base, -signatures; use Mojo::UserAgent; use Mojo::JSON qw(decode_json encode_json); use Carp qw(carp); use Data::Dumper; our $VERSION = "0.01"; has 'url'; has 'apikey'; has 'user'; has 'password'; has 'proxy'; has 'ua' => sub { Mojo::UserAgent->new; }; =encoding utf-8 =head1 SYNOPSIS use Healthchecks; my $hc = Healthchecks->new( url => 'http://hc.example.org', apikey => 'secret_healthchecks_API_key', user => 'http_user', password => 'http_password', proxy => { http => 'http://proxy.example.org', https => 'http://proxy.example.org' } ); $hc->get_check('uuid_or_unique_key'); =head1 DESCRIPTION Client module for L L. =head1 ATTRIBUTES L implements the following attributes. =head2 url my $url = $hc->url; $hc = $hc->url('http://hc.example.org'); MANDATORY. The Healthchecks URL, no default. =head2 apikey my $apikey = $hc->apikey; $hc = $hc->apikey('secret_etherpad_API_key'); MANDATORY. Secret API key, no default =head2 ua my $ua = $hc->ua; $hc = $hc->ua(Mojo::UserAgent->new); OPTIONAL. User agent, default to a Mojo::UserAgent. Please, don't use anything other than a Mojo::Useragent. =head2 user my $user = $hc->user; $hc = $hc->user('bender'); OPTIONAL. HTTP user, use it if your Healthchecks is protected by a HTTP authentication, no default. =head2 password my $password = $hc->password; $hc = $hc->password('beer'); OPTIONAL. HTTP password, use it if your Healthchecks is protected by a HTTP authentication, no default. =head2 proxy my $proxy = $hc->proxy; $hc = $hc->proxy({ http => 'http://proxy.example.org', https => 'http://proxy.example.org' }); OPTIONAL. Proxy settings. If set to { detect => 1 }, Healthchecks will check environment variables HTTP_PROXY, http_proxy, HTTPS_PROXY, https_proxy, NO_PROXY and no_proxy for proxy information. No default. =cut sub _execute { my $c = shift; my $args = shift; if (defined $c->proxy) { if ($c->proxy->{detect}) { $c->ua->proxy->detect; } else { $c->ua->proxy->http($c->proxy->{http}) if defined $c->proxy->{http}; $c->ua->proxy->http($c->proxy->{https}) if defined $c->proxy->{https}; } } my $url = Mojo::URL->new($args->{url} // $c->url); $url->userinfo($c->user.':'.$c->password) if defined $c->user && defined $c->password; my $path = $url->path; $path =~ s#/$##; $url->path($path.'/api/'.$args->{api}) unless $args->{url}; $url->query($args->{query} // {}); my $method = $args->{method} // 'get'; my $res; if (defined $args->{data}) { $res = $c->ua->$method($url => { 'X-Api-Key' => $c->apikey } => json => $args->{data})->result; } else { $res = $c->ua->$method($url => { 'X-Api-Key' => $c->apikey })->result; } return $res->is_success if $args->{success}; if ($res->is_success) { # Can’t use $res->json when json is too large my $json = decode_json($res->body); my $data; if (defined $args->{key}) { $data = (ref($json) eq 'HASH') ? $json->{$args->{key}} : $json; } else { $data = $json; } return (wantarray) ? @{$data}: $data if ref($data) eq 'ARRAY'; return $data; } else { carp Dumper $res->message; return undef; } } =head1 METHODS Healthchecks inherits all methods from Mojo::Base and implements the following new ones. =cut #################### subroutine header begin #################### =head3 get_all_checks Usage : $hc->get_all_checks(); Purpose : Get all checks Returns : An array of checks belonging to the user, optionally filtered by one or more tags. Argument : None See : https://healthchecks.io/docs/api/#list-checks =cut #################### subroutine header end #################### sub get_all_checks($c) { return $c->_execute({ api => 'v1/checks/', key => 'checks' }); } #################### subroutine header begin #################### =head3 get_check Usage : $hc->get_check('uuid_or_unique_key'); Purpose : Get details of a check Returns : A hash, representation of a single check. Argument : Accepts either check's UUID or the unique_key (a field derived from UUID and returned by API responses when using the read-only API key) as argument. MANDATORY See : https://healthchecks.io/docs/api/#get-check =cut #################### subroutine header end #################### sub get_check($c, $uuid) { return $c->_execute({ api => 'v1/checks/'.$uuid }); } #################### subroutine header begin #################### =head3 create_check Usage : $hc->({name => 'foobarbaz'}); Purpose : Create a check Returns : A hash, representation of a single check. Argument : A hash of the check’s options (see API documentation) OPTIONAL See : https://healthchecks.io/docs/api/#create-check =cut #################### subroutine header end #################### sub create_check($c, $data){ return $c->_execute({ api => 'v1/checks/', method => 'post', data => $data }); } #################### subroutine header begin #################### =head3 update_check Usage : $hc->update_check('uuid', { name => 'quux' }); Purpose : Update the configuration of a check Returns : A hash, representation of a single check. Argument : The check's UUID (MANDATORY) and a hash of the check’s options (see API documentation) OPTIONAL See : https://healthchecks.io/docs/api/#update-check =cut #################### subroutine header end #################### sub update_check($c, $uuid, $data){ return $c->_execute({ api => 'v1/checks/'.$uuid, method => 'post', data => $data }); } #################### subroutine header begin #################### =head3 pause_check Usage : $hc->pause_check('uuid'); Purpose : Disables monitoring for a check without removing it. The check goes into a "paused" state. You can resume monitoring of the check by pinging it. Returns : A boolean : true if the check is paused, false otherwise. Argument : The check's UUID MANDATORY See : https://healthchecks.io/docs/api/#pause-check =cut #################### subroutine header end #################### sub pause_check($c, $uuid){ return $c->_execute({ api => 'v1/checks/'.$uuid.'/pause', method => 'post', key => 'status' }) eq 'paused'; } #################### subroutine header begin #################### =head3 delete_check Usage : $hc->delete_check('uuid'); Purpose : Permanently deletes the check from the user's account. Returns : A boolean : true if the check has been successfully deleted, false otherwise. Argument : The check's UUID MANDATORY See : https://healthchecks.io/docs/api/#delete-check =cut #################### subroutine header end #################### sub delete_check($c, $uuid){ return $c->_execute({ api => 'v1/checks/'.$uuid, method => 'delete', success => 1 }); } #################### subroutine header begin #################### =head3 get_check_pings Usage : $hc->get_check_pings('uuid'); Purpose : Get the pings of a check. Returns : An array of pings this check has received. Argument : The check's UUID MANDATORY See : https://healthchecks.io/docs/api/#list-pings =cut #################### subroutine header end #################### sub get_check_pings($c, $uuid){ return $c->_execute({ api => 'v1/checks/'.$uuid.'/pings/', key => 'pings' }); } #################### subroutine header begin #################### =head3 get_check_flips Usage : $hc->get_check_flips('uuid_or_unique_key', { seconds => 3, start => 1592214380, end => 1592217980}); Purpose : Get the "flips" of a check has experienced. Returns : An array of the "flips" the check has experienced. A flip is a change of status (from "down" to "up," or from "up" to "down"). Argument : Accepts either check's UUID or the unique_key (a field derived from UUID and returned by API responses when using the read-only API key) as argument. MANDATORY You can specify an optional hash table to add parameters as query string (see API documentation) See : https://healthchecks.io/docs/api/#list-flips =cut #################### subroutine header end #################### sub get_check_flips($c, $uuid, $query){ return $c->_execute({ api => 'v1/checks/'.$uuid.'/flips/', key => 'flips', query => $query }); } #################### subroutine header begin #################### =head3 get_integrations Usage : $hc->get_all_checks(); Purpose : Get a list of existing integrations Returns : An array of integrations belonging to the project. Argument : None See : https://healthchecks.io/docs/api/#list-channels =cut #################### subroutine header end #################### sub get_integrations($c){ return $c->_execute({ api => 'api/v1/channels/', key => 'channels' }); } #################### subroutine header begin #################### =head3 ping_check Usage : $hc->ping_check('uuid'); Purpose : Ping a check Returns : A boolean : true if the check has been successfully pinged, false otherwise. Argument : The check's UUID MANDATORY See : This is not part of the Healthchecks API but a facility offered by this module =cut #################### subroutine header end #################### sub ping_check($c, $uuid){ return $c->_execute({ url => $c->_execute({ api => 'v1/checks/'.$uuid, key => 'ping_url' }), success => 1 }); } 1; __END__ #################### footer pod documentation begin ################### =head1 INSTALL After getting the tarball on https://metacpan.org/release/Healthchecks, untar it, go to the directory and: perl Makefile.PL make make test make install If you are on a windows box you should use 'nmake' rather than 'make'. =head1 BUGS and SUPPORT You can find documentation for this module with the perldoc command. perldoc Healthchecks Bugs and feature requests will be tracked on: https://framagit.org/fiat-tux/perl-modules/healthchecks/issues The latest source code can be browsed and fetched at: https://framagit.org/fiat-tux/perl-modules/healthchecks git clone https://framagit.org/fiat-tux/perl-modules/healthchecks.git Source code mirror: https://github.com/ldidry/etherpad You can also look for information at: AnnoCPAN: Annotated CPAN documentation http://annocpan.org/dist/Healthchecks CPAN Ratings http://cpanratings.perl.org/d/Healthchecks Search CPAN http://search.cpan.org/dist/Healthchecks =head1 AUTHOR Luc DIDRY CPAN ID: LDIDRY ldidry@cpan.org https://fiat-tux.fr/ =head1 LICENSE Copyright (C) Luc Didry. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut