Nagios website regex pattern check

Here's a simple perl script that uses curl to search for a regex pattern on a website.

It returns status values that are Nagios compatible. This means you can write a command definition for Nagios that looks like this:

# regex check
define command{
        command_name    check_regex
        command_line    /usr/lib/nagios/plugins/check_regex $ARG1$ $ARG2$

And write a couple of service definitions like this:

define service {
        host_name                       foo
        service_description           foo regex
        check_command              check_regex!!pages from Australia
        use                                 generic-service
        contact_groups                admins

define service {
        host_name                       foo
        service_description           another foo regex
        check_command              check_regex!!Drupal
        use                                 generic-service
        contact_groups                admins

And then you'll have Nagios reporting OK or CRITICAL results based on whether these patterns are found on the appropriate site.

The output is like this:

toot:~# /usr/lib/nagios/plugins/check_regex Drupal
OK - looked for Drupal on
toot:~# /usr/lib/nagios/plugins/check_regex Drupaal
CRITICAL - looked for Drupaal on

Here is check_regex:

# Check a site and if regex not found, do $stuff
use strict;
use warnings;
use WWW::Curl::Easy;
# Get host and regex from stdin
my $url = $ARGV[0];
my $regex = $ARGV[1];
my $status = "";
my $help = "";
my %nagios_returnvalue = (
    'OK'       => 0,
    'WARNING'  => 1,
    'CRITICAL' => 2,
    'UNKNOWN'  => 3,
&help if $help;
&help unless $url;
&help unless $regex;
&help if $ARGV[2];
# Init the curl session
my $curl= WWW::Curl::Easy->new() or die "curl init failed!\n";
# Give curl the URL to use
$curl->setopt(CURLOPT_URL, $url);
# a subroutine which is called for each 'chunk' as the file is received.
sub body_callback {
    my ($chunk,$context)=@_;
    # add the chunk we received to the end of the array we've been given
   push @{$context}, $chunk;
    return length($chunk); # OK
# configure which subroutine to call when some data comes in
$curl->setopt(CURLOPT_WRITEFUNCTION, \&body_callback);
my @body;
# tell the subroutine which array to put the data into
$curl->setopt(CURLOPT_FILE, \@body);
if ($curl->perform() != 0) {
    print "Failed ::".$curl->errbuf."\n";
my $output = join("",@body);
if ($output =~ m/$regex/) {
    $status = "OK";
else {
  $status = "CRITICAL";
# create output for Nagios
my $msg = sprintf "%s - looked for %s on %s", $status, $regex, $url;
print "$msg\n";
exit $nagios_returnvalue{$status};
sub help {
    print <<"EOF";
./check_regex <url> <regex>