/[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

Annotation of /lib/PXElator/tftpd.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 141 - (hide annotations)
Tue Aug 4 17:29:59 2009 UTC (14 years, 8 months ago) by dpavlin
File size: 2543 byte(s)
all this code to add Reuse => 1 into udp listener, sigh!
1 dpavlin 45 package tftpd;
2    
3     use warnings;
4     use strict;
5    
6     use Net::TFTPd 0.03 qw(%OPCODES);
7 dpavlin 141 use IO::Socket::INET;
8 dpavlin 45 use Data::Dump qw/dump/;
9    
10 dpavlin 47 use server;
11 dpavlin 45
12 dpavlin 67 our $debug = server::debug;
13    
14 dpavlin 47 our $dir = "$server::base_dir/tftp";
15    
16 dpavlin 45 sub path {
17     my $glob = shift;
18 dpavlin 68 my $path = (glob("$dir/$glob"))[0];
19 dpavlin 45 die "can't find anything for $dir/$glob" unless $path;
20 dpavlin 93 warn 'path ', $path if $debug;
21 dpavlin 45 $path =~ s{^$dir}{};
22     return $path;
23     }
24    
25 dpavlin 115 use progress_bar;
26 dpavlin 93
27 dpavlin 45 sub transfer_status {
28 dpavlin 115 my $request = shift;
29     my $r = $request->{'_REQUEST_'} || die "no _REQUEST_ in ",dump( $request );
30    
31     if( $r->{'OPCODE'} eq $OPCODES{'RRQ'} ) {
32     progress_bar::tick( $r->{FileName}, $r->{BlkSize} * $r->{LASTACK}, $r->{BlkSize} * $r->{LASTBLK} );
33     } elsif ( $r->{'OPCODE'} eq $OPCODES{'WRQ'} ) {
34 dpavlin 45 die "WRQ disabled";
35     } else {
36 dpavlin 115 warn "IGNORED: ", dump( $request );
37 dpavlin 45 }
38     }
39    
40 dpavlin 138 use config;
41    
42 dpavlin 45 sub tftp_request {
43     my $request = shift;
44    
45 dpavlin 128 server->refresh;
46    
47 dpavlin 93 warn 'request: ', dump( $request ) if $debug;
48    
49 dpavlin 138 config::for_ip( $request->{_REQUEST_}->{PeerAddr} );
50 dpavlin 110
51 dpavlin 45 if ( $request->{RootDir} ne $dir ) {
52     $request->{RootDir} = $dir;
53     warn "new root: $dir";
54     }
55    
56 dpavlin 93 my $file = $request->{'_REQUEST_'}{'FileName'};
57 dpavlin 45 # received request
58 dpavlin 93 print $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}}, " $file\n";
59 dpavlin 45
60 dpavlin 115 progress_bar::start;
61    
62 dpavlin 45 # process the request
63     if( $request->processRQ() ) {
64 dpavlin 93 print "\nOK completed $file ", -s "$dir/$file", "\n";
65 dpavlin 45 } else {
66 dpavlin 93 print "ERROR ", Net::TFTPd->error, "\n";
67 dpavlin 45 $request->processRQ();
68     }
69    
70     }
71    
72     use server;
73    
74     sub start {
75    
76     warn 'start';
77    
78 dpavlin 141 # XXX we need to setup listener ourselfs because we need Reuse
79     my %params = (
80     Proto => 'udp',
81     # LocalAddr => $server::ip,
82     # LocalAddr => '0.0.0.0',
83     LocalPort => 69,
84     Reuse => 1,
85     );
86    
87     my $udpserver = IO::Socket::INET->new(%params);
88     die "can't start server ",dump( \%params ), " $!" unless $udpserver;
89    
90     my $listener = bless {
91 dpavlin 45 RootDir => $dir,
92 dpavlin 141
93     ACKtimeout => 4,
94     ACKretries => 4,
95     Readable => 1,
96     Writable => 0,
97     Timeout => 3600,
98    
99 dpavlin 45 CallBack => \&transfer_status,
100     # BlkSize => 8192,
101     # BlkSize => 512,
102     BlkSize => 1456, # IBM GE seems to be picky
103     Debug => 99,
104 dpavlin 141 %params, # merge user parameters
105     _UDPSERVER_ => $udpserver,
106     }, 'Net::TFTPd';
107 dpavlin 45
108 dpavlin 67 warn 'listener: ',dump( $listener ) if $debug;
109 dpavlin 45
110 dpavlin 93 printf "TFTP listen %s:%d timeout: %d dir: $dir\n",
111     $listener->{LocalAddr},
112     $listener->{LocalPort},
113     $listener->{Timeout};
114    
115 dpavlin 45 while(1) {
116    
117     # wait for any request (RRQ or WRQ)
118     if(my $request = $listener->waitRQ()) {
119     tftp_request $request;
120 dpavlin 118 } elsif ( my $error = Net::TFTPd->error ) {
121     warn $error;
122 dpavlin 45 }
123    
124     }
125    
126     }
127    
128     warn "loaded";
129    
130     1;

  ViewVC Help
Powered by ViewVC 1.1.26