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;
}
+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();
}
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};
# wait for any request (RRQ or WRQ)
if(my $request = $listener->waitRQ()) {
tftp_request $request;
- } else {
- warn Net::TFTPd->error;
+ } elsif ( my $error = Net::TFTPd->error ) {
+ warn $error;
}
}