aboutsummaryrefslogtreecommitdiffstats
path: root/AdminPanel/rpmdragora.pm
diff options
context:
space:
mode:
authorAngelo Naselli <anaselli@linux.it>2014-01-27 18:20:30 +0100
committerAngelo Naselli <anaselli@linux.it>2014-01-27 18:20:30 +0100
commit1624ce382eb033c2cf3ef1fe6b9c41beb0b0a91b (patch)
tree1363e3d3bdcfa5b2ff3111a41b2c700a5a922140 /AdminPanel/rpmdragora.pm
parentf519e47d15103514585a272c6308467ac41ce551 (diff)
downloadmanatools-1624ce382eb033c2cf3ef1fe6b9c41beb0b0a91b.tar
manatools-1624ce382eb033c2cf3ef1fe6b9c41beb0b0a91b.tar.gz
manatools-1624ce382eb033c2cf3ef1fe6b9c41beb0b0a91b.tar.bz2
manatools-1624ce382eb033c2cf3ef1fe6b9c41beb0b0a91b.tar.xz
manatools-1624ce382eb033c2cf3ef1fe6b9c41beb0b0a91b.zip
Project structure change
Diffstat (limited to 'AdminPanel/rpmdragora.pm')
-rw-r--r--AdminPanel/rpmdragora.pm984
1 files changed, 0 insertions, 984 deletions
diff --git a/AdminPanel/rpmdragora.pm b/AdminPanel/rpmdragora.pm
deleted file mode 100644
index b96ed53d..00000000
--- a/AdminPanel/rpmdragora.pm
+++ /dev/null
@@ -1,984 +0,0 @@
-# vim: set et ts=4 sw=4:
-#*****************************************************************************
-#
-# Copyright (c) 2002 Guillaume Cottenceau
-# Copyright (c) 2002-2007 Thierry Vignaud <tvignaud@mandriva.com>
-# Copyright (c) 2003, 2004, 2005 MandrakeSoft SA
-# Copyright (c) 2005, 2007 Mandriva SA
-# Copyright (c) 2013 Matteo Pasotti <matteo.pasotti@gmail.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2, as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-#*****************************************************************************
-#
-# $Id: rpmdragora.pm 267936 2010-04-26 16:40:21Z jvictor $
-
-package AdminPanel::rpmdragora;
-
-use lib qw(/usr/lib/libDrakX);
-use urpm::download ();
-use urpm::prompt;
-use urpm::media;
-
-use MDK::Common;
-use MDK::Common::System;
-use urpm;
-use urpm::cfg;
-use URPM;
-use URPM::Resolve;
-use strict;
-use c;
-use POSIX qw(_exit);
-use common;
-use Locale::gettext;
-use feature 'state';
-
-use AdminPanel::Shared;
-
-our @ISA = qw(Exporter);
-our $VERSION = '2.27';
-our @EXPORT = qw(
- $changelog_first_config
- $compute_updates
- $filter
- $dont_show_selections
- $ignore_debug_media
- $mandrakeupdate_wanted_categories
- $mandrivaupdate_height
- $mandrivaupdate_width
- $max_info_in_descr
- $mode
- $NVR_searches
- $offered_to_add_sources
- $rpmdragora_height
- $rpmdragora_width
- $tree_flat
- $tree_mode
- $use_regexp
- $typical_width
- $clean_cache
- $auto_select
- add_distrib_update_media
- add_medium_and_check
- but
- but_
- check_update_media_version
- choose_mirror
- distro_type
- fatal_msg
- getbanner
- get_icon
- interactive_list
- interactive_list_
- interactive_msg
- interactive_packtable
- myexit
- readconf
- remove_wait_msg
- run_drakbug
- show_urpm_progress
- slow_func
- slow_func_statusbar
- statusbar_msg
- statusbar_msg_remove
- strip_first_underscore
- update_sources
- update_sources_check
- update_sources_interactive
- update_sources_noninteractive
- wait_msg
- warn_for_network_need
- writeconf
-);
-our $typical_width = 280;
-
-our $dont_show_selections;
-
-# i18n: IMPORTANT: to get correct namespace (rpmdragora instead of libDrakX)
-BEGIN { unshift @::textdomains, qw(rpmdragora urpmi rpm-summary-main rpm-summary-contrib rpm-summary-devel rpm-summary-non-free) }
-
-use yui;
-use Glib;
-#ugtk2::add_icon_path('/usr/share/rpmdragora/icons');
-
-Locale::gettext::bind_textdomain_codeset('rpmdragora', 'UTF8');
-
-our $mageia_release = cat_(
- -e '/etc/mageia-release' ? '/etc/mageia-release' : '/etc/release'
-) || '';
-chomp $mageia_release;
-our ($distro_version) = $mageia_release =~ /(\d+\.\d+)/;
-our ($branded, %distrib);
-$branded = -f '/etc/sysconfig/oem'
- and %distrib = MDK::Common::System::distrib();
-our $myname_update = $branded ? N_("Software Update") : N_("Mageia Update");
-
-@rpmdragora::prompt::ISA = 'urpm::prompt';
-
-sub rpmdragora::prompt::prompt {
- my ($self) = @_;
- my @answers;
- my $d = ugtk2->new("", grab => 1, if_($::main_window, transient => $::main_window));
- $d->{rwindow}->set_position('center_on_parent');
- gtkadd(
- $d->{window},
- gtkpack(
- Gtk2::VBox->new(0, 5),
- Gtk2::WrappedLabel->new($self->{title}),
- (map { gtkpack(
- Gtk2::HBox->new(0, 5),
- Gtk2::Label->new($self->{prompts}[$_]),
- $answers[$_] = gtkset_visibility(gtkentry(), !$self->{hidden}[$_]),
- ) } 0 .. $#{$self->{prompts}}),
- gtksignal_connect(Gtk2::Button->new(N("Ok")), clicked => sub { Gtk2->main_quit }),
- ),
- );
- $d->main;
- map { $_->get_text } @answers;
-}
-
-$urpm::download::PROMPT_PROXY = new rpmdragora::prompt(
- N_("Please enter your credentials for accessing proxy\n"),
- [ N_("User name:"), N_("Password:") ],
- undef,
- [ 0, 1 ],
-);
-
-sub myexit {
- writeconf();
- #ugtk2::exit(undef, @_);
-}
-
-my ($root) = grep { $_->[2] == 0 } list_passwd();
-$ENV{HOME} = $> == 0 ? $root->[7] : $ENV{HOME} || '/root';
-$ENV{HOME} = $::env if $::env = $Rpmdragora::init::rpmdragora_options{env}[0];
-
-our $configfile = "$ENV{HOME}/.rpmdragora";
-
-#
-# Configuration File Options
-#
-
-# clear download cache after successfull installation of packages
-our $clean_cache;
-
-# automatic select dependencies without user intervention
-our $auto_select;
-
-our ($changelog_first_config, $compute_updates, $filter, $max_info_in_descr, $mode, $NVR_searches, $tree_flat, $tree_mode, $use_regexp);
-our ($mandrakeupdate_wanted_categories, $ignore_debug_media, $offered_to_add_sources, $no_confirmation);
-our ($rpmdragora_height, $rpmdragora_width, $mandrivaupdate_height, $mandrivaupdate_width);
-
-our %config = (
- clean_cache => {
- var => \$clean_cache,
- default => [ 0 ]
- },
- auto_select => {
- var => \$auto_select,
- default => [ 0 ]
- },
- changelog_first_config => { var => \$changelog_first_config, default => [ 0 ] },
- compute_updates => { var => \$compute_updates, default => [ 1 ] },
- dont_show_selections => { var => \$dont_show_selections, default => [ $> ? 1 : 0 ] },
- filter => { var => \$filter, default => [ 'all' ] },
- ignore_debug_media => { var => \$ignore_debug_media, default => [ 0 ] },
- mandrakeupdate_wanted_categories => { var => \$mandrakeupdate_wanted_categories, default => [ qw(security) ] },
- mandrivaupdate_height => { var => \$mandrivaupdate_height, default => [ 0 ] },
- mandrivaupdate_width => { var => \$mandrivaupdate_width, default => [ 0 ] },
- max_info_in_descr => { var => \$max_info_in_descr, default => [] },
- mode => { var => \$mode, default => [ 'by_group' ] },
- NVR_searches => { var => \$NVR_searches, default => [ 0 ] },
- 'no-confirmation' => { var => \$no_confirmation, default => [ 0 ] },
- offered_to_add_sources => { var => \$offered_to_add_sources, default => [ 0 ] },
- rpmdragora_height => { var => \$rpmdragora_height, default => [ 0 ] },
- rpmdragora_width => { var => \$rpmdragora_width, default => [ 0 ] },
- tree_flat => { var => \$tree_flat, default => [ 0 ] },
- tree_mode => { var => \$tree_mode, default => [ qw(gui_pkgs) ] },
- use_regexp => { var => \$use_regexp, default => [ 0 ] },
-);
-
-sub readconf() {
- ${$config{$_}{var}} = $config{$_}{default} foreach keys %config;
- foreach my $l (cat_($configfile)) {
- foreach (keys %config) {
- ${$config{$_}{var}} = [ split ' ', $1 ] if $l =~ /^\Q$_\E(.*)/;
- }
- }
- # special cases:
- $::rpmdragora_options{'no-confirmation'} = $no_confirmation->[0] if !defined $::rpmdragora_options{'no-confirmation'};
- $Rpmdragora::init::default_list_mode = $tree_mode->[0] if ref $tree_mode && !$Rpmdragora::init::overriding_config;
-}
-
-sub writeconf() {
- return if $::env;
- unlink $configfile;
-
- # special case:
- $no_confirmation->[0] = $::rpmdragora_options{'no-confirmation'};
-
- output($configfile, map { "$_ " . (ref ${$config{$_}{var}} ? join(' ', @${$config{$_}{var}}) : undef) . "\n" } keys %config);
-}
-
-sub getbanner() {
- $::MODE or return undef;
- if (0) {
- +{
- remove => N("Software Packages Removal"),
- update => N("Software Packages Update"),
- install => N("Software Packages Installation"),
- };
- }
-# Gtk2::Banner->new($ugtk2::wm_icon, $::MODE eq 'update' ? N("Software Packages Update") : N("Software Management"));
-}
-
-# return value:
-# - undef if if closed (aka really canceled)
-# - 0 if if No/Cancel
-# - 1 if if Yes/Ok
-sub interactive_msg {
- my ($title, $contents, %options) = @_;
- return ask_YesOrNo($title, $contents);
-=comment
- $options{transient} ||= $::main_window if $::main_window;
- local $::isEmbedded;
- my $factory = yui::YUI::widgetFactory;
- my $d = $factory->createPopupDialog();
-
- my $d = ugtk2->new($title, grab => 1, if_(exists $options{transient}, transient => $options{transient}));
- $d->{rwindow}->set_position($options{transient} ? 'center_on_parent' : 'center_always');
- if ($options{scroll}) {
- $contents = ugtk2::markup_to_TextView_format($contents) if !ref $contents;
- } else { #- because we'll use a WrappedLabel
- $contents = formatAlaTeX($contents) if !ref $contents;
- }
-
- my $button_yes;
- my $vbox = $factory->createVBox($d);
- my $text_w = $factory->createMultiLineEdit($vbox, "");
- my $hbox = $factory->createHBox($vbox);
-
- ref($options{yesno}) eq 'ARRAY' ? map {ss
- my $label = $_;
- my $button_yes = $factory->createIconButton($hbox,"",$label);
- } @{$options{yesno}}
- : (
- $options{yesno} ? (
- my $button_no = $factory->createIconButton($hbox, "", $options{text}{no} || N("No"));
- $button_yes = $factory->createIconButton($hbox,"", $options{text}{yes} || N("Yes"));
- )
- : $button_yes = $factory->createIconButton($hbox,"",N("Ok"));
- )
-
- #$d->{window}->set_focus($button_yes);
- #$text_w->set_size_request($typical_width*2, $options{scroll} ? 300 : -1);
- #$d->main;
- return $d->{retval};
-=cut
-}
-
-sub interactive_packtable {
- my ($title, $parent_window, $top_label, $lines, $action_buttons) = @_;
-
- my $w = ugtk2->new($title, grab => 1, transient => $parent_window);
- local $::main_window = $w->{real_window};
- $w->{rwindow}->set_position($parent_window ? 'center_on_parent' : 'center');
- my $packtable = create_packtable({}, @$lines);
-
- gtkadd($w->{window},
- gtkpack_(Gtk2::VBox->new(0, 5),
- if_($top_label, 0, Gtk2::Label->new($top_label)),
- 1, create_scrolled_window($packtable),
- 0, gtkpack__(create_hbox(), @$action_buttons)));
- my $preq = $packtable->size_request;
- my ($xpreq, $ypreq) = ($preq->width, $preq->height);
- my $wreq = $w->{rwindow}->size_request;
- my ($xwreq, $ywreq) = ($wreq->width, $wreq->height);
- $w->{rwindow}->set_default_size(max($typical_width, min($typical_width*2.5, $xpreq+$xwreq)),
- max(200, min(450, $ypreq+$ywreq)));
- $w->main;
-}
-
-sub interactive_list {
- my ($title, $contents, $list, $callback, %options) = @_;
-
- my $factory = yui::YUI::widgetFactory;
- my $mainw = $factory->createPopupDialog();
- my $vbox = $factory->createVBox($mainw);
- my $lbltitle = $factory->createLabel($vbox, N("Dependencies"));
- my $radiobuttongroup = $factory->createRadioButtonGroup($vbox);
- my $rbbox = $factory->createVBox($radiobuttongroup);
- foreach my $item(@$list){
- my $radiobutton = $factory->createRadioButton($rbbox,$item);
- $radiobutton->setNotify(0);
- $radiobuttongroup->addRadioButton($radiobutton);
- }
- my $submitButton = $factory->createIconButton($vbox,"", N("OK"));
- my $choice;
-
- while(1) {
- my $event = $mainw->waitForEvent();
- my $eventType = $event->eventType();
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- $mainw->destroy();
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- # widget selected
- my $widget = $event->widget();
-
- if($widget == $submitButton) {
- $choice = $radiobuttongroup->currentButton->label();
- $choice =~s/\&//g;
- last;
- }
- }
- }
- $mainw->destroy();
- return $choice;
-}
-
-sub interactive_list_ { interactive_list(@_, if_($::main_window, transient => $::main_window)) }
-
-sub fatal_msg {
- interactive_msg @_;
- myexit -1;
-}
-
-sub wait_msg {
- my ($msg, %options) = @_;
- #OLD my $mainw = ugtk2->new(N("Please wait"), grab => 1, if_(exists $options{transient}, transient => $options{transient}));
- #$mainw->{real_window}->set_position($options{transient} ? 'center_on_parent' : 'center_always');
- #my $label = $factory->createLabel($vbox, $msg);
- #OLD my $label = ref($msg) =~ /^Gtk/ ? $msg : Gtk2::WrappedLabel->new($msg);
- #gtkadd(
- #$mainw->{window},
- #gtkpack__(
- # gtkset_border_width(Gtk2::VBox->new(0, 5), 6),
- # $label,
- # if_(exists $options{widgets}, @{$options{widgets}}),
- #)
- #);
- my $factory = yui::YUI::widgetFactory;
- my $mainw = $factory->createPopupDialog();
- my $vbox = $factory->createVBox($mainw);
- my $title = $factory->createLabel($vbox, N("Please wait"));
- #$mainw->recalcLayout();
- #$mainw->doneMultipleChanges();
- $mainw->pollEvent();
- #$mainw->recalcLayout();
- #$mainw->doneMultipleChanges();
- $mainw;
-}
-
-sub remove_wait_msg {
- my $w = shift;
- #gtkset_mousecursor_normal($w->{rwindow}->window);
- $w->destroy;
-}
-
-sub but { " $_[0] " }
-sub but_ { " $_[0] " }
-
-sub slow_func ($&) {
- my ($param, $func) = @_;
- if (ref($param) =~ /^Gtk/) {
- #gtkset_mousecursor_wait($param);
- #ugtk2::flush();
- #$func->();
- #gtkset_mousecursor_normal($param);
- } else {
- my $w = wait_msg($param);
- $func->();
- remove_wait_msg($w);
- }
-}
-
-sub statusbar_msg {
- unless ($::statusbar) { #- fallback if no status bar
- if (defined &::wait_msg_) { goto &::wait_msg_ } else { goto &wait_msg }
- }
- my ($msg, $o_timeout) = @_;
- $::statusbar->setText($msg);
- #- always use the same context description for now
- #my $cx = $::statusbar->get_context_id("foo");
- #$::w and $::w->{rwindow} and gtkset_mousecursor_wait($::w->{rwindow}->window);
- #- returns a msg_id to be passed optionnally to statusbar_msg_remove
- #my $id = $::statusbar->push($cx, $msg);
- #gtkflush();
- #Glib::Timeout->add(5000, sub { statusbar_msg_remove($id); 0 }) if $o_timeout;
- Glib::Timeout->add(5000, sub { statusbar_msg_remove(); 0 }) if $o_timeout;
- #$id;
-}
-
-sub statusbar_msg_remove {
- #my ($msg_id) = @_;
- #if (!$::statusbar || ref $msg_id) { #- fallback if no status bar
- #goto &remove_wait_msg;
- #}
- #my $cx = $::statusbar->get_context_id("foo");
- #if (defined $msg_id) {
- #$::statusbar->remove($cx, $msg_id);
- #} else {
- #$::statusbar->pop($cx);
- #}
- #$::w and $::w->{rwindow} and gtkset_mousecursor_normal($::w->{rwindow}->window);
- $::statusbar->setValue("");
-}
-
-sub slow_func_statusbar ($$&) {
- my ($msg, $w, $func) = @_;
- gtkset_mousecursor_wait($w->window);
- my $msg_id = statusbar_msg($msg);
- gtkflush();
- $func->();
- statusbar_msg_remove($msg_id);
- gtkset_mousecursor_normal($w->window);
-}
-
-my %u2l = (
- at => N_("Austria"),
- au => N_("Australia"),
- be => N_("Belgium"),
- br => N_("Brazil"),
- ca => N_("Canada"),
- ch => N_("Switzerland"),
- cr => N_("Costa Rica"),
- cz => N_("Czech Republic"),
- de => N_("Germany"),
- dk => N_("Danmark"),
- el => N_("Greece"),
- es => N_("Spain"),
- fi => N_("Finland"),
- fr => N_("France"),
- gr => N_("Greece"),
- hu => N_("Hungary"),
- il => N_("Israel"),
- it => N_("Italy"),
- jp => N_("Japan"),
- ko => N_("Korea"),
- nl => N_("Netherlands"),
- no => N_("Norway"),
- pl => N_("Poland"),
- pt => N_("Portugal"),
- ru => N_("Russia"),
- se => N_("Sweden"),
- sg => N_("Singapore"),
- sk => N_("Slovakia"),
- tw => N_("Taiwan"),
- uk => N_("United Kingdom"),
- cn => N_("China"),
- com => N_("United States"),
- org => N_("United States"),
- net => N_("United States"),
- edu => N_("United States"),
- );
-my $us = [ qw(com org net edu) ];
-my %t2l = (
- 'America/\w+' => $us,
- 'Asia/Tel_Aviv' => [ qw(il ru it cz at de fr se) ],
- 'Asia/Tokyo' => [ qw(jp ko tw), @$us ],
- 'Asia/Seoul' => [ qw(ko jp tw), @$us ],
- 'Asia/Taipei' => [ qw(tw jp), @$us ],
- 'Asia/(Shanghai|Beijing)' => [ qw(cn tw sg), @$us ],
- 'Asia/Singapore' => [ qw(cn sg), @$us ],
- 'Atlantic/Reykjavik' => [ qw(uk no se fi dk), @$us, qw(nl de fr at cz it) ],
- 'Australia/\w+' => [ qw(au jp ko tw), @$us ],
- 'Brazil/\w+' => [ 'br', @$us ],
- 'Canada/\w+' => [ 'ca', @$us ],
- 'Europe/Amsterdam' => [ qw(nl be de at cz fr se dk it) ],
- 'Europe/Athens' => [ qw(gr pl cz de it nl at fr) ],
- 'Europe/Berlin' => [ qw(de be at nl cz it fr se) ],
- 'Europe/Brussels' => [ qw(be de nl fr cz at it se) ],
- 'Europe/Budapest' => [ qw(cz it at de fr nl se) ],
- 'Europe/Copenhagen' => [ qw(dk nl de be se at cz it) ],
- 'Europe/Dublin' => [ qw(uk fr be nl dk se cz it) ],
- 'Europe/Helsinki' => [ qw(fi se no nl be de fr at it) ],
- 'Europe/Istanbul' => [ qw(il ru it cz it at de fr nl se) ],
- 'Europe/Lisbon' => [ qw(pt es fr it cz at de se) ],
- 'Europe/London' => [ qw(uk fr be nl de at cz se it) ],
- 'Europe/Madrid' => [ qw(es fr pt it cz at de se) ],
- 'Europe/Moscow' => [ qw(ru de pl cz at se be fr it) ],
- 'Europe/Oslo' => [ qw(no se fi dk de be at cz it) ],
- 'Europe/Paris' => [ qw(fr be de at cz nl it se) ],
- 'Europe/Prague' => [ qw(cz it at de fr nl se) ],
- 'Europe/Rome' => [ qw(it fr cz de at nl se) ],
- 'Europe/Stockholm' => [ qw(se no dk fi nl de at cz fr it) ],
- 'Europe/Vienna' => [ qw(at de cz it fr nl se) ],
- );
-
-#- get distrib release number (2006.0, etc)
-sub etc_version() {
- (my $v) = split / /, cat_('/etc/version');
- return $v;
-}
-
-#- returns the keyword describing the type of the distribution.
-#- the parameter indicates whether we want base or update sources
-sub distro_type {
- my ($want_base_distro) = @_;
- return 'cauldron' if $mageia_release =~ /cauldron/i;
- #- we can't use updates for community while official is not out (release ends in ".0")
- if ($want_base_distro || $mageia_release =~ /community/i && etc_version() =~ /\.0$/) {
- return 'official' if $mageia_release =~ /official|limited/i;
- return 'community' if $mageia_release =~ /community/i;
- #- unknown: fallback to updates
- }
- return 'updates';
-}
-
-sub compat_arch_for_updates($) {
- # FIXME: We prefer 64-bit packages to update on biarch platforms,
- # since the system is populated with 64-bit packages anyway.
- my ($arch) = @_;
- return $arch =~ /x86_64|amd64/ if arch() eq 'x86_64';
- MDK::Common::System::compat_arch($arch);
-}
-
-sub mirrors {
- my ($urpm, $want_base_distro) = @_;
- my $cachedir = $urpm->{cachedir} || '/root';
- require mirror;
- mirror::register_downloader(
- sub {
- my ($url) = @_;
- my $file = $url;
- $file =~ s!.*/!$cachedir/!;
- unlink $file; # prevent "partial file" errors
- before_leaving(sub { unlink $file });
-
- my ($gurpm, $id, $canceled);
- # display a message in statusbar (if availlable):
- $::statusbar and $id = statusbar_msg(
- $branded
- ? N("Please wait, downloading mirror addresses.")
- : N("Please wait, downloading mirror addresses from the Mageia website."),
- 0);
- my $_clean_guard = before_leaving {
- undef $gurpm;
- $id and statusbar_msg_remove($id);
- };
-
- require Rpmdragora::gurpm;
- require Rpmdragora::pkg;
-
- my $res = urpm::download::sync_url($urpm, $url,
- dir => $cachedir,
- callback => sub {
- $gurpm ||=
- Rpmdragora::gurpm->new(N("Please wait"),
- transient => $::main_window);
- $canceled ||=
- !Rpmdragora::pkg::download_callback($gurpm, @_);
- gtkflush();
- },
- );
- $res or die N("retrieval of [%s] failed", $file) . "\n";
- return $canceled ? () : cat_($file);
- });
- my @mirrors = @{ mirror::list(common::parse_LDAP_namespace_structure(cat_('/etc/product.id')), 'distrib') || [] };
- require timezone;
- my $tz = ${timezone::read()}{timezone};
- foreach my $mirror (@mirrors) {
- my $goodness;
- each_index { $_ = $u2l{$_} || $_; $_ eq $mirror->{country} and $goodness ||= 100-$::i } (map { if_($tz =~ /^$_$/, @{$t2l{$_}}) } keys %t2l), @$us;
- $mirror->{goodness} = $goodness + rand();
- $mirror->{country} = translate($mirror->{country});
- }
- unless (-x '/usr/bin/rsync') {
- @mirrors = grep { $_->{url} !~ /^rsync:/ } @mirrors;
- }
- return sort { $b->{goodness} <=> $a->{goodness} } @mirrors;
-}
-
-sub warn_for_network_need {
- my ($message, %options) = @_;
- $message ||=
-$branded
-? N("I need to access internet to get the mirror list.
-Please check that your network is currently running.
-
-Is it ok to continue?")
-: N("I need to contact the Mageia website to get the mirror list.
-Please check that your network is currently running.
-
-Is it ok to continue?");
- interactive_msg(N("Mirror choice"), $message, yesno => 1, %options) or return '';
-}
-
-sub choose_mirror {
- my ($urpm, %options) = @_;
- delete $options{message};
- my @transient_options = exists $options{transient} ? (transient => $options{transient}) : ();
- warn_for_network_need($options{message}, %options) or return;
- my @mirrors = eval { mirrors($urpm, $options{want_base_distro}) };
- my $error = $@;
- if ($error) {
- $error = "\n$error\n";
- interactive_msg(N("Error during download"),
-($branded
-? N("There was an error downloading the mirror list:
-
-%s
-The network, or the website, may be unavailable.
-Please try again later.", $error)
-: N("There was an error downloading the mirror list:
-
-%s
-The network, or the Mageia website, may be unavailable.
-Please try again later.", $error)), %options
-
- );
- return '';
- }
-
- !@mirrors and interactive_msg(N("No mirror"),
-($branded
-? N("I can't find any suitable mirror.")
-: N("I can't find any suitable mirror.
-
-There can be many reasons for this problem; the most frequent is
-the case when the architecture of your processor is not supported
-by Mageia Official Updates.")), %options
- ), return '';
-
- my $w = ugtk2->new(N("Mirror choice"), grab => 1, @transient_options);
- $w->{rwindow}->set_position($options{transient} ? 'center_on_parent' : 'center_always');
- my $tree_model = Gtk2::TreeStore->new("Glib::String");
- my $tree = Gtk2::TreeView->new_with_model($tree_model);
- $tree->get_selection->set_mode('browse');
- $tree->append_column(Gtk2::TreeViewColumn->new_with_attributes(undef, Gtk2::CellRendererText->new, text => 0));
- $tree->set_headers_visible(0);
-
- gtkadd(
- $w->{window},
- gtkpack_(
- Gtk2::VBox->new(0,5),
- 0, N("Please choose the desired mirror."),
- 1, create_scrolled_window($tree),
- 0, gtkpack(
- create_hbox('edge'),
- map {
- my $retv = $_->[1];
- gtksignal_connect(
- Gtk2::Button->new(but($_->[0])),
- clicked => sub {
- if ($retv) {
- my ($model, $iter) = $tree->get_selection->get_selected;
- $model and $w->{retval} = { sel => $model->get($iter, 0) };
- }
- Gtk2->main_quit;
- },
- );
- } [ N("Cancel"), 0 ], [ N("Ok"), 1 ]
- ),
- )
- );
- my %roots;
- $tree_model->append_set($roots{$_->{country}} ||= $tree_model->append_set(undef, [ 0 => $_->{country} ]),
- [ 0 => $_->{url} ]) foreach @mirrors;
-
- $w->{window}->set_size_request(500, 400);
- $w->{rwindow}->show_all;
-
- my $path = Gtk2::TreePath->new_first;
- $tree->expand_row($path, 0);
- $path->down;
- $tree->get_selection->select_path($path);
-
- $w->main && return grep { $w->{retval}{sel} eq $_->{url} } @mirrors;
-}
-
-sub show_urpm_progress {
- my ($label, $pb, $mode, $file, $percent, $total, $eta, $speed) = @_;
- $file =~ s|([^:]*://[^/:\@]*:)[^/:\@]*(\@.*)|$1xxxx$2|; #- if needed...
- state $medium;
- if ($mode eq 'copy') {
- $pb->set_fraction(0);
- $label->set_label(N("Copying file for medium `%s'...", $file));
- } elsif ($mode eq 'parse') {
- $pb->set_fraction(0);
- $label->set_label(N("Examining file of medium `%s'...", $file));
- } elsif ($mode eq 'retrieve') {
- $pb->set_fraction(0);
- $label->set_label(N("Examining remote file of medium `%s'...", $file));
- $medium = $file;
- } elsif ($mode eq 'done') {
- $pb->set_fraction(1.0);
- $label->set_label($label->get_label . N(" done."));
- $medium = undef;
- } elsif ($mode eq 'failed') {
- $pb->set_fraction(1.0);
- $label->set_label($label->get_label . N(" failed!"));
- $medium = undef;
- } else {
- # FIXME: we're displaying misplaced quotes such as "downloading `foobar from 'medium Main Updates'ยด"
- $file = $medium && length($file) < 40 ? #-PO: We're downloading the said file from the said medium
- N("%s from medium %s", basename($file), $medium)
- : basename($file);
- if ($mode eq 'start') {
- $pb->set_fraction(0);
- $label->set_label(N("Starting download of `%s'...", $file));
- } elsif ($mode eq 'progress') {
- if (defined $total && defined $eta) {
- $pb->set_fraction($percent/100);
- $label->set_label(N("Download of `%s'\ntime to go:%s, speed:%s", $file, $eta, $speed));
- } else {
- $pb->set_fraction($percent/100);
- $label->set_label(N("Download of `%s'\nspeed:%s", $file, $speed));
- }
- }
- }
- Gtk2->main_iteration while Gtk2->events_pending;
-}
-
-sub update_sources {
- my ($urpm, %options) = @_;
- my $cancel = 0;
- my $w; my $label; $w = wait_msg(
- $label = Gtk2::Label->new(N("Please wait, updating media...")),
- no_wait_cursor => 1,
- widgets => [
- my $pb = gtkset_size_request(Gtk2::ProgressBar->new, 300, -1),
- gtkpack(
- create_hbox(),
- gtksignal_connect(
- Gtk2::Button->new(N("Cancel")),
- clicked => sub {
- $cancel = 1;
- $urpm->{error}->(N("Canceled"));
- $w and $w->destroy;
- },
- ),
- ),
- ],
- );
- my @media; @media = @{$options{medialist}} if ref $options{medialist};
- my $outerfatal = $urpm->{fatal};
- local $urpm->{fatal} = sub { $w->destroy; $outerfatal->(@_) };
- urpm::media::update_those_media($urpm, [ urpm::media::select_media_by_name($urpm, \@media) ],
- %options, allow_failures => 1,
- callback => sub {
- $cancel and goto cancel_update;
- my ($type, $media) = @_;
- return if $type !~ /^(?:start|progress|end)$/ && @media && !member($media, @media);
- if ($type eq 'failed') {
- $urpm->{fatal}->(N("Error retrieving packages"),
-N("It's impossible to retrieve the list of new packages from the media
-`%s'. Either this update media is misconfigured, and in this case
-you should use the Software Media Manager to remove it and re-add it in order
-to reconfigure it, either it is currently unreachable and you should retry
-later.",
- $media));
- } else {
- show_urpm_progress($label, $pb, @_);
- }
- },
- );
- $w->destroy;
- cancel_update:
-}
-
-sub update_sources_check {
- my ($urpm, $options, $error_msg, @media) = @_;
- my @error_msgs;
- local $urpm->{fatal} = sub { push @error_msgs, $_[1]; goto fatal_error };
- local $urpm->{error} = sub { push @error_msgs, $_[0] };
- update_sources($urpm, %$options, noclean => 1, medialist => \@media);
- fatal_error:
- if (@error_msgs) {
- interactive_msg(N("Error"), sprintf(translate($error_msg), join("\n", map { formatAlaTeX($_) } @error_msgs)), scroll => 1);
- return 0;
- }
- return 1;
-}
-
-sub update_sources_interactive {
- my ($urpm, %options) = @_;
- my $w = ugtk2->new(N("Update media"), grab => 1, center => 1, %options);
- $w->{rwindow}->set_position($options{transient} ? 'center_on_parent' : 'center_always');
- my @buttons;
- my @media = grep { ! $_->{ignore} } @{$urpm->{media}};
- unless (@media) {
- interactive_msg(N("Warning"), N("No active medium found. You must enable some media to be able to update them."));
- return 0;
- }
- gtkadd(
- $w->{window},
- gtkpack_(
- 0, Gtk2::VBox->new(0,5),
- 0, Gtk2::Label->new(N("Select the media you wish to update:")),
- 1, gtknew('ScrolledWindow', height => 300, child =>
- # FIXME: using a listview would be just better:
- gtknew('VBox', spacing => 5, children_tight => [
- @buttons = map {
- Gtk2::CheckButton->new_with_label($_->{name});
- } @media
- ])
- ),
- 0, Gtk2::HSeparator->new,
- 0, gtkpack(
- create_hbox(),
- gtksignal_connect(
- Gtk2::Button->new(N("Cancel")),
- clicked => sub { $w->{retval} = 0; Gtk2->main_quit },
- ),
- gtksignal_connect(
- Gtk2::Button->new(N("Select all")),
- clicked => sub { $_->set_active(1) foreach @buttons },
- ),
- gtksignal_connect(
- Gtk2::Button->new(N("Update")),
- clicked => sub {
- $w->{retval} = any { $_->get_active } @buttons;
- # list of media listed in the checkbox panel
- my @buttonmedia = grep { !$_->{ignore} } @{$urpm->{media}};
- @media = map_index { if_($_->get_active, $buttonmedia[$::i]{name}) } @buttons;
- Gtk2->main_quit;
- },
- ),
- )
- )
- );
- if ($w->main) {
- return update_sources_noninteractive($urpm, \@media, %options);
- }
- return 0;
-}
-
-sub update_sources_noninteractive {
- my ($urpm, $media, %options) = @_;
-
- urpm::media::select_media($urpm, @$media);
- update_sources_check(
- $urpm,
- {},
- N_("Unable to update medium; it will be automatically disabled.\n\nErrors:\n%s"),
- @$media,
- );
- return 1;
-}
-
-sub add_medium_and_check {
- my ($urpm, $options) = splice @_, 0, 2;
- my @newnames = ($_[0]); #- names of added media
- my $fatal_msg;
- my @error_msgs;
- local $urpm->{fatal} = sub { printf STDERR "Fatal: %s\n", $_[1]; $fatal_msg = $_[1]; goto fatal_error };
- local $urpm->{error} = sub { printf STDERR "Error: %s\n", $_[0]; push @error_msgs, $_[0] };
- if ($options->{distrib}) {
- @newnames = urpm::media::add_distrib_media($urpm, @_);
- } else {
- urpm::media::add_medium($urpm, @_);
- }
- if (@error_msgs) {
- interactive_msg(
- N("Error"),
- N("Unable to add medium, errors reported:\n\n%s",
- join("\n", map { formatAlaTeX($_) } @error_msgs)) . "\n\n" . N("Medium: ") . "$_[0] ($_[1])",
- scroll => 1,
- );
- return 0;
- }
-
- foreach my $name (@newnames) {
- urpm::download::set_proxy_config($_, $options->{proxy}{$_}, $name) foreach keys %{$options->{proxy} || {}};
- }
-
- if (update_sources_check($urpm, $options, N_("Unable to add medium, errors reported:\n\n%s"), @newnames)) {
- urpm::media::write_config($urpm);
- $options->{proxy} and urpm::download::dump_proxy_config();
- } else {
- urpm::media::read_config($urpm, 0);
- return 0;
- }
-
- my %newnames; @newnames{@newnames} = ();
- if (any { exists $newnames{$_->{name}} } @{$urpm->{media}}) {
- return 1;
- } else {
- interactive_msg(N("Error"), N("Unable to create medium."));
- return 0;
- }
-
- fatal_error:
- interactive_msg(N("Failure when adding medium"),
- N("There was a problem adding medium:\n\n%s", $fatal_msg));
- return 0;
-}
-
-#- Check whether the default update media (added by installation)
-#- matches the current mdk version
-sub check_update_media_version {
- my $urpm = shift;
- foreach (@_) {
- if ($_->{name} =~ /(\d+\.\d+).*\bftp\du\b/ && $1 ne $distro_version) {
- interactive_msg(
- N("Warning"),
- $branded
- ? N("Your medium `%s', used for updates, does not match the version of %s you're running (%s).
-It will be disabled.",
- $_->{name}, $distrib{system}, $distrib{product})
- : N("Your medium `%s', used for updates, does not match the version of Mageia you're running (%s).
-It will be disabled.",
- $_->{name}, $distro_version)
- );
- $_->{ignore} = 1;
- urpm::media::write_config($urpm) if -w $urpm->{config};
- return 0;
- }
- }
- 1;
-}
-
-sub add_distrib_update_media {
- my ($urpm, $mirror, %options) = @_;
- #- ensure a unique medium name
- my $medium_name = $rpmdragora::mageia_release =~ /(\d+\.\d+) \((\w+)\)/ ? $2 . $1 . '-' : 'distrib';
- my $initial_number = 1 + max map { $_->{name} =~ /\(\Q$medium_name\E(\d+)\b/ ? $1 : 0 } @{$urpm->{media}};
- add_medium_and_check(
- $urpm,
- { nolock => 1, distrib => 1 },
- $medium_name,
- ($mirror ? $mirror->{url} : (undef, mirrorlist => '$MIRRORLIST')),
- probe_with => 'synthesis', initial_number => $initial_number, %options,
- usedistrib => 1,
- );
-}
-
-sub open_help {
- my ($mode) = @_;
- use run_program;
- run_program::raw({ detach => 1, as_user => 1 }, 'drakhelp', '--id', $mode ? "software-management-$mode" : 'software-management');
- my $_s = N("Help launched in background");
- statusbar_msg(N("The help window has been started, it should appear shortly on your desktop."), 1);
-}
-
-sub run_drakbug {
- my ($id) = @_;
- run_program::raw({ detach => 1, as_user => 1 }, 'drakbug', '--report', $id);
-}
-
-#mygtk2::add_icon_path('/usr/share/mcc/themes/default/');
-sub get_icon {
- my ($mcc_icon, $fallback_icon) = @_;
- my $icon = eval { mygtk2::_find_imgfile($mcc_icon) };
- $icon ||= eval { mygtk2::_find_imgfile($fallback_icon) };
- $icon;
-}
-
-sub strip_first_underscore { join '', map { s/_//; $_ } @_ }
-
-1;