--- lib/PXElator/tftpd.pm 2009/07/30 15:23:16 59 +++ lib/PXElator/tftpd.pm 2009/08/02 12:09:02 115 @@ -5,48 +5,62 @@ 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); +use progress_bar; + sub transfer_status { - my $req = shift; - if( $req->{'_REQUEST_'}{'OPCODE'} eq $OPCODES{'RRQ'} ) { - printf "RRQ %u\/%u\r", $req->{'_REQUEST_'}{'LASTACK'}, $req->{'_REQUEST_'}{'LASTBLK'}; - } elsif ( $req->{'_REQUEST_'}{'OPCODE'} eq $OPCODES{'WRQ'} ) { + my $request = shift; + my $r = $request->{'_REQUEST_'} || die "no _REQUEST_ in ",dump( $request ); + + if( $r->{'OPCODE'} eq $OPCODES{'RRQ'} ) { + progress_bar::tick( $r->{FileName}, $r->{BlkSize} * $r->{LASTACK}, $r->{BlkSize} * $r->{LASTBLK} ); + } elsif ( $r->{'OPCODE'} eq $OPCODES{'WRQ'} ) { die "WRQ disabled"; - printf "WRQ: %u\/%u\n", $req->{'_REQUEST_'}{'LASTBLK'}, $req->{'_REQUEST_'}{'LASTACK'}; } else { - warn "IGNORED: ", dump( $req ); + warn "IGNORED: ", dump( $request ); } } sub tftp_request { my $request = shift; + warn 'request: ', dump( $request ) if $debug; + + config::for_ip(); + 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"; + + progress_bar::start; # 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 +85,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()) {