diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-11-15 18:00:21 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-11-15 18:00:21 +0100 |
commit | 9dff71c05927e4d737a24647b63938bb24e88102 (patch) | |
tree | f5d0aecbe06984b419ed5fd8678f6d888e222ac8 /src | |
parent | 0d8b187695d37e6aa4f4b50aac89644f2749ecfa (diff) | |
download | abrt-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.cpp | 8 | ||||
-rw-r--r-- | src/daemon/MiddleWare.cpp | 29 | ||||
-rw-r--r-- | src/daemon/MiddleWare.h | 2 | ||||
-rw-r--r-- | src/daemon/abrt.conf | 8 | ||||
-rw-r--r-- | src/gui/CCDump.py | 9 | ||||
-rw-r--r-- | src/gui/CReporterAssistant.py | 115 |
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")) |