--- lib/PXElator/tftpd.pm 2009/07/30 15:23:16 59 +++ lib/PXElator/tftpd.pm 2009/07/31 19:59:28 93 @@ -5,27 +5,32 @@ use Net::TFTPd 0.03 qw(%OPCODES); use Data::Dump qw/dump/; +use Module::Refresh; use server; +our $debug = server::debug; + our $dir = "$server::base_dir/tftp"; sub path { my $glob = shift; - my $path = glob("$dir/$glob"); + my $path = (glob("$dir/$glob"))[0]; die "can't find anything for $dir/$glob" unless $path; -warn $path; + warn 'path ', $path if $debug; $path =~ s{^$dir}{}; return $path; } +STDERR->autoflush(1); + sub transfer_status { my $req = shift; if( $req->{'_REQUEST_'}{'OPCODE'} eq $OPCODES{'RRQ'} ) { - printf "RRQ %u\/%u\r", $req->{'_REQUEST_'}{'LASTACK'}, $req->{'_REQUEST_'}{'LASTBLK'}; + printf STDERR "RRQ %s %u\/%u\r", map { $req->{_REQUEST_}->{$_} } ( 'FileName', 'LASTACK', 'LASTBLK' ); } elsif ( $req->{'_REQUEST_'}{'OPCODE'} eq $OPCODES{'WRQ'} ) { die "WRQ disabled"; - printf "WRQ: %u\/%u\n", $req->{'_REQUEST_'}{'LASTBLK'}, $req->{'_REQUEST_'}{'LASTACK'}; + printf STDERR "WRQ: %u\/%u\n", $req->{'_REQUEST_'}{'LASTBLK'}, $req->{'_REQUEST_'}{'LASTACK'}; } else { warn "IGNORED: ", dump( $req ); } @@ -34,19 +39,22 @@ sub tftp_request { my $request = shift; + warn 'request: ', dump( $request ) if $debug; + if ( $request->{RootDir} ne $dir ) { $request->{RootDir} = $dir; warn "new root: $dir"; } + my $file = $request->{'_REQUEST_'}{'FileName'}; # received request - printf "Received a %s for file '%s'\n", $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}}, $request->{'_REQUEST_'}{'FileName'}; + print $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}}, " $file\n"; # process the request if( $request->processRQ() ) { - print "OK, transfer completed successfully\n"; + print "\nOK completed $file ", -s "$dir/$file", "\n"; } else { - warn Net::TFTPd->error; + print "ERROR ", Net::TFTPd->error, "\n"; $request->processRQ(); } @@ -71,14 +79,16 @@ Debug => 99, ) || die Net::TFTPd->error; - warn 'listener: ',dump( $listener ); + warn 'listener: ',dump( $listener ) if $debug; + + printf "TFTP listen %s:%d timeout: %d dir: $dir\n", + $listener->{LocalAddr}, + $listener->{LocalPort}, + $listener->{Timeout}; while(1) { - - printf "TFTP listen %s:%d timeout: %d dir: $dir\n", - $listener->{LocalAddr}, - $listener->{LocalPort}, - $listener->{Timeout}; + + Module::Refresh->refresh; # wait for any request (RRQ or WRQ) if(my $request = $listener->waitRQ()) {