diff options
Diffstat (limited to 'urpm/removable.pm')
-rw-r--r-- | urpm/removable.pm | 222 |
1 files changed, 52 insertions, 170 deletions
diff --git a/urpm/removable.pm b/urpm/removable.pm index c7d8e74d..301aa59f 100644 --- a/urpm/removable.pm +++ b/urpm/removable.pm @@ -5,8 +5,7 @@ package urpm::removable; use urpm::msg; use urpm::sys; use urpm::util; -use urpm::get_pkgs; -use urpm 'file_from_local_medium', 'is_local_medium'; +use urpm 'file_from_local_medium'; @@ -26,22 +25,32 @@ sub _file_or_synthesis_dir { file_from_local_medium($medium, $o_url); } -#- side-effects: $medium->{mntpoint} -sub _look_for_mounted_cdrom_in_mtab { - my ($urpm, $medium, $o_url) = @_; +#- side-effects: $blists_url->[_]{medium}{mntpoint} +sub _find_blist_url_matching { + my ($urpm, $blists_url, $mntpoint) = @_; + + my @l; + foreach my $blist (@$blists_url) { + $blist->{medium}{mntpoint} and next; - my @mntpoints = map { $_->{mntpoint} } - grep { $_->{fs} eq 'iso9660' || $_->{fs} eq 'udf' } urpm::sys::read_mtab(); - foreach (@mntpoints) { # set it, then verify - $medium->{mntpoint} = $_; - if (-r _file_or_synthesis_dir($medium, $o_url)) { - $urpm->{log}("using cdrom mounted in $_"); - return 1; + $blist->{medium}{mntpoint} = $mntpoint; + if (-r _file_or_synthesis_dir($blist->{medium}, $blist->{url})) { + $urpm->{log}("found cdrom $blist->{medium}{name} mounted in $mntpoint"); + push @l, $blist; + } else { + delete $blist->{medium}{mntpoint}; } } - 0; -} + @l; +} + +#- side-effects: none +sub _look_for_mounted_cdrom_in_mtab() { + + map { $_->{mntpoint} } + grep { $_->{fs} eq 'iso9660' || $_->{fs} eq 'udf' } urpm::sys::read_mtab(); +} #- side-effects: #- + those of _try_mounting_medium ($medium->{mntpoint}) @@ -54,28 +63,33 @@ sub try_mounting_medium { } #- side-effects: -#- + those of _look_for_mounted_cdrom_in_mtab ($medium->{mntpoint}) +#- + those of urpm::cdrom::try_mounting_cdrom ($urpm->{cdrom_mounted}, $medium->{mntpoint}, "hal_mount") +#- + those of _try_mounting_local ($urpm->{removable_mounted}, "mount") sub _try_mounting_medium { my ($urpm, $medium, $o_url) = @_; if (urpm::is_cdrom_url($medium->{url})) { - _look_for_mounted_cdrom_in_mtab($urpm, $medium, $o_url); + urpm::cdrom::try_mounting_cdrom($urpm, [ { medium => $medium, url => $o_url } ]); } else { - -r _file_or_synthesis_dir($medium, $o_url); + _try_mounting_local($urpm, $medium, $o_url); } } #- side-effects: -#- + those of try_mounting_ ($urpm->{removable_mounted}, "mount") -#- + those of try_mounting_iso ($urpm->{removable_mounted}, "mount") -sub try_mounting { - my ($urpm, $dir, $o_iso) = @_; +#- + those of _try_mounting_using_fstab ($urpm->{removable_mounted}, "mount") +#- + those of _try_mounting_iso ($urpm->{removable_mounted}, "mount") +sub _try_mounting_local { + my ($urpm, $medium, $o_url) = @_; + + my $dir = _file_or_synthesis_dir($medium, $o_url); + -e $dir and return 1; - $o_iso ? try_mounting_iso($urpm, $dir, $o_iso) : try_mounting_($urpm, $dir); + $medium->{iso} ? _try_mounting_iso($urpm, $dir, $medium->{iso}) : _try_mounting_using_fstab($urpm, $dir); + -e $dir; } #- side-effects: $urpm->{removable_mounted}, "mount" -sub try_mounting_iso { +sub _try_mounting_iso { my ($urpm, $dir, $iso) = @_; #- note: for isos, we don't parse the fstab because it might not be declared in it. @@ -89,13 +103,13 @@ sub try_mounting_iso { my $loopdev = urpm::sys::first_free_loopdev(); sys_log("mount iso $mntpoint on $iso"); $loopdev and system('mount', $iso, $mntpoint, '-t', 'iso9660', '-o', "loop=$loopdev"); - $iso and $urpm->{removable_mounted}{$mntpoint} = undef; + $urpm->{removable_mounted}{$mntpoint} = undef; } -e $mntpoint; } #- side-effects: $urpm->{removable_mounted}, "mount" -sub try_mounting_ { +sub _try_mounting_using_fstab { my ($urpm, $dir) = @_; my $mntpoint = _non_mounted_mntpoint($dir); @@ -104,6 +118,7 @@ sub try_mounting_ { $urpm->{log}(N("mounting %s", $mntpoint)); sys_log("mount $mntpoint"); system("mount '$mntpoint' 2>/dev/null"); + $urpm->{removable_mounted}{$mntpoint} = undef; } -e $dir; } @@ -147,125 +162,19 @@ sub try_umounting_removables { } #- side-effects: -#- + those of _try_mounting_medium ($medium->{mntpoint}) -sub _mount_cdrom_and_check_notfound { - my ($urpm, $blist, $medium) = @_; - - my ($first_url) = values %{$blist->{list}}; - _try_mounting_medium($urpm, $medium, $first_url) or return 1; - - _check_notfound($blist); -} - -#- side-effects: none -sub _check_notfound { - my ($blist) = @_; - - $blist->{medium}{mntpoint} or return; - - foreach (values %{$blist->{list}}) { - my $dir_ = _filepath($blist->{medium}, $_) or next; - -r $dir_ or return 1; - } - 0; -} - -#- side-effects: "eject" -#- + those of _mount_cdrom_and_check_notfound ($urpm->{removable_mounted}, "mount") -#- + those of try_umounting ($urpm->{removable_mounted}, "umount") -sub _mount_cdrom { - my ($urpm, $blist, $ask_for_medium) = @_; - my $medium = $blist->{medium}; - - #- the directory given does not exist and may be accessible - #- by mounting some other directory. Try to figure it out and mount - #- everything that might be necessary. - while (_mount_cdrom_and_check_notfound($urpm, $blist, $medium)) { - $ask_for_medium - or $urpm->{fatal}(4, N("medium \"%s\" is not available", $medium->{name})); - - my $dir; # TODO - try_umounting($urpm, $dir); - system("/usr/bin/eject '$medium->{removable}' 2>/dev/null"); - - $ask_for_medium->(remove_internal_name($medium->{name})) - or $urpm->{fatal}(4, N("medium \"%s\" is not available", $medium->{name})); - } -} - -#- side-effects: none -sub _filepath { - my ($medium, $url) = @_; - - chomp $url; - my $filepath = file_from_local_medium($medium, $url) or return; - $filepath =~ m!/.*/! or return; #- is this really needed?? - $filepath; -} - -#- side-effects: "copy-move-files" -sub _do_the_copy { - my ($urpm, $filepath) = @_; - - #- we should assume a possibly buggy removable device... - #- First, copy in partial cache, and if the package is still good, - #- transfer it to the rpms cache. - my $filename = basename($filepath); - unlink "$urpm->{cachedir}/partial/$filename"; - $urpm->{log}("copying $filepath"); - copy_and_own($filepath, "$urpm->{cachedir}/partial/$filename") or return; - my $f = urpm::get_pkgs::verify_partial_rpm_and_move($urpm, $urpm->{cachedir}, $filename) or return; - $f; -} - -#- side-effects: $sources -#- + those of _mount_cdrom ($urpm->{removable_mounted}, "mount", "umount", "eject") -#- + those of _do_the_copy: "copy-move-files" -sub _copy_from_cdrom__if_needed { - my ($urpm, $blist, $sources, $ask_for_medium, $want_copy) = @_; - - _mount_cdrom($urpm, $blist, $ask_for_medium); - - while (my ($i, $url) = each %{$blist->{list}}) { - my $filepath = _filepath($blist->{medium}, $url) or next; - - if (-r $filepath) { - $sources->{$i} = $want_copy ? _do_the_copy($urpm, $filepath) : $filepath; - } else { - #- fallback to use other method for retrieving the file later. - $urpm->{error}(N("unable to read rpm file [%s] from medium \"%s\"", $filepath, $blist->{medium}{name})); - } - } -} - -#- side-effects: #- + those of try_mounting_non_cdrom ($urpm->{removable_mounted}, "mount") sub try_mounting_non_cdroms { my ($urpm, $list) = @_; - my $blist = _create_blists($urpm->{media}, $list); - my @used_media = map { $_->{medium} } @$blist; + my $blists = create_blists($urpm->{media}, $list); - foreach my $medium (grep { !urpm::is_cdrom_url($_->{url}) } @used_media) { - try_mounting_non_cdrom($urpm, $medium); + foreach my $blist (grep { urpm::file_from_local_url($_->{medium}{url}) } @$blists) { + try_mounting_medium($urpm, $blist->{medium}, $blist->{url}); } } -#- side-effects: -#- + those of try_mounting_ ($urpm->{removable_mounted}, "mount") -sub try_mounting_non_cdrom { - my ($urpm, $medium) = @_; - - my $dir = file_from_local_medium($medium) or return; - - -e $dir || try_mounting($urpm, $dir, $medium->{iso}) or - $urpm->{error}(N("unable to access medium \"%s\"", $medium->{name})), return; - - 1; -} - #- side-effects: none -sub _create_blists { +sub create_blists { my ($media, $list) = @_; #- make sure everything is correct on input... @@ -273,43 +182,16 @@ sub _create_blists { @$media == @$list or return; my $i; - [ grep { %{$_->{list}} } - map { { medium => $_, list => $list->[$i++] } } @$media ]; + [ map { + my $list = $list->[$i++]; + my ($url) = values %$list; # first url + $url ? { medium => $_, list => $list, url => $url } : (); + } @$media ]; } -#- side-effects: none -sub _sort_media { - my (@l) = @_; - - if (@l > 1) { - @l = sort { values(%{$a->{list}}) <=> values(%{$b->{list}}) } @l; - - #- check if a removable device is already mounted (and files present). - if (my ($already_mounted) = grep { !_check_notfound($_) } @l) { - @l = ($already_mounted, grep { $_ != $already_mounted } @l); - } - } - @l; -} - -#- $list is a [ { pkg_id1 => url1, ... }, { ... }, ... ] -#- where there is one hash for each medium in {media} -#- -#- side-effects: -#- + those of _copy_from_cdrom__if_needed ($urpm->{removable_mounted}, $sources, "mount", "umount", "eject", "copy-move-files") -sub copy_packages_of_removable_media { - my ($urpm, $list, $sources, $o_ask_for_medium) = @_; - - my $blists = _create_blists($urpm->{media}, $list); - #- If more than one media uses this device, we have to sort - #- needed packages to copy the needed rpm files. - my @l = _sort_media(grep { urpm::is_cdrom_url($_->{medium}{url}) } @$blists); - - foreach my $blist (@l) { - _copy_from_cdrom__if_needed($urpm, $blist, $sources, $o_ask_for_medium, @l > 1); - } - - 1; +sub copy_packages_of_removable_media { + require urpm::cdrom; + &urpm::cdrom::copy_packages_of_removable_media; } 1; |