diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-11-09 16:48:38 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-11-09 16:48:38 +0100 |
commit | d1c6a4329284a1daba12a7e0fbd743a90cb0d884 (patch) | |
tree | f3ec3f41fdf87fa82e72a5053fc154d15ee44702 /src/daemon | |
parent | 12fe2aea5f72b17300d7efa60eeaa74f2e980b6a (diff) | |
download | abrt-d1c6a4329284a1daba12a7e0fbd743a90cb0d884.tar.gz abrt-d1c6a4329284a1daba12a7e0fbd743a90cb0d884.tar.xz abrt-d1c6a4329284a1daba12a7e0fbd743a90cb0d884.zip |
Move some functions from CrashWatcher to MiddleWare
They have nothing to do with CrashWatcher class.
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/daemon')
-rw-r--r-- | src/daemon/CommLayerServerDBus.cpp | 4 | ||||
-rw-r--r-- | src/daemon/CrashWatcher.cpp | 202 | ||||
-rw-r--r-- | src/daemon/CrashWatcher.h | 16 | ||||
-rw-r--r-- | src/daemon/Daemon.cpp | 4 | ||||
-rw-r--r-- | src/daemon/MiddleWare.cpp | 201 | ||||
-rw-r--r-- | src/daemon/MiddleWare.h | 7 |
6 files changed, 217 insertions, 217 deletions
diff --git a/src/daemon/CommLayerServerDBus.cpp b/src/daemon/CommLayerServerDBus.cpp index d7c63ee5..5ce8e474 100644 --- a/src/daemon/CommLayerServerDBus.cpp +++ b/src/daemon/CommLayerServerDBus.cpp @@ -20,7 +20,9 @@ #include "abrtlib.h" #include "abrt_dbus.h" #include "abrt_exception.h" -#include "CrashWatcher.h" +#include "comm_layer_inner.h" +#include "dbus_common.h" +#include "MiddleWare.h" #include "Settings.h" #include "Daemon.h" #include "CommLayerServerDBus.h" diff --git a/src/daemon/CrashWatcher.cpp b/src/daemon/CrashWatcher.cpp index 540949e2..a74fa3aa 100644 --- a/src/daemon/CrashWatcher.cpp +++ b/src/daemon/CrashWatcher.cpp @@ -18,7 +18,7 @@ */ #include "abrtlib.h" #include "Daemon.h" -#include "abrt_exception.h" +#include "CommLayerServer.h" #include "CrashWatcher.h" void CCrashWatcher::Status(const char *pMessage, const char* peer) @@ -42,203 +42,3 @@ CCrashWatcher::CCrashWatcher() CCrashWatcher::~CCrashWatcher() { } - -vector_map_crash_data_t GetCrashInfos(long caller_uid) -{ - vector_map_crash_data_t retval; - log("Getting crash infos..."); - try - { - vector_string_t crash_ids; -//TODO: it looks strange that we select UUIDs -//olny in order to find which directories to read! -//Should we simply retrieve list of *directories*, not *uuids*? - GetUUIDsOfCrash(caller_uid, crash_ids); - - unsigned int ii; - for (ii = 0; ii < crash_ids.size(); ii++) - { - const char *crash_id = crash_ids[ii].c_str(); - - map_crash_data_t info; - mw_result_t res = FillCrashInfo(crash_id, info); - switch (res) - { - case MW_OK: - retval.push_back(info); - break; - case MW_ERROR: - error_msg("Dump directory for crash_id %s doesn't exist or misses crucial files, deleting", crash_id); - /* Deletes both DB record and dump dir */ - DeleteDebugDump(crash_id, /*caller_uid:*/ 0); - break; - default: - break; - } - } - } - catch (CABRTException& e) - { - error_msg("%s", e.what()); - } - - return retval; -} - -/* - * Called in two cases: - * (1) by StartJob dbus call -> CreateReportThread(), in the thread - * (2) by CreateReport dbus call - * In the second case, it finishes quickly, because previous - * StartJob dbus call already did all the processing, and we just retrieve - * the result from dump directory, which is fast. - */ -void CreateReport(const char* crash_id, long caller_uid, int force, map_crash_data_t& crashReport) -{ - /* FIXME: starting from here, any shared data must be protected with a mutex. - * For example, CreateCrashReport does: - * g_pPluginManager->GetDatabase(g_settings_sDatabase); - * which is unsafe wrt concurrent updates to g_pPluginManager state. - */ - mw_result_t res = CreateCrashReport(crash_id, caller_uid, force, crashReport); - switch (res) - { - case MW_OK: - VERB2 log_map_crash_data(crashReport, "crashReport"); - break; - case MW_IN_DB_ERROR: - error_msg("Can't find crash with id %s in database", crash_id); - break; - case MW_PLUGIN_ERROR: - error_msg("Particular analyzer plugin isn't loaded or there is an error within plugin(s)"); - break; - default: - error_msg("Corrupted crash with id %s, deleting", crash_id); - DeleteDebugDump(crash_id, /*caller_uid:*/ 0); - break; - } -} - -typedef struct thread_data_t { - pthread_t thread_id; - long caller_uid; - int force; - char* crash_id; - char* peer; -} thread_data_t; -static void* create_report(void* arg) -{ - thread_data_t *thread_data = (thread_data_t *) arg; - - /* Client name is per-thread, need to set it */ - set_client_name(thread_data->peer); - - try - { - log("Creating report..."); - map_crash_data_t crashReport; - CreateReport(thread_data->crash_id, thread_data->caller_uid, thread_data->force, crashReport); - g_pCommLayer->JobDone(thread_data->peer); - } - catch (CABRTException& e) - { - error_msg("%s", e.what()); - } - catch (...) {} - set_client_name(NULL); - - /* free strduped strings */ - free(thread_data->crash_id); - free(thread_data->peer); - free(thread_data); - - /* Bogus value. pthreads require us to return void* */ - return NULL; -} -int CreateReportThread(const char* crash_id, long caller_uid, int force, const char* pSender) -{ - thread_data_t *thread_data = (thread_data_t *)xzalloc(sizeof(thread_data_t)); - thread_data->crash_id = xstrdup(crash_id); - thread_data->caller_uid = caller_uid; - thread_data->force = force; - thread_data->peer = xstrdup(pSender); - - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - int r = pthread_create(&thread_data->thread_id, &attr, create_report, thread_data); - pthread_attr_destroy(&attr); - if (r != 0) - { - free(thread_data->crash_id); - free(thread_data->peer); - free(thread_data); - /* The only reason this may happen is system-wide resource starvation, - * or ulimit is exceeded (someone floods us with CreateReport() dbus calls?) - */ - error_msg("Can't create thread"); - return r; - } - VERB3 log("Thread %llx created", (unsigned long long)thread_data->thread_id); - return r; -} - - -/* Remove dump dir and its DB record */ -int DeleteDebugDump(const char *crash_id, long caller_uid) -{ - try - { - CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase); - database->Connect(); - struct db_row *row = database->GetRow(crash_id); - if (!row) - { - database->DisConnect(); - return ENOENT; - } - - char caller_uid_str[sizeof(long) * 3 + 2]; - sprintf(caller_uid_str, "%li", caller_uid); - - if (caller_uid != 0 /* not called by root */ - && row->db_inform_all[0] != '1' - && strcmp(caller_uid_str, row->db_uid) != 0 - ) { - database->DisConnect(); - db_row_free(row); - return EPERM; - } - database->DeleteRow(crash_id); - database->DisConnect(); - if (row->db_dump_dir[0] != '\0') - { - delete_debug_dump_dir(row->db_dump_dir); - db_row_free(row); - return 0; /* success */ - } - db_row_free(row); - } - catch (CABRTException& e) - { - error_msg("%s", e.what()); - } - return EIO; /* generic failure code */ -} - -void DeleteDebugDump_by_dir(const char *dump_dir) -{ - try - { - CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase); - database->Connect(); - database->DeleteRows_by_dir(dump_dir); - database->DisConnect(); - - delete_debug_dump_dir(dump_dir); - } - catch (CABRTException& e) - { - error_msg("%s", e.what()); - } -} diff --git a/src/daemon/CrashWatcher.h b/src/daemon/CrashWatcher.h index 44c04137..4f755a36 100644 --- a/src/daemon/CrashWatcher.h +++ b/src/daemon/CrashWatcher.h @@ -19,15 +19,7 @@ #ifndef CRASHWATCHER_H_ #define CRASHWATCHER_H_ -#include <string> -#include <sys/inotify.h> -#include <glib.h> -#include <pthread.h> -#include "MiddleWare.h" -#include "Settings.h" - -#include "CommLayerServerDBus.h" -#include "comm_layer_inner.h" +#include "observer.h" class CCrashWatcher @@ -43,10 +35,4 @@ class CCrashWatcher virtual void Warning(const char *pMessage, const char* peer); }; -vector_map_crash_data_t GetCrashInfos(long caller_uid); -int CreateReportThread(const char* crash_id, long caller_uid, int force, const char* pSender); -void CreateReport(const char* crash_id, long caller_uid, int force, map_crash_data_t&); -int DeleteDebugDump(const char *crash_id, long caller_uid); -void DeleteDebugDump_by_dir(const char *dump_dir); - #endif diff --git a/src/daemon/Daemon.cpp b/src/daemon/Daemon.cpp index 7eeb0710..0aa04a30 100644 --- a/src/daemon/Daemon.cpp +++ b/src/daemon/Daemon.cpp @@ -28,7 +28,11 @@ #include <glib.h> #include "abrtlib.h" #include "abrt_exception.h" +#include "comm_layer_inner.h" +#include "Settings.h" +#include "CommLayerServerDBus.h" #include "CrashWatcher.h" +#include "MiddleWare.h" #include "Daemon.h" #include "parse_options.h" diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp index dedc492e..0349514c 100644 --- a/src/daemon/MiddleWare.cpp +++ b/src/daemon/MiddleWare.cpp @@ -23,6 +23,7 @@ #include "Settings.h" #include "abrt_exception.h" #include "comm_layer_inner.h" +#include "CommLayerServer.h" #include "MiddleWare.h" using namespace std; @@ -643,3 +644,203 @@ void AddAnalyzerActionOrReporter(const char *pAnalyzer, { s_mapAnalyzerActionsAndReporters[pAnalyzer].push_back(make_pair(std::string(pAnalyzerOrReporter), std::string(pArgs))); } + +vector_map_crash_data_t GetCrashInfos(long caller_uid) +{ + vector_map_crash_data_t retval; + log("Getting crash infos..."); + try + { + vector_string_t crash_ids; +//TODO: it looks strange that we select UUIDs +//olny in order to find which directories to read! +//Should we simply retrieve list of *directories*, not *uuids*? + GetUUIDsOfCrash(caller_uid, crash_ids); + + unsigned int ii; + for (ii = 0; ii < crash_ids.size(); ii++) + { + const char *crash_id = crash_ids[ii].c_str(); + + map_crash_data_t info; + mw_result_t res = FillCrashInfo(crash_id, info); + switch (res) + { + case MW_OK: + retval.push_back(info); + break; + case MW_ERROR: + error_msg("Dump directory for crash_id %s doesn't exist or misses crucial files, deleting", crash_id); + /* Deletes both DB record and dump dir */ + DeleteDebugDump(crash_id, /*caller_uid:*/ 0); + break; + default: + break; + } + } + } + catch (CABRTException& e) + { + error_msg("%s", e.what()); + } + + return retval; +} + +/* + * Called in two cases: + * (1) by StartJob dbus call -> CreateReportThread(), in the thread + * (2) by CreateReport dbus call + * In the second case, it finishes quickly, because previous + * StartJob dbus call already did all the processing, and we just retrieve + * the result from dump directory, which is fast. + */ +void CreateReport(const char* crash_id, long caller_uid, int force, map_crash_data_t& crashReport) +{ + /* FIXME: starting from here, any shared data must be protected with a mutex. + * For example, CreateCrashReport does: + * g_pPluginManager->GetDatabase(g_settings_sDatabase); + * which is unsafe wrt concurrent updates to g_pPluginManager state. + */ + mw_result_t res = CreateCrashReport(crash_id, caller_uid, force, crashReport); + switch (res) + { + case MW_OK: + VERB2 log_map_crash_data(crashReport, "crashReport"); + break; + case MW_IN_DB_ERROR: + error_msg("Can't find crash with id %s in database", crash_id); + break; + case MW_PLUGIN_ERROR: + error_msg("Particular analyzer plugin isn't loaded or there is an error within plugin(s)"); + break; + default: + error_msg("Corrupted crash with id %s, deleting", crash_id); + DeleteDebugDump(crash_id, /*caller_uid:*/ 0); + break; + } +} + +typedef struct thread_data_t { + pthread_t thread_id; + long caller_uid; + int force; + char* crash_id; + char* peer; +} thread_data_t; +static void* create_report(void* arg) +{ + thread_data_t *thread_data = (thread_data_t *) arg; + + /* Client name is per-thread, need to set it */ + set_client_name(thread_data->peer); + + try + { + log("Creating report..."); + map_crash_data_t crashReport; + CreateReport(thread_data->crash_id, thread_data->caller_uid, thread_data->force, crashReport); + g_pCommLayer->JobDone(thread_data->peer); + } + catch (CABRTException& e) + { + error_msg("%s", e.what()); + } + catch (...) {} + set_client_name(NULL); + + /* free strduped strings */ + free(thread_data->crash_id); + free(thread_data->peer); + free(thread_data); + + /* Bogus value. pthreads require us to return void* */ + return NULL; +} +int CreateReportThread(const char* crash_id, long caller_uid, int force, const char* pSender) +{ + thread_data_t *thread_data = (thread_data_t *)xzalloc(sizeof(thread_data_t)); + thread_data->crash_id = xstrdup(crash_id); + thread_data->caller_uid = caller_uid; + thread_data->force = force; + thread_data->peer = xstrdup(pSender); + + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + int r = pthread_create(&thread_data->thread_id, &attr, create_report, thread_data); + pthread_attr_destroy(&attr); + if (r != 0) + { + free(thread_data->crash_id); + free(thread_data->peer); + free(thread_data); + /* The only reason this may happen is system-wide resource starvation, + * or ulimit is exceeded (someone floods us with CreateReport() dbus calls?) + */ + error_msg("Can't create thread"); + return r; + } + VERB3 log("Thread %llx created", (unsigned long long)thread_data->thread_id); + return r; +} + + +/* Remove dump dir and its DB record */ +int DeleteDebugDump(const char *crash_id, long caller_uid) +{ + try + { + CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase); + database->Connect(); + struct db_row *row = database->GetRow(crash_id); + if (!row) + { + database->DisConnect(); + return ENOENT; + } + + char caller_uid_str[sizeof(long) * 3 + 2]; + sprintf(caller_uid_str, "%li", caller_uid); + + if (caller_uid != 0 /* not called by root */ + && row->db_inform_all[0] != '1' + && strcmp(caller_uid_str, row->db_uid) != 0 + ) { + database->DisConnect(); + db_row_free(row); + return EPERM; + } + database->DeleteRow(crash_id); + database->DisConnect(); + if (row->db_dump_dir[0] != '\0') + { + delete_debug_dump_dir(row->db_dump_dir); + db_row_free(row); + return 0; /* success */ + } + db_row_free(row); + } + catch (CABRTException& e) + { + error_msg("%s", e.what()); + } + return EIO; /* generic failure code */ +} + +void DeleteDebugDump_by_dir(const char *dump_dir) +{ + try + { + CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase); + database->Connect(); + database->DeleteRows_by_dir(dump_dir); + database->DisConnect(); + + delete_debug_dump_dir(dump_dir); + } + catch (CABRTException& e) + { + error_msg("%s", e.what()); + } +} diff --git a/src/daemon/MiddleWare.h b/src/daemon/MiddleWare.h index 8d0dcd96..100a0720 100644 --- a/src/daemon/MiddleWare.h +++ b/src/daemon/MiddleWare.h @@ -131,4 +131,11 @@ void AddAnalyzerActionOrReporter(const char *pAnalyzer, const char *pArgs); bool analyzer_has_InformAllUsers(const char *analyzer_name); + +vector_map_crash_data_t GetCrashInfos(long caller_uid); +int CreateReportThread(const char* crash_id, long caller_uid, int force, const char* pSender); +void CreateReport(const char* crash_id, long caller_uid, int force, map_crash_data_t&); +int DeleteDebugDump(const char *crash_id, long caller_uid); +void DeleteDebugDump_by_dir(const char *dump_dir); + #endif /*MIDDLEWARE_H_*/ |