Recently in General Administration Category

Web monitor using Perl and curl

| 1 Comment | No TrackBacks

Monitoring your website or webapp for issues is crucial.  There are many options available, both open source and vendor.  In the past I've used Nagios, which works great.  As with any "end all be all" infrastructure monitoring software, Nagios is not exactly a quick easy install and configuration.  However if you have the time I do recommend using Nagios.  When properly setup and configured, it makes life *much* easier as a Sys Admin.  And you don't have to worry about a user, or worse, management finding the problem first.

The alternative to monitoring software is good ol' fashioned scripts via cron.  When time and resources don't allow, scripts work great if done right.  For this post, I'm sharing a Perl script which uses libcurl via WWW::Curl to monitor a web application and will send an email alert if there is a problem.  Initially I had used Net::HTTP to issue a simple HTTP request and parse the resulting HTTP code.  This works fine, but what if I need to login to the site first?  Curl is basically a command line web browser so it will allow you to login to a site, store cookies, follow redirects, etc.  This script uses a config file for it's options.  I tried just plain command-line switches at first, but it started getting messy and I'd like to support all of libcurl's options.  That being said, the hardest part of using this script is figuring out which of the libcurl options you need and how they work together.  If you're familiar with the curl command, most of the switches directly map to the libcurl-easy interface options. 

On to some of the specifics.  Here are the prerequisites for the script:

  • Linux/UNIX
  • Perl
  • curl
  • Getopt::Long
  • Mail::Sendmail
  • HTTP::Status
  • WWW::Curl
  • Config::General

The general logic of the script is as follows:

READ config
SET curl options
PERFORM curl request
PARSE result
CHECK http code
  ALERT IF http error code
  ALERT IF unexpected http code
  ALERT IF timeout reached
DONE

If no HTTP codes are specified in the config file the defaults will be used.  That is, an error code is anything greater than or equal to 400 and unexpected codes are any other than 200 and less than 400.  See here for specifics on status codes. 

The configuration options are case insensitive so feel free to use whatever case you like for readability.  Below is an example configuration.  Using these settings will simply hit the URL and send an alert email if there is a problem.

# ---------------------------------------------------------------------------
# monitor-site.pl Config File
# ---------------------------------------------------------------------------

# General settings
repeat = 1        # Only repeat the alert once
threshhold = 3600 # Only alert an hour later after the initial alert
timeout = 600     # Alert if the request takes longer than 10 seconds

# Alert email options
<alert>
  # Required
  To = andy@coderfoo.com

  # Optional
  From = admin@coderfoo.com
  Subject = "Critical Issue!" 

  # Define HTTP Code alerts. Any code not defined here will be "unexpected"
  Error = 400-417,500-505
  Ok = 200
</alert>

# Libcurl options, all are supported
<curlopts>
  # Required
  CURLOPT_URL = http://www.coderfoo.com

  # Optional (See the libcurl docs for options)
</curlopts>

Note that the only required options are "to" within the <alert> block and "curlopt_url" in the <curlopts> block.  If the "repeat" and/or "threshhold" options are used, a hidden file called .monitor will be created to track the results of the last run.

Here is a link to a tar-gz of the monitor:

http://www.coderfoo.com/source/monitor-site.tar.gz

See the README file in this package for information on installation and running the script.

This is a "one-liner" that I use sometimes to find files that contain carriage returns.  Some files containing carriage returns were committed to a Subversion repository that I manage. These files caused the diff to be corrupt when diffing against a file without the \r.  Not a huge issue, but annoying.

This command basically uses a for loop with find to recursively list all files starting from the current directory.  In the loop, each file is dumped into a small Perl one-liner that checks each line for a \r and increments a counter.  The grep at the end filters out all files with a zero count.  You could change \r to anything you want to find.

prompt:~# for a in `find . -type f`; do echo -n "$a: "; perl -e 'my $cr = 0; while (<STDIN>){ $cr += tr/\r//; } print $cr;' < $a; echo; done | grep -v '0$'

This produces a list of files with a count of characters found.

./someapp.cgi: 36
./anotherapp.cgi: 41
./somedir/yetanother.cgi: 199

Pages

About this Archive

This page is an archive of recent entries in the General Administration category.

General Development is the next category.

Find recent content on the main index or look in the archives to find all content.

Powered by Movable Type 4.261