Retrace server: wrong exitcode 0 on failure
by Denys Vlasenko
Please see attached screenshot. Retracing failed as expected because I
run it from F13, but error code indicates success. It should indicate
failure.
A few minor notes while I am at it:
(1) Log has two extra empty lines at the end:
"...
Error: Cannot retrieve repository metadata (repomd.xml) for repository: fedora. Please verify its path and try again
<empty line>
<empty line>
"
I think they should not be emitted.
(2) I guess it might be useful if log starts with "Connecting to URL"
message. Consider what would happen if server doesn't respond:
user would have no idea what's going on - he will see blank log
for minutes.
--
vda
13 years, 3 months
Detaching from RPM libs
by Vladimir Vinogradov
2011/2/22 Denys Vlasenko <vda.linux(a)googlemail.com>:
>> >
>> > The point is, "oh, sometimes we want to save hostname" is not
>> > the last time we want to add saving of something.
>> > There will be more "we want to save <foo>" in the future,
>> > both for standard installation, and for people running
>> > custom-configured abrt on servers.
>> >
>> > Making in necessary to hack abrt's C source to achieve it
>> > wasn't a good situation.
>> >
>> > abrt_event.conf was invented in part to provide the feature
>> > which allows to do it WITHOUT hacking on C code.
>> >
>> > hostnames saving your patch removed was in C because it was
>> > coded before we had abrt_event.conf
>> >
>> > Since we now _have_ abrt_event.conf, we can use it.
>> >
> Vladimir Vinogradov wrote:
>>
>> According to this we can put there also uname (-r -m -n), and even
>> `yum provides -q `cat executable` | grep \: -m 1 | cut -f 1 -d \-`
>> (isn't too much?) to save a "component", respectively cut out parts of
>> code.
>> ;\?
>
> Yes.
>
> component should be removed altogether, it is trivially
> derivable from package name.
>
> Saving package name by querying RPM database has advantages of not requiring
> RPM libraries for abrt, which makes it trivial to adapt it for distributions
> which do not use RPM for package management.
>
> --
> vda
>
ABRT uses rpm libraries only in
src/daemon/rpm.c
src/daemon/abrt-action-save-package-data.c
Reviewing internal logic of abrt-action-save-package-data.c I started
from working out substitutive abrt-action-save-hostinfo.sh as basic
approach (attached).
After commenting respective parts of c code it became obvious that
almost no payload will remain in abrt-action-save-package-data.c.
Except of some for now interesting logic - if path or package is
blacklisted, we cancel all operations. The fact is such behaviour is
implemented in EVENT=post-create binary.
Thus, question is what if we'll move that checks in the earliest
place, into hooks? If it already blacklisted, should we save anything
in /var/spool/abrt that will push daemon to action?
--
v.v.
13 years, 3 months
[PATCH] override old gui by new one
by Nikola Pajkovsky
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
.gitignore | 4 ++--
abrt.spec | 7 -------
configure.ac | 1 -
src/Makefile.am | 2 +-
src/applet/applet.c | 14 +++++++-------
src/applet/applet_gtk.c | 11 ++++++-----
src/applet/applet_gtk.h | 2 +-
src/daemon/Daemon.cpp | 10 ++++++----
src/gui-gtk/Makefile.am | 13 +++++++++----
src/gui-gtk/abrt.desktop.in | 11 +++++++++++
src/gui/abrt.desktop.in | 11 -----------
11 files changed, 43 insertions(+), 43 deletions(-)
create mode 100644 src/gui-gtk/abrt.desktop.in
delete mode 100644 src/gui/abrt.desktop.in
diff --git a/.gitignore b/.gitignore
index 099edf7..f642b70 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,7 +27,7 @@ src/daemon/abrt-handle-crashdump
src/daemon/abrt-server
src/daemon/abrtd
-src/gui-gtk/abrt-gtk
+src/gui-gtk/abrt-gui
src/applet/abrt-applet
@@ -37,7 +37,7 @@ src/hooks/abrt_exception_handler.py
src/hooks/abrt-hook-ccpp
src/applet/abrt-applet.desktop
-src/gui/abrt.desktop
+src/gui-gtk/abrt.desktop
src/gui-wizard-gtk/bug-reporting-wizard
diff --git a/abrt.spec b/abrt.spec
index e07cb49..4837587 100644
--- a/abrt.spec
+++ b/abrt.spec
@@ -112,11 +112,7 @@ Development libraries and headers for %{name}.
Summary: %{name}'s gui
Group: User Interface/Desktops
Requires: %{name} = %{version}-%{release}
-Requires: dbus-python, pygtk2, pygtk2-libglade,
-Requires: gnome-python2-gnomekeyring
Requires: libreport-gtk
-# only if gtk2 version < 2.17:
-#Requires: python-sexy
# we used to have abrt-applet, now abrt-gui includes it:
Provides: abrt-applet = %{version}-%{release}
Obsoletes: abrt-applet < 0.0.5
@@ -459,11 +455,8 @@ fi
%files gui
%defattr(-,root,root,-)
%{_bindir}/abrt-gui
-%{_bindir}/abrt-gtk
%dir %{_datadir}/%{name}
# all glade, gtkbuilder and py files for gui
-%{_datadir}/%{name}/*.py*
-%{_datadir}/%{name}/*.glade
%{_datadir}/applications/fedora-%{name}.desktop
%{_datadir}/icons/hicolor/*/apps/*
%{_datadir}/icons/hicolor/*/status/*
diff --git a/configure.ac b/configure.ac
index ccd25f6..1d6fab9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -133,7 +133,6 @@ AC_CONFIG_FILES([
src/daemon/Makefile
src/hooks/Makefile
src/applet/Makefile
- src/gui/Makefile
src/gui-gtk/Makefile
src/gui-wizard-gtk/Makefile
src/cli/Makefile
diff --git a/src/Makefile.am b/src/Makefile.am
index c6d3abd..066fadf 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1 +1 @@
-SUBDIRS = include lib report-python hooks btparser daemon applet gui gui-gtk cli plugins gui-wizard-gtk retrace
+SUBDIRS = include lib report-python hooks btparser daemon applet gui-gtk cli plugins gui-wizard-gtk retrace
diff --git a/src/applet/applet.c b/src/applet/applet.c
index 1a2bf5c..56266f1 100644
--- a/src/applet/applet.c
+++ b/src/applet/applet.c
@@ -46,8 +46,8 @@ static void Crash(DBusMessage* signal)
error_msg("dbus signal %s: parameter type mismatch", __func__);
return;
}
- const char* crash_id = NULL;
- r = load_charp(&in_iter, &crash_id);
+ const char* crash_dir = NULL;
+ r = load_charp(&in_iter, &crash_dir);
/* 3rd param: dir */
//dir parameter is not used for now, use is planned in the future
@@ -94,10 +94,10 @@ static void Crash(DBusMessage* signal)
*/
static time_t last_time = 0;
static char* last_package_name = NULL;
- static char* last_crash_id = NULL;
+ static char* last_crash_dir = NULL;
time_t cur_time = time(NULL);
if (last_package_name && strcmp(last_package_name, package_name) == 0
- && last_crash_id && strcmp(last_crash_id, crash_id) == 0
+ && last_crash_dir && strcmp(last_crash_dir, crash_dir) == 0
&& (unsigned)(cur_time - last_time) < 2 * 60 * 60
) {
log_msg("repeated crash in %s, not showing the notification", package_name);
@@ -106,10 +106,10 @@ static void Crash(DBusMessage* signal)
last_time = cur_time;
free(last_package_name);
last_package_name = xstrdup(package_name);
- free(last_crash_id);
- last_crash_id = xstrdup(crash_id);
+ free(last_crash_dir);
+ last_crash_dir = xstrdup(dir);
- show_crash_notification(applet, crash_id, message, package_name);
+ show_crash_notification(applet, dir, message, package_name);
}
static void QuotaExceeded(DBusMessage* signal)
diff --git a/src/applet/applet_gtk.c b/src/applet/applet_gtk.c
index d31328a..0434964 100644
--- a/src/applet/applet_gtk.c
+++ b/src/applet/applet_gtk.c
@@ -65,12 +65,13 @@ static void action_report(NotifyNotification *notification, gchar *action, gpoin
perror_msg("vfork");
if (pid == 0)
{ /* child */
- char *buf = xasprintf("--report=%s", applet->ap_last_crash_id);
signal(SIGCHLD, SIG_DFL); /* undo SIG_IGN in abrt-applet */
- execl(BIN_DIR"/abrt-gui", "abrt-gui", buf, (char*) NULL);
+ execl(BIN_DIR"/bug-reporting-wizard", "bug-reporting-wizard",
+ applet->ap_last_crash_id, (char*) NULL);
/* Did not find abrt-gui in installation directory. Oh well */
/* Trying to find it in PATH */
- execlp("abrt-gui", "abrt-gui", buf, (char*) NULL);
+ execlp("bug-reporting-wizard", "bug-reporting-wizard",
+ applet->ap_last_crash_id, (char*) NULL);
perror_msg_and_die("Can't execute abrt-gui");
}
GError *err = NULL;
@@ -348,9 +349,9 @@ void set_icon_tooltip(struct applet *applet, const char *format, ...)
free(buf);
}
-void show_crash_notification(struct applet *applet, const char* crash_id, const char *format, ...)
+void show_crash_notification(struct applet *applet, const char* crash_dir, const char *format, ...)
{
- applet->ap_last_crash_id = crash_id;
+ applet->ap_last_crash_id = crash_dir;
va_list args;
va_start(args, format);
char *buf = xvasprintf(format, args);
diff --git a/src/applet/applet_gtk.h b/src/applet/applet_gtk.h
index 0bcf47b..ca1a39c 100644
--- a/src/applet/applet_gtk.h
+++ b/src/applet/applet_gtk.h
@@ -56,7 +56,7 @@ void applet_destroy(struct applet *applet);
void show_icon(struct applet *applet);
void hide_icon(struct applet *applet);
void set_icon_tooltip(struct applet *applet, const char *format, ...);
-void show_crash_notification(struct applet *applet, const char* crash_id, const char *format, ...);
+void show_crash_notification(struct applet *applet, const char* crash_dir, const char *format, ...);
void show_msg_notification(struct applet *applet, const char *format, ...);
void disable(struct applet *applet, const char *reason);
void enable(struct applet *applet, const char *reason);
diff --git a/src/daemon/Daemon.cpp b/src/daemon/Daemon.cpp
index 2d2c85e..de0054b 100644
--- a/src/daemon/Daemon.cpp
+++ b/src/daemon/Daemon.cpp
@@ -382,6 +382,7 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin
crash_data_t *crash_data = NULL;
fullname = concat_path_file(DEBUG_DUMPS_DIR, name);
mw_result_t res = LoadDebugDump(fullname, &crash_data);
+ const char *first = get_crash_item_content_or_NULL(crash_data, CD_DUMPDIR);
switch (res)
{
case MW_OK:
@@ -392,7 +393,6 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin
{
if (res != MW_OK)
{
- const char *first = get_crash_item_content_or_NULL(crash_data, CD_DUMPDIR);
log("Deleting crash %s (dup of %s), sending dbus signal",
strrchr(fullname, '/') + 1,
strrchr(first, '/') + 1);
@@ -408,10 +408,12 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin
get_crash_item_content_or_NULL(crash_data, FILENAME_UID),
get_crash_item_content_or_NULL(crash_data, FILENAME_UUID)
);
+ /* when dupe occures we need to return first occure not the one which
+ * is deleted */
send_dbus_sig_Crash(get_crash_item_content_or_NULL(crash_data, FILENAME_PACKAGE),
- crash_id, //TODO: stop passing this param, it is unused
- fullname,
- uid_str
+ crash_id, //TODO: stop passing this param, it is unused
+ (first)? first: fullname,
+ uid_str
);
free(crash_id);
break;
diff --git a/src/gui-gtk/Makefile.am b/src/gui-gtk/Makefile.am
index 6475408..2c52524 100644
--- a/src/gui-gtk/Makefile.am
+++ b/src/gui-gtk/Makefile.am
@@ -1,10 +1,10 @@
-bin_PROGRAMS = abrt-gtk
+bin_PROGRAMS = abrt-gui
-abrt_gtk_SOURCES = \
+abrt_gui_SOURCES = \
abrt-gtk.h abrt-gtk.c \
event_config_dialog.h event_config_dialog.c \
main.c
-abrt_gtk_CFLAGS = \
+abrt_gui_CFLAGS = \
-I$(srcdir)/../include/report -I$(srcdir)/../include \
-I$(srcdir)/../lib \
-DBIN_DIR=\"$(bindir)\" \
@@ -22,7 +22,7 @@ abrt_gtk_CFLAGS = \
# -I/usr/lib/glib-2.0/include
# $(LIBNOTIFY_CFLAGS)
# $(DBUS_GLIB_CFLAGS)
-abrt_gtk_LDADD = \
+abrt_gui_LDADD = \
../lib/libreport.la \
../lib/libabrt_dbus.la \
-lglib-2.0 \
@@ -44,3 +44,8 @@ abrt_gtk_LDADD = \
DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
@INTLTOOL_DESKTOP_RULE@
+desktopdir = $(datadir)/applications
+desktop_in_files = abrt.desktop.in
+desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
+
+EXTRA_DIST = $(desktop_in_files)
diff --git a/src/gui-gtk/abrt.desktop.in b/src/gui-gtk/abrt.desktop.in
new file mode 100644
index 0000000..99d7f8f
--- /dev/null
+++ b/src/gui-gtk/abrt.desktop.in
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+_Name=Automatic Bug Reporting Tool
+_Comment=View and report application crashes
+Exec=abrt-gui
+Icon=abrt
+Terminal=false
+Type=Application
+Categories=System;X-Red-Hat-Base;
+StartupNotify=true
+X-Desktop-File-Install-Version=0.15
diff --git a/src/gui/abrt.desktop.in b/src/gui/abrt.desktop.in
deleted file mode 100644
index 99d7f8f..0000000
--- a/src/gui/abrt.desktop.in
+++ /dev/null
@@ -1,11 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-_Name=Automatic Bug Reporting Tool
-_Comment=View and report application crashes
-Exec=abrt-gui
-Icon=abrt
-Terminal=false
-Type=Application
-Categories=System;X-Red-Hat-Base;
-StartupNotify=true
-X-Desktop-File-Install-Version=0.15
--
1.7.1
13 years, 3 months
[PATCH 1/3] get rid of 'View log' from menu (doesn't work even old gui)
by Nikola Pajkovsky
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
src/gui-gtk/abrt-gtk.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/src/gui-gtk/abrt-gtk.c b/src/gui-gtk/abrt-gtk.c
index 120389d..bf85418 100644
--- a/src/gui-gtk/abrt-gtk.c
+++ b/src/gui-gtk/abrt-gtk.c
@@ -236,10 +236,8 @@ GtkWidget *create_menu(void)
/* help submenu */
GtkWidget *help_submenu = gtk_menu_new();
- GtkWidget *log_item = gtk_menu_item_new_with_mnemonic(_("View _log"));
GtkWidget *online_help_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_HELP, NULL);
GtkWidget *about_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, NULL);
- gtk_menu_shell_append(GTK_MENU_SHELL(help_submenu), log_item);
gtk_menu_shell_append(GTK_MENU_SHELL(help_submenu), online_help_item);
gtk_menu_shell_append(GTK_MENU_SHELL(help_submenu), about_item);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(help_item), help_submenu);
--
1.7.1
13 years, 3 months
[PATCH] create old bottom buttons
by Nikola Pajkovsky
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
src/gui-gtk/abrt-gtk.c | 111 ++++++++++++++++++++++++++++++++++-------------
1 files changed, 80 insertions(+), 31 deletions(-)
diff --git a/src/gui-gtk/abrt-gtk.c b/src/gui-gtk/abrt-gtk.c
index 7ec671c..120389d 100644
--- a/src/gui-gtk/abrt-gtk.c
+++ b/src/gui-gtk/abrt-gtk.c
@@ -89,49 +89,70 @@ static void on_row_activated_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTre
}
}
-static gint on_key_press_event_cb(GtkTreeView *treeview, GdkEventKey *key, gpointer unused)
+static void on_btn_report_cb(GtkButton *button, gpointer user_data)
{
- int k = key->keyval;
+ on_row_activated_cb(GTK_TREE_VIEW(s_treeview), NULL, NULL, NULL);
+}
- if (k == GDK_Delete || k == GDK_KP_Delete)
+static void delete_report(GtkTreeView *treeview)
+{
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+ if (selection)
{
- GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
- if (selection)
+ GtkTreeIter iter;
+ GtkTreeModel *store = gtk_tree_view_get_model(treeview);
+ if (gtk_tree_selection_get_selected(selection, &store, &iter) == TRUE)
{
- GtkTreeIter iter;
- GtkTreeModel *store = gtk_tree_view_get_model(treeview);
- if (gtk_tree_selection_get_selected(selection, &store, &iter) == TRUE)
+ GtkTreePath *old_path = gtk_tree_model_get_path(store, &iter);
+
+ GValue d_dir = { 0 };
+ gtk_tree_model_get_value(store, &iter, COLUMN_DUMP_DIR, &d_dir);
+ const char *dump_dir_name = g_value_get_string(&d_dir);
+
+ VERB1 log("Deleting '%s'", dump_dir_name);
+ if (delete_dump_dir_possibly_using_abrtd(dump_dir_name) == 0)
{
- GtkTreePath *old_path = gtk_tree_model_get_path(store, &iter);
-
- GValue d_dir = { 0 };
- gtk_tree_model_get_value(store, &iter, COLUMN_DUMP_DIR, &d_dir);
- const char *dump_dir_name = g_value_get_string(&d_dir);
-
- VERB1 log("Deleting '%s'", dump_dir_name);
- if (delete_dump_dir_possibly_using_abrtd(dump_dir_name) == 0)
- {
- gtk_list_store_remove(s_dumps_list_store, &iter);
- }
- else
- {
- /* Strange. Deletion did not succeed. Someone else deleted it?
- * Rescan the whole list */
- gtk_list_store_clear(s_dumps_list_store);
- scan_dirs_and_add_to_dirlist();
- }
-
- /* Try to retain the same cursor position */
- sanitize_cursor(old_path);
- gtk_tree_path_free(old_path);
+ gtk_list_store_remove(s_dumps_list_store, &iter);
}
+ else
+ {
+ /* Strange. Deletion did not succeed. Someone else deleted it?
+ * Rescan the whole list */
+ gtk_list_store_clear(s_dumps_list_store);
+ scan_dirs_and_add_to_dirlist();
+ }
+
+ /* Try to retain the same cursor position */
+ sanitize_cursor(old_path);
+ gtk_tree_path_free(old_path);
}
+ }
+}
+static gint on_key_press_event_cb(GtkTreeView *treeview, GdkEventKey *key, gpointer unused)
+{
+ int k = key->keyval;
+
+ if (k == GDK_Delete || k == GDK_KP_Delete)
+ {
+ delete_report(treeview);
return TRUE;
}
return FALSE;
}
+static void on_btn_delete_cb(GtkButton *button, gpointer unused)
+{
+ delete_report(GTK_TREE_VIEW(s_treeview));
+}
+
+static void on_btn_online_help_cb(GtkButton *button, gpointer unused)
+{
+ gtk_show_uri(NULL,"http://docs.fedoraproject.org/en-US/Fedor"
+ "a/14/html/Deployment_Guide/ch-abrt.html",
+ GDK_CURRENT_TIME, NULL);
+}
+
void show_events_list_dialog_cb(GtkMenuItem *menuitem, gpointer user_data)
{
show_events_list_dialog(GTK_WINDOW(g_main_window));
@@ -262,13 +283,41 @@ GtkWidget *create_main_window(void)
G_TYPE_STRING);/* dump dir path */
gtk_tree_view_set_model(GTK_TREE_VIEW(s_treeview), GTK_TREE_MODEL(s_dumps_list_store));
+ /* buttons are homogenous so set size only for one button and it will
+ * work for the rest buttons in same gtk_hbox_new() */
+ GtkWidget *btn_report = gtk_button_new_with_label(_("Report"));
+ gtk_widget_set_size_request(btn_report, 200, 30);
+
+ GtkWidget *btn_delete = gtk_button_new_from_stock(GTK_STOCK_DELETE);
+
+ GtkWidget *hbox_report_delete = gtk_hbox_new(true, 4);
+ gtk_box_pack_start(GTK_BOX(hbox_report_delete), btn_delete, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(hbox_report_delete), btn_report, true, true, 0);
+
+ GtkWidget *halign = gtk_alignment_new(1, 0, 0, 0);
+ gtk_container_add(GTK_CONTAINER(halign), hbox_report_delete);
+
+ GtkWidget *hbox_help_close = gtk_hbutton_box_new();
+ GtkWidget *btn_online_help = gtk_button_new_with_label(_("Online Help"));
+ GtkWidget *btn_close = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
+ gtk_box_pack_end(GTK_BOX(hbox_help_close), btn_online_help, false, false, 0);
+ gtk_box_pack_end(GTK_BOX(hbox_help_close), btn_close, false, false, 0);
+
+ gtk_box_pack_start(GTK_BOX(main_vbox), halign, false, false, 10);
+ gtk_box_pack_start(GTK_BOX(main_vbox), hbox_help_close, false, false, 10);
+
/* Double click/Enter handler */
g_signal_connect(s_treeview, "row-activated", G_CALLBACK(on_row_activated_cb), NULL);
+ g_signal_connect(btn_report, "clicked", G_CALLBACK(on_btn_report_cb), NULL);
/* Delete handler */
g_signal_connect(s_treeview, "key-press-event", G_CALLBACK(on_key_press_event_cb), NULL);
+ g_signal_connect(btn_delete, "clicked", G_CALLBACK(on_btn_delete_cb), NULL);
/* Quit when user closes the main window */
g_signal_connect(g_main_window, "destroy", gtk_main_quit, NULL);
-
+ /* Quit when user click on Cancel button */
+ g_signal_connect(btn_close, "clicked", gtk_main_quit, NULL);
+ /* Show online help */
+ g_signal_connect(btn_online_help, "clicked", G_CALLBACK(on_btn_online_help_cb), NULL);
return g_main_window;
}
--
1.7.1
13 years, 3 months
[PATCH] view details in extrenal editor for multiline non-binary files
by Nikola Pajkovsky
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
src/gui-wizard-gtk/wizard.c | 34 ++++++++++++++++++++++++++++++++++
src/include/report/crash_data.h | 4 ++++
src/lib/crash_data.c | 13 ++++++++++++-
3 files changed, 50 insertions(+), 1 deletions(-)
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
index c768353..30e60a1 100644
--- a/src/gui-wizard-gtk/wizard.c
+++ b/src/gui-wizard-gtk/wizard.c
@@ -326,6 +326,39 @@ struct cd_stats {
unsigned filecount;
};
+static void tv_details_edit_cb(GtkTreeView *tree_view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ gpointer user_data)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(tree_view);
+ if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+ return;
+
+ gchar *column_name;
+ gtk_tree_model_get(model, &iter, DETAIL_COLUMN_NAME, &column_name, -1);
+ struct crash_item *item = get_crash_data_item_or_NULL(g_cd, column_name);
+ if (!item || !IS_TXT(item->flags))
+ return;
+
+ if (item && IS_ONELINE(item->flags))
+ return;
+
+ gchar *arg[3];
+ arg[0] = "xdg-open";
+ arg[1] = concat_path_file(g_dump_dir_name, column_name);
+ arg[2] = NULL;
+ g_free(column_name);
+
+ g_spawn_sync(NULL, arg, NULL,
+ G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+
+ free(arg[1]);
+}
+
static void append_item_to_ls_details(gpointer name, gpointer value, gpointer data)
{
crash_item *item = (crash_item*)value;
@@ -1068,6 +1101,7 @@ void create_assistant()
g_signal_connect(g_tb_approve_bt, "toggled", G_CALLBACK(on_bt_approve_toggle), NULL);
g_signal_connect(g_btn_refresh, "clicked", G_CALLBACK(on_btn_refresh_clicked), NULL);
+ g_signal_connect(g_tv_details, "row-activated", G_CALLBACK(tv_details_edit_cb), NULL);
/* init searching */
GtkTextBuffer *backtrace_buf = gtk_text_view_get_buffer(g_tv_backtrace);
diff --git a/src/include/report/crash_data.h b/src/include/report/crash_data.h
index 3854118..2dfdb24 100644
--- a/src/include/report/crash_data.h
+++ b/src/include/report/crash_data.h
@@ -32,8 +32,12 @@ enum {
CD_FLAG_TXT = (1 << 1),
CD_FLAG_ISEDITABLE = (1 << 2),
CD_FLAG_ISNOTEDITABLE = (1 << 3),
+ CD_FLAG_ONELINE = (1 << 4),
};
+#define IS_TXT(flag) ((flag) & CD_FLAG_TXT)
+#define IS_ONELINE(flag) ((flag) & CD_FLAG_ONELINE)
+
struct crash_item {
char *content;
unsigned flags;
diff --git a/src/lib/crash_data.c b/src/lib/crash_data.c
index 63b0a7a..7f23c52 100644
--- a/src/lib/crash_data.c
+++ b/src/lib/crash_data.c
@@ -233,10 +233,21 @@ void load_crash_data_from_dump_dir(crash_data_t *crash_data, struct dump_dir *dd
content = dd_load_text(dd, short_name);
}
+ int flags = 0;
+
+ if (editable)
+ flags |= CD_FLAG_TXT | CD_FLAG_ISEDITABLE;
+ else
+ flags |= CD_FLAG_TXT | CD_FLAG_ISNOTEDITABLE;
+
+ int oneline = strchr(content, '\n') == NULL;
+ if (oneline)
+ flags |= CD_FLAG_ONELINE;
+
add_to_crash_data_ext(crash_data,
short_name,
content,
- (editable ? CD_FLAG_TXT + CD_FLAG_ISEDITABLE : CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE)
+ flags
);
free(short_name);
free(full_name);
--
1.7.1
13 years, 3 months
[PATCH] view details for smaps, maps and backtrace
by Nikola Pajkovsky
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
src/gui-wizard-gtk/wizard.c | 32 ++++++++++++++++++++++++++++++++
1 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
index c768353..cad0173 100644
--- a/src/gui-wizard-gtk/wizard.c
+++ b/src/gui-wizard-gtk/wizard.c
@@ -326,6 +326,37 @@ struct cd_stats {
unsigned filecount;
};
+static void tv_details_edit_cb(GtkTreeView *tree_view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ gpointer user_data)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(tree_view);
+ if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+ return;
+
+ gchar *column_name;
+ gtk_tree_model_get(model, &iter, DETAIL_COLUMN_NAME, &column_name, -1);
+ if (strcmp(column_name, "backtrace") != 0
+ && strcmp(column_name, "maps") != 0
+ && strcmp(column_name, "smaps") != 0)
+ return;
+
+ gchar *arg[3];
+ arg[0] = "xdg-open";
+ arg[1] = xasprintf("%s%s", g_dump_dir_name, column_name);
+ arg[2] = NULL;
+
+ g_spawn_sync(NULL, arg, NULL,
+ G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+
+ g_free(column_name);
+ free(arg[1]);
+}
+
static void append_item_to_ls_details(gpointer name, gpointer value, gpointer data)
{
crash_item *item = (crash_item*)value;
@@ -1068,6 +1099,7 @@ void create_assistant()
g_signal_connect(g_tb_approve_bt, "toggled", G_CALLBACK(on_bt_approve_toggle), NULL);
g_signal_connect(g_btn_refresh, "clicked", G_CALLBACK(on_btn_refresh_clicked), NULL);
+ g_signal_connect(g_tv_details, "row-activated", G_CALLBACK(tv_details_edit_cb), NULL);
/* init searching */
GtkTextBuffer *backtrace_buf = gtk_text_view_get_buffer(g_tv_backtrace);
--
1.7.1
13 years, 3 months
[PATCH] implement load_event_config_data()
by Denys Vlasenko
Pushed the following ti git, please review.
The key moments are:
* Encapsulated event_option_t and event_config_t creation/deletion:
event_option_t *new_event_option(void);
void free_event_option(event_option_t *p);
event_config_t *new_event_config(void);
void free_event_config(event_config_t *p);
* Plugged event_config_t->malloced_member memory leaks in show_event_config_dialog()
* Fixed memory leaks in src/lib/event_xml_parser.c
--
vda
diff -x '*.po' -d -urpN abrt.4/src/gui-gtk/event_config_dialog.c abrt.5/src/gui-gtk/event_config_dialog.c
--- abrt.4/src/gui-gtk/event_config_dialog.c 2011-03-08 12:59:08.000000000 +0100
+++ abrt.5/src/gui-gtk/event_config_dialog.c 2011-03-08 16:11:32.221388055 +0100
@@ -84,11 +84,11 @@ void print_option(gpointer data, gpointe
void show_event_config_dialog(const char* event_name)
{
- event_config_t ui;
- ui.options = NULL;
- load_event_description_from_file(&ui, "Bugzilla.xml");
+ event_config_t *ui = new_event_config();
+ load_event_description_from_file(ui, "Bugzilla.xml");
+
GtkWidget *dialog = gtk_dialog_new_with_buttons(
- ui.name,
+ ui->name,
NULL,
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_OK,
@@ -96,10 +96,12 @@ void show_event_config_dialog(const char
GTK_STOCK_CANCEL,
GTK_RESPONSE_CANCEL,
NULL);
- int length = g_list_length(ui.options);
+ int length = g_list_length(ui->options);
//g_print("%i\n", length);
option_table = gtk_table_new(length, 2, 0);
- g_list_foreach(ui.options, &print_option, NULL);
+ g_list_foreach(ui->options, &print_option, NULL);
+ free_event_config(ui);
+
GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
gtk_box_pack_start(GTK_BOX(content), option_table, 0, 0, 10);
gtk_widget_show_all(option_table);
diff -x '*.po' -d -urpN abrt.4/src/hooks/abrt-hook-ccpp.c abrt.5/src/hooks/abrt-hook-ccpp.c
--- abrt.4/src/hooks/abrt-hook-ccpp.c 2011-03-08 12:59:08.000000000 +0100
+++ abrt.5/src/hooks/abrt-hook-ccpp.c 2011-03-08 15:10:40.349158470 +0100
@@ -380,7 +380,7 @@ int main(int argc, char** argv)
unsigned setting_MaxCrashReportsSize = 0;
bool setting_MakeCompatCore = false;
bool setting_SaveBinaryImage = false;
- parse_conf(CONF_DIR"/plugins/CCpp.conf", &setting_MaxCrashReportsSize, &setting_MakeCompatCore, &setting_SaveBinaryImage);
+ parse_conf(PLUGINS_CONF_DIR"/CCpp.conf", &setting_MaxCrashReportsSize, &setting_MakeCompatCore, &setting_SaveBinaryImage);
if (!setting_SaveBinaryImage && src_fd_binary >= 0)
{
close(src_fd_binary);
diff -x '*.po' -d -urpN abrt.4/src/hooks/Makefile.am abrt.5/src/hooks/Makefile.am
--- abrt.4/src/hooks/Makefile.am 2011-03-08 12:59:08.000000000 +0100
+++ abrt.5/src/hooks/Makefile.am 2011-03-08 15:10:18.568408235 +0100
@@ -9,6 +9,7 @@ abrt_hook_ccpp_CPPFLAGS = \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
-DCONF_DIR=\"$(CONF_DIR)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
+ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
$(GLIB_CFLAGS) \
-Wall \
-D_GNU_SOURCE
diff -x '*.po' -d -urpN abrt.4/src/include/report/event_config.h abrt.5/src/include/report/event_config.h
--- abrt.4/src/include/report/event_config.h 2011-03-08 12:59:08.000000000 +0100
+++ abrt.5/src/include/report/event_config.h 2011-03-08 15:57:24.092158509 +0100
@@ -52,6 +52,9 @@ typedef struct
int required;
} event_option_t;
+event_option_t *new_event_option(void);
+void free_event_option(event_option_t *p);
+
//structure to hold the option data
typedef struct
{
@@ -61,6 +64,10 @@ typedef struct
GList *options;
} event_config_t;
+event_config_t *new_event_config(void);
+void free_event_config(event_config_t *p);
+
+
void load_event_description_from_file(event_config_t *event_config, const char* filename);
// (Re)loads data from /etc/abrt/events/*.{conf,xml}
diff -x '*.po' -d -urpN abrt.4/src/lib/event_config.c abrt.5/src/lib/event_config.c
--- abrt.4/src/lib/event_config.c 2011-03-08 12:59:08.000000000 +0100
+++ abrt.5/src/lib/event_config.c 2011-03-08 16:17:48.220408362 +0100
@@ -1,17 +1,85 @@
-#include "event_config.h"
+#include "abrtlib.h"
GHashTable *g_event_config_list;
+event_option_t *new_event_option(void)
+{
+ return xzalloc(sizeof(event_option_t));
+}
+
+event_config_t *new_event_config(void)
+{
+ return xzalloc(sizeof(event_config_t));
+}
+
+void free_event_option(event_option_t *p)
+{
+ if (!p)
+ return;
+ free(p->name);
+ free(p->value);
+ free(p->label);
+ free(p->description);
+ free(p->allowed_value);
+ free(p);
+}
+
+void free_event_config(event_config_t *p)
+{
+ if (!p)
+ return;
+ free(p->name);
+ free(p->title);
+ free(p->action);
+ for (GList *opt = p->options; opt; opt = opt->next)
+ free_event_option(opt->data);
+ g_list_free(p->options);
+ free(p);
+}
+
+
// (Re)loads data from /etc/abrt/events/*.{conf,xml}
void load_event_config_data(void)
{
free_event_config_data();
- /* for each xml file call load_event_description_from_file */
- /* for each conf file call load_even_options_value_from_file?
- * - we don't have this
- * - should re-use the event_config structure created when parsing xml - if exists
- * - or should this one be called first?
- */
+
+ DIR *dir = opendir(EVENTS_DIR);
+ if (!dir)
+ return;
+
+ if (!g_event_config_list)
+ g_event_config_list = g_hash_table_new_full(
+ /*hash_func*/ g_str_hash,
+ /*key_equal_func:*/ g_str_equal,
+ /*key_destroy_func:*/ free,
+ /*value_destroy_func:*/ (GDestroyNotify) free_event_config
+ );
+
+ struct dirent *dent;
+ while ((dent = readdir(dir)) != NULL)
+ {
+ char *ext = strrchr(dent->d_name, '.');
+ if (!ext)
+ continue;
+ ext++;
+ bool conf = strcmp(ext, "conf") == 0;
+ bool xml = strcmp(ext, "xml") == 0;
+ if (!conf && !xml)
+ continue;
+
+ event_config_t *event_config = new_event_config();
+
+ char *fullname = concat_path_file(EVENTS_DIR, dent->d_name);
+ if (xml)
+ load_event_description_from_file(event_config, fullname);
+// if (conf)
+// load_event_values_from_file(event_config, fullname);
+
+ free(fullname);
+
+ *ext = '\0';
+ g_hash_table_replace(g_event_config_list, xstrdup(dent->d_name), event_config);
+ }
}
/* Frees all loaded data */
diff -x '*.po' -d -urpN abrt.4/src/lib/event_xml_parser.c abrt.5/src/lib/event_xml_parser.c
--- abrt.4/src/lib/event_xml_parser.c 2011-03-08 14:55:16.000000000 +0100
+++ abrt.5/src/lib/event_xml_parser.c 2011-03-08 16:21:30.590158378 +0100
@@ -1,7 +1,3 @@
-//#include <glib.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include "abrtlib.h"
#include "event_config.h"
@@ -13,7 +9,7 @@
#define ACTION_ELEMENT "action"
#define NAME_ELEMENT "name"
-int in_option = 0;
+static int in_option = 0; //FIXME
static const char *const option_types[] =
{
@@ -34,30 +30,33 @@ static void start_element(GMarkupParseCo
{
//g_print("start: %s\n", element_name);
- event_config_t *ui = (event_config_t *)user_data;
+ event_config_t *ui = user_data;
- if(strcmp(element_name, OPTION_ELEMENT) == 0)
+ if (strcmp(element_name, OPTION_ELEMENT) == 0)
{
- if(in_option == 0)
+ if (in_option == 0)
{
in_option = 1;
- event_option_t *option = (event_option_t *)malloc(sizeof(event_option_t));
+ event_option_t *option = xzalloc(sizeof(*option));
//we need to prepend, so ui->options always points to the last created option
VERB2 log("adding option");
ui->options = g_list_prepend(ui->options, option);
int i;
- for(i = 0; attribute_names[i] != NULL; ++i)
+ for (i = 0; attribute_names[i] != NULL; ++i)
{
- VERB2 log("attr: %s:%s\n", attribute_names[i], attribute_values[i]);
- if(strcmp(attribute_names[i], "name") == 0)
- option->name = strdup(attribute_values[i]);
- if(strcmp(attribute_names[i], "type") == 0)
+ VERB2 log("attr: %s:%s", attribute_names[i], attribute_values[i]);
+ if (strcmp(attribute_names[i], "name") == 0)
{
- option_type_t type = 0;
- for(type = OPTION_TYPE_TEXT; type < OPTION_TYPE_INVALID; ++type)
+ free(option->name);
+ option->name = xstrdup(attribute_values[i]);
+ }
+ else if (strcmp(attribute_names[i], "type") == 0)
+ {
+ option_type_t type;
+ for (type = OPTION_TYPE_TEXT; type < OPTION_TYPE_INVALID; ++type)
{
- if(strcmp(option_types[type], attribute_values[i]) == 0)
+ if (strcmp(option_types[type], attribute_values[i]) == 0)
option->type = type;
}
}
@@ -65,74 +64,79 @@ static void start_element(GMarkupParseCo
}
else
{
- g_print("error, option nested in option!\n");
+ error_msg("error, option nested in option");
}
}
}
- // Called for close tags </foo>
+// Called for close tags </foo>
static void end_element(GMarkupParseContext *context,
const gchar *element_name,
gpointer user_data,
GError **error)
{
- event_config_t *ui = (event_config_t *)user_data;
- if(strcmp(element_name, OPTION_ELEMENT) == 0)
+ event_config_t *ui = user_data;
+ if (strcmp(element_name, OPTION_ELEMENT) == 0)
{
in_option = 0;
}
- if(strcmp(element_name, EVENT_ELEMENT) == 0)
+ if (strcmp(element_name, EVENT_ELEMENT) == 0)
{
- //we need to revers the list, because we we're prepending
+ //we need to reverse the list, because we we're prepending
ui->options = g_list_reverse(ui->options);
in_option = 0;
}
}
- // Called for character data
- // text is not nul-terminated
+// Called for character data
+// text is not nul-terminated
static void text(GMarkupParseContext *context,
const gchar *text,
gsize text_len,
gpointer user_data,
GError **error)
{
- event_config_t *ui = (event_config_t *)user_data;
+ event_config_t *ui = user_data;
const gchar * inner_element = g_markup_parse_context_get_element(context);
- char *_text = (char *)malloc(text_len+1);
- strncpy(_text, text, text_len);
- _text[text_len] = '\0';
- if(in_option == 1)
+ char *_text = xstrndup(text, text_len);
+ if (in_option == 1)
{
- event_option_t *option = (event_option_t *)((ui->options)->data);
- if(strcmp(inner_element, LABEL_ELEMENT) == 0)
+ event_option_t *option = ui->options->data;
+ if (strcmp(inner_element, LABEL_ELEMENT) == 0)
{
- VERB2 log("\tnew label: \t\t%s", _text);
+ VERB2 log("new label:'%s'", _text);
+ free(option->label);
option->label = _text;
+ return;
}
- if(strcmp(inner_element, DESCRIPTION_ELEMENT) == 0)
+ if (strcmp(inner_element, DESCRIPTION_ELEMENT) == 0)
{
- VERB2 log("\ttooltip: \t\t%s", _text);
+ VERB2 log("tooltip:'%s'", _text);
+ free(option->description);
option->description = _text;
+ return;
}
}
else
{
/* we're not in option, so the description is for the event */
- if(strcmp(inner_element, ACTION_ELEMENT) == 0)
+ if (strcmp(inner_element, ACTION_ELEMENT) == 0)
{
- VERB2 log("\taction description: \t%s", _text);
+ VERB2 log("action description:'%s'", _text);
+ free(ui->action);
ui->action = _text;
+ return;
}
- if(strcmp(inner_element, NAME_ELEMENT) == 0)
+ if (strcmp(inner_element, NAME_ELEMENT) == 0)
{
- VERB2 log("\tevent name: \t\t%s", _text);
+ VERB2 log("event name:'%s'", _text);
+ free(ui->name);
ui->name = _text;
+ return;
}
}
- //will be freed when the event_option is freed
- //free(_text);
+ free(_text);
}
// Called for strings that should be re-saved verbatim in this same
@@ -154,12 +158,12 @@ static void error(GMarkupParseContext *c
GError *error,
gpointer user_data)
{
- g_print("error\n");
+ error_msg("error in XML parsing");
}
/* this function takes 2 parameters
- * ui -> pointer to event_config_t
- * filename -> filename to read
+ * ui -> pointer to event_config_t
+ * filename -> filename to read
* event_config_t contains list of options, which is malloced by hits function
* and must be freed by the caller
*/
@@ -174,14 +178,16 @@ void load_event_description_from_file(ev
parser.error = &error;
GMarkupParseContext *context = g_markup_parse_context_new(
&parser, G_MARKUP_TREAT_CDATA_AS_TEXT,
- event_config, NULL);
+ event_config, /*GDestroyNotify:*/ NULL);
+
FILE* fin = fopen(filename, "r");
size_t read_bytes = 0;
char buff[1024];
- while((read_bytes = fread(buff, 1, 1024, fin)))
+ while ((read_bytes = fread(buff, 1, 1024, fin)))
{
g_markup_parse_context_parse(context, buff, read_bytes, NULL);
}
fclose(fin);
+
g_markup_parse_context_free(context);
}
diff -x '*.po' -d -urpN abrt.4/src/lib/Makefile.am abrt.5/src/lib/Makefile.am
--- abrt.4/src/lib/Makefile.am 2011-03-08 12:59:08.000000000 +0100
+++ abrt.5/src/lib/Makefile.am 2011-03-08 15:17:41.406408649 +0100
@@ -49,12 +49,13 @@ libreport_la_SOURCES = \
libreport_la_CPPFLAGS = \
-Wall -Werror \
-I$(srcdir)/../include/report -I$(srcdir)/../include \
+ -DLOCALSTATEDIR='"$(localstatedir)"' \
+ -DVAR_RUN=\"$(VAR_RUN)\" \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
- -DLOCALSTATEDIR='"$(localstatedir)"' \
-DCONF_DIR=\"$(CONF_DIR)\" \
- -DVAR_RUN=\"$(VAR_RUN)\" \
+ -DEVENTS_DIR=\"$(EVENTS_DIR)\" \
$(GLIB_CFLAGS) \
-D_GNU_SOURCE
libreport_la_LDFLAGS = \
@@ -66,11 +67,13 @@ libabrt_dbus_la_SOURCES = \
abrt_dbus.c abrt_dbus.h
libabrt_dbus_la_CPPFLAGS = \
-I$(srcdir)/../include/report -I$(srcdir)/../include \
+ -DLOCALSTATEDIR='"$(localstatedir)"' \
+ -DVAR_RUN=\"$(VAR_RUN)\" \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
-DCONF_DIR=\"$(CONF_DIR)\" \
- -DVAR_RUN=\"$(VAR_RUN)\" \
+ -DEVENTS_DIR=\"$(EVENTS_DIR)\" \
$(GLIB_CFLAGS) \
$(DBUS_CFLAGS) \
-Wall -Werror \
@@ -87,11 +90,13 @@ libabrt_web_la_SOURCES = \
libabrt_web_la_CPPFLAGS = \
-Wall -Werror \
-I$(srcdir)/../include/report -I$(srcdir)/../include \
+ -DLOCALSTATEDIR='"$(localstatedir)"' \
+ -DVAR_RUN=\"$(VAR_RUN)\" \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
-DCONF_DIR=\"$(CONF_DIR)\" \
- -DVAR_RUN=\"$(VAR_RUN)\" \
+ -DEVENTS_DIR=\"$(EVENTS_DIR)\" \
$(GLIB_CFLAGS) \
$(CURL_CFLAGS) \
$(LIBXML_CFLAGS) \
13 years, 3 months
Events user interface proposal
by Jiri Moskovcak
This is a first draft of how we'd like to deal with the user interface
for events. Since every event can consist of many executables scripts,
etc.. it's quite hard to provide an UI for it. So we decided that every
event will have a XML file with this content:
- name
- description of what this event does
- description of every configurable option
- option will have:
attributes:
- type: text, password, number (any others?)
- name: name of the represented environment variable
elements:
- label: text to show in UI
- empty: if the option can be empty (defaults to "no")
- description a tooltip to show when move the mouse over the option
widget...
- others if you find anything anything else useful
example:
<name>Bugzilla</name>
<description>Send the colelcted information to the Fedora bugzilla (you
will need a bugzilla account to use this)</description>
<options>
<option type="text" name="bz_login">
<label>User name</label>
<empty>no</empty>
<description>Username to use to log into your bugzilla
account</description>
</option>
<option type="password" name="bz_password">
<label>Password</label>
<empty>no</empty>
<description>Password for your bugzilla account</description>
</option>
</options>
- these xml files will live in /usr/share/abrt/events/<EVENTS_NAME>.xml
- the default values (like bz URL) for events will be stored in
/etc/abrt/events/<EVENT_NAME>.conf
- and can be also read from ~/.abrt/events/<EVENT_NAME>.conf
- but not stored by any abrt application, this file will have to be
provided by user if he don't want to use any of the options below:
- gtk UI will store the settings in gnome-keyring
- kde UI will store the settings in the kwallet
- etc, ...
13 years, 3 months
Retrace Server F15 problem
by Michal Toman
Hi,
making Retrace Server able to handle F15 crashes, I found a problem. So
far, we are using tmpfs for chroots, because it is significantly faster
to retrace in memory than on HDD. Everything works perfectly for F14
(and also RHEL6), however for F15 it does not.
F15 introduces file capabilities and these are not working in tmpfs. It
is a kernel problem, probably fixed in rawhide (and F15?)
https://bugzilla.redhat.com/show_bug.cgi?id=648653 (not tested). Retrace
on ext4 HDD works, but of course, it is much slower. With both our
testing machines running RHEL-6 and test day approaching, we should
think what to do.
Thanks,
Michal
13 years, 3 months