diff options
Diffstat (limited to 'perl-install/standalone/drakbug')
| -rwxr-xr-x | perl-install/standalone/drakbug | 257 |
1 files changed, 150 insertions, 107 deletions
diff --git a/perl-install/standalone/drakbug b/perl-install/standalone/drakbug index d89490db2..dd8d7f469 100755 --- a/perl-install/standalone/drakbug +++ b/perl-install/standalone/drakbug @@ -1,7 +1,7 @@ #!/usr/bin/perl # Drak Bug Report -# Copyright (C) 2002-2006 Mandriva (daouda at mandriva dot com) +# 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 @@ -23,17 +23,18 @@ 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 mygtk3 qw(gtknew); +use ugtk3 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); +my ($table, $comb_app, $com_app, $button_pkg, $button_browse, $package, $distrocode, $error, $user_descr); my $i; foreach (@ARGV) { @@ -45,44 +46,31 @@ foreach (@ARGV) { } my $segfaulted = $error =~ /SEGV/; -if ($segfaulted && -x '/usr/bin/gdb') { - local $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) { +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(); +mygtk3::init(); -$ugtk2::wm_icon = 'drakbug-16'; -my $window = ugtk2->new(N("Mandriva Linux Bug Report Tool"), center => 1); +$ugtk3::wm_icon = 'drakbug-16'; +my $window = ugtk3->new(N("%s Bug Report Tool", N("Mageia")), center => 1); $window->{rwindow}->set_border_width(5); -$window->{window}->signal_connect("delete_event", sub { ugtk2->exit(0) }); +$window->{window}->signal_connect("delete_event", sub { ugtk3->exit(0) }); my $mdk_app = { - N("Mandriva Linux Control Center") => 'drakconf', + N("%s Control Center", N("Mageia")) => '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("%s Online", N("Mageia")) => 'mgaonline', + N("%s Online", N("Mageia")) => 'mgaapplet', N("Remote Control") => 'rfbdrake', N("Software Manager") => 'rpmdrake', N("Windows Migration tool") => 'transfugdrake', @@ -90,110 +78,105 @@ my $mdk_app = { }; 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 @all_drakxtools = qw(adduserdrake diskdrake drakautoinst drakboot drakbug drakclock drakfloppy drakfont draksec drakxservices drakxtools drakxtv logdrake scannerdrake); +push @generic_tool, @all_drakxtools, qw(MageiaUpdate drakbackup drakconnect drakfirewall drakhosts drakmenustyle draknfs draksambashare drakgw drakroam drakvpn keyboarddrake msec mousedrake net_monitor urpmi userdrake XFdrake); my $kernel_release = chomp_(`uname -r`); -my $mandrake_release = chomp_(cat_('/etc/mandrakelinux-release')); +my $mageia_release = chomp_(cat_('/etc/release')); #- unused for now -#- (my $mandrake_version) = $mandrake_release =~ /(\d+\.\d+)/; +#- (my $mageia_version) = $mageia_release =~ /(\d+\.\d+)/; -if ($mandrake_release =~ /(official|community)/i) { - $distrocode = $mandrake_release; +if ($mageia_release =~ /(official|community)/i) { + $distrocode = $mageia_release; $distrocode =~ s/^.*?(\d+\.\d+) \((\w+)\).*$/$1-\l$2/; } else { $distrocode = "cooker"; } -my $bugzilla_url = 'http://qa.mandriva.com/enter_bug.cgi'; +my $bugzilla_url = 'http://bugs.mageia.org/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("Select %s Tool:", N("Mageia"))), $comb_app = Gtk3::ComboBoxText->new, $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")), + gtkpack_(Gtk3::HBox->new(0, 5), + 1, $com_app = gtkset_editable(Gtk3::Entry->new, 1), + 0, $button_pkg = Gtk3::Button->new(N("Find Package")), + 0, $button_browse = Gtk3::FileChooserButton->new(N("Browse"), 'GTK_FILE_CHOOSER_ACTION_OPEN'), ) ], - [ 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) ] + [ gtknew('Label_Left', text => N("Package: ")), $package = Gtk3::Entry->new_with_text("...") ], # complain on gtk-perl@ml + [ gtknew('Label_Left', text => N("Kernel:")), gtkset_editable(Gtk3::Entry->new_with_text($kernel_release), 0) ] ); $comb_app->set_popdown_strings("", uniq(sort(@generic_tool), if_($prog, $prog))); $comb_app->set_text(""); +my $theme_name = $table->get_settings->get('gtk-theme-name'); + +sub is_a_boot_issue() { + $prog =~ /boot|mkinitrd/; +} + +sub format_trace_with_message { + my ($message, $trace) = @_; + ([ $message ], [ "\n\n " . join("\n ", split("\n", $trace)) . "\n\n", { family => 'monospace' } ]); +} + +my @commands = 'lspcidrake -v'; + +push @commands, 'blkid' if is_a_boot_issue(); my $parent_uid = get_parent_uid(); +my $width = 600; gtkadd($window->{window}, - gtkpack_(Gtk2::VBox->new(0, 5), - 0, gtknew('Title1', label => $mandrake_release), + gtkpack_(Gtk3::VBox->new(0, 5), + 0, gtknew('Title1', label => $mageia_release, width => $width), 1, create_scrolled_window( - gtknew('TextView', editable => 0, height => 200, + gtknew('TextView', editable => 0, height => 150, text => [ - if_($prog && $error, - [ - ($gdb_trace ? - N("The \"%s\" program has segfaulted with the following error:", $prog) - : N("The \"%s\" program has crashed with the following error:", $prog)), - ], - [ - "\n\n " . join("\n ", split("\n", $error)) . "\n\n", - { family => 'monospace' } - ] - ), - if_($prog && $gdb_trace, - [ - N("Its gdb trace is:") - ], - [ - "\n\n " . join("\n ", split("\n", $gdb_trace)) . "\n\n", - { family => 'monospace' } - ] - ), + if_($prog, + if_($error, + format_trace_with_message( + ($segfaulted ? + N("The \"%s\" program has segfaulted with the following error:", $prog) + : N("The \"%s\" program has crashed with the following error:", $prog)), + $error) + ), + ), + [ N("Used theme: %s", $theme_name) . "\n\n" ], [ - 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) + 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", + $wizard_name) . "\n" . + P("It would be very useful to attach to your report the output of the following command: %s.", + "Things useful to attach to your report are the output of the following commands: %s.", + scalar(@commands), + join(", ", map { N("'%s'", $_) } @commands)) . + if_(is_a_boot_issue(), + "\n" . + N("You should also attach the following files: %s as well as %s.", + '/etc/modprobe.conf, /etc/fstab, /boot/grub/menu.lst, /boot/grub/devices.map', + '/etc/lilo.conf', + ) + ) ] ])), + 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, gtkadd($table), + ), + 0, gtkpack(Gtk3::HSeparator->new), 0, gtkpack(create_hbox('edge'), - gtksignal_connect(Gtk2::Button->new(N("Help")), clicked => sub { system("drakhelp --id drakbug &") }), - gtkpack(create_hbox('end'), - gtksignal_connect(Gtk2::Button->new(N("Report")), clicked => sub { - 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 $rel = standalone::real_version(); - my $options = join('&', - ($product || $version ? - 'cf_rpmpkg=' . join('-', $product, $version) : ()), - 'component=Core%20Packages', - 'classification=Mandriva%20Linux', - if_($incident, - "short_desc=$prog%20" . ($segfaulted ? 'segfaulted' : 'crashed'), - 'comment=' . uri_escape(qq(The "$prog" program crashed. Drakbug-$rel caught it. - -Please describe what you were doing when it crashed. - -) . ($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: -$gdb_trace)), - ), - ), - ); - print($bugzilla_url . "?" . $options . "\n"); - run_program::raw({ detach => 1, setuid => $parent_uid }, - '/usr/bin/www-browser', "$bugzilla_url?$options"); - } - ), - gtksignal_connect(Gtk2::Button->new(N("Close")), clicked => sub { ugtk2->exit(0) }), - )))); + gtksignal_connect( + Gtk3::Button->new(N("Help")), clicked => sub { + run_program::raw({ detach => 1, setuid => $parent_uid }, 'drakhelp', '--id', 'drakbug'); + }), + gtkpack(create_hbox('end'), + gtksignal_connect(Gtk3::Button->new(N("Report")), clicked => \&report_bug_to_bugzilla), + gtksignal_connect(Gtk3::Button->new(N("Close")), clicked => sub { ugtk3->exit(0) }), + )))); if (defined $prog) { update_app($prog); @@ -210,9 +193,11 @@ $button_pkg->signal_connect('clicked', sub { $package->set_text($pkg_name); }); +$button_browse->signal_connect('file-set', sub { $com_app->set_text($button_browse->get_filename) }); + $window->{window}->show_all; $window->main; -ugtk2->exit(0); +ugtk3->exit(0); sub update_app { my ($text) = @_; @@ -224,9 +209,6 @@ sub update_app { $app_choice = get_package($mdk_app->{$text}); } else { $app_choice = get_package($text); - if (my $tool = { reverse %$mdk_app }->{$text}) { - $prog = $tool; - } } $app_choice ? $package->set_text($app_choice) : $package->set_text(N("Not installed")); } @@ -247,4 +229,65 @@ sub get_package { $rpm_package; } +sub get_top_of_trace { + my ($error) = @_; + return if !$error; + sprintf(" (%s)", first(split(/\n/, $error))); +} + +sub report_bug_to_bugzilla() { + my $p = $package->get_text; + my ($product, $version) = $p =~ /^(.*)-([^-]+-[^-]+(mga.*))$/; # 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 = mageia_release_info(); + my $rel = standalone::real_version(); + my $cpuinfo; + if (cat_('/proc/cpuinfo') =~ /model name\s*:\s*(.*)$/m) { + $cpuinfo = $1; + } + my $arch = arch(); + $arch = 'i686' if arch() =~ /^i.86/; + my $options = join('&', + ($product || $version ? 'cf_rpmpkg=' . join('-', $product, $version) : ()), + 'version=' . ($rel_data->{branch} eq 'Devel' ? 'Cauldron' : $rel_data->{version}), + 'component=RPM%20Packages', + 'product=Mageia', + "rep_platform=$arch", + if_($incident, + join('', "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(If you can, try to run the "$prog" program from a terminal and copy and paste here any error messages and/or backtrace)) + ) + . qq( +Theme name: $theme_name +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"); +} |
