summaryrefslogtreecommitdiffstats
path: root/contrib/check_dl_size.pl
blob: e6cbda8bdc2a77554f6e377f21bf6c8b2234a842 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#! /usr/bin/perl -wT

# (c)2001 Patrick Greenwell, Stealthgeeks, LLC. (patrick@stealthgeeks.net)
# Licensed under the GNU GPL
# http://www.gnu.org/licenses/gpl.html
#
# check_dl_size: Attempts to download a specified file via FTP and verify
# it is a specified size. 
# Requires Net::FTP

# Version 1.0
# Last Updated: 8/31/01


BEGIN {
	if ($0 =~ m/^(.*?)[\/\\]([^\/\\]+)$/) {
		$runtimedir = $1;
		$PROGNAME = $2;
	}
}

require 5.004;
use strict;
use Getopt::Long;
use vars qw($opt_H $opt_f $opt_s $opt_t $verbose $PROGNAME);
use lib $main::runtimedir;
use utils qw($TIMEOUT %ERRORS &print_revision &usage &support &is_error);
use Net::FTP;

sub help ();
sub print_help ();
sub print_usage ();
sub version ();
sub display_res($$);
my ($ftpfile, $ftpdir, $filesize, $answer) = ();
my $state = $ERRORS{'UNKNOWN'};

# Directory to place file. If your machine is not secure DO NOT USE /tmp.
my $dir = "/usr/local/netsaint/etc/tmp";

# Username for login
my $user = "anonymous";

# Password (PLEASE TAKE APPROPRIATE PRECAUTIONS TO SECURE THIS)
my $pass = "guest\@example.com";


delete @ENV{'PATH', 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

Getopt::Long::Configure('bundling', 'no_ignore_case');
GetOptions
	("V|version"    => \&version,
	 "h|help"       => \&help,
	 "v|verbose"    => \$verbose,
	 "H|hostname=s" => \$opt_H,
         "f|filename=s" => \$opt_f,
         "s|filesize=s" => \$opt_s,
         "t|timeout=s"  => \$opt_t,
         );

($opt_H) || ($opt_H = shift) || usage("Host address or name not specified\n");
my $host = $1 
        if ($opt_H =~ m/^(([0-9]{1,3}\.){3}[0-9]{1,3}|(([a-z0-9]+(\-+[a-z0-9]+)*|\.))+[a-z])$/i); 
	usage("Please provide a valid IP address or host name\n") unless ($host);

($opt_f) || ($opt_f = shift) || usage("File name not specified\n");

if ($opt_f =~ m/^(.*?)[\/\\]([^\/\\]+)$/) {
        $ftpdir = $1;
        $ftpfile = $2;
}

($opt_s) || ($opt_s = shift) || usage("File size not specified\n");
usage("File size must be numeric value") unless ($opt_s =~ m/^[0-9]+$/);

(($opt_t) && ($TIMEOUT = $opt_t)) || ($TIMEOUT = 120);
usage("TIMEOUT must be numeric value") unless ($TIMEOUT =~ m/^[0-9]+$/);

# Don't hang if there are timeout issues
$SIG{'ALRM'} = sub {
	print ("ERROR: No response from ftp server (alarm)\n");
	exit $ERRORS{'UNKNOWN'};
};
alarm($TIMEOUT);

# Make certain temporary directory exists

if ( ! -e "$dir" ) {
        display_res("Temporary directory $dir does not exist.\n", "CRITICAL");

}

# Remove existing file if any

if ( -e "$dir/$ftpfile") {
          unlink "$dir/$ftpfile"  or 
          display_res("Can't remove existing file $dir/$ftpfile.\n", "CRITICAL");
}
    
# Snarf file

my $ftp = Net::FTP->new("$host", Passive => 1, Timeout => $TIMEOUT) or
          display_res("Can't connect to $host.\n", "CRITICAL");
          $ftp->login("$user","$pass") or 
                  display_res("Login to $host failed", "CRITICAL");
          $ftp->cwd("$ftpdir") or 
                  display_res("Can't change to directory $ftpdir.\n", "CRITICAL");
          $ftp->get($ftpfile, "$dir/$ftpfile") or 
                  display_res("Can't retrieve file $ftpfile.\n", "CRITICAL");
          $ftp->quit;

# If file exists and is correct size we are happy.

if (( -e "$dir/$ftpfile" ) && (($filesize = -s "/tmp/$ftpfile") eq $opt_s)) {
        display_res("File $ftpfile size OK: $filesize bytes.\n", "OK");        
        } else {
# Otherwise we are not happy.
        display_res("File $ftpfile size incorrect: $filesize bytes", "CRITICAL");
}

exit;

sub print_usage () {
	print "Usage: $PROGNAME -H <host> -f <filename> -s <file size in bytes> -t <timeout> \n";
}

sub print_help () {
	print_revision($PROGNAME,'$ Revision: 1.0 $ ');
	print "Copyright (c) 2001 Patrick Greenwell, Stealthgeeks, LLC.\n\n";
	print_usage();
	support();
}

sub version () {
	print_revision($PROGNAME,'$ Revision: 1.0 $ ');
	exit $ERRORS{'OK'};
}

sub help () {
	print_help();
	exit $ERRORS{'OK'};
}

sub display_res ($$) {
        my ($answer, $state) = @_;
        print $answer;
        exit $ERRORS{$state};
}