#!/usr/bin/perl -w 
#
# This TFTP test script will attempt to fetch a file from a tftp server,
# and will verify it receives a non-empty file.
#
# Requires Net::TFTP
#
# Arguments: '-f filename hostname [...]'
#
# Author: David Nolan, Carnegie Mellon University, Computing Services
# Contact: net-dev@andrew.cmu.edu


#
# Copyright (c) 2002 Carnegie Mellon University. All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
#    this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# 3. The name "Carnegie Mellon University" must not be used to endorse or
#    promote products derived from this software without prior written
#    permission. For permission or any legal details, please contact:
#      Office of Technology Transfer
#      Carnegie Mellon University
#      5000 Forbes Avenue
#      Pittsburgh, PA 15213-3890
#      (412) 268-4387, fax: (412) 268-7395
#      tech-transfer@andrew.cmu.edu
#
# 4. Redistributions of any form whatsoever must retain the following
#    acknowledgment: "This product includes software developed by Computing
#    Services at Carnegie Mellon University (http://www.cmu.edu/computing/)."
#
# CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
# IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE FOR ANY SPECIAL,
# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.

use Net::TFTP;
use Getopt::Std;

getopt('f');

if (!defined $opt_f) {
    print "\nNo file to fetch, aborting.\n";
    exit 0;
}


foreach $host (@ARGV) {

    eval {
	if (-f "/tmp/tftp.$$") {
	    unlink "/tmp/tftp.$$";
	}

	my $tftp = Net::TFTP->new($host, BlockSize => 1024);

	$tftp->ascii;

	$tftp->get($opt_f, "/tmp/tftp.$$");

	my $err = $tftp->error;

	if ($err) {
	    push @failures, $host;
	    push @longerr, "$host: TFTP error $err";
	} else {
	    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat("/tmp/tftp.$$");	    
	    if (!$size) {
		push @failures, $host;
		push @longerr, "$host: Zero length file received";
	    }
	}
    };

    if ($EVAL_ERROR && ($EVAL_ERROR =~ /Timeout/ )) {
	push @failures, $host;
	push @longerr, "$host: Request timed out.";
    } elsif ($EVAL_ERROR) {
	push @longerr, "$host: $EVAL_ERROR";
	push @failures, $host;
    }
}

if (-f "/tmp/tftp.$$") {
    unlink "/tmp/tftp.$$";
}

if (!@failures) {
    exit 0;
}

print join(" ", @failures),"\n";
print join("\n", @longerr), "\n";
exit scalar @failures;




