/[pxelator]/lib/PXElator/tftpd.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /lib/PXElator/tftpd.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 118 by dpavlin, Mon Aug 3 08:52:32 2009 UTC revision 545 by dpavlin, Sat Oct 9 13:50:38 2010 UTC
# Line 4  use warnings; Line 4  use warnings;
4  use strict;  use strict;
5    
6  use Net::TFTPd 0.03 qw(%OPCODES);  use Net::TFTPd 0.03 qw(%OPCODES);
7    use IO::Socket::INET;
8  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
9    use store;
10    
11  use server;  use server;
12    
# Line 36  sub transfer_status { Line 38  sub transfer_status {
38          }          }
39  }  }
40    
41    use config;
42    
43  sub tftp_request {  sub tftp_request {
44          my $request = shift;          my $request = shift;
45    
46          warn 'request: ', dump( $request ) if $debug;          warn 'request: ', dump( $request ) if $debug;
47    
48          config::for_ip();          if ( my $pid = fork ) {
49                    # parent
50                    warn "# forked $pid\n";
51                    return;
52            }
53    
54    
55            my $ip = $request->{_REQUEST_}->{PeerAddr};
56            config::for_ip( $ip );
57    
58          if ( $request->{RootDir} ne $dir ) {          if ( $request->{RootDir} ne $dir ) {
59                  $request->{RootDir} = $dir;                  $request->{RootDir} = $dir;
# Line 49  sub tftp_request { Line 61  sub tftp_request {
61          }          }
62    
63          my $file = $request->{'_REQUEST_'}{'FileName'};          my $file = $request->{'_REQUEST_'}{'FileName'};
64          # received request          my $opcode = $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}};
65          print $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}}, " $file\n";  
66            my $audit = {
67                    ip => $ip,
68                    opcode => $opcode,
69                    path => $file,
70                    state => 'start',
71            };
72            store::audit( $opcode, $audit );
73    
74          progress_bar::start;          progress_bar::start;
75    
76          # process the request          # process the request
77          if( $request->processRQ() ) {          if( $request->processRQ() ) {
78                  print "\nOK completed $file ", -s "$dir/$file", "\n";                  my $size = -s "$dir/$file";
79                    $audit->{state} = 'finish';
80                    $audit->{size} = $size;
81                    store::audit( $opcode, $audit );
82          } else {          } else {
83                  print "ERROR ", Net::TFTPd->error, "\n";                  $audit->{state} = 'error';
84                  $request->processRQ();                  $audit->{error} = Net::TFTPd->error;
85                    store::audit( $opcode, $audit );
86          }          }
87    
88  }  }
# Line 70  sub start { Line 93  sub start {
93    
94          warn 'start';          warn 'start';
95    
96          my $listener = Net::TFTPd->new(          # XXX we need to setup listener ourselfs because we need Reuse
97            my %params = (
98                    Proto => 'udp',
99    #               LocalAddr => $server::ip,
100    #               LocalAddr => '0.0.0.0',
101                    LocalPort => 69,
102                    Reuse => 1,
103            );
104    
105            my $udpserver = IO::Socket::INET->new(%params);
106            die "can't start server ",dump( \%params ), " $!" unless $udpserver;
107    
108            my $listener = bless {
109                  RootDir => $dir,                  RootDir => $dir,
110                  Writable => 0,  
111                  Timeout => 3600,                  ACKtimeout  => 1, # 4
112                    ACKretries  => 2, # 4
113                    Readable    => 1,
114                    Writable    => 0,
115                    Timeout => 3600,
116    
117                  CallBack => \&transfer_status,                  CallBack => \&transfer_status,
 #               LocalAddr => $server::ip,  
                 LocalAddr => '0.0.0.0',  
118  #               BlkSize => 8192,  #               BlkSize => 8192,
119  #               BlkSize => 512,                  BlkSize => 512,         # Dell's RAC doesn't like bigger packets
120                  BlkSize => 1456,        # IBM GE seems to be picky  #               BlkSize => 1456,        # IBM GE seems to be picky
121                  Debug => 99,                  Debug => 99,
122          ) || die Net::TFTPd->error;                  %params, # merge user parameters
123                    _UDPSERVER_ => $udpserver,
124            }, 'Net::TFTPd';
125    
126          warn 'listener: ',dump( $listener ) if $debug;          warn 'listener: ',dump( $listener ) if $debug;
127    
128          printf "TFTP listen %s:%d timeout: %d dir: $dir\n",          store::audit( 'start', {
129                  $listener->{LocalAddr},                  addr => $listener->{LocalAddr},
130                  $listener->{LocalPort},                  port => $listener->{LocalPort},
131                  $listener->{Timeout};                  timeout => $listener->{Timeout},
132                    params => { %params },
133            });
134    
135          while(1) {          while(1) {
136    
137                  # wait for any request (RRQ or WRQ)                  # wait for any request (RRQ or WRQ)
138                  if(my $request = $listener->waitRQ()) {                  if(my $request = $listener->waitRQ()) {
139                            server->refresh;
140                          tftp_request $request;                          tftp_request $request;
141                  } elsif ( my $error = Net::TFTPd->error ) {                  } elsif ( my $error = Net::TFTPd->error ) {
142                          warn $error;                          warn $error;

Legend:
Removed from v.118  
changed lines
  Added in v.545

  ViewVC Help
Powered by ViewVC 1.1.26