X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=lib%2FGruntmaster%2FDaemon%2FFormat.pm;h=41f235499d6928579eca84be9150bcde888cea8e;hb=cedd5d682a2777c1c42875a3dfba892ebb293de3;hp=4a57d6a38b6757e99f6906645341efb21588095c;hpb=614700357f0af54cdba3ac21b7420738bda2f3fe;p=gruntmaster-daemon.git diff --git a/lib/Gruntmaster/Daemon/Format.pm b/lib/Gruntmaster/Daemon/Format.pm index 4a57d6a..41f2354 100644 --- a/lib/Gruntmaster/Daemon/Format.pm +++ b/lib/Gruntmaster/Daemon/Format.pm @@ -16,26 +16,44 @@ use Log::Log4perl qw/get_logger/; use String::ShellQuote qw/shell_quote/; use Try::Tiny; -our $VERSION = '5999.000_004'; -our @EXPORT_OK = qw/prepare_files stopvms/; +our $VERSION = '5999.000_005'; +our @EXPORT_OK = qw/copy_from_vm copy_to_vm prepare_files stopvms/; ################################################## our (%vm, %pid); +sub copy_from_vm { + my ($file) = @_; + return unless $ENV{GRUNTMASTER_COPY_FROM_VM}; + get_logger->trace("Copying $file from VM"); + system $ENV{GRUNTMASTER_COPY_FROM_VM}, $file +} + +sub copy_to_vm { + my ($file) = @_; + return unless $ENV{GRUNTMASTER_COPY_TO_VM}; + get_logger->trace("Copying $file to VM"); + system $ENV{GRUNTMASTER_COPY_TO_VM}, $file +} + sub runvm { my ($name, $arg) = @_; return unless $ENV{GRUNTMASTER_VM}; - my $cmd = $ENV{GRUNTMASTER_VM}; + my $cmd = $ENV{GRUNTMASTER_VM} . ' ' . $name; $cmd .= ' ' . $arg if $arg; get_logger->trace("Starting VM $name ($cmd)"); - $vm{$name} = Expect->spawn($cmd); + $vm{$name} = Expect->new; $vm{$name}->raw_pty(1); - $vm{$name}->expect(5, '# ') or get_logger->logdie("Error while starting VM $name: ". $vm{$name}->error); + $vm{$name}->log_stdout(0); + $vm{$name}->spawn($cmd); + $vm{$name}->expect(50, '# ') or get_logger->logdie("Error while starting VM $name: ". $vm{$name}->error); + $vm{$name}->send("rm -rf ~/work/*\n"); + $vm{$name}->expect(50, '# ') } sub stopvms { - kill KILL => $_->pid for values %vm; + $_->hard_close for values %vm; %vm = %pid = (); } @@ -43,8 +61,8 @@ sub execlist_finish { my ($vm, $kill) = @_; if ($vm{$vm}) { - warn "Cannot kill VM" if $kill; - $vm{$vm}->expect(5, '# '); + warn "Cannot kill VM\n" if $kill; + $vm{$vm}->expect(50, '# '); } else { kill KILL => $pid{$vm} if $kill; waitpid $pid{$vm}, 0; @@ -52,6 +70,7 @@ sub execlist_finish { return if $kill; my $er = "exec-result-$vm"; + copy_from_vm $er; die "gruntmaster-exec died\n" if -z $er; my ($excode, $exmsg) = read_file $er; unlink $er; @@ -66,7 +85,7 @@ sub execlist { if ($vm{$vm}) { my $cmd = ">$er " . shell_quote 'gruntmaster-exec', @args; get_logger->trace("Running in VM $vm: $cmd"); - $vm{$vm}->send($cmd); + $vm{$vm}->send($cmd, "\n"); } else { $pid{$vm} = fork // die "Cannot fork\n"; unless ($pid{$vm}) { @@ -110,6 +129,7 @@ sub prepare{ my $exmsg = $_->[1]; die "Compile error ($exmsg)\n" } finally { + copy_from_vm 'errors'; $Gruntmaster::Daemon::errors .= read_file 'errors'; $Gruntmaster::Daemon::errors .= "\n" if -s 'errors'; unlink 'errors'; @@ -130,6 +150,7 @@ sub prepare_files{ $file->{run} = mkrun($format); write_file $name, $content; + copy_to_vm $name; if ($ENV{GRUNTMASTER_CCACHE}) { my $key = lc sha256_hex($content) . '-' . $format; my $cachefn = "$ENV{GRUNTMASTER_CCACHE}/$key";