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

Contents of /lib/PXElator/tftpd.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 118 - (show annotations)
Mon Aug 3 08:52:32 2009 UTC (14 years, 7 months ago) by dpavlin
File size: 2089 byte(s)
added timestamp and moved Module::Refresh->refresh into server

1 package tftpd;
2
3 use warnings;
4 use strict;
5
6 use Net::TFTPd 0.03 qw(%OPCODES);
7 use Data::Dump qw/dump/;
8
9 use server;
10
11 our $debug = server::debug;
12
13 our $dir = "$server::base_dir/tftp";
14
15 sub path {
16 my $glob = shift;
17 my $path = (glob("$dir/$glob"))[0];
18 die "can't find anything for $dir/$glob" unless $path;
19 warn 'path ', $path if $debug;
20 $path =~ s{^$dir}{};
21 return $path;
22 }
23
24 use progress_bar;
25
26 sub transfer_status {
27 my $request = shift;
28 my $r = $request->{'_REQUEST_'} || die "no _REQUEST_ in ",dump( $request );
29
30 if( $r->{'OPCODE'} eq $OPCODES{'RRQ'} ) {
31 progress_bar::tick( $r->{FileName}, $r->{BlkSize} * $r->{LASTACK}, $r->{BlkSize} * $r->{LASTBLK} );
32 } elsif ( $r->{'OPCODE'} eq $OPCODES{'WRQ'} ) {
33 die "WRQ disabled";
34 } else {
35 warn "IGNORED: ", dump( $request );
36 }
37 }
38
39 sub tftp_request {
40 my $request = shift;
41
42 warn 'request: ', dump( $request ) if $debug;
43
44 config::for_ip();
45
46 if ( $request->{RootDir} ne $dir ) {
47 $request->{RootDir} = $dir;
48 warn "new root: $dir";
49 }
50
51 my $file = $request->{'_REQUEST_'}{'FileName'};
52 # received request
53 print $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}}, " $file\n";
54
55 progress_bar::start;
56
57 # process the request
58 if( $request->processRQ() ) {
59 print "\nOK completed $file ", -s "$dir/$file", "\n";
60 } else {
61 print "ERROR ", Net::TFTPd->error, "\n";
62 $request->processRQ();
63 }
64
65 }
66
67 use server;
68
69 sub start {
70
71 warn 'start';
72
73 my $listener = Net::TFTPd->new(
74 RootDir => $dir,
75 Writable => 0,
76 Timeout => 3600,
77 CallBack => \&transfer_status,
78 # LocalAddr => $server::ip,
79 LocalAddr => '0.0.0.0',
80 # BlkSize => 8192,
81 # BlkSize => 512,
82 BlkSize => 1456, # IBM GE seems to be picky
83 Debug => 99,
84 ) || die Net::TFTPd->error;
85
86 warn 'listener: ',dump( $listener ) if $debug;
87
88 printf "TFTP listen %s:%d timeout: %d dir: $dir\n",
89 $listener->{LocalAddr},
90 $listener->{LocalPort},
91 $listener->{Timeout};
92
93 while(1) {
94
95 # wait for any request (RRQ or WRQ)
96 if(my $request = $listener->waitRQ()) {
97 tftp_request $request;
98 } elsif ( my $error = Net::TFTPd->error ) {
99 warn $error;
100 }
101
102 }
103
104 }
105
106 warn "loaded";
107
108 1;

  ViewVC Help
Powered by ViewVC 1.1.26