From: Matt S Trout Date: Fri, 11 Nov 2011 12:55:08 +0000 (+0000) Subject: sample Takfile X-Git-Tag: v0.001001~12 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=241e3dd6574abfe291f56471c1a448b0ebbb3b69;p=scpubgit%2FTak.git sample Takfile --- diff --git a/Takfile b/Takfile new file mode 100644 index 0000000..62b8135 --- /dev/null +++ b/Takfile @@ -0,0 +1,57 @@ +package Tak::MyScript; + +use Tak::Takfile; + +sub every_exec (stream|s) { + my ($self, $remotes, $options, @command) = @_; + + my @requests; + + $_->ensure(command_service => 'Tak::CommandService') for @$remotes; + + foreach my $remote (@$remotes) { + if ($options->{stream}) { + my $stdout = $self->stdout; + my $host = $remote->host; + push @requests, $remote->start( + { + on_result => sub { $self->print_exec_result($remote, @_) }, + on_progress => sub { + $stdout->print($host.' '.$_[0].': '.$_[1]); + $stdout->print("\n") unless $_[1] =~ /\n\Z/; + } + }, + command_service => stream_exec => \@command + ); + } else { + push @requests, $remote->start( + { on_result => sub { $self->print_exec_result($remote, @_) } }, + command_service => exec => \@command + ); + } + } + Tak->await_all(@requests); +} + +sub print_exec_result { + my ($self, $remote, $result) = @_; + + my $res = eval { $result->get } + or do { + $self->stderr->print("Host ${\$remote->host}: Error: $@\n"); + return; + }; + + my $code = $res->{exit_code}; + $self->stdout->print( + "Host ${\$remote->host}: ".($code ? "NOT OK ${code}" : "OK")."\n" + ); + if ($res->{stderr}) { + $self->stdout->print("Stderr:\n${\$res->{stderr}}\n"); + } + if ($res->{stdout}) { + $self->stdout->print("Stdout:\n${\$res->{stdout}}\n"); + } +} + +1;