summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-11-03 18:07:56 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2010-11-03 18:07:56 +0100
commita8f39ad24b77926929fe6780dfeba44ac0558a92 (patch)
tree34afaa6667ff688df49d0fe8597295d6a3a55b27 /src
parentb6bb9e0ad581b5534ef51c627f274b0a24ebb7d7 (diff)
downloadabrt-a8f39ad24b77926929fe6780dfeba44ac0558a92.tar.gz
abrt-a8f39ad24b77926929fe6780dfeba44ac0558a92.tar.xz
abrt-a8f39ad24b77926929fe6780dfeba44ac0558a92.zip
abrtd: convert reporting step to run_action, part 1 (main)
There are a few things which are missing in this commit: for example, the list of possible reporting "paths" is not extracted from abrt_event.conf yet. Part 2 will deal with it. Tested: reporting thru bugzilla and thru logger. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/daemon/MiddleWare.cpp155
-rw-r--r--src/daemon/MiddleWare.h2
-rw-r--r--src/daemon/abrt-action-bugzilla.cpp31
-rw-r--r--src/daemon/abrt-action-kerneloops.cpp22
-rw-r--r--src/daemon/abrt-action-print.cpp21
-rw-r--r--src/daemon/abrt-action-rhtsupport.cpp45
-rw-r--r--src/daemon/abrt_event.conf4
7 files changed, 151 insertions, 129 deletions
diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp
index 2df49dc1..3ad2e9d6 100644
--- a/src/daemon/MiddleWare.cpp
+++ b/src/daemon/MiddleWare.cpp
@@ -18,11 +18,9 @@
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#include <algorithm> /* for std::find */
#include "abrtlib.h"
#include "Daemon.h"
#include "Settings.h"
-#include "rpm.h"
#include "abrt_exception.h"
#include "abrt_packages.h"
#include "comm_layer_inner.h"
@@ -83,23 +81,6 @@ static bool DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_data_t&
return true;
}
-/**
- * Get a global UUID from particular analyzer plugin.
- * @param pAnalyzer A name of an analyzer plugin.
- * @param pDebugDumpDir A debugdump dir containing all necessary data.
- * @return A global UUID.
- */
-static std::string GetGlobalUUID(const char *pAnalyzer,
- const char *pDebugDumpDir)
-{
- CAnalyzer* analyzer = g_pPluginManager->GetAnalyzer(pAnalyzer);
- if (analyzer)
- {
- return analyzer->GetGlobalUUID(pDebugDumpDir);
- }
- throw CABRTException(EXCEP_PLUGIN, "Error running '%s'", pAnalyzer);
-}
-
static char *do_log_and_update_client(char *log_line, void *param)
{
VERB1 log("%s", log_line);
@@ -237,12 +218,26 @@ void RunActionsAndReporters(const char *pDebugDumpDir)
}
}
+struct logging_state {
+ char *last_line;
+};
+
+static char *do_log_and_save_line(char *log_line, void *param)
+{
+ struct logging_state *l_state = (struct logging_state *)param;
+
+ VERB1 log("%s", log_line);
+ update_client("%s", log_line);
+ free(l_state->last_line);
+ l_state->last_line = log_line;
+ return NULL;
+}
// 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,
- map_map_string_t& settings,
+ const map_map_string_t& settings,
long caller_uid)
{
// Get ID fields
@@ -271,7 +266,7 @@ report_status_t Report(const map_crash_data_t& client_report,
caller_uid, crash_id.c_str());
}
- const std::string& pDumpDir = get_crash_data_item_content(stored_report, CD_DUMPDIR);
+ const char *dump_dir_name = get_crash_data_item_content_or_NULL(stored_report, CD_DUMPDIR);
// Save comment, "how to reproduce", backtrace
//TODO: we should iterate through stored_report and modify all
@@ -281,7 +276,7 @@ report_status_t Report(const map_crash_data_t& client_report,
const char *backtrace = get_crash_data_item_content_or_NULL(client_report, FILENAME_BACKTRACE);
if (comment || reproduce || backtrace)
{
- struct dump_dir *dd = dd_opendir(pDumpDir.c_str(), /*flags:*/ 0);
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (dd)
{
if (comment)
@@ -322,14 +317,6 @@ report_status_t Report(const map_crash_data_t& client_report,
its++;
}
- const std::string& analyzer = get_crash_data_item_content(stored_report, FILENAME_ANALYZER);
-
- std::string dup_hash = GetGlobalUUID(analyzer.c_str(), pDumpDir.c_str());
- VERB3 log(" DUPHASH:'%s'", dup_hash.c_str());
- add_to_crash_data_ext(stored_report, FILENAME_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, dup_hash.c_str());
-
- // Run reporters
-
VERB3 {
log("Run reporters");
log_map_crash_data(client_report, " client_report");
@@ -337,65 +324,77 @@ report_status_t Report(const map_crash_data_t& client_report,
}
#define client_report client_report_must_not_be_used_below
- map_crash_data_t::const_iterator its_PACKAGE = stored_report.find(FILENAME_PACKAGE);
- std::string packageNVR = its_PACKAGE->second[CD_CONTENT];
- char * packageName = get_package_name_from_NVR_or_NULL(packageNVR.c_str());
-
- // analyzer with package name (CCpp:xorg-x11-app) has higher priority
- char* key = xasprintf("%s:%s",analyzer.c_str(),packageName);
- free(packageName);
- map_analyzer_actions_and_reporters_t::iterator end = s_mapAnalyzerActionsAndReporters.end();
- map_analyzer_actions_and_reporters_t::iterator keyPtr = s_mapAnalyzerActionsAndReporters.find(key);
- if (keyPtr == end)
+ // Export overridden settings as environment variables
+ GList *env_list = NULL;
+ map_map_string_t::const_iterator reporter_settings = settings.begin();
+ while (reporter_settings != settings.end())
{
- VERB3 log("'%s' not found, looking for '%s'", key, analyzer.c_str());
- // if there is no such settings, then try default analyzer
- keyPtr = s_mapAnalyzerActionsAndReporters.find(analyzer);
+ map_string_t::const_iterator var = reporter_settings->second.begin();
+ while (var != reporter_settings->second.end())
+ {
+ char *s = xasprintf("%s_%s=%s", reporter_settings->first.c_str(), var->first.c_str(), var->second.c_str());
+ VERB3 log("Exporting '%s'", s);
+ putenv(s);
+ env_list = g_list_append(env_list, s);
+ var++;
+ }
+ reporter_settings++;
}
- free(key);
+ // Run reporters
bool at_least_one_reporter_succeeded = false;
report_status_t ret;
std::string message;
- if (keyPtr != end)
+ struct logging_state l_state;
+ 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++)
{
- VERB2 log("Found AnalyzerActionsAndReporters for '%s'", analyzer.c_str());
+ std::string plugin_name = "report_" + reporters[i];
- vector_pair_string_string_t::iterator it_r = keyPtr->second.begin();
- for (; it_r != keyPtr->second.end(); it_r++)
+ l_state.last_line = NULL;
+ int r = run_event(run_state, dump_dir_name, plugin_name.c_str());
+ if (r == 0)
{
- const char *plugin_name = it_r->first.c_str();
-
- /* Check if the reporter is in the input list of allowed reporters. */
- if (reporters.end() == std::find(reporters.begin(), reporters.end(), plugin_name))
- {
- continue;
- }
+ 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
+ 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
+ update_client("Reporting via '%s' was not successful%s%s",
+ plugin_name.c_str(),
+ l_state.last_line ? ": " : "",
+ l_state.last_line ? l_state.last_line : ""
+ );
+ }
+ free(l_state.last_line);
+ }
+ free_run_event_state(run_state);
- try
- {
- if (g_pPluginManager->GetPluginType(plugin_name) == REPORTER)
- {
- CReporter* reporter = g_pPluginManager->GetReporter(plugin_name); /* can't be NULL */
- map_plugin_settings_t plugin_settings = settings[plugin_name];
- std::string res = reporter->Report(stored_report, plugin_settings, it_r->second.c_str());
- ret[plugin_name].push_back("1"); // REPORT_STATUS_IDX_FLAG
- ret[plugin_name].push_back(res); // REPORT_STATUS_IDX_MSG
- if (message != "")
- message += ";";
- message += res;
- at_least_one_reporter_succeeded = true;
- }
- }
- catch (CABRTException& e)
- {
- ret[plugin_name].push_back("0"); // REPORT_STATUS_IDX_FLAG
- ret[plugin_name].push_back(e.what()); // REPORT_STATUS_IDX_MSG
- update_client("Reporting via '%s' was not successful: %s", plugin_name, e.what());
- }
- } // for
- } // if
+ // Unexport overridden settings
+ for (GList *li = env_list; li; li = g_list_next(li))
+ {
+ char *s = (char*)li->data;
+ /* Need to make a copy: just cutting s at '=' and unsetenv'ing
+ * the result would be a bug! s _itself_ is in environment now,
+ * we must not modify it there!
+ */
+ char *name = xstrndup(s, strchrnul(s, '=') - s);
+ VERB3 log("Unexporting '%s'", name);
+ unsetenv(name);
+ free(name);
+ free(s);
+ }
+ g_list_free(env_list);
+ // Save reporting results to database
if (at_least_one_reporter_succeeded)
{
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase);
diff --git a/src/daemon/MiddleWare.h b/src/daemon/MiddleWare.h
index efe354f2..8eb2759c 100644
--- a/src/daemon/MiddleWare.h
+++ b/src/daemon/MiddleWare.h
@@ -94,7 +94,7 @@ void RunActionsAndReporters(const char *pDebugDumpDir);
*/
report_status_t Report(const map_crash_data_t& crash_data,
const vector_string_t& reporters,
- map_map_string_t& settings,
+ const map_map_string_t& settings,
long caller_uid);
/**
* Adds package name and description to debugdump dir.
diff --git a/src/daemon/abrt-action-bugzilla.cpp b/src/daemon/abrt-action-bugzilla.cpp
index f7a6081c..a3c2f0b0 100644
--- a/src/daemon/abrt-action-bugzilla.cpp
+++ b/src/daemon/abrt-action-bugzilla.cpp
@@ -577,28 +577,32 @@ static void report_to_bugzilla(
load_crash_data_from_debug_dump(dd, pCrashData);
dd_close(dd);
+ const char *env;
const char *login;
const char *password;
const char *bugzilla_xmlrpc;
const char *bugzilla_url;
bool ssl_verify;
- login = settings["Login"].c_str();
- password = settings["Password"].c_str();
- bugzilla_url = settings["BugzillaURL"].c_str();
- if (!bugzilla_url[0])
- bugzilla_url = "https://bugzilla.redhat.com";
- bugzilla_xmlrpc = settings["BugzillaXMLRPC"].c_str();
- if (!bugzilla_xmlrpc[0])
- bugzilla_xmlrpc = xasprintf("%s"XML_RPC_SUFFIX, bugzilla_url);
- ssl_verify = string_to_bool(settings["SSLVerify"].c_str());
-
+ env = getenv("Bugzilla_Login");
+ login = env ? env : settings["Login"].c_str();
+ env = getenv("Bugzilla_Password");
+ password = env ? env : settings["Password"].c_str();
if (!login[0] || !password[0])
{
VERB3 log("Empty login and password");
throw CABRTException(EXCEP_PLUGIN, _("Empty login or password, please check %s"), PLUGINS_CONF_DIR"/Bugzilla.conf");
}
+ env = getenv("Bugzilla_BugzillaURL");
+ bugzilla_url = env ? env : settings["BugzillaURL"].c_str();
+ if (!bugzilla_url[0])
+ bugzilla_url = "https://bugzilla.redhat.com";
+ bugzilla_xmlrpc = xasprintf("%s"XML_RPC_SUFFIX, bugzilla_url);
+
+ env = getenv("Bugzilla_SSLVerify");
+ ssl_verify = string_to_bool(env ? env : settings["SSLVerify"].c_str());
+
const char *component = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_COMPONENT);
const char *duphash = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_DUPHASH);
const char *release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
@@ -715,7 +719,7 @@ static void report_to_bugzilla(
log(_("Logging out..."));
bz_server.logout();
- printf("STATUS:Status: NEW %s/show_bug.cgi?id=%u\n",
+ log("Status: NEW %s/show_bug.cgi?id=%u",
bugzilla_url,
(int)bug_id
);
@@ -812,7 +816,7 @@ static void report_to_bugzilla(
log(_("Logging out..."));
bz_server.logout();
- printf("STATUS:Status: %s%s%s %s/show_bug.cgi?id=%u\n",
+ log("Status: %s%s%s %s/show_bug.cgi?id=%u",
bz.bug_status,
bz.bug_resolution ? " " : "",
bz.bug_resolution ? bz.bug_resolution : "",
@@ -897,8 +901,7 @@ int main(int argc, char **argv)
}
catch (CABRTException& e)
{
- printf("EXCEPT:%s\n", e.what());
- return 1;
+ error_msg_and_die("%s", e.what());
}
return 0;
diff --git a/src/daemon/abrt-action-kerneloops.cpp b/src/daemon/abrt-action-kerneloops.cpp
index 0d0b35c4..4c820081 100644
--- a/src/daemon/abrt-action-kerneloops.cpp
+++ b/src/daemon/abrt-action-kerneloops.cpp
@@ -87,21 +87,26 @@ static CURLcode http_post_to_kerneloops_site(const char *url, const char *oopsda
static void report_to_kerneloops(
const char *dump_dir_name,
- /*const*/ map_plugin_settings_t& settings)
+ const map_plugin_settings_t& settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
- throw CABRTException(EXCEP_PLUGIN, _("Can't open '%s'"), dump_dir_name);
+ exit(1); /* error msg is already logged */
+
map_crash_data_t pCrashData;
load_crash_data_from_debug_dump(dd, pCrashData);
dd_close(dd);
const char *backtrace = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_BACKTRACE);
if (!backtrace)
- throw CABRTException(EXCEP_PLUGIN, "Error sending kernel oops due to missing backtrace");
-//TODO: check that analyzer == "oops" too?
+ error_msg_and_die("Error sending kernel oops due to missing backtrace");
+
+ map_plugin_settings_t::const_iterator end = settings.end();
+ map_plugin_settings_t::const_iterator it;
- const char *submitURL = settings["SubmitURL"].c_str();
+ const char *env = getenv("KerneloopsReporter_SubmitURL");
+ it = settings.find("SubmitURL");
+ const char *submitURL = (env ? env : it == end ? "" : it->second.c_str());
if (!submitURL[0])
submitURL = "http://submit.kerneloops.org/submitoops.php";
@@ -109,14 +114,14 @@ static void report_to_kerneloops(
CURLcode ret = http_post_to_kerneloops_site(submitURL, backtrace);
if (ret != CURLE_OK)
- throw CABRTException(EXCEP_PLUGIN, "Kernel oops has not been sent due to %s", curl_easy_strerror(ret));
+ error_msg_and_die("Kernel oops has not been sent due to %s", curl_easy_strerror(ret));
/* Server replies with:
* 200 thank you for submitting the kernel oops information
* RemoteIP: 34192fd15e34bf60fac6a5f01bba04ddbd3f0558
* - no URL or bug ID apparently...
*/
- printf("STATUS:Kernel oops report was uploaded\n");
+ log("Kernel oops report was uploaded");
}
int main(int argc, char **argv)
@@ -185,8 +190,7 @@ int main(int argc, char **argv)
}
catch (CABRTException& e)
{
- printf("EXCEPT:%s\n", e.what());
- return 1;
+ error_msg_and_die("%s", e.what());
}
return 0;
diff --git a/src/daemon/abrt-action-print.cpp b/src/daemon/abrt-action-print.cpp
index c6988921..75f5bd92 100644
--- a/src/daemon/abrt-action-print.cpp
+++ b/src/daemon/abrt-action-print.cpp
@@ -27,6 +27,7 @@
#define PROGNAME "abrt-action-print"
static const char *dump_dir_name = ".";
+static const char *output_file = NULL;
int main(int argc, char **argv)
{
@@ -35,24 +36,38 @@ int main(int argc, char **argv)
g_verbose = atoi(env_verbose);
const char *program_usage = _(
- PROGNAME" [-v] -d DIR\n"
+ PROGNAME" [-v] [-o FILE] -d DIR\n"
"\n"
"Print information about the crash to standard output");
enum {
OPT_v = 1 << 0,
OPT_d = 1 << 1,
+ OPT_o = 1 << 2,
};
/* Keep enum above and order of options below in sync! */
struct options program_options[] = {
OPT__VERBOSE(&g_verbose),
- OPT_STRING('d', NULL, &dump_dir_name, "DIR", _("Crash dump directory")),
+ OPT_STRING('d', NULL, &dump_dir_name, "DIR" , _("Crash dump directory")),
+ OPT_STRING('o', NULL, &output_file , "FILE", _("Output file")),
OPT_END()
};
+//BITROT: restore handling of:
+// $Logger_AppendLogs=yes
+// $Logger_LogPath=/var/log/abrt.log
+
/*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage);
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
+ if (output_file)
+ {
+ if (!freopen(output_file, "w", stdout))
+ {
+ perror_msg_and_die("Can't open '%s'", output_file);
+ }
+ }
+
try
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
@@ -73,5 +88,7 @@ int main(int argc, char **argv)
return 1;
}
+ if (output_file)
+ log("The report was stored to %s", output_file);
return 0;
}
diff --git a/src/daemon/abrt-action-rhtsupport.cpp b/src/daemon/abrt-action-rhtsupport.cpp
index ee61dd59..d1854541 100644
--- a/src/daemon/abrt-action-rhtsupport.cpp
+++ b/src/daemon/abrt-action-rhtsupport.cpp
@@ -17,7 +17,6 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE 1 /* for stpcpy */
#include <libtar.h>
#include "abrtlib.h"
#include "abrt_curl.h"
@@ -33,13 +32,12 @@
static void report_to_rhtsupport(
const char *dump_dir_name,
- /*const*/ map_plugin_settings_t& pSettings)
+ const map_plugin_settings_t& settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
- {
- throw CABRTException(EXCEP_PLUGIN, _("Can't open '%s'"), dump_dir_name);
- }
+ exit(1); /* error msg is already logged by dd_opendir */
+
map_crash_data_t pCrashData;
load_crash_data_from_debug_dump(dd, pCrashData);
dd_close(dd);
@@ -58,19 +56,25 @@ static void report_to_rhtsupport(
const char* reason;
const char* package;
- map_plugin_settings_t::const_iterator end = pSettings.end();
+ char* env;
+ map_plugin_settings_t::const_iterator end = settings.end();
map_plugin_settings_t::const_iterator it;
- it = pSettings.find("URL");
- char *url = xstrdup(it == end ? "https://api.access.redhat.com/rs" : it->second.c_str());
- it = pSettings.find("Login");
- char *login = xstrdup(it == end ? "" : it->second.c_str());
+ env = getenv("RHTSupport_URL");
+ it = settings.find("URL");
+ char *url = xstrdup(env ? env : it == end ? "https://api.access.redhat.com/rs" : it->second.c_str());
- it = pSettings.find("Password");
- char *password = xstrdup(it == end ? "" : it->second.c_str());
+ env = getenv("RHTSupport_Login");
+ it = settings.find("Login");
+ char *login = xstrdup(env ? env : it == end ? "" : it->second.c_str());
- it = pSettings.find("SSLVerify");
- bool ssl_verify = (it == end ? true : string_to_bool(it->second.c_str()));
+ env = getenv("RHTSupport_Password");
+ it = settings.find("Password");
+ char *password = xstrdup(env ? env : it == end ? "" : it->second.c_str());
+
+ env = getenv("RHTSupport_SSLVerify");
+ it = settings.find("SSLVerify");
+ bool ssl_verify = string_to_bool(env ? env : it == end ? "1" : it->second.c_str());
if (!login[0] || !password[0])
{
@@ -224,12 +228,10 @@ static void report_to_rhtsupport(
break;
}
/* Use sanitized string as error message */
- CABRTException e(EXCEP_PLUGIN, "%s", result);
- free(result);
- throw e;
+ error_msg_and_die("%s", result);
}
/* No error */
- printf("STATUS:%s\n", result);
+ log("%s", result);
free(result);
}
@@ -252,9 +254,7 @@ static void report_to_rhtsupport(
free(password);
if (errmsg)
- {
- throw CABRTException(EXCEP_PLUGIN, "%s", errmsg);
- }
+ error_msg_and_die("%s", errmsg);
}
int main(int argc, char **argv)
@@ -331,8 +331,7 @@ int main(int argc, char **argv)
}
catch (CABRTException& e)
{
- printf("EXCEPT:%s\n", e.what());
- return 1;
+ error_msg_and_die("%s", e.what());
}
return 0;
diff --git a/src/daemon/abrt_event.conf b/src/daemon/abrt_event.conf
index 377ef66c..22fda0ae 100644
--- a/src/daemon/abrt_event.conf
+++ b/src/daemon/abrt_event.conf
@@ -48,6 +48,6 @@ EVENT=reanalyze analyzer=CCpp abrt-action-generate-backtrace
EVENT=report analyzer=oops abrt-action-kerneloops
EVENT=report_Bugzilla analyzer=CCpp abrt-action-bugzilla
-EVENT=report_Logger analyzer=CCpp abrt-action-print >/var/log/abrt.log
+EVENT=report_Logger analyzer=CCpp abrt-action-print -o /var/log/abrt.log
EVENT=report_Bugzilla analyzer=python abrt-action-bugzilla
-EVENT=report_Logger analyzer=python abrt-action-print >/var/log/abrt.log
+EVENT=report_Logger analyzer=python abrt-action-print -o /var/log/abrt.log