diff options
Diffstat (limited to 'urpm')
-rw-r--r-- | urpm/parallel.pm | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/urpm/parallel.pm b/urpm/parallel.pm new file mode 100644 index 00000000..e5dff4ff --- /dev/null +++ b/urpm/parallel.pm @@ -0,0 +1,57 @@ +package urpm::parallel; + +use urpm; +use urpm::util; +use urpm::msg; + + +sub configure { + my ($urpm, $alias) = @_; + my @parallel_options; + #- read parallel configuration + foreach (cat_("/etc/urpmi/parallel.cfg")) { + chomp; s/#.*$//; s/^\s*//; s/\s*$//; + /\s*([^:]*):(.*)/ or $urpm->{error}(N("unable to parse \"%s\" in file [%s]", $_, "/etc/urpmi/parallel.cfg")), next; + $1 eq $alias and push @parallel_options, $2; + } + #- if a configuration option has been found, use it; else fatal error. + my $parallel_handler; + if (@parallel_options) { + foreach my $dir (grep { -d $_ } map { "$_/urpm" } @INC) { + foreach my $pm (grep { -f $_ } glob("$dir/parallel*.pm")) { + #- load parallel modules + $urpm->{log}->(N("examining parallel handler in file [%s]", $pm)); + # perl_checker: require urpm::parallel_ka_run + # perl_checker: require urpm::parallel_ssh + eval { require $pm; $parallel_handler = $urpm->handle_parallel_options(join("\n", @parallel_options)) }; + $parallel_handler and last; + } + $parallel_handler and last; + } + } + if ($parallel_handler) { + if ($parallel_handler->{nodes}) { + $urpm->{log}->(N("found parallel handler for nodes: %s", join(', ', keys %{$parallel_handler->{nodes}}))); + } + $urpm->{parallel_handler} = $parallel_handler; + } else { + $urpm->{fatal}(1, N("unable to use parallel option \"%s\"", $alias)); + } +} + +sub resolve_dependencies { + my ($urpm, $state, $requested, %options) = @_; + + #- build the global synthesis file first. + my $file = "$urpm->{cachedir}/partial/parallel.cz"; + unlink $file; + foreach (@{$urpm->{media}}) { + urpm::is_valid_medium($_) or next; + my $f = urpm::statedir_synthesis($urpm, $_); + system "cat '$f' >> '$file'"; + } + #- let each node determine what is requested, according to handler given. + $urpm->{parallel_handler}->parallel_resolve_dependencies($file, $urpm, $state, $requested, %options); +} + +1; |