diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2020-04-25 04:43:17 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2020-04-25 04:43:17 +1200 |
commit | c5c13fa16d7ab2a7577c676ec537e50ced813b7b (patch) | |
tree | 52de420f8edeaa9b86bacc1fe7811dc153333d8f /libexec/check_ftp | |
download | nagios-check-ftp-c5c13fa16d7ab2a7577c676ec537e50ced813b7b.tar.gz nagios-check-ftp-c5c13fa16d7ab2a7577c676ec537e50ced813b7b.zip |
Version 1.00v1.00
Diffstat (limited to 'libexec/check_ftp')
-rw-r--r-- | libexec/check_ftp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/libexec/check_ftp b/libexec/check_ftp new file mode 100644 index 0000000..a36dfd3 --- /dev/null +++ b/libexec/check_ftp @@ -0,0 +1,96 @@ +#!perl +# +# Check that we can connect to an FTP server, with opportunistic TLS; the +# check_ftp plugin that comes with Monitoring::Plugin doesn't do this. +# +# Author: Tom Ryder <tom@sanctum.geek.nz> +# License: MIT +# +package main; + +# Force me to write this properly +use strict; +use warnings; +use utf8; + +# Require at least this Perl version +use 5.010_001; + +# Import required modules +use English qw(-no_match_vars); +use Exception::Class ( PluginException => { alias => 'throw' } ); +use Monitoring::Plugin; +use Net::FTP; +use Try::Tiny; + +# Decree package version +our $VERSION = '1.00'; + +# Add description and license package variables +our $DESCRIPTION = <<'EOF'; +This plugin makes an FTP connection to a nominated server, optionally including +a STARTTLS upgrade for FTPS. It does not support implicit FTPS. +EOF +our $LICENSE = <<'EOF'; +MIT License <https://opensource.org/licenses/MIT> +EOF + +# Custom plugin options +our @OPTS = ( + { + spec => 'hostname|H=s', + help => 'FTP server hostname or address', + label => 'HOSTNAME', + default => 'localhost', + }, + { + spec => 'starttls|S:s', + help => 'Try STARTTLS with optional specified hostname', + label => 'HOSTNAME', + }, +); + +# Build Monitoring::Plugin object +my $mp = Monitoring::Plugin->new( + usage => 'Usage: %s [--hostname|h HOSTNAME] [--starttls|S [SERVERNAME]]', + version => $VERSION, + blurb => $DESCRIPTION, + license => $LICENSE, +); + +# Anything that dies in here raises ->plugin_die +try { + + # Add and read custom options + for my $opt (@OPTS) { + $mp->add_arg( %{$opt} ); + } + $mp->getopts; + + # Start counting down to timeout + alarm $mp->opts->timeout; + + # Attempt FTP connection + my %opts; + if ( length $mp->opts->starttls ) { + $opts{SSL_verifycn_name} = $mp->opts->starttls; + } + defined( my $ftp = Net::FTP->new( $mp->opts->hostname, %opts ) ) + or $mp->plugin_exit( CRITICAL => 'Failed connect' ); + + # If we connected and the server reports that it supports TLS, try it + if ( defined $mp->opts->starttls ) { + my $ssl = $ftp->can_ssl + or throw 'Client can\'t TLS'; + $ftp->feature('AUTH TLS') + or $mp->add_message( WARNING => 'AUTH TLS not listed in features' ); + $ftp->starttls + or $mp->add_message( WARNING => $ssl->errstr || 'STARTTLS error' ); + } + $mp->plugin_exit( $mp->check_messages ); +} +catch { + $mp->plugin_die($_); +}; + +1; |