--- lib/PXElator/httpd.pm 2009/07/31 18:16:14 88
+++ lib/PXElator/httpd.pm 2009/08/01 00:44:52 107
@@ -39,6 +39,8 @@
use html;
our $static_pids;
+use Time::HiRes qw/time/;
+
sub static {
my ($client,$path) = @_;
@@ -64,23 +66,40 @@
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;
+ STDERR->autoflush(1);
+ warn "static $path $type $size block: $block\n";
+
+ my $start_t = time();
+ my $last_t = $start_t;
+
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;
+ my $t = time();
+ next unless $t - $last_t > 0.75;
+ $last_t = $t;
+ my $speed = ( $pos ) / ( $t - $start_t );
+ printf STDERR "%s %d/%d %.2f%% %.2f K/s ETA %.1fs \r"
+ , $path, $pos
+ , $size, $pos * 100 / $size
+ , $speed / 1024
+ , ( $size - $pos ) / $speed
+ ;
}
close($fh);
close($client);
- print "$path $pos == $size OK\n";
+ print STDERR "\n";
+
+ warn "exit static child";
- exit;
+ exit(0);
}
use boolean;
@@ -94,7 +113,7 @@
my $daemon = shift;
my $pid = $pids->{$daemon};
- 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 +126,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 +149,7 @@
sub get_request {
my ( $client, $path, $param ) = @_;
- warn "get_request $client $path ",dump( $param );
+ warn "get_request $path ", $param ? dump( $param ) : '', "\n";
if ( my $found = static( $client,$path ) ) {
warn "static $found" if $debug;
@@ -147,13 +166,13 @@
'debug', qq|$debug|,
);
- my $debug_proc;
+ my $debug_proc = '';
warn 'pids: ', dump( $pids ) if $debug;
foreach my $name ( sort keys %$pids ) {
my $pid = $pids->{$name} || next;
- my $html = qq|$pid|;
+ my $html = qq|$pid|;
my $proc = "/proc/$pid/status";
@@ -180,18 +199,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
;
@@ -201,7 +226,7 @@
warn $@ if $@;
print $client $redirect, qq|$1 = $2
Location: $url|;
server::debug( $debug ) if $1 eq 'debug';
- } elsif ( $path =~ m{^/start_stop/((?:screen|kvm).*)} ) {
+ } elsif ( $path =~ m{^/start_stop/((?:screen|kvm).*)} ) { # XXX we don't want to stop all classes
print $client $redirect, start_stop($1);
} elsif ( $path =~ m{^/action/([^/]+)/(.+)} ) {
$1->$2();
@@ -262,7 +287,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";