diff options
Diffstat (limited to 'mgaonline.pm')
-rw-r--r-- | mgaonline.pm | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/mgaonline.pm b/mgaonline.pm new file mode 100644 index 00000000..2bb78efc --- /dev/null +++ b/mgaonline.pm @@ -0,0 +1,312 @@ +################################################################################ +# Mandriva Online functions # +# # +# Copyright (C) 2004-2005 Mandrakesoft # +# 2005-2006 Mandriva # +# # +# Daouda Lo # +# Thierry Vignaud <tvignaud at mandriva dot 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. # +################################################################################ + +package mgaonline; + +use strict; + +use lib qw(/usr/lib/libDrakX); +use common; +use ugtk2; + +use LWP::UserAgent; +use URI::Escape; +use XML::Simple; +use HTTP::Request::Common; +use HTTP::Request; + +our @ISA = qw(Exporter); +our @EXPORT = qw(find_current_distro + fork_exec + get_banner + get_distro_list + get_from + get_product_id + get_release + get_stale_upgrade_filename + get_urpmi_options + is_it_2008_0 + is_enterprise_media_supported + is_extmaint_supported + is_restricted_media_supported + read_sys_config + translate_product + xml2perl + %config + $config_file + $product_id + $root); +our @EXPORT_OK = qw( + get_product_info + get_my_mdv_profile + add_medium_powerpack + add_medium_enterprise + add_medium_extended +); + +our (%config, $product_id, $root); +our $version = 1; + +use log; + +our $config_file = '/etc/sysconfig/mgaapplet'; +my $release_file = find { -f $_ } map { "/etc/${_}release" } '', qw(mageia- mandriva- mandrakelinux- mandrake- redhat-); + +sub read_sys_config() { + %config = getVarsFromSh($config_file); +} + +sub get_stale_upgrade_filename() { + '/var/lib/urpmi/stale_upgrade_in_progress'; +} + +sub get_product_id() { + $product_id = common::parse_LDAP_namespace_structure(cat_("$root/etc/product.id")); +} + +sub get_release() { + my ($r) = cat_($release_file) =~ /release\s+(\S+)/; + ($r); +} + +sub is_it_2008_0() { + $product_id->{version} eq '2008.0'; +} + +sub is_extmaint_supported() { + $product_id->{support} eq 'extended'; +} + +sub is_enterprise_media_supported() { + return if is_it_2008_0(); + to_bool($product_id->{type} eq 'Enterprise' && $product_id->{product} eq 'Server'); +} + +sub is_restricted_media_supported() { + return if is_it_2008_0(); + to_bool($product_id->{product} =~ /powerpack/i); +} + +sub find_current_distro { + find { $_->{version} eq $product_id->{version} } @_; +} + +sub get_distro_list_() { + #- contact the following URL to retrieve the list of released distributions. + my $type = lc($product_id->{type}); $type =~ s/\s//g; + my $extra_path = $::testing || uc($config{TEST_DISTRO_UPGRADE}) eq 'YES' ? 'testing-' : ''; + my $list = + join('&', + # now at http://mirrors.mageia.org/api/{name}.{version}.i586.list + "http://releases.mageia.org/api/a/$extra_path$product_id->{arch}?product=$product_id->{product}", + "version=$product_id->{version}", + "mgaonline_version=$mgaonline::version", + ); + log::explanations("trying distributions list from $list"); + + eval { + my $urpm = Rpmdrake::open_db::fast_open_urpmi_db(); + + # prevent SIGCHILD handler's waitpid to interfere with urpmi waiting + # for curl exit code, which broke downloads: + local $SIG{CHLD} = 'DEFAULT'; + + # old API: + if (member($product_id->{version}, qw(2007.1 2008.0 2008.1))) { + require mgaapplet_urpm; + mgaapplet_urpm::ensure_valid_cachedir($urpm); + mgaapplet_urpm::get_content($urpm, $list); + } else { + urpm::ensure_valid_cachedir($urpm); + urpm::download::get_content($urpm, $list); + } + }; +} + +sub get_distro_list() { + return if $product_id->{product} =~ /Flash/; + + my @lines = get_distro_list_(); + + if (my $err = $@) { + log::explanations("failed to download distribution list:\n$err"); + return; # not a fatal error + } + + if (!@lines) { + log::explanations("empty distribution list"); + return; + } + + map { common::parse_LDAP_namespace_structure(chomp_($_)) } grep { /^[^#]/ } @lines; +} + + +sub clean_confdir() { + my $confdir = '/root/.MdkOnline'; + system "/bin/rm", "-f", "$confdir/*log.bz2", "$confdir/*log.bz2.uue", "$confdir/*.dif $confdir/rpm_qa_installed_before", "$confdir/rpm_qa_installed_after"; +} + + +sub fork_exec { + run_program::raw({ detach => 1 }, @_); +} + +sub translate_product { + my ($product) = @_; + my %strings = ( + flash => N("Mageia Flash"), + free => N("Mageia Free"), + mini => N("Mageia Mini"), + one => N("Mageia One"), + powerPack => N("Mageia PowerPack"), + server => N("Mageia Enterprise Server"), + ); + $product ||= lc $product_id->{product}; + $strings{$product} || $product; +} + +# TODO Move all product.id handling to a separate module +# (MDV::ProductId?) +sub get_product_info { + my ($product) = @_; + my %info = ( + powerpack => { + name => N("Mageia PowerPack"), + description => N("The Mageia Linux distribution with even more softwares and official support."), + }, + free => { + name => N("Mageia Free"), + description => N("The 100%% Open Source distribution freely available."), + }, + ); + $product ||= lc $product_id->{product}; + return $info{$product}; +} + +sub get_banner_icon() { + find { -e $_ } + qw(/usr/share/mcc/themes/default/rpmdrake-mga.png /usr/share/icons/large/mgaonline.png); +} + +sub get_banner { + my ($o_title) = @_; + Gtk2::Banner->new(get_banner_icon(), $o_title || N("Distribution Upgrade")); +} + +sub get_urpmi_options() { + ({ sensitive_arguments => 1 }, 'urpmi.addmedia', if_(!is_it_2008_0(), '--xml-info', 'always')); +} + +sub add_medium_enterprise { + my ($email, $password, $version, $arch) = @_; + my $uri = sprintf('https://%s:%s@download.FIXME.com/%s/rpms/%s/', + uri_escape($email), + uri_escape($password), + $version, + $arch); + my @options = get_urpmi_options(); + run_program::raw(@options, '--update', '--distrib', $uri); +} + +sub add_medium_powerpack { + my ($email, $password, $version, $arch) = @_; + my $uri = sprintf('https://%s:%s@dl.FIXME.com/rpm/comm/%s/', + uri_escape($email), + uri_escape($password), + $version); + my @options = get_urpmi_options(); + + # add release and updates media... + run_program::raw(@options, + "Restricted $arch " . int(rand(100000)), + "$uri$arch") + or return 0; + run_program::raw(@options, + '--update', + "Restricted Updates $arch " . int(rand(100000)), + "${uri}updates/$arch"); +} + +sub add_medium_extended { + my ($email, $password, $version, $arch) = @_; + my $uri = sprintf("https://%s:%s\@dl.FIXME.com/extended/%s/%s", + uri_escape($email), + uri_escape($password), + $version, + $arch); + my @options = (get_urpmi_options(), '--update'); + run_program::raw(@options, + "Extended Maintenance $arch " . int(rand(100000)), + ${uri}); +} + +sub is_running { + my ($name) = @_; + my $found; + foreach (`ps -o '%P %p %c' -u $ENV{USER}`) { + my ($ppid, $pid, $n) = /^\s*(\d+)\s+(\d+)\s+(.*)/; + if ($ppid != 1 && $pid != $$ && $n eq $name) { + $found = $pid; + last; + } + } + $found; +} + + +sub get_from { + my ($link, $header) = @_; + + my $ua = LWP::UserAgent->new; + $ua->agent(sprintf('mgaapplet (mgaonline-%s; distribution: %s)', + $mgaonline::version, $version)); + $ua->env_proxy; + + my $response = $ua->post($link, $header); + $response; +} + +sub get_my_mdv_profile { + my ($email, $password) = @_; + xml2perl(get_from('https://my.FIXME.com/rest/authenticate', + [ 'username', $email, 'password', $password, + 'return', 'userdata' ])); +} + +# callers need to require XML::Simple +sub xml2perl { + my ($res) = @_; + my $ref = eval { XML::Simple->new->XMLin($res->{_content}) }; + if (my $err = $@) { + warn ">> XML error: $err\n"; + $ref = { + code => 1, + message => $err, + }; + } + $ref; +} + + +1; |