Commit | Line | Data |
31a246e4 |
1 | package Tak; |
2 | |
3 | use Tak::Loop; |
4 | use strictures 1; |
5 | |
401f4e7d |
6 | our $VERSION = '0.001003'; # 0.1.3 |
51c8325b |
7 | |
fb0f5964 |
8 | our ($loop, $did_upgrade); |
31a246e4 |
9 | |
10 | sub loop { $loop ||= Tak::Loop->new } |
11 | |
addc801e |
12 | sub loop_upgrade { |
fb0f5964 |
13 | return if $did_upgrade; |
addc801e |
14 | require IO::Async::Loop; |
15 | my $new_loop = IO::Async::Loop->new; |
16 | $loop->pass_watches_to($new_loop) if $loop; |
17 | $loop = $new_loop; |
fb0f5964 |
18 | $did_upgrade = 1; |
addc801e |
19 | } |
20 | |
31a246e4 |
21 | sub loop_until { |
22 | my ($class, $done) = @_; |
23 | return if $done; |
addc801e |
24 | $class->loop->loop_once until $_[1]; |
31a246e4 |
25 | } |
26 | |
934a93db |
27 | sub await_all { |
28 | my ($class, @requests) = @_; |
29 | @requests = grep !$_->is_done, @requests; |
30 | return unless @requests; |
31 | my %req = map +("$_" => "$_"), @requests; |
32 | my $done; |
934a93db |
33 | my %on_r = map { |
b1aab0cf |
34 | my $orig = $_->{on_result}; |
934a93db |
35 | my $tag = $req{$_}; |
36 | ($_ => sub { delete $req{$tag}; $orig->(@_); $done = 1 unless keys %req; }) |
37 | } @requests; |
b1aab0cf |
38 | my $call = sub { $class->loop_until($done) }; |
39 | foreach (@requests) { |
40 | my $req = $_; |
41 | my $inner = $call; |
42 | $call = sub { local $req->{on_result} = $on_r{$req}; $inner->() }; |
43 | } |
44 | $call->(); |
934a93db |
45 | return; |
46 | } |
47 | |
b61f9637 |
48 | 1; |
51c8325b |
49 | |
50 | =head1 NAME |
51 | |
52 | Tak - Multi host remote control over ssh |
53 | |
54 | =head1 SYNOPSIS |
55 | |
56 | bin/tak -h user1@host1 -h user2@host2 exec cat /etc/hostname |
57 | |
58 | or |
59 | |
60 | in Takfile: |
61 | |
62 | package Tak::MyScript; |
63 | |
64 | use Tak::Takfile; |
65 | use Tak::ObjectClient; |
66 | |
67 | sub each_get_homedir { |
68 | my ($self, $remote) = @_; |
69 | my $oc = Tak::ObjectClient->new(remote => $remote); |
70 | my $home = $oc->new_object('Path::Class::Dir')->absolute->stringify; |
71 | $self->stdout->print( |
72 | $remote->host.': '.$home."\n" |
73 | ); |
74 | } |
75 | |
76 | 1; |
77 | |
78 | then |
79 | |
80 | tak -h something get-homedir |
81 | |
82 | =head1 WHERE'S THE REST? |
83 | |
330ac6a2 |
84 | A drink leaked in my bag on the way back from LPW. My laptop is finally |
85 | alive again though so I'll try and turn my slides into a vague attempt |
86 | at documentation while I'm traveling to/from christmas things. |
51c8325b |
87 | |
88 | =head1 AUTHOR |
89 | |
90 | mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk> |
91 | |
92 | =head1 CONTRIBUTORS |
93 | |
94 | None required yet. Maybe this module is perfect (hahahahaha ...). |
95 | |
96 | =head1 COPYRIGHT |
97 | |
330ac6a2 |
98 | Copyright (c) 2011 the Tak L</AUTHOR> and L</CONTRIBUTORS> |
51c8325b |
99 | as listed above. |
100 | |
101 | =head1 LICENSE |
102 | |
103 | This library is free software and may be distributed under the same terms |
104 | as perl itself. |
105 | |
106 | =cut |