#!/usr/bin/perl ########################################################################### # Copyright (C) 2010 Mandriva # # Thierry Vignaud # João Victor Duarte Martins # # 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. ########################################################################### BEGIN { unshift @::textdomains, 'mdkonline' } use strict; use lib qw(/usr/lib/libDrakX /usr/lib/libDrakX/drakfirsttime); use standalone; # for explanations use common; use run_program; use interactive; use interactive::gtk; use mygtk2 qw(gtknew); # only gtknew, any other stuff would break ugtk2 use ugtk2 qw(:all); use mdkonline qw($product_id); use mdkapplet_gui; use urpm::cfg; use utf8; # %product is keyed by product id and it contains the data to add # restricted media for each product. my %product = ( powerpack => { info_url => 'https://my.mandriva.com/powerpack/', has_rights => sub { my $profile = shift @_; $profile->{data}{'can-access-restricted-repositories'} eq 'YES'; }, media_name => 'Restricted', add_medium => \&mdkonline::add_medium_powerpack }, server => { info_url => 'http://www2.mandriva.com/linux/server/', has_rights => sub { my $profile = shift @_; $profile->{data}{groups}{'es5-prod'} or $profile->{data}{groups}{'es5-demo'}; }, media_name => 'Update', add_medium => \&mdkonline::add_medium_enterprise }, extended => { info_url => 'https://my.mandriva.com/', has_rights => sub { my ($profile, $version) = @_; return ! ref $profile->{data}{groups}{'ext-maint-' . $version}; }, media_name => 'Extended Maintenance', add_medium => \&mdkonline::add_medium_extended, success_callback => sub { mdkonline::read_sys_config(); $mdkonline::config{EXTENDED_SUPPORT} = bool2yesno(1); mdkonline::setVarsInSh($mdkonline::config_file, \%mdkonline::config); } } ); # Distribution upgrade version and product my $up_version; my $up_product; # Dialogs title and banner text my $title = N("Adding an additional package medium"); my $current_apimdv_distro; # ###################################################################### # Main Program { # Parsing command line arguments. my $usage = "Usage: $0 [OPTION]... VERSION\n" . "Add package medias for VERSION (of current product by default).\n" . "\n" . " --rpm-root=PATH Use PATH as root for rpm\n" . " --urpmi-root=PATH Use PATH as root for rpm and urpmi\n" . " --product=NAME Upgrade to VERSION of product named NAME\n"; foreach (@ARGV) { if (/^--(rpm-root|urpmi-root)=(.+)/) { $::rpmdrake_options{$1}[0] = $2; } elsif (/^--product=(.+)/) { $up_product = lc $1; } elsif (/^([^-]{2}.+)/) { $up_version = $1; } else { die $usage; } } $up_version or die $usage; # FIXME Couldn't that be automatic called when mdkonline.pm is used? $product_id or mdkonline::get_product_id(); # Product id data should be used in lowercase. $up_product ||= lc $product_id->{product}; # Sanitizes product command line argument. unless (exists $product{$up_product}) { my $available = join ", ", map { "'$_'" } keys %product; $available =~ s/(.+), ([^,]+)/$1 and $2/; die N("Supported products are %s, '%s' is not on the list.\n", $available, $up_product); } run_authentication_dialog(); ugtk2::exit(0); } sub run_authentication_dialog { my $description = N("Please fill in your account ID to add an additional package medium"); my $extra_info = undef; # extra widgets for the dialog if ($up_product eq 'extended') { # Setup extra_info widgets for extended product... my ($url, $extmaint_end, $desktop_update_end, $basic_update_end) = get_extended_maintenance_data(); if (my $err = $@) { interactive->vnew->ask_warn( N("Error"), N("Failure while retrieving distributions list:") . "\n$err" ); return; } $extra_info = [ gtknew('Label_Left', text_markup => join("\n\n", #-PO: Here '%s' will be a localized date (eg: # "2009/11/28" in english but "28/11/2009" # for brazil or "28 Nov. "2009" for # french: N("Mandriva provides 12 months of desktop updates (until %s) and 18 months of base updates (up to the %s) for distributions.", mdkapplet_gui::iso8601_date_to_locale( $desktop_update_end), mdkapplet_gui::iso8601_date_to_locale( $basic_update_end) ), N("Extended maintenance is now available to get 18 months of additional updates (until %s).", mdkapplet_gui::iso8601_date_to_locale( $extmaint_end)), N("You can subscribe right now to get extended maintenance:"), ), @common), new_link_button('http://www2.mandriva.com/support/lifecycle/', N("Lifetime policy")), new_link_button($url, N("Online subscription")) ]; } mdkapplet_gui::run_ask_credentials_dialog($title, $description, \&authenticate_callback, top_extra => $extra_info); return; } sub authenticate_callback { my ($email, $passwd) = @_; my $product = $product{$up_product}; my $profile = mdkonline::get_my_mdv_profile($email, $passwd); if ($profile->{code} != 0) { my $in = interactive->vnew; $in->ask_warn(N("Error"), N("An error occurred") . "\n" . $profile->{message}); goto &run_authentication_dialog; } elsif (!$product->{has_rights}->($profile)) { mdkapplet_gui::run_no_rights_dialog( $title, N("Your Mandriva account does not have %s download subscription enabled.", mdkonline::translate_product($up_product)), $product{$up_product}{info_url} ); } else { add_medium_for_product($product, $email, $passwd); } } sub add_medium_for_product { my ($product, $email, $passwd) = @_; my $error = 0; my $current_arch = urpm::cfg::get_arch(); # FIXME: This is not enough if we ever support more 64 archs # (sparc64, ppc64 and the like): my @archs = ($current_arch, if_($current_arch eq 'x86_64', 'i586')); foreach my $arch (@archs) { unless ($product->{add_medium}->($email, $passwd, $up_version, $arch)) { # FIXME: Backup original media setup so on error previous # added media in this loop can be removed? $error = 1; interactive->vnew->ask_warn( N("Error"), N("An error occurred while adding medium") ); goto &run_authentication_dialog; } } unless ($error) { $product->{success_callback} and $product->{success_callback}->(); my $w = ugtk2->new(N("Successfully added media!"), grab => 1); $w->_ask_okcancel(N("Successfully added media %s.", $product->{media_name}), N("Ok"), undef); ugtk2::main($w); } } sub get_extended_maintenance_data() { if (not $current_apimdv_distro) { require Rpmdrake::open_db; my @distros = mdkonline::get_distro_list(); return if !@distros; $current_apimdv_distro = mdkonline::find_current_distro(@distros); } return @$current_apimdv_distro{ qw(extended-maintenance extended-maintenance-end desktop-update-end basic-update-end) }; }