summaryrefslogtreecommitdiffstats
path: root/urpm
diff options
context:
space:
mode:
Diffstat (limited to 'urpm')
-rw-r--r--urpm/README.dudf28
-rw-r--r--urpm/args.pm6
-rw-r--r--urpm/dudf.pm498
3 files changed, 0 insertions, 532 deletions
diff --git a/urpm/README.dudf b/urpm/README.dudf
deleted file mode 100644
index 3136f420..00000000
--- a/urpm/README.dudf
+++ /dev/null
@@ -1,28 +0,0 @@
-urpmi-dudf is an extension module to urpmi to allow urpmi to generate
-and upload dudf error files.
-
-This is a part of the Europeen Mancoosi project,
-a project to enhance Linux Package Management.
-
-See http://www.mancoosi.org/ for more details.
-
-Once the package urpmi-dudf installed, when a problem occurs during
-an installation using urpmi, urpmi will ask the user the authorization
-to generate and upload a dudf report to mancoosi's servers.
-
-If the user wants to generate and upload a dudf report event is the installation
-has no problem, it can use the urpmi option --force-dudf
-
-Example :
-# urpmi --force-dudf powertop
-
-
-A log of dudf uploads is stored in /var/cache/urpmi/dudf/dudf_uploads.log
-
-The format of each line of this log is :
- <date time of generation> <uid>
-
- The user can access to uploaded report by entering the <uid> into the appropriate field
- of http://www.mancoosi.org/
-
-A man page in section 8 exists : urpmi-dudf
diff --git a/urpm/args.pm b/urpm/args.pm
index b4084ae6..aa7b0d79 100644
--- a/urpm/args.pm
+++ b/urpm/args.pm
@@ -363,12 +363,6 @@ my %options_spec = (
);
-eval {
- #require urpm::dudf;
- $options_spec{urpmi}{'force-dudf'} = \$::force_dudf;
-};
-
-
# generate urpmf options callbacks
sub add_urpmf_cmdline_tags {
foreach my $k (@_) {
diff --git a/urpm/dudf.pm b/urpm/dudf.pm
deleted file mode 100644
index 8bb407a0..00000000
--- a/urpm/dudf.pm
+++ /dev/null
@@ -1,498 +0,0 @@
-package urpm::dudf;
-
-# $Id: dudf.pm 639 2009-04-17 14:32:03Z orosello $
-
-our @ISA = qw();
-use strict;
-use Exporter;
-use URPM;
-use urpm;
-use urpm::msg;
-use urpm::util;
-use Cwd;
-use IO::File;
-use locale;
-use POSIX qw(locale_h strtod);
-use POSIX qw(strftime);
-use File::Path;
-use Compress::Zlib;
-use XML::Writer;
-use Data::UUID;
-
-#- Timeout for curl connection and wget operations
-our $CONNECT_TIMEOUT = 60; #- (in seconds)
-
-use fields qw(
- access_url
- distribution_codename
- distribution_description
- distribution_name
- distribution_release
- dudf_dir
- dudf_file
- dudf_filename
- dudf_time
- dudf_uid
- dudf_urpm
- exit_code
- exit_msg
- force_dudf
- installer_name
- installer_version
- log_file
- metainstaller_name
- metainstaller_version
- package_universe_synthesis
- packages_removed
- packages_upgraded
- pkgs_toinstall
- pkgs_user
- pkgs_user_install
- pkgs_user_upgrade
- version
- xmlns
- xmlnsdudf
- );
-
-my @package_status;
-
-BEGIN {}
-
-(our $VERSION) = q($Revision: 246 $) =~ /(\d+)/;
-
-sub dudf_exit {
- my ($self, $exit_code, $o_exit_msg) = @_;
- $self->set_exit_code($exit_code);
- if ($o_exit_msg) {
- $self->set_exit_msg($o_exit_msg);
- }
- $self->write_dudf;
- exit($exit_code);
-}
-
-sub get_distribution {
- my ($self) = @_;
-
- my $handle = new IO::File;
- if ($handle->open("</etc/lsb-release")) {
- while (<$handle>) {
- if (m/DISTRIB_ID=/i) { s/.*=//; s/\n//; $self->{distribution_name} = $_ }
- if (m/DISTRIB_RELEASE=/i) { s/.*=//; s/\n//; $self->{distribution_release} = $_ }
- if (m/DISTRIB_CODENAME=/i) { s/.*=//; s/\n//; $self->{distribution_codename} = $_ }
- if (m/DISTRIB_DESCRIPTION=/i) { s/.*=//; s///g; s/\n//; $self->{distribution_description} = $_ }
- }
- $handle->close;
- }
-}
-
-sub check_package {
- my ($urpm, $pkg) = @_;
- my $db = urpm::db_open_or_die_($urpm);
- my @l;
- $db->traverse_tag("name", [ $pkg ], sub {
- my ($p) = @_;
- $p->pack_header;
- push(@l, $p);
- });
- \@l;
-}
-
-# Find packages selected to be removed due to obsoletes and store them into @{$self->{packages_removed}}
-# or due to upgrade or conflict and store them into @{$self->{packages_upgraded}}
-sub check_removed_upgraded {
- my ($self, $state) = @_;
- my $urpm = ${$self->{dudf_urpm}};
- my $t = $state->{rejected};
-
- foreach my $pkg (keys %$t) {
- my $v = $t->{$pkg};
- if ($v->{obsoleted} == 1) {
- $pkg =~ s/-.*//;
- my $p = check_package($urpm,$pkg);
- push(@{$self->{packages_removed}}, $p);
- }
- if ($v->{removed} == 1) {
- $pkg =~ s/-.*//;
- my $p = check_package($urpm,$pkg);
- push(@{$self->{packages_upgraded}}, $p);
- }
- }
-}
-
-sub get_package_status_ {
- my ($ps) = @_;
- $ps->pack_header;
- push(@package_status, $ps);
-}
-
-# Store list of installed packages
-sub get_package_status {
- my ($self) = @_;
- my $db = urpm::db_open_or_die_(${$self->{dudf_urpm}});
- $db->traverse(\&get_package_status_);
-}
-
-# Store list of synthesis files to parse
-sub get_package_universe {
- my ($self) = @_;
- my $urpm = ${$self->{dudf_urpm}};
-
- @{$self->{package_universe_synthesis}} = grep { !$_->{ignore} } @{$urpm->{media}};
-}
-
-# Parse a synthesis file
-sub get_synthesis {
- my ($self, $file, $doc) = @_;
- my $buffer;
-
- my $gz = gzopen($file, "rb");
-# or die "Cannot open $file: $gzerrno\n" ;
-
- $doc->characters($buffer)
- while $gz->gzread($buffer) > 0;
-# die "Error reading from $file: $gzerrno\n"
-# if my $gzerrno != Z_STREAM_END ;
-
- $gz->gzclose;
-}
-
-sub new {
- my ($class, $urpm, $action, $force_dudf) = @_;
- my $self = {
- dudf_urpm => $urpm,
- action => $action,
- force_dudf => $force_dudf,
- dudf_file => undef,
- exit_code => 0,
- metainstaller_name => $0,
- metainstaller_version => $urpm::VERSION,
- xmlns => "http://www.mancoosi.org/2008/cudf/dudf",
- xmlnsdudf => "http://www.mancoosi.org/2008/cudf/dudf",
- version => "1.0",
- dudf_time => undef
- };
-
- my $base_url = "http://dudf.mageia.org/";
- $self->{access_url} = $base_url . "/file/";
- $self->{upload_url} = $base_url . "/upload";
- $self->{metainstaller_name} =~ s/.*\///;
- ${$self->{dudf_urpm}}->{fatal} = sub { printf STDERR "%s\n", $_[1]; $self->set_exit_msg($_[1]); $self->set_exit_code($_[0]); $self->write_dudf; exit($_[0]) };
- ${$self->{dudf_urpm}}->{error} = sub { printf STDERR "%s\n", $self->set_exit_msg($_[0]); $_[0] };
- #${$self->{dudf_urpm}}->{log} = sub { printf STDERR "%s\n", $_[0] };
-
- $urpm = ${$self->{dudf_urpm}};
- $self->{dudf_dir} = $urpm->{cachedir} . "/dudf";
- $self->{log_file} = $self->{dudf_dir} . "/dudf_uploads.log";
- if (!-d $self->{dudf_dir}) {
- mkpath($self->{dudf_dir});
- }
-
- # If there is no log file, we create the default content here
- if (! -f $self->{log_file})
- {
- output_safe($self->{log_file},
- N("# Here are logs of your DUDF uploads.\n# Line format is : <date time of generation> <uid>\n# You can use uids to see the content of your uploads at this url :\n# %s", $base_url));
- }
- my $ug = new Data::UUID;
- $self->{dudf_uid} = $ug->to_string($ug->create_str);
- $self->{dudf_filename} = "dudf_" . $self->{dudf_uid} . ".dudf.xml";
- $self->{dudf_file} = $self->{dudf_dir} . "/" . $self->{dudf_filename};
-
- bless($self,$class);
- return $self;
-}
-
-sub set_error_msg {
- my ($self, $m) = @_;
- $self->{exit_msg} .= $m;
-}
-
-sub set_exit_msg {
- my ($self, $m) = @_;
- $self->{exit_msg} .= $m;
-}
-
-# store the exit code
-sub set_exit_code {
- my ($self, $exit_code) = @_;
-
- $self->{exit_code} = $exit_code;
-}
-
-# Store the list of packages the user wants to install (given to urpmi)
-sub store_userpkgs {
- my ($self, @pkgs) = @_;
-
- @{$self->{pkgs_user}} = @pkgs;
-}
-
-# Store a list of packages selected by urpmi to install
-sub store_toinstall {
- my ($self, @pkgs) = @_;
-
- @{$self->{pkgs_toinstall}} = @pkgs;
-}
-
-#upload dudf data to server
-sub upload_dudf {
- -x "/usr/bin/curl" or do { print N("curl is missing, cannot upload DUDF file.\n"); return };
- my ($self, $options) = @_;
-
- print N("Compressing DUDF data... ");
- # gzip the file to upload
- open(FILE, $self->{dudf_file}) or do { print N("NOT OK\n"); return };
- my $gz = gzopen($self->{dudf_file} . ".gz", "wb") or do { print N("NOT OK\n"); return };
- $gz->gzsetparams(Z_BEST_COMPRESSION, Z_DEFAULT_STRATEGY);
-
- while (<FILE>) {
- $gz->gzwrite($_);
- }
- $gz->gzclose;
- close(FILE);
- print N("OK\n");
-
- print N("Uploading DUDF data:\n");
- my (@ftp_files, @other_files);
- push @other_files, $self->{dudf_filename};
- my @l = (@ftp_files, @other_files);
- my $cmd = join(" ", map { "'$_'" } "/usr/bin/curl",
- "-q", # don't read .curlrc; some toggle options might interfer
- ($options->{proxy} ? urpm::download::set_proxy({ type => "curl", proxy => $options->{proxy} }) : ()),
- ($options->{retry} ? ('--retry', $options->{retry}) : ()),
- "--stderr", "-", # redirect everything to stdout
- "--connect-timeout", $CONNECT_TIMEOUT,
-# "-s",
- "-f",
- "--anyauth",
- (defined $options->{'curl-options'} ? split /\s+/, $options->{'curl-options'} : ()),
- "-F file=@" . $self->{dudf_file} . ".gz",
- "-F id=" . $self->{dudf_uid},
- $self->{upload_url},
- );
- urpm::download::_curl_action($cmd, $options, @l, 1);
- unlink $self->{dudf_file} . ".gz";
- unlink $self->{dudf_file};
- print N("\nYou can see your DUDF report at the following URL :\n\t");
- print $self->{access_url} . "?uid=" . $self->{dudf_uid} . "\n";
- append_to_file($self->{log_file}, $self->{dudf_time} . "\t" . $self->{dudf_uid} . "\n");
- print N("You can access a log of your uploads in\n\t") . $self->{log_file} . "\n";
-}
-
-sub xml_pkgs {
- my ($doc, $pk) = @_;
-
- if ($pk->epoch) {
- $doc->startTag("package", "name" => $pk->name, "version" => $pk->version, "arch" => $pk->arch, "release" => $pk->release, "epoch" => $pk->epoch);
- }
- else {
- $doc->startTag("package", "name" => $pk->name, "version" => $pk->version, "arch" => $pk->arch, "release" => $pk->release);
- }
- if ($pk->provides) {
- $doc->startTag("provides");
- foreach my $i ($pk->provides) {
- $doc->characters("@" . $i);
- }
- $doc->endTag;
- }
- if ($pk->requires) {
- $doc->startTag("requires");
- foreach my $i ($pk->requires) {
- $doc->characters("@" . $i);
- }
- $doc->endTag;
- }
- if ($pk->conflicts) {
- $doc->startTag("conflicts");
- foreach my $i ($pk->conflicts) {
- $doc->characters("@" . $i);
- }
- $doc->endTag;
- }
- if ($pk->obsoletes) {
- $doc->startTag("obsoletes");
- foreach my $i ($pk->obsoletes) {
- $doc->characters("@" . $i);
- }
- $doc->endTag;
- }
- $doc->endTag;
-}
-
-sub compute_pkgs_user {
- my ($self) = @_;
- my $in;
-
- foreach my $p (@{$self->{pkgs_user}}) {
- $in = 0;
- foreach my $pk (@package_status) {
- # packages installed by urpmi are removed from the list
- if (@{$self->{pkgs_toinstall}}) {
- foreach my $pkg (@{$self->{pkgs_toinstall}}) {
- if ($p eq $pk->name) {
- if (($pkg->name ne $pk->name ||
- $pkg->version ne $pk->version ||
- $pkg->arch ne $pk->arch ||
- $pkg->release ne $pk->release ||
- $pkg->epoch ne $pk->epoch)) {
- $in = 1;
- if (!grep($p, @{$self->{pkgs_user_upgrade}})) {
- push(@{$self->{pkgs_user_upgrade}}, $p);
- }
- }
- }
- }
- }
- }
- if (($in == 0) && (!grep($p, @{$self->{pkgs_user_install}}))) {
- push(@{$self->{pkgs_user_install}}, $p);
- }
- }
-}
-
-# Generate DUDF data
-sub write_dudf {
- my ($self) = @_;
-
- if ( (!${$self->{dudf_urpm}}->{options}{auto}) &&
- ( ($self->{exit_code} > 9) ||
- (!$self->{exit_code} && $self->{force_dudf}) ) ) {
- my $noexpr = N("Nn");
- my $msg = N("A problem has been encountered. You can help Mandriva to improve package\ninstallation by uploading a DUDF report file.\nThis is a part of the Mancoosi european research project.\nMore at http://www.mancoosi.org\n");
- $msg .= N("Do you want to upload a DUDF report to Mandriva?");
- if ($self->{force_dudf} || message_input_($msg . N(" (Y/n) "), boolean => 1) !~ /[$noexpr]/) {
- print N("\nGenerating DUDF... ");
-
- urpm::db_open_or_die(urpm->new)->traverse_tag("name", [ "rpm" ], sub { my ($p) = @_; $self->{installer_name} = $p->name; $self->{installer_version} = $p->version });
- $self->get_package_status;
- $self->get_package_universe;
- $self->compute_pkgs_user;
-
- my $output = new IO::File;
- if ($output->open(">" . $self->{dudf_file})) {
- my $doc = new XML::Writer(OUTPUT => $output, DATA_MODE => 1, DATA_INDENT => 1, NEW_LINES => 1, ENCODING => 'utf-8');
- $doc->xmlDecl("UTF-8");
-
- $self->get_distribution;
-
- my $old_locale = setlocale(LC_CTYPE);
- setlocale(LC_TIME, "C");
- my $now = time();
-
- $doc->startTag("dudf", version => $self->{version}, xmlns => $self->{xmlns}, "xmlns:dudf" => $self->{xmlnsdudf});
- $doc->dataElement(timestamp => strftime("%a, %d %b %Y %H:%M:%S %z", localtime($now)));
- $self->{dudf_time} = strftime("%Y%m%d %H:%M:%S %z", localtime($now));
-
- setlocale(LC_CTYPE, $old_locale);
-
- # From here, the indent is special : a new ident is made for each XML tag opening
- # It's easier to debug XML with this
- $doc->dataElement(uid => $self->{dudf_uid});
-
- $doc->startTag("distribution");
- $doc->characters($self->{distribution_name});
- # Following lines removed because these elements are not specified into dudf for now (leave comment in code for future usage)
- # $doc->dataElement(name => "$self->{distribution_name}");
- # $doc->dataElement(release => "$self->{distribution_release}");
- # $doc->dataElement(codename => "$self->{distribution_codename}");
- # $doc->dataElement(description => "$self->{distribution_description}");
- $doc->endTag;
- $doc->startTag("installer");
- $doc->dataElement(name => $self->{installer_name});
- $doc->dataElement(version => $self->{installer_version});
- $doc->endTag;
- $doc->startTag("meta-installer");
- $doc->dataElement(name => $self->{metainstaller_name});
- $doc->dataElement(version => $self->{metainstaller_version});
- $doc->endTag;
- $doc->startTag("problem");
- $doc->startTag("package-status");
- $doc->startTag("installer");
- # packages removed by urpmi are added back
- foreach my $pkg (@{$self->{packages_removed}}) {
- foreach my $pk (@$pkg) {
- xml_pkgs($doc,$pk);
- }
- }
- # packages upgraded by urpmi are restored in the list (version before upgrade)
- foreach my $pkg (@{$self->{packages_upgraded}}) {
- foreach my $pk (@$pkg) {
- xml_pkgs($doc,$pk);
- }
- }
- # packages already installed before the launch of urpmi
- foreach my $pk (@package_status) {
- # packages installed by urpmi are removed from the list
- if (@{$self->{pkgs_toinstall}}) {
- foreach my $pkg (@{$self->{pkgs_toinstall}}) {
- if (($pkg->name ne $pk->name ||
- $pkg->version ne $pk->version ||
- $pkg->arch ne $pk->arch ||
- $pkg->release ne $pk->release ||
- $pkg->epoch ne $pk->epoch)) {
- xml_pkgs($doc,$pk);
- }
- }
- }
- else {
- xml_pkgs($doc,$pk);
- }
- }
- $doc->endTag;
- $doc->dataElement("meta-installer" => "meta installer package status");
- $doc->endTag;
- $doc->startTag("package-universe");
- foreach my $media (@{$self->{package_universe_synthesis}}) {
- my $file = $media->{name};
- my $url = $media->{url};
- my $filename = urpm::media::any_synthesis(${$self->{dudf_urpm}},$media);
- $doc->startTag("package-list", "dudf:format" => "synthesis", "dudf:filetype" => $file, "dudf:filename" => $filename, "dudf:url" => $url);
- $self->get_synthesis($filename, $doc);
- $doc->endTag;
- }
- $doc->endTag;
- $doc->startTag("action");
- $doc->startTag("upgrade");
- foreach my $pkg (@{$self->{pkgs_user_upgrade}}) {
- $doc->startTag("package", "name" => $pkg);
- $doc->endTag;
- }
- $doc->endTag;
- $doc->startTag("install");
- foreach my $pkg (@{$self->{pkgs_user_install}}) {
- $doc->startTag("package", "name" => $pkg);
- $doc->endTag;
- }
- $doc->endTag;
- $doc->startTag("command");
- $doc->characters($self->{action});
- $doc->endTag;
- $doc->endTag;
- $doc->startTag("desiderata");
- $doc->endTag;
- $doc->endTag;
- $doc->startTag("outcome");
- $doc->startTag("dudf:result");
- $doc->characters(($self->{exit_code} == 0 ? "success" : "failure"));
- $doc->endTag;
- if ($self->{exit_code}) {
- $doc->startTag("error");
- $doc->characters($self->{exit_msg});
- $doc->endTag;
- }
- $doc->endTag;
- $doc->endTag;
- $doc->end;
- $output->close;
- print N("OK\n");
- $self->upload_dudf;
- }
- else {
- print N("Cannot write DUDF file.\n");
- }
- }
- }
-}
-
-1;
-
-__END__