added timestamp and moved Module::Refresh->refresh into server
[pxelator] / lib / PXElator / tftpd.pm
index d67ff88..8a8212f 100644 (file)
@@ -8,45 +8,57 @@ use Data::Dump qw/dump/;
 
 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();
        }
 
@@ -71,20 +83,20 @@ sub start {
                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;
                }
 
        }