File Coverage

blib/lib/urpm/parallel_ka_run.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             package urpm::parallel_ka_run;
2              
3              
4             #- Copyright (C) 2002, 2003, 2004, 2005 MandrakeSoft SA
5             #- Copyright (C) 2005-2010 Mandriva SA
6              
7 1     1   971 use strict;
  1         1  
  1         29  
8 1     1   3 use urpm::util 'find';
  1         7  
  1         38  
9 1     1   31 use urpm::msg;
  0            
  0            
10             use urpm::parallel;
11              
12             our @ISA = 'urpm::parallel';
13              
14             our $mput_command = $ENV{URPMI_MPUT_COMMAND};
15             our $rshp_command = $ENV{URPMI_RSHP_COMMAND};
16              
17             if (!$mput_command) {
18             ($mput_command) = find { -x $_ } qw(/usr/bin/mput2 /usr/bin/mput);
19             }
20             $mput_command ||= 'mput';
21             if (!$rshp_command) {
22             ($rshp_command) = find { -x $_ } qw(/usr/bin/rshp2 /usr/bin/rshp);
23             }
24             $rshp_command ||= 'rshp';
25              
26             sub _rshp_urpm {
27             my ($parallel, $urpm, $rshp_option, $cmd, $para) = @_;
28              
29             # it doesn't matter for urpmq, and previous version of urpmq didn't handle it:
30             $cmd ne 'urpmq' and $para = "--no-locales $para";
31              
32             my $command = "$rshp_command $rshp_option $parallel->{options} -- $cmd $para";
33             $urpm->{log}("parallel_ka_run: $command");
34             $command;
35             }
36             sub _rshp_urpm_popen {
37             my ($parallel, $urpm, $cmd, $para) = @_;
38              
39             my $command = _rshp_urpm($parallel, $urpm, '-v', $cmd, $para);
40             open(my $fh, "$command |") or $urpm->{fatal}(1, "Can't fork $rshp_command: $!");
41             $fh;
42             }
43              
44             sub urpm_popen {
45             my ($parallel, $urpm, $cmd, $para, $do) = @_;
46              
47             my $fh = _rshp_urpm_popen($parallel, $urpm, $cmd, $para);
48              
49             while (my $s = <$fh>) {
50             chomp $s;
51             my ($node, $s_) = _parse_rshp_output($s) or next;
52              
53             $urpm->{debug}("parallel_ka_run: $node: received: $s_") if $urpm->{debug};
54             $do->($node, $s_) and last;
55             }
56             close $fh or $urpm->{fatal}(1, N("rshp failed, maybe a node is unreacheable"));
57             ();
58             }
59              
60             sub run_urpm_command {
61             my ($parallel, $urpm, $cmd, $para) = @_;
62             system(_rshp_urpm($parallel, $urpm, '', $cmd, $para)) == 0;
63             }
64              
65             sub copy_to_dir { &_run_mput }
66              
67             sub propagate_file {
68             my ($parallel, $urpm, $file) = @_;
69             _run_mput($parallel, $urpm, $file, $file);
70             }
71              
72             sub _run_mput {
73             my ($parallel, $urpm, @para) = @_;
74              
75             my @l = (split(' ', $parallel->{options}), '--', @para);
76             $urpm->{log}("parallel_ka_run: $mput_command " . join(' ', @l));
77             system $mput_command, @l;
78             $? == 0 || $? == 256 or $urpm->{fatal}(1, N("mput failed, maybe a node is unreacheable"));
79             }
80              
81             sub _parse_rshp_output {
82             my ($s) = @_;
83             #- eg of output of rshp2: [rank:2]:@removing@mpich-1.2.5.2-10mlcs4.x86_64
84              
85             if ($s =~ /<([^>]*)>.*:->:(.*)/ || $s =~ /<([^>]*)>\s*\[[^]]*\]:(.*)/) {
86             ($1, $2);
87             } else {
88             warn "bad rshp output $s\n";
89             ();
90             }
91             }
92              
93             #- allow to bootstrap from urpmi code directly (namespace is urpm).
94              
95             package urpm;
96              
97             no warnings 'redefine';
98              
99             sub handle_parallel_options {
100             my (undef, $options) = @_;
101             my ($media, $ka_run_options) = $options =~ /ka-run(?:\(([^\)]*)\))?:(.*)/;
102             if ($ka_run_options) {
103             my ($flush_nodes, %nodes);
104             foreach (split ' ', $ka_run_options) {
105             if ($_ eq '-m') {
106             $flush_nodes = 1;
107             } else {
108             $flush_nodes and $nodes{/host=([^,]*)/ ? $1 : $_} = undef;
109             undef $flush_nodes;
110             }
111             }
112             return bless {
113             media => $media,
114             options => $ka_run_options,
115             nodes => \%nodes,
116             }, "urpm::parallel_ka_run";
117             }
118             return undef;
119             }
120              
121             1;