diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-11-03 13:33:53 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-11-03 13:33:53 +0100 |
commit | 66fdda782198bd1c7b1c110d1337cd30a31206d9 (patch) | |
tree | 75aea4acc16cadaa78bc347617f6c34ca73f5fdd /src | |
parent | 72fc15ea204311f061276d8a1df1489d720af61c (diff) | |
download | abrt-66fdda782198bd1c7b1c110d1337cd30a31206d9.tar.gz abrt-66fdda782198bd1c7b1c110d1337cd30a31206d9.tar.xz abrt-66fdda782198bd1c7b1c110d1337cd30a31206d9.zip |
switch "analyze" step processing to abrt_event.conf-driven way
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/daemon/MiddleWare.cpp | 139 | ||||
-rw-r--r-- | src/daemon/abrt_event.conf | 12 |
2 files changed, 17 insertions, 134 deletions
diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp index d51813b2..af12bd21 100644 --- a/src/daemon/MiddleWare.cpp +++ b/src/daemon/MiddleWare.cpp @@ -51,9 +51,6 @@ static map_analyzer_actions_and_reporters_t s_mapAnalyzerActionsAndReporters; static vector_pair_string_string_t s_vectorActionsAndReporters; -static void RunAnalyzerActions(const char *pAnalyzer, const char* pPackageName, const char *pDebugDumpDir, int force); - - /** * Transforms a debugdump directory to inner crash * report form. This form is used for later reporting. @@ -103,23 +100,11 @@ static std::string GetGlobalUUID(const char *pAnalyzer, throw CABRTException(EXCEP_PLUGIN, "Error running '%s'", pAnalyzer); } -/** - * Take care of getting all additional data needed - * for computing UUIDs and creating a report for particular analyzer - * plugin. This report could be send somewhere afterwards. - * @param pAnalyzer A name of an analyzer plugin. - * @param pDebugDumpPath A debugdump dir containing all necessary data. - */ -static void run_analyzer_CreateReport(const char *pAnalyzer, - const char *pDebugDumpDir, - int force) +static char *do_log_and_update_client(char *log_line, void *param) { - CAnalyzer* analyzer = g_pPluginManager->GetAnalyzer(pAnalyzer); - if (analyzer) - { - analyzer->CreateReport(pDebugDumpDir, force); - } - /* else: GetAnalyzer() already complained, no need to handle it here */ + VERB1 log("%s", log_line); + update_client("%s", log_line); + return log_line; } /* @@ -159,32 +144,16 @@ mw_result_t CreateCrashReport(const char *crash_id, try { - struct dump_dir *dd = dd_opendir(row->db_dump_dir, /*flags:*/ 0); - if (!dd) + struct run_event_state *run_state = new_run_event_state(); + run_state->logging_callback = do_log_and_update_client; + int res = run_event(run_state, row->db_dump_dir, "analyze"); + free_run_event_state(run_state); + if (res != 0) { - r = MW_ERROR; + r = MW_PLUGIN_ERROR; goto ret; } - load_crash_data_from_debug_dump(dd, pCrashData); - dd_close(dd); - - std::string analyzer = get_crash_data_item_content(pCrashData, FILENAME_ANALYZER); - const char* package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE); - char* package_name = get_package_name_from_NVR_or_NULL(package); - - /* Run analyzer's CreateReport() method */ - VERB3 log(" run_analyzer_CreateReport('%s')", analyzer.c_str()); - run_analyzer_CreateReport(analyzer.c_str(), row->db_dump_dir, force); - - /* Run actions (only actions, not reporters!) from - * "ANALYZER[:COMPONENT] = ACTION1, REPORTER1, REPORTER2, ACTION2..." line - * in abrt.conf - */ - VERB3 log(" RunAnalyzerActions('%s','%s','%s',force=%d)", analyzer.c_str(), package_name, row->db_dump_dir, force); - RunAnalyzerActions(analyzer.c_str(), package_name, row->db_dump_dir, force); - free(package_name); - /* Do a load_crash_data_from_debug_dump from (possibly updated) * crash dump dir */ @@ -469,41 +438,6 @@ static bool is_debug_dump_saved(const char *debug_dump_dir) return row != NULL; } -/** - * Get a package name from executable name and save - * package description to particular debugdump directory of a crash. - * @param pExecutable A name of crashed application. - * @param pDebugDumpDir A debugdump dir containing all necessary data. - * @return It return results of operation. See mw_result_t. - */ -static mw_result_t SavePackageDescriptionToDebugDump(const char *pDebugDumpDir) -{ - pid_t pid = fork(); - if (pid < 0) - { - perror_msg("fork"); - return MW_ERROR; - } - if (pid == 0) /* child */ - { - char *argv[5]; /* abrt-action-save-package-data [-s] -d DIR NULL */ - char **pp = argv; - *pp++ = (char*)"abrt-action-save-package-data"; - if (logmode & LOGMODE_SYSLOG) - *pp++ = (char*)"-s"; - *pp++ = (char*)"-d"; - *pp++ = (char*)pDebugDumpDir; - *pp = NULL; - - execvp(argv[0], argv); - perror_msg_and_die("Can't execute '%s'", argv[0]); - } - /* parent */ - int status; - waitpid(pid, &status, 0); - return (WIFEXITED(status) && WEXITSTATUS(status) == 0) ? MW_OK : MW_ERROR; -} - bool analyzer_has_InformAllUsers(const char *analyzer_name) { CAnalyzer* analyzer = g_pPluginManager->GetAnalyzer(analyzer_name); @@ -519,59 +453,6 @@ bool analyzer_has_InformAllUsers(const char *analyzer_name) } /** - * Execute all action plugins, which are associated to - * particular analyzer plugin. - * @param pAnalyzer A name of an analyzer plugin. - * @param pDebugDumpPath A debugdump dir containing all necessary data. - */ -static void RunAnalyzerActions(const char *pAnalyzer, const char *pPackageName, const char *pDebugDumpDir, int force) -{ - map_analyzer_actions_and_reporters_t::iterator analyzer; - if (pPackageName != NULL) - { - /*try to find analyzer:component first*/ - char *analyzer_component = xasprintf("%s:%s", pAnalyzer, pPackageName); - analyzer = s_mapAnalyzerActionsAndReporters.find(analyzer_component); - /* if we didn't find an action for specific package, use the generic one */ - if (analyzer == s_mapAnalyzerActionsAndReporters.end()) - { - VERB2 log("didn't find action for %s, trying just %s", analyzer_component, pAnalyzer); - map_analyzer_actions_and_reporters_t::iterator analyzer = s_mapAnalyzerActionsAndReporters.find(pAnalyzer); - } - free(analyzer_component); - } - else - { - VERB2 log("no package name specified, trying to find action for: %s", pAnalyzer); - analyzer = s_mapAnalyzerActionsAndReporters.find(pAnalyzer); - } - if (analyzer != s_mapAnalyzerActionsAndReporters.end()) - { - vector_pair_string_string_t::iterator it_a = analyzer->second.begin(); - for (; it_a != analyzer->second.end(); it_a++) - { - const char *plugin_name = it_a->first.c_str(); - CAction* action = g_pPluginManager->GetAction(plugin_name, /*silent:*/ true); - if (!action) - { - /* GetAction() already complained if no such plugin. - * If plugin exists but isn't an Action, it's not an error. - */ - continue; - } - try - { - action->Run(pDebugDumpDir, it_a->second.c_str(), force); - } - catch (CABRTException& e) - { - update_client("Action performed by '%s' was not successful: %s", plugin_name, e.what()); - } - } - } -} - -/** * Save a debugdump into database. If saving is * successful, then crash info is filled. Otherwise the crash info is * not changed. diff --git a/src/daemon/abrt_event.conf b/src/daemon/abrt_event.conf index a8df2896..5459ddfa 100644 --- a/src/daemon/abrt_event.conf +++ b/src/daemon/abrt_event.conf @@ -36,11 +36,13 @@ EVENT=post-create analyzer=oops abrt-action-analyze-oops # user interaction, uncomment this line: #EVENT=post-create analyzer=oops abrt-action-kerneloops +#TODO: implement this (or add this functionality to abrt-action-install-debuginfo): +#EVENT=analyze analyzer=CCpp trim-debuginfo-cache /var/cache/abrt-di 4096m EVENT=analyze analyzer=CCpp abrt-action-install-debuginfo "$DUMP_DIR/coredump" "/var/run/abrt/$$-$RANDOM" /var/cache/abrt-di EVENT=analyze 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_Bugzilla analyzer=python abrt-action-bugzilla -EVENT=report_Logger analyzer=python abrt-action-print >/var/log/abrt.log +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_Bugzilla analyzer=python abrt-action-bugzilla +EVENT=report_Logger analyzer=python abrt-action-print >/var/log/abrt.log |