diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/Backtrace/abrt-bz-dupchecker | 7 | ||||
-rwxr-xr-x | src/Backtrace/abrt-bz-hashchecker | 2 | ||||
-rw-r--r-- | src/CLI/dbus.cpp | 28 | ||||
-rw-r--r-- | src/CLI/dbus.h | 14 | ||||
-rw-r--r-- | src/CLI/report.cpp | 55 |
5 files changed, 96 insertions, 10 deletions
diff --git a/src/Backtrace/abrt-bz-dupchecker b/src/Backtrace/abrt-bz-dupchecker index d7748c72..344d1326 100755 --- a/src/Backtrace/abrt-bz-dupchecker +++ b/src/Backtrace/abrt-bz-dupchecker @@ -130,7 +130,7 @@ dupcount = 0 for backtrace, components in database.items(): for component, bugitems in components.items(): if len(bugitems) > 1: - dupcount += len(value) - 1 + dupcount += len(bugitems) - 1 print "Total number of duplicate bugs detected: {0}".format(dupcount) print "------------------------------" @@ -140,5 +140,8 @@ for backtrace, components in database.items(): for component, bugitems in components.items(): if len(bugitems) > 1: print "Component: {0}".format(component) - print "Duplicates: {0}".format(map(lambda x: "{0} ({1})".format(x['id'],x['comments']), bugitems).join(", ")) + print "Duplicates: {0}".format( + reduce(lambda x,y: x+", "+y, + map(lambda x: "{0} ({1})".format(x['id'],x['comments']), + bugitems))) print "Backtrace: {0}".format(backtrace) diff --git a/src/Backtrace/abrt-bz-hashchecker b/src/Backtrace/abrt-bz-hashchecker index 9c4a5ff3..ec7ce1a6 100755 --- a/src/Backtrace/abrt-bz-hashchecker +++ b/src/Backtrace/abrt-bz-hashchecker @@ -56,4 +56,4 @@ bz.logout() for hash, ids in hashes.items(): if len(ids) > 1: - print "Duplicates found: ", ids.join(", ") + print "Duplicates found: ", reduce(lambda x,y: str(x)+", "+str(y), ids) diff --git a/src/CLI/dbus.cpp b/src/CLI/dbus.cpp index ffd1157e..db45cd8b 100644 --- a/src/CLI/dbus.cpp +++ b/src/CLI/dbus.cpp @@ -142,12 +142,15 @@ map_crash_data_t call_CreateReport(const char* uuid) return argout; } -report_status_t call_Report(const map_crash_data_t& report) +report_status_t call_Report(const map_crash_data_t& report, + const map_map_string_t &plugins) { DBusMessage* msg = new_call_msg(__func__ + 5); DBusMessageIter out_iter; dbus_message_iter_init_append(msg, &out_iter); store_val(&out_iter, report); + if (!plugins.empty()) + store_val(&out_iter, plugins); DBusMessage *reply = send_get_reply_and_unref(msg); @@ -184,7 +187,6 @@ int32_t call_DeleteDebugDump(const char* uuid) return result; } -#ifdef UNUSED map_map_string_t call_GetPluginsInfo() { DBusMessage *msg = new_call_msg(__func__ + 5); @@ -201,7 +203,27 @@ map_map_string_t call_GetPluginsInfo() dbus_message_unref(reply); return argout; } -#endif + +map_plugin_settings_t call_GetPluginSettings(const char *name) +{ + DBusMessage *msg = new_call_msg(__func__ + 5); + dbus_message_append_args(msg, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_INVALID); + + DBusMessage *reply = send_get_reply_and_unref(msg); + + DBusMessageIter in_iter; + dbus_message_iter_init(reply, &in_iter); + + map_string_t argout; + int r = load_val(&in_iter, argout); + if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */ + error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5); + + dbus_message_unref(reply); + return argout; +} void handle_dbus_err(bool error_flag, DBusError *err) { diff --git a/src/CLI/dbus.h b/src/CLI/dbus.h index c6fd7a4d..c6c61eb5 100644 --- a/src/CLI/dbus.h +++ b/src/CLI/dbus.h @@ -25,10 +25,19 @@ extern DBusConnection* s_dbus_conn; vector_map_crash_data_t call_GetCrashInfos(); map_crash_data_t call_CreateReport(const char *uuid); -report_status_t call_Report(const map_crash_data_t& report); + +/** Sends report using enabled Reporter plugins. + * @param plugins + * Optional settings for plugins, can be empty. + * Format: plugins["PluginName"]["SettingsKey"] = "SettingsValue" + * If it contains settings for some plugin, it must contain _all fields_ + * obtained by call_GetPluginSettings, otherwise the plugin might ignore + * the settings. + */ +report_status_t call_Report(const map_crash_data_t& report, + const map_map_string_t &plugins); int32_t call_DeleteDebugDump(const char* uuid); -#ifdef UNUSED /* Gets basic data about all installed plugins. */ map_map_string_t call_GetPluginsInfo(); @@ -38,7 +47,6 @@ map_map_string_t call_GetPluginsInfo(); * Corresponds to name obtained from call_GetPluginsInfo. */ map_plugin_settings_t call_GetPluginSettings(const char *name); -#endif void handle_dbus_err(bool error_flag, DBusError *err); diff --git a/src/CLI/report.cpp b/src/CLI/report.cpp index 2bcd52af..7ef33acf 100644 --- a/src/CLI/report.cpp +++ b/src/CLI/report.cpp @@ -412,10 +412,63 @@ int report(const char *uuid, bool always) } } + map_map_string_t pluginSettings; + if (!always) + { + // Get informations about all plugins. + map_map_string_t plugins = call_GetPluginsInfo(); + // Check the configuration of each enabled Reporter plugin. + map_map_string_t::iterator it, itend = plugins.end(); + for (it = plugins.begin(); it != itend; ++it) + { + // Skip disabled plugins. + if (0 != strcmp(it->second["Enabled"].c_str(), "yes")) + continue; + // Skip nonReporter plugins. + if (0 != strcmp(it->second["Type"].c_str(), "Reporter")) + continue; + + map_string_t settings = call_GetPluginSettings(it->first.c_str()); + // Login information is missing. + bool loginMissing = settings.find("Login") != settings.end() + && 0 == strcmp(settings["Login"].c_str(), ""); + bool passwordMissing = settings.find("Password") != settings.end() + && 0 == strcmp(settings["Password"].c_str(), ""); + if (!loginMissing && !passwordMissing) + continue; + + // Copy the received settings as defaults. + // Plugins won't work without it, if some value is missing + // they use their default values for all fields. + pluginSettings[it->first] = settings; + + printf(_("Wrong settings were detected for plugin %s.\n"), it->second["Name"].c_str()); + if (loginMissing) + { + printf(_("Enter your login: ")); + fflush(NULL); + char answer[64] = ""; + fgets(answer, sizeof(answer), stdin); + if (strlen(answer) > 0) + pluginSettings[it->first]["Login"] = answer; + } + if (passwordMissing) + { +// TODO: echo off, see http://fixunix.com/unix/84474-echo-off.html + printf(_("Enter your password: ")); + fflush(NULL); + char answer[64] = ""; + fgets(answer, sizeof(answer), stdin); + if (strlen(answer) > 0) + pluginSettings[it->first]["Password"] = answer; + } + } + } + int errors = 0; int plugins = 0; puts(_("Reporting...")); - report_status_t r = call_Report(cr); + report_status_t r = call_Report(cr, pluginSettings); report_status_t::iterator it = r.begin(); while (it != r.end()) { |