summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-11-15 18:00:21 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2010-11-15 18:00:21 +0100
commit9dff71c05927e4d737a24647b63938bb24e88102 (patch)
treef5d0aecbe06984b419ed5fd8678f6d888e222ac8 /src
parent0d8b187695d37e6aa4f4b50aac89644f2749ecfa (diff)
downloadabrt-9dff71c05927e4d737a24647b63938bb24e88102.tar.gz
abrt-9dff71c05927e4d737a24647b63938bb24e88102.tar.xz
abrt-9dff71c05927e4d737a24647b63938bb24e88102.zip
abrtd/gui: remove [AnalyzerActionsAndReporters], migrate to event-based processing
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/daemon/CommLayerServerDBus.cpp8
-rw-r--r--src/daemon/MiddleWare.cpp29
-rw-r--r--src/daemon/MiddleWare.h2
-rw-r--r--src/daemon/abrt.conf8
-rw-r--r--src/gui/CCDump.py9
-rw-r--r--src/gui/CReporterAssistant.py115
6 files changed, 76 insertions, 95 deletions
diff --git a/src/daemon/CommLayerServerDBus.cpp b/src/daemon/CommLayerServerDBus.cpp
index 3e98ab80..9866bb35 100644
--- a/src/daemon/CommLayerServerDBus.cpp
+++ b/src/daemon/CommLayerServerDBus.cpp
@@ -242,9 +242,9 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply)
return 0;
}
- /* Second parameter: list of reporters to use */
- vector_string_t reporters;
- r = load_val(&in_iter, reporters);
+ /* Second parameter: list of events to run */
+ vector_string_t events;
+ r = load_val(&in_iter, events);
if (r == ABRT_DBUS_ERROR)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
@@ -289,7 +289,7 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply)
report_status_t argout1;
try
{
- argout1 = Report(argin1, reporters, user_conf_data, unix_uid);
+ argout1 = Report(argin1, events, user_conf_data, unix_uid);
}
catch (CABRTException &e)
{
diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp
index 9f1d0743..d40b1456 100644
--- a/src/daemon/MiddleWare.cpp
+++ b/src/daemon/MiddleWare.cpp
@@ -200,7 +200,7 @@ static char *do_log_and_save_line(char *log_line, void *param)
// Do not trust client_report here!
// dbus handler passes it from user without checking
report_status_t Report(const map_crash_data_t& client_report,
- const vector_string_t &reporters,
+ const vector_string_t& events,
const map_map_string_t& settings,
long caller_uid)
{
@@ -271,7 +271,7 @@ report_status_t Report(const map_crash_data_t& client_report,
std::string key = its->first;
if (get_crash_data_item_content_or_NULL(client_report, key.c_str()) == NULL)
{
- /* client does not have it -> does not want it passed to reporters */
+ /* client does not have it -> does not want it passed to events */
VERB3 log("Won't report BIN file %s:'%s'", key.c_str(), its->second[CD_CONTENT].c_str());
its++; /* move off the element we will erase */
stored_report.erase(key);
@@ -282,7 +282,6 @@ report_status_t Report(const map_crash_data_t& client_report,
}
VERB3 {
- log("Run reporters");
log_map_crash_data(client_report, " client_report");
log_map_crash_data(stored_report, " stored_report");
}
@@ -305,7 +304,7 @@ report_status_t Report(const map_crash_data_t& client_report,
reporter_settings++;
}
- // Run reporters
+ // Run events
bool at_least_one_reporter_succeeded = false;
report_status_t ret;
std::string message;
@@ -313,31 +312,31 @@ report_status_t Report(const map_crash_data_t& client_report,
struct run_event_state *run_state = new_run_event_state();
run_state->logging_callback = do_log_and_save_line;
run_state->logging_param = &l_state;
- for (unsigned i = 0; i < reporters.size(); i++)
+ for (unsigned i = 0; i < events.size(); i++)
{
- std::string plugin_name = "report_" + reporters[i];
+ std::string event = events[i];
l_state.last_line = NULL;
- int r = run_event(run_state, dump_dir_name, plugin_name.c_str());
+ int r = run_event(run_state, dump_dir_name, event.c_str());
if (r == -1)
{
- l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", plugin_name.c_str());
+ l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str());
}
if (r == 0)
{
at_least_one_reporter_succeeded = true;
- ret[plugin_name].push_back("1"); // REPORT_STATUS_IDX_FLAG
- ret[plugin_name].push_back(l_state.last_line ? : "Reporting succeeded"); // REPORT_STATUS_IDX_MSG
+ ret[event].push_back("1"); // REPORT_STATUS_IDX_FLAG
+ ret[event].push_back(l_state.last_line ? : "Reporting succeeded"); // REPORT_STATUS_IDX_MSG
if (message != "")
message += ";";
message += (l_state.last_line ? : "Reporting succeeded");
}
else
{
- ret[plugin_name].push_back("0"); // REPORT_STATUS_IDX_FLAG
- ret[plugin_name].push_back(l_state.last_line ? : "Error in reporting"); // REPORT_STATUS_IDX_MSG
+ ret[event].push_back("0"); // REPORT_STATUS_IDX_FLAG
+ ret[event].push_back(l_state.last_line ? : "Error in reporting"); // REPORT_STATUS_IDX_MSG
update_client("Reporting via '%s' was not successful%s%s",
- plugin_name.c_str(),
+ event.c_str(),
l_state.last_line ? ": " : "",
l_state.last_line ? l_state.last_line : ""
);
@@ -370,11 +369,11 @@ report_status_t Report(const map_crash_data_t& client_report,
report_status_t::iterator ret_it = ret.begin();
while (ret_it != ret.end())
{
- const string &plugin_name = ret_it->first;
+ const string &event = ret_it->first;
const vector_string_t &v = ret_it->second;
if (v[REPORT_STATUS_IDX_FLAG] == "1")
{
- database->SetReportedPerReporter(crash_id.c_str(), plugin_name.c_str(), v[REPORT_STATUS_IDX_MSG].c_str());
+ database->SetReportedPerReporter(crash_id.c_str(), event.c_str(), v[REPORT_STATUS_IDX_MSG].c_str());
}
ret_it++;
}
diff --git a/src/daemon/MiddleWare.h b/src/daemon/MiddleWare.h
index cb0db9eb..4ca4187e 100644
--- a/src/daemon/MiddleWare.h
+++ b/src/daemon/MiddleWare.h
@@ -87,7 +87,7 @@ void RunAction(const char *pActionDir,
* A report status, which reporters ends successfuly with messages.
*/
report_status_t Report(const map_crash_data_t& crash_data,
- const vector_string_t& reporters,
+ const vector_string_t& events,
const map_map_string_t& settings,
long caller_uid);
/**
diff --git a/src/daemon/abrt.conf b/src/daemon/abrt.conf
index e84c28af..cd9a782e 100644
--- a/src/daemon/abrt.conf
+++ b/src/daemon/abrt.conf
@@ -34,14 +34,6 @@ Database = SQLite3
MaxCrashReportsSize = 1000
-# What actions or reporters to run on each crash type
-#
-[ AnalyzerActionsAndReporters ]
-Kerneloops = KerneloopsReporter
-CCpp = Bugzilla, Logger
-Python = Bugzilla, Logger
-
-
# Which Action plugins to run repeatedly
#
[ Cron ]
diff --git a/src/gui/CCDump.py b/src/gui/CCDump.py
index 30002434..a2a69023 100644
--- a/src/gui/CCDump.py
+++ b/src/gui/CCDump.py
@@ -46,6 +46,9 @@ CD_EVENTS = "Events"
# FIXME - create method or smth that returns type|editable|content
+#EVENTS PARSING
+REPORT_EVENT = "report"
+REPORT_EVENT_PREFIX = "report_"
class Dump():
"""Class for mapping the debug dump to python object"""
@@ -163,3 +166,9 @@ class Dump():
return self.hostname
except AttributeError:
return None
+
+ def get_report_event_names(self):
+ try:
+ return [x for x in self.Events.split('\n') if (x == REPORT_EVENT or x[:len(REPORT_EVENT_PREFIX)] == REPORT_EVENT_PREFIX)]
+ except AttributeError:
+ return []
diff --git a/src/gui/CReporterAssistant.py b/src/gui/CReporterAssistant.py
index 9d8c9e39..2165f1d0 100644
--- a/src/gui/CReporterAssistant.py
+++ b/src/gui/CReporterAssistant.py
@@ -35,7 +35,7 @@ class ReporterAssistant():
self.comment_changed = False
self.howto_changed = False
self.report_has_bt = False
- self.selected_reporters = []
+ self.selected_report_events = []
""" create the assistant """
self.assistant = gtk.Assistant()
self.assistant.set_icon_name("abrt")
@@ -290,13 +290,13 @@ class ReporterAssistant():
error_msgs = []
rating_required = False
- for reporter in self.selected_reporters:
- if "RatingRequired" in reporter.Settings.keys():
- if reporter.Settings["RatingRequired"] == "yes":
- rating_required = True
- log1(_("Rating is required by the %s plugin") % reporter)
- if self.selected_reporters and not rating_required:
- log1(_("Rating is not required by any plugin, skipping the check..."))
+ ###for reporter in self.selected_report_events:
+ ### if "RatingRequired" in reporter.Settings.keys():
+ ### if reporter.Settings["RatingRequired"] == "yes":
+ ### rating_required = True
+ ### log1(_("Rating is required by the %s plugin") % reporter)
+ ###if self.selected_report_events and not rating_required:
+ ### log1(_("Rating is not required by any plugin, skipping the check..."))
try:
rating = int(self.result[FILENAME_RATING][CD_CONTENT])
@@ -407,33 +407,33 @@ class ReporterAssistant():
log2(" result:%s", str(report))
# Careful, this will print reporters_settings["Password"] too
log2(" settings:%s", str(reporters_settings))
- self.daemon.Report(report, self.selected_reporters, reporters_settings)
+ self.daemon.Report(report, self.selected_report_events, reporters_settings)
log2("Report() returned")
#self.hydrate()
except Exception, ex:
self.hide_progress()
gui_error_message(_("Reporting failed!\n%s" % ex))
- def on_plugin_toggled(self, plugin, plugins, reporter, page):
+ def on_plugin_toggled(self, plugin, plugins, event_name, page):
complete = False
if plugin.get_active():
- log1("Plugin >>%s<< activated" % reporter)
- self.selected_reporters.append(reporter)
- check_result = self.check_settings([reporter])
- if check_result == NO_PROBLEMS_DETECTED:
- pass
- elif check_result:
- page_n = self.assistant.get_current_page()
- self.assistant.set_page_complete(page, True)
- self.assistant.set_current_page(page_n+1)
- else:
- plugin.set_active(False)
+ log1("Plugin >>%s<< activated" % event_name)
+ self.selected_report_events.append(event_name)
+ ###check_result = self.check_settings([reporter])
+ ###if check_result == NO_PROBLEMS_DETECTED:
+ ### pass
+ ###elif check_result:
+ ### page_n = self.assistant.get_current_page()
+ ### self.assistant.set_page_complete(page, True)
+ ### self.assistant.set_current_page(page_n+1)
+ ###else:
+ ### plugin.set_active(False)
else:
- self.selected_reporters.remove(reporter)
- log1("Plugin >>%s<< de-activated" % reporter)
- if self.selected_reporters:
+ self.selected_report_events.remove(event_name)
+ log1("Plugin >>%s<< de-activated" % event_name)
+ if self.selected_report_events:
complete = True
- log1("Selected reporters: %s" % [str(x) for x in self.selected_reporters])
+ log1("Selected reporters: %s" % [x for x in self.selected_report_events])
self.assistant.set_page_complete(page, complete)
def on_bt_toggled(self, togglebutton, page):
@@ -483,51 +483,32 @@ class ReporterAssistant():
page.pack_start(vbox_plugins)
# add checkboxes for enabled reporters
- self.selected_reporters = []
- #FIXME: cache settings! Create some class to represent it like PluginList
- self.settings = self.daemon.getSettings()
+ # the logic for package specific reporters has been moved
+ # to abrt-handle-crashdump with configuration in abrt_events.conf
pluginlist = getPluginInfoList(self.daemon)
- self.reporters = []
- AnalyzerActionsAndReporters = self.settings["AnalyzerActionsAndReporters"]
- try:
- reporters = None
- try:
- reporters = AnalyzerActionsAndReporters[self.report.getAnalyzerName()+":"+self.report.getPackageName()]
- log1("Found per-package reporters, "
- "using it instead of the common reporter")
- except KeyError:
- pass
- # the package specific reporter has higher priority,
- # so don't overwrite it if it's set
- if not reporters:
- reporters = AnalyzerActionsAndReporters[self.report.getAnalyzerName()]
- # FIXME: split(',') doesn't work for RunApp("date", "date.txt")
- # but since we don't have reporters with parameters, it will find
- # the reporter plugins anyway, but it should be more clever...
- for reporter_name in reporters.split(','):
- reporter = pluginlist.getReporterByName(reporter_name)
- if reporter:
- log1("Adding >>%s<< to reporters", reporter)
- self.reporters.append(reporter)
- except KeyError:
- # Analyzer has no associated reporters.
- # but we don't care, maybe user just want to read the backtrace??
- pass
- for reporter in self.reporters:
- cb = gtk.CheckButton(str(reporter))
- cb.connect("toggled", self.on_plugin_toggled, plugins_cb, reporter, page)
+ self.selected_report_events = []
+ self.possible_report_events = []
+ for event_name in self.report.get_report_event_names():
+ log1("Adding >>%s<< to report events", event_name)
+ self.possible_report_events.append(event_name)
+ if len(self.possible_report_events) == 0:
+ # WTF?? Try running "report" event anyway...
+ self.possible_report_events.append("report")
+ for event_name in self.possible_report_events:
+ display_name = "Report"
+ if event_name != "report": # then it's "report_foo"
+ display_name = event_name[7:]
+ cb = gtk.CheckButton(display_name)
+ cb.connect("toggled", self.on_plugin_toggled, plugins_cb, event_name, page)
plugins_cb.append(cb)
vbox_plugins.pack_start(cb, fill=True, expand=False)
- # automatically select the reporter if we have only one reporter plugin
- if len(self.reporters) == 1:
- # we want to skip it only if the plugin is properly configured
- if self.reporters[0].Settings.check():
- #self.selected_reporters.append(self.reporters[0])
- self.assistant.set_page_complete(page, True)
- log1(_("Only one reporter plugin is configured."))
- # this is safe, because in python the variable is visible even
- # outside the for loop
- cb.set_active(True)
+ # automatically select the report event if we have only one
+ if len(self.possible_report_events) == 1:
+ self.assistant.set_page_complete(page, True)
+ log1(_("Only one reporter plugin is configured."))
+ # this is safe, because in python the variable is visible even
+ # outside the for loop it was created (in this case, cb)
+ cb.set_active(True)
self.pdict_add_page(page, PAGE_REPORTER_SELECTOR)
self.assistant.set_page_type(page, gtk.ASSISTANT_PAGE_INTRO)
self.assistant.set_page_title(page, _("Send a bug report"))