diff options
author | Zdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com> | 2009-05-12 15:40:35 +0200 |
---|---|---|
committer | Zdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com> | 2009-05-12 15:40:35 +0200 |
commit | 6b77cb82cb7b918660435effb0fe356401bfdd55 (patch) | |
tree | 66d550082a1a96b11efe0978c664cb73155e64a9 /lib/Plugins/Kerneloops.cpp | |
parent | 48fd6795c43d425c7d54a7b14cb565ee8092b4d0 (diff) | |
download | abrt-6b77cb82cb7b918660435effb0fe356401bfdd55.tar.gz abrt-6b77cb82cb7b918660435effb0fe356401bfdd55.tar.xz abrt-6b77cb82cb7b918660435effb0fe356401bfdd55.zip |
added new kerneloopsscanner plugin, therefore kerneloops plugin is much more simply now
Diffstat (limited to 'lib/Plugins/Kerneloops.cpp')
-rw-r--r-- | lib/Plugins/Kerneloops.cpp | 178 |
1 files changed, 0 insertions, 178 deletions
diff --git a/lib/Plugins/Kerneloops.cpp b/lib/Plugins/Kerneloops.cpp index c868bae3..57482c0e 100644 --- a/lib/Plugins/Kerneloops.cpp +++ b/lib/Plugins/Kerneloops.cpp @@ -25,38 +25,14 @@ */ #include "Kerneloops.h" -#include "KerneloopsSysLog.h" #include "DebugDump.h" -#include "PluginSettings.h" #include "ABRTException.h" #include "CommLayerInner.h" #include <sstream> -#include <assert.h> -#include <stdlib.h> -#include <string.h> -#include <syslog.h> -#include <limits.h> -#include <sys/prctl.h> -#include <sys/stat.h> -#include <asm/unistd.h> -#define MAX(A,B) ((A) > (B) ? (A) : (B)) #define FILENAME_KERNELOOPS "kerneloops" -CAnalyzerKerneloops::CAnalyzerKerneloops() : - m_sSysLogFile("/var/log/messages") -{} - -void CAnalyzerKerneloops::WriteSysLog(int m_nCount) -{ - if (m_nCount > 0) { - openlog("abrt", 0, LOG_KERN); - syslog(LOG_WARNING, "Kerneloops: Reported %i kernel oopses to Abrt", m_nCount); - closelog(); - } -} - std::string CAnalyzerKerneloops::GetLocalUUID(const std::string& pDebugDumpDir) { comm_layer_inner_status("Getting local/global universal unique identification..."); @@ -85,157 +61,3 @@ std::string CAnalyzerKerneloops::GetGlobalUUID(const std::string& pDebugDumpDir) { return GetLocalUUID(pDebugDumpDir); } - -void CAnalyzerKerneloops::Report() -{ - comm_layer_inner_status("Creating crash reports..."); - - CDebugDump m_pDebugDump; - char m_sPath[PATH_MAX]; - std::list<COops> m_pOopsList; - - time_t t = time(NULL); - if (((time_t) -1) == t) - { - throw CABRTException(EXCEP_PLUGIN, "CAnalyzerKerneloops::Report(): cannot get local time."); - } - - m_pOopsList = m_pSysLog.GetOopsList(); - m_pSysLog.ClearOopsList(); - while (!m_pOopsList.empty()) - { - snprintf(m_sPath, sizeof(m_sPath), "%s/kerneloops-%d-%d", DEBUG_DUMPS_DIR, t, m_pOopsList.size()); - - COops m_pOops; - m_pOops = m_pOopsList.back(); - - try - { - m_pDebugDump.Create(m_sPath); - m_pDebugDump.SaveText(FILENAME_ANALYZER, "Kerneloops"); - m_pDebugDump.SaveText(FILENAME_UID, "0"); - m_pDebugDump.SaveText(FILENAME_EXECUTABLE, "kernel"); - m_pDebugDump.SaveText(FILENAME_KERNEL, m_pOops.m_sVersion); - m_pDebugDump.SaveText(FILENAME_PACKAGE, "not_applicable"); - m_pDebugDump.SaveText(FILENAME_KERNELOOPS, m_pOops.m_sData); - m_pDebugDump.Close(); - } - catch (CABRTException& e) - { - throw CABRTException(EXCEP_PLUGIN, "CAnalyzerKerneloops::Report(): " + e.what()); - } - m_pOopsList.pop_back(); - } -} - -void CAnalyzerKerneloops::Init() -{ - /* daemonize */ - pid_t pid = fork(); - if (pid < 0) - throw CABRTException(EXCEP_PLUGIN, "CAnalyzerKerneloops::Init(): fork failed."); - - /* hack: release Init() */ - if (pid) - return; - - sched_yield(); - -#ifdef PR_SET_TIMERSLACK - /* - * Signal the kernel that we're not timing critical - */ - prctl(PR_SET_TIMERSLACK,1000*1000*1000, 0, 0, 0); -#endif - - /* we scan dmesg before /var/log/messages; dmesg is a more accurate source normally */ - ScanDmesg(); - /* during boot... don't go too fast and slow the system down */ - sleep(10); - ScanSysLogFile(m_sSysLogFile.c_str(), 1); - - while(1) { - sleep(10); - ScanDmesg(); - } -} - -void CAnalyzerKerneloops::ScanDmesg() -{ - comm_layer_inner_debug("Scanning dmesg..."); - - int m_nFoundOopses; - char *buffer; - - buffer = (char*)calloc(getpagesize()+1, 1); - - syscall(__NR_syslog, 3, buffer, getpagesize()); - m_nFoundOopses = m_pSysLog.ExtractOops(buffer, strlen(buffer), 0); - free(buffer); - - if (m_nFoundOopses > 0) - Report(); -} - -void CAnalyzerKerneloops::ScanSysLogFile(const char *filename, int issyslog) -{ - comm_layer_inner_debug("Scanning syslog..."); - - char *buffer; - struct stat statb; - FILE *file; - int ret; - int m_nFoundOopses; - size_t buflen; - - memset(&statb, 0, sizeof(statb)); - - ret = stat(filename, &statb); - - if (statb.st_size < 1 || ret != 0) - return; - - /* - * in theory there's a race here, since someone could spew - * to /var/log/messages before we read it in... we try to - * deal with it by reading at most 1023 bytes extra. If there's - * more than that.. any oops will be in dmesg anyway. - * Do not try to allocate an absurt amount of memory; ignore - * older log messages because they are unlikely to have - * sufficiently recent data to be useful. 32MB is more - * than enough; it's not worth looping through more log - * if the log is larger than that. - */ - buflen = MAX(statb.st_size+1024, 32*1024*1024); - buffer = (char*)calloc(buflen, 1); - assert(buffer != NULL); - - file = fopen(filename, "rm"); - if (!file) { - free(buffer); - return; - } - fseek(file, -buflen, SEEK_END); - ret = fread(buffer, 1, buflen-1, file); - fclose(file); - - if (ret > 0) - m_nFoundOopses = m_pSysLog.ExtractOops(buffer, buflen-1, issyslog); - free(buffer); - - if (m_nFoundOopses > 0) { - Report(); - WriteSysLog(m_nFoundOopses); - } -} - -void CAnalyzerKerneloops::LoadSettings(const std::string& pPath) -{ - map_settings_t settings; - plugin_load_settings(pPath, settings); - - if (settings.find("SysLogFile")!= settings.end()) - { - m_sSysLogFile = settings["SysLogFile"]; - } -} |