commit 7252840bf32490df878ce8751425da655a39705f Author: Brian Buchalter Date: Sun Feb 26 08:48:02 2012 -0400 Initial commit diff --git a/README b/README new file mode 100644 index 0000000..e3b0871 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +Retrieve an http/s url and checks its application type is application/json and the response content decodes properly into JSON. +Optionally verify content is found using data file. + +--help shows this message +--version shows version information + +USAGE: check_http_json.pl -U http://my.url.com -d sample.data + +-U URL to retrieve (http or https) +-d absolute path to data file containing hash to find with JSON response +-t Timeout in seconds to wait for the URL to load. If the page fails to load, + Nagios check_http_json will exit with UNKNOWN state (default 60) diff --git a/check_json.pl b/check_json.pl new file mode 100755 index 0000000..f80df30 --- /dev/null +++ b/check_json.pl @@ -0,0 +1,127 @@ +#!/usr/bin/perl + +use warnings; +use strict; +use Getopt::Std; +use LWP::UserAgent; +use JSON 'decode_json'; + +my $plugin_name = "Nagios check_http_json"; +my $VERSION = "1.00"; + +# getopt module config +$Getopt::Std::STANDARD_HELP_VERSION = 1; + +# nagios exit codes + use constant EXIT_OK => 0; + use constant EXIT_WARNING => 1; + use constant EXIT_CRITICAL => 2; + use constant EXIT_UNKNOWN => 3; + + +my $status = EXIT_UNKNOWN; + +#parse cmd opts +my %opts; +getopts('vU:t:d:', \%opts); +$opts{t} = 5 unless (defined $opts{t}); +if (not (defined $opts{U}) ) { + print "ERROR: INVALID USAGE\n"; + HELP_MESSAGE(); + exit $status; +} + +my $ua = LWP::UserAgent->new; + +$ua->agent('Redirect Bot ' . $VERSION); +$ua->protocols_allowed( [ 'http', 'https'] ); +$ua->parse_head(0); +$ua->timeout($opts{t}); + +my $response = $ua->get($opts{U}); + +if ( $response->header("content-type") ne 'application/json' ) +{ + print "Expected content-type to be application/json, got ", $response->header("content-type"); + exit EXIT_CRITICAL; +} + + +my $json_response; + +eval { + + $json_response = decode_json($response->content); + print "JSON repsonse decoded successfully." + +} or do { + print "Unable to decode JSON, invalid response?"; + exit EXIT_CRITICAL; +}; + + +if ($opts{d}) { + + if ( -e $opts{d}) { + + my $hash_import = do $opts{d}; + + my %attr_check = %{$hash_import}; + + my @errors; + + for my $key (sort keys %attr_check) { + for my $attr (sort keys %{$attr_check{$key}}) { + my $have = $json_response->{products}{$key}{now}{$attr}; + my $expect = $attr_check{$key}{$attr}; + push @errors, "For key $key, attribute $attr, expected '$expect', but got '$have'" + unless $have eq $expect; + } + } + + if (@errors) { + print "Errors:\n", map { "$_\n" } @errors; + $status = EXIT_CRITICAL; + } + else { + print "Found expected content."; + $status = EXIT_OK; + } + } + else { + print "Unable to find data file $opts{d}"; + $status = EXIT_UNKNOWN; + } +} + +exit $status; + +sub HELP_MESSAGE +{ + print < { + cityid => 'socal', + age_group => 'youth', + }, + '00138' => { + cityid => 'socal', + age_group => 'adult', + }, + '00011' => { + cityid => 'ny', + age_group => 'youth', + }, + '00009' => { + cityid => 'ny', + age_group => 'adult', + }, +};