use List::MoreUtils qw/natatime/;
use Log::Log4perl qw/get_logger/;
use String::ShellQuote qw/shell_quote/;
+use Time::HiRes qw/time/;
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->new;
$vm{$name}->raw_pty(1);
$vm{$name}->log_stdout(0);
$vm{$name}->spawn($cmd);
- $vm{$name}->expect(5, '# ') or get_logger->logdie("Error while starting VM $name: ". $vm{$name}->error);
+ $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 = ();
}
if ($vm{$vm}) {
warn "Cannot kill VM\n" if $kill;
- $vm{$vm}->expect(5, '# ');
+ $vm{$vm}->expect(50, '# ');
} else {
kill KILL => $pid{$vm} if $kill;
waitpid $pid{$vm}, 0;
}
+ write_file "time-stop-$vm", time;
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;
sub execlist {
my ($vm, @args) = @_;
+ write_file "time-start-$vm", time;
my $er = "exec-result-$vm";
if ($vm{$vm}) {
my $cmd = ">$er " . shell_quote 'gruntmaster-exec', @args;
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';
$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";