diff options
-rw-r--r-- | inc/abrtlib.h | 1 | ||||
-rw-r--r-- | lib/Plugins/Kerneloops.conf | 2 | ||||
-rw-r--r-- | lib/Plugins/KerneloopsReporter.cpp | 2 | ||||
-rw-r--r-- | lib/Utils/parse_release.cpp | 2 | ||||
-rw-r--r-- | lib/Utils/xfuncs.cpp | 11 | ||||
-rw-r--r-- | src/Daemon/Daemon.cpp | 22 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.cpp | 49 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.h | 3 |
8 files changed, 91 insertions, 1 deletions
diff --git a/inc/abrtlib.h b/inc/abrtlib.h index 0c1595a1..257f4c73 100644 --- a/inc/abrtlib.h +++ b/inc/abrtlib.h @@ -193,6 +193,7 @@ char* xmalloc_sockaddr2host_noport(const struct sockaddr *sa); char* xmalloc_sockaddr2hostonly_noport(const struct sockaddr *sa); char* xmalloc_sockaddr2dotted(const struct sockaddr *sa); char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa); +bool xgetpwnam(const char* login, uid_t *uid); /* Random utility functions */ diff --git a/lib/Plugins/Kerneloops.conf b/lib/Plugins/Kerneloops.conf index 08dacd00..a0141533 100644 --- a/lib/Plugins/Kerneloops.conf +++ b/lib/Plugins/Kerneloops.conf @@ -1,6 +1,8 @@ # compatibility with kerneloops.org tool InformAllUsers = yes +AutoReportUIDs = root + # KerneloopsReporter configuration. Reports kernel crashes collected by the addon. ################################################################################ diff --git a/lib/Plugins/KerneloopsReporter.cpp b/lib/Plugins/KerneloopsReporter.cpp index f38f5031..a1fd3f16 100644 --- a/lib/Plugins/KerneloopsReporter.cpp +++ b/lib/Plugins/KerneloopsReporter.cpp @@ -113,7 +113,7 @@ std::string CKerneloopsReporter::Report(const map_crash_report_t& pCrashReport, /* FIXME: be more informative */ throw CABRTException(EXCEP_PLUGIN, std::string("CKerneloopsReporter::Report(): Report has not been sent...")); } - return "Kernel oops report was uploaded to: " + m_sSubmitURL; + return "Kernel oops report was uploaded."; } void CKerneloopsReporter::SetSettings(const map_plugin_settings_t& pSettings) diff --git a/lib/Utils/parse_release.cpp b/lib/Utils/parse_release.cpp index 33d3edb1..b96cab76 100644 --- a/lib/Utils/parse_release.cpp +++ b/lib/Utils/parse_release.cpp @@ -11,6 +11,7 @@ void parse_release(const char *pRelease, string& pProduct, string& pVersion) { pProduct = "Fedora"; pVersion = "rawhide"; + VERB3 log("%s:Version is '%s' and product is '%s'",__func__, pVersion.c_str(), pProduct.c_str()); return; } if (strstr(pRelease, "Fedora")) @@ -35,4 +36,5 @@ void parse_release(const char *pRelease, string& pProduct, string& pVersion) } space++; } + VERB3 log("%s:Version is '%s' and product is '%s'",__func__, pVersion.c_str(), pProduct.c_str()); } diff --git a/lib/Utils/xfuncs.cpp b/lib/Utils/xfuncs.cpp index 97c2f763..4b208a9e 100644 --- a/lib/Utils/xfuncs.cpp +++ b/lib/Utils/xfuncs.cpp @@ -368,3 +368,14 @@ bool string_to_bool(const char *s) return true; return false; } + +bool xgetpwnam(const char* login, uid_t *uid) +{ + struct passwd* pwd = getpwnam(login); + if (pwd == NULL) + return false; + + *uid = pwd->pw_uid; + return true; +} + diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp index 504b4f04..0e80c25b 100644 --- a/src/Daemon/Daemon.cpp +++ b/src/Daemon/Daemon.cpp @@ -494,6 +494,28 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin log("Already saved crash, just sending dbus signal"); /* Send dbus signal */ { + // I don't see any usable usecase for other plugin to be able automatic report. + if (analyzer_has_AutoReportUIDs(/*crashinfo[CD_MWANALYZER][CD_CONTENT].c_str()*/"Kerneloops",crashinfo[CD_UID][CD_CONTENT].c_str())) + { + map_crash_report_t crash_report; + VERB3 log("Create autoreport for user with uid %s",crashinfo[CD_UID][CD_CONTENT].c_str()); + mw_result_t crash_result = CreateCrashReport(crashinfo[CD_UUID][CD_CONTENT].c_str(), crashinfo[CD_UID][CD_CONTENT].c_str(), 0, crash_report); + if (crash_result == MW_OK) + { + map_analyzer_actions_and_reporters_t::const_iterator it = g_settings_mapAnalyzerActionsAndReporters.find("Kerneloops"); + map_analyzer_actions_and_reporters_t::const_iterator end = g_settings_mapAnalyzerActionsAndReporters.end(); + if (it != end) + { + vector_pair_string_string_t keys = it->second; + + uint32_t size = keys.size(); + for (uint32_t ii = 0; ii < size; ii++) + { + autoreport(keys[ii], crash_report); + } + } + } + } const char *uid_str = analyzer_has_InformAllUsers(crashinfo[CD_MWANALYZER][CD_CONTENT].c_str()) ? NULL : crashinfo[CD_UID][CD_CONTENT].c_str(); diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 0a3fb9ad..69d36bfc 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -654,6 +654,55 @@ bool analyzer_has_InformAllUsers(const char *analyzer_name) return string_to_bool(it->second.c_str()); } +bool analyzer_has_AutoReportUIDs(const char *analyzer_name, const char* uid) +{ + CAnalyzer* analyzer = g_pPluginManager->GetAnalyzer(analyzer_name); + if (!analyzer) + { + VERB1 log("Strange, asked for analyzer %s but it doesn't exist?", analyzer_name); + return false; + } + map_plugin_settings_t settings = analyzer->GetSettings(); + map_plugin_settings_t::const_iterator it = settings.find("AutoReportUIDs"); + if (it == settings.end()) + return false; + + vector_string_t logins; + parse_args(it->second.c_str(), logins); + + uint32_t size = logins.size(); + if (size == 0) + return false; + + if ((strcmp(analyzer_name, "Kerneloops") == 0) && (strcmp(uid, "-1") == 0)) + return true; + + uid_t id; + for (uint32_t ii = 0; ii < size; ii++) + { + if (!xgetpwnam(logins[ii].c_str(), &id)) + continue; + + if (strcmp(uid, to_string(id).c_str()) == 0) + return true; + } + + return false; +} + +void autoreport(const pair_string_string_t& reporter_options, const map_crash_report_t& crash_report) +{ + CReporter* reporter = g_pPluginManager->GetReporter(reporter_options.first.c_str()); + if (!reporter) + { + VERB1 log("Strange, asked for reporter %s but it doesn't exist?", reporter_options.first.c_str()); + return; + } + + map_plugin_settings_t plugin_settings; + std::string res = reporter->Report(crash_report, plugin_settings, reporter_options.second); +} + /** * Execute all action plugins, which are associated to * particular analyzer plugin. diff --git a/src/Daemon/MiddleWare.h b/src/Daemon/MiddleWare.h index b2d3ef28..3de287b3 100644 --- a/src/Daemon/MiddleWare.h +++ b/src/Daemon/MiddleWare.h @@ -162,4 +162,7 @@ void AddActionOrReporter(const char *pActionOrReporter, bool analyzer_has_InformAllUsers(const char *analyzer_name); +bool analyzer_has_AutoReportUIDs(const char *analyzer_name, const char* uid); + +void autoreport(const pair_string_string_t& reporter_options, const map_crash_report_t& crash_report); #endif /*MIDDLEWARE_H_*/ |