Code

fix for ePN
[nagiosplug.git] / contrib / check_dl_size.pl
1 #! /usr/bin/perl -wT
3 # (c)2001 Patrick Greenwell, Stealthgeeks, LLC. (patrick@stealthgeeks.net)
4 # Licensed under the GNU GPL
5 # http://www.gnu.org/licenses/gpl.html
6 #
7 # check_dl_size: Attempts to download a specified file via FTP and verify
8 # it is a specified size. 
9 # Requires Net::FTP
11 # Version 1.0
12 # Last Updated: 8/31/01
15 BEGIN {
16         if ($0 =~ m/^(.*?)[\/\\]([^\/\\]+)$/) {
17                 $runtimedir = $1;
18                 $PROGNAME = $2;
19         }
20 }
22 require 5.004;
23 use strict;
24 use Getopt::Long;
25 use vars qw($opt_H $opt_f $opt_s $opt_t $verbose $PROGNAME);
26 use lib $main::runtimedir;
27 use utils qw($TIMEOUT %ERRORS &print_revision &usage &support &is_error);
28 use Net::FTP;
30 sub help ();
31 sub print_help ();
32 sub print_usage ();
33 sub version ();
34 sub display_res($$);
35 my ($ftpfile, $ftpdir, $filesize, $answer) = ();
36 my $state = $ERRORS{'UNKNOWN'};
38 # Directory to place file. If your machine is not secure DO NOT USE /tmp.
39 my $dir = "/usr/local/netsaint/etc/tmp";
41 # Username for login
42 my $user = "anonymous";
44 # Password (PLEASE TAKE APPROPRIATE PRECAUTIONS TO SECURE THIS)
45 my $pass = "guest\@example.com";
48 delete @ENV{'PATH', 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
50 Getopt::Long::Configure('bundling', 'no_ignore_case');
51 GetOptions
52         ("V|version"    => \&version,
53          "h|help"       => \&help,
54          "v|verbose"    => \$verbose,
55          "H|hostname=s" => \$opt_H,
56          "f|filename=s" => \$opt_f,
57          "s|filesize=s" => \$opt_s,
58          "t|timeout=s"  => \$opt_t,
59          );
61 ($opt_H) || ($opt_H = shift) || usage("Host address or name not specified\n");
62 my $host = $1 
63         if ($opt_H =~ m/^(([0-9]{1,3}\.){3}[0-9]{1,3}|(([a-z0-9]+(\-+[a-z0-9]+)*|\.))+[a-z])$/i); 
64         usage("Please provide a valid IP address or host name\n") unless ($host);
66 ($opt_f) || ($opt_f = shift) || usage("File name not specified\n");
68 if ($opt_f =~ m/^(.*?)[\/\\]([^\/\\]+)$/) {
69         $ftpdir = $1;
70         $ftpfile = $2;
71 }
73 ($opt_s) || ($opt_s = shift) || usage("File size not specified\n");
74 usage("File size must be numeric value") unless ($opt_s =~ m/^[0-9]+$/);
76 (($opt_t) && ($TIMEOUT = $opt_t)) || ($TIMEOUT = 120);
77 usage("TIMEOUT must be numeric value") unless ($TIMEOUT =~ m/^[0-9]+$/);
79 # Don't hang if there are timeout issues
80 $SIG{'ALRM'} = sub {
81         print ("ERROR: No response from ftp server (alarm)\n");
82         exit $ERRORS{'UNKNOWN'};
83 };
84 alarm($TIMEOUT);
86 # Make certain temporary directory exists
88 if ( ! -e "$dir" ) {
89         display_res("Temporary directory $dir does not exist.\n", "CRITICAL");
91 }
93 # Remove existing file if any
95 if ( -e "$dir/$ftpfile") {
96           unlink "$dir/$ftpfile"  or 
97           display_res("Can't remove existing file $dir/$ftpfile.\n", "CRITICAL");
98 }
99     
100 # Snarf file
102 my $ftp = Net::FTP->new("$host", Passive => 1, Timeout => $TIMEOUT) or
103           display_res("Can't connect to $host.\n", "CRITICAL");
104           $ftp->login("$user","$pass") or 
105                   display_res("Login to $host failed", "CRITICAL");
106           $ftp->cwd("$ftpdir") or 
107                   display_res("Can't change to directory $ftpdir.\n", "CRITICAL");
108           $ftp->get($ftpfile, "$dir/$ftpfile") or 
109                   display_res("Can't retrieve file $ftpfile.\n", "CRITICAL");
110           $ftp->quit;
112 # If file exists and is correct size we are happy.
114 if (( -e "$dir/$ftpfile" ) && (($filesize = -s "/tmp/$ftpfile") eq $opt_s)) {
115         display_res("File $ftpfile size OK: $filesize bytes.\n", "OK");        
116         } else {
117 # Otherwise we are not happy.
118         display_res("File $ftpfile size incorrect: $filesize bytes", "CRITICAL");
121 exit;
123 sub print_usage () {
124         print "Usage: $PROGNAME -H <host> -f <filename> -s <file size in bytes> -t <timeout> \n";
127 sub print_help () {
128         print_revision($PROGNAME,'$ Revision: 1.0 $ ');
129         print "Copyright (c) 2001 Patrick Greenwell, Stealthgeeks, LLC.\n\n";
130         print_usage();
131         support();
134 sub version () {
135         print_revision($PROGNAME,'$ Revision: 1.0 $ ');
136         exit $ERRORS{'OK'};
139 sub help () {
140         print_help();
141         exit $ERRORS{'OK'};
144 sub display_res ($$) {
145         my ($answer, $state) = @_;
146         print $answer;
147         exit $ERRORS{$state};