--- lib/PXElator/httpd.pm 2009/07/31 18:26:28 89
+++ lib/PXElator/httpd.pm 2009/08/04 17:16:11 140
@@ -17,7 +17,6 @@
use File::Slurp;
#use JSON;
use IO::Socket::INET;
-use Module::Refresh;
our $pids;
$pids = { httpd => $$ } unless defined $pids; # keep pids on refresh
@@ -38,6 +37,7 @@
use html;
our $static_pids;
+use progress_bar;
sub static {
my ($client,$path) = @_;
@@ -64,23 +64,29 @@
print $client "HTTP/1.0 200 OK\r\nContent-Type: $type\r\nContent-Length: $size\r\nConnection: close\r\n\r\n";
open(my $fh, $full);
- print "static $path $type $size\n";
- my $block = 8192;
+ my $block = 1400; # try not to fragment packages (pxelinux seems to have problems with it)
my $buff;
my $pos = 0;
+ warn "static $path $type $size block: $block\n";
+
+ progress_bar::start;
+
while( my $len = read $fh, $buff, $block ) {
print $client $buff;
+ $client->flush;
$pos += $len;
- printf "%s %d/%d %.2f%%\r", $path, $pos, $size, $pos * 100 / $size;
+ progress_bar::tick( $path, $pos, $size );
}
close($fh);
close($client);
- print "$path $pos == $size OK\n";
+ print STDERR "\n";
- exit;
+ warn "exit static child";
+
+ exit(0);
}
use boolean;
@@ -92,9 +98,9 @@
sub start_stop {
my $daemon = shift;
- my $pid = $pids->{$daemon};
+ my $pid = $pids->{$daemon} || 'not started';
- warn "start_stop $daemon $pid pids: ",dump( $pids );
+ warn "start_stop $daemon $pid\n";
if ( $pid =~ m{^\d+$} ) {
my $pstree = `pstree -p $pid`;
@@ -107,7 +113,7 @@
if ( $pid = fork ) {
# parent
$pids->{$daemon} = $pid;
- warn "forked $daemon $pid";
+ warn "forked $daemon $pid\n";
return qq|$daemon pid $pid started|;
} elsif ( defined $pid ) {
# child
@@ -130,7 +136,9 @@
sub get_request {
my ( $client, $path, $param ) = @_;
- warn "get_request $client $path ",dump( $param );
+ server->refresh;
+
+ warn "get_request $path ", $param ? dump( $param ) : '', "\n";
if ( my $found = static( $client,$path ) ) {
warn "static $found" if $debug;
@@ -147,7 +155,7 @@
'debug', qq|$debug|,
);
- my $debug_proc;
+ my $debug_proc = '';
warn 'pids: ', dump( $pids ) if $debug;
foreach my $name ( sort keys %$pids ) {
@@ -180,18 +188,24 @@
push @rows, ( $name => $html );
}
+ my $below_table = '';
+
warn 'static_pids: ', dump( $static_pids ) if $debug;
foreach my $pid ( keys %$static_pids ) {
my $path = $static_pids->{$pid};
if ( -d "/proc/$pid" ) {
push @rows, ( $path => qq|$pid| );
+ } elsif ( $param->{clean_completed_downloads} ) {
+ delete $static_pids->{$pid}
} else {
push @rows, ( $path => "$pid competed" );
+ $below_table = qq|clean completed downloads|;
}
}
print $client $ok
, html::table( 2, @rows )
+ , $below_table
, html::tabs( log::mac_changes )
, $debug_proc
;
@@ -228,9 +242,12 @@
}
use browser;
+use network;
sub start {
+ warn 'tap ', network::tap();
+
my $server = IO::Socket::INET->new(
Proto => 'tcp',
LocalPort => $httpd::port,
@@ -244,14 +261,12 @@
start_stop 'screen';
start_stop 'kvm';
- while (my $client = $server->accept()) {
- $client->autoflush(1);
+ while (1) {
+ my $client = $server->accept() || next; # ALARM trickle us
my $request = <$client>;
warn "request $request\n" if $debug;
- Module::Refresh->refresh;
-
if ($request =~ m{^GET (/.*) HTTP/1.[01]}) {
my $path = $1;
my $param;
@@ -262,7 +277,6 @@
}
warn "param: ",dump( $param ) if $debug;
}
- warn "path $path param: ",dump( $param );
get_request $client, $path, $param;
} else {
print $client "HTTP/1.0 500 No method\r\nConnection: close\r\nContent-type: text/plain\r\n\r\n500 $request";