File Coverage

blib/lib/GRID/Machine.pm
Criterion Covered Total %
statement 63 665 9.4
branch 0 270 0.0
condition 0 182 0.0
subroutine 21 66 31.8
pod 21 31 67.7
total 105 1214 8.6


line stmt bran cond sub pod time code
1             # You may distribute under the terms of either the GNU General Public License
2             # or the Artistic License (the same terms as Perl itself)
3             #
4             # Based on the idea of IPC::PerlSSH by Paul Evans, 2006,2007 -- leonerd@leonerd.org.uk
5             # (C) Casiano Rodriguez-Leon 2007 -- casiano@ull.es
6              
7             package GRID::Machine;
8 20     20   666354 use strict;
  20         49  
  20         1261  
9 20     20   126 use Scalar::Util qw(blessed reftype);
  20         37  
  20         3313  
10 20     20   122 use List::Util qw(first);
  20         39  
  20         2641  
11 20     20   22097 use Module::Which;
  20         2921733  
  20         1246  
12 20     20   21276 use IPC::Open2();
  20         107214  
  20         511  
13 20     20   176 use IPC::Open3();
  20         39  
  20         350  
14 20     20   203 use Carp;
  20         43  
  20         1525  
15 20     20   122 use File::Spec;
  20         37  
  20         1501  
16 20     20   37181 use File::Temp;
  20         614422  
  20         2029  
17 20     20   19209 use IO::File;
  20         29392  
  20         3703  
18 20     20   140 use base qw(Exporter);
  20         35  
  20         2320  
19 20     20   12529 use GRID::Machine::IOHandle;
  20         66  
  20         545  
20 20     20   12337 use GRID::Machine::Process;
  20         57  
  20         764  
21             require POSIX;
22              
23             require Cwd;
24 20     20   124 no Cwd;
  20         38  
  20         954  
25             our @EXPORT_OK = qw(is_operative read_modules qc slurp_file);
26              
27             # We need to include the common shared perl library
28 20     20   109 use GRID::Machine::MakeAccessors; # Order is important. This must be the first!
  20         65  
  20         443  
29 20     20   12411 use GRID::Machine::Message;
  20         70  
  20         627  
30 20     20   12463 use GRID::Machine::Result;
  20         61  
  20         105714  
31              
32             our $VERSION = '0.127';
33              
34             my %_taken_id;
35             {
36             my $logic_id = 0;
37             sub new_logic_id {
38 0     0 0   $logic_id++ while $_taken_id{$logic_id};
39 0           return $logic_id++;
40             }
41             }
42              
43             ####################################################################
44             # Usage : my $REMOTE_LIBRARY = read_modules(@Remote_modules);
45             # Purpose : Concatenates the contents of the files associated with
46             # the file descriptors
47             # Returns : The string with the contents of all those files
48             # Throws : exception if a module can not be found
49              
50             sub read_modules {
51              
52 0     0 1   my $m = "";
53 0           for my $descriptor (@_) {
54 0           my %modules = %{which($descriptor)};
  0            
55              
56 0           for my $module (keys(%modules)) {
57 0           my $path = which($module)->{$module}{path};
58              
59 0 0 0       unless (defined($path) and -r $path) {
60 0           die "Can't find module $module\n";
61             }
62              
63 0           $m .= "# source from: #line 1 \"$path\"\n";
64 0           local $/ = undef;
65 0           open my $FILE, "< $path";
66 0           $m .= <$FILE>;
67 0           close($FILE);
68             }
69             }
70              
71 0           return $m;
72             }
73              
74             # ssh [-1246AaCfgKkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
75             # [-D [bind_address:]port] [-e escape_char]
76             # [-F configfile] [-i identity_file] [-L [bind_address:]port:host:hostport]
77             # [-l login_name] [-m mac_spec]
78             # [-O ctl_cmd] [-o option] [-p port] [-R [bind_address:]port:host:hostport] i
79             # [-S ctl_path] [-w tunnel:tunnel]
80             # [user@]hostname [command]
81             #
82             sub find_host {
83 0     0 0   my $command = shift;
84              
85 0           my %option;
86              
87 0 0         die "Error in GRID::Machine findhost. No command provided\n" unless $command;
88 0           $command =~ s{^\s*
89             (\S+ # ssh
90             (?:\s+-[1246AaCfgKkMNnqsTtVvXxYy])* # -6 -A -f ... options without arg
91             )
92             \s*
93             }{}x;
94 0           $option{ssh} = $1;
95 0           while ($command =~ s{^\s*(-\w)\s+(\S*)}{}g) {
96 0           $option{$1} = $2;
97             }
98 0           $command =~ s{^\s*([\w+.\@]+)}{};
99 0           $option{host} = $1;
100 0           return \%option;
101             }
102              
103             # Inheritance: not considered
104             { # closure for attributes
105              
106             my @legal = qw(
107             cleanup
108             command
109             debug
110             err
111             host
112             includes
113             log
114             logic_id
115             perl
116             perloptions
117             prefix
118             pushinc unshiftinc
119             readfunc
120             readpipe
121             remotelibs
122             report
123             scp
124             sendstdout
125             ssh
126             sshpipe
127             sshoptions
128             startdir startenv
129             survive
130             tmpdir
131             uses
132             wait
133             writefunc
134             writepipe
135             );
136             my %legal = map { $_ => 1 } @legal;
137              
138             GRID::Machine::MakeAccessors::make_accessors(@legal);
139              
140             ########################################################
141             sub RemoteProgram {
142 0     0 0   my ($USES,
143             $REMOTE_LIBRARY,
144             $class,
145             $host,
146             $log,
147             $err,
148             $logic_id,
149             $startdir,
150             $startenv,
151             $pushinc,
152             $unshiftinc,
153             $sendstdout,
154             $cleanup,
155             $prefix,
156             $portdebug,
157             $report,
158             $tmpdir,
159             )
160             = @_;
161              
162 0           return << "EOREMOTE";
163             #line 1 "$prefix/REMOTE.pm"
164             package GRID::Machine;
165             use strict;
166             use warnings;
167              
168             $USES
169              
170             $REMOTE_LIBRARY
171              
172             my \$rperl = $class->new(
173             host => '$host',
174             log => '$log',
175             err => '$err',
176             logic_id => '$logic_id',
177             clientpid => $$,
178             startdir => '$startdir',
179             startenv => $startenv,
180             pushinc => [ qw{ @$pushinc } ],
181             unshiftinc => [ qw{ @$unshiftinc } ],
182             sendstdout => $sendstdout,
183             cleanup => $cleanup,
184             prefix => '$prefix', # Where to install modules
185             debug => $portdebug,
186             report => q{$report},
187             tmpdir => q{$tmpdir},
188             );
189             \$rperl->main();
190             __END__