summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikola Pajkovsky <npajkovs@redhat.com>2009-11-26 19:07:05 +0100
committerNikola Pajkovsky <npajkovs@redhat.com>2009-11-26 19:07:05 +0100
commit97311fe0f6970b9c791a872d6bd43c390d54859f (patch)
treec9cc96048216cb04451bf6501ff72648222f5648
parent198d3d363d360b65b37753411ca8f6faf544f762 (diff)
downloadabrt-97311fe0f6970b9c791a872d6bd43c390d54859f.tar.gz
abrt-97311fe0f6970b9c791a872d6bd43c390d54859f.tar.xz
abrt-97311fe0f6970b9c791a872d6bd43c390d54859f.zip
Kerneloops are reported automaticky now when AutoReportUIDs = root is in Kerneloops.conf
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
-rw-r--r--inc/abrtlib.h1
-rw-r--r--lib/Plugins/Kerneloops.conf2
-rw-r--r--lib/Plugins/KerneloopsReporter.cpp2
-rw-r--r--lib/Utils/parse_release.cpp2
-rw-r--r--lib/Utils/xfuncs.cpp11
-rw-r--r--src/Daemon/Daemon.cpp22
-rw-r--r--src/Daemon/MiddleWare.cpp49
-rw-r--r--src/Daemon/MiddleWare.h3
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_*/