diff options
author | Antoine Ginies <aginies@mandriva.com> | 2011-01-19 10:44:49 +0000 |
---|---|---|
committer | Antoine Ginies <aginies@mandriva.com> | 2011-01-19 10:44:49 +0000 |
commit | 530a16ec071db0e24e6e949e265a96848864967c (patch) | |
tree | fe40cacd28d67b98186754c551b7fd339ebc7e17 /perl-install/standalone/drakbug | |
download | drakx-backup-do-not-use-530a16ec071db0e24e6e949e265a96848864967c.tar drakx-backup-do-not-use-530a16ec071db0e24e6e949e265a96848864967c.tar.gz drakx-backup-do-not-use-530a16ec071db0e24e6e949e265a96848864967c.tar.bz2 drakx-backup-do-not-use-530a16ec071db0e24e6e949e265a96848864967c.tar.xz drakx-backup-do-not-use-530a16ec071db0e24e6e949e265a96848864967c.zip |
add mes5-2.6.33 branch
Diffstat (limited to 'perl-install/standalone/drakbug')
-rwxr-xr-x | perl-install/standalone/drakbug | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/perl-install/standalone/drakbug b/perl-install/standalone/drakbug new file mode 100755 index 000000000..f99cf0a04 --- /dev/null +++ b/perl-install/standalone/drakbug @@ -0,0 +1,278 @@ +#!/usr/bin/perl + +# Drak Bug Report +# Copyright (C) 2002-2008 Mandriva (daouda at mandriva dot com) +# Stew Benedict (sbenedict 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 as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# 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. + +use strict; +use diagnostics; +use lib qw(/usr/lib/libDrakX); +use any; +use standalone; +use MDK::Common; +use common; +BEGIN { $::no_ugtk_init = 1 } +use mygtk2 qw(gtknew); +use ugtk2 qw(:all); +use Config; +use URI::Escape; +use run_program; + +my $prog; +my $incident = 0; +my ($table, $comb_app, $com_app, $button_pkg, $package, $distrocode, $error, $gdb_trace, $user_descr); + +my $i; +foreach (@ARGV) { + next unless defined $_; + $i++; + /^--error$/ and do { $error = splice(@ARGV, $i, 1) }; + /^--report$/ and $prog = splice(@ARGV, $i, 1); + /^--incident$/ and do { $incident = 1; $prog = splice(@ARGV, $i, 1) }; +} + +my $segfaulted = $error =~ /SEGV/; +if ($segfaulted && -x '/usr/bin/gdb') { + local $ENV{TMP} = $ENV{TMP} || '/tmp'; + my $file = chomp_(`mktemp $ENV{TMP}/drakbug.XXXXXXXX`); + my $_guard = before_leaving { rm_rf $file }; + if (-e $file) { + output($file, qq(bt +quit)); + local $ENV{LANGUAGE} = 'C'; + my $temp = run_program::get_stdout('gdb', '-q', 'perl', $$, '-x', $file); + $gdb_trace = join "\n", grep { !/^done\.$/ && !/Reading symbols from/ + && !/Loaded symbols/ && !/The program is run/ } split(/\n/, $temp); + } +} +if (!check_for_xserver()) { + print("Cannot be run in console mode.\n"); + print join("\n", + N("The \"%s\" program has crashed with the following error:", $prog), + $error, + $gdb_trace, + '') + if $error; + c::_exit(0); +} + +mygtk2::init(); + +$ugtk2::wm_icon = 'drakbug-16'; +my $window = ugtk2->new(N("Mandriva Linux Bug Report Tool"), center => 1); +$window->{rwindow}->set_border_width(5); +$window->{window}->signal_connect("delete_event", sub { ugtk2->exit(0) }); + +my $mdk_app = { + N("Mandriva Linux Control Center") => 'drakconf', + N("First Time Wizard") => 'drakfw', + N("Synchronization tool") => 'draksync', + N("Standalone Tools") => 'drakxtools', + "harddrake" => 'harddrake2', + N("Mandriva Online") => 'mdkonline', + N("Mandriva Online") => 'mdkapplet', + N("Remote Control") => 'rfbdrake', + N("Software Manager") => 'rpmdrake', + N("Windows Migration tool") => 'transfugdrake', + N("Configuration Wizards") => 'wizdrake', + }; + +my @generic_tool = keys %$mdk_app; +my @all_drakxtools = qw(adduserdrake diskdrake drakautoinst drakboot drakbug drakclock drakfloppy drakfont draksec drakxservices draksplash drakxtools drakxtv logdrake scannerdrake); +push @generic_tool, @all_drakxtools, qw(MandrivaUpdate drakbackup drakconnect drakfirewall drakhosts drakmenustyle draknfs draksambashare drakgw drakroam drakvpn keyboarddrake msec mousedrake net_monitor printerdrake urpmi userdrake XFdrake); + +my $kernel_release = chomp_(`uname -r`); +my $mandrake_release = chomp_(cat_('/etc/mandrakelinux-release')); +#- unused for now +#- (my $mandrake_version) = $mandrake_release =~ /(\d+\.\d+)/; + +if ($mandrake_release =~ /(official|community)/i) { + $distrocode = $mandrake_release; + $distrocode =~ s/^.*?(\d+\.\d+) \((\w+)\).*$/$1-\l$2/; +} else { + $distrocode = "cooker"; +} +my $bugzilla_url = 'http://qa.mandriva.com/enter_bug.cgi'; +my $wizard_name = "Bugzilla"; + +$table = create_packtable({ col_spacings => 5, row_spacings => 10 }, + [ gtknew('Label_Left', text => N("Select Mandriva Tool:")), $comb_app = Gtk2::ComboBox->new_text, $comb_app->set_wrap_width(3) ], + [ gtknew('Label_Left', text => N("or Application Name\n(or Full Path):")), + gtkpack_(Gtk2::HBox->new(0, 5), + 1, $com_app = gtkset_editable(Gtk2::Entry->new, 1), + 0, $button_pkg = Gtk2::Button->new(N("Find Package")), + ) ], + [ gtknew('Label_Left', text => N("Package: ")), $package = Gtk2::Entry->new_with_text("...") ], # complain on gtk-perl@ml + [ gtknew('Label_Left', text => N("Kernel:")), gtkset_editable(Gtk2::Entry->new_with_text($kernel_release), 0) ] + ); +$comb_app->set_popdown_strings("", uniq(sort(@generic_tool), if_($prog, $prog))); +$comb_app->set_text(""); + +sub format_trace_with_message { + my ($message, $trace) = @_; + ([ $message ], [ "\n\n " . join("\n ", split("\n", $trace)) . "\n\n", { family => 'monospace' }]); +} + +my $parent_uid = get_parent_uid(); + +my $width = 600; +gtkadd($window->{window}, + gtkpack_(Gtk2::VBox->new(0, 5), + 0, gtknew('Title1', label => $mandrake_release, width => $width), + 1, create_scrolled_window( + gtknew('TextView', editable => 0, height => 200, + text => [ + if_($prog, + if_($error, + format_trace_with_message( + ($gdb_trace ? + N("The \"%s\" program has segfaulted with the following error:", $prog) + : N("The \"%s\" program has crashed with the following error:", $prog)), + $error) + ), + if_($gdb_trace, format_trace_with_message(N("Its gdb trace is:"), $gdb_trace)), + ), + [ + N("To submit a bug report, click on the report button. \nThis will open a web browser window on %s where you'll find a form to fill in. The information displayed above will be transferred to that server. \nThings useful to include in your report are the output of lspcidrake -v, kernel version, and /proc/cpuinfo.", $wizard_name) + ] + ])), + 0, gtknew('Title2', label => N("Please describe what you were doing when it crashed:"), width => $width), + if_($incident, + 1, create_scrolled_window( + $user_descr = gtknew('TextView', editable => 1, height => 200) + ), + ), + if_(!$error, + 0, gtkadd($table), + ), + 0, gtkpack(Gtk2::HSeparator->new), + 0, gtkpack(create_hbox('edge'), + gtksignal_connect( + Gtk2::Button->new(N("Help")), clicked => sub { + run_program::raw({ detach => 1, setuid => $parent_uid }, 'drakhelp', '--id', 'drakbug'); + }), + gtkpack(create_hbox('end'), + gtksignal_connect(Gtk2::Button->new(N("Report")), clicked => \&report_bug_to_bugzilla), + gtksignal_connect(Gtk2::Button->new(N("Close")), clicked => sub { ugtk2->exit(0) }), + )))); + +if (defined $prog) { + update_app($prog); + $comb_app->set_text($prog); +} +$comb_app->entry->signal_connect('changed', sub { + my $text = $comb_app->entry->get_text; + $text and update_app($text); + }); + +$button_pkg->signal_connect('clicked', sub { + $comb_app->set_text(""); + my $pkg_name = get_package($com_app->get_text); + $package->set_text($pkg_name); + }); + +$window->{window}->show_all; +$window->main; +ugtk2->exit(0); + +sub update_app { + my ($text) = @_; + my $app_choice; + $ENV{PATH} = "/sbin:/usr/sbin:$ENV{PATH}"; + if (member($text, @all_drakxtools) || $text eq N("Standalone Tools")) { + $app_choice = chomp_(`rpm -q drakxtools`); + } elsif (exists($mdk_app->{$text})) { + $app_choice = get_package($mdk_app->{$text}); + } else { + $app_choice = get_package($text); + } + $app_choice ? $package->set_text($app_choice) : $package->set_text(N("Not installed")); +} + +my %packages; + +sub get_package { + my ($executable) = @_; + my ($rpm_package, $which_app); + $rpm_package = $packages{$executable}; + if (!defined $rpm_package) { + local $ENV{PATH} = "$ENV{PATH}:/sbin:/usr/sbin"; + $which_app = chomp_(`which '$executable' 2> /dev/null`); + # deush, rpm can takes some time aka it'll sleeps if something has opened rpm db ! + $rpm_package = $which_app eq "" ? N("Package not installed") : common::to_utf8(chomp_(`rpm -qf '$which_app' 2>&1`)); + $packages{$executable} = $rpm_package; + } + $rpm_package; +} + +sub report_bug_to_bugzilla() { + my $p = $package->get_text; + my ($product, $version) = $p =~ /^(.*)-([^-]+-[^-]+(mdk|mdv.*))$/; # FIXME: fragile! + my $app = $comb_app->entry->get_text; + my $_component = $app ? + if_(member($app, @all_drakxtools), $app) || $mdk_app->{$app} : + $product; + my $text; + if ($incident) { + my $buffer = $user_descr->get_buffer; + $text = $buffer->get_text($buffer->get_start_iter, $buffer->get_end_iter, 0); + if (!$text) { + err_dialog(N("Warning"), + N("You must type in what you were doing when this bug happened in order to enable us to reproduce this bug and to increase the odds of fixing it") + . "\n\n" . N("Thanks.")); + return; + } + } + my $rel_data = mandrake_release_info(); + my $rel = standalone::real_version(); + my $cpuinfo; + if (cat_('/proc/cpuinfo') =~ /model name\s*:\s*(.*)$/m) { + $cpuinfo = $1; + } + my $arch = arch(); + $arch = 'i586' if arch =~ /^i.86/; + my $options = join('&', + ($product || $version ? 'cf_rpmpkg=' . join('-', $product, $version) : ()), + 'version=' . ($rel_data->{branch} eq 'Devel' ? 'Cooker' : $rel_data->{version}), + 'component=Core%20Packages', + 'classification=Mandriva%20Linux', + "rep_platform=$arch", + if_($incident, + "short_desc=$prog%20" . ($segfaulted ? 'segfaulted' : 'crashed'), + ), + 'comment=' . uri_escape( + if_($incident, + qq(The "$prog" program crashed. Drakbug-$rel caught it. + +) . ($text || "Please describe what you were doing when it crashed.") . "\n\n" + . ($error ? qq(Backtrace was: +$error) : + qq(If you can, try to run the "$prog" program from a terminal and copy and paste here any error messages and/or backtrace)) + . if_($gdb_trace, qq( +GDB backtrace was (its interesting part is below Perl_pp_fork() or Perl_pp_waitpid()): +$gdb_trace)), + ) + . qq( +Kernel version = $kernel_release +Distribution=) . cat_('/etc/release') +. if_($cpuinfo, "CPU=$cpuinfo") + ), + ); + print($bugzilla_url . "?" . $options . "\n"); + run_program::raw({ detach => 1, setuid => $parent_uid }, '/usr/bin/www-browser', "$bugzilla_url?$options"); +} + |