diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-11-03 18:07:56 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-11-03 18:07:56 +0100 |
commit | a8f39ad24b77926929fe6780dfeba44ac0558a92 (patch) | |
tree | 34afaa6667ff688df49d0fe8597295d6a3a55b27 /src | |
parent | b6bb9e0ad581b5534ef51c627f274b0a24ebb7d7 (diff) | |
download | abrt-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.cpp | 155 | ||||
-rw-r--r-- | src/daemon/MiddleWare.h | 2 | ||||
-rw-r--r-- | src/daemon/abrt-action-bugzilla.cpp | 31 | ||||
-rw-r--r-- | src/daemon/abrt-action-kerneloops.cpp | 22 | ||||
-rw-r--r-- | src/daemon/abrt-action-print.cpp | 21 | ||||
-rw-r--r-- | src/daemon/abrt-action-rhtsupport.cpp | 45 | ||||
-rw-r--r-- | src/daemon/abrt_event.conf | 4 |
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 |