summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2010-02-05 18:06:08 +0100
committerKarel Klic <kklic@redhat.com>2010-02-05 18:06:08 +0100
commitd1dccad1319e908d53e5e271dfc8e03ad4999b68 (patch)
tree2ac3487cbbed4fdc4619a15063d93a976ac05a70 /src
parent75c6e1fc1113984b30a4d84c1cfe6e97c70c398f (diff)
downloadabrt-d1dccad1319e908d53e5e271dfc8e03ad4999b68.tar.gz
abrt-d1dccad1319e908d53e5e271dfc8e03ad4999b68.tar.xz
abrt-d1dccad1319e908d53e5e271dfc8e03ad4999b68.zip
Ask for login and password if missing from reporter plugin.
Diffstat (limited to 'src')
-rw-r--r--src/CLI/dbus.cpp28
-rw-r--r--src/CLI/dbus.h14
-rw-r--r--src/CLI/report.cpp55
3 files changed, 90 insertions, 7 deletions
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())
{